| #!/bin/sh | |
| test_description='Clone repositories with path case variations' | |
| . ./lib-git-p4.sh | |
| test_expect_success 'start p4d with case folding enabled' ' | |
| start_p4d -C1 | |
| ' | |
| test_expect_success 'Create a repo with path case variations' ' | |
| client_view "//depot/... //client/..." && | |
| ( | |
| cd "$cli" && | |
| mkdir -p Path/to && | |
| >Path/to/File2.txt && | |
| p4 add Path/to/File2.txt && | |
| p4 submit -d "Add file2" && | |
| rm -rf Path && | |
| mkdir -p path/TO && | |
| >path/TO/file1.txt && | |
| p4 add path/TO/file1.txt && | |
| p4 submit -d "Add file1" && | |
| rm -rf path && | |
| mkdir -p path/to && | |
| >path/to/file3.txt && | |
| p4 add path/to/file3.txt && | |
| p4 submit -d "Add file3" && | |
| rm -rf path && | |
| mkdir -p x-outside-spec && | |
| >x-outside-spec/file4.txt && | |
| p4 add x-outside-spec/file4.txt && | |
| p4 submit -d "Add file4" && | |
| rm -rf x-outside-spec | |
| ) | |
| ' | |
| test_expect_success 'Clone root' ' | |
| client_view "//depot/... //client/..." && | |
| test_when_finished cleanup_git && | |
| ( | |
| cd "$git" && | |
| git init . && | |
| git config core.ignorecase false && | |
| git p4 clone --use-client-spec --destination="$git" //depot && | |
| # This method is used instead of "test -f" to ensure the case is | |
| # checked even if the test is executed on case-insensitive file systems. | |
| # All files are there as expected although the path cases look random. | |
| cat >expect <<-\EOF && | |
| Path/to/File2.txt | |
| path/TO/file1.txt | |
| path/to/file3.txt | |
| x-outside-spec/file4.txt | |
| EOF | |
| git ls-files >actual && | |
| test_cmp expect actual | |
| ) | |
| ' | |
| test_expect_success 'Clone root (ignorecase)' ' | |
| client_view "//depot/... //client/..." && | |
| test_when_finished cleanup_git && | |
| ( | |
| cd "$git" && | |
| git init . && | |
| git config core.ignorecase true && | |
| git p4 clone --use-client-spec --destination="$git" //depot && | |
| # This method is used instead of "test -f" to ensure the case is | |
| # checked even if the test is executed on case-insensitive file systems. | |
| # All files are there as expected although the path cases look random. | |
| cat >expect <<-\EOF && | |
| path/TO/File2.txt | |
| path/TO/file1.txt | |
| path/TO/file3.txt | |
| x-outside-spec/file4.txt | |
| EOF | |
| git ls-files >actual && | |
| test_cmp expect actual | |
| ) | |
| ' | |
| test_expect_success 'Clone root and ignore one file' ' | |
| client_view \ | |
| "//depot/... //client/..." \ | |
| "-//depot/path/TO/file1.txt //client/path/TO/file1.txt" && | |
| test_when_finished cleanup_git && | |
| ( | |
| cd "$git" && | |
| git init . && | |
| git config core.ignorecase false && | |
| git p4 clone --use-client-spec --destination="$git" //depot && | |
| # We ignore one file in the client spec and all path cases change from | |
| # "TO" to "to"! | |
| cat >expect <<-\EOF && | |
| Path/to/File2.txt | |
| path/to/file3.txt | |
| x-outside-spec/file4.txt | |
| EOF | |
| git ls-files >actual && | |
| test_cmp expect actual | |
| ) | |
| ' | |
| test_expect_success 'Clone root and ignore one file (ignorecase)' ' | |
| client_view \ | |
| "//depot/... //client/..." \ | |
| "-//depot/path/TO/file1.txt //client/path/TO/file1.txt" && | |
| test_when_finished cleanup_git && | |
| ( | |
| cd "$git" && | |
| git init . && | |
| git config core.ignorecase true && | |
| git p4 clone --use-client-spec --destination="$git" //depot && | |
| # We ignore one file in the client spec and all path cases change from | |
| # "TO" to "to"! | |
| cat >expect <<-\EOF && | |
| Path/to/File2.txt | |
| Path/to/file3.txt | |
| x-outside-spec/file4.txt | |
| EOF | |
| git ls-files >actual && | |
| test_cmp expect actual | |
| ) | |
| ' | |
| test_expect_success 'Clone path' ' | |
| client_view "//depot/Path/... //client/..." && | |
| test_when_finished cleanup_git && | |
| ( | |
| cd "$git" && | |
| git init . && | |
| git config core.ignorecase false && | |
| git p4 clone --use-client-spec --destination="$git" //depot && | |
| cat >expect <<-\EOF && | |
| to/File2.txt | |
| EOF | |
| git ls-files >actual && | |
| test_cmp expect actual | |
| ) | |
| ' | |
| test_expect_success 'Clone path (ignorecase)' ' | |
| client_view "//depot/Path/... //client/..." && | |
| test_when_finished cleanup_git && | |
| ( | |
| cd "$git" && | |
| git init . && | |
| git config core.ignorecase true && | |
| git p4 clone --use-client-spec --destination="$git" //depot && | |
| cat >expect <<-\EOF && | |
| TO/File2.txt | |
| TO/file1.txt | |
| TO/file3.txt | |
| EOF | |
| git ls-files >actual && | |
| test_cmp expect actual | |
| ) | |
| ' | |
| # It looks like P4 determines the path case based on the first file in | |
| # lexicographical order. Please note the lower case "to" directory for all | |
| # files triggered through the addition of "File0.txt". | |
| test_expect_success 'Add a new file and clone path with new file (ignorecase)' ' | |
| client_view "//depot/... //client/..." && | |
| ( | |
| cd "$cli" && | |
| mkdir -p Path/to && | |
| >Path/to/File0.txt && | |
| p4 add Path/to/File0.txt && | |
| p4 submit -d "Add file" && | |
| rm -rf Path | |
| ) && | |
| client_view "//depot/Path/... //client/..." && | |
| test_when_finished cleanup_git && | |
| ( | |
| cd "$git" && | |
| git init . && | |
| git config core.ignorecase true && | |
| git p4 clone --use-client-spec --destination="$git" //depot && | |
| cat >expect <<-\EOF && | |
| to/File0.txt | |
| to/File2.txt | |
| to/file1.txt | |
| to/file3.txt | |
| EOF | |
| git ls-files >actual && | |
| test_cmp expect actual | |
| ) | |
| ' | |
| test_done |