remote: handle rename of remote without fetch refspec
We return an error when trying to rename a remote that has no fetch refspec: $ git config --unset-all remote.origin.fetch $ git remote rename origin foo fatal: could not unset 'remote.foo.fetch' To make things even more confusing, we actually _do_ complete the config modification, via git_config_rename_section(). After that we try to rewrite the fetch refspec (to say refs/remotes/foo instead of origin). But our call to git_config_set_multivar() to remove the existing entries fails, since there aren't any, and it calls die(). We could fix this by using the "gently" form of the config call, and checking the error code. But there is an even simpler fix: if we know that there are no refspecs to rewrite, then we can skip that part entirely. Reported-by: John A. Leuenhagen <john@zlima12.com> Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
a0feb8611d
commit
5a97b38109
@ -726,29 +726,31 @@ static int mv(int argc, const char **argv)
|
||||
return error(_("Could not rename config section '%s' to '%s'"),
|
||||
buf.buf, buf2.buf);
|
||||
|
||||
strbuf_reset(&buf);
|
||||
strbuf_addf(&buf, "remote.%s.fetch", rename.new_name);
|
||||
git_config_set_multivar(buf.buf, NULL, NULL, CONFIG_FLAGS_MULTI_REPLACE);
|
||||
strbuf_addf(&old_remote_context, ":refs/remotes/%s/", rename.old_name);
|
||||
for (i = 0; i < oldremote->fetch.raw_nr; i++) {
|
||||
char *ptr;
|
||||
if (oldremote->fetch.raw_nr) {
|
||||
strbuf_reset(&buf);
|
||||
strbuf_addf(&buf, "remote.%s.fetch", rename.new_name);
|
||||
git_config_set_multivar(buf.buf, NULL, NULL, CONFIG_FLAGS_MULTI_REPLACE);
|
||||
strbuf_addf(&old_remote_context, ":refs/remotes/%s/", rename.old_name);
|
||||
for (i = 0; i < oldremote->fetch.raw_nr; i++) {
|
||||
char *ptr;
|
||||
|
||||
strbuf_reset(&buf2);
|
||||
strbuf_addstr(&buf2, oldremote->fetch.raw[i]);
|
||||
ptr = strstr(buf2.buf, old_remote_context.buf);
|
||||
if (ptr) {
|
||||
refspec_updated = 1;
|
||||
strbuf_splice(&buf2,
|
||||
ptr-buf2.buf + strlen(":refs/remotes/"),
|
||||
strlen(rename.old_name), rename.new_name,
|
||||
strlen(rename.new_name));
|
||||
} else
|
||||
warning(_("Not updating non-default fetch refspec\n"
|
||||
"\t%s\n"
|
||||
"\tPlease update the configuration manually if necessary."),
|
||||
buf2.buf);
|
||||
strbuf_reset(&buf2);
|
||||
strbuf_addstr(&buf2, oldremote->fetch.raw[i]);
|
||||
ptr = strstr(buf2.buf, old_remote_context.buf);
|
||||
if (ptr) {
|
||||
refspec_updated = 1;
|
||||
strbuf_splice(&buf2,
|
||||
ptr-buf2.buf + strlen(":refs/remotes/"),
|
||||
strlen(rename.old_name), rename.new_name,
|
||||
strlen(rename.new_name));
|
||||
} else
|
||||
warning(_("Not updating non-default fetch refspec\n"
|
||||
"\t%s\n"
|
||||
"\tPlease update the configuration manually if necessary."),
|
||||
buf2.buf);
|
||||
|
||||
git_config_set_multivar(buf.buf, buf2.buf, "^$", 0);
|
||||
git_config_set_multivar(buf.buf, buf2.buf, "^$", 0);
|
||||
}
|
||||
}
|
||||
|
||||
read_branches();
|
||||
|
Reference in New Issue
Block a user