Merge branch 'es/blame-L-twice'
[gitweb.git] / builtin / describe.c
index 4e675c3d0d7b1daeb7f12ef425514a11a92a5c3f..c94e5c30d0851080c49df2edc6d66a739085cf22 100644 (file)
@@ -7,6 +7,7 @@
 #include "parse-options.h"
 #include "diff.h"
 #include "hash.h"
+#include "argv-array.h"
 
 #define SEEN           (1u<<0)
 #define MAX_TAGS       (FLAG_BITS - 1)
@@ -405,12 +406,12 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
 {
        int contains = 0;
        struct option options[] = {
-               OPT_BOOLEAN(0, "contains",   &contains, N_("find the tag that comes after the commit")),
-               OPT_BOOLEAN(0, "debug",      &debug, N_("debug search strategy on stderr")),
-               OPT_BOOLEAN(0, "all",        &all, N_("use any ref")),
-               OPT_BOOLEAN(0, "tags",       &tags, N_("use any tag, even unannotated")),
-               OPT_BOOLEAN(0, "long",       &longformat, N_("always use long format")),
-               OPT_BOOLEAN(0, "first-parent", &first_parent, N_("only follow first parent")),
+               OPT_BOOL(0, "contains",   &contains, N_("find the tag that comes after the commit")),
+               OPT_BOOL(0, "debug",      &debug, N_("debug search strategy on stderr")),
+               OPT_BOOL(0, "all",        &all, N_("use any ref")),
+               OPT_BOOL(0, "tags",       &tags, N_("use any tag, even unannotated")),
+               OPT_BOOL(0, "long",       &longformat, N_("always use long format")),
+               OPT_BOOL(0, "first-parent", &first_parent, N_("only follow first parent")),
                OPT__ABBREV(&abbrev),
                OPT_SET_INT(0, "exact-match", &max_candidates,
                            N_("only output exact matches"), 0),
@@ -418,11 +419,11 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
                            N_("consider <n> most recent tags (default: 10)")),
                OPT_STRING(0, "match",       &pattern, N_("pattern"),
                           N_("only consider tags matching <pattern>")),
-               OPT_BOOLEAN(0, "always",     &always,
-                          N_("show abbreviated commit object as fallback")),
+               OPT_BOOL(0, "always",        &always,
+                       N_("show abbreviated commit object as fallback")),
                {OPTION_STRING, 0, "dirty",  &dirty, N_("mark"),
-                          N_("append <mark> on dirty working tree (default: \"-dirty\")"),
-                PARSE_OPT_OPTARG, NULL, (intptr_t) "-dirty"},
+                       N_("append <mark> on dirty working tree (default: \"-dirty\")"),
+                       PARSE_OPT_OPTARG, NULL, (intptr_t) "-dirty"},
                OPT_END(),
        };
 
@@ -442,24 +443,24 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
                die(_("--long is incompatible with --abbrev=0"));
 
        if (contains) {
-               const char **args = xmalloc((7 + argc) * sizeof(char *));
-               int i = 0;
-               args[i++] = "name-rev";
-               args[i++] = "--name-only";
-               args[i++] = "--no-undefined";
+               struct argv_array args;
+
+               argv_array_init(&args);
+               argv_array_pushl(&args, "name-rev",
+                                "--peel-tag", "--name-only", "--no-undefined",
+                                NULL);
                if (always)
-                       args[i++] = "--always";
+                       argv_array_push(&args, "--always");
                if (!all) {
-                       args[i++] = "--tags";
-                       if (pattern) {
-                               char *s = xmalloc(strlen("--refs=refs/tags/") + strlen(pattern) + 1);
-                               sprintf(s, "--refs=refs/tags/%s", pattern);
-                               args[i++] = s;
-                       }
+                       argv_array_push(&args, "--tags");
+                       if (pattern)
+                               argv_array_pushf(&args, "--refs=refs/tags/%s", pattern);
+               }
+               while (*argv) {
+                       argv_array_push(&args, *argv);
+                       argv++;
                }
-               memcpy(args + i, argv, argc * sizeof(char *));
-               args[i + argc] = NULL;
-               return cmd_name_rev(i + argc, args, prefix);
+               return cmd_name_rev(args.argc, args.argv, prefix);
        }
 
        init_hash(&names);