| #!/bin/sh |
| |
| test_description='git p4 rcs keywords' |
| |
| . ./lib-git-p4.sh |
| |
| test_expect_success 'start p4d' ' |
| start_p4d |
| ' |
| |
| # |
| # Make one file with keyword lines at the top, and |
| # enough plain text to be able to test modifications |
| # far away from the keywords. |
| # |
| test_expect_success 'init depot' ' |
| ( |
| cd "$cli" && |
| cat <<-\EOF >filek && |
| $Id$ |
| /* $Revision$ */ |
| # $Change$ |
| line4 |
| line5 |
| line6 |
| line7 |
| line8 |
| EOF |
| sed "s/Revision/Revision: do not scrub me/" <filek >fileko && |
| sed "s/Id/Id: do not scrub me/" <fileko >file_text && |
| p4 add -t text+k filek && |
| p4 submit -d "filek" && |
| p4 add -t text+ko fileko && |
| p4 submit -d "fileko" && |
| p4 add -t text file_text && |
| p4 submit -d "file_text" |
| ) |
| ' |
| |
| # |
| # Generate these in a function to make it easy to use single quote marks. |
| # |
| write_scrub_scripts () { |
| cat >"$TRASH_DIRECTORY/scrub_k.py" <<-\EOF && |
| import re, sys |
| sys.stdout.write(re.sub(r'(?i)\$(Id|Header|Author|Date|DateTime|Change|File|Revision):[^$]*\$', r'$\1$', sys.stdin.read())) |
| EOF |
| cat >"$TRASH_DIRECTORY/scrub_ko.py" <<-\EOF |
| import re, sys |
| sys.stdout.write(re.sub(r'(?i)\$(Id|Header):[^$]*\$', r'$\1$', sys.stdin.read())) |
| EOF |
| } |
| |
| test_expect_success 'scrub scripts' ' |
| write_scrub_scripts |
| ' |
| |
| # |
| # Compare $cli/file to its scrubbed version, should be different. |
| # Compare scrubbed $cli/file to $git/file, should be same. |
| # |
| scrub_k_check () { |
| file="$1" && |
| scrub="$TRASH_DIRECTORY/$file" && |
| "$PYTHON_PATH" "$TRASH_DIRECTORY/scrub_k.py" <"$git/$file" >"$scrub" && |
| ! test_cmp "$cli/$file" "$scrub" && |
| test_cmp "$git/$file" "$scrub" && |
| rm "$scrub" |
| } |
| scrub_ko_check () { |
| file="$1" && |
| scrub="$TRASH_DIRECTORY/$file" && |
| "$PYTHON_PATH" "$TRASH_DIRECTORY/scrub_ko.py" <"$git/$file" >"$scrub" && |
| ! test_cmp "$cli/$file" "$scrub" && |
| test_cmp "$git/$file" "$scrub" && |
| rm "$scrub" |
| } |
| |
| # |
| # Modify far away from keywords. If no RCS lines show up |
| # in the diff, there is no conflict. |
| # |
| test_expect_success 'edit far away from RCS lines' ' |
| test_when_finished cleanup_git && |
| git p4 clone --dest="$git" //depot && |
| ( |
| cd "$git" && |
| git config git-p4.skipSubmitEdit true && |
| sed "s/^line7/line7 edit/" <filek >filek.tmp && |
| mv -f filek.tmp filek && |
| git commit -m "filek line7 edit" filek && |
| git p4 submit && |
| scrub_k_check filek |
| ) |
| ' |
| |
| # |
| # Modify near the keywords. This will require RCS scrubbing. |
| # |
| test_expect_success 'edit near RCS lines' ' |
| test_when_finished cleanup_git && |
| git p4 clone --dest="$git" //depot && |
| ( |
| cd "$git" && |
| git config git-p4.skipSubmitEdit true && |
| git config git-p4.attemptRCSCleanup true && |
| sed "s/^line4/line4 edit/" <filek >filek.tmp && |
| mv -f filek.tmp filek && |
| git commit -m "filek line4 edit" filek && |
| git p4 submit && |
| scrub_k_check filek |
| ) |
| ' |
| |
| # |
| # Modify the keywords themselves. This also will require RCS scrubbing. |
| # |
| test_expect_success 'edit keyword lines' ' |
| test_when_finished cleanup_git && |
| git p4 clone --dest="$git" //depot && |
| ( |
| cd "$git" && |
| git config git-p4.skipSubmitEdit true && |
| git config git-p4.attemptRCSCleanup true && |
| sed "/Revision/d" <filek >filek.tmp && |
| mv -f filek.tmp filek && |
| git commit -m "filek remove Revision line" filek && |
| git p4 submit && |
| scrub_k_check filek |
| ) |
| ' |
| |
| # |
| # Scrubbing text+ko files should not alter all keywords, just Id, Header. |
| # |
| test_expect_success 'scrub ko files differently' ' |
| test_when_finished cleanup_git && |
| git p4 clone --dest="$git" //depot && |
| ( |
| cd "$git" && |
| git config git-p4.skipSubmitEdit true && |
| git config git-p4.attemptRCSCleanup true && |
| sed "s/^line4/line4 edit/" <fileko >fileko.tmp && |
| mv -f fileko.tmp fileko && |
| git commit -m "fileko line4 edit" fileko && |
| git p4 submit && |
| scrub_ko_check fileko && |
| ! scrub_k_check fileko |
| ) |
| ' |
| |
| # hack; git p4 submit should do it on its own |
| test_expect_success 'cleanup after failure' ' |
| ( |
| cd "$cli" && |
| p4 revert ... |
| ) |
| ' |
| |
| # perl $File:: bug check |
| test_expect_success 'ktext expansion should not expand multi-line $File::' ' |
| ( |
| cd "$cli" && |
| cat >lv.pm <<-\EOF && |
| my $wanted = sub { my $f = $File::Find::name; |
| if ( -f && $f =~ /foo/ ) { |
| EOF |
| p4 add -t ktext lv.pm && |
| p4 submit -d "lv.pm" |
| ) && |
| test_when_finished cleanup_git && |
| git p4 clone --dest="$git" //depot && |
| ( |
| cd "$git" && |
| test_cmp "$cli/lv.pm" lv.pm |
| ) |
| ' |
| |
| # |
| # Do not scrub anything but +k or +ko files. Sneak a change into |
| # the cli file so that submit will get a conflict. Make sure that |
| # scrubbing doesn't make a mess of things. |
| # |
| # This might happen only if the git repo is behind the p4 repo at |
| # submit time, and there is a conflict. |
| # |
| test_expect_success 'do not scrub plain text' ' |
| test_when_finished cleanup_git && |
| git p4 clone --dest="$git" //depot && |
| ( |
| cd "$git" && |
| git config git-p4.skipSubmitEdit true && |
| git config git-p4.attemptRCSCleanup true && |
| sed "s/^line4/line4 edit/" <file_text >file_text.tmp && |
| mv -f file_text.tmp file_text && |
| git commit -m "file_text line4 edit" file_text && |
| ( |
| cd "$cli" && |
| p4 open file_text && |
| sed "s/^line5/line5 p4 edit/" <file_text >file_text.tmp && |
| mv -f file_text.tmp file_text && |
| p4 submit -d "file5 p4 edit" |
| ) && |
| echo s | test_expect_code 1 git p4 submit && |
| ( |
| # make sure the file is not left open |
| cd "$cli" && |
| ! p4 fstat -T action file_text |
| ) |
| ) |
| ' |
| |
| # hack; git p4 submit should do it on its own |
| test_expect_success 'cleanup after failure 2' ' |
| ( |
| cd "$cli" && |
| p4 revert ... |
| ) |
| ' |
| |
| create_kw_file () { |
| cat <<\EOF >"$1" |
| /* A file |
| Id: $Id$ |
| Revision: $Revision$ |
| File: $File$ |
| */ |
| int main(int argc, const char **argv) { |
| return 0; |
| } |
| EOF |
| } |
| |
| test_expect_success 'add kwfile' ' |
| ( |
| cd "$cli" && |
| echo file1 >file1 && |
| p4 add file1 && |
| p4 submit -d "file 1" && |
| create_kw_file kwfile1.c && |
| p4 add kwfile1.c && |
| p4 submit -d "Add rcw kw file" kwfile1.c |
| ) |
| ' |
| |
| p4_append_to_file () { |
| f="$1" && |
| p4 edit -t ktext "$f" && |
| echo "/* $(date) */" >>"$f" && |
| p4 submit -d "appending a line in p4" |
| } |
| |
| # Create some files with RCS keywords. If they get modified |
| # elsewhere then the version number gets bumped which then |
| # results in a merge conflict if we touch the RCS kw lines, |
| # even though the change itself would otherwise apply cleanly. |
| test_expect_success 'cope with rcs keyword expansion damage' ' |
| test_when_finished cleanup_git && |
| git p4 clone --dest="$git" //depot && |
| ( |
| cd "$git" && |
| git config git-p4.skipSubmitEdit true && |
| git config git-p4.attemptRCSCleanup true && |
| (cd "$cli" && p4_append_to_file kwfile1.c) && |
| old_lines=$(wc -l <kwfile1.c) && |
| perl -n -i -e "print unless m/Revision:/" kwfile1.c && |
| new_lines=$(wc -l <kwfile1.c) && |
| test $new_lines = $(($old_lines - 1)) && |
| |
| git add kwfile1.c && |
| git commit -m "Zap an RCS kw line" && |
| git p4 submit && |
| git p4 rebase && |
| git diff p4/master && |
| git p4 commit && |
| echo "try modifying in both" && |
| cd "$cli" && |
| p4 edit kwfile1.c && |
| echo "line from p4" >>kwfile1.c && |
| p4 submit -d "add a line in p4" kwfile1.c && |
| cd "$git" && |
| echo "line from git at the top" | cat - kwfile1.c >kwfile1.c.new && |
| mv kwfile1.c.new kwfile1.c && |
| git commit -m "Add line in git at the top" kwfile1.c && |
| git p4 rebase && |
| git p4 submit |
| ) |
| ' |
| |
| test_expect_success 'cope with rcs keyword file deletion' ' |
| test_when_finished cleanup_git && |
| ( |
| cd "$cli" && |
| echo "\$Revision\$" >kwdelfile.c && |
| p4 add -t ktext kwdelfile.c && |
| p4 submit -d "Add file to be deleted" && |
| cat kwdelfile.c && |
| grep 1 kwdelfile.c |
| ) && |
| git p4 clone --dest="$git" //depot && |
| ( |
| cd "$git" && |
| grep Revision kwdelfile.c && |
| git rm -f kwdelfile.c && |
| git commit -m "Delete a file containing RCS keywords" && |
| git config git-p4.skipSubmitEdit true && |
| git config git-p4.attemptRCSCleanup true && |
| git p4 submit |
| ) && |
| ( |
| cd "$cli" && |
| p4 sync && |
| ! test -f kwdelfile.c |
| ) |
| ' |
| |
| # If you add keywords in git of the form $Header$ then everything should |
| # work fine without any special handling. |
| test_expect_success 'Add keywords in git which match the default p4 values' ' |
| test_when_finished cleanup_git && |
| git p4 clone --dest="$git" //depot && |
| ( |
| cd "$git" && |
| echo "NewKW: \$Revision\$" >>kwfile1.c && |
| git add kwfile1.c && |
| git commit -m "Adding RCS keywords in git" && |
| git config git-p4.skipSubmitEdit true && |
| git config git-p4.attemptRCSCleanup true && |
| git p4 submit |
| ) && |
| ( |
| cd "$cli" && |
| p4 sync && |
| test -f kwfile1.c && |
| grep "NewKW.*Revision.*[0-9]" kwfile1.c |
| |
| ) |
| ' |
| |
| # If you add keywords in git of the form $Header:#1$ then things will fail |
| # unless git-p4 takes steps to scrub the *git* commit. |
| # |
| test_expect_failure 'Add keywords in git which do not match the default p4 values' ' |
| test_when_finished cleanup_git && |
| git p4 clone --dest="$git" //depot && |
| ( |
| cd "$git" && |
| echo "NewKW2: \$Revision:1\$" >>kwfile1.c && |
| git add kwfile1.c && |
| git commit -m "Adding RCS keywords in git" && |
| git config git-p4.skipSubmitEdit true && |
| git config git-p4.attemptRCSCleanup true && |
| git p4 submit |
| ) && |
| ( |
| cd "$cli" && |
| p4 sync && |
| grep "NewKW2.*Revision.*[0-9]" kwfile1.c |
| |
| ) |
| ' |
| |
| test_expect_success 'kill p4d' ' |
| kill_p4d |
| ' |
| |
| test_done |