]> git.ipfire.org Git - thirdparty/git.git/commitdiff
rebase -i: teach --autosquash to work with amend!
authorCharvi Mendiratta <charvi077@gmail.com>
Fri, 29 Jan 2021 18:20:49 +0000 (23:50 +0530)
committerJunio C Hamano <gitster@pobox.com>
Fri, 29 Jan 2021 23:21:56 +0000 (15:21 -0800)
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>
sequencer.c
t/t3437-rebase-fixup-options.sh

index 46e11d20e8cfe381c7e76ab9d6df88cade984acf..d09ce446b65907d005cfa1ae48b2b754e8cd3ee5 100644 (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;
index 832971ffdb2c7873726d9740bf8f57d1fb037bd1..945df2555bced44f58885e667a15f2c4d7b10860 100755 (executable)
@@ -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