Merge branch 'uk/maint-shortlog-encoding'
authorJunio C Hamano <gitster@pobox.com>
Mon, 30 Nov 2009 22:42:28 +0000 (14:42 -0800)
committerJunio C Hamano <gitster@pobox.com>
Mon, 30 Nov 2009 22:42:28 +0000 (14:42 -0800)
Conflicts:
builtin-shortlog.c

builtin-shortlog.c
t/t4201-shortlog.sh

index 8aa63c7..b3b055f 100644 (file)
@@ -139,8 +139,12 @@ static void read_from_stdin(struct shortlog *log)
 void shortlog_add_commit(struct shortlog *log, struct commit *commit)
 {
        const char *author = NULL, *buffer;
+       struct strbuf buf = STRBUF_INIT;
+       struct strbuf ufbuf = STRBUF_INIT;
+       struct pretty_print_context ctx = {0};
 
-       buffer = commit->buffer;
+       pretty_print_commit(CMIT_FMT_RAW, commit, &buf, &ctx);
+       buffer = buf.buf;
        while (*buffer && *buffer != '\n') {
                const char *eol = strchr(buffer, '\n');
 
@@ -157,20 +161,19 @@ void shortlog_add_commit(struct shortlog *log, struct commit *commit)
                die("Missing author: %s",
                    sha1_to_hex(commit->object.sha1));
        if (log->user_format) {
-               struct strbuf buf = STRBUF_INIT;
                struct pretty_print_context ctx = {0};
                ctx.abbrev = DEFAULT_ABBREV;
                ctx.subject = "";
                ctx.after_subject = "";
                ctx.date_mode = DATE_NORMAL;
-               pretty_print_commit(CMIT_FMT_USERFORMAT, commit, &buf, &ctx);
-               insert_one_record(log, author, buf.buf);
-               strbuf_release(&buf);
-               return;
-       }
-       if (*buffer)
+               pretty_print_commit(CMIT_FMT_USERFORMAT, commit, &ufbuf, &ctx);
+               buffer = ufbuf.buf;
+       } else if (*buffer) {
                buffer++;
+       }
        insert_one_record(log, author, !*buffer ? "<none>" : buffer);
+       strbuf_release(&ufbuf);
+       strbuf_release(&buf);
 }
 
 static void get_from_rev(struct rev_info *rev, struct shortlog *log)
index 405b971..dd818f6 100755 (executable)
@@ -52,4 +52,32 @@ GIT_DIR=non-existing git shortlog -w < log > out
 
 test_expect_success 'shortlog from non-git directory' 'test_cmp expect out'
 
+iconvfromutf8toiso88591() {
+       printf "%s" "$*" | iconv -f UTF-8 -t ISO-8859-1
+}
+
+DSCHO="Jöhännës \"Dschö\" Schindëlin"
+DSCHOE="$DSCHO <Johannes.Schindelin@gmx.de>"
+MSG1="set a1 to 2 and some non-ASCII chars: Äßø"
+MSG2="set a1 to 3 and some non-ASCII chars: áæï"
+cat > expect << EOF
+$DSCHO (2):
+      $MSG1
+      $MSG2
+
+EOF
+
+test_expect_success 'shortlog encoding' '
+       git reset --hard "$commit" &&
+       git config --unset i18n.commitencoding &&
+       echo 2 > a1 &&
+       git commit --quiet -m "$MSG1" --author="$DSCHOE" a1 &&
+       git config i18n.commitencoding "ISO-8859-1" &&
+       echo 3 > a1 &&
+       git commit --quiet -m "$(iconvfromutf8toiso88591 "$MSG2")" \
+               --author="$(iconvfromutf8toiso88591 "$DSCHOE")" a1 &&
+       git config --unset i18n.commitencoding &&
+       git shortlog HEAD~2.. > out &&
+test_cmp expect out'
+
 test_done