Re: [PATCH] Add test for filter-branch on a subdirectory that's been added and deleted and re-added
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Mar 8, 2008, 20:25 UTC
- Message-ID
- <7vejalt12h.fsf@gitster.siamese.dyndns.org>
- In-Reply-To
- <91DF7A2E-540B-4AD6-91B2-BDB0B04EFC71@sb.org>
This will hopefully be the final version.
-- >8 -- filter-branch: handle "disappearing tree" case correctly in subdir filter
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> ---
* -f is needed because the previous one is about aborting the filter and
leaving the "original" namespace.git-filter-branch.sh | 11 ++++++++++- t/t7003-filter-branch.sh | 24 ++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletions(-)
diff --git a/git-filter-branch.sh b/git-filter-branch.sh index 49e13f0..010353a 100755 --- a/git-filter-branch.sh +++ b/git-filter-branch.sh @@ -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 diff --git a/t/t7003-filter-branch.sh b/t/t7003-filter-branch.sh index 868babc..6e14bf1 100755 --- a/t/t7003-filter-branch.sh +++ b/t/t7003-filter-branch.sh @@ -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