| 1 | #!/bin/sh |
| 2 | # |
| 3 | # Copyright (c) 2019 Rohit Ashiwal |
| 4 | # |
| 5 | |
| 6 | test_description='tests to ensure compatibility between am and interactive backends' |
| 7 | |
| 8 | . ./test-lib.sh |
| 9 | |
| 10 | . "$TEST_DIRECTORY"/lib-rebase.sh |
| 11 | |
| 12 | GIT_AUTHOR_DATE="1999-04-02T08:03:20+05:30" |
| 13 | export GIT_AUTHOR_DATE |
| 14 | |
| 15 | # This is a special case in which both am and interactive backends |
| 16 | # provide the same output. It was done intentionally because |
| 17 | # both the backends fall short of optimal behaviour. |
| 18 | test_expect_success 'setup' ' |
| 19 | git checkout -b topic && |
| 20 | test_write_lines "line 1" " line 2" "line 3" >file && |
| 21 | git add file && |
| 22 | git commit -m "add file" && |
| 23 | |
| 24 | test_write_lines "line 1" "new line 2" "line 3" >file && |
| 25 | git commit -am "update file" && |
| 26 | git tag side && |
| 27 | test_commit commit1 foo foo1 && |
| 28 | test_commit commit2 foo foo2 && |
| 29 | test_commit commit3 foo foo3 && |
| 30 | |
| 31 | git checkout --orphan main && |
| 32 | rm foo && |
| 33 | test_write_lines "line 1" " line 2" "line 3" >file && |
| 34 | git commit -am "add file" && |
| 35 | git tag main && |
| 36 | |
| 37 | mkdir test-bin && |
| 38 | write_script test-bin/git-merge-test <<-\EOF |
| 39 | exec git merge-recursive "$@" |
| 40 | EOF |
| 41 | ' |
| 42 | |
| 43 | test_expect_success '--ignore-whitespace works with apply backend' ' |
| 44 | test_must_fail git rebase --apply main side && |
| 45 | git rebase --abort && |
| 46 | git rebase --apply --ignore-whitespace main side && |
| 47 | git diff --exit-code side |
| 48 | ' |
| 49 | |
| 50 | test_expect_success '--ignore-whitespace works with merge backend' ' |
| 51 | test_must_fail git rebase --merge main side && |
| 52 | git rebase --abort && |
| 53 | git rebase --merge --ignore-whitespace main side && |
| 54 | git diff --exit-code side |
| 55 | ' |
| 56 | |
| 57 | test_expect_success '--ignore-whitespace is remembered when continuing' ' |
| 58 | ( |
| 59 | set_fake_editor && |
| 60 | FAKE_LINES="break 1" git rebase -i --ignore-whitespace \ |
| 61 | main side && |
| 62 | git rebase --continue |
| 63 | ) && |
| 64 | git diff --exit-code side |
| 65 | ' |
| 66 | |
| 67 | test_ctime_is_atime () { |
| 68 | git log $1 --format="$GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> %ai" >authortime && |
| 69 | git log $1 --format="%cn <%ce> %ci" >committertime && |
| 70 | test_cmp authortime committertime |
| 71 | } |
| 72 | |
| 73 | test_expect_success '--committer-date-is-author-date works with apply backend' ' |
| 74 | GIT_AUTHOR_DATE="@1234 +0300" git commit --amend --reset-author && |
| 75 | git rebase --apply --committer-date-is-author-date HEAD^ && |
| 76 | test_ctime_is_atime -1 |
| 77 | ' |
| 78 | |
| 79 | test_expect_success '--committer-date-is-author-date works with merge backend' ' |
| 80 | GIT_AUTHOR_DATE="@1234 +0300" git commit --amend --reset-author && |
| 81 | git rebase -m --committer-date-is-author-date HEAD^ && |
| 82 | test_ctime_is_atime -1 |
| 83 | ' |
| 84 | |
| 85 | test_expect_success '--committer-date-is-author-date works when rewording' ' |
| 86 | GIT_AUTHOR_DATE="@1234 +0300" git commit --amend --reset-author && |
| 87 | ( |
| 88 | set_fake_editor && |
| 89 | FAKE_COMMIT_MESSAGE=edited \ |
| 90 | FAKE_LINES="reword 1" \ |
| 91 | git rebase -i --committer-date-is-author-date HEAD^ |
| 92 | ) && |
| 93 | test_write_lines edited "" >expect && |
| 94 | git log --format="%B" -1 >actual && |
| 95 | test_cmp expect actual && |
| 96 | test_ctime_is_atime -1 |
| 97 | ' |
| 98 | |
| 99 | test_expect_success '--committer-date-is-author-date works with rebase -r' ' |
| 100 | git checkout side && |
| 101 | GIT_AUTHOR_DATE="@1234 +0300" git merge --no-ff commit3 && |
| 102 | git rebase -r --root --committer-date-is-author-date && |
| 103 | test_ctime_is_atime |
| 104 | ' |
| 105 | |
| 106 | test_expect_success '--committer-date-is-author-date works when forking merge' ' |
| 107 | git checkout side && |
| 108 | GIT_AUTHOR_DATE="@1234 +0300" git merge --no-ff commit3 && |
| 109 | PATH="./test-bin:$PATH" git rebase -r --root --strategy=test \ |
| 110 | --committer-date-is-author-date && |
| 111 | test_ctime_is_atime |
| 112 | ' |
| 113 | |
| 114 | test_expect_success '--committer-date-is-author-date works when committing conflict resolution' ' |
| 115 | git checkout commit2 && |
| 116 | GIT_AUTHOR_DATE="@1980 +0000" git commit --amend --only --reset-author && |
| 117 | test_must_fail git rebase -m --committer-date-is-author-date \ |
| 118 | --onto HEAD^^ HEAD^ && |
| 119 | echo resolved > foo && |
| 120 | git add foo && |
| 121 | git rebase --continue && |
| 122 | test_ctime_is_atime -1 |
| 123 | ' |
| 124 | |
| 125 | # Checking for +0000 in the author date is sufficient since the |
| 126 | # default timezone is UTC but the timezone used while committing is |
| 127 | # +0530. The inverted logic in the grep is necessary to check all the |
| 128 | # author dates in the file. |
| 129 | test_atime_is_ignored () { |
| 130 | git log $1 --format=%ai >authortime && |
| 131 | ! grep -v +0000 authortime |
| 132 | } |
| 133 | |
| 134 | test_expect_success '--reset-author-date works with apply backend' ' |
| 135 | git commit --amend --date="$GIT_AUTHOR_DATE" && |
| 136 | git rebase --apply --reset-author-date HEAD^ && |
| 137 | test_atime_is_ignored -1 |
| 138 | ' |
| 139 | |
| 140 | test_expect_success '--reset-author-date works with merge backend' ' |
| 141 | git commit --amend --date="$GIT_AUTHOR_DATE" && |
| 142 | git rebase --reset-author-date -m HEAD^ && |
| 143 | test_atime_is_ignored -1 |
| 144 | ' |
| 145 | |
| 146 | test_expect_success '--reset-author-date works after conflict resolution' ' |
| 147 | test_must_fail git rebase --reset-author-date -m \ |
| 148 | --onto commit2^^ commit2^ commit2 && |
| 149 | echo resolved >foo && |
| 150 | git add foo && |
| 151 | git rebase --continue && |
| 152 | test_atime_is_ignored -1 |
| 153 | ' |
| 154 | |
| 155 | test_expect_success '--reset-author-date works with rebase -r' ' |
| 156 | git checkout side && |
| 157 | git merge --no-ff commit3 && |
| 158 | git rebase -r --root --reset-author-date && |
| 159 | test_atime_is_ignored |
| 160 | ' |
| 161 | |
| 162 | test_expect_success '--reset-author-date with --committer-date-is-author-date works' ' |
| 163 | test_must_fail git rebase -m --committer-date-is-author-date \ |
| 164 | --reset-author-date --onto commit2^^ commit2^ commit3 && |
| 165 | git checkout --theirs foo && |
| 166 | git add foo && |
| 167 | git rebase --continue && |
| 168 | test_ctime_is_atime -2 && |
| 169 | test_atime_is_ignored -2 |
| 170 | ' |
| 171 | |
| 172 | test_expect_success 'reset-author-date with --committer-date-is-author-date works when rewording' ' |
| 173 | GIT_AUTHOR_DATE="@1234 +0300" git commit --amend --reset-author && |
| 174 | ( |
| 175 | set_fake_editor && |
| 176 | FAKE_COMMIT_MESSAGE=edited \ |
| 177 | FAKE_LINES="reword 1" \ |
| 178 | git rebase -i --committer-date-is-author-date \ |
| 179 | --reset-author-date HEAD^ |
| 180 | ) && |
| 181 | test_write_lines edited "" >expect && |
| 182 | git log --format="%B" -1 >actual && |
| 183 | test_cmp expect actual && |
| 184 | test_atime_is_ignored -1 |
| 185 | ' |
| 186 | |
| 187 | test_expect_success '--reset-author-date --committer-date-is-author-date works when forking merge' ' |
| 188 | GIT_SEQUENCE_EDITOR="echo \"merge -C $(git rev-parse HEAD) commit3\">" \ |
| 189 | PATH="./test-bin:$PATH" git rebase -i --strategy=test \ |
| 190 | --reset-author-date \ |
| 191 | --committer-date-is-author-date side side && |
| 192 | test_ctime_is_atime -1 && |
| 193 | test_atime_is_ignored -1 |
| 194 | ' |
| 195 | |
| 196 | test_expect_success '--ignore-date is an alias for --reset-author-date' ' |
| 197 | git commit --amend --date="$GIT_AUTHOR_DATE" && |
| 198 | git rebase --apply --ignore-date HEAD^ && |
| 199 | git commit --allow-empty -m empty --date="$GIT_AUTHOR_DATE" && |
| 200 | git rebase -m --ignore-date HEAD^ && |
| 201 | test_atime_is_ignored -2 |
| 202 | ' |
| 203 | |
| 204 | test_expect_success '--no-edit on continue uses existing commit message' ' |
| 205 | git checkout commit2 && |
| 206 | test_must_fail git rebase -m --onto commit2^^ commit2^ && |
| 207 | echo resolved >foo && |
| 208 | git add foo && |
| 209 | write_script fail-if-editor-invoked <<-\EOF && |
| 210 | echo editor invoked >&2 |
| 211 | exit 1 |
| 212 | EOF |
| 213 | GIT_EDITOR=./fail-if-editor-invoked git rebase --continue --no-edit && |
| 214 | git log --format=%s -1 >actual && |
| 215 | echo commit2 >expect && |
| 216 | test_cmp expect actual |
| 217 | ' |
| 218 | |
| 219 | test_expect_success '--no-edit cannot be used when starting a rebase' ' |
| 220 | test_must_fail git rebase --no-edit -m main side 2>err && |
| 221 | test_grep "only be used with --continue" err |
| 222 | ' |
| 223 | |
| 224 | test_expect_success 'rebase.noEdit skips editor on continue' ' |
| 225 | git config rebase.noEdit true && |
| 226 | git checkout commit2 && |
| 227 | test_must_fail git rebase -m --onto commit2^^ commit2^ && |
| 228 | echo resolved >foo && |
| 229 | git add foo && |
| 230 | write_script fail-if-editor-invoked <<-\EOF && |
| 231 | echo editor invoked >&2 |
| 232 | exit 1 |
| 233 | EOF |
| 234 | GIT_EDITOR=./fail-if-editor-invoked git rebase --continue && |
| 235 | git log --format=%s -1 >actual && |
| 236 | echo commit2 >expect && |
| 237 | test_cmp expect actual |
| 238 | ' |
| 239 | |
| 240 | test_expect_success '--edit on continue overrides rebase.noEdit' ' |
| 241 | git config rebase.noEdit true && |
| 242 | git checkout commit2 && |
| 243 | test_must_fail git rebase -m --onto commit2^^ commit2^ && |
| 244 | echo resolved >foo && |
| 245 | git add foo && |
| 246 | ( |
| 247 | set_fake_editor && |
| 248 | FAKE_COMMIT_MESSAGE="edited on continue" \ |
| 249 | git rebase --continue --edit |
| 250 | ) && |
| 251 | test_write_lines "edited on continue" "" >expect && |
| 252 | git log --format=%B -1 >actual && |
| 253 | test_cmp expect actual |
| 254 | ' |
| 255 | |
| 256 | # This must be the last test in this file |
| 257 | test_expect_success '$EDITOR and friends are unchanged' ' |
| 258 | test_editor_unchanged |
| 259 | ' |
| 260 | |
| 261 | test_done |