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