Skip to content

Commit

Permalink
Merge branch 'jk/format-patch-from' into maint
Browse files Browse the repository at this point in the history
"format-patch --from=<whom>" forgot to omit unnecessary in-body from
line, i.e. when <whom> is the same as the real author.

* jk/format-patch-from:
  format-patch: print in-body "From" only when needed
  • Loading branch information
Junio C Hamano committed Oct 28, 2013
2 parents 77bc430 + 662cc30 commit da212ea
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 1 deletion.
9 changes: 9 additions & 0 deletions cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -966,6 +966,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;
Expand Down
29 changes: 29 additions & 0 deletions ident.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
2 changes: 1 addition & 1 deletion pretty.c
Original file line number Diff line number Diff line change
Expand Up @@ -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: ");
Expand Down
10 changes: 10 additions & 0 deletions t/t4014-format-patch.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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 <author@example.com>" >patch &&
cat >expect <<-\EOF &&
From: A U Thor <author@example.com>
EOF
sed -ne "/^From:/p; /^$/p; /^---$/q" <patch >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^" &&
Expand Down

0 comments on commit da212ea

Please sign in to comment.