| #!/bin/sh | |
| test_description='git p4 metadata encoding | |
| This test checks that the import process handles inconsistent text | |
| encoding in p4 metadata (author names, commit messages, etc) without | |
| failing, and produces maximally sane output in git.' | |
| . ./lib-git-p4.sh | |
| ############################### | |
| ## SECTION REPEATED IN t9836 ## | |
| ############################### | |
| EXTRA_PATH="$(pwd)/temp_python" | |
| mkdir "$EXTRA_PATH" | |
| PATH="$EXTRA_PATH:$PATH" | |
| export PATH | |
| # These tests are specific to Python 2. Write a custom script that executes | |
| # git-p4 directly with the Python 2 interpreter to ensure that we use that | |
| # version even if Git was compiled with Python 3. | |
| test_lazy_prereq P4_PYTHON2 ' | |
| python_target_binary=$(which python2) && | |
| test -n "$python_target_binary" && | |
| write_script "$EXTRA_PATH"/git-p4-python2 <<-EOF && | |
| exec "$python_target_binary" "$(git --exec-path)/git-p4" "\$@" | |
| EOF | |
| ( git p4-python2 || true ) >err && | |
| test_grep "valid commands" err | |
| ' | |
| if ! test_have_prereq P4_PYTHON2 | |
| then | |
| skip_all="skipping python2 git p4 tests; python2 not available" | |
| test_done | |
| fi | |
| remove_user_cache () { | |
| rm "$HOME/.gitp4-usercache.txt" || true | |
| } | |
| test_expect_success 'start p4d' ' | |
| start_p4d | |
| ' | |
| test_expect_success 'init depot' ' | |
| ( | |
| cd "$cli" && | |
| p4_add_user "utf8_author" "ǣuthor" && | |
| P4USER=utf8_author && | |
| touch file1 && | |
| p4 add file1 && | |
| p4 submit -d "first CL has some utf-8 tǣxt" && | |
| p4_add_user "latin1_author" "$(echo æuthor | | |
| iconv -f utf8 -t latin1)" && | |
| P4USER=latin1_author && | |
| touch file2 && | |
| p4 add file2 && | |
| p4 submit -d "$(echo second CL has some latin-1 tæxt | | |
| iconv -f utf8 -t latin1)" && | |
| p4_add_user "cp1252_author" "$(echo æuthœr | | |
| iconv -f utf8 -t cp1252)" && | |
| P4USER=cp1252_author && | |
| touch file3 && | |
| p4 add file3 && | |
| p4 submit -d "$(echo third CL has sœme cp-1252 tæxt | | |
| iconv -f utf8 -t cp1252)" && | |
| p4_add_user "cp850_author" "$(echo Åuthor | | |
| iconv -f utf8 -t cp850)" && | |
| P4USER=cp850_author && | |
| touch file4 && | |
| p4 add file4 && | |
| p4 submit -d "$(echo fourth CL hÅs some cp850 text | | |
| iconv -f utf8 -t cp850)" | |
| ) | |
| ' | |
| test_expect_success 'clone non-utf8 repo with strict encoding' ' | |
| test_when_finished cleanup_git && | |
| test_when_finished remove_user_cache && | |
| test_must_fail git -c git-p4.metadataDecodingStrategy=strict p4-python2 clone --dest="$git" //depot@all 2>err && | |
| grep "Decoding perforce metadata failed!" err | |
| ' | |
| test_expect_success 'check utf-8 contents with passthrough strategy' ' | |
| test_when_finished cleanup_git && | |
| test_when_finished remove_user_cache && | |
| git -c git-p4.metadataDecodingStrategy=passthrough p4-python2 clone --dest="$git" //depot@all && | |
| ( | |
| cd "$git" && | |
| git log >actual && | |
| grep "some utf-8 tǣxt" actual && | |
| grep "ǣuthor" actual | |
| ) | |
| ' | |
| test_expect_success 'check latin-1 contents corrupted in git with passthrough strategy' ' | |
| test_when_finished cleanup_git && | |
| test_when_finished remove_user_cache && | |
| git -c git-p4.metadataDecodingStrategy=passthrough p4-python2 clone --dest="$git" //depot@all && | |
| ( | |
| cd "$git" && | |
| git log >actual && | |
| badly_encoded_in_git=$(echo "some latin-1 tæxt" | iconv -f utf8 -t latin1) && | |
| grep "$badly_encoded_in_git" actual && | |
| bad_author_in_git="$(echo æuthor | iconv -f utf8 -t latin1)" && | |
| grep "$bad_author_in_git" actual | |
| ) | |
| ' | |
| test_expect_success 'check utf-8 contents with fallback strategy' ' | |
| test_when_finished cleanup_git && | |
| test_when_finished remove_user_cache && | |
| git -c git-p4.metadataDecodingStrategy=fallback p4-python2 clone --dest="$git" //depot@all && | |
| ( | |
| cd "$git" && | |
| git log >actual && | |
| grep "some utf-8 tǣxt" actual && | |
| grep "ǣuthor" actual | |
| ) | |
| ' | |
| test_expect_success 'check latin-1 contents with fallback strategy' ' | |
| test_when_finished cleanup_git && | |
| test_when_finished remove_user_cache && | |
| git -c git-p4.metadataDecodingStrategy=fallback p4-python2 clone --dest="$git" //depot@all && | |
| ( | |
| cd "$git" && | |
| git log >actual && | |
| grep "some latin-1 tæxt" actual && | |
| grep "æuthor" actual | |
| ) | |
| ' | |
| test_expect_success 'check cp-1252 contents with fallback strategy' ' | |
| test_when_finished cleanup_git && | |
| test_when_finished remove_user_cache && | |
| git -c git-p4.metadataDecodingStrategy=fallback p4-python2 clone --dest="$git" //depot@all && | |
| ( | |
| cd "$git" && | |
| git log >actual && | |
| grep "sœme cp-1252 tæxt" actual && | |
| grep "æuthœr" actual | |
| ) | |
| ' | |
| test_expect_success 'check cp850 contents parsed with correct fallback' ' | |
| test_when_finished cleanup_git && | |
| test_when_finished remove_user_cache && | |
| git -c git-p4.metadataDecodingStrategy=fallback -c git-p4.metadataFallbackEncoding=cp850 p4-python2 clone --dest="$git" //depot@all && | |
| ( | |
| cd "$git" && | |
| git log >actual && | |
| grep "hÅs some cp850 text" actual && | |
| grep "Åuthor" actual | |
| ) | |
| ' | |
| test_expect_success 'check cp850-only contents escaped when cp1252 is fallback' ' | |
| test_when_finished cleanup_git && | |
| test_when_finished remove_user_cache && | |
| git -c git-p4.metadataDecodingStrategy=fallback p4-python2 clone --dest="$git" //depot@all && | |
| ( | |
| cd "$git" && | |
| git log >actual && | |
| grep "h%8Fs some cp850 text" actual && | |
| grep "%8Futhor" actual | |
| ) | |
| ' | |
| test_expect_success 'check cp-1252 contents on later sync after clone with fallback strategy' ' | |
| test_when_finished cleanup_git && | |
| test_when_finished remove_user_cache && | |
| git -c git-p4.metadataDecodingStrategy=fallback p4-python2 clone --dest="$git" //depot@all && | |
| ( | |
| cd "$cli" && | |
| P4USER=cp1252_author && | |
| touch file10 && | |
| p4 add file10 && | |
| p4 submit -d "$(echo later CL has sœme more cp-1252 tæxt | | |
| iconv -f utf8 -t cp1252)" | |
| ) && | |
| ( | |
| cd "$git" && | |
| git p4-python2 sync --branch=master && | |
| git log p4/master >actual && | |
| grep "sœme more cp-1252 tæxt" actual && | |
| grep "æuthœr" actual | |
| ) | |
| ' | |
| ############################ | |
| ## / END REPEATED SECTION ## | |
| ############################ | |
| test_expect_success 'passthrough (latin-1 contents corrupted in git) is the default with python2' ' | |
| test_when_finished cleanup_git && | |
| test_when_finished remove_user_cache && | |
| git -c git-p4.metadataDecodingStrategy=passthrough p4-python2 clone --dest="$git" //depot@all && | |
| ( | |
| cd "$git" && | |
| git log >actual && | |
| badly_encoded_in_git=$(echo "some latin-1 tæxt" | iconv -f utf8 -t latin1) && | |
| grep "$badly_encoded_in_git" actual | |
| ) | |
| ' | |
| test_done |