Skip to content

Commit

Permalink
commit: pass author/committer info to hooks
Browse files Browse the repository at this point in the history
When lying the author name via GIT_AUTHOR_NAME environment variable
to "git commit", the hooks run by the command saw it and could act
on the name that will be recorded in the final commit. When the user
uses the "--author" option from the command line, the command should
give the same information to the hook, and back when "git command"
was a scripted Porcelain, it did set the environment variable and
hooks can learn the author name from it.

However, when the command was reimplemented in C, the rewritten code
was not very faithful to the original, and hooks stopped getting the
authorship information given with "--author".  Fix this by exporting
the necessary environment variables.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed Mar 11, 2012
1 parent 0486198 commit 7dfe8ad
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 4 deletions.
22 changes: 19 additions & 3 deletions builtin/commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -533,9 +533,20 @@ static int is_a_merge(const struct commit *current_head)

static const char sign_off_header[] = "Signed-off-by: ";

static void export_one(const char *var, const char *s, const char *e, int hack)
{
struct strbuf buf = STRBUF_INIT;
if (hack)
strbuf_addch(&buf, hack);
strbuf_addf(&buf, "%.*s", (int)(e - s), s);
setenv(var, buf.buf, 1);
strbuf_release(&buf);
}

static void determine_author_info(struct strbuf *author_ident)
{
char *name, *email, *date;
struct ident_split author;

name = getenv("GIT_AUTHOR_NAME");
email = getenv("GIT_AUTHOR_EMAIL");
Expand Down Expand Up @@ -585,6 +596,11 @@ static void determine_author_info(struct strbuf *author_ident)
date = force_date;
strbuf_addstr(author_ident, fmt_ident(name, email, date,
IDENT_ERROR_ON_NO_NAME));
if (!split_ident_line(&author, author_ident->buf, author_ident->len)) {
export_one("GIT_AUTHOR_NAME", author.name_begin, author.name_end, 0);
export_one("GIT_AUTHOR_EMAIL", author.mail_begin, author.mail_end, 0);
export_one("GIT_AUTHOR_DATE", author.date_begin, author.tz_end, '@');
}
}

static int ends_rfc2822_footer(struct strbuf *sb)
Expand Down Expand Up @@ -652,6 +668,9 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
int ident_shown = 0;
int clean_message_contents = (cleanup_mode != CLEANUP_NONE);

/* This checks and barfs if author is badly specified */
determine_author_info(author_ident);

if (!no_verify && run_hook(index_file, "pre-commit", NULL))
return 0;

Expand Down Expand Up @@ -771,9 +790,6 @@ static int prepare_to_commit(const char *index_file, const char *prefix,

strbuf_release(&sb);

/* This checks and barfs if author is badly specified */
determine_author_info(author_ident);

/* This checks if committer ident is explicitly given */
strbuf_addstr(&committer_ident, git_committer_info(0));
if (use_editor && include_status) {
Expand Down
2 changes: 1 addition & 1 deletion t/t7503-pre-commit-hook.sh
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ test_expect_success 'with failing hook requiring GIT_PREFIX' '
git checkout -- file
'

test_expect_failure 'check the author in hook' '
test_expect_success 'check the author in hook' '
write_script "$HOOK" <<-\EOF &&
test "$GIT_AUTHOR_NAME" = "New Author" &&
test "$GIT_AUTHOR_EMAIL" = "newauthor@example.com"
Expand Down

0 comments on commit 7dfe8ad

Please sign in to comment.