1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-05-30 16:06:13 +02:00

rebase -i: teach --autosquash to work with amend!

If the commit subject starts with "amend!" then rearrange it like a
"fixup!" commit and replace `pick` command with `fixup -C` command,
which is used to fixup up the content if any and replaces the original
commit message with amend! commit's message.

Original-patch-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Mentored-by: Christian Couder <chriscool@tuxfamily.org>
Mentored-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Charvi Mendiratta <charvi077@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Charvi Mendiratta 2021-01-29 23:50:49 +05:30 committed by Junio C Hamano
parent 1d410cd8c2
commit bae5b4aea5
2 changed files with 28 additions and 7 deletions

View File

@ -5662,6 +5662,12 @@ static int subject2item_cmp(const void *fndata,
define_commit_slab(commit_todo_item, struct todo_item *);
static inline int skip_fixup_amend_squash(const char *subject, const char **p) {
return skip_prefix(subject, "fixup! ", p) ||
skip_prefix(subject, "amend! ", p) ||
skip_prefix(subject, "squash! ", p);
}
/*
* Rearrange the todo list that has both "pick commit-id msg" and "pick
* commit-id fixup!/squash! msg" in it so that the latter is put immediately
@ -5720,15 +5726,13 @@ int todo_list_rearrange_squash(struct todo_list *todo_list)
format_subject(&buf, subject, " ");
subject = subjects[i] = strbuf_detach(&buf, &subject_len);
unuse_commit_buffer(item->commit, commit_buffer);
if ((skip_prefix(subject, "fixup! ", &p) ||
skip_prefix(subject, "squash! ", &p))) {
if (skip_fixup_amend_squash(subject, &p)) {
struct commit *commit2;
for (;;) {
while (isspace(*p))
p++;
if (!skip_prefix(p, "fixup! ", &p) &&
!skip_prefix(p, "squash! ", &p))
if (!skip_fixup_amend_squash(p, &p))
break;
}
@ -5758,9 +5762,14 @@ int todo_list_rearrange_squash(struct todo_list *todo_list)
}
if (i2 >= 0) {
rearranged = 1;
todo_list->items[i].command =
starts_with(subject, "fixup!") ?
TODO_FIXUP : TODO_SQUASH;
if (starts_with(subject, "fixup!")) {
todo_list->items[i].command = TODO_FIXUP;
} else if (starts_with(subject, "amend!")) {
todo_list->items[i].command = TODO_FIXUP;
todo_list->items[i].flags = TODO_REPLACE_FIXUP_MSG;
} else {
todo_list->items[i].command = TODO_SQUASH;
}
if (tail[i2] < 0) {
next[i] = next[i2];
next[i2] = i;

View File

@ -210,4 +210,16 @@ test_expect_success 'sequence squash, fixup & fixup -c gives combined message' '
test_cmp_rev HEAD^ A
'
test_expect_success 'fixup -C works upon --autosquash with amend!' '
git checkout --detach branch &&
FAKE_COMMIT_AMEND=squashed \
FAKE_MESSAGE_COPY=actual-squash-message \
git -c commit.status=false rebase -ik --autosquash \
--signoff A &&
git diff-tree --exit-code --patch HEAD branch -- &&
test_cmp_rev HEAD^ A &&
test_i18ncmp "$TEST_DIRECTORY/t3437/expected-squash-message" \
actual-squash-message
'
test_done