summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2021-10-29 00:18:31 -0700
committerJunio C Hamano <gitster@pobox.com>2021-10-29 00:18:31 -0700
commit715dc68e71b2da256a0f819a6470c634b5094043 (patch)
tree303d3f340563422821023109c072c851d92da821
parent89f2a7a2b650dee26e506f52db3617089d0d1aa9 (diff)
parent098d630d25340fbba0929832248723159895e240 (diff)
Merge branch 'es/pretty-describe-more' into seenseen
Extend "git log --format=%(describe)" placeholder to allow passing selected command-line options to the underlying "git describe" command. * es/pretty-describe-more: pretty: add abbrev option to %(describe) pretty: add tag option to %(describe) pretty.c: rename describe options variable to more descriptive name
-rw-r--r--Documentation/pretty-formats.txt15
-rw-r--r--pretty.c31
-rwxr-xr-xt/t4205-log-pretty-formats.sh16
3 files changed, 49 insertions, 13 deletions
diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt
index d465cd59dd..aebbebbce6 100644
--- a/Documentation/pretty-formats.txt
+++ b/Documentation/pretty-formats.txt
@@ -220,6 +220,11 @@ The placeholders are:
inconsistent when tags are added or removed at
the same time.
+
+** 'tags[=<bool-value>]': Also consider lightweight tags.
+** 'abbrev=<number>': Instead of using the default number of hexadecimal digits
+ (which will vary according to the number of objects in the repository with a
+ default of 7) of the abbreviated object name, use <n> digits, or as many digits
+ as needed to form a unique object name.
** '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 +278,6 @@ endif::git-rev-list[]
If any option is provided multiple times the
last occurrence wins.
+
-The boolean options accept an optional value `[=<value>]`. 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=<key>': 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 +313,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-value>]`. 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 02ea1f0110..a14ab6204d 100644
--- a/pretty.c
+++ b/pretty.c
@@ -1279,28 +1279,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[] = { "match", "exclude" };
+ const char *options[] = { "tags" };
+ const char *option_arguments[] = { "match", "exclude", "abbrev" };
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(options); i++) {
- if (match_placeholder_arg_value(arg, options[i], &arg,
+ for (i = 0; i < ARRAY_SIZE(option_arguments); i++) {
+ if (match_placeholder_arg_value(arg, option_arguments[i], &arg,
&argval, &arglen)) {
- matched = options[i];
+ 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..35eef4c865 100755
--- a/t/t4205-log-pretty-formats.sh
+++ b/t/t4205-log-pretty-formats.sh
@@ -1002,4 +1002,20 @@ 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_expect_success '%(describe:abbrev=...) vs git describe --abbrev=...' '
+ test_when_finished "git tag -d tagname" &&
+ git tag -a -m tagged tagname &&
+ git describe --abbrev=15 >expect &&
+ git log -1 --format="%(describe:abbrev=15)" >actual &&
+ test_cmp expect actual
+'
+
test_done