summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2008-03-11 07:38:29 (GMT)
committerJunio C Hamano <gitster@pobox.com>2008-03-11 07:38:29 (GMT)
commit92aeb994d3195d3601df2e37052d60f9a6738b61 (patch)
treea6eb221be005f0af2eb0b16f5c4eb07cd8b0b90c
parentb50396d16cb687eccb2c2c9160b30f17e20a543f (diff)
parent5b044ac3879b0950675f0e762f1dccbbb9f4001e (diff)
downloadgit-92aeb994d3195d3601df2e37052d60f9a6738b61.zip
git-92aeb994d3195d3601df2e37052d60f9a6738b61.tar.gz
git-92aeb994d3195d3601df2e37052d60f9a6738b61.tar.bz2
Merge branch 'kb/maint-filter-branch-disappear' into maint
* kb/maint-filter-branch-disappear: filter-branch: handle "disappearing tree" case correctly in subdir filter
-rwxr-xr-xgit-filter-branch.sh11
-rwxr-xr-xt/t7003-filter-branch.sh24
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