Skip to content

Commit 8db3559

Browse files
bjornggitster
authored andcommitted
Re-implement 'git remote update' using 'git fetch'
In order not to duplicate functionality, re-implement 'git remote update' in terms of 'git fetch'. Signed-off-by: Björn Gustavsson <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 28a1540 commit 8db3559

File tree

1 file changed

+28
-60
lines changed

1 file changed

+28
-60
lines changed

builtin-remote.c

Lines changed: 28 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1173,88 +1173,56 @@ static int prune_remote(const char *remote, int dry_run)
11731173
return result;
11741174
}
11751175

1176-
static int get_one_remote_for_update(struct remote *remote, void *priv)
1176+
static int get_remote_default(const char *key, const char *value, void *priv)
11771177
{
1178-
struct string_list *list = priv;
1179-
if (!remote->skip_default_update)
1180-
string_list_append(remote->name, list);
1181-
return 0;
1182-
}
1183-
1184-
static struct remote_group {
1185-
const char *name;
1186-
struct string_list *list;
1187-
} remote_group;
1188-
1189-
static int get_remote_group(const char *key, const char *value, void *num_hits)
1190-
{
1191-
if (!prefixcmp(key, "remotes.") &&
1192-
!strcmp(key + 8, remote_group.name)) {
1193-
/* split list by white space */
1194-
int space = strcspn(value, " \t\n");
1195-
while (*value) {
1196-
if (space > 1) {
1197-
string_list_append(xstrndup(value, space),
1198-
remote_group.list);
1199-
++*((int *)num_hits);
1200-
}
1201-
value += space + (value[space] != '\0');
1202-
space = strcspn(value, " \t\n");
1203-
}
1178+
if (strcmp(key, "remotes.default") == 0) {
1179+
int *found = priv;
1180+
*found = 1;
12041181
}
1205-
12061182
return 0;
12071183
}
12081184

12091185
static int update(int argc, const char **argv)
12101186
{
1211-
int i, result = 0, prune = 0;
1212-
struct string_list list = { NULL, 0, 0, 0 };
1213-
static const char *default_argv[] = { NULL, "default", NULL };
1187+
int i, prune = 0;
12141188
struct option options[] = {
12151189
OPT_GROUP("update specific options"),
12161190
OPT_BOOLEAN('p', "prune", &prune,
12171191
"prune remotes after fetching"),
12181192
OPT_END()
12191193
};
1194+
const char **fetch_argv;
1195+
int fetch_argc = 0;
1196+
int default_defined = 0;
1197+
1198+
fetch_argv = xmalloc(sizeof(char *) * (argc+5));
12201199

12211200
argc = parse_options(argc, argv, NULL, options, builtin_remote_usage,
12221201
PARSE_OPT_KEEP_ARGV0);
1223-
if (argc < 2) {
1224-
argc = 2;
1225-
argv = default_argv;
1226-
}
12271202

1228-
remote_group.list = &list;
1229-
for (i = 1; i < argc; i++) {
1230-
int groups_found = 0;
1231-
remote_group.name = argv[i];
1232-
result = git_config(get_remote_group, &groups_found);
1233-
if (!groups_found && (i != 1 || strcmp(argv[1], "default"))) {
1234-
struct remote *remote;
1235-
if (!remote_is_configured(argv[i]))
1236-
die("No such remote or remote group: %s",
1237-
argv[i]);
1238-
remote = remote_get(argv[i]);
1239-
string_list_append(remote->name, remote_group.list);
1240-
}
1241-
}
1203+
fetch_argv[fetch_argc++] = "fetch";
12421204

1243-
if (!result && !list.nr && argc == 2 && !strcmp(argv[1], "default"))
1244-
result = for_each_remote(get_one_remote_for_update, &list);
1205+
if (prune)
1206+
fetch_argv[fetch_argc++] = "--prune";
1207+
if (verbose)
1208+
fetch_argv[fetch_argc++] = "-v";
1209+
if (argc < 2) {
1210+
fetch_argv[fetch_argc++] = "default";
1211+
} else {
1212+
fetch_argv[fetch_argc++] = "--multiple";
1213+
for (i = 1; i < argc; i++)
1214+
fetch_argv[fetch_argc++] = argv[i];
1215+
}
12451216

1246-
for (i = 0; i < list.nr; i++) {
1247-
int err = fetch_remote(list.items[i].string);
1248-
result |= err;
1249-
if (!err && prune)
1250-
result |= prune_remote(list.items[i].string, 0);
1217+
if (strcmp(fetch_argv[fetch_argc-1], "default") == 0) {
1218+
git_config(get_remote_default, &default_defined);
1219+
if (!default_defined)
1220+
fetch_argv[fetch_argc-1] = "--all";
12511221
}
12521222

1253-
/* all names were strdup()ed or strndup()ed */
1254-
list.strdup_strings = 1;
1255-
string_list_clear(&list, 0);
1223+
fetch_argv[fetch_argc] = NULL;
12561224

1257-
return result;
1225+
return run_command_v_opt(fetch_argv, RUN_GIT_CMD);
12581226
}
12591227

12601228
static int get_one_entry(struct remote *remote, void *priv)

0 commit comments

Comments
 (0)