Johannes Schindelin | 6f6826c | 2007-06-03 01:31:28 +0100 | [diff] [blame] | 1 | #!/bin/sh |
| 2 | |
| 3 | test_description='git-filter-branch' |
| 4 | . ./test-lib.sh |
| 5 | |
| 6 | make_commit () { |
| 7 | lower=$(echo $1 | tr A-Z a-z) |
| 8 | echo $lower > $lower |
| 9 | git add $lower |
Junio C Hamano | aee078b | 2007-06-05 00:07:31 -0700 | [diff] [blame] | 10 | test_tick |
Johannes Schindelin | 6f6826c | 2007-06-03 01:31:28 +0100 | [diff] [blame] | 11 | git commit -m $1 |
| 12 | git tag $1 |
| 13 | } |
| 14 | |
| 15 | test_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 | |
Junio C Hamano | 5be6007 | 2007-07-02 22:52:14 -0700 | [diff] [blame] | 30 | H=$(git rev-parse H) |
Johannes Schindelin | 6f6826c | 2007-06-03 01:31:28 +0100 | [diff] [blame] | 31 | |
| 32 | test_expect_success 'rewrite identically' ' |
Johannes Schindelin | dfd05e3 | 2007-07-23 18:34:13 +0100 | [diff] [blame] | 33 | git-filter-branch branch |
Johannes Schindelin | 6f6826c | 2007-06-03 01:31:28 +0100 | [diff] [blame] | 34 | ' |
Johannes Schindelin | 6f6826c | 2007-06-03 01:31:28 +0100 | [diff] [blame] | 35 | test_expect_success 'result is really identical' ' |
Johannes Schindelin | dfd05e3 | 2007-07-23 18:34:13 +0100 | [diff] [blame] | 36 | test $H = $(git rev-parse HEAD) |
Johannes Schindelin | 6f6826c | 2007-06-03 01:31:28 +0100 | [diff] [blame] | 37 | ' |
| 38 | |
| 39 | test_expect_success 'rewrite, renaming a specific file' ' |
Johannes Schindelin | dfd05e3 | 2007-07-23 18:34:13 +0100 | [diff] [blame] | 40 | git-filter-branch -f --tree-filter "mv d doh || :" HEAD |
Johannes Schindelin | 6f6826c | 2007-06-03 01:31:28 +0100 | [diff] [blame] | 41 | ' |
| 42 | |
| 43 | test_expect_success 'test that the file was renamed' ' |
Johannes Schindelin | 46eb449 | 2007-10-17 03:23:10 +0100 | [diff] [blame] | 44 | test d = $(git show HEAD:doh) && |
| 45 | test -f doh && |
| 46 | test d = $(cat doh) |
Johannes Schindelin | 6f6826c | 2007-06-03 01:31:28 +0100 | [diff] [blame] | 47 | ' |
| 48 | |
Johannes Schindelin | dfd05e3 | 2007-07-23 18:34:13 +0100 | [diff] [blame] | 49 | git tag oldD HEAD~4 |
Johannes Schindelin | 9840906 | 2007-06-05 16:58:13 +0100 | [diff] [blame] | 50 | test_expect_success 'rewrite one branch, keeping a side branch' ' |
Johannes Schindelin | dfd05e3 | 2007-07-23 18:34:13 +0100 | [diff] [blame] | 51 | git branch modD oldD && |
| 52 | git-filter-branch -f --tree-filter "mv b boh || :" D..modD |
Johannes Schindelin | 9840906 | 2007-06-05 16:58:13 +0100 | [diff] [blame] | 53 | ' |
| 54 | |
| 55 | test_expect_success 'common ancestor is still common (unchanged)' ' |
Junio C Hamano | 5be6007 | 2007-07-02 22:52:14 -0700 | [diff] [blame] | 56 | test "$(git merge-base modD D)" = "$(git rev-parse B)" |
Johannes Schindelin | 9840906 | 2007-06-05 16:58:13 +0100 | [diff] [blame] | 57 | ' |
| 58 | |
Johannes Schindelin | 685ef54 | 2007-06-08 01:30:35 +0100 | [diff] [blame] | 59 | test_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" && |
Johannes Schindelin | dfd05e3 | 2007-07-23 18:34:13 +0100 | [diff] [blame] | 74 | git branch sub && |
| 75 | git-filter-branch -f --subdirectory-filter subdir refs/heads/sub |
Johannes Schindelin | 685ef54 | 2007-06-08 01:30:35 +0100 | [diff] [blame] | 76 | ' |
| 77 | |
| 78 | test_expect_success 'subdirectory filter result looks okay' ' |
Junio C Hamano | 5be6007 | 2007-07-02 22:52:14 -0700 | [diff] [blame] | 79 | test 2 = $(git rev-list sub | wc -l) && |
Johannes Schindelin | 685ef54 | 2007-06-08 01:30:35 +0100 | [diff] [blame] | 80 | git show sub:new && |
| 81 | ! git show sub:subdir |
| 82 | ' |
| 83 | |
Johannes Sixt | cfabd6e | 2007-06-08 23:28:50 +0200 | [diff] [blame] | 84 | test_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 && |
Johannes Schindelin | dfd05e3 | 2007-07-23 18:34:13 +0100 | [diff] [blame] | 95 | git branch sub-master && |
| 96 | git-filter-branch -f --subdirectory-filter subdir sub-master |
Johannes Sixt | cfabd6e | 2007-06-08 23:28:50 +0200 | [diff] [blame] | 97 | ' |
| 98 | |
| 99 | test_expect_success 'subdirectory filter result looks okay' ' |
Junio C Hamano | 5be6007 | 2007-07-02 22:52:14 -0700 | [diff] [blame] | 100 | test 3 = $(git rev-list -1 --parents sub-master | wc -w) && |
Johannes Sixt | cfabd6e | 2007-06-08 23:28:50 +0200 | [diff] [blame] | 101 | git show sub-master^:new && |
| 102 | git show sub-master^2:new && |
| 103 | ! git show sub:subdir |
| 104 | ' |
| 105 | |
Johannes Schindelin | 55f22ff | 2007-06-21 18:05:30 +0100 | [diff] [blame] | 106 | test_expect_success 'use index-filter to move into a subdirectory' ' |
Johannes Schindelin | dfd05e3 | 2007-07-23 18:34:13 +0100 | [diff] [blame] | 107 | git branch directorymoved && |
| 108 | git-filter-branch -f --index-filter \ |
Junio C Hamano | 5be6007 | 2007-07-02 22:52:14 -0700 | [diff] [blame] | 109 | "git ls-files -s | sed \"s-\\t-&newsubdir/-\" | |
Johannes Schindelin | 55f22ff | 2007-06-21 18:05:30 +0100 | [diff] [blame] | 110 | GIT_INDEX_FILE=\$GIT_INDEX_FILE.new \ |
Junio C Hamano | 5be6007 | 2007-07-02 22:52:14 -0700 | [diff] [blame] | 111 | git update-index --index-info && |
Johannes Schindelin | 55f22ff | 2007-06-21 18:05:30 +0100 | [diff] [blame] | 112 | mv \$GIT_INDEX_FILE.new \$GIT_INDEX_FILE" directorymoved && |
| 113 | test -z "$(git diff HEAD directorymoved:newsubdir)"' |
| 114 | |
Johannes Schindelin | 8c1ce0f | 2007-07-04 15:36:01 +0100 | [diff] [blame] | 115 | test_expect_success 'stops when msg filter fails' ' |
Johannes Schindelin | dfd05e3 | 2007-07-23 18:34:13 +0100 | [diff] [blame] | 116 | old=$(git rev-parse HEAD) && |
Johannes Sixt | fdd7d48 | 2007-11-27 13:10:19 +0100 | [diff] [blame] | 117 | ! git-filter-branch -f --msg-filter false HEAD && |
Johannes Schindelin | dfd05e3 | 2007-07-23 18:34:13 +0100 | [diff] [blame] | 118 | test $old = $(git rev-parse HEAD) && |
| 119 | rm -rf .git-rewrite |
Johannes Schindelin | 8c1ce0f | 2007-07-04 15:36:01 +0100 | [diff] [blame] | 120 | ' |
| 121 | |
Johannes Schindelin | f6b78c6 | 2007-07-03 17:50:19 +0100 | [diff] [blame] | 122 | test_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 && |
Johannes Schindelin | dfd05e3 | 2007-07-23 18:34:13 +0100 | [diff] [blame] | 127 | git branch preserved-author && |
| 128 | git-filter-branch -f --msg-filter "cat; \ |
Johannes Schindelin | 8c1ce0f | 2007-07-04 15:36:01 +0100 | [diff] [blame] | 129 | test \$GIT_COMMIT != $(git rev-parse master) || \ |
Johannes Schindelin | f6b78c6 | 2007-07-03 17:50:19 +0100 | [diff] [blame] | 130 | echo Hallo" \ |
| 131 | preserved-author && |
| 132 | test 1 = $(git rev-list --author="B V Uips" preserved-author | wc -l) |
| 133 | ' |
| 134 | |
| 135 | test_expect_success "remove a certain author's commits" ' |
| 136 | echo i > i && |
| 137 | test_tick && |
| 138 | git commit -m i i && |
Johannes Schindelin | dfd05e3 | 2007-07-23 18:34:13 +0100 | [diff] [blame] | 139 | git branch removed-author && |
| 140 | git-filter-branch -f --commit-filter "\ |
Johannes Schindelin | f6b78c6 | 2007-07-03 17:50:19 +0100 | [diff] [blame] | 141 | if [ \"\$GIT_AUTHOR_NAME\" = \"B V Uips\" ];\ |
| 142 | then\ |
Johannes Schindelin | f95eef1 | 2007-08-31 20:06:27 +0100 | [diff] [blame] | 143 | skip_commit \"\$@\"; |
Johannes Schindelin | f6b78c6 | 2007-07-03 17:50:19 +0100 | [diff] [blame] | 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 | |
Johannes Schindelin | dfd05e3 | 2007-07-23 18:34:13 +0100 | [diff] [blame] | 153 | test_expect_success 'barf on invalid name' ' |
| 154 | ! git filter-branch -f master xy-problem && |
| 155 | ! git filter-branch -f HEAD^ |
| 156 | ' |
| 157 | |
Johannes Schindelin | 7e0f170 | 2007-08-31 20:05:36 +0100 | [diff] [blame] | 158 | test_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 | |
Johannes Schindelin | 6f6826c | 2007-06-03 01:31:28 +0100 | [diff] [blame] | 168 | test_done |