The author.email, author.name, committer.email and committer.name settings are analogous to the GIT_AUTHOR_* and GIT_COMMITTER_* environment variables, but for the git config system. This allows them to be set separately for each repository. Signed-off-by: William Hubbs <williamh@xxxxxxxxxx> --- Documentation/config/user.txt | 20 +++++++++++ builtin/commit.c | 2 +- cache.h | 5 ++- config.c | 6 ++++ ident.c | 68 ++++++++++++++++++++++++++++++++--- log-tree.c | 3 +- sequencer.c | 3 +- 7 files changed, 97 insertions(+), 10 deletions(-) diff --git a/Documentation/config/user.txt b/Documentation/config/user.txt index b5b2ba1199..6ba7002252 100644 --- a/Documentation/config/user.txt +++ b/Documentation/config/user.txt @@ -1,3 +1,23 @@ +author.email:: +Your email address to be recorded on the author line of any newly +created commits. +If this is not set, we use user.email. + +author.name:: +Your full name to be recorded on the author line of any newly +created commits. +If this is not set, we use user.name. + +committer.email:: +Your email address to be recorded on the committer line of any newly +created commits. +If this is not set, we use user.email. + +committer.name:: +Your full name to be recorded on the committer line of any newly +created commits. +If this is not set, we use user.name. + user.email:: Your email address to be recorded in any newly created commits. Can be overridden by the `GIT_AUTHOR_EMAIL`, `GIT_COMMITTER_EMAIL`, and diff --git a/builtin/commit.c b/builtin/commit.c index c021b119bb..49a97adeb8 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -607,7 +607,7 @@ static void determine_author_info(struct strbuf *author_ident) set_ident_var(&date, strbuf_detach(&date_buf, NULL)); } - strbuf_addstr(author_ident, fmt_ident(name, email, date, IDENT_STRICT)); + strbuf_addstr(author_ident, fmt_ident(name, email, date, IDENT_STRICT|IDENT_AUTHOR)); assert_split_ident(&author, author_ident); export_one("GIT_AUTHOR_NAME", author.name_begin, author.name_end, 0); export_one("GIT_AUTHOR_EMAIL", author.mail_begin, author.mail_end, 0); diff --git a/cache.h b/cache.h index ca36b44ee0..0ee87f22a9 100644 --- a/cache.h +++ b/cache.h @@ -1479,10 +1479,13 @@ int date_overflows(timestamp_t date); #define IDENT_STRICT 1 #define IDENT_NO_DATE 2 #define IDENT_NO_NAME 4 +#define IDENT_AUTHOR 8 +#define IDENT_COMMITTER 16 + extern const char *git_author_info(int); extern const char *git_committer_info(int); extern const char *fmt_ident(const char *name, const char *email, const char *date_str, int); -extern const char *fmt_name(const char *name, const char *email); +extern const char *fmt_committer_name(void); extern const char *ident_default_name(void); extern const char *ident_default_email(void); extern const char *git_editor(void); diff --git a/config.c b/config.c index ff521eb27a..4bd5920dea 100644 --- a/config.c +++ b/config.c @@ -1484,6 +1484,12 @@ int git_default_config(const char *var, const char *value, void *cb) return 0; } + if (starts_with(var, "author.")) + return git_ident_config(var, value, cb); + + if (starts_with(var, "committer.")) + return git_ident_config(var, value, cb); + /* Add other config variables here and to Documentation/config.txt. */ return 0; } diff --git a/ident.c b/ident.c index 33bcf40644..3da96ebbef 100644 --- a/ident.c +++ b/ident.c @@ -11,6 +11,10 @@ static struct strbuf git_default_name = STRBUF_INIT; static struct strbuf git_default_email = STRBUF_INIT; static struct strbuf git_default_date = STRBUF_INIT; +static struct strbuf git_author_name = STRBUF_INIT; +static struct strbuf git_author_email = STRBUF_INIT; +static struct strbuf git_committer_name = STRBUF_INIT; +static struct strbuf git_committer_email = STRBUF_INIT; static int default_email_is_bogus; static int default_name_is_bogus; @@ -361,7 +365,15 @@ const char *fmt_ident(const char *name, const char *email, int strict = (flag & IDENT_STRICT); int want_date = !(flag & IDENT_NO_DATE); int want_name = !(flag & IDENT_NO_NAME); + int want_author = (flag & IDENT_AUTHOR); + int want_committer = (flag & IDENT_COMMITTER); + if (!email) { + if (want_author && git_author_email.len) + email = git_author_email.buf; + else if (want_committer && git_committer_email.len) + email = git_committer_email.buf; + } if (!email) { if (strict && ident_use_config_only && !(ident_config_given & IDENT_MAIL_GIVEN)) { @@ -377,6 +389,12 @@ const char *fmt_ident(const char *name, const char *email, if (want_name) { int using_default = 0; + if (!name) { + if (want_author && git_author_name.len) + name = git_author_name.buf; + else if (want_committer && git_committer_name.len) + name = git_committer_name.buf; + } if (!name) { if (strict && ident_use_config_only && !(ident_config_given & IDENT_NAME_GIVEN)) { @@ -425,9 +443,11 @@ const char *fmt_ident(const char *name, const char *email, return ident.buf; } -const char *fmt_name(const char *name, const char *email) +const char *fmt_committer_name(void) { - return fmt_ident(name, email, NULL, IDENT_STRICT | IDENT_NO_DATE); + char *name = getenv("GIT_COMMITTER_NAME"); + char *email = getenv("GIT_COMMITTER_EMAIL"); + return fmt_ident(name, email, NULL, IDENT_STRICT | IDENT_NO_DATE|IDENT_COMMITTER); } const char *git_author_info(int flag) @@ -439,7 +459,7 @@ const char *git_author_info(int flag) return fmt_ident(getenv("GIT_AUTHOR_NAME"), getenv("GIT_AUTHOR_EMAIL"), getenv("GIT_AUTHOR_DATE"), - flag); + flag|IDENT_AUTHOR); } const char *git_committer_info(int flag) @@ -451,7 +471,7 @@ const char *git_committer_info(int flag) return fmt_ident(getenv("GIT_COMMITTER_NAME"), getenv("GIT_COMMITTER_EMAIL"), getenv("GIT_COMMITTER_DATE"), - flag); + flag|IDENT_COMMITTER); } static int ident_is_sufficient(int user_ident_explicitly_given) @@ -480,6 +500,46 @@ int git_ident_config(const char *var, const char *value, void *data) return 0; } + if (!strcmp(var, "author.name")) { + if (!value) + return config_error_nonbool(var); + strbuf_reset(&git_author_name); + strbuf_addstr(&git_author_name, value); + author_ident_explicitly_given |= IDENT_NAME_GIVEN; + ident_config_given |= IDENT_NAME_GIVEN; + return 0; + } + + if (!strcmp(var, "author.email")) { + if (!value) + return config_error_nonbool(var); + strbuf_reset(&git_author_email); + strbuf_addstr(&git_author_email, value); + author_ident_explicitly_given |= IDENT_MAIL_GIVEN; + ident_config_given |= IDENT_MAIL_GIVEN; + return 0; + } + + if (!strcmp(var, "committer.name")) { + if (!value) + return config_error_nonbool(var); + strbuf_reset(&git_committer_name); + strbuf_addstr(&git_committer_name, value); + committer_ident_explicitly_given |= IDENT_NAME_GIVEN; + ident_config_given |= IDENT_NAME_GIVEN; + return 0; + } + + if (!strcmp(var, "committer.email")) { + if (!value) + return config_error_nonbool(var); + strbuf_reset(&git_committer_email); + strbuf_addstr(&git_committer_email, value); + committer_ident_explicitly_given |= IDENT_MAIL_GIVEN; + ident_config_given |= IDENT_MAIL_GIVEN; + return 0; + } + if (!strcmp(var, "user.name")) { if (!value) return config_error_nonbool(var); diff --git a/log-tree.c b/log-tree.c index 10680c139e..6760a2e9c4 100644 --- a/log-tree.c +++ b/log-tree.c @@ -687,8 +687,7 @@ void show_log(struct rev_info *opt) */ if (ctx.need_8bit_cte >= 0 && opt->add_signoff) ctx.need_8bit_cte = - has_non_ascii(fmt_name(getenv("GIT_COMMITTER_NAME"), - getenv("GIT_COMMITTER_EMAIL"))); + has_non_ascii(fmt_committer_name()); ctx.date_mode = opt->date_mode; ctx.date_mode_explicit = opt->date_mode_explicit; ctx.abbrev = opt->diffopt.abbrev; diff --git a/sequencer.c b/sequencer.c index e1a4dd15f1..f357defda5 100644 --- a/sequencer.c +++ b/sequencer.c @@ -4036,8 +4036,7 @@ void append_signoff(struct strbuf *msgbuf, size_t ignore_footer, unsigned flag) int has_footer; strbuf_addstr(&sob, sign_off_header); - strbuf_addstr(&sob, fmt_name(getenv("GIT_COMMITTER_NAME"), - getenv("GIT_COMMITTER_EMAIL"))); + strbuf_addstr(&sob, fmt_committer_name()); strbuf_addch(&sob, '\n'); if (!ignore_footer) -- 2.19.2