git-describe: --long shows the object name even for a tagged commit
authorSanti Béjar <sbejar@gmail.com>
Mon, 25 Feb 2008 09:43:33 +0000 (10:43 +0100)
committerJunio C Hamano <gitster@pobox.com>
Tue, 26 Feb 2008 02:59:20 +0000 (18:59 -0800)
This is useful when you want to see parts of the commit object name
in "describe" output, even when the commit in question happens to be
a tagged version.  Instead of just emitting the tag name, it will
describe such a commit as v1.2-0-deadbeef (0th commit since tag v1.2
that points at object deadbeef....).

Signed-off-by: Santi Béjar <sbejar@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-describe.txt
builtin-describe.c
t/t6120-describe.sh

index 1c3dfb4..270b808 100644 (file)
@@ -51,6 +51,15 @@ OPTIONS
        being employed to standard error.  The tag name will still
        be printed to standard out.
 
+--long::
+       Always output the long format (the tag, the number of commits
+       and the abbreviated commit name) even when it matches a tag.
+       This is useful when you want to see parts of the commit object name
+       in "describe" output, even when the commit in question happens to be
+       a tagged version.  Instead of just emitting the tag name, it will
+       describe such a commit as v1.2-0-deadbeef (0th commit since tag v1.2
+       that points at object deadbeef....).
+
 --match <pattern>::
        Only consider tags matching the given pattern (can be used to avoid
        leaking private tags made from the repository).
index 3428483..3fd2e73 100644 (file)
@@ -17,6 +17,7 @@ static const char * const describe_usage[] = {
 static int debug;      /* Display lots of verbose info */
 static int all;        /* Default to annotated tags only */
 static int tags;       /* But allow any tags if --tags is specified */
+static int longformat;
 static int abbrev = DEFAULT_ABBREV;
 static int max_candidates = 10;
 const char *pattern = NULL;
@@ -155,7 +156,11 @@ static void describe(const char *arg, int last_one)
 
        n = cmit->util;
        if (n) {
-               printf("%s\n", n->path);
+               if (!longformat)
+                       printf("%s\n", n->path);
+               else
+                       printf("%s-0-g%s\n", n->path,
+                               find_unique_abbrev(cmit->object.sha1, abbrev));
                return;
        }
 
@@ -254,6 +259,7 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
                OPT_BOOLEAN(0, "debug",      &debug, "debug search strategy on stderr"),
                OPT_BOOLEAN(0, "all",        &all, "use any ref in .git/refs"),
                OPT_BOOLEAN(0, "tags",       &tags, "use any tag in .git/refs/tags"),
+               OPT_BOOLEAN(0, "long",       &longformat, "always use long format"),
                OPT__ABBREV(&abbrev),
                OPT_INTEGER(0, "candidates", &max_candidates,
                            "consider <n> most recent tags (default: 10)"),
@@ -270,6 +276,9 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
 
        save_commit_buffer = 0;
 
+       if (longformat && abbrev == 0)
+               die("--long is incompatible with --abbrev=0");
+
        if (contains) {
                const char **args = xmalloc((6 + argc) * sizeof(char*));
                int i = 0;
index ae8ee11..a7557bd 100755 (executable)
@@ -94,4 +94,6 @@ check_describe D-* --tags HEAD^^
 check_describe A-* --tags HEAD^^2
 check_describe B --tags HEAD^^2^
 
+check_describe B-0-* --long HEAD^^2^
+
 test_done