Code

git-remote rename: migrate from remotes/ and branches/
authorMiklos Vajna <vmiklos@frugalware.org>
Mon, 10 Nov 2008 20:43:01 +0000 (21:43 +0100)
committerJunio C Hamano <gitster@pobox.com>
Wed, 12 Nov 2008 04:24:18 +0000 (20:24 -0800)
Remote definition that came from $GIT_DIR/remotes/nick and
$GIT_DIR/branches/nick are migrated to [remotes "nick"] section in the
configuration file.

Signed-off-by: Miklos Vajna <vmiklos@frugalware.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin-remote.c
t/t5505-remote.sh

index 1ca6cdbe2a64a5c4b8d97b30183d48c929b4be53..3af18768e57bd96b4b3caa7db44f149f870d7077 100644 (file)
@@ -359,6 +359,38 @@ static int read_remote_branches(const char *refname,
        return 0;
 }
 
+static int migrate_file(struct remote *remote)
+{
+       struct strbuf buf = STRBUF_INIT;
+       int i;
+       char *path = NULL;
+
+       strbuf_addf(&buf, "remote.%s.url", remote->name);
+       for (i = 0; i < remote->url_nr; i++)
+               if (git_config_set_multivar(buf.buf, remote->url[i], "^$", 0))
+                       return error("Could not append '%s' to '%s'",
+                                       remote->url[i], buf.buf);
+       strbuf_reset(&buf);
+       strbuf_addf(&buf, "remote.%s.push", remote->name);
+       for (i = 0; i < remote->push_refspec_nr; i++)
+               if (git_config_set_multivar(buf.buf, remote->push_refspec[i], "^$", 0))
+                       return error("Could not append '%s' to '%s'",
+                                       remote->push_refspec[i], buf.buf);
+       strbuf_reset(&buf);
+       strbuf_addf(&buf, "remote.%s.fetch", remote->name);
+       for (i = 0; i < remote->fetch_refspec_nr; i++)
+               if (git_config_set_multivar(buf.buf, remote->fetch_refspec[i], "^$", 0))
+                       return error("Could not append '%s' to '%s'",
+                                       remote->fetch_refspec[i], buf.buf);
+       if (remote->origin == REMOTE_REMOTES)
+               path = git_path("remotes/%s", remote->name);
+       else if (remote->origin == REMOTE_BRANCHES)
+               path = git_path("branches/%s", remote->name);
+       if (path && unlink(path))
+               warning("failed to remove '%s'", path);
+       return 0;
+}
+
 static int mv(int argc, const char **argv)
 {
        struct option options[] = {
@@ -381,6 +413,9 @@ static int mv(int argc, const char **argv)
        if (!oldremote)
                die("No such remote: %s", rename.old);
 
+       if (!strcmp(rename.old, rename.new) && oldremote->origin != REMOTE_CONFIG)
+               return migrate_file(oldremote);
+
        newremote = remote_get(rename.new);
        if (newremote && (newremote->url_nr > 1 || newremote->fetch_refspec_nr))
                die("remote %s already exists.", rename.new);
index 0c956bad69857264ce19d318d4d1bd33e53ae7ee..1f59960d90c31f02768666c86654a97e1fad9305 100755 (executable)
@@ -343,4 +343,37 @@ test_expect_success 'rename a remote' '
         test "$(git config branch.master.remote)" = "upstream")
 
 '
+
+cat > remotes_origin << EOF
+URL: $(pwd)/one
+Push: refs/heads/master:refs/heads/upstream
+Pull: refs/heads/master:refs/heads/origin
+EOF
+
+test_expect_success 'migrate a remote from named file in $GIT_DIR/remotes' '
+       git clone one five &&
+       origin_url=$(pwd)/one &&
+       (cd five &&
+        git remote rm origin &&
+        mkdir -p .git/remotes &&
+        cat ../remotes_origin > .git/remotes/origin &&
+        git remote rename origin origin &&
+        ! test -f .git/remotes/origin &&
+        test "$(git config remote.origin.url)" = "$origin_url" &&
+        test "$(git config remote.origin.push)" = "refs/heads/master:refs/heads/upstream" &&
+        test "$(git config remote.origin.fetch)" = "refs/heads/master:refs/heads/origin")
+'
+
+test_expect_success 'migrate a remote from named file in $GIT_DIR/branches' '
+       git clone one six &&
+       origin_url=$(pwd)/one &&
+       (cd six &&
+        git remote rm origin &&
+        echo "$origin_url" > .git/branches/origin &&
+        git remote rename origin origin &&
+        ! test -f .git/branches/origin &&
+        test "$(git config remote.origin.url)" = "$origin_url" &&
+        test "$(git config remote.origin.fetch)" = "refs/heads/master:refs/heads/origin")
+'
+
 test_done