Browse Source

Merge branch 'mz/remote-rename' into maint-1.7.6

* 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'
maint
Junio C Hamano 13 years ago
parent
commit
716b64a73e
  1. 28
      builtin/remote.c
  2. 31
      t/t5505-remote.sh

28
builtin/remote.c

@ -580,7 +580,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);
@ -631,10 +631,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);
@ -669,15 +670,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);
} }
@ -695,6 +706,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.

31
t/t5505-remote.sh

@ -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…
Cancel
Save