]> git.ipfire.org Git - thirdparty/git.git/commitdiff
pretty: add tag option to %(describe)
authorEli Schwartz <eschwartz@archlinux.org>
Sun, 31 Oct 2021 17:15:09 +0000 (13:15 -0400)
committerJunio C Hamano <gitster@pobox.com>
Mon, 1 Nov 2021 17:34:34 +0000 (10:34 -0700)
The %(describe) placeholder by default, like `git describe`, only
supports annotated tags. However, some people do use lightweight tags
for releases, and would like to describe those anyway. The command line
tool has an option to support this.

Teach the placeholder to support this as well.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/pretty-formats.txt
pretty.c
t/t4205-log-pretty-formats.sh

index ef6bd420ae66361707cb8b206d6bb71a80a49674..1ee47bd4a3362b28277972a8537e6df15920f07d 100644 (file)
@@ -220,6 +220,8 @@ The placeholders are:
                          inconsistent when tags are added or removed at
                          the same time.
 +
+** 'tags[=<bool>]': Instead of only considering annotated tags,
+   consider lightweight tags as well.
 ** 'match=<pattern>': Only consider tags matching the given
    `glob(7)` pattern, excluding the "refs/tags/" prefix.
 ** 'exclude=<pattern>': Do not consider tags matching the given
@@ -273,11 +275,6 @@ endif::git-rev-list[]
                          If any option is provided multiple times the
                          last occurrence wins.
 +
-The boolean options accept an optional value `[=<BOOL>]`. The values
-`true`, `false`, `on`, `off` etc. are all accepted. See the "boolean"
-sub-section in "EXAMPLES" in linkgit:git-config[1]. If a boolean
-option is given with no value, it's enabled.
-+
 ** 'key=<K>': only show trailers with specified key. Matching is done
    case-insensitively and trailing colon is optional. If option is
    given multiple times trailer lines matching any of the keys are
@@ -313,6 +310,11 @@ insert an empty string unless we are traversing reflog entries (e.g., by
 decoration format if `--decorate` was not already provided on the command
 line.
 
+The boolean options accept an optional value `[=<bool>]`. The values
+`true`, `false`, `on`, `off` etc. are all accepted. See the "boolean"
+sub-section in "EXAMPLES" in linkgit:git-config[1]. If a boolean
+option is given with no value, it's enabled.
+
 If you add a `+` (plus sign) after '%' of a placeholder, a line-feed
 is inserted immediately before the expansion if and only if the
 placeholder expands to a non-empty string.
index 6e945fdb18311862be44bff63e1782eb28b7e49e..52741fa0a96398900a211431e9dd585a7d691e36 100644 (file)
--- a/pretty.c
+++ b/pretty.c
@@ -1219,9 +1219,11 @@ static size_t parse_describe_args(const char *start, struct strvec *args)
        struct {
                char *name;
                enum {
+                       DESCRIBE_ARG_BOOL,
                        DESCRIBE_ARG_STRING,
                } type;
        }  option[] = {
+               { "tags", DESCRIBE_ARG_BOOL},
                { "exclude", DESCRIBE_ARG_STRING },
                { "match", DESCRIBE_ARG_STRING },
        };
@@ -1231,10 +1233,20 @@ static size_t parse_describe_args(const char *start, struct strvec *args)
                int found = 0;
                const char *argval;
                size_t arglen = 0;
+               int optval = 0;
                int 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_STRING:
                                if (match_placeholder_arg_value(arg, option[i].name, &arg,
                                                                &argval, &arglen)) {
index 5865daa8f8d2234f0379d25bda47d5d3142f3fc8..d4acf8882f39435d32b97ab5732941ea1e647c32 100755 (executable)
@@ -1002,4 +1002,12 @@ test_expect_success '%(describe:exclude=...) vs git describe --exclude ...' '
        test_cmp expect actual
 '
 
+test_expect_success '%(describe:tags) vs git describe --tags' '
+       test_when_finished "git tag -d tagname" &&
+       git tag tagname &&
+       git describe --tags >expect &&
+       git log -1 --format="%(describe:tags)" >actual &&
+       test_cmp expect actual
+'
+
 test_done