git subtree split currently validates --prefix against the working tree.
This breaks when splitting an older commit or when the working tree does
not contain the subtree, even though the commit does.
For example:
git subtree split --prefix=pkg <commit>
fails if pkg was removed later, even though it exists in <commit>.
Fix this by validating the prefix against the specified commit using
git ls-tree instead of the working tree.
Add a test to ensure this behavior does not regress.
Signed-off-by: Pushkar Singh <pushkarkumarsingh1970@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
test -e "$arg_prefix" &&
die "fatal: prefix '$arg_prefix' already exists."
;;
+ split)
+ # checked later against the commit, not the working tree
+ ;;
*)
test -e "$arg_prefix" ||
die "fatal: '$arg_prefix' does not exist; use 'git subtree add'"
else
die "fatal: you must provide exactly one revision, and optionally a repository. Got: '$*'"
fi
+
+ # Now validate prefix against the commit, not the working tree
+ if ! git ls-tree -d "$rev" -- "$dir" >/dev/null
+ then
+ die "fatal: '$dir' does not exist in commit $rev"
+ fi
repository=""
if test "$#" = 2
then
)
'
+test_expect_success 'split works when prefix exists in commit but not in working tree' '
+ subtree_test_create_repo "$test_count" &&
+ (
+ cd "$test_count" &&
+
+ # create subtree
+ mkdir pkg &&
+ echo ok >pkg/file &&
+ git add pkg &&
+ git commit -m "add pkg" &&
+ good=$(git rev-parse HEAD) &&
+
+ # remove it from working tree in later commit
+ git rm -r pkg &&
+ git commit -m "remove pkg" &&
+
+ # must still be able to split using the old commit
+ git subtree split --prefix=pkg "$good" >out &&
+ test -s out
+ )
+'
+
test_expect_success 'split rejects flags for add' '
subtree_test_create_repo "$test_count" &&
subtree_test_create_repo "$test_count/sub proj" &&