Skip to content

Commit

Permalink
git-remote rename: migrate from remotes/ and branches/
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Miklos Vajna authored and gitster committed Nov 12, 2008
1 parent 89cf4c7 commit 1dd1239
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 0 deletions.
35 changes: 35 additions & 0 deletions builtin-remote.c
Expand Up @@ -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[] = {
Expand All @@ -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);
Expand Down
33 changes: 33 additions & 0 deletions t/t5505-remote.sh
Expand Up @@ -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

0 comments on commit 1dd1239

Please sign in to comment.