Merge branch 'jt/t1450-fsck-corrupt-packfile' into maint
[git] / t / t7009-filter-branch-null-sha1.sh
1 #!/bin/sh
2
3 test_description='filter-branch removal of trees with null sha1'
4 . ./test-lib.sh
5
6 test_expect_success 'setup: base commits' '
7         test_commit one &&
8         test_commit two &&
9         test_commit three
10 '
11
12 test_expect_success 'setup: a commit with a bogus null sha1 in the tree' '
13         {
14                 git ls-tree HEAD &&
15                 printf "160000 commit $_z40\\tbroken\\n"
16         } >broken-tree &&
17         echo "add broken entry" >msg &&
18
19         tree=$(git mktree <broken-tree) &&
20         test_tick &&
21         commit=$(git commit-tree $tree -p HEAD <msg) &&
22         git update-ref HEAD "$commit"
23 '
24
25 # we have to make one more commit on top removing the broken
26 # entry, since otherwise our index does not match HEAD (and filter-branch will
27 # complain). We could make the index match HEAD, but doing so would involve
28 # writing a null sha1 into the index.
29 test_expect_success 'setup: bring HEAD and index in sync' '
30         test_tick &&
31         git commit -a -m "back to normal"
32 '
33
34 test_expect_success 'noop filter-branch complains' '
35         test_must_fail git filter-branch \
36                 --force --prune-empty \
37                 --index-filter "true"
38 '
39
40 test_expect_success 'filter commands are still checked' '
41         test_must_fail git filter-branch \
42                 --force --prune-empty \
43                 --index-filter "git rm --cached --ignore-unmatch three.t"
44 '
45
46 test_expect_success 'removing the broken entry works' '
47         echo three >expect &&
48         git filter-branch \
49                 --force --prune-empty \
50                 --index-filter "git rm --cached --ignore-unmatch broken" &&
51         git log -1 --format=%s >actual &&
52         test_cmp expect actual
53 '
54
55 test_done