log: add %S option (like --source) to log --format
Make it possible to write for example git log --format="%H,%S" where the %S at the end is a new placeholder that prints out the ref (tag/branch) for each commit. Using %d might seem like an alternative but it only shows the ref for the last commit in the branch. Signed-off-by: Issac Trotts <issactrotts@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
ecbdaf0899
commit
ad6f028f06
@ -134,6 +134,8 @@ The placeholders are:
|
|||||||
- '%cI': committer date, strict ISO 8601 format
|
- '%cI': committer date, strict ISO 8601 format
|
||||||
- '%d': ref names, like the --decorate option of linkgit:git-log[1]
|
- '%d': ref names, like the --decorate option of linkgit:git-log[1]
|
||||||
- '%D': ref names without the " (", ")" wrapping.
|
- '%D': ref names without the " (", ")" wrapping.
|
||||||
|
- '%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
|
- '%e': encoding
|
||||||
- '%s': subject
|
- '%s': subject
|
||||||
- '%f': sanitized subject line, suitable for a filename
|
- '%f': sanitized subject line, suitable for a filename
|
||||||
|
@ -203,7 +203,7 @@ static void cmd_log_init_finish(int argc, const char **argv, const char *prefix,
|
|||||||
rev->diffopt.filter || rev->diffopt.flags.follow_renames)
|
rev->diffopt.filter || rev->diffopt.flags.follow_renames)
|
||||||
rev->always_show_header = 0;
|
rev->always_show_header = 0;
|
||||||
|
|
||||||
if (source) {
|
if (source || w.source) {
|
||||||
init_revision_sources(&revision_sources);
|
init_revision_sources(&revision_sources);
|
||||||
rev->sources = &revision_sources;
|
rev->sources = &revision_sources;
|
||||||
}
|
}
|
||||||
|
@ -700,6 +700,7 @@ void show_log(struct rev_info *opt)
|
|||||||
ctx.color = opt->diffopt.use_color;
|
ctx.color = opt->diffopt.use_color;
|
||||||
ctx.expand_tabs_in_log = opt->expand_tabs_in_log;
|
ctx.expand_tabs_in_log = opt->expand_tabs_in_log;
|
||||||
ctx.output_encoding = get_log_output_encoding();
|
ctx.output_encoding = get_log_output_encoding();
|
||||||
|
ctx.rev = opt;
|
||||||
if (opt->from_ident.mail_begin && opt->from_ident.name_begin)
|
if (opt->from_ident.mail_begin && opt->from_ident.name_begin)
|
||||||
ctx.from_ident = &opt->from_ident;
|
ctx.from_ident = &opt->from_ident;
|
||||||
if (opt->graph)
|
if (opt->graph)
|
||||||
|
12
pretty.c
12
pretty.c
@ -1084,6 +1084,7 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
|
|||||||
struct commit_list *p;
|
struct commit_list *p;
|
||||||
const char *arg;
|
const char *arg;
|
||||||
int ch;
|
int ch;
|
||||||
|
char **slot;
|
||||||
|
|
||||||
/* these are independent of the commit */
|
/* these are independent of the commit */
|
||||||
switch (placeholder[0]) {
|
switch (placeholder[0]) {
|
||||||
@ -1194,6 +1195,14 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
|
|||||||
load_ref_decorations(NULL, DECORATE_SHORT_REFS);
|
load_ref_decorations(NULL, DECORATE_SHORT_REFS);
|
||||||
format_decorations_extended(sb, commit, c->auto_color, "", ", ", "");
|
format_decorations_extended(sb, commit, c->auto_color, "", ", ", "");
|
||||||
return 1;
|
return 1;
|
||||||
|
case 'S': /* tag/branch like --source */
|
||||||
|
if (!(c->pretty_ctx->rev && c->pretty_ctx->rev->sources))
|
||||||
|
return 0;
|
||||||
|
slot = revision_sources_at(c->pretty_ctx->rev->sources, commit);
|
||||||
|
if (!(slot && *slot))
|
||||||
|
return 0;
|
||||||
|
strbuf_addstr(sb, *slot);
|
||||||
|
return 1;
|
||||||
case 'g': /* reflog info */
|
case 'g': /* reflog info */
|
||||||
switch(placeholder[1]) {
|
switch(placeholder[1]) {
|
||||||
case 'd': /* reflog selector */
|
case 'd': /* reflog selector */
|
||||||
@ -1498,6 +1507,9 @@ static size_t userformat_want_item(struct strbuf *sb, const char *placeholder,
|
|||||||
case 'N':
|
case 'N':
|
||||||
w->notes = 1;
|
w->notes = 1;
|
||||||
break;
|
break;
|
||||||
|
case 'S':
|
||||||
|
w->source = 1;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
1
pretty.h
1
pretty.h
@ -60,6 +60,7 @@ static inline int cmit_fmt_is_mail(enum cmit_fmt fmt)
|
|||||||
|
|
||||||
struct userformat_want {
|
struct userformat_want {
|
||||||
unsigned notes:1;
|
unsigned notes:1;
|
||||||
|
unsigned source:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Set the flag "w->notes" if there is placeholder %N in "fmt". */
|
/* Set the flag "w->notes" if there is placeholder %N in "fmt". */
|
||||||
|
@ -621,4 +621,54 @@ test_expect_success 'trailer parsing not fooled by --- line' '
|
|||||||
test_cmp expect actual
|
test_cmp expect actual
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'set up %S tests' '
|
||||||
|
git checkout --orphan source-a &&
|
||||||
|
test_commit one &&
|
||||||
|
test_commit two &&
|
||||||
|
git checkout -b source-b HEAD^ &&
|
||||||
|
test_commit three
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'log --format=%S paints branch names' '
|
||||||
|
cat >expect <<-\EOF &&
|
||||||
|
source-b
|
||||||
|
source-a
|
||||||
|
source-b
|
||||||
|
EOF
|
||||||
|
git log --format=%S source-a source-b >actual &&
|
||||||
|
test_cmp expect actual
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'log --format=%S paints tag names' '
|
||||||
|
git tag -m tagged source-tag &&
|
||||||
|
cat >expect <<-\EOF &&
|
||||||
|
source-tag
|
||||||
|
source-a
|
||||||
|
source-tag
|
||||||
|
EOF
|
||||||
|
git log --format=%S source-tag source-a >actual &&
|
||||||
|
test_cmp expect actual
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'log --format=%S paints symmetric ranges' '
|
||||||
|
cat >expect <<-\EOF &&
|
||||||
|
source-b
|
||||||
|
source-a
|
||||||
|
EOF
|
||||||
|
git log --format=%S source-a...source-b >actual &&
|
||||||
|
test_cmp expect actual
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success '%S in git log --format works with other placeholders (part 1)' '
|
||||||
|
git log --format="source-b %h" source-b >expect &&
|
||||||
|
git log --format="%S %h" source-b >actual &&
|
||||||
|
test_cmp expect actual
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success '%S in git log --format works with other placeholders (part 2)' '
|
||||||
|
git log --format="%h source-b" source-b >expect &&
|
||||||
|
git log --format="%h %S" source-b >actual &&
|
||||||
|
test_cmp expect actual
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
@ -185,6 +185,10 @@ test_expect_success 'basic colors' '
|
|||||||
test_cmp expect actual
|
test_cmp expect actual
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success '%S is not a placeholder for rev-list yet' '
|
||||||
|
git rev-list --format="%S" -1 master | grep "%S"
|
||||||
|
'
|
||||||
|
|
||||||
test_expect_success 'advanced colors' '
|
test_expect_success 'advanced colors' '
|
||||||
cat >expect <<-EOF &&
|
cat >expect <<-EOF &&
|
||||||
commit $head2
|
commit $head2
|
||||||
|
Loading…
Reference in New Issue
Block a user