]> git.ipfire.org Git - thirdparty/git.git/blobdiff - builtin-rev-parse.c
log: print log entry terminator even if the message is empty
[thirdparty/git.git] / builtin-rev-parse.c
index 20d1789e0161ed3d2d18cec94b1915f518a5d662..0e597073239c97160582fbb7047794796f67987f 100644 (file)
@@ -21,6 +21,9 @@ static const char *def;
 #define NORMAL 0
 #define REVERSED 1
 static int show_type = NORMAL;
+
+#define SHOW_SYMBOLIC_ASIS 1
+#define SHOW_SYMBOLIC_FULL 2
 static int symbolic;
 static int abbrev;
 static int output_sq;
@@ -103,8 +106,32 @@ static void show_rev(int type, const unsigned char *sha1, const char *name)
 
        if (type != show_type)
                putchar('^');
-       if (symbolic && name)
-               show(name);
+       if (symbolic && name) {
+               if (symbolic == SHOW_SYMBOLIC_FULL) {
+                       unsigned char discard[20];
+                       char *full;
+
+                       switch (dwim_ref(name, strlen(name), discard, &full)) {
+                       case 0:
+                               /*
+                                * Not found -- not a ref.  We could
+                                * emit "name" here, but symbolic-full
+                                * users are interested in finding the
+                                * refs spelled in full, and they would
+                                * need to filter non-refs if we did so.
+                                */
+                               break;
+                       case 1: /* happy */
+                               show(full);
+                               break;
+                       default: /* ambiguous */
+                               error("refname '%s' is ambiguous", name);
+                               break;
+                       }
+               } else {
+                       show(name);
+               }
+       }
        else if (abbrev)
                show(find_unique_abbrev(sha1, abbrev));
        else
@@ -288,25 +315,31 @@ static int cmd_parseopt(int argc, const char **argv, const char *prefix)
                s = strchr(sb.buf, ' ');
                if (!s || *sb.buf == ' ') {
                        o->type = OPTION_GROUP;
-                       o->help = xstrdup(skipspaces(s));
+                       o->help = xstrdup(skipspaces(sb.buf));
                        continue;
                }
 
                o->type = OPTION_CALLBACK;
                o->help = xstrdup(skipspaces(s));
                o->value = &parsed;
+               o->flags = PARSE_OPT_NOARG;
                o->callback = &parseopt_dump;
-               switch (s[-1]) {
-               case '=':
-                       s--;
-                       break;
-               case '?':
-                       o->flags = PARSE_OPT_OPTARG;
-                       s--;
-                       break;
-               default:
-                       o->flags = PARSE_OPT_NOARG;
-                       break;
+               while (s > sb.buf && strchr("*=?!", s[-1])) {
+                       switch (*--s) {
+                       case '=':
+                               o->flags &= ~PARSE_OPT_NOARG;
+                               break;
+                       case '?':
+                               o->flags &= ~PARSE_OPT_NOARG;
+                               o->flags |= PARSE_OPT_OPTARG;
+                               break;
+                       case '!':
+                               o->flags |= PARSE_OPT_NONEG;
+                               break;
+                       case '*':
+                               o->flags |= PARSE_OPT_HIDDEN;
+                               break;
+                       }
                }
 
                if (s - sb.buf == 1) /* short option only */
@@ -332,9 +365,17 @@ static int cmd_parseopt(int argc, const char **argv, const char *prefix)
        return 0;
 }
 
+static void die_no_single_rev(int quiet)
+{
+       if (quiet)
+               exit(1);
+       else
+               die("Needed a single revision");
+}
+
 int cmd_rev_parse(int argc, const char **argv, const char *prefix)
 {
-       int i, as_is = 0, verify = 0;
+       int i, as_is = 0, verify = 0, quiet = 0;
        unsigned char sha1[20];
 
        if (argc > 1 && !strcmp("--parseopt", argv[1]))
@@ -399,6 +440,10 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                                verify = 1;
                                continue;
                        }
+                       if (!strcmp(arg, "--quiet") || !strcmp(arg, "-q")) {
+                               quiet = 1;
+                               continue;
+                       }
                        if (!strcmp(arg, "--short") ||
                            !prefixcmp(arg, "--short=")) {
                                filter &= ~(DO_FLAGS|DO_NOREV);
@@ -421,7 +466,11 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                                continue;
                        }
                        if (!strcmp(arg, "--symbolic")) {
-                               symbolic = 1;
+                               symbolic = SHOW_SYMBOLIC_ASIS;
+                               continue;
+                       }
+                       if (!strcmp(arg, "--symbolic-full-name")) {
+                               symbolic = SHOW_SYMBOLIC_FULL;
                                continue;
                        }
                        if (!strcmp(arg, "--all")) {
@@ -512,7 +561,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                                continue;
                        }
                        if (show_flag(arg) && verify)
-                               die("Needed a single revision");
+                               die_no_single_rev(quiet);
                        continue;
                }
 
@@ -527,15 +576,15 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                        show_rev(REVERSED, sha1, arg+1);
                        continue;
                }
+               if (verify)
+                       die_no_single_rev(quiet);
                as_is = 1;
                if (!show_file(arg))
                        continue;
-               if (verify)
-                       die("Needed a single revision");
                verify_filename(prefix, arg);
        }
        show_default();
        if (verify && revs_count != 1)
-               die("Needed a single revision");
+               die_no_single_rev(quiet);
        return 0;
 }