t / t7003-filter-branch.shon commit filter-branch: handle filenames that need quoting (1fe32cb)
   1#!/bin/sh
   2
   3test_description='git-filter-branch'
   4. ./test-lib.sh
   5
   6make_commit () {
   7        lower=$(echo $1 | tr A-Z a-z)
   8        echo $lower > $lower
   9        git add $lower
  10        test_tick
  11        git commit -m $1
  12        git tag $1
  13}
  14
  15test_expect_success 'setup' '
  16        make_commit A
  17        make_commit B
  18        git checkout -b branch B
  19        make_commit D
  20        make_commit E
  21        git checkout master
  22        make_commit C
  23        git checkout branch
  24        git merge C
  25        git tag F
  26        make_commit G
  27        make_commit H
  28'
  29
  30H=$(git rev-parse H)
  31
  32test_expect_success 'rewrite identically' '
  33        git-filter-branch branch
  34'
  35test_expect_success 'result is really identical' '
  36        test $H = $(git rev-parse HEAD)
  37'
  38
  39test_expect_success 'rewrite, renaming a specific file' '
  40        git-filter-branch -f --tree-filter "mv d doh || :" HEAD
  41'
  42
  43test_expect_success 'test that the file was renamed' '
  44        test d = $(git show HEAD:doh) &&
  45        test -f doh &&
  46        test d = $(cat doh)
  47'
  48
  49git tag oldD HEAD~4
  50test_expect_success 'rewrite one branch, keeping a side branch' '
  51        git branch modD oldD &&
  52        git-filter-branch -f --tree-filter "mv b boh || :" D..modD
  53'
  54
  55test_expect_success 'common ancestor is still common (unchanged)' '
  56        test "$(git merge-base modD D)" = "$(git rev-parse B)"
  57'
  58
  59test_expect_success 'filter subdirectory only' '
  60        mkdir subdir &&
  61        touch subdir/new &&
  62        git add subdir/new &&
  63        test_tick &&
  64        git commit -m "subdir" &&
  65        echo H > a &&
  66        test_tick &&
  67        git commit -m "not subdir" a &&
  68        echo A > subdir/new &&
  69        test_tick &&
  70        git commit -m "again subdir" subdir/new &&
  71        git rm a &&
  72        test_tick &&
  73        git commit -m "again not subdir" &&
  74        git branch sub &&
  75        git-filter-branch -f --subdirectory-filter subdir refs/heads/sub
  76'
  77
  78test_expect_success 'subdirectory filter result looks okay' '
  79        test 2 = $(git rev-list sub | wc -l) &&
  80        git show sub:new &&
  81        ! git show sub:subdir
  82'
  83
  84test_expect_success 'setup and filter history that requires --full-history' '
  85        git checkout master &&
  86        mkdir subdir &&
  87        echo A > subdir/new &&
  88        git add subdir/new &&
  89        test_tick &&
  90        git commit -m "subdir on master" subdir/new &&
  91        git rm a &&
  92        test_tick &&
  93        git commit -m "again subdir on master" &&
  94        git merge branch &&
  95        git branch sub-master &&
  96        git-filter-branch -f --subdirectory-filter subdir sub-master
  97'
  98
  99test_expect_success 'subdirectory filter result looks okay' '
 100        test 3 = $(git rev-list -1 --parents sub-master | wc -w) &&
 101        git show sub-master^:new &&
 102        git show sub-master^2:new &&
 103        ! git show sub:subdir
 104'
 105
 106test_expect_success 'use index-filter to move into a subdirectory' '
 107        git branch directorymoved &&
 108        git-filter-branch -f --index-filter \
 109                 "git ls-files -s | sed \"s-\\t-&newsubdir/-\" |
 110                  GIT_INDEX_FILE=\$GIT_INDEX_FILE.new \
 111                        git update-index --index-info &&
 112                  mv \$GIT_INDEX_FILE.new \$GIT_INDEX_FILE" directorymoved &&
 113        test -z "$(git diff HEAD directorymoved:newsubdir)"'
 114
 115test_expect_success 'stops when msg filter fails' '
 116        old=$(git rev-parse HEAD) &&
 117        ! git-filter-branch -f --msg-filter false HEAD &&
 118        test $old = $(git rev-parse HEAD) &&
 119        rm -rf .git-rewrite
 120'
 121
 122test_expect_success 'author information is preserved' '
 123        : > i &&
 124        git add i &&
 125        test_tick &&
 126        GIT_AUTHOR_NAME="B V Uips" git commit -m bvuips &&
 127        git branch preserved-author &&
 128        git-filter-branch -f --msg-filter "cat; \
 129                        test \$GIT_COMMIT != $(git rev-parse master) || \
 130                        echo Hallo" \
 131                preserved-author &&
 132        test 1 = $(git rev-list --author="B V Uips" preserved-author | wc -l)
 133'
 134
 135test_expect_success "remove a certain author's commits" '
 136        echo i > i &&
 137        test_tick &&
 138        git commit -m i i &&
 139        git branch removed-author &&
 140        git-filter-branch -f --commit-filter "\
 141                if [ \"\$GIT_AUTHOR_NAME\" = \"B V Uips\" ];\
 142                then\
 143                        skip_commit \"\$@\";
 144                else\
 145                        git commit-tree \"\$@\";\
 146                fi" removed-author &&
 147        cnt1=$(git rev-list master | wc -l) &&
 148        cnt2=$(git rev-list removed-author | wc -l) &&
 149        test $cnt1 -eq $(($cnt2 + 1)) &&
 150        test 0 = $(git rev-list --author="B V Uips" removed-author | wc -l)
 151'
 152
 153test_expect_success 'barf on invalid name' '
 154        ! git filter-branch -f master xy-problem &&
 155        ! git filter-branch -f HEAD^
 156'
 157
 158test_expect_success '"map" works in commit filter' '
 159        git filter-branch -f --commit-filter "\
 160                parent=\$(git rev-parse \$GIT_COMMIT^) &&
 161                mapped=\$(map \$parent) &&
 162                actual=\$(echo \"\$@\" | sed \"s/^.*-p //\") &&
 163                test \$mapped = \$actual &&
 164                git commit-tree \"\$@\";" master~2..master &&
 165        git rev-parse --verify master
 166'
 167
 168test_expect_success 'Name needing quotes' '
 169
 170        git checkout -b rerere A &&
 171        mkdir foo &&
 172        name="れれれ" &&
 173        >foo/$name &&
 174        git add foo &&
 175        git commit -m "Adding a file" &&
 176        git filter-branch --tree-filter "rm -fr foo" &&
 177        ! git ls-files --error-unmatch "foo/$name" &&
 178        test $(git rev-parse --verify rerere) != $(git rev-parse --verify A)
 179
 180'
 181
 182test_done