Skip to content

Commit

Permalink
pretty: Initialize notes if %N is used
Browse files Browse the repository at this point in the history
When using git log --pretty='%N' without an explicit --show-notes, git
would segfault. This patches fixes this behaviour by loading the needed
notes datastructures if --pretty is used and the format contains %N.
When --pretty='%N' is used together with --no-notes, %N won't be
expanded.

This is an extension to a proposed patch by Jeff King.

Signed-off-by: Johannes Gilger <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
heipei authored and gitster committed Apr 14, 2010
1 parent b9aa901 commit 5b16360
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 5 deletions.
6 changes: 5 additions & 1 deletion builtin/log.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ static void cmd_log_init(int argc, const char **argv, const char *prefix,
{
int i;
int decoration_style = 0;
struct userformat_want w;

rev->abbrev = DEFAULT_ABBREV;
rev->commit_format = CMIT_FMT_DEFAULT;
Expand All @@ -58,7 +59,10 @@ static void cmd_log_init(int argc, const char **argv, const char *prefix,
usage(builtin_log_usage);
argc = setup_revisions(argc, argv, rev, opt);

if (!rev->show_notes_given && !rev->pretty_given)
memset(&w, 0, sizeof(w));
userformat_find_requirements(NULL, &w);

if (!rev->show_notes_given && (!rev->pretty_given || w.notes))
rev->show_notes = 1;
if (rev->show_notes)
init_display_notes(&rev->notes_opt);
Expand Down
5 changes: 5 additions & 0 deletions commit.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,11 +74,16 @@ struct pretty_print_context
struct reflog_walk_info *reflog_info;
};

struct userformat_want {
unsigned notes:1;
};

extern int has_non_ascii(const char *text);
struct rev_info; /* in revision.h, it circularly uses enum cmit_fmt */
extern char *reencode_commit_message(const struct commit *commit,
const char **encoding_p);
extern void get_commit_format(const char *arg, struct rev_info *);
extern void userformat_find_requirements(const char *fmt, struct userformat_want *w);
extern void format_commit_message(const struct commit *commit,
const char *format, struct strbuf *sb,
const struct pretty_print_context *context);
Expand Down
40 changes: 36 additions & 4 deletions pretty.c
Original file line number Diff line number Diff line change
Expand Up @@ -775,10 +775,13 @@ static size_t format_commit_one(struct strbuf *sb, const char *placeholder,
}
return 0; /* unknown %g placeholder */
case 'N':
format_display_notes(commit->object.sha1, sb,
git_log_output_encoding ? git_log_output_encoding
: git_commit_encoding, 0);
return 1;
if (c->pretty_ctx->show_notes) {
format_display_notes(commit->object.sha1, sb,
git_log_output_encoding ? git_log_output_encoding
: git_commit_encoding, 0);
return 1;
}
return 0;
}

/* For the rest we have to parse the commit header. */
Expand Down Expand Up @@ -855,6 +858,35 @@ static size_t format_commit_item(struct strbuf *sb, const char *placeholder,
return consumed + 1;
}

static size_t userformat_want_item(struct strbuf *sb, const char *placeholder,
void *context)
{
struct userformat_want *w = context;

if (*placeholder == '+' || *placeholder == '-')
placeholder++;

switch (*placeholder) {
case 'N':
w->notes = 1;
break;
}
return 0;
}

void userformat_find_requirements(const char *fmt, struct userformat_want *w)
{
struct strbuf dummy = STRBUF_INIT;

if (!fmt) {
if (!user_format)
return;
fmt = user_format;
}
strbuf_expand(&dummy, user_format, userformat_want_item, w);
strbuf_release(&dummy);
}

void format_commit_message(const struct commit *commit,
const char *format, struct strbuf *sb,
const struct pretty_print_context *pretty_ctx)
Expand Down

0 comments on commit 5b16360

Please sign in to comment.