Code

git config: don't allow multiple config file locations
[git.git] / builtin-remote.c
index 71696b50d333f24f1c7a6a7ace946cf3392ca7d0..db18bcfc97f0739c2e77164dc0222148a44c67a6 100644 (file)
@@ -8,13 +8,13 @@
 #include "refs.h"
 
 static const char * const builtin_remote_usage[] = {
-       "git remote",
-       "git remote add <name> <url>",
+       "git remote [-v | --verbose]",
+       "git remote add [-t <branch>] [-m <master>] [-f] [--mirror] <name> <url>",
        "git remote rename <old> <new>",
        "git remote rm <name>",
-       "git remote show <name>",
-       "git remote prune <name>",
-       "git remote update [group]",
+       "git remote show [-n] <name>",
+       "git remote prune [-n | --dry-run] <name>",
+       "git remote [-v | --verbose] update [group]",
        NULL
 };
 
@@ -42,7 +42,11 @@ static int opt_parse_track(const struct option *opt, const char *arg, int not)
 
 static int fetch_remote(const char *name)
 {
-       const char *argv[] = { "fetch", name, NULL };
+       const char *argv[] = { "fetch", name, NULL, NULL };
+       if (verbose) {
+               argv[1] = "-v";
+               argv[2] = name;
+       }
        printf("Updating %s\n", name);
        if (run_command_v_opt(argv, RUN_GIT_CMD))
                return error("Could not fetch %s", name);
@@ -294,7 +298,7 @@ static int add_known_remote(struct remote *remote, void *cb_data)
 
 struct branches_for_remote {
        struct remote *remote;
-       struct string_list *branches;
+       struct string_list *branches, *skipped;
        struct known_remotes *keep;
 };
 
@@ -319,6 +323,16 @@ static int add_branch_for_removal(const char *refname,
                        return 0;
        }
 
+       /* don't delete non-remote refs */
+       if (prefixcmp(refname, "refs/remotes")) {
+               /* advise user how to delete local branches */
+               if (!prefixcmp(refname, "refs/heads/"))
+                       string_list_append(abbrev_branch(refname),
+                                          branches->skipped);
+               /* silently skip over other non-remote refs */
+               return 0;
+       }
+
        /* make sure that symrefs are deleted */
        if (flags & REF_ISSYMREF)
                return unlink(git_path("%s", refname));
@@ -538,8 +552,11 @@ static int rm(int argc, const char **argv)
        struct strbuf buf = STRBUF_INIT;
        struct known_remotes known_remotes = { NULL, NULL };
        struct string_list branches = { NULL, 0, 0, 1 };
-       struct branches_for_remote cb_data = { NULL, &branches, &known_remotes };
-       int i;
+       struct string_list skipped = { NULL, 0, 0, 1 };
+       struct branches_for_remote cb_data = {
+               NULL, &branches, &skipped, &known_remotes
+       };
+       int i, result;
 
        if (argc != 2)
                usage_with_options(builtin_remote_usage, options);
@@ -579,14 +596,26 @@ static int rm(int argc, const char **argv)
         * refs, which are invalidated when deleting a branch.
         */
        cb_data.remote = remote;
-       i = for_each_ref(add_branch_for_removal, &cb_data);
+       result = for_each_ref(add_branch_for_removal, &cb_data);
        strbuf_release(&buf);
 
-       if (!i)
-               i = remove_branches(&branches);
+       if (!result)
+               result = remove_branches(&branches);
        string_list_clear(&branches, 1);
 
-       return i;
+       if (skipped.nr) {
+               fprintf(stderr, skipped.nr == 1 ?
+                       "Note: A non-remote branch was not removed; "
+                       "to delete it, use:\n" :
+                       "Note: Non-remote branches were not removed; "
+                       "to delete them, use:\n");
+               for (i = 0; i < skipped.nr; i++)
+                       fprintf(stderr, "  git branch -d %s\n",
+                               skipped.items[i].string);
+       }
+       string_list_clear(&skipped, 0);
+
+       return result;
 }
 
 static void show_list(const char *title, struct string_list *list,
@@ -770,7 +799,7 @@ static int get_one_remote_for_update(struct remote *remote, void *priv)
 {
        struct string_list *list = priv;
        if (!remote->skip_default_update)
-               string_list_append(xstrdup(remote->name), list);
+               string_list_append(remote->name, list);
        return 0;
 }