Skip to content

Commit 5c3895d

Browse files
committed
Merge branch 'pw/am-signoff'
"git am -s" has been taught that some input may end with a trailer block that is not Signed-off-by: and it should refrain from adding an extra blank line before adding a new sign-off in such a case. * pw/am-signoff: am: fix signoff when other trailers are present
2 parents 5498d69 + 735285b commit 5c3895d

File tree

2 files changed

+64
-45
lines changed

2 files changed

+64
-45
lines changed

builtin/am.c

+1-25
Original file line numberDiff line numberDiff line change
@@ -1193,34 +1193,10 @@ static void NORETURN die_user_resolve(const struct am_state *state)
11931193
*/
11941194
static void am_append_signoff(struct am_state *state)
11951195
{
1196-
char *cp;
1197-
struct strbuf mine = STRBUF_INIT;
11981196
struct strbuf sb = STRBUF_INIT;
11991197

12001198
strbuf_attach(&sb, state->msg, state->msg_len, state->msg_len);
1201-
1202-
/* our sign-off */
1203-
strbuf_addf(&mine, "\n%s%s\n",
1204-
sign_off_header,
1205-
fmt_name(getenv("GIT_COMMITTER_NAME"),
1206-
getenv("GIT_COMMITTER_EMAIL")));
1207-
1208-
/* Does sb end with it already? */
1209-
if (mine.len < sb.len &&
1210-
!strcmp(mine.buf, sb.buf + sb.len - mine.len))
1211-
goto exit; /* no need to duplicate */
1212-
1213-
/* Does it have any Signed-off-by: in the text */
1214-
for (cp = sb.buf;
1215-
cp && *cp && (cp = strstr(cp, sign_off_header)) != NULL;
1216-
cp = strchr(cp, '\n')) {
1217-
if (sb.buf == cp || cp[-1] == '\n')
1218-
break;
1219-
}
1220-
1221-
strbuf_addstr(&sb, mine.buf + !!cp);
1222-
exit:
1223-
strbuf_release(&mine);
1199+
append_signoff(&sb, 0, 0);
12241200
state->msg = strbuf_detach(&sb, &state->msg_len);
12251201
}
12261202

t/t4150-am.sh

+63-20
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ test_expect_success 'setup: messages' '
4040
dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio
4141
dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te
4242
feugait nulla facilisi.
43+
44+
Reported-by: A N Other <[email protected]>
4345
EOF
4446
4547
cat >failmail <<-\EOF &&
@@ -93,7 +95,7 @@ test_expect_success setup '
9395
echo world >>file &&
9496
git add file &&
9597
test_tick &&
96-
git commit -s -F msg &&
98+
git commit -F msg &&
9799
git tag second &&
98100
99101
git format-patch --stdout first >patch1 &&
@@ -124,8 +126,6 @@ test_expect_success setup '
124126
echo "Date: $GIT_AUTHOR_DATE" &&
125127
echo &&
126128
sed -e "1,2d" msg &&
127-
echo &&
128-
echo "Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" &&
129129
echo "---" &&
130130
git diff-tree --no-commit-id --stat -p second
131131
} >patch1-stgit.eml &&
@@ -144,8 +144,6 @@ test_expect_success setup '
144144
echo "# Parent $_z40" &&
145145
cat msg &&
146146
echo &&
147-
echo "Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" &&
148-
echo &&
149147
git diff-tree --no-commit-id -p second
150148
} >patch1-hg.eml &&
151149
@@ -470,13 +468,15 @@ test_expect_success 'am --signoff adds Signed-off-by: line' '
470468
git reset --hard &&
471469
git checkout -b master2 first &&
472470
git am --signoff <patch2 &&
473-
printf "%s\n" "$signoff" >expected &&
474-
echo "Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" >>expected &&
475-
git cat-file commit HEAD^ | grep "Signed-off-by:" >actual &&
476-
test_cmp expected actual &&
477-
echo "Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" >expected &&
478-
git cat-file commit HEAD | grep "Signed-off-by:" >actual &&
479-
test_cmp expected actual
471+
{
472+
printf "third\n\nSigned-off-by: %s <%s>\n\n" \
473+
"$GIT_COMMITTER_NAME" "$GIT_COMMITTER_EMAIL" &&
474+
cat msg &&
475+
printf "Signed-off-by: %s <%s>\n\n" \
476+
"$GIT_COMMITTER_NAME" "$GIT_COMMITTER_EMAIL"
477+
} >expected-log &&
478+
git log --pretty=%B -2 HEAD >actual &&
479+
test_cmp expected-log actual
480480
'
481481

482482
test_expect_success 'am stays in branch' '
@@ -486,17 +486,60 @@ test_expect_success 'am stays in branch' '
486486
'
487487

488488
test_expect_success 'am --signoff does not add Signed-off-by: line if already there' '
489-
git format-patch --stdout HEAD^ >patch3 &&
490-
sed -e "/^Subject/ s,\[PATCH,Re: Re: Re: & 1/5 v2] [foo," patch3 >patch4 &&
491-
rm -fr .git/rebase-apply &&
492-
git reset --hard &&
493-
git checkout HEAD^ &&
494-
git am --signoff patch4 &&
495-
git cat-file commit HEAD >actual &&
496-
test $(grep -c "^Signed-off-by:" actual) -eq 1
489+
git format-patch --stdout first >patch3 &&
490+
git reset --hard first &&
491+
git am --signoff <patch3 &&
492+
git log --pretty=%B -2 HEAD >actual &&
493+
test_cmp expected-log actual
494+
'
495+
496+
test_expect_success 'am --signoff adds Signed-off-by: if another author is preset' '
497+
NAME="A N Other" &&
498+
EMAIL="[email protected]" &&
499+
{
500+
printf "third\n\nSigned-off-by: %s <%s>\nSigned-off-by: %s <%s>\n\n" \
501+
"$GIT_COMMITTER_NAME" "$GIT_COMMITTER_EMAIL" \
502+
"$NAME" "$EMAIL" &&
503+
cat msg &&
504+
printf "Signed-off-by: %s <%s>\nSigned-off-by: %s <%s>\n\n" \
505+
"$GIT_COMMITTER_NAME" "$GIT_COMMITTER_EMAIL" \
506+
"$NAME" "$EMAIL"
507+
} >expected-log &&
508+
git reset --hard first &&
509+
GIT_COMMITTER_NAME="$NAME" GIT_COMMITTER_EMAIL="$EMAIL" \
510+
git am --signoff <patch3 &&
511+
git log --pretty=%B -2 HEAD >actual &&
512+
test_cmp expected-log actual
513+
'
514+
515+
test_expect_success 'am --signoff duplicates Signed-off-by: if it is not the last one' '
516+
NAME="A N Other" &&
517+
EMAIL="[email protected]" &&
518+
{
519+
printf "third\n\nSigned-off-by: %s <%s>\n\
520+
Signed-off-by: %s <%s>\nSigned-off-by: %s <%s>\n\n" \
521+
"$GIT_COMMITTER_NAME" "$GIT_COMMITTER_EMAIL" \
522+
"$NAME" "$EMAIL" \
523+
"$GIT_COMMITTER_NAME" "$GIT_COMMITTER_EMAIL" &&
524+
cat msg &&
525+
printf "Signed-off-by: %s <%s>\nSigned-off-by: %s <%s>\n\
526+
Signed-off-by: %s <%s>\n\n" \
527+
"$GIT_COMMITTER_NAME" "$GIT_COMMITTER_EMAIL" \
528+
"$NAME" "$EMAIL" \
529+
"$GIT_COMMITTER_NAME" "$GIT_COMMITTER_EMAIL"
530+
} >expected-log &&
531+
git format-patch --stdout first >patch3 &&
532+
git reset --hard first &&
533+
git am --signoff <patch3 &&
534+
git log --pretty=%B -2 HEAD >actual &&
535+
test_cmp expected-log actual
497536
'
498537

499538
test_expect_success 'am without --keep removes Re: and [PATCH] stuff' '
539+
git format-patch --stdout HEAD^ >tmp &&
540+
sed -e "/^Subject/ s,\[PATCH,Re: Re: Re: & 1/5 v2] [foo," tmp >patch4 &&
541+
git reset --hard HEAD^ &&
542+
git am <patch4 &&
500543
git rev-parse HEAD >expected &&
501544
git rev-parse master2 >actual &&
502545
test_cmp expected actual

0 commit comments

Comments
 (0)