|  | #!/bin/sh | 
|  |  | 
|  | test_description='filter-branch removal of trees with null sha1' | 
|  |  | 
|  | . ./test-lib.sh | 
|  |  | 
|  | test_expect_success 'setup: base commits' ' | 
|  | test_commit one && | 
|  | test_commit two && | 
|  | test_commit three | 
|  | ' | 
|  |  | 
|  | test_expect_success 'setup: a commit with a bogus null sha1 in the tree' ' | 
|  | { | 
|  | git ls-tree HEAD && | 
|  | printf "160000 commit $ZERO_OID\\tbroken\\n" | 
|  | } >broken-tree && | 
|  | echo "add broken entry" >msg && | 
|  |  | 
|  | tree=$(git mktree <broken-tree) && | 
|  | test_tick && | 
|  | commit=$(git commit-tree $tree -p HEAD <msg) && | 
|  | git update-ref HEAD "$commit" | 
|  | ' | 
|  |  | 
|  | # we have to make one more commit on top removing the broken | 
|  | # entry, since otherwise our index does not match HEAD (and filter-branch will | 
|  | # complain). We could make the index match HEAD, but doing so would involve | 
|  | # writing a null sha1 into the index. | 
|  | test_expect_success 'setup: bring HEAD and index in sync' ' | 
|  | test_tick && | 
|  | git commit -a -m "back to normal" | 
|  | ' | 
|  |  | 
|  | test_expect_success 'noop filter-branch complains' ' | 
|  | test_must_fail git filter-branch \ | 
|  | --force --prune-empty \ | 
|  | --index-filter "true" | 
|  | ' | 
|  |  | 
|  | test_expect_success 'filter commands are still checked' ' | 
|  | test_must_fail git filter-branch \ | 
|  | --force --prune-empty \ | 
|  | --index-filter "git rm --cached --ignore-unmatch three.t" | 
|  | ' | 
|  |  | 
|  | test_expect_success 'removing the broken entry works' ' | 
|  | echo three >expect && | 
|  | git filter-branch \ | 
|  | --force --prune-empty \ | 
|  | --index-filter "git rm --cached --ignore-unmatch broken" && | 
|  | git log -1 --format=%s >actual && | 
|  | test_cmp expect actual | 
|  | ' | 
|  |  | 
|  | test_done |