Code

xdl_merge(): fix a segmentation fault when refining conflicts
[git.git] / ident.c
diff --git a/ident.c b/ident.c
index 09d4d716cec39810bba412f32ddabaae69b9042d..6ad8fedd60ba1461d77dc2b1d66e52cf56158c6f 100644 (file)
--- a/ident.c
+++ b/ident.c
@@ -7,9 +7,6 @@
  */
 #include "cache.h"
 
-#include <pwd.h>
-#include <netdb.h>
-
 static char git_default_date[50];
 
 static void copy_gecos(struct passwd *w, char *name, int sz)
@@ -46,15 +43,6 @@ static void copy_gecos(struct passwd *w, char *name, int sz)
 
 }
 
-static const char au_env[] = "GIT_AUTHOR_NAME";
-static const char co_env[] = "GIT_COMMITTER_NAME";
-static const char env_hint[] =
-"\n*** Environment problem:\n"
-"*** Your name cannot be determined from your system services (gecos).\n"
-"*** You would need to set %s and %s\n"
-"*** environment variables; otherwise you won't be able to perform\n"
-"*** certain operations because of \"empty ident\" errors.\n\n";
-
 int setup_ident(void)
 {
        int len;
@@ -66,11 +54,6 @@ int setup_ident(void)
        /* Get the name ("gecos") */
        copy_gecos(pw, git_default_name, sizeof(git_default_name));
 
-       if (!*git_default_name) {
-               if (!getenv(au_env) || !getenv(co_env))
-                       fprintf(stderr, env_hint, au_env, co_env);
-       }
-
        /* Make up a fake email address (name + '@' + hostname [+ '.' + domainname]) */
        len = strlen(pw->pw_name);
        if (len > sizeof(git_default_email)/2)
@@ -85,10 +68,9 @@ int setup_ident(void)
                len = strlen(git_default_email);
                git_default_email[len++] = '.';
                if (he && (domainname = strchr(he->h_name, '.')))
-                       strncpy(git_default_email + len, domainname + 1, sizeof(git_default_email) - len);
+                       strlcpy(git_default_email + len, domainname + 1, sizeof(git_default_email) - len);
                else
-                       strncpy(git_default_email + len, "(none)", sizeof(git_default_email) - len);
-               git_default_email[sizeof(git_default_email) - 1] = 0;
+                       strlcpy(git_default_email + len, "(none)", sizeof(git_default_email) - len);
        }
        /* And set the default date */
        datestamp(git_default_date, sizeof(git_default_date));
@@ -170,8 +152,23 @@ static int copy(char *buf, int size, int offset, const char *src)
        return offset;
 }
 
+static const char au_env[] = "GIT_AUTHOR_NAME";
+static const char co_env[] = "GIT_COMMITTER_NAME";
+static const char *env_hint =
+"\n"
+"*** Your name cannot be determined from your system services (gecos).\n"
+"\n"
+"Run\n"
+"\n"
+"  git repo-config user.email \"you@email.com\"\n"
+"  git repo-config user.name \"Your Name\"\n"
+"\n"
+"To set the identity in this repository.\n"
+"Add --global to set your account\'s default\n"
+"\n";
+
 static const char *get_ident(const char *name, const char *email,
-                            const char *date_str)
+                            const char *date_str, int error_on_no_name)
 {
        static char buffer[1000];
        char date[50];
@@ -182,9 +179,14 @@ static const char *get_ident(const char *name, const char *email,
        if (!email)
                email = git_default_email;
 
-       if (!*name || !*email)
-               die("empty ident %s <%s> not allowed",
-                   name, email);
+       if (!*name) {
+               if (name == git_default_name && env_hint) {
+                       fprintf(stderr, env_hint, au_env, co_env);
+                       env_hint = NULL; /* warn only once, for "git-var -l" */
+               }
+               if (error_on_no_name)
+                       die("empty ident %s <%s> not allowed", name, email);
+       }
 
        strcpy(date, git_default_date);
        if (date_str)
@@ -201,16 +203,33 @@ static const char *get_ident(const char *name, const char *email,
        return buffer;
 }
 
-const char *git_author_info(void)
+const char *git_author_info(int error_on_no_name)
 {
        return get_ident(getenv("GIT_AUTHOR_NAME"),
                         getenv("GIT_AUTHOR_EMAIL"),
-                        getenv("GIT_AUTHOR_DATE"));
+                        getenv("GIT_AUTHOR_DATE"),
+                        error_on_no_name);
 }
 
-const char *git_committer_info(void)
+const char *git_committer_info(int error_on_no_name)
 {
        return get_ident(getenv("GIT_COMMITTER_NAME"),
                         getenv("GIT_COMMITTER_EMAIL"),
-                        getenv("GIT_COMMITTER_DATE"));
+                        getenv("GIT_COMMITTER_DATE"),
+                        error_on_no_name);
+}
+
+void ignore_missing_committer_name()
+{
+       /* If we did not get a name from the user's gecos entry then
+        * git_default_name is empty; so instead load the username
+        * into it as a 'good enough for now' approximation of who
+        * this user is.
+        */
+       if (!*git_default_name) {
+               struct passwd *pw = getpwuid(getuid());
+               if (!pw)
+                       die("You don't exist. Go away!");
+               strlcpy(git_default_name, pw->pw_name, sizeof(git_default_name));
+       }
 }