git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 11/21] git p4 test: newline handling

From
PWPete Wyckoff <pw@padd.com>
Date
Sep 28, 2012, 12:04 UTC
Message-ID
<1348833865-6093-12-git-send-email-pw@padd.com>
In-Reply-To
<1348833865-6093-1-git-send-email-pw@padd.com>

P4 stores newlines in the depos as \n. By default, git does this too, both on unix and windows. Test to make sure that this stays true.

Both git and p4 have mechanisms to use \r\n in the working directory. Exercise these.

Signed-off-by: Pete Wyckoff <pw@padd.com>
---
 t/t9802-git-p4-filetype.sh | 117 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 117 insertions(+)
diff --git a/t/t9802-git-p4-filetype.sh b/t/t9802-git-p4-filetype.sh
index 21924df..c5ab626 100755
--- a/t/t9802-git-p4-filetype.sh
+++ b/t/t9802-git-p4-filetype.sh
@@ -8,6 +8,123 @@ test_expect_success 'start p4d' '
 	start_p4d
 '
 
+#
+# This series of tests checks newline handling  Both p4 and
+# git store newlines as \n, and have options to choose how
+# newlines appear in checked-out files.
+#
+test_expect_success 'p4 client newlines, unix' '
+	(
+		cd "$cli" &&
+		p4 client -o | sed "/LineEnd/s/:.*/:unix/" | p4 client -i &&
+		printf "unix\ncrlf\n" >f-unix &&
+		printf "unix\r\ncrlf\r\n" >f-unix-as-crlf &&
+		p4 add -t text f-unix &&
+		p4 submit -d f-unix &&
+
+		# LineEnd: unix; should be no change after sync
+		cp f-unix f-unix-orig &&
+		p4 sync -f &&
+		test_cmp f-unix-orig f-unix &&
+
+		# make sure stored in repo as unix newlines
+		# use sed to eat python-appened newline
+		p4 -G print //depot/f-unix | marshal_dump data 2 |\
+		    sed \$d >f-unix-p4-print &&
+		test_cmp f-unix-orig f-unix-p4-print &&
+
+		# switch to win, make sure lf -> crlf
+		p4 client -o | sed "/LineEnd/s/:.*/:win/" | p4 client -i &&
+		p4 sync -f &&
+		test_cmp f-unix-as-crlf f-unix
+	)
+'
+
+test_expect_success 'p4 client newlines, win' '
+	(
+		cd "$cli" &&
+		p4 client -o | sed "/LineEnd/s/:.*/:win/" | p4 client -i &&
+		printf "win\r\ncrlf\r\n" >f-win &&
+		printf "win\ncrlf\n" >f-win-as-lf &&
+		p4 add -t text f-win &&
+		p4 submit -d f-win &&
+
+		# LineEnd: win; should be no change after sync
+		cp f-win f-win-orig &&
+		p4 sync -f &&
+		test_cmp f-win-orig f-win &&
+
+		# make sure stored in repo as unix newlines
+		# use sed to eat python-appened newline
+		p4 -G print //depot/f-win | marshal_dump data 2 |\
+		    sed \$d >f-win-p4-print &&
+		test_cmp f-win-as-lf f-win-p4-print &&
+
+		# switch to unix, make sure lf -> crlf
+		p4 client -o | sed "/LineEnd/s/:.*/:unix/" | p4 client -i &&
+		p4 sync -f &&
+		test_cmp f-win-as-lf f-win
+	)
+'
+
+test_expect_success 'ensure blobs store only lf newlines' '
+	test_when_finished cleanup_git &&
+	(
+		cd "$git" &&
+		git init &&
+		git p4 sync //depot@all &&
+
+		# verify the files in .git are stored only with newlines
+		o=$(git ls-tree p4/master -- f-unix | cut -f1 | cut -d\  -f3) &&
+		git cat-file blob $o >f-unix-blob &&
+		test_cmp "$cli"/f-unix-orig f-unix-blob &&
+
+		o=$(git ls-tree p4/master -- f-win | cut -f1 | cut -d\  -f3) &&
+		git cat-file blob $o >f-win-blob &&
+		test_cmp "$cli"/f-win-as-lf f-win-blob &&
+
+		rm f-unix-blob f-win-blob
+	)
+'
+
+test_expect_success 'gitattributes setting eol=lf produces lf newlines' '
+	test_when_finished cleanup_git &&
+	(
+		# checkout the files and make sure core.eol works as planned
+		cd "$git" &&
+		git init &&
+		echo "* eol=lf" >.gitattributes &&
+		git p4 sync //depot@all &&
+		git checkout master &&
+		test_cmp "$cli"/f-unix-orig f-unix &&
+		test_cmp "$cli"/f-win-as-lf f-win
+	)
+'
+
+test_expect_success 'gitattributes setting eol=crlf produces crlf newlines' '
+	test_when_finished cleanup_git &&
+	(
+		# checkout the files and make sure core.eol works as planned
+		cd "$git" &&
+		git init &&
+		echo "* eol=crlf" >.gitattributes &&
+		git p4 sync //depot@all &&
+		git checkout master &&
+		test_cmp "$cli"/f-unix-as-crlf f-unix &&
+		test_cmp "$cli"/f-win-orig f-win
+	)
+'
+
+test_expect_success 'crlf cleanup' '
+	(
+		cd "$cli" &&
+		rm f-unix-orig f-unix-as-crlf &&
+		rm f-win-orig f-win-as-lf &&
+		p4 client -o | sed "/LineEnd/s/:.*/:unix/" | p4 client -i &&
+		p4 sync -f
+	)
+'
+
 test_expect_success 'utf-16 file create' '
 	(
 		cd "$cli" &&
-- 
1.7.12.1.403.g28165e1
Previous: Pete WyckoffNext: Pete Wyckoff
Message 17 of 29 in “git p4: work on cygwin”
  1. 00/21 git p4: work on cygwinPete Wyckoff, Sep 28, 2012
  2. 01/21 git p4: temp branch name should use / even on windowsPete Wyckoff, Sep 28, 2012
  3. 02/21 git p4: remove unused importsPete Wyckoff, Sep 28, 2012
  4. 03/21 git p4: generate better error message for bad depot pathPete Wyckoff, Sep 28, 2012
  5. Junio C HamanoSep 28, 2012
  6. 04/21 git p4: fix error message when "describe -s" failsPete Wyckoff, Sep 28, 2012
  7. Junio C HamanoSep 28, 2012
  8. 05/21 git p4 test: use client_view to build the initial clientPete Wyckoff, Sep 28, 2012
  9. Junio C HamanoSep 28, 2012
  10. 06/21 git p4 test: use client_view in t9806Pete Wyckoff, Sep 28, 2012
  11. Junio C HamanoSep 28, 2012
  12. Pete WyckoffJan 27, 2013
  13. 07/21 git p4 test: start p4d inside its db dirPete Wyckoff, Sep 28, 2012
  14. 08/21 git p4 test: translate windows paths for cygwinPete Wyckoff, Sep 28, 2012
  15. 09/21 git p4: remove unreachable windows \r\n conversion codePete Wyckoff, Sep 28, 2012
  16. 10/21 git p4: scrub crlf for utf16 files on windowsPete Wyckoff, Sep 28, 2012
  17. 11/21 git p4 test: newline handlingPete Wyckoff, Sep 28, 2012
  18. 12/21 git p4 test: use LineEnd unix in windows tests tooPete Wyckoff, Sep 28, 2012
  19. 13/21 git p4 test: avoid wildcard * in windowsPete Wyckoff, Sep 28, 2012
  20. 14/21 git p4: cygwin p4 client does not mark read-onlyPete Wyckoff, Sep 28, 2012
  21. 15/21 git p4 test: disable chmod test for cygwinPete Wyckoff, Sep 28, 2012
  22. Johannes SixtSep 28, 2012
  23. 16/21 git p4: disable read-only attribute before deletingPete Wyckoff, Sep 28, 2012
  24. 17/21 git p4: avoid shell when mapping usersPete Wyckoff, Sep 28, 2012
  25. 18/21 git p4: avoid shell when invoking git rev-listPete Wyckoff, Sep 28, 2012
  26. 19/21 git p4: avoid shell when invoking git config --get-allPete Wyckoff, Sep 28, 2012
  27. 20/21 git p4: avoid shell when calling git configPete Wyckoff, Sep 28, 2012
  28. 21/21 git p4: introduce gitConfigBoolPete Wyckoff, Sep 28, 2012
  29. Junio C HamanoSep 28, 2012

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.