summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEli Schwartz <eschwartz@archlinux.org>2021-10-23 21:42:55 -0400
committerJunio C Hamano <gitster@pobox.com>2021-10-23 22:35:14 -0700
commit7347086a7383b5516365ba62d56341844d85f177 (patch)
tree8559491e8119f93c881d06e85d6a4fb148c704fb
parent6cfe4190240f82339d0a380931433c0b3d21e65c (diff)
pretty: add tag option to %(describe)
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>
-rw-r--r--Documentation/pretty-formats.txt11
-rw-r--r--pretty.c23
-rwxr-xr-xt/t4205-log-pretty-formats.sh8
3 files changed, 33 insertions, 9 deletions
diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt
index ef6bd420ae..14107ac191 100644
--- a/Documentation/pretty-formats.txt
+++ b/Documentation/pretty-formats.txt
@@ -220,6 +220,7 @@ The placeholders are:
inconsistent when tags are added or removed at
the same time.
+
+** 'tags[=<BOOL>]': Also consider lightweight tags.
** '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 +274,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 +309,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.
diff --git a/pretty.c b/pretty.c
index 9db2c65538..3a41bedf1a 100644
--- a/pretty.c
+++ b/pretty.c
@@ -1216,28 +1216,43 @@ int format_set_trailers_options(struct process_trailer_options *opts,
static size_t parse_describe_args(const char *start, struct strvec *args)
{
+ const char *options[] = { "tags" };
const char *option_arguments[] = { "match", "exclude" };
const char *arg = start;
for (;;) {
const char *matched = NULL;
- const char *argval;
+ const char *argval = NULL;
size_t arglen = 0;
+ int optval = 0;
int i;
for (i = 0; i < ARRAY_SIZE(option_arguments); i++) {
if (match_placeholder_arg_value(arg, option_arguments[i], &arg,
&argval, &arglen)) {
matched = option_arguments[i];
+ if (!arglen)
+ return 0;
break;
}
}
if (!matched)
+ for (i = 0; i < ARRAY_SIZE(options); i++) {
+ if (match_placeholder_bool_arg(arg, options[i], &arg,
+ &optval)) {
+ matched = options[i];
+ break;
+ }
+ }
+ if (!matched)
break;
- if (!arglen)
- return 0;
- strvec_pushf(args, "--%s=%.*s", matched, (int)arglen, argval);
+
+ if (argval) {
+ strvec_pushf(args, "--%s=%.*s", matched, (int)arglen, argval);
+ } else if (optval) {
+ strvec_pushf(args, "--%s", matched);
+ }
}
return arg - start;
}
diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh
index 5865daa8f8..d4acf8882f 100755
--- a/t/t4205-log-pretty-formats.sh
+++ b/t/t4205-log-pretty-formats.sh
@@ -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