tests: fix negated test_i18ngrep calls
[gitweb.git] / builtin / show-branch.c
index 35a709e63066ad8bebc8a96dee0563bad43348b6..298c95e3f8b03e7f89d7767407ca8cee3eecc591 100644 (file)
@@ -6,22 +6,12 @@
 #include "parse-options.h"
 
 static const char* show_branch_usage[] = {
-    "git show-branch [-a|--all] [-r|--remotes] [--topo-order | --date-order] [--current] [--color | --no-color] [--sparse] [--more=<n> | --list | --independent | --merge-base] [--no-name | --sha1-name] [--topics] [<rev> | <glob>]...",
-    "git show-branch (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>]",
+    N_("git show-branch [-a|--all] [-r|--remotes] [--topo-order | --date-order] [--current] [--color[=<when>] | --no-color] [--sparse] [--more=<n> | --list | --independent | --merge-base] [--no-name | --sha1-name] [--topics] [(<rev> | <glob>)...]"),
+    N_("git show-branch (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>]"),
     NULL
 };
 
 static int showbranch_use_color = -1;
-static char column_colors[][COLOR_MAXLEN] = {
-       GIT_COLOR_RED,
-       GIT_COLOR_GREEN,
-       GIT_COLOR_YELLOW,
-       GIT_COLOR_BLUE,
-       GIT_COLOR_MAGENTA,
-       GIT_COLOR_CYAN,
-};
-
-#define COLUMN_COLORS_MAX (ARRAY_SIZE(column_colors))
 
 static int default_num;
 static int default_alloc;
@@ -36,14 +26,14 @@ static const char **default_arg;
 
 static const char *get_color_code(int idx)
 {
-       if (showbranch_use_color)
-               return column_colors[idx];
+       if (want_color(showbranch_use_color))
+               return column_colors_ansi[idx % column_colors_ansi_max];
        return "";
 }
 
 static const char *get_color_reset_code(void)
 {
-       if (showbranch_use_color)
+       if (want_color(showbranch_use_color))
                return GIT_COLOR_RESET;
        return "";
 }
@@ -172,29 +162,28 @@ static void name_commits(struct commit_list *list,
                        nth = 0;
                        while (parents) {
                                struct commit *p = parents->item;
-                               char newname[1000], *en;
+                               struct strbuf newname = STRBUF_INIT;
                                parents = parents->next;
                                nth++;
                                if (p->util)
                                        continue;
-                               en = newname;
                                switch (n->generation) {
                                case 0:
-                                       en += sprintf(en, "%s", n->head_name);
+                                       strbuf_addstr(&newname, n->head_name);
                                        break;
                                case 1:
-                                       en += sprintf(en, "%s^", n->head_name);
+                                       strbuf_addf(&newname, "%s^", n->head_name);
                                        break;
                                default:
-                                       en += sprintf(en, "%s~%d",
-                                               n->head_name, n->generation);
+                                       strbuf_addf(&newname, "%s~%d",
+                                                   n->head_name, n->generation);
                                        break;
                                }
                                if (nth == 1)
-                                       en += sprintf(en, "^");
+                                       strbuf_addch(&newname, '^');
                                else
-                                       en += sprintf(en, "^%d", nth);
-                               name_commit(p, xstrdup(newname), 0);
+                                       strbuf_addf(&newname, "^%d", nth);
+                               name_commit(p, strbuf_detach(&newname, NULL), 0);
                                i++;
                                name_first_parent_chain(p);
                        }
@@ -238,12 +227,11 @@ static void join_revs(struct commit_list **list_p,
                        parents = parents->next;
                        if ((this_flag & flags) == flags)
                                continue;
-                       if (!p->object.parsed)
-                               parse_commit(p);
+                       parse_commit(p);
                        if (mark_seen(p, seen_p) && !still_interesting)
                                extra--;
                        p->object.flags |= flags;
-                       insert_by_date(p, list_p);
+                       commit_list_insert_by_date(p, list_p);
                }
        }
 
@@ -293,11 +281,10 @@ static void show_one_commit(struct commit *commit, int no_name)
        struct commit_name *name = commit->util;
 
        if (commit->object.parsed) {
-               struct pretty_print_context ctx = {0};
-               pretty_print_commit(CMIT_FMT_ONELINE, commit, &pretty, &ctx);
+               pp_commit_easy(CMIT_FMT_ONELINE, commit, &pretty);
                pretty_str = pretty.buf;
        }
-       if (!prefixcmp(pretty_str, "[PATCH] "))
+       if (starts_with(pretty_str, "[PATCH] "))
                pretty_str += 8;
 
        if (!no_name) {
@@ -313,7 +300,8 @@ static void show_one_commit(struct commit *commit, int no_name)
                }
                else
                        printf("[%s] ",
-                              find_unique_abbrev(commit->object.sha1, 7));
+                              find_unique_abbrev(commit->object.sha1,
+                                                 DEFAULT_ABBREV));
        }
        puts(pretty_str);
        strbuf_release(&pretty);
@@ -407,7 +395,7 @@ static int append_head_ref(const char *refname, const unsigned char *sha1, int f
 {
        unsigned char tmp[20];
        int ofs = 11;
-       if (prefixcmp(refname, "refs/heads/"))
+       if (!starts_with(refname, "refs/heads/"))
                return 0;
        /* If both heads/foo and tags/foo exists, get_sha1 would
         * get confused.
@@ -421,7 +409,7 @@ static int append_remote_ref(const char *refname, const unsigned char *sha1, int
 {
        unsigned char tmp[20];
        int ofs = 13;
-       if (prefixcmp(refname, "refs/remotes/"))
+       if (!starts_with(refname, "refs/remotes/"))
                return 0;
        /* If both heads/foo and tags/foo exists, get_sha1 would
         * get confused.
@@ -433,7 +421,7 @@ static int append_remote_ref(const char *refname, const unsigned char *sha1, int
 
 static int append_tag_ref(const char *refname, const unsigned char *sha1, int flag, void *cb_data)
 {
-       if (prefixcmp(refname, "refs/tags/"))
+       if (!starts_with(refname, "refs/tags/"))
                return 0;
        return append_ref(refname + 5, sha1, 0);
 }
@@ -462,11 +450,11 @@ static int append_matching_ref(const char *refname, const unsigned char *sha1, i
                        slash--;
        if (!*tail)
                return 0;
-       if (fnmatch(match_ref_pattern, tail, 0))
+       if (wildmatch(match_ref_pattern, tail, 0, NULL))
                return 0;
-       if (!prefixcmp(refname, "refs/heads/"))
+       if (starts_with(refname, "refs/heads/"))
                return append_head_ref(refname, sha1, flag, cb_data);
-       if (!prefixcmp(refname, "refs/tags/"))
+       if (starts_with(refname, "refs/tags/"))
                return append_tag_ref(refname, sha1, flag, cb_data);
        return append_ref(refname, sha1, 0);
 }
@@ -491,11 +479,11 @@ static int rev_is_head(char *head, int headlen, char *name,
        if ((!head[0]) ||
            (head_sha1 && sha1 && hashcmp(head_sha1, sha1)))
                return 0;
-       if (!prefixcmp(head, "refs/heads/"))
+       if (starts_with(head, "refs/heads/"))
                head += 11;
-       if (!prefixcmp(name, "refs/heads/"))
+       if (starts_with(name, "refs/heads/"))
                name += 11;
-       else if (!prefixcmp(name, "heads/"))
+       else if (starts_with(name, "heads/"))
                name += 6;
        return !strcmp(head, name);
 }
@@ -583,7 +571,7 @@ static int git_show_branch_config(const char *var, const char *value, void *cb)
        }
 
        if (!strcmp(var, "color.showbranch")) {
-               showbranch_use_color = git_config_colorbool(var, value, -1);
+               showbranch_use_color = git_config_colorbool(var, value);
                return 0;
        }
 
@@ -641,7 +629,7 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
        int num_rev, i, extra = 0;
        int all_heads = 0, all_remotes = 0;
        int all_mask, all_revs;
-       int lifo = 1;
+       enum rev_sort_order sort_order = REV_SORT_IN_GRAPH_ORDER;
        char head[128];
        const char *head_p;
        int head_len;
@@ -657,37 +645,39 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
        int dense = 1;
        const char *reflog_base = NULL;
        struct option builtin_show_branch_options[] = {
-               OPT_BOOLEAN('a', "all", &all_heads,
-                           "show remote-tracking and local branches"),
-               OPT_BOOLEAN('r', "remotes", &all_remotes,
-                           "show remote-tracking branches"),
-               OPT_BOOLEAN(0, "color", &showbranch_use_color,
-                           "color '*!+-' corresponding to the branch"),
-               { OPTION_INTEGER, 0, "more", &extra, "n",
-                           "show <n> more commits after the common ancestor",
+               OPT_BOOL('a', "all", &all_heads,
+                        N_("show remote-tracking and local branches")),
+               OPT_BOOL('r', "remotes", &all_remotes,
+                        N_("show remote-tracking branches")),
+               OPT__COLOR(&showbranch_use_color,
+                           N_("color '*!+-' corresponding to the branch")),
+               { OPTION_INTEGER, 0, "more", &extra, N_("n"),
+                           N_("show <n> more commits after the common ancestor"),
                            PARSE_OPT_OPTARG, NULL, (intptr_t)1 },
-               OPT_SET_INT(0, "list", &extra, "synonym to more=-1", -1),
-               OPT_BOOLEAN(0, "no-name", &no_name, "suppress naming strings"),
-               OPT_BOOLEAN(0, "current", &with_current_branch,
-                           "include the current branch"),
-               OPT_BOOLEAN(0, "sha1-name", &sha1_name,
-                           "name commits with their object names"),
-               OPT_BOOLEAN(0, "merge-base", &merge_base,
-                           "show possible merge bases"),
-               OPT_BOOLEAN(0, "independent", &independent,
-                           "show refs unreachable from any other ref"),
-               OPT_BOOLEAN(0, "topo-order", &lifo,
-                           "show commits in topological order"),
-               OPT_BOOLEAN(0, "topics", &topics,
-                           "show only commits not on the first branch"),
+               OPT_SET_INT(0, "list", &extra, N_("synonym to more=-1"), -1),
+               OPT_BOOL(0, "no-name", &no_name, N_("suppress naming strings")),
+               OPT_BOOL(0, "current", &with_current_branch,
+                        N_("include the current branch")),
+               OPT_BOOL(0, "sha1-name", &sha1_name,
+                        N_("name commits with their object names")),
+               OPT_BOOL(0, "merge-base", &merge_base,
+                        N_("show possible merge bases")),
+               OPT_BOOL(0, "independent", &independent,
+                           N_("show refs unreachable from any other ref")),
+               OPT_SET_INT(0, "topo-order", &sort_order,
+                           N_("show commits in topological order"),
+                           REV_SORT_IN_GRAPH_ORDER),
+               OPT_BOOL(0, "topics", &topics,
+                        N_("show only commits not on the first branch")),
                OPT_SET_INT(0, "sparse", &dense,
-                           "show merges reachable from only one tip", 0),
-               OPT_SET_INT(0, "date-order", &lifo,
-                           "show commits where no parent comes before its "
-                           "children", 0),
-               { OPTION_CALLBACK, 'g', "reflog", &reflog_base, "<n>[,<base>]",
-                           "show <n> most recent ref-log entries starting at "
-                           "base",
+                           N_("show merges reachable from only one tip"), 0),
+               OPT_SET_INT(0, "date-order", &sort_order,
+                           N_("topologically sort, maintaining date order "
+                              "where possible"),
+                           REV_SORT_BY_COMMIT_DATE),
+               { OPTION_CALLBACK, 'g', "reflog", &reflog_base, N_("<n>[,<base>]"),
+                           N_("show <n> most recent ref-log entries starting at "
+                              "base"),
                            PARSE_OPT_OPTARG | PARSE_OPT_LITERAL_ARGHELP,
                            parse_reflog_param },
                OPT_END()
@@ -695,9 +685,6 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
 
        git_config(git_show_branch_config, NULL);
 
-       if (showbranch_use_color == -1)
-               showbranch_use_color = git_use_color_default;
-
        /* If nothing is specified, try the default first */
        if (ac == 1 && default_num) {
                ac = default_num;
@@ -739,10 +726,8 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
 
                if (ac == 0) {
                        static const char *fake_av[2];
-                       const char *refname;
 
-                       refname = resolve_ref("HEAD", sha1, 1, NULL);
-                       fake_av[0] = xstrdup(refname);
+                       fake_av[0] = resolve_refdup("HEAD", sha1, 1, NULL);
                        fake_av[1] = NULL;
                        av = fake_av;
                        ac = 1;
@@ -770,7 +755,7 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
                }
 
                for (i = 0; i < reflog; i++) {
-                       char *logmsg, *m;
+                       char *logmsg;
                        const char *msg;
                        unsigned long timestamp;
                        int tz;
@@ -785,15 +770,14 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
                                msg = "(none)";
                        else
                                msg++;
-                       m = xmalloc(strlen(msg) + 200);
-                       sprintf(m, "(%s) %s",
-                               show_date(timestamp, tz, 1),
-                               msg);
-                       reflog_msg[i] = m;
+                       reflog_msg[i] = xstrfmt("(%s) %s",
+                                               show_date(timestamp, tz, 1),
+                                               msg);
                        free(logmsg);
                        sprintf(nth_desc, "%s@{%d}", *av, base+i);
                        append_ref(nth_desc, sha1, 1);
                }
+               free(ref);
        }
        else if (all_heads + all_remotes)
                snarf_refs(all_heads, all_remotes);
@@ -804,7 +788,7 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
                }
        }
 
-       head_p = resolve_ref("HEAD", head_sha1, 1, NULL);
+       head_p = resolve_ref_unsafe("HEAD", head_sha1, 1, NULL);
        if (head_p) {
                head_len = strlen(head_p);
                memcpy(head, head_p, head_len + 1);
@@ -827,7 +811,7 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
                                has_head++;
                }
                if (!has_head) {
-                       int offset = !prefixcmp(head, "refs/heads/") ? 11 : 0;
+                       int offset = starts_with(head, "refs/heads/") ? 11 : 0;
                        append_one_rev(head + offset);
                }
        }
@@ -858,7 +842,7 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
                 */
                commit->object.flags |= flag;
                if (commit->object.flags == flag)
-                       insert_by_date(commit, &list);
+                       commit_list_insert_by_date(commit, &list);
                rev[num_rev] = commit;
        }
        for (i = 0; i < num_rev; i++)
@@ -867,7 +851,7 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
        if (0 <= extra)
                join_revs(&list, &seen, num_rev, extra);
 
-       sort_by_date(&seen);
+       commit_list_sort_by_date(&seen);
 
        if (merge_base)
                return show_merge_base(seen, num_rev);
@@ -891,7 +875,7 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
                                for (j = 0; j < i; j++)
                                        putchar(' ');
                                printf("%s%c%s [%s] ",
-                                      get_color_code(i % COLUMN_COLORS_MAX),
+                                      get_color_code(i),
                                       is_head ? '*' : '!',
                                       get_color_reset_code(), ref_name[i]);
                        }
@@ -916,7 +900,7 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
                exit(0);
 
        /* Sort topologically */
-       sort_in_topological_order(&seen, lifo);
+       sort_in_topological_order(&seen, sort_order);
 
        /* Give names to commits */
        if (!sha1_name && !no_name)
@@ -953,7 +937,7 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
                                else
                                        mark = '+';
                                printf("%s%c%s",
-                                      get_color_code(i % COLUMN_COLORS_MAX),
+                                      get_color_code(i),
                                       mark, get_color_reset_code());
                        }
                        putchar(' ');