]> git.ipfire.org Git - thirdparty/git.git/blobdiff - pretty.c
refs: print error message in debug output
[thirdparty/git.git] / pretty.c
index 1af5b093ae8a91ec8906b0ebac9f505d7df4b075..ee6114e3f0aa1dcf8737794bbe8dc8f6e23f5f7b 100644 (file)
--- a/pretty.c
+++ b/pretty.c
@@ -1275,28 +1275,66 @@ int format_set_trailers_options(struct process_trailer_options *opts,
 
 static size_t parse_describe_args(const char *start, struct strvec *args)
 {
-       const char *options[] = { "match", "exclude" };
+       struct {
+               char *name;
+               enum {
+                       DESCRIBE_ARG_BOOL,
+                       DESCRIBE_ARG_INTEGER,
+                       DESCRIBE_ARG_STRING,
+               } type;
+       }  option[] = {
+               { "tags", DESCRIBE_ARG_BOOL},
+               { "abbrev", DESCRIBE_ARG_INTEGER },
+               { "exclude", DESCRIBE_ARG_STRING },
+               { "match", DESCRIBE_ARG_STRING },
+       };
        const char *arg = start;
 
        for (;;) {
-               const char *matched = NULL;
+               int found = 0;
                const char *argval;
                size_t arglen = 0;
+               int optval = 0;
                int i;
 
-               for (i = 0; i < ARRAY_SIZE(options); i++) {
-                       if (match_placeholder_arg_value(arg, options[i], &arg,
-                                                       &argval, &arglen)) {
-                               matched = options[i];
+               for (i = 0; !found && i < ARRAY_SIZE(option); i++) {
+                       switch (option[i].type) {
+                       case DESCRIBE_ARG_BOOL:
+                               if (match_placeholder_bool_arg(arg, option[i].name, &arg, &optval)) {
+                                       if (optval)
+                                               strvec_pushf(args, "--%s", option[i].name);
+                                       else
+                                               strvec_pushf(args, "--no-%s", option[i].name);
+                                       found = 1;
+                               }
+                               break;
+                       case DESCRIBE_ARG_INTEGER:
+                               if (match_placeholder_arg_value(arg, option[i].name, &arg,
+                                                               &argval, &arglen)) {
+                                       char *endptr;
+                                       if (!arglen)
+                                               return 0;
+                                       strtol(argval, &endptr, 10);
+                                       if (endptr - argval != arglen)
+                                               return 0;
+                                       strvec_pushf(args, "--%s=%.*s", option[i].name, (int)arglen, argval);
+                                       found = 1;
+                               }
+                               break;
+                       case DESCRIBE_ARG_STRING:
+                               if (match_placeholder_arg_value(arg, option[i].name, &arg,
+                                                               &argval, &arglen)) {
+                                       if (!arglen)
+                                               return 0;
+                                       strvec_pushf(args, "--%s=%.*s", option[i].name, (int)arglen, argval);
+                                       found = 1;
+                               }
                                break;
                        }
                }
-               if (!matched)
+               if (!found)
                        break;
 
-               if (!arglen)
-                       return 0;
-               strvec_pushf(args, "--%s=%.*s", matched, (int)arglen, argval);
        }
        return arg - start;
 }