diff options
author | Vicent Martà <vicent@github.com> | 2012-10-22 12:04:48 -0700 |
---|---|---|
committer | Vicent Martà <vicent@github.com> | 2012-10-22 12:04:48 -0700 |
commit | 8a89aa1f57fc0b352800bc77e228554fe95caddd (patch) | |
tree | 910f462e7cd550db7a6e21b79c86f2583937421c | |
parent | 40846f3d9ade6a6b83cb894e76187c967500cae8 (diff) | |
parent | c648d4a8aac447120aed623cd1606fddeb435800 (diff) | |
download | libgit2-8a89aa1f57fc0b352800bc77e228554fe95caddd.tar.gz |
Merge pull request #963 from carlosmn/remote-save-autotag
Save the autotag configuration for remotes
-rw-r--r-- | src/remote.c | 39 | ||||
-rw-r--r-- | tests-clar/network/remotes.c | 24 |
2 files changed, 63 insertions, 0 deletions
diff --git a/src/remote.c b/src/remote.c index c47f2d1ec..5ef791d39 100644 --- a/src/remote.c +++ b/src/remote.c @@ -86,6 +86,11 @@ int git_remote_new(git_remote **out, git_repository *repo, const char *name, con goto on_error; } + /* A remote without a name doesn't download tags */ + if (!name) { + remote->download_tags = GIT_REMOTE_DOWNLOAD_TAGS_NONE; + } + *out = remote; return 0; @@ -198,7 +203,9 @@ cleanup: int git_remote_save(const git_remote *remote) { + int error; git_config *config; + const char *tagopt = NULL; git_buf buf = GIT_BUF_INIT, value = GIT_BUF_INIT; if (git_repository_config__weakptr(&config, remote->repo) < 0) @@ -260,6 +267,38 @@ int git_remote_save(const git_remote *remote) goto on_error; } + /* + * What action to take depends on the old and new values. This + * is describes by the table below. tagopt means whether the + * is already a value set in the config + * + * AUTO ALL or NONE + * +-----------------------+ + * tagopt | remove | set | + * +---------+-------------| + * !tagopt | nothing | set | + * +---------+-------------+ + */ + + git_buf_clear(&buf); + if (git_buf_printf(&buf, "remote.%s.tagopt", remote->name) < 0) + goto on_error; + + error = git_config_get_string(&tagopt, config, git_buf_cstr(&buf)); + if (error < 0 && error != GIT_ENOTFOUND) + goto on_error; + + if (remote->download_tags == GIT_REMOTE_DOWNLOAD_TAGS_ALL) { + if (git_config_set_string(config, git_buf_cstr(&buf), "--tags") < 0) + goto on_error; + } else if (remote->download_tags == GIT_REMOTE_DOWNLOAD_TAGS_NONE) { + if (git_config_set_string(config, git_buf_cstr(&buf), "--no-tags") < 0) + goto on_error; + } else if (tagopt) { + if (git_config_delete(config, git_buf_cstr(&buf)) < 0) + goto on_error; + } + git_buf_free(&buf); git_buf_free(&value); diff --git a/tests-clar/network/remotes.c b/tests-clar/network/remotes.c index c7ee863e7..91c3e879d 100644 --- a/tests-clar/network/remotes.c +++ b/tests-clar/network/remotes.c @@ -225,3 +225,27 @@ void test_network_remotes__add(void) cl_assert(!strcmp(git_refspec_dst(_refspec), "refs/remotes/addtest/*")); cl_assert_equal_s(git_remote_url(_remote), "http://github.com/libgit2/libgit2"); } + +void test_network_remotes__tagopt(void) +{ + const char *opt; + git_config *cfg; + + cl_git_pass(git_repository_config(&cfg, _repo)); + + git_remote_set_autotag(_remote, GIT_REMOTE_DOWNLOAD_TAGS_ALL); + cl_git_pass(git_remote_save(_remote)); + cl_git_pass(git_config_get_string(&opt, cfg, "remote.test.tagopt")); + cl_assert(!strcmp(opt, "--tags")); + + git_remote_set_autotag(_remote, GIT_REMOTE_DOWNLOAD_TAGS_NONE); + cl_git_pass(git_remote_save(_remote)); + cl_git_pass(git_config_get_string(&opt, cfg, "remote.test.tagopt")); + cl_assert(!strcmp(opt, "--no-tags")); + + git_remote_set_autotag(_remote, GIT_REMOTE_DOWNLOAD_TAGS_AUTO); + cl_git_pass(git_remote_save(_remote)); + cl_assert(git_config_get_string(&opt, cfg, "remote.test.tagopt") == GIT_ENOTFOUND); + + git_config_free(cfg); +} |