Skip to content

Commit

Permalink
filter-branch: handle "disappearing tree" case correctly in subdir fi…
Browse files Browse the repository at this point in the history
…lter

The subdirectory filter had a bug to notice that the commit in question
did not have anything in the path-limited part of the tree.  $commit:$path
does not name an empty tree when $path does not appear in $commit.

This should fix it.  The additional test in t7003 is originally from Kevin
Ballard but with fixups.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
gitster committed Mar 8, 2008
1 parent c8744d6 commit 5b044ac
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 1 deletion.
11 changes: 10 additions & 1 deletion git-filter-branch.sh
Expand Up @@ -252,7 +252,16 @@ while read commit parents; do
git read-tree -i -m $commit
;;
*)
git read-tree -i -m $commit:"$filter_subdir"
# The commit may not have the subdirectory at all
err=$(git read-tree -i -m $commit:"$filter_subdir" 2>&1) || {
if ! git rev-parse --verify $commit:"$filter_subdir" 2>/dev/null
then
rm -f "$GIT_INDEX_FILE"
else
echo >&2 "$err"
false
fi
}
esac || die "Could not initialize the index"

GIT_COMMIT=$commit
Expand Down
24 changes: 24 additions & 0 deletions t/t7003-filter-branch.sh
Expand Up @@ -179,4 +179,28 @@ test_expect_success 'Name needing quotes' '
'

test_expect_success 'Subdirectory filter with disappearing trees' '
git reset --hard &&
git checkout master &&
mkdir foo &&
touch foo/bar &&
git add foo &&
test_tick &&
git commit -m "Adding foo" &&
git rm -r foo &&
test_tick &&
git commit -m "Removing foo" &&
mkdir foo &&
touch foo/bar &&
git add foo &&
test_tick &&
git commit -m "Re-adding foo" &&
git filter-branch -f --subdirectory-filter foo &&
test $(git rev-list master | wc -l) = 3
'

test_done

0 comments on commit 5b044ac

Please sign in to comment.