format-patch: use default email for generating message ids
[gitweb.git] / ident.c
diff --git a/ident.c b/ident.c
index 87c697c2b09692ec8a36d557aa0c73de38223492..acb3a0843f40a10a730a80e7fcbf896660184a42 100644 (file)
--- a/ident.c
+++ b/ident.c
@@ -7,7 +7,11 @@
  */
 #include "cache.h"
 
+#define MAX_GITNAME (1000)
+static char git_default_name[MAX_GITNAME];
+static char git_default_email[MAX_GITNAME];
 static char git_default_date[50];
+int user_ident_explicitly_given;
 
 #ifdef NO_GECOS_IN_PWENT
 #define get_gecos(ignored) "&"
@@ -70,6 +74,10 @@ static int add_mailname_host(char *buf, size_t len)
        }
        /* success! */
        fclose(mailname);
+
+       len = strlen(buf);
+       if (len && buf[len-1] == '\n')
+               buf[len-1] = '\0';
        return 0;
 }
 
@@ -117,21 +125,20 @@ static void copy_email(const struct passwd *pw)
                        sizeof(git_default_email) - len);
 }
 
-static void setup_ident(const char **name, const char **emailp)
+const char *ident_default_name(void)
 {
-       struct passwd *pw = NULL;
-
-       /* Get the name ("gecos") */
-       if (!*name && !git_default_name[0]) {
-               pw = getpwuid(getuid());
+       if (!git_default_name[0]) {
+               struct passwd *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;
+       return git_default_name;
+}
 
-       if (!*emailp && !git_default_email[0]) {
+const char *ident_default_email(void)
+{
+       if (!git_default_email[0]) {
                const char *email = getenv("EMAIL");
 
                if (email && email[0]) {
@@ -139,19 +146,20 @@ static void setup_ident(const char **name, const char **emailp)
                                sizeof(git_default_email));
                        user_ident_explicitly_given |= IDENT_MAIL_GIVEN;
                } else {
-                       if (!pw)
-                               pw = getpwuid(getuid());
+                       struct passwd *pw = getpwuid(getuid());
                        if (!pw)
                                die("You don't exist. Go away!");
                        copy_email(pw);
                }
        }
-       if (!*emailp)
-               *emailp = git_default_email;
+       return git_default_email;
+}
 
-       /* And set the default date */
+const char *ident_default_date(void)
+{
        if (!git_default_date[0])
                datestamp(git_default_date, sizeof(git_default_date));
+       return git_default_date;
 }
 
 static int add_raw(char *buf, size_t size, int offset, const char *str)
@@ -311,7 +319,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);
 
-       setup_ident(&name, &email);
+       if (!name)
+               name = ident_default_name();
+       if (!email)
+               email = ident_default_email();
 
        if (!*name) {
                struct passwd *pw;
@@ -331,7 +342,7 @@ const char *fmt_ident(const char *name, const char *email,
                name = git_default_name;
        }
 
-       strcpy(date, git_default_date);
+       strcpy(date, ident_default_date());
        if (!name_addr_only && date_str && date_str[0]) {
                if (parse_date(date_str, date, sizeof(date)) < 0)
                        die("invalid date format: %s", date_str);
@@ -385,3 +396,24 @@ int user_ident_sufficiently_given(void)
        return (user_ident_explicitly_given == IDENT_ALL_GIVEN);
 #endif
 }
+
+int git_ident_config(const char *var, const char *value, void *data)
+{
+       if (!strcmp(var, "user.name")) {
+               if (!value)
+                       return config_error_nonbool(var);
+               strlcpy(git_default_name, value, sizeof(git_default_name));
+               user_ident_explicitly_given |= IDENT_NAME_GIVEN;
+               return 0;
+       }
+
+       if (!strcmp(var, "user.email")) {
+               if (!value)
+                       return config_error_nonbool(var);
+               strlcpy(git_default_email, value, sizeof(git_default_email));
+               user_ident_explicitly_given |= IDENT_MAIL_GIVEN;
+               return 0;
+       }
+
+       return 0;
+}