ident.c: check explicit identity for name and email separately
authorJunio C Hamano <gitster@pobox.com>
Fri, 8 Jan 2010 15:39:11 +0000 (07:39 -0800)
committerJunio C Hamano <gitster@pobox.com>
Sun, 10 Jan 2010 17:42:54 +0000 (09:42 -0800)
bb1ae3f (commit: Show committer if automatic, 2008-05-04) added a logic to
check both name and email were given explicitly by the end user, but it
assumed that fmt_ident() is never called before git_default_user_config()
is called, which was fragile.  The former calls setup_ident() and fills
the "default" name and email, so the check in the config parser would have
mistakenly said both are given even if only user.name was provided.

Make the logic more robust by keeping track of name and email separately.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Acked-by: Santi Béjar <santi@agolina.net>
builtin-commit.c
cache.h
config.c
ident.c

index 073fe90ba1e04c3845fe49521db39b28339acb43..f4974b5542e9adcc1b2dd24f9692a20a690d5977 100644 (file)
@@ -624,7 +624,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
                                author_ident);
                free(author_ident);
 
-               if (!user_ident_explicitly_given)
+               if (user_ident_explicitly_given != IDENT_ALL_GIVEN)
                        fprintf(fp,
                                "%s"
                                "# Committer: %s\n",
diff --git a/cache.h b/cache.h
index bf468e52352c193b355222b718d9f5125c26052c..16c8e8df418dc6d7f7abcaf115bcc584ad06fb45 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -925,6 +925,9 @@ extern const char *config_exclusive_filename;
 #define MAX_GITNAME (1000)
 extern char git_default_email[MAX_GITNAME];
 extern char git_default_name[MAX_GITNAME];
+#define IDENT_NAME_GIVEN 01
+#define IDENT_MAIL_GIVEN 02
+#define IDENT_ALL_GIVEN (IDENT_NAME_GIVEN|IDENT_MAIL_GIVEN)
 extern int user_ident_explicitly_given;
 
 extern const char *git_commit_encoding;
index 37385ce9d338ecbd2556cef9455000784ebab7e5..fa1a0c02998feed88bad3c2358f54a14c765ce0c 100644 (file)
--- a/config.c
+++ b/config.c
@@ -528,8 +528,7 @@ static int git_default_user_config(const char *var, const char *value)
                if (!value)
                        return config_error_nonbool(var);
                strlcpy(git_default_name, value, sizeof(git_default_name));
-               if (git_default_email[0])
-                       user_ident_explicitly_given = 1;
+               user_ident_explicitly_given |= IDENT_NAME_GIVEN;
                return 0;
        }
 
@@ -537,8 +536,7 @@ static int git_default_user_config(const char *var, const char *value)
                if (!value)
                        return config_error_nonbool(var);
                strlcpy(git_default_email, value, sizeof(git_default_email));
-               if (git_default_name[0])
-                       user_ident_explicitly_given = 1;
+               user_ident_explicitly_given |= IDENT_MAIL_GIVEN;
                return 0;
        }
 
diff --git a/ident.c b/ident.c
index e6c1798d9814d3a4d9d58a5097523f4b0dd16258..e67c5ad1e8800250f17793bc826d608429d08ae3 100644 (file)
--- a/ident.c
+++ b/ident.c
@@ -249,9 +249,10 @@ const char *git_author_info(int flag)
 
 const char *git_committer_info(int flag)
 {
-       if (getenv("GIT_COMMITTER_NAME") &&
-           getenv("GIT_COMMITTER_EMAIL"))
-               user_ident_explicitly_given = 1;
+       if (getenv("GIT_COMMITTER_NAME"))
+               user_ident_explicitly_given |= IDENT_NAME_GIVEN;
+       if (getenv("GIT_COMMITTER_EMAIL"))
+               user_ident_explicitly_given |= IDENT_MAIL_GIVEN;
        return fmt_ident(getenv("GIT_COMMITTER_NAME"),
                         getenv("GIT_COMMITTER_EMAIL"),
                         getenv("GIT_COMMITTER_DATE"),