Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 716e20b

Browse files
author
Vicent Marti
committed
Merge pull request libgit2#2404 from libgit2/cmn/remote-rename-fixes
Remote rename fixes
2 parents c073184 + a52ab4b commit 716e20b

File tree

2 files changed

+39
-7
lines changed

2 files changed

+39
-7
lines changed

src/remote.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1380,7 +1380,7 @@ static int rename_one_remote_reference(
13801380
goto cleanup;
13811381

13821382
error = git_reference_rename(
1383-
NULL, reference, git_buf_cstr(&new_name), 0,
1383+
NULL, reference, git_buf_cstr(&new_name), 1,
13841384
NULL, git_buf_cstr(&log_message));
13851385
git_reference_free(reference);
13861386

@@ -1396,18 +1396,20 @@ static int rename_remote_references(
13961396
const char *new_name)
13971397
{
13981398
int error;
1399+
git_buf buf = GIT_BUF_INIT;
13991400
git_reference *ref;
14001401
git_reference_iterator *iter;
14011402

1402-
if ((error = git_reference_iterator_new(&iter, repo)) < 0)
1403+
if ((error = git_buf_printf(&buf, GIT_REFS_REMOTES_DIR "%s/*", old_name)) < 0)
14031404
return error;
14041405

1405-
while ((error = git_reference_next(&ref, iter)) == 0) {
1406-
if (git__prefixcmp(ref->name, GIT_REFS_REMOTES_DIR)) {
1407-
git_reference_free(ref);
1408-
continue;
1409-
}
1406+
error = git_reference_iterator_glob_new(&iter, repo, git_buf_cstr(&buf));
1407+
git_buf_free(&buf);
14101408

1409+
if (error < 0)
1410+
return error;
1411+
1412+
while ((error = git_reference_next(&ref, iter)) == 0) {
14111413
if ((error = rename_one_remote_reference(ref, old_name, new_name)) < 0)
14121414
break;
14131415
}

tests/network/remote/rename.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,3 +172,33 @@ void test_network_remote_rename__cannot_rename_an_inmemory_remote(void)
172172

173173
git_remote_free(remote);
174174
}
175+
176+
void test_network_remote_rename__overwrite_ref_in_target(void)
177+
{
178+
git_oid id;
179+
char idstr[GIT_OID_HEXSZ + 1] = {0};
180+
git_remote *remote;
181+
git_reference *ref;
182+
git_branch_t btype;
183+
git_branch_iterator *iter;
184+
185+
cl_git_pass(git_oid_fromstr(&id, "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"));
186+
cl_git_pass(git_reference_create(&ref, _repo, "refs/remotes/renamed/master", &id, 1, NULL, NULL));
187+
git_reference_free(ref);
188+
189+
cl_git_pass(git_remote_load(&remote, _repo, "test"));
190+
cl_git_pass(git_remote_rename(remote, "renamed", dont_call_me_cb, NULL));
191+
git_remote_free(remote);
192+
193+
194+
/* make sure there's only one remote-tracking branch */
195+
cl_git_pass(git_branch_iterator_new(&iter, _repo, GIT_BRANCH_REMOTE));
196+
cl_git_pass(git_branch_next(&ref, &btype, iter));
197+
cl_assert_equal_s("refs/remotes/renamed/master", git_reference_name(ref));
198+
git_oid_fmt(idstr, git_reference_target(ref));
199+
cl_assert_equal_s("be3563ae3f795b2b4353bcce3a527ad0a4f7f644", idstr);
200+
git_reference_free(ref);
201+
202+
cl_git_fail_with(GIT_ITEROVER, git_branch_next(&ref, &btype, iter));
203+
git_branch_iterator_free(iter);
204+
}

0 commit comments

Comments
 (0)