1#!/bin/sh
   2test_description='git rebase + directory rename tests'
   4. ./test-lib.sh
   6. "$TEST_DIRECTORY"/lib-rebase.sh
   7test_expect_success 'setup testcase where directory rename should be detected' '
   9        test_create_repo dir-rename &&
  10        (
  11                cd dir-rename &&
  12                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                git branch O &&
  22                git branch A &&
  23                git branch B &&
  24                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                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'
  37test_expect_success 'rebase --interactive: directory rename detected' '
  39        (
  40                cd dir-rename &&
  41                git checkout B^0 &&
  43                set_fake_editor &&
  45                FAKE_LINES="1" git rebase --interactive A &&
  46                git ls-files -s >out &&
  48                test_line_count = 5 out &&
  49                test_path_is_file y/d &&
  51                test_path_is_missing x/d
  52        )
  53'
  54test_expect_failure 'rebase (am): directory rename detected' '
  56        (
  57                cd dir-rename &&
  58                git checkout B^0 &&
  60                git rebase A &&
  62                git ls-files -s >out &&
  64                test_line_count = 5 out &&
  65                test_path_is_file y/d &&
  67                test_path_is_missing x/d
  68        )
  69'
  70test_expect_success 'rebase --merge: directory rename detected' '
  72        (
  73                cd dir-rename &&
  74                git checkout B^0 &&
  76                git rebase --merge A &&
  78                git ls-files -s >out &&
  80                test_line_count = 5 out &&
  81                test_path_is_file y/d &&
  83                test_path_is_missing x/d
  84        )
  85'
  86test_expect_failure 'am: directory rename detected' '
  88        (
  89                cd dir-rename &&
  90                git checkout A^0 &&
  92                git format-patch -1 B &&
  94                git am --3way 0001*.patch &&
  96                git ls-files -s >out &&
  98                test_line_count = 5 out &&
  99                test_path_is_file y/d &&
 101                test_path_is_missing x/d
 102        )
 103'
 104test_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                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                git branch O &&
 119                git branch A &&
 120                git branch B &&
 121                git checkout A &&
 123                echo v2 >project_info &&
 124                git add project_info &&
 125                git commit -m "Modify project_info" &&
 126                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'
 135test_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                git checkout B^0 &&
 142                set_fake_editor &&
 144                test_must_fail env FAKE_LINES="1" git rebase --interactive A &&
 145                git ls-files -s >out &&
 147                test_line_count = 6 out &&
 148                test_path_is_file x/a &&
 150                test_path_is_file x/b &&
 151                test_path_is_missing x/c
 152        )
 153'
 154test_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                git checkout B^0 &&
 161                set_fake_editor &&
 163                test_must_fail git rebase A &&
 164                git ls-files -s >out &&
 166                test_line_count = 6 out &&
 167                test_path_is_file x/a &&
 169                test_path_is_file x/b &&
 170                test_path_is_missing x/c
 171        )
 172'
 173test_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                git checkout B^0 &&
 180                set_fake_editor &&
 182                test_must_fail git rebase --merge A &&
 183                git ls-files -s >out &&
 185                test_line_count = 6 out &&
 186                test_path_is_file x/a &&
 188                test_path_is_file x/b &&
 189                test_path_is_missing x/c
 190        )
 191'
 192test_expect_success 'am: NO directory rename' '
 194        test_when_finished "git -C no-dir-rename am --abort" &&
 195        (
 196                cd no-dir-rename &&
 197                git checkout A^0 &&
 199                git format-patch -1 B &&
 201                test_must_fail git am --3way 0001*.patch &&
 203                git ls-files -s >out &&
 205                test_line_count = 6 out &&
 206                test_path_is_file x/a &&
 208                test_path_is_file x/b &&
 209                test_path_is_missing x/c
 210        )
 211'
 212test_done