Merge pull request #2404 from libgit2/cmn/remote-rename-fixes Remote rename fixes
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
diff --git a/src/remote.c b/src/remote.c
index 0c82433..0d1a88e 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 4d86284..b7ec447 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);
+}