@ -16,6 +16,7 @@ static const char * const builtin_remote_usage[] = {
@@ -16,6 +16,7 @@ static const char * const builtin_remote_usage[] = {
"git remote [-v | --verbose] show [-n] <name>",
"git remote prune [-n | --dry-run] <name>",
"git remote [-v | --verbose] update [-p | --prune] [group | remote]",
"git remote set-branches <name> [--add] <branch>...",
"git remote set-url <name> <newurl> [<oldurl>]",
"git remote set-url --add <name> <newurl>",
"git remote set-url --delete <name> <url>",
@ -42,6 +43,12 @@ static const char * const builtin_remote_sethead_usage[] = {
@@ -42,6 +43,12 @@ static const char * const builtin_remote_sethead_usage[] = {
NULL
};
static const char * const builtin_remote_setbranches_usage[] = {
"git remote set-branches <name> <branch>...",
"git remote set-branches --add <name> <branch>...",
NULL
};
static const char * const builtin_remote_show_usage[] = {
"git remote show [<options>] <name>",
NULL
@ -110,6 +117,20 @@ enum {
@@ -110,6 +117,20 @@ enum {
TAGS_SET = 2
};
static int add_branch(const char *key, const char *branchname,
const char *remotename, int mirror, struct strbuf *tmp)
{
strbuf_reset(tmp);
strbuf_addch(tmp, '+');
if (mirror)
strbuf_addf(tmp, "refs/%s:refs/%s",
branchname, branchname);
else
strbuf_addf(tmp, "refs/heads/%s:refs/remotes/%s/%s",
branchname, remotename, branchname);
return git_config_set_multivar(key, tmp->buf, "^$", 0);
}
static int add(int argc, const char **argv)
{
int fetch = 0, mirror = 0, fetch_tags = TAGS_DEFAULT;
@ -162,17 +183,8 @@ static int add(int argc, const char **argv)
@@ -162,17 +183,8 @@ static int add(int argc, const char **argv)
if (track.nr == 0)
string_list_append("*", &track);
for (i = 0; i < track.nr; i++) {
struct string_list_item *item = track.items + i;
strbuf_reset(&buf2);
strbuf_addch(&buf2, '+');
if (mirror)
strbuf_addf(&buf2, "refs/%s:refs/%s",
item->string, item->string);
else
strbuf_addf(&buf2, "refs/heads/%s:refs/remotes/%s/%s",
item->string, name, item->string);
if (git_config_set_multivar(buf.buf, buf2.buf, "^$", 0))
if (add_branch(buf.buf, track.items[i].string,
name, mirror, &buf2))
return 1;
}
@ -1284,6 +1296,72 @@ static int update(int argc, const char **argv)
@@ -1284,6 +1296,72 @@ static int update(int argc, const char **argv)
return run_command_v_opt(fetch_argv, RUN_GIT_CMD);
}
static int remove_all_fetch_refspecs(const char *remote, const char *key)
{
return git_config_set_multivar(key, NULL, NULL, 1);
}
static int add_branches(struct remote *remote, const char **branches,
const char *key)
{
const char *remotename = remote->name;
int mirror = remote->mirror;
struct strbuf refspec = STRBUF_INIT;
for (; *branches; branches++)
if (add_branch(key, *branches, remotename, mirror, &refspec)) {
strbuf_release(&refspec);
return 1;
}
strbuf_release(&refspec);
return 0;
}
static int set_remote_branches(const char *remotename, const char **branches,
int add_mode)
{
struct strbuf key = STRBUF_INIT;
struct remote *remote;
strbuf_addf(&key, "remote.%s.fetch", remotename);
if (!remote_is_configured(remotename))
die("No such remote '%s'", remotename);
remote = remote_get(remotename);
if (!add_mode && remove_all_fetch_refspecs(remotename, key.buf)) {
strbuf_release(&key);
return 1;
}
if (add_branches(remote, branches, key.buf)) {
strbuf_release(&key);
return 1;
}
strbuf_release(&key);
return 0;
}
static int set_branches(int argc, const char **argv)
{
int add_mode = 0;
struct option options[] = {
OPT_BOOLEAN('\0', "add", &add_mode, "add branch"),
OPT_END()
};
argc = parse_options(argc, argv, NULL, options,
builtin_remote_setbranches_usage, 0);
if (argc == 0) {
error("no remote specified");
usage_with_options(builtin_remote_seturl_usage, options);
}
argv[argc] = NULL;
return set_remote_branches(argv[0], argv + 1, add_mode);
}
static int set_url(int argc, const char **argv)
{
int i, push_mode = 0, add_mode = 0, delete_mode = 0;
@ -1449,6 +1527,8 @@ int cmd_remote(int argc, const char **argv, const char *prefix)
@@ -1449,6 +1527,8 @@ int cmd_remote(int argc, const char **argv, const char *prefix)
result = rm(argc, argv);
else if (!strcmp(argv[0], "set-head"))
result = set_head(argc, argv);
else if (!strcmp(argv[0], "set-branches"))
result = set_branches(argc, argv);
else if (!strcmp(argv[0], "set-url"))
result = set_url(argc, argv);
else if (!strcmp(argv[0], "show"))