builtin-commit: fix --signoff
authorJohannes Schindelin <Johannes.Schindelin@gmx.de>
Sun, 11 Nov 2007 17:35:58 +0000 (17:35 +0000)
committerJunio C Hamano <gitster@pobox.com>
Fri, 23 Nov 2007 01:05:03 +0000 (17:05 -0800)
The Signed-off-by: line contained a spurious timestamp.  The reason was
a call to git_committer_info(1), which automatically added the
timestamp.

Instead, fmt_ident() was taught to interpret an empty string for the
date (as opposed to NULL, which still triggers the default behavior)
as "do not bother with the timestamp", and builtin-commit.c uses it.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin-commit.c
ident.c
t/t7500-commit.sh

index 400ee93a936342ad379b110b41bab1334f65eb85..780eec79bd9236000690e7333453266e376cd2fe 100644 (file)
@@ -183,21 +183,29 @@ static int prepare_log_message(const char *index_file, const char *prefix)
                die("could not open %s\n", git_path(commit_editmsg));
 
        stripspace(&sb, 0);
-       if (fwrite(sb.buf, 1, sb.len, fp) < sb.len)
-               die("could not write commit template: %s\n",
-                   strerror(errno));
 
        if (signoff) {
-               const char *info, *bol;
-
-               info = git_committer_info(1);
-               strbuf_addch(&sb, '\0');
-               bol = strrchr(sb.buf + sb.len - 1, '\n');
-               if (!bol || prefixcmp(bol, sign_off_header))
-                       fprintf(fp, "\n");
-               fprintf(fp, "%s%s\n", sign_off_header, git_committer_info(1));
+               struct strbuf sob;
+               int i;
+
+               strbuf_init(&sob, 0);
+               strbuf_addstr(&sob, sign_off_header);
+               strbuf_addstr(&sob, fmt_ident(getenv("GIT_COMMITTER_NAME"),
+                                             getenv("GIT_COMMITTER_EMAIL"),
+                                             "", 1));
+               strbuf_addch(&sob, '\n');
+
+               for (i = sb.len - 1; i > 0 && sb.buf[i - 1] != '\n'; i--)
+                       ; /* do nothing */
+               if (prefixcmp(sb.buf + i, sob.buf))
+                       strbuf_addbuf(&sb, &sob);
+               strbuf_release(&sob);
        }
 
+       if (fwrite(sb.buf, 1, sb.len, fp) < sb.len)
+               die("could not write commit template: %s\n",
+                   strerror(errno));
+
        strbuf_release(&sb);
 
        if (in_merge && !no_edit)
diff --git a/ident.c b/ident.c
index 9b2a852cb00327a607946caa864fcf31184da28e..5be7533ffd061bee4d3e1c184c375b095cfed575 100644 (file)
--- a/ident.c
+++ b/ident.c
@@ -224,13 +224,17 @@ const char *fmt_ident(const char *name, const char *email,
        }
 
        strcpy(date, git_default_date);
-       if (date_str)
-               parse_date(date_str, date, sizeof(date));
+       if (date_str) {
+               if (*date_str)
+                       parse_date(date_str, date, sizeof(date));
+               else
+                       date[0] = '\0';
+       }
 
        i = copy(buffer, sizeof(buffer), 0, name);
        i = add_raw(buffer, sizeof(buffer), i, " <");
        i = copy(buffer, sizeof(buffer), i, email);
-       i = add_raw(buffer, sizeof(buffer), i, "> ");
+       i = add_raw(buffer, sizeof(buffer), i, date[0] ? "> " : ">");
        i = copy(buffer, sizeof(buffer), i, date);
        if (i >= sizeof(buffer))
                die("Impossibly long personal identifier");
index cf389b81da041e6bcbc7d20cd367b4274001353f..49c1922dde3c7d46dfc1fbe7d1a99756714dd24f 100755 (executable)
@@ -122,7 +122,19 @@ test_expect_success 'using alternate GIT_INDEX_FILE (2)' '
 
        ) &&
        cmp .git/index saved-index >/dev/null
+'
 
+cat > expect << EOF
+zort
+Signed-off-by: C O Mitter <committer@example.com>
+EOF
+
+test_expect_success '--signoff' '
+       echo "yet another content *narf*" >> foo &&
+       echo "zort" |
+               GIT_EDITOR=../t7500/add-content git commit -s -F - foo &&
+       git cat-file commit HEAD | sed "1,/^$/d" > output &&
+       diff expect output
 '
 
 test_done