|  | #!/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 |