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

[GSoC][PATCH v5 1/7] clone: test for our behavior on odd objects/* content

From
Matheus Tavares <matheus.bernardino@usp.br>
Date
Mar 30, 2019, 22:49 UTC
Message-ID
<20190330224907.3277-2-matheus.bernardino@usp.br>
In-Reply-To
<20190330224907.3277-1-matheus.bernardino@usp.br>
From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>

Add tests for what happens when we perform a local clone on a repo containing odd files at .git/object directory, such as symlinks to other dirs, or unknown files.

I'm bending over backwards here to avoid a SHA-1 dependency. See [1] for an earlier and simpler version that hardcoded SHA-1s.

This behavior has been the same for a *long* time, but hasn't been tested for.

There's a good post-hoc argument to be made for copying over unknown things, e.g. I'd like a git version that doesn't know about the commit-graph to copy it under "clone --local" so a newer git version can make use of it.

In follow-up commits we'll look at changing some of this behavior, but for now, let's just assert it as-is so we'll notice what we'll change later.

1. https://public-inbox.org/git/20190226002625.13022-5-avarab@gmail.com/
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
[matheus.bernardino: improved and split tests in more than one patch]
Helped-by: Matheus Tavares <matheus.bernardino@usp.br>
Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br>
---
 t/t5604-clone-reference.sh | 111 +++++++++++++++++++++++++++++++++++++
 1 file changed, 111 insertions(+)
diff --git a/t/t5604-clone-reference.sh b/t/t5604-clone-reference.sh
index 4320082b1b..207650cb95 100755
--- a/t/t5604-clone-reference.sh
+++ b/t/t5604-clone-reference.sh
@@ -221,4 +221,115 @@ test_expect_success 'clone, dissociate from alternates' '
 	( cd C && git fsck )
 '
 
+test_expect_success 'setup repo with garbage in objects/*' '
+	git init S &&
+	(
+		cd S &&
+		test_commit A &&
+
+		cd .git/objects &&
+		>.some-hidden-file &&
+		>some-file &&
+		mkdir .some-hidden-dir &&
+		>.some-hidden-dir/some-file &&
+		>.some-hidden-dir/.some-dot-file &&
+		mkdir some-dir &&
+		>some-dir/some-file &&
+		>some-dir/.some-dot-file
+	)
+'
+
+test_expect_success 'clone a repo with garbage in objects/*' '
+	for option in --local --no-hardlinks --shared --dissociate
+	do
+		git clone $option S S$option || return 1 &&
+		git -C S$option fsck || return 1
+	done &&
+	find S-* -name "*some*" | sort >actual &&
+	cat >expected <<-EOF &&
+	S--dissociate/.git/objects/.some-hidden-file
+	S--dissociate/.git/objects/some-dir
+	S--dissociate/.git/objects/some-dir/.some-dot-file
+	S--dissociate/.git/objects/some-dir/some-file
+	S--dissociate/.git/objects/some-file
+	S--local/.git/objects/.some-hidden-file
+	S--local/.git/objects/some-dir
+	S--local/.git/objects/some-dir/.some-dot-file
+	S--local/.git/objects/some-dir/some-file
+	S--local/.git/objects/some-file
+	S--no-hardlinks/.git/objects/.some-hidden-file
+	S--no-hardlinks/.git/objects/some-dir
+	S--no-hardlinks/.git/objects/some-dir/.some-dot-file
+	S--no-hardlinks/.git/objects/some-dir/some-file
+	S--no-hardlinks/.git/objects/some-file
+	EOF
+	test_cmp expected actual
+'
+
+test_expect_success SYMLINKS 'setup repo with manually symlinked dirs and unknown files at objects/' '
+	git init T &&
+	(
+		cd T &&
+		git config gc.auto 0 &&
+		test_commit A &&
+		git gc &&
+		test_commit B &&
+
+		cd .git/objects &&
+		mv pack packs &&
+		ln -s packs pack &&
+		find ?? -type d >loose-dirs &&
+		last_loose=$(tail -n 1 loose-dirs) &&
+		rm -f loose-dirs &&
+		mv $last_loose a-loose-dir &&
+		ln -s a-loose-dir $last_loose &&
+		find . -type f | sort >../../../T.objects-files.raw &&
+		echo unknown_content> unknown_file
+	) &&
+	git -C T fsck &&
+	git -C T rev-list --all --objects >T.objects
+'
+
+
+test_expect_success SYMLINKS 'clone repo with symlinked dirs and unknown files at objects/' '
+	for option in --local --no-hardlinks --shared --dissociate
+	do
+		git clone $option T T$option || return 1 &&
+		git -C T$option fsck || return 1 &&
+		git -C T$option rev-list --all --objects >T$option.objects &&
+		test_cmp T.objects T$option.objects &&
+		(
+			cd T$option/.git/objects &&
+			find . -type f | sort >../../../T$option.objects-files.raw
+		)
+	done &&
+
+	for raw in $(ls T*.raw)
+	do
+		sed -e "s!/../!/Y/!; s![0-9a-f]\{38,\}!Z!" -e "/commit-graph/d" \
+		    -e "/multi-pack-index/d" <$raw >$raw.de-sha || return 1
+	done &&
+
+	cat >expected-files <<-EOF &&
+	./Y/Z
+	./Y/Z
+	./a-loose-dir/Z
+	./Y/Z
+	./info/packs
+	./pack/pack-Z.idx
+	./pack/pack-Z.pack
+	./packs/pack-Z.idx
+	./packs/pack-Z.pack
+	./unknown_file
+	EOF
+
+	for option in --local --dissociate --no-hardlinks
+	do
+		test_cmp expected-files T$option.objects-files.raw.de-sha || return 1
+	done &&
+
+	echo ./info/alternates >expected-files &&
+	test_cmp expected-files T--shared.objects-files.raw
+'
+
 test_done
-- 
2.20.1
Previous: Matheus TavaresNext: Matheus Tavares
Message 52 of 127 in “clone: dir iterator refactoring with tests”
  1. 0/5 clone: dir iterator refactoring with testsMatheus Tavares, Feb 26, 2019
  2. 1/5 dir-iterator: add flags parameter to dir_iterator_beginMatheus Tavares, Feb 26, 2019
  3. Duy NguyenFeb 26, 2019
  4. Matheus Tavares BernardinoFeb 27, 2019
  5. 3/5 clone: copy hidden paths at local cloneMatheus Tavares, Feb 26, 2019
  6. Duy NguyenFeb 26, 2019
  7. 2/5 clone: test for our behavior on odd objects/* contentMatheus Tavares, Feb 26, 2019
  8. 4/5 clone: extract function from copy_or_link_directoryMatheus Tavares, Feb 26, 2019
  9. Duy NguyenFeb 26, 2019
  10. Matheus Tavares BernardinoFeb 27, 2019
  11. Thomas GummererFeb 27, 2019
  12. Matheus Tavares BernardinoFeb 27, 2019
  13. 5/5 clone: use dir-iterator to avoid explicit dir traversalMatheus Tavares, Feb 26, 2019
  14. Ævar Arnfjörð BjarmasonFeb 26, 2019
  15. Duy NguyenFeb 26, 2019
  16. Ævar Arnfjörð BjarmasonFeb 26, 2019
  17. Matheus Tavares BernardinoFeb 27, 2019
  18. Duy NguyenFeb 28, 2019
  19. Ævar Arnfjörð BjarmasonFeb 28, 2019
  20. Ævar Arnfjörð BjarmasonFeb 26, 2019
  21. Duy NguyenFeb 26, 2019
  22. 0/5 clone: dir iterator refactoring with testsÆvar Arnfjörð Bjarmason, Feb 26, 2019
  23. Matheus Tavares BernardinoFeb 26, 2019
  24. [GSoC][PATCH v4 0/7] clone: dir-iterator refactoring with testsMatheus Tavares, Mar 22, 2019
  25. [GSoC][PATCH v4 1/7] clone: test for our behavior on odd objects/* contentMatheus Tavares, Mar 22, 2019
  26. Matheus Tavares BernardinoMar 24, 2019
  27. SZEDER GáborMar 24, 2019
  28. Matheus Tavares BernardinoMar 26, 2019
  29. Thomas GummererMar 28, 2019
  30. Matheus Tavares BernardinoMar 29, 2019
  31. Thomas GummererMar 29, 2019
  32. SZEDER GáborMar 29, 2019
  33. Matheus Tavares BernardinoMar 30, 2019
  34. [GSoC][PATCH v4 2/7] clone: better handle symlinked files at .git/objects/Matheus Tavares, Mar 22, 2019
  35. Thomas GummererMar 28, 2019
  36. Ævar Arnfjörð BjarmasonMar 29, 2019
  37. Thomas GummererMar 29, 2019
  38. Matheus Tavares BernardinoMar 29, 2019
  39. Thomas GummererMar 29, 2019
  40. Matheus Tavares BernardinoMar 30, 2019
  41. Thomas GummererMar 30, 2019
  42. Matheus Tavares BernardinoApr 1, 2019
  43. Johannes SchindelinMar 29, 2019
  44. [GSoC][PATCH v4 3/7] dir-iterator: add flags parameter to dir_iterator_beginMatheus Tavares, Mar 22, 2019
  45. Thomas GummererMar 28, 2019
  46. Matheus Tavares BernardinoMar 29, 2019
  47. [GSoC][PATCH v4 4/7] clone: copy hidden paths at local cloneMatheus Tavares, Mar 22, 2019
  48. [GSoC][PATCH v4 5/7] clone: extract function from copy_or_link_directoryMatheus Tavares, Mar 22, 2019
  49. [GSoC][PATCH v4 6/7] clone: use dir-iterator to avoid explicit dir traversalMatheus Tavares, Mar 22, 2019
  50. [GSoC][PATCH v4 7/7] clone: Replace strcmp by fspathcmpMatheus Tavares, Mar 22, 2019
  51. [GSoC][PATCH v5 0/7] clone: dir-iterator refactoring with testsMatheus Tavares, Mar 30, 2019
  52. [GSoC][PATCH v5 1/7] clone: test for our behavior on odd objects/* contentMatheus Tavares, Mar 30, 2019
  53. [GSoC][PATCH v5 2/7] clone: better handle symlinked files at .git/objects/Matheus Tavares, Mar 30, 2019
  54. Thomas GummererMar 31, 2019
  55. Matheus Tavares BernardinoApr 1, 2019
  56. [GSoC][PATCH v5 3/7] dir-iterator: add flags parameter to dir_iterator_beginMatheus Tavares, Mar 30, 2019
  57. Thomas GummererMar 31, 2019
  58. Matheus Tavares BernardinoApr 10, 2019
  59. Thomas GummererApr 11, 2019
  60. Matheus Tavares BernardinoApr 23, 2019
  61. Thomas GummererApr 24, 2019
  62. Matheus Tavares BernardinoApr 26, 2019
  63. [GSoC][PATCH v5 4/7] clone: copy hidden paths at local cloneMatheus Tavares, Mar 30, 2019
  64. [GSoC][PATCH v5 5/7] clone: extract function from copy_or_link_directoryMatheus Tavares, Mar 30, 2019
  65. [GSoC][PATCH v5 6/7] clone: use dir-iterator to avoid explicit dir traversalMatheus Tavares, Mar 30, 2019
  66. [GSoC][PATCH v5 7/7] clone: replace strcmp by fspathcmpMatheus Tavares, Mar 30, 2019
  67. Thomas GummererMar 31, 2019
  68. Matheus Tavares BernardinoApr 1, 2019
  69. [GSoC][PATCH v6 00/10] clone: dir-iterator refactoring with testsMatheus Tavares, May 2, 2019
  70. [GSoC][PATCH v6 01/10] clone: test for our behavior on odd objects/* contentMatheus Tavares, May 2, 2019
  71. [GSoC][PATCH v6 02/10] clone: better handle symlinked files at .git/objects/Matheus Tavares, May 2, 2019
  72. [GSoC][PATCH v6 03/10] dir-iterator: add tests for dir-iterator APIMatheus Tavares, May 2, 2019
  73. [GSoC][PATCH v6 04/10] dir-iterator: use warning_errno when possibleMatheus Tavares, May 2, 2019
  74. [GSoC][PATCH v6 05/10] dir-iterator: refactor state machine modelMatheus Tavares, May 2, 2019
  75. [GSoC][PATCH v6 06/10] dir-iterator: add flags parameter to dir_iterator_beginMatheus Tavares, May 2, 2019
  76. [GSoC][PATCH v6 07/10] clone: copy hidden paths at local cloneMatheus Tavares, May 2, 2019
  77. [GSoC][PATCH v6 08/10] clone: extract function from copy_or_link_directoryMatheus Tavares, May 2, 2019
  78. [GSoC][PATCH v6 09/10] clone: use dir-iterator to avoid explicit dir traversalMatheus Tavares, May 2, 2019
  79. [GSoC][PATCH v6 10/10] clone: replace strcmp by fspathcmpMatheus Tavares, May 2, 2019
  80. [GSoC][PATCH v7 00/10] clone: dir-iterator refactoring with testsMatheus Tavares, Jun 18, 2019
  81. [GSoC][PATCH v7 01/10] clone: test for our behavior on odd objects/* contentMatheus Tavares, Jun 18, 2019
  82. [GSoC][PATCH v7 02/10] clone: better handle symlinked files at .git/objects/Matheus Tavares, Jun 18, 2019
  83. [GSoC][PATCH v7 03/10] dir-iterator: add tests for dir-iterator APIMatheus Tavares, Jun 18, 2019
  84. [GSoC][PATCH v7 04/10] dir-iterator: use warning_errno when possibleMatheus Tavares, Jun 18, 2019
  85. [GSoC][PATCH v7 05/10] dir-iterator: refactor state machine modelMatheus Tavares, Jun 18, 2019
  86. [GSoC][PATCH v7 06/10] dir-iterator: add flags parameter to dir_iterator_beginMatheus Tavares, Jun 18, 2019
  87. Junio C HamanoJun 25, 2019
  88. Matheus Tavares BernardinoJun 25, 2019
  89. Johannes SchindelinJun 26, 2019
  90. Junio C HamanoJun 26, 2019
  91. Duy NguyenJun 27, 2019
  92. Matheus Tavares BernardinoJun 27, 2019
  93. Johannes SchindelinJun 27, 2019
  94. Matheus Tavares BernardinoJun 27, 2019
  95. Johannes SchindelinJun 28, 2019
  96. Matheus Tavares BernardinoJun 28, 2019
  97. Johannes SchindelinJul 1, 2019
  98. SZEDER GáborJul 3, 2019
  99. Matheus Tavares BernardinoJul 8, 2019
  100. [GSoC][PATCH v7 07/10] clone: copy hidden paths at local cloneMatheus Tavares, Jun 18, 2019
  101. [GSoC][PATCH v7 08/10] clone: extract function from copy_or_link_directoryMatheus Tavares, Jun 18, 2019
  102. [GSoC][PATCH v7 09/10] clone: use dir-iterator to avoid explicit dir traversalMatheus Tavares, Jun 18, 2019
  103. [GSoC][PATCH v7 10/10] clone: replace strcmp by fspathcmpMatheus Tavares, Jun 18, 2019
  104. Matheus Tavares BernardinoJun 19, 2019
  105. Junio C HamanoJun 20, 2019
  106. Matheus Tavares BernardinoJun 21, 2019
  107. [GSoC][PATCH v8 00/10] clone: dir-iterator refactoring with testsMatheus Tavares, Jul 10, 2019
  108. [GSoC][PATCH v8 01/10] clone: test for our behavior on odd objects/* contentMatheus Tavares, Jul 10, 2019
  109. [GSoC][PATCH v8 02/10] clone: better handle symlinked files at .git/objects/Matheus Tavares, Jul 10, 2019
  110. [GSoC][PATCH v8 03/10] dir-iterator: add tests for dir-iterator APIMatheus Tavares, Jul 10, 2019
  111. [GSoC][PATCH v8 04/10] dir-iterator: use warning_errno when possibleMatheus Tavares, Jul 10, 2019
  112. [GSoC][PATCH v8 05/10] dir-iterator: refactor state machine modelMatheus Tavares, Jul 10, 2019
  113. [GSoC][PATCH v8 06/10] dir-iterator: add flags parameter to dir_iterator_beginMatheus Tavares, Jul 10, 2019
  114. [GSoC][PATCH v8 07/10] clone: copy hidden paths at local cloneMatheus Tavares, Jul 10, 2019
  115. [GSoC][PATCH v8 08/10] clone: extract function from copy_or_link_directoryMatheus Tavares, Jul 10, 2019
  116. [GSoC][PATCH v8 09/10] clone: use dir-iterator to avoid explicit dir traversalMatheus Tavares, Jul 10, 2019
  117. [GSoC][PATCH v8 10/10] clone: replace strcmp by fspathcmpMatheus Tavares, Jul 10, 2019
  118. Johannes SchindelinJul 11, 2019
  119. Matheus Tavares BernardinoJul 11, 2019
  120. 1/5 clone: test for our behavior on odd objects/* contentÆvar Arnfjörð Bjarmason, Feb 26, 2019
  121. Matheus Tavares BernardinoFeb 28, 2019
  122. Ævar Arnfjörð BjarmasonMar 1, 2019
  123. Matheus TavaresMar 13, 2019
  124. 2/5 dir-iterator: add flags parameter to dir_iterator_beginÆvar Arnfjörð Bjarmason, Feb 26, 2019
  125. 3/5 clone: copy hidden paths at local cloneÆvar Arnfjörð Bjarmason, Feb 26, 2019
  126. 4/5 clone: extract function from copy_or_link_directoryÆvar Arnfjörð Bjarmason, Feb 26, 2019
  127. 5/5 clone: use dir-iterator to avoid explicit dir traversalÆvar Arnfjörð Bjarmason, Feb 26, 2019

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.