From: Junio C Hamano Date: Thu, 17 Oct 2013 22:55:18 +0000 (-0700) Subject: Merge branch 'jk/format-patch-from' X-Git-Tag: v1.8.5-rc0~41 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/046180ad9dd36f739f22b1d05b17b23b8c96ce49?hp=d6a58b7773d142ab6da47eca94f83b9c8e6dad5e Merge branch 'jk/format-patch-from' "format-patch --from=" forgot to omit unnecessary in-body from line, i.e. when is the same as the real author. * jk/format-patch-from: format-patch: print in-body "From" only when needed --- diff --git a/cache.h b/cache.h index 2d86b695a9..5e3fc72fd4 100644 --- a/cache.h +++ b/cache.h @@ -957,6 +957,15 @@ struct ident_split { */ extern int split_ident_line(struct ident_split *, const char *, int); +/* + * Compare split idents for equality or strict ordering. Note that we + * compare only the ident part of the line, ignoring any timestamp. + * + * Because there are two fields, we must choose one as the primary key; we + * currently arbitrarily pick the email. + */ +extern int ident_cmp(const struct ident_split *, const struct ident_split *); + struct checkout { const char *base_dir; int base_dir_len; diff --git a/ident.c b/ident.c index 1c123e685f..b29f81f83a 100644 --- a/ident.c +++ b/ident.c @@ -402,3 +402,32 @@ int git_ident_config(const char *var, const char *value, void *data) return 0; } + +static int buf_cmp(const char *a_begin, const char *a_end, + const char *b_begin, const char *b_end) +{ + int a_len = a_end - a_begin; + int b_len = b_end - b_begin; + int min = a_len < b_len ? a_len : b_len; + int cmp; + + cmp = memcmp(a_begin, b_begin, min); + if (cmp) + return cmp; + + return a_len - b_len; +} + +int ident_cmp(const struct ident_split *a, + const struct ident_split *b) +{ + int cmp; + + cmp = buf_cmp(a->mail_begin, a->mail_end, + b->mail_begin, b->mail_end); + if (cmp) + return cmp; + + return buf_cmp(a->name_begin, a->name_end, + b->name_begin, b->name_end); +} diff --git a/pretty.c b/pretty.c index 74563c92b4..b4e32b74d3 100644 --- a/pretty.c +++ b/pretty.c @@ -432,7 +432,7 @@ void pp_user_info(struct pretty_print_context *pp, map_user(pp->mailmap, &mailbuf, &maillen, &namebuf, &namelen); if (pp->fmt == CMIT_FMT_EMAIL) { - if (pp->from_ident) { + if (pp->from_ident && ident_cmp(pp->from_ident, &ident)) { struct strbuf buf = STRBUF_INIT; strbuf_addstr(&buf, "From: "); diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh index 668933bfb2..8f272bce84 100755 --- a/t/t4014-format-patch.sh +++ b/t/t4014-format-patch.sh @@ -1000,6 +1000,16 @@ test_expect_success '--from uses committer ident' ' test_cmp expect patch.head ' +test_expect_success '--from omits redundant in-body header' ' + git format-patch -1 --stdout --from="A U Thor " >patch && + cat >expect <<-\EOF && + From: A U Thor + + EOF + sed -ne "/^From:/p; /^$/p; /^---$/q" patch.head && + test_cmp expect patch.head +' + test_expect_success 'in-body headers trigger content encoding' ' GIT_AUTHOR_NAME="éxötìc" test_commit exotic && test_when_finished "git reset --hard HEAD^" &&