diff options
-rw-r--r-- | src/remote.c | 16 | ||||
-rw-r--r-- | tests/network/remote/rename.c | 30 |
2 files changed, 39 insertions, 7 deletions
diff --git a/src/remote.c b/src/remote.c index 0c82433d1..0d1a88ea7 100644 --- a/src/remote.c +++ b/src/remote.c @@ -1380,7 +1380,7 @@ static int rename_one_remote_reference( goto cleanup; error = git_reference_rename( - NULL, reference, git_buf_cstr(&new_name), 0, + NULL, reference, git_buf_cstr(&new_name), 1, NULL, git_buf_cstr(&log_message)); git_reference_free(reference); @@ -1396,18 +1396,20 @@ static int rename_remote_references( const char *new_name) { int error; + git_buf buf = GIT_BUF_INIT; git_reference *ref; git_reference_iterator *iter; - if ((error = git_reference_iterator_new(&iter, repo)) < 0) + if ((error = git_buf_printf(&buf, GIT_REFS_REMOTES_DIR "%s/*", old_name)) < 0) return error; - while ((error = git_reference_next(&ref, iter)) == 0) { - if (git__prefixcmp(ref->name, GIT_REFS_REMOTES_DIR)) { - git_reference_free(ref); - continue; - } + error = git_reference_iterator_glob_new(&iter, repo, git_buf_cstr(&buf)); + git_buf_free(&buf); + if (error < 0) + return error; + + while ((error = git_reference_next(&ref, iter)) == 0) { if ((error = rename_one_remote_reference(ref, old_name, new_name)) < 0) break; } diff --git a/tests/network/remote/rename.c b/tests/network/remote/rename.c index 4d8628425..b7ec44726 100644 --- a/tests/network/remote/rename.c +++ b/tests/network/remote/rename.c @@ -172,3 +172,33 @@ void test_network_remote_rename__cannot_rename_an_inmemory_remote(void) git_remote_free(remote); } + +void test_network_remote_rename__overwrite_ref_in_target(void) +{ + git_oid id; + char idstr[GIT_OID_HEXSZ + 1] = {0}; + git_remote *remote; + git_reference *ref; + git_branch_t btype; + git_branch_iterator *iter; + + cl_git_pass(git_oid_fromstr(&id, "a65fedf39aefe402d3bb6e24df4d4f5fe4547750")); + cl_git_pass(git_reference_create(&ref, _repo, "refs/remotes/renamed/master", &id, 1, NULL, NULL)); + git_reference_free(ref); + + cl_git_pass(git_remote_load(&remote, _repo, "test")); + cl_git_pass(git_remote_rename(remote, "renamed", dont_call_me_cb, NULL)); + git_remote_free(remote); + + + /* make sure there's only one remote-tracking branch */ + cl_git_pass(git_branch_iterator_new(&iter, _repo, GIT_BRANCH_REMOTE)); + cl_git_pass(git_branch_next(&ref, &btype, iter)); + cl_assert_equal_s("refs/remotes/renamed/master", git_reference_name(ref)); + git_oid_fmt(idstr, git_reference_target(ref)); + cl_assert_equal_s("be3563ae3f795b2b4353bcce3a527ad0a4f7f644", idstr); + git_reference_free(ref); + + cl_git_fail_with(GIT_ITEROVER, git_branch_next(&ref, &btype, iter)); + git_branch_iterator_free(iter); +} |