remote: fix "update [group...]"
The rewrite in C inadvertently broke updating with remote groups: when you pass parameters to "git remote update", it used to look up "remotes.<group>" for every parameter, and interpret the value as a list of remotes to update. Also, no parameter, or a single parameter "default" should update all remotes that have not been marked with "skipDefaultUpdate". Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
6217367859
commit
84521ed6f2
@ -474,24 +474,65 @@ cleanup_states:
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int update_one(struct remote *remote, void *priv)
|
static int get_one_remote_for_update(struct remote *remote, void *priv)
|
||||||
{
|
{
|
||||||
|
struct path_list *list = priv;
|
||||||
if (!remote->skip_default_update)
|
if (!remote->skip_default_update)
|
||||||
return fetch_remote(remote->name);
|
path_list_append(xstrdup(remote->name), list);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct remote_group {
|
||||||
|
const char *name;
|
||||||
|
struct path_list *list;
|
||||||
|
} remote_group;
|
||||||
|
|
||||||
|
static int get_remote_group(const char *key, const char *value)
|
||||||
|
{
|
||||||
|
if (!prefixcmp(key, "remotes.") &&
|
||||||
|
!strcmp(key + 8, remote_group.name)) {
|
||||||
|
/* split list by white space */
|
||||||
|
int space = strcspn(value, " \t\n");
|
||||||
|
while (*value) {
|
||||||
|
if (space > 1)
|
||||||
|
path_list_append(xstrndup(value, space),
|
||||||
|
remote_group.list);
|
||||||
|
value += space + (value[space] != '\0');
|
||||||
|
space = strcspn(value, " \t\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int update(int argc, const char **argv)
|
static int update(int argc, const char **argv)
|
||||||
{
|
{
|
||||||
int i;
|
int i, result = 0;
|
||||||
|
struct path_list list = { NULL, 0, 0, 0 };
|
||||||
|
static const char *default_argv[] = { NULL, "default", NULL };
|
||||||
|
|
||||||
if (argc < 2)
|
if (argc < 2) {
|
||||||
return for_each_remote(update_one, NULL);
|
argc = 2;
|
||||||
|
argv = default_argv;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 1; i < argc; i++)
|
remote_group.list = &list;
|
||||||
if (fetch_remote(argv[i]))
|
for (i = 1; i < argc; i++) {
|
||||||
return 1;
|
remote_group.name = argv[i];
|
||||||
return 0;
|
result = git_config(get_remote_group);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!result && !list.nr && argc == 2 && !strcmp(argv[1], "default"))
|
||||||
|
result = for_each_remote(get_one_remote_for_update, &list);
|
||||||
|
|
||||||
|
for (i = 0; i < list.nr; i++)
|
||||||
|
result |= fetch_remote(list.items[i].path);
|
||||||
|
|
||||||
|
/* all names were strdup()ed or strndup()ed */
|
||||||
|
list.strdup_paths = 1;
|
||||||
|
path_list_clear(&list, 0);
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_one_entry(struct remote *remote, void *priv)
|
static int get_one_entry(struct remote *remote, void *priv)
|
||||||
|
@ -10,10 +10,12 @@ setup_repository () {
|
|||||||
git init &&
|
git init &&
|
||||||
>file &&
|
>file &&
|
||||||
git add file &&
|
git add file &&
|
||||||
|
test_tick &&
|
||||||
git commit -m "Initial" &&
|
git commit -m "Initial" &&
|
||||||
git checkout -b side &&
|
git checkout -b side &&
|
||||||
>elif &&
|
>elif &&
|
||||||
git add elif &&
|
git add elif &&
|
||||||
|
test_tick &&
|
||||||
git commit -m "Second" &&
|
git commit -m "Second" &&
|
||||||
git checkout master
|
git checkout master
|
||||||
)
|
)
|
||||||
@ -113,6 +115,7 @@ test_expect_success 'show' '
|
|||||||
git branch -d -r origin/master &&
|
git branch -d -r origin/master &&
|
||||||
(cd ../one &&
|
(cd ../one &&
|
||||||
echo 1 > file &&
|
echo 1 > file &&
|
||||||
|
test_tick &&
|
||||||
git commit -m update file) &&
|
git commit -m update file) &&
|
||||||
git remote show origin > output &&
|
git remote show origin > output &&
|
||||||
git diff expect output)
|
git diff expect output)
|
||||||
@ -144,4 +147,93 @@ test_expect_success 'add --mirror && prune' '
|
|||||||
git rev-parse --verify refs/heads/side)
|
git rev-parse --verify refs/heads/side)
|
||||||
'
|
'
|
||||||
|
|
||||||
|
cat > one/expect << EOF
|
||||||
|
apis/master
|
||||||
|
apis/side
|
||||||
|
drosophila/another
|
||||||
|
drosophila/master
|
||||||
|
drosophila/side
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_expect_success 'update' '
|
||||||
|
|
||||||
|
(cd one &&
|
||||||
|
git remote add drosophila ../two &&
|
||||||
|
git remote add apis ../mirror &&
|
||||||
|
git remote update &&
|
||||||
|
git branch -r > output &&
|
||||||
|
git diff expect output)
|
||||||
|
|
||||||
|
'
|
||||||
|
|
||||||
|
cat > one/expect << EOF
|
||||||
|
drosophila/another
|
||||||
|
drosophila/master
|
||||||
|
drosophila/side
|
||||||
|
manduca/master
|
||||||
|
manduca/side
|
||||||
|
megaloprepus/master
|
||||||
|
megaloprepus/side
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_expect_success 'update with arguments' '
|
||||||
|
|
||||||
|
(cd one &&
|
||||||
|
for b in $(git branch -r)
|
||||||
|
do
|
||||||
|
git branch -r -d $b || break
|
||||||
|
done &&
|
||||||
|
git remote add manduca ../mirror &&
|
||||||
|
git remote add megaloprepus ../mirror &&
|
||||||
|
git config remotes.phobaeticus "drosophila megaloprepus" &&
|
||||||
|
git config remotes.titanus manduca &&
|
||||||
|
git remote update phobaeticus titanus &&
|
||||||
|
git branch -r > output &&
|
||||||
|
git diff expect output)
|
||||||
|
|
||||||
|
'
|
||||||
|
|
||||||
|
cat > one/expect << EOF
|
||||||
|
apis/master
|
||||||
|
apis/side
|
||||||
|
manduca/master
|
||||||
|
manduca/side
|
||||||
|
megaloprepus/master
|
||||||
|
megaloprepus/side
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_expect_success 'update default' '
|
||||||
|
|
||||||
|
(cd one &&
|
||||||
|
for b in $(git branch -r)
|
||||||
|
do
|
||||||
|
git branch -r -d $b || break
|
||||||
|
done &&
|
||||||
|
git config remote.drosophila.skipDefaultUpdate true &&
|
||||||
|
git remote update default &&
|
||||||
|
git branch -r > output &&
|
||||||
|
git diff expect output)
|
||||||
|
|
||||||
|
'
|
||||||
|
|
||||||
|
cat > one/expect << EOF
|
||||||
|
drosophila/another
|
||||||
|
drosophila/master
|
||||||
|
drosophila/side
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_expect_success 'update default (overridden, with funny whitespace)' '
|
||||||
|
|
||||||
|
(cd one &&
|
||||||
|
for b in $(git branch -r)
|
||||||
|
do
|
||||||
|
git branch -r -d $b || break
|
||||||
|
done &&
|
||||||
|
git config remotes.default "$(printf "\t drosophila \n")" &&
|
||||||
|
git remote update default &&
|
||||||
|
git branch -r > output &&
|
||||||
|
git diff expect output)
|
||||||
|
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Loading…
Reference in New Issue
Block a user