git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH/RFC jn/ident-from-etc-mailname] ident: do not retrieve default ident when unnecessary

From
Jonathan Nieder <jrnieder@gmail.com>
Date
Oct 6, 2011, 17:17 UTC
Message-ID
<20111006171719.GB6946@elie>
In-Reply-To
<7vty7pga7y.fsf@alter.siamese.dyndns.org>

Avoid a getpwuid() call (which contacts the network if the password database is not local), read of /etc/mailname, gethostname() call, and reverse DNS lookup if the user has already chosen a name and email through configuration, the environment, or the command line.

This should slightly speed up commands like "git commit". More importantly, it improves error reporting when computation of the default ident string does not go smoothly. For example, after detecting a problem (e.g., "warning: cannot open /etc/mailname: Permission denied") in retrieving the default committer identity:

	touch /etc/mailname;	# as root
	chmod -r /etc/mailname;	# as root
	git commit -m 'test commit'

you can squelch the warning while waiting for your sysadmin to fix the permissions problem.

	echo '[user] email = me@example.com' >>~/.gitconfig
Inspired-by: Johannes Sixt <j6t@kdgb.org>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
Junio C Hamano wrote:
Show 10 quoted lines
> --- a/ident.c
> +++ b/ident.c
> @@ -239,6 +239,10 @@ const char *fmt_ident(const char *name, const char *email,
>  	int warn_on_no_name = (flag & IDENT_WARN_ON_NO_NAME);
>  	int name_addr_only = (flag & IDENT_NO_DATE);
>  
> +	if (name && !git_default_name[0])
> +		strcpy(git_default_name, name);
> +	if (email && !git_default_email[0])
> +		strcpy(git_default_email, email);

That poisons the "git_default_foo" variables for the next fmt_ident call. But something similar should work.

 ident.c |   16 ++++++++--------
 1 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/ident.c b/ident.c
index edb43144..f619619b 100644
--- a/ident.c
+++ b/ident.c
@@ -117,19 +117,21 @@ static void copy_email(const struct passwd *pw)
 			sizeof(git_default_email) - len);
 }
 
-static void setup_ident(void)
+static void setup_ident(const char **name, const char **emailp)
 {
 	struct passwd *pw = NULL;
 
 	/* Get the name ("gecos") */
-	if (!git_default_name[0]) {
+	if (!*name && !git_default_name[0]) {
 		pw = getpwuid(getuid());
 		if (!pw)
 			die("You don't exist. Go away!");
 		copy_gecos(pw, git_default_name, sizeof(git_default_name));
 	}
+	if (!*name)
+		*name = git_default_name;
 
-	if (!git_default_email[0]) {
+	if (!*emailp && !git_default_email[0]) {
 		const char *email = getenv("EMAIL");
 
 		if (email && email[0]) {
@@ -144,6 +146,8 @@ static void setup_ident(void)
 			copy_email(pw);
 		}
 	}
+	if (!*emailp)
+		*emailp = git_default_email;
 
 	/* And set the default date */
 	if (!git_default_date[0])
@@ -239,11 +243,7 @@ const char *fmt_ident(const char *name, const char *email,
 	int warn_on_no_name = (flag & IDENT_WARN_ON_NO_NAME);
 	int name_addr_only = (flag & IDENT_NO_DATE);
 
-	setup_ident();
-	if (!name)
-		name = git_default_name;
-	if (!email)
-		email = git_default_email;
+	setup_ident(&name, &email);
 
 	if (!*name) {
 		struct passwd *pw;
-- 
1.7.7.rc1
Previous: Junio C HamanoNext: Junio C Hamano
Message 7 of 11 in “ident: check /etc/mailname if email is unknown”
  1. ident: check /etc/mailname if email is unknownJonathan Nieder, Oct 3, 2011
  2. Junio C HamanoOct 3, 2011
  3. ident: check /etc/mailname if email is unknownJonathan Nieder, Oct 3, 2011
  4. Johannes SixtOct 3, 2011
  5. Jonathan NiederOct 3, 2011
  6. Junio C HamanoOct 3, 2011
  7. ident: do not retrieve default ident when unnecessaryJonathan Nieder, Oct 6, 2011
  8. Junio C HamanoOct 6, 2011
  9. Jonathan NiederOct 6, 2011
  10. Ian JacksonOct 3, 2011
  11. Junio C HamanoOct 3, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.