]> git.ipfire.org Git - thirdparty/git.git/commitdiff
pretty: add %(describe)
authorRené Scharfe <l.s.r@web.de>
Sun, 14 Feb 2021 10:04:34 +0000 (11:04 +0100)
committerJunio C Hamano <gitster@pobox.com>
Wed, 17 Feb 2021 17:54:31 +0000 (09:54 -0800)
Add a format placeholder for describe output.  Implement it by actually
calling git describe, which is simple and guarantees correctness.  It's
intended to be used with $Format:...$ in files with the attribute
export-subst and git archive.  It can also be used with git log etc.,
even though that's going to be slow due to the fork for each commit.

Suggested-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/pretty-formats.txt
pretty.c
t/t4205-log-pretty-formats.sh

index 6b59e28d444f8e1f033f435ce0c396aca2516865..bb8c05bc21cb8d2c3f3133e55515316940a75497 100644 (file)
@@ -208,6 +208,8 @@ The placeholders are:
 '%cs':: committer date, short format (`YYYY-MM-DD`)
 '%d':: ref names, like the --decorate option of linkgit:git-log[1]
 '%D':: ref names without the " (", ")" wrapping.
+'%(describe)':: human-readable name, like linkgit:git-describe[1];
+               empty string for undescribable commits
 '%S':: ref name given on the command line by which the commit was reached
        (like `git log --source`), only works with `git log`
 '%e':: encoding
index b4ff3f602f9b17068f74b79ad7611e806e0e6c01..a0c427fb6134db06b2eeb5180d59495dcf158a1f 100644 (file)
--- a/pretty.c
+++ b/pretty.c
@@ -12,6 +12,7 @@
 #include "reflog-walk.h"
 #include "gpg-interface.h"
 #include "trailer.h"
+#include "run-command.h"
 
 static char *user_format;
 static struct cmt_fmt_map {
@@ -1214,6 +1215,22 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
                return parse_padding_placeholder(placeholder, c);
        }
 
+       if (skip_prefix(placeholder, "(describe)", &arg)) {
+               struct child_process cmd = CHILD_PROCESS_INIT;
+               struct strbuf out = STRBUF_INIT;
+               struct strbuf err = STRBUF_INIT;
+
+               cmd.git_cmd = 1;
+               strvec_push(&cmd.args, "describe");
+               strvec_push(&cmd.args, oid_to_hex(&commit->object.oid));
+               pipe_command(&cmd, NULL, 0, &out, 0, &err, 0);
+               strbuf_rtrim(&out);
+               strbuf_addbuf(sb, &out);
+               strbuf_release(&out);
+               strbuf_release(&err);
+               return arg - placeholder;
+       }
+
        /* these depend on the commit */
        if (!commit->object.parsed)
                parse_object(the_repository, &commit->object.oid);
index 749bc1431ac26660a477ad33364feba62c426956..5a44fa447dee7bade5d1478bd5abc4c88d11ee2b 100755 (executable)
@@ -962,4 +962,14 @@ test_expect_success 'log --pretty=reference is colored appropriately' '
        test_cmp expect actual
 '
 
+test_expect_success '%(describe) vs git describe' '
+       git log --format="%H" | while read hash
+       do
+               echo "$hash $(git describe $hash)"
+       done >expect &&
+       git log --format="%H %(describe)" >actual 2>err &&
+       test_cmp expect actual &&
+       test_must_be_empty err
+'
+
 test_done