Skip to content

Commit

Permalink
git commit --author=$name: look $name up in existing commits
Browse files Browse the repository at this point in the history
This allows "git commit --author=$name" to accept a name that is not in
the required "A U Thor <author@example.xz>" format, and use that to look
up an author name that matches from existing commits.

When using this feature, it is the user's responsibility to give a name
that uniquely matches the name s/he wants, as the logic returns the name
from the first matching commit.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed Aug 31, 2008
1 parent 53d1589 commit 146ea06
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 2 deletions.
6 changes: 4 additions & 2 deletions Documentation/git-commit.txt
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,10 @@ OPTIONS
read the message from the standard input.

--author=<author>::
Override the author name used in the commit. Use
`A U Thor <author@example.com>` format.
Override the author name used in the commit. You can use the
standard `A U Thor <author@example.com>` format. Otherwise,
an existing commit that matches the given string and its author
name is used.

-m <msg>::
--message=<msg>::
Expand Down
28 changes: 28 additions & 0 deletions builtin-commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -710,6 +710,31 @@ static int message_is_empty(struct strbuf *sb, int start)
return 1;
}

static const char *find_author_by_nickname(const char *name)
{
struct rev_info revs;
struct commit *commit;
struct strbuf buf = STRBUF_INIT;
const char *av[20];
int ac = 0;

init_revisions(&revs, NULL);
strbuf_addf(&buf, "--author=%s", name);
av[++ac] = "--all";
av[++ac] = "-i";
av[++ac] = buf.buf;
av[++ac] = NULL;
setup_revisions(ac, av, &revs, NULL);
prepare_revision_walk(&revs);
commit = get_revision(&revs);
if (commit) {
strbuf_release(&buf);
format_commit_message(commit, "%an <%ae>", &buf, DATE_NORMAL);
return strbuf_detach(&buf, NULL);
}
die("No existing author found with '%s'", name);
}

static int parse_and_validate_options(int argc, const char *argv[],
const char * const usage[],
const char *prefix)
Expand All @@ -720,6 +745,9 @@ static int parse_and_validate_options(int argc, const char *argv[],
logfile = parse_options_fix_filename(prefix, logfile);
template_file = parse_options_fix_filename(prefix, template_file);

if (force_author && !strchr(force_author, '>'))
force_author = find_author_by_nickname(force_author);

if (logfile || message.len || use_message)
use_editor = 0;
if (edit_flag)
Expand Down

0 comments on commit 146ea06

Please sign in to comment.