t / t3401-rebase-and-am-rename.shon commit t3427: accommodate for the `rebase --merge` backend having been replaced (f67336d)
   1#!/bin/sh
   2
   3test_description='git rebase + directory rename tests'
   4
   5. ./test-lib.sh
   6. "$TEST_DIRECTORY"/lib-rebase.sh
   7
   8test_expect_success 'setup testcase where directory rename should be detected' '
   9        test_create_repo dir-rename &&
  10        (
  11                cd dir-rename &&
  12
  13                mkdir x &&
  14                test_seq  1 10 >x/a &&
  15                test_seq 11 20 >x/b &&
  16                test_seq 21 30 >x/c &&
  17                test_write_lines a b c d e f g h i >l &&
  18                git add x l &&
  19                git commit -m "Initial" &&
  20
  21                git branch O &&
  22                git branch A &&
  23                git branch B &&
  24
  25                git checkout A &&
  26                git mv x y &&
  27                git mv l letters &&
  28                git commit -m "Rename x to y, l to letters" &&
  29
  30                git checkout B &&
  31                echo j >>l &&
  32                test_seq 31 40 >x/d &&
  33                git add l x/d &&
  34                git commit -m "Modify l, add x/d"
  35        )
  36'
  37
  38test_expect_success 'rebase --interactive: directory rename detected' '
  39        (
  40                cd dir-rename &&
  41
  42                git checkout B^0 &&
  43
  44                set_fake_editor &&
  45                FAKE_LINES="1" git -c merge.directoryRenames=true rebase --interactive A &&
  46
  47                git ls-files -s >out &&
  48                test_line_count = 5 out &&
  49
  50                test_path_is_file y/d &&
  51                test_path_is_missing x/d
  52        )
  53'
  54
  55test_expect_failure 'rebase (am): directory rename detected' '
  56        (
  57                cd dir-rename &&
  58
  59                git checkout B^0 &&
  60
  61                git -c merge.directoryRenames=true rebase A &&
  62
  63                git ls-files -s >out &&
  64                test_line_count = 5 out &&
  65
  66                test_path_is_file y/d &&
  67                test_path_is_missing x/d
  68        )
  69'
  70
  71test_expect_success 'rebase --merge: directory rename detected' '
  72        (
  73                cd dir-rename &&
  74
  75                git checkout B^0 &&
  76
  77                git -c merge.directoryRenames=true rebase --merge A &&
  78
  79                git ls-files -s >out &&
  80                test_line_count = 5 out &&
  81
  82                test_path_is_file y/d &&
  83                test_path_is_missing x/d
  84        )
  85'
  86
  87test_expect_failure 'am: directory rename detected' '
  88        (
  89                cd dir-rename &&
  90
  91                git checkout A^0 &&
  92
  93                git format-patch -1 B &&
  94
  95                git -c merge.directoryRenames=true am --3way 0001*.patch &&
  96
  97                git ls-files -s >out &&
  98                test_line_count = 5 out &&
  99
 100                test_path_is_file y/d &&
 101                test_path_is_missing x/d
 102        )
 103'
 104
 105test_expect_success 'setup testcase where directory rename should NOT be detected' '
 106        test_create_repo no-dir-rename &&
 107        (
 108                cd no-dir-rename &&
 109
 110                mkdir x &&
 111                test_seq  1 10 >x/a &&
 112                test_seq 11 20 >x/b &&
 113                test_seq 21 30 >x/c &&
 114                echo original >project_info &&
 115                git add x project_info &&
 116                git commit -m "Initial" &&
 117
 118                git branch O &&
 119                git branch A &&
 120                git branch B &&
 121
 122                git checkout A &&
 123                echo v2 >project_info &&
 124                git add project_info &&
 125                git commit -m "Modify project_info" &&
 126
 127                git checkout B &&
 128                mkdir y &&
 129                git mv x/c y/c &&
 130                echo v1 >project_info &&
 131                git add project_info &&
 132                git commit -m "Rename x/c to y/c, modify project_info"
 133        )
 134'
 135
 136test_expect_success 'rebase --interactive: NO directory rename' '
 137        test_when_finished "git -C no-dir-rename rebase --abort" &&
 138        (
 139                cd no-dir-rename &&
 140
 141                git checkout B^0 &&
 142
 143                set_fake_editor &&
 144                test_must_fail env FAKE_LINES="1" git rebase --interactive A &&
 145
 146                git ls-files -s >out &&
 147                test_line_count = 6 out &&
 148
 149                test_path_is_file x/a &&
 150                test_path_is_file x/b &&
 151                test_path_is_missing x/c
 152        )
 153'
 154
 155test_expect_success 'rebase (am): NO directory rename' '
 156        test_when_finished "git -C no-dir-rename rebase --abort" &&
 157        (
 158                cd no-dir-rename &&
 159
 160                git checkout B^0 &&
 161
 162                set_fake_editor &&
 163                test_must_fail git rebase A &&
 164
 165                git ls-files -s >out &&
 166                test_line_count = 6 out &&
 167
 168                test_path_is_file x/a &&
 169                test_path_is_file x/b &&
 170                test_path_is_missing x/c
 171        )
 172'
 173
 174test_expect_success 'rebase --merge: NO directory rename' '
 175        test_when_finished "git -C no-dir-rename rebase --abort" &&
 176        (
 177                cd no-dir-rename &&
 178
 179                git checkout B^0 &&
 180
 181                set_fake_editor &&
 182                test_must_fail git rebase --merge A &&
 183
 184                git ls-files -s >out &&
 185                test_line_count = 6 out &&
 186
 187                test_path_is_file x/a &&
 188                test_path_is_file x/b &&
 189                test_path_is_missing x/c
 190        )
 191'
 192
 193test_expect_success 'am: NO directory rename' '
 194        test_when_finished "git -C no-dir-rename am --abort" &&
 195        (
 196                cd no-dir-rename &&
 197
 198                git checkout A^0 &&
 199
 200                git format-patch -1 B &&
 201
 202                test_must_fail git am --3way 0001*.patch &&
 203
 204                git ls-files -s >out &&
 205                test_line_count = 6 out &&
 206
 207                test_path_is_file x/a &&
 208                test_path_is_file x/b &&
 209                test_path_is_missing x/c
 210        )
 211'
 212
 213test_done