From: Dan Aloni <alonid@gmail.com>
To: git@vger.kernel.org
Cc: Junio C Hamano <gitster@pobox.com>
Subject: [PATCH v6 3/3] ident: cleanup wrt ident's source
Date: Fri, 5 Feb 2016 09:42:28 +0200 [thread overview]
Message-ID: <1454658148-3031-4-git-send-email-alonid@gmail.com> (raw)
In-Reply-To: <1454658148-3031-1-git-send-email-alonid@gmail.com>
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@gmail.com>
Helped-by: Jeff King <peff@peff.net>
Helped-by: Junio C Hamano <gitster@pobox.com>
---
ident.c | 126 ++++++++++++++++++++++++++++++++++++++++------------------------
1 file changed, 80 insertions(+), 46 deletions(-)
diff --git a/ident.c b/ident.c
index 9bd6ac69bfe8..9bb05912b59a 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
next prev parent reply other threads:[~2016-02-05 7:43 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-02-05 7:42 [PATCH v6] ident: add user.useConfigOnly boolean for when ident shouldn't be guessed Dan Aloni
2016-02-05 7:42 ` [PATCH v6 1/3] fmt_ident: refactor strictness checks Dan Aloni
2016-02-05 7:42 ` [PATCH v6 2/3] ident: add user.useConfigOnly boolean for when ident shouldn't be guessed Dan Aloni
2016-02-05 19:18 ` Jeff King
2016-02-05 19:30 ` Eric Sunshine
2016-02-05 19:31 ` Junio C Hamano
2016-02-05 21:14 ` Dan Aloni
2016-02-05 7:42 ` Dan Aloni [this message]
2016-02-05 19:05 ` [PATCH v6 3/3] ident: cleanup wrt ident's source Junio C Hamano
2016-02-05 19:24 ` Jeff King
2016-02-05 21:03 ` Dan Aloni
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1454658148-3031-4-git-send-email-alonid@gmail.com \
--to=alonid@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).