Merge branch 'jc/ident' into next
authorJunio C Hamano <junkio@cox.net>
Sun, 19 Feb 2006 07:15:13 +0000 (23:15 -0800)
committerJunio C Hamano <junkio@cox.net>
Sun, 19 Feb 2006 07:15:13 +0000 (23:15 -0800)
* jc/ident:
  Keep Porcelainish from failing by broken ident after making changes.
  Delay "empty ident" errors until they really matter.

cache.h
commit-tree.c
git-am.sh
git-applymbox.sh
git-merge.sh
git-resolve.sh
ident.c
var.c

diff --git a/cache.h b/cache.h
index 6542214..5020f07 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -248,8 +248,8 @@ void datestamp(char *buf, int bufsize);
 unsigned long approxidate(const char *);
 
 extern int setup_ident(void);
-extern const char *git_author_info(void);
-extern const char *git_committer_info(void);
+extern const char *git_author_info(int);
+extern const char *git_committer_info(int);
 
 struct checkout {
        const char *base_dir;
index b1c8dca..88871b0 100644 (file)
@@ -118,8 +118,8 @@ int main(int argc, char **argv)
                add_buffer(&buffer, &size, "parent %s\n", sha1_to_hex(parent_sha1[i]));
 
        /* Person/date information */
-       add_buffer(&buffer, &size, "author %s\n", git_author_info());
-       add_buffer(&buffer, &size, "committer %s\n\n", git_committer_info());
+       add_buffer(&buffer, &size, "author %s\n", git_author_info(1));
+       add_buffer(&buffer, &size, "committer %s\n\n", git_committer_info(1));
 
        /* And add the comment */
        while (fgets(comment, sizeof(comment), stdin) != NULL)
index 98b9215..85ecada 100755 (executable)
--- a/git-am.sh
+++ b/git-am.sh
@@ -1,11 +1,13 @@
 #!/bin/sh
 #
-#
+# Copyright (c) 2005, 2006 Junio C Hamano
 
 USAGE='[--signoff] [--dotest=<dir>] [--utf8] [--binary] [--3way] <mbox>
   or, when resuming [--skip | --resolved]'
 . git-sh-setup
 
+git var GIT_COMMITTER_IDENT >/dev/null || exit
+
 stop_here () {
     echo "$1" >"$dotest/next"
     exit 1
index 61c8c02..5569fdc 100755 (executable)
@@ -21,6 +21,8 @@
 USAGE='[-u] [-k] [-q] [-m] (-c .dotest/<num> | mbox) [signoff]'
 . git-sh-setup
 
+git var GIT_COMMITTER_IDENT >/dev/null || exit
+
 keep_subject= query_apply= continue= utf8= resume=t
 while case "$#" in 0) break ;; esac
 do
index 74f0761..2b4a603 100755 (executable)
@@ -142,6 +142,8 @@ case "$#,$common,$no_commit" in
 1,*,)
        # We are not doing octopus, not fast forward, and have only
        # one common.  See if it is really trivial.
+       git var GIT_COMMITTER_IDENT >/dev/null || exit
+
        echo "Trying really trivial in-index merge..."
        git-update-index --refresh 2>/dev/null
        if git-read-tree --trivial -m -u $common $head "$1" &&
@@ -179,6 +181,9 @@ case "$#,$common,$no_commit" in
        ;;
 esac
 
+# We are going to make a new commit.
+git var GIT_COMMITTER_IDENT >/dev/null || exit
+
 case "$use_strategies" in
 '')
        case "$#" in
index 9263070..b53ede8 100755 (executable)
@@ -50,6 +50,9 @@ case "$common" in
        ;;
 esac
 
+# We are going to make a new commit.
+git var GIT_COMMITTER_IDENT >/dev/null || exit
+
 # Find an optimum merge base if there are more than one candidates.
 LF='
 '
diff --git a/ident.c b/ident.c
index 09d4d71..7c81fe8 100644 (file)
--- a/ident.c
+++ b/ident.c
@@ -46,15 +46,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 +57,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)
@@ -170,8 +156,18 @@ 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*** 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"
+"*** Alternatively, you can use user.name configuration variable.\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 +178,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 +202,18 @@ 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);
 }
diff --git a/var.c b/var.c
index 59da56d..a57a33b 100644 (file)
--- a/var.c
+++ b/var.c
@@ -12,7 +12,7 @@ static const char var_usage[] = "git-var [-l | <variable>]";
 
 struct git_var {
        const char *name;
-       const char *(*read)(void);
+       const char *(*read)(int);
 };
 static struct git_var git_vars[] = {
        { "GIT_COMMITTER_IDENT", git_committer_info },
@@ -24,7 +24,7 @@ static void list_vars(void)
 {
        struct git_var *ptr;
        for(ptr = git_vars; ptr->read; ptr++) {
-               printf("%s=%s\n", ptr->name, ptr->read());
+               printf("%s=%s\n", ptr->name, ptr->read(0));
        }
 }
 
@@ -35,7 +35,7 @@ static const char *read_var(const char *var)
        val = NULL;
        for(ptr = git_vars; ptr->read; ptr++) {
                if (strcmp(var, ptr->name) == 0) {
-                       val = ptr->read();
+                       val = ptr->read(1);
                        break;
                }
        }