describe: use argv-array

Instead of using a hand allocated args[] array, use argv-array API to manage the dynamically created list of arguments when invoking name-rev. Signed-off-by: Junio C Hamano <gitster@pobox.com>

Junio C Hamano committed Jul 7, 2013 at 14:42 UTC 45bc950b4330ab675724b5079aa1528acde9f404
1 file changed +15 -15
builtin/describe.c
+15 -15
@@ -7,6 +7,7 @@
7 #include "parse-options.h"
8 #include "diff.h"
9 #include "hash.h"
10 +#include "argv-array.h"
11
12 #define SEEN (1u<<0)
13 #define MAX_TAGS (FLAG_BITS - 1)
@@ -442,24 +443,23 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
443 die(_("--long is incompatible with --abbrev=0"));
444
445 if (contains) {
445 - const char **args = xmalloc((7 + argc) * sizeof(char *));
446 - int i = 0;
447 - args[i++] = "name-rev";
448 - args[i++] = "--name-only";
449 - args[i++] = "--no-undefined";
446 + struct argv_array args;
447 +
448 + argv_array_init(&args);
449 + argv_array_pushl(&args, "name-rev", "--name-only", "--no-undefined",
450 + NULL);
451 if (always)
451 - args[i++] = "--always";
452 + argv_array_push(&args, "--always");
453 if (!all) {
453 - args[i++] = "--tags";
454 - if (pattern) {
455 - char *s = xmalloc(strlen("--refs=refs/tags/") + strlen(pattern) + 1);
456 - sprintf(s, "--refs=refs/tags/%s", pattern);
457 - args[i++] = s;
458 - }
454 + argv_array_push(&args, "--tags");
455 + if (pattern)
456 + argv_array_pushf(&args, "--refs=refs/tags/%s", pattern);
457 + }
458 + while (*argv) {
459 + argv_array_push(&args, *argv);
460 + argv++;
461 }
460 - memcpy(args + i, argv, argc * sizeof(char *));
461 - args[i + argc] = NULL;
462 - return cmd_name_rev(i + argc, args, prefix);
462 + return cmd_name_rev(args.argc, args.argv, prefix);
463 }
464
465 init_hash(&names);