ident: keep a flag for bogus default_email
If we have to deduce the user's email address and can't come up with something plausible for the hostname, we simply write "(none)" or ".(none)" in the hostname. Later, our strict-check is forced to use strstr to look for this magic string. This is probably not a problem in practice, but it's rather ugly. Let's keep an extra flag that tells us the email is bogus, and check that instead. We could get away with simply setting the global in add_domainname(); it only gets called to write into git_default_email. However, let's make the code a little more obvious to future readers by actually passing a pointer to our "bogus" flag down the call-chain. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff King committed
Dec 10, 2015 at 16:35 UTC
19ce497cf594a3c01af33a65b27b19e7459212d6
1 file changed
+12
-7
ident.c
+12
-7
@@ -10,6 +10,7 @@
10
static struct strbuf git_default_name = STRBUF_INIT;
11
static struct strbuf git_default_email = STRBUF_INIT;
12
static struct strbuf git_default_date = STRBUF_INIT;
13
+static int default_email_is_bogus;
14
15
#define IDENT_NAME_GIVEN 01
16
#define IDENT_MAIL_GIVEN 02
@@ -82,7 +83,7 @@ static int add_mailname_host(struct strbuf *buf)
83
return 0;
84
}
85
85
-static void add_domainname(struct strbuf *out)
86
+static void add_domainname(struct strbuf *out, int *is_bogus)
87
{
88
char buf[1024];
89
struct hostent *he;
@@ -90,17 +91,21 @@ static void add_domainname(struct strbuf *out)
91
if (gethostname(buf, sizeof(buf))) {
92
warning("cannot get host name: %s", strerror(errno));
93
strbuf_addstr(out, "(none)");
94
+ *is_bogus = 1;
95
return;
96
}
97
if (strchr(buf, '.'))
98
strbuf_addstr(out, buf);
99
else if ((he = gethostbyname(buf)) && strchr(he->h_name, '.'))
100
strbuf_addstr(out, he->h_name);
99
- else
101
+ else {
102
strbuf_addf(out, "%s.(none)", buf);
103
+ *is_bogus = 1;
104
+ }
105
}
106
103
-static void copy_email(const struct passwd *pw, struct strbuf *email)
107
+static void copy_email(const struct passwd *pw, struct strbuf *email,
108
+ int *is_bogus)
109
{
110
/*
111
* Make up a fake email address
@@ -111,7 +116,7 @@ static void copy_email(const struct passwd *pw, struct strbuf *email)
116
117
if (!add_mailname_host(email))
118
return; /* read from "/etc/mailname" (Debian) */
114
- add_domainname(email);
119
+ add_domainname(email, is_bogus);
120
}
121
122
const char *ident_default_name(void)
@@ -133,7 +138,8 @@ const char *ident_default_email(void)
138
committer_ident_explicitly_given |= IDENT_MAIL_GIVEN;
139
author_ident_explicitly_given |= IDENT_MAIL_GIVEN;
140
} else
136
- copy_email(xgetpwuid_self(), &git_default_email);
141
+ copy_email(xgetpwuid_self(), &git_default_email,
142
+ &default_email_is_bogus);
143
strbuf_trim(&git_default_email);
144
}
145
return git_default_email.buf;
@@ -325,8 +331,7 @@ const char *fmt_ident(const char *name, const char *email,
331
name = pw->pw_name;
332
}
333
328
- if (strict && email == git_default_email.buf &&
329
- strstr(email, "(none)")) {
334
+ if (strict && email == git_default_email.buf && default_email_is_bogus) {
335
fputs(env_hint, stderr);
336
die("unable to auto-detect email address (got '%s')", email);
337
}