Merge branch 'mz/remote-rename'
* mz/remote-rename: remote: only update remote-tracking branch if updating refspec remote rename: warn when refspec was not updated remote: "rename o foo" should not rename ref "origin/bar" remote: write correct fetch spec when renaming remote 'remote'
This commit is contained in:
commit
034a8a0df3
@ -570,7 +570,7 @@ static int read_remote_branches(const char *refname,
|
|||||||
unsigned char orig_sha1[20];
|
unsigned char orig_sha1[20];
|
||||||
const char *symref;
|
const char *symref;
|
||||||
|
|
||||||
strbuf_addf(&buf, "refs/remotes/%s", rename->old);
|
strbuf_addf(&buf, "refs/remotes/%s/", rename->old);
|
||||||
if (!prefixcmp(refname, buf.buf)) {
|
if (!prefixcmp(refname, buf.buf)) {
|
||||||
item = string_list_append(rename->remote_branches, xstrdup(refname));
|
item = string_list_append(rename->remote_branches, xstrdup(refname));
|
||||||
symref = resolve_ref(refname, orig_sha1, 1, &flag);
|
symref = resolve_ref(refname, orig_sha1, 1, &flag);
|
||||||
@ -621,10 +621,11 @@ static int mv(int argc, const char **argv)
|
|||||||
OPT_END()
|
OPT_END()
|
||||||
};
|
};
|
||||||
struct remote *oldremote, *newremote;
|
struct remote *oldremote, *newremote;
|
||||||
struct strbuf buf = STRBUF_INIT, buf2 = STRBUF_INIT, buf3 = STRBUF_INIT;
|
struct strbuf buf = STRBUF_INIT, buf2 = STRBUF_INIT, buf3 = STRBUF_INIT,
|
||||||
|
old_remote_context = STRBUF_INIT;
|
||||||
struct string_list remote_branches = STRING_LIST_INIT_NODUP;
|
struct string_list remote_branches = STRING_LIST_INIT_NODUP;
|
||||||
struct rename_info rename;
|
struct rename_info rename;
|
||||||
int i;
|
int i, refspec_updated = 0;
|
||||||
|
|
||||||
if (argc != 3)
|
if (argc != 3)
|
||||||
usage_with_options(builtin_remote_rename_usage, options);
|
usage_with_options(builtin_remote_rename_usage, options);
|
||||||
@ -659,15 +660,25 @@ static int mv(int argc, const char **argv)
|
|||||||
strbuf_addf(&buf, "remote.%s.fetch", rename.new);
|
strbuf_addf(&buf, "remote.%s.fetch", rename.new);
|
||||||
if (git_config_set_multivar(buf.buf, NULL, NULL, 1))
|
if (git_config_set_multivar(buf.buf, NULL, NULL, 1))
|
||||||
return error("Could not remove config section '%s'", buf.buf);
|
return error("Could not remove config section '%s'", buf.buf);
|
||||||
|
strbuf_addf(&old_remote_context, ":refs/remotes/%s/", rename.old);
|
||||||
for (i = 0; i < oldremote->fetch_refspec_nr; i++) {
|
for (i = 0; i < oldremote->fetch_refspec_nr; i++) {
|
||||||
char *ptr;
|
char *ptr;
|
||||||
|
|
||||||
strbuf_reset(&buf2);
|
strbuf_reset(&buf2);
|
||||||
strbuf_addstr(&buf2, oldremote->fetch_refspec[i]);
|
strbuf_addstr(&buf2, oldremote->fetch_refspec[i]);
|
||||||
ptr = strstr(buf2.buf, rename.old);
|
ptr = strstr(buf2.buf, old_remote_context.buf);
|
||||||
if (ptr)
|
if (ptr) {
|
||||||
strbuf_splice(&buf2, ptr-buf2.buf, strlen(rename.old),
|
refspec_updated = 1;
|
||||||
rename.new, strlen(rename.new));
|
strbuf_splice(&buf2,
|
||||||
|
ptr-buf2.buf + strlen(":refs/remotes/"),
|
||||||
|
strlen(rename.old), rename.new,
|
||||||
|
strlen(rename.new));
|
||||||
|
} else
|
||||||
|
warning("Not updating non-default fetch respec\n"
|
||||||
|
"\t%s\n"
|
||||||
|
"\tPlease update the configuration manually if necessary.",
|
||||||
|
buf2.buf);
|
||||||
|
|
||||||
if (git_config_set_multivar(buf.buf, buf2.buf, "^$", 0))
|
if (git_config_set_multivar(buf.buf, buf2.buf, "^$", 0))
|
||||||
return error("Could not append '%s'", buf.buf);
|
return error("Could not append '%s'", buf.buf);
|
||||||
}
|
}
|
||||||
@ -685,6 +696,9 @@ static int mv(int argc, const char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!refspec_updated)
|
||||||
|
return 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* First remove symrefs, then rename the rest, finally create
|
* First remove symrefs, then rename the rest, finally create
|
||||||
* the new symrefs.
|
* the new symrefs.
|
||||||
|
@ -631,6 +631,37 @@ test_expect_success 'rename a remote' '
|
|||||||
|
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'rename does not update a non-default fetch refspec' '
|
||||||
|
|
||||||
|
git clone one four.one &&
|
||||||
|
(cd four.one &&
|
||||||
|
git config remote.origin.fetch +refs/heads/*:refs/heads/origin/* &&
|
||||||
|
git remote rename origin upstream &&
|
||||||
|
test "$(git config remote.upstream.fetch)" = "+refs/heads/*:refs/heads/origin/*" &&
|
||||||
|
git rev-parse -q origin/master)
|
||||||
|
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'rename a remote with name part of fetch spec' '
|
||||||
|
|
||||||
|
git clone one four.two &&
|
||||||
|
(cd four.two &&
|
||||||
|
git remote rename origin remote &&
|
||||||
|
git remote rename remote upstream &&
|
||||||
|
test "$(git config remote.upstream.fetch)" = "+refs/heads/*:refs/remotes/upstream/*")
|
||||||
|
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'rename a remote with name prefix of other remote' '
|
||||||
|
|
||||||
|
git clone one four.three &&
|
||||||
|
(cd four.three &&
|
||||||
|
git remote add o git://example.com/repo.git &&
|
||||||
|
git remote rename o upstream &&
|
||||||
|
test "$(git rev-parse origin/master)" = "$(git rev-parse master)")
|
||||||
|
|
||||||
|
'
|
||||||
|
|
||||||
cat > remotes_origin << EOF
|
cat > remotes_origin << EOF
|
||||||
URL: $(pwd)/one
|
URL: $(pwd)/one
|
||||||
Push: refs/heads/master:refs/heads/upstream
|
Push: refs/heads/master:refs/heads/upstream
|
||||||
|
Loading…
Reference in New Issue
Block a user