t9801: check git-p4's branch detection with client spec enabled
authorVitor Antunes <vitor.hda@gmail.com>
Tue, 21 Apr 2015 22:49:29 +0000 (23:49 +0100)
committerJunio C Hamano <gitster@pobox.com>
Wed, 22 Apr 2015 17:11:18 +0000 (10:11 -0700)
Add failing scenario when branch detection (--detect-branches) is
enabled together with use client spec (--use-client-spec). In this
specific scenario git-p4 will break when the Perforce client view
removes part of the depot path, as in the following example:

//depot/branch1/base/... //client/branch1/...

The test case also includes an extra sub-file mapping to enforce
robustness check of git-p4's client view support:

//depot/branch1/base/dir/sub_file1 //client/branch1/sub_file1

Signed-off-by: Vitor Antunes <vitor.hda@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/t9801-git-p4-branch.sh
index 2bf142d09c784a0c2aac8d814674684a20a7c93b..36a7f511764747e349c62794d229e58f88ea4c50 100755 (executable)
@@ -504,6 +504,112 @@ test_expect_success 'use-client-spec detect-branches skips files in branches' '
        )
 '
 
+test_expect_success 'restart p4d' '
+       kill_p4d &&
+       start_p4d
+'
+
+#
+# 1: //depot/branch1/base/file1
+#    //depot/branch1/base/file2
+#    //depot/branch1/base/dir/sub_file1
+# 2: integrate //depot/branch1/base/... -> //depot/branch2/base/...
+# 3: //depot/branch1/base/file3
+# 4: //depot/branch1/base/file2 (edit)
+# 5: integrate //depot/branch1/base/... -> //depot/branch3/base/...
+#
+# Note: the client view removes the "base" folder from the workspace
+#       and moves sub_file1 one level up.
+test_expect_success 'add simple p4 branches with common base folder on each branch' '
+       (
+               cd "$cli" &&
+               client_view "//depot/branch1/base/... //client/branch1/..." \
+                           "//depot/branch1/base/dir/sub_file1 //client/branch1/sub_file1" \
+                           "//depot/branch2/base/... //client/branch2/..." \
+                           "//depot/branch3/base/... //client/branch3/..." &&
+               mkdir -p branch1 &&
+               cd branch1 &&
+               echo file1 >file1 &&
+               echo file2 >file2 &&
+               mkdir dir &&
+               echo sub_file1 >sub_file1 &&
+               p4 add file1 file2 sub_file1 &&
+               p4 submit -d "Create branch1" &&
+               p4 integrate //depot/branch1/base/... //depot/branch2/base/... &&
+               p4 submit -d "Integrate branch2 from branch1" &&
+               echo file3 >file3 &&
+               p4 add file3 &&
+               p4 submit -d "add file3 in branch1" &&
+               p4 open file2 &&
+               echo update >>file2 &&
+               p4 submit -d "update file2 in branch1" &&
+               p4 integrate //depot/branch1/base/... //depot/branch3/base/... &&
+               p4 submit -d "Integrate branch3 from branch1"
+       )
+'
+
+# Configure branches through git-config and clone them.
+# All files are tested to make sure branches were cloned correctly.
+# Finally, make an update to branch1 on P4 side to check if it is imported
+# correctly by git p4.
+# git p4 is expected to use the client view to also not include the common
+# "base" folder in the imported directory structure.
+test_expect_success 'git p4 clone simple branches with base folder on server side' '
+       test_create_repo "$git" &&
+       (
+               cd "$git" &&
+               git config git-p4.branchList branch1:branch2 &&
+               git config --add git-p4.branchList branch1:branch3 &&
+               git p4 clone --dest=. --use-client-spec  --detect-branches //depot@all &&
+               git log --all --graph --decorate --stat &&
+               git reset --hard p4/depot/branch1 &&
+               test -f file1 &&
+               test -f file2 &&
+               test -f file3 &&
+               test -f sub_file1 &&
+               grep update file2 &&
+               git reset --hard p4/depot/branch2 &&
+               test -f file1 &&
+               test -f file2 &&
+               test ! -f file3 &&
+               test -f sub_file1 &&
+               ! grep update file2 &&
+               git reset --hard p4/depot/branch3 &&
+               test -f file1 &&
+               test -f file2 &&
+               test -f file3 &&
+               test -f sub_file1 &&
+               grep update file2 &&
+               cd "$cli" &&
+               cd branch1 &&
+               p4 edit file2 &&
+               echo file2_ >>file2 &&
+               p4 submit -d "update file2 in branch1" &&
+               cd "$git" &&
+               git reset --hard p4/depot/branch1 &&
+               git p4 rebase &&
+               grep file2_ file2
+       )
+'
+
+# Now update a file in one of the branches in git and submit to P4
+test_expect_failure 'Update a file in git side and submit to P4 using client view' '
+       test_when_finished cleanup_git &&
+       (
+               cd "$git" &&
+               git reset --hard p4/depot/branch1 &&
+               echo "client spec" >> file1 &&
+               git add -u . &&
+               git commit -m "update file1 in branch1" &&
+               git config git-p4.skipSubmitEdit true &&
+               git p4 submit --verbose &&
+               cd "$cli" &&
+               p4 sync ... &&
+               cd branch1 &&
+               grep "client spec" file1
+       )
+'
+
 test_expect_success 'kill p4d' '
        kill_p4d
 '