Skip to content

Commit

Permalink
pretty: give placeholders to reflog identity
Browse files Browse the repository at this point in the history
When doing a reflog walk, you can get some information about
the reflog (such as the subject line), but not the identity
information (i.e., name and email).

Let's make those available, mimicing the options for author
and committer identity.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jeff King authored and Junio C Hamano committed Dec 16, 2011
1 parent 7b6c583 commit cd1957f
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 0 deletions.
4 changes: 4 additions & 0 deletions Documentation/pretty-formats.txt
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,10 @@ The placeholders are:
- '%N': commit notes
- '%gD': reflog selector, e.g., `refs/stash@\{1\}`
- '%gd': shortened reflog selector, e.g., `stash@\{1\}`
- '%gn': reflog identity name
- '%gN': reflog identity name (respecting .mailmap, see linkgit:git-shortlog[1] or linkgit:git-blame[1])
- '%ge': reflog identity email
- '%gE': reflog identity email (respecting .mailmap, see linkgit:git-shortlog[1] or linkgit:git-blame[1])
- '%gs': reflog subject
- '%Cred': switch color to red
- '%Cgreen': switch color to green
Expand Down
25 changes: 25 additions & 0 deletions pretty.c
Original file line number Diff line number Diff line change
Expand Up @@ -822,6 +822,23 @@ static void rewrap_message_tail(struct strbuf *sb,
c->indent2 = new_indent2;
}

static int format_reflog_person(struct strbuf *sb,
char part,
struct reflog_walk_info *log,
enum date_mode dmode)
{
const char *ident;

if (!log)
return 2;

ident = get_reflog_ident(log);
if (!ident)
return 2;

return format_person_part(sb, part, ident, strlen(ident), dmode);
}

static size_t format_commit_one(struct strbuf *sb, const char *placeholder,
void *context)
{
Expand Down Expand Up @@ -963,6 +980,14 @@ static size_t format_commit_one(struct strbuf *sb, const char *placeholder,
if (c->pretty_ctx->reflog_info)
get_reflog_message(sb, c->pretty_ctx->reflog_info);
return 2;
case 'n':
case 'N':
case 'e':
case 'E':
return format_reflog_person(sb,
placeholder[1],
c->pretty_ctx->reflog_info,
c->pretty_ctx->date_mode);
}
return 0; /* unknown %g placeholder */
case 'N':
Expand Down
12 changes: 12 additions & 0 deletions reflog-walk.c
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,18 @@ void get_reflog_message(struct strbuf *sb,
strbuf_add(sb, info->message, len);
}

const char *get_reflog_ident(struct reflog_walk_info *reflog_info)
{
struct commit_reflog *commit_reflog = reflog_info->last_commit_reflog;
struct reflog_info *info;

if (!commit_reflog)
return NULL;

info = &commit_reflog->reflogs->items[commit_reflog->recno+1];
return info->email;
}

void show_reflog_message(struct reflog_walk_info *reflog_info, int oneline,
enum date_mode dmode)
{
Expand Down
1 change: 1 addition & 0 deletions reflog-walk.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ extern void show_reflog_message(struct reflog_walk_info *info, int,
enum date_mode);
extern void get_reflog_message(struct strbuf *sb,
struct reflog_walk_info *reflog_info);
extern const char *get_reflog_ident(struct reflog_walk_info *reflog_info);
extern void get_reflog_selector(struct strbuf *sb,
struct reflog_walk_info *reflog_info,
enum date_mode dmode,
Expand Down
6 changes: 6 additions & 0 deletions t/t6006-rev-list-format.sh
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,12 @@ test_expect_success '%gd shortens ref name' '
test_cmp expect.gd-short actual.gd-short
'

test_expect_success 'reflog identity' '
echo "C O Mitter:committer@example.com" >expect &&
git log -g -1 --format="%gn:%ge" >actual &&
test_cmp expect actual
'

test_expect_success 'oneline with empty message' '
git commit -m "dummy" --allow-empty &&
git commit -m "dummy" --allow-empty &&
Expand Down

0 comments on commit cd1957f

Please sign in to comment.