git-rev-parse --symbolic-full-name
authorJunio C Hamano <gitster@pobox.com>
Sat, 5 Jan 2008 20:09:55 +0000 (12:09 -0800)
committerJunio C Hamano <gitster@pobox.com>
Mon, 7 Jan 2008 02:41:43 +0000 (18:41 -0800)
The plumbing level can understand that the user meant
"refs/heads/master" when the user says "master" or
"heads/master", but there is no easy way for the scripts to
figure it out without duplicating the dwim_ref() logic.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-rev-parse.txt
builtin-rev-parse.c

index 329fce0aab417e5fe02845bd21b693f5200b3634..0cedc137288ad4ca87839c6daa959a104fe6dc2d 100644 (file)
@@ -70,6 +70,13 @@ OPTIONS
        possible '{caret}' prefix); this option makes them output in a
        form as close to the original input as possible.
 
+--symbolic-full-name::
+       This is similar to \--symbolic, but it omits input that
+       are not refs (i.e. branch or tag names; or more
+       explicitly disambiguating "heads/master" form, when you
+       want to name the "master" branch when there is an
+       unfortunately named tag "master"), and show them as full
+       refnames (e.g. "refs/heads/master").
 
 --all::
        Show all refs found in `$GIT_DIR/refs`.
index 20d1789e0161ed3d2d18cec94b1915f518a5d662..b9af1a5a554e21338531b88cd34bcb767d5f3848 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
@@ -421,7 +448,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")) {