Revert "Allow branch.*.merge to talk about remote tracking branches."
[gitweb.git] / ident.c
diff --git a/ident.c b/ident.c
index efec97ffd0a9f3aa6573f3476c749d38d6fc388c..a6fc7b5e11e3f232a7becd62223cc23c5eb68ccc 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,19 +43,13 @@ static void copy_gecos(struct passwd *w, char *name, int sz)
 
 }
 
-int setup_ident(void)
+static void copy_email(struct passwd *pw)
 {
-       int len;
-       struct passwd *pw = getpwuid(getuid());
-
-       if (!pw)
-               die("You don't exist. Go away!");
-
-       /* Get the name ("gecos") */
-       copy_gecos(pw, git_default_name, sizeof(git_default_name));
-
-       /* Make up a fake email address (name + '@' + hostname [+ '.' + domainname]) */
-       len = strlen(pw->pw_name);
+       /*
+        * Make up a fake email address
+        * (name + '@' + hostname [+ '.' + domainname])
+        */
+       int len = strlen(pw->pw_name);
        if (len > sizeof(git_default_email)/2)
                die("Your sysadmin must hate you!");
        memcpy(git_default_email, pw->pw_name, len);
@@ -71,13 +62,37 @@ int setup_ident(void)
                len = strlen(git_default_email);
                git_default_email[len++] = '.';
                if (he && (domainname = strchr(he->h_name, '.')))
-                       strlcpy(git_default_email + len, domainname + 1, sizeof(git_default_email) - len);
+                       strlcpy(git_default_email + len, domainname + 1,
+                               sizeof(git_default_email) - len);
                else
-                       strlcpy(git_default_email + len, "(none)", sizeof(git_default_email) - len);
+                       strlcpy(git_default_email + len, "(none)",
+                               sizeof(git_default_email) - len);
+       }
+}
+
+static void setup_ident(void)
+{
+       struct passwd *pw = NULL;
+
+       /* Get the name ("gecos") */
+       if (!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 (!git_default_email[0]) {
+               if (!pw)
+                       pw = getpwuid(getuid());
+               if (!pw)
+                       die("You don't exist. Go away!");
+               copy_email(pw);
+       }
+
        /* And set the default date */
-       datestamp(git_default_date, sizeof(git_default_date));
-       return 0;
+       if (!git_default_date[0])
+               datestamp(git_default_date, sizeof(git_default_date));
 }
 
 static int add_raw(char *buf, int size, int offset, const char *str)
@@ -158,12 +173,17 @@ static int copy(char *buf, int size, int offset, const char *src)
 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"
+"\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"
-"*** Alternatively, you can use user.name configuration variable.\n\n";
+"\n"
+"Run\n"
+"\n"
+"  git config user.email \"you@email.com\"\n"
+"  git 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, int error_on_no_name)
@@ -172,18 +192,28 @@ static const char *get_ident(const char *name, const char *email,
        char date[50];
        int i;
 
+       setup_ident();
        if (!name)
                name = git_default_name;
        if (!email)
                email = git_default_email;
 
        if (!*name) {
-               if (name == git_default_name && env_hint) {
+               struct passwd *pw;
+
+               if (0 <= error_on_no_name &&
+                   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)
+               if (0 < error_on_no_name)
                        die("empty ident %s <%s> not allowed", name, email);
+               pw = getpwuid(getuid());
+               if (!pw)
+                       die("You don't exist. Go away!");
+               strlcpy(git_default_name, pw->pw_name,
+                       sizeof(git_default_name));
+               name = git_default_name;
        }
 
        strcpy(date, git_default_date);