This change condenses the variables that tells where we got the user's ident into single enum, instead of a collection of booleans. In addtion, also have {committer,author}_ident_sufficiently_given directly probe the environment and the afformentioned enum instead of relying on git_{committer,author}_info to do so. Signed-off-by: Dan Aloni <alonid@xxxxxxxxx> Helped-by: Jeff King <peff@xxxxxxxx> Helped-by: Junio C Hamano <gitster@xxxxxxxxx> --- ident.c | 126 ++++++++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 80 insertions(+), 46 deletions(-) diff --git a/ident.c b/ident.c index 9bd6ac69bfe8..725d0aeb7da4 100644 --- a/ident.c +++ b/ident.c @@ -10,17 +10,19 @@ 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 int default_email_is_bogus; -static int default_name_is_bogus; + +enum ident_source { + IDENT_SOURCE_UNKNOWN = 0, + IDENT_SOURCE_CONFIG, + IDENT_SOURCE_ENVIRONMENT, + IDENT_SOURCE_GUESSED, + IDENT_SOURCE_GUESSED_BOGUS +}; static int ident_use_config_only; -#define IDENT_NAME_GIVEN 01 -#define IDENT_MAIL_GIVEN 02 -#define IDENT_ALL_GIVEN (IDENT_NAME_GIVEN|IDENT_MAIL_GIVEN) -static int committer_ident_explicitly_given; -static int author_ident_explicitly_given; -static int ident_config_given; +static enum ident_source source_of_default_email = IDENT_SOURCE_UNKNOWN; +static enum ident_source source_of_default_name = IDENT_SOURCE_UNKNOWN; #ifdef NO_GECOS_IN_PWENT #define get_gecos(ignored) "&" @@ -28,7 +30,7 @@ static int ident_config_given; #define get_gecos(struct_passwd) ((struct_passwd)->pw_gecos) #endif -static struct passwd *xgetpwuid_self(int *is_bogus) +static struct passwd *xgetpwuid_self(enum ident_source *source) { struct passwd *pw; @@ -41,9 +43,13 @@ static struct passwd *xgetpwuid_self(int *is_bogus) fallback.pw_gecos = "Unknown"; #endif pw = &fallback; - if (is_bogus) - *is_bogus = 1; + if (source) + *source = IDENT_SOURCE_GUESSED_BOGUS; + } else { + if (source) + *source = IDENT_SOURCE_GUESSED; } + return pw; } @@ -120,26 +126,26 @@ static int canonical_name(const char *host, struct strbuf *out) return status; } -static void add_domainname(struct strbuf *out, int *is_bogus) +static void add_domainname(struct strbuf *out, enum ident_source *source) { char buf[1024]; if (gethostname(buf, sizeof(buf))) { warning("cannot get host name: %s", strerror(errno)); strbuf_addstr(out, "(none)"); - *is_bogus = 1; + *source = IDENT_SOURCE_GUESSED_BOGUS; return; } if (strchr(buf, '.')) strbuf_addstr(out, buf); else if (canonical_name(buf, out) < 0) { strbuf_addf(out, "%s.(none)", buf); - *is_bogus = 1; + *source = IDENT_SOURCE_GUESSED_BOGUS; } } static void copy_email(const struct passwd *pw, struct strbuf *email, - int *is_bogus) + enum ident_source *source) { /* * Make up a fake email address @@ -150,13 +156,13 @@ static void copy_email(const struct passwd *pw, struct strbuf *email, if (!add_mailname_host(email)) return; /* read from "/etc/mailname" (Debian) */ - add_domainname(email, is_bogus); + add_domainname(email, source); } const char *ident_default_name(void) { if (!git_default_name.len) { - copy_gecos(xgetpwuid_self(&default_name_is_bogus), &git_default_name); + copy_gecos(xgetpwuid_self(&source_of_default_name), &git_default_name); strbuf_trim(&git_default_name); } return git_default_name.buf; @@ -169,11 +175,12 @@ const char *ident_default_email(void) if (email && email[0]) { strbuf_addstr(&git_default_email, email); - committer_ident_explicitly_given |= IDENT_MAIL_GIVEN; - author_ident_explicitly_given |= IDENT_MAIL_GIVEN; - } else - copy_email(xgetpwuid_self(&default_email_is_bogus), - &git_default_email, &default_email_is_bogus); + source_of_default_email = IDENT_SOURCE_ENVIRONMENT; + } else { + copy_email(xgetpwuid_self(&source_of_default_email), + &git_default_email, &source_of_default_email); + } + strbuf_trim(&git_default_email); } return git_default_email.buf; @@ -353,12 +360,13 @@ const char *fmt_ident(const char *name, const char *email, if (!name) { name = ident_default_name(); using_default = 1; - if (strict && default_name_is_bogus) { + if (strict && + source_of_default_name == IDENT_SOURCE_GUESSED_BOGUS) { fputs(env_hint, stderr); die("unable to auto-detect name (got '%s')", name); } if (strict && ident_use_config_only && - !(ident_config_given & IDENT_NAME_GIVEN)) + source_of_default_name != IDENT_SOURCE_CONFIG) die("user.useConfigOnly set but no name given"); } if (!*name) { @@ -375,12 +383,12 @@ const char *fmt_ident(const char *name, const char *email, if (!email) { email = ident_default_email(); - if (strict && default_email_is_bogus) { + if (strict && source_of_default_email == IDENT_SOURCE_GUESSED_BOGUS) { fputs(env_hint, stderr); die("unable to auto-detect email address (got '%s')", email); } - if (strict && ident_use_config_only - && !(ident_config_given & IDENT_MAIL_GIVEN)) + if (strict && ident_use_config_only && + source_of_default_email != IDENT_SOURCE_CONFIG) die("user.useConfigOnly set but no mail given"); } @@ -412,10 +420,6 @@ const char *fmt_name(const char *name, const char *email) const char *git_author_info(int flag) { - if (getenv("GIT_AUTHOR_NAME")) - author_ident_explicitly_given |= IDENT_NAME_GIVEN; - if (getenv("GIT_AUTHOR_EMAIL")) - author_ident_explicitly_given |= IDENT_MAIL_GIVEN; return fmt_ident(getenv("GIT_AUTHOR_NAME"), getenv("GIT_AUTHOR_EMAIL"), getenv("GIT_AUTHOR_DATE"), @@ -424,33 +428,67 @@ const char *git_author_info(int flag) const char *git_committer_info(int flag) { - if (getenv("GIT_COMMITTER_NAME")) - committer_ident_explicitly_given |= IDENT_NAME_GIVEN; - if (getenv("GIT_COMMITTER_EMAIL")) - committer_ident_explicitly_given |= IDENT_MAIL_GIVEN; return fmt_ident(getenv("GIT_COMMITTER_NAME"), getenv("GIT_COMMITTER_EMAIL"), getenv("GIT_COMMITTER_DATE"), flag); } -static int ident_is_sufficient(int user_ident_explicitly_given) +enum ident_person { + IDENT_PERSON_COMMITTER, + IDENT_PERSON_AUTHOR, +}; + +static int ident_source_is_sufficient(enum ident_source source) +{ + switch (source) { + case IDENT_SOURCE_CONFIG: + case IDENT_SOURCE_ENVIRONMENT: + return 1; + default: + break; + } + + return 0; +} + +static int ident_is_sufficient(enum ident_person person) { + const char *str_name, *str_email; + int name, email; + + switch (person) { + case IDENT_PERSON_COMMITTER: + str_name = getenv("GIT_COMMITTER_NAME"); + str_email = getenv("GIT_COMMITTER_EMAIL"); + break; + case IDENT_PERSON_AUTHOR: + str_name = getenv("GIT_AUTHOR_NAME"); + str_email = getenv("GIT_AUTHOR_EMAIL"); + break; + default: + die("invalid parameter to ident_is_sufficient()"); + } + + name = !!str_name || ident_source_is_sufficient(source_of_default_name); + email = !!str_email || ident_source_is_sufficient(source_of_default_email); + #ifndef WINDOWS - return (user_ident_explicitly_given & IDENT_MAIL_GIVEN); + (void)name; + return email; #else - return (user_ident_explicitly_given == IDENT_ALL_GIVEN); + return name && email; #endif } int committer_ident_sufficiently_given(void) { - return ident_is_sufficient(committer_ident_explicitly_given); + return ident_is_sufficient(IDENT_PERSON_COMMITTER); } int author_ident_sufficiently_given(void) { - return ident_is_sufficient(author_ident_explicitly_given); + return ident_is_sufficient(IDENT_PERSON_AUTHOR); } int git_ident_config(const char *var, const char *value, void *data) @@ -465,9 +503,7 @@ int git_ident_config(const char *var, const char *value, void *data) return config_error_nonbool(var); strbuf_reset(&git_default_name); strbuf_addstr(&git_default_name, value); - committer_ident_explicitly_given |= IDENT_NAME_GIVEN; - author_ident_explicitly_given |= IDENT_NAME_GIVEN; - ident_config_given |= IDENT_NAME_GIVEN; + source_of_default_name = IDENT_SOURCE_CONFIG; return 0; } @@ -476,9 +512,7 @@ int git_ident_config(const char *var, const char *value, void *data) return config_error_nonbool(var); strbuf_reset(&git_default_email); strbuf_addstr(&git_default_email, value); - committer_ident_explicitly_given |= IDENT_MAIL_GIVEN; - author_ident_explicitly_given |= IDENT_MAIL_GIVEN; - ident_config_given |= IDENT_MAIL_GIVEN; + source_of_default_email = IDENT_SOURCE_CONFIG; return 0; } -- 2.5.0 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html