mirror of
https://github.com/git/git.git
synced 2026-02-27 18:29:43 +00:00
subtree: validate --prefix against commit in split
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 cat-file 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>
This commit is contained in:
committed by
Junio C Hamano
parent
d529f3a197
commit
a606fcdceb
@@ -257,6 +257,9 @@ main () {
|
||||
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'"
|
||||
@@ -966,6 +969,12 @@ cmd_split () {
|
||||
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 cat-file -e "$rev:$dir" 2>/dev/null
|
||||
then
|
||||
die "fatal: '$dir' does not exist; use 'git subtree add'"
|
||||
fi
|
||||
repository=""
|
||||
if test "$#" = 2
|
||||
then
|
||||
|
||||
@@ -368,6 +368,28 @@ test_expect_success 'split requires path given by option --prefix must exist' '
|
||||
)
|
||||
'
|
||||
|
||||
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" &&
|
||||
|
||||
Reference in New Issue
Block a user