Merge branch 'es/pretty-describe-more'
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: rework describe options parsing for better extensibility
This commit is contained in:
commit
6ba65f4ac3
@ -220,6 +220,12 @@ The placeholders are:
|
||||
inconsistent when tags are added or removed at
|
||||
the same time.
|
||||
+
|
||||
** 'tags[=<bool-value>]': Instead of only considering annotated tags,
|
||||
consider lightweight tags as well.
|
||||
** '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 <number> 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 +279,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 +314,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.
|
||||
|
58
pretty.c
58
pretty.c
@ -1275,28 +1275,66 @@ 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" };
|
||||
struct {
|
||||
char *name;
|
||||
enum {
|
||||
DESCRIBE_ARG_BOOL,
|
||||
DESCRIBE_ARG_INTEGER,
|
||||
DESCRIBE_ARG_STRING,
|
||||
} type;
|
||||
} option[] = {
|
||||
{ "tags", DESCRIBE_ARG_BOOL},
|
||||
{ "abbrev", DESCRIBE_ARG_INTEGER },
|
||||
{ "exclude", DESCRIBE_ARG_STRING },
|
||||
{ "match", DESCRIBE_ARG_STRING },
|
||||
};
|
||||
const char *arg = start;
|
||||
|
||||
for (;;) {
|
||||
const char *matched = NULL;
|
||||
int found = 0;
|
||||
const char *argval;
|
||||
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,
|
||||
&argval, &arglen)) {
|
||||
matched = options[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_INTEGER:
|
||||
if (match_placeholder_arg_value(arg, option[i].name, &arg,
|
||||
&argval, &arglen)) {
|
||||
char *endptr;
|
||||
if (!arglen)
|
||||
return 0;
|
||||
strtol(argval, &endptr, 10);
|
||||
if (endptr - argval != arglen)
|
||||
return 0;
|
||||
strvec_pushf(args, "--%s=%.*s", option[i].name, (int)arglen, argval);
|
||||
found = 1;
|
||||
}
|
||||
break;
|
||||
case DESCRIBE_ARG_STRING:
|
||||
if (match_placeholder_arg_value(arg, option[i].name, &arg,
|
||||
&argval, &arglen)) {
|
||||
if (!arglen)
|
||||
return 0;
|
||||
strvec_pushf(args, "--%s=%.*s", option[i].name, (int)arglen, argval);
|
||||
found = 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!matched)
|
||||
if (!found)
|
||||
break;
|
||||
|
||||
if (!arglen)
|
||||
return 0;
|
||||
strvec_pushf(args, "--%s=%.*s", matched, (int)arglen, argval);
|
||||
}
|
||||
return arg - start;
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user