{"thread":{"id":"52696","subject":"[PATCH v2 00/23] SHA-256 test fixes, part 8","startedAt":"2020-01-25T23:00:43Z","lastAt":"2020-01-29T04:04:52Z","messageCount":52,"participants":["brian m. carlson","Johannes Schindelin","Johan Herland","Junio C Hamano"],"isPatch":true,"patchVersion":2,"patchTotal":23},"messages":[{"id":"390472","messageId":"20200125230035.136348-1-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":null,"subject":"[PATCH v2 00/23] SHA-256 test fixes, part 8","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:06Z","receivedAt":"2020-01-25T23:00:43Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"This is the second-to-last series of test fixes for SHA-256.\n\nAs mentioned previously, the patch for t3305 seems to indicate a bug in\nthe notes code and I'm not familiar enough with that code to apply a\nfix.  This is a band-aid to get it working with SHA-256, but any\ncomments on a more robust approach would of course be welcome.\n\nChanges from v1:\n* Drop patch for t3404 in favor of Dscho's fix.\n* Drop patch for t5616 in favor of Jonathan Tan's fix.\n* Add missing sign-off.\n* Move test_oid_init into the correct patch.\n\nbrian m. carlson (22):\n  t/lib-pack: support SHA-256\n  t3206: make hash size independent\n  t3305: annotate with SHA1 prerequisite\n  t3308: make test work with SHA-256\n  t3309: make test work with SHA-256\n  t3310: make test work with SHA-256\n  t3311: make test work with SHA-256\n  t4013: make test hash independent\n  t4060: make test work with SHA-256\n  t4211: make test hash independent\n  t5302: make hash size independent\n  t5309: make test hash independent\n  t5313: make test hash independent\n  t5321: make test hash independent\n  t5515: make test hash independent\n  t5318: update for SHA-256\n  t5607: make hash size independent\n  t5703: make test work with SHA-256\n  t5703: switch tests to use test_oid\n  t6000: abstract away SHA-1-specific constants\n  t6006: make hash size independent\n  t6024: update for SHA-256\n\n t/lib-pack.sh                                |  35 ++-\n t/t3206-range-diff.sh                        |  14 +-\n t/t3305-notes-fanout.sh                      |   2 +-\n t/t3308-notes-merge.sh                       |  83 ++++---\n t/t3309-notes-merge-auto-resolve.sh          | 228 ++++++++++++-------\n t/t3310-notes-merge-manual-resolve.sh        |  84 ++++---\n t/t3311-notes-merge-fanout.sh                |  60 +++--\n t/t4013-diff-various.sh                      |  44 +++-\n t/t4060-diff-submodule-option-diff-format.sh | 126 +++++-----\n t/t4211-line-log.sh                          |  14 +-\n t/t5302-pack-index.sh                        |  18 +-\n t/t5309-pack-delta-cycles.sh                 |  10 +-\n t/t5313-pack-bounds-checks.sh                |  19 +-\n t/t5318-commit-graph.sh                      |   4 +-\n t/t5321-pack-large-objects.sh                |   4 +-\n t/t5515-fetch-merge-logic.sh                 |  51 ++++-\n t/t5607-clone-bundle.sh                      |   2 +-\n t/t5703-upload-pack-ref-in-want.sh           |   7 +-\n t/t6000-rev-list-misc.sh                     |  13 +-\n t/t6006-rev-list-format.sh                   |   4 +-\n t/t6024-recursive-merge.sh                   |  15 +-\n 21 files changed, 559 insertions(+), 278 deletions(-)\n\n"},{"id":"390473","messageId":"20200125230035.136348-2-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 01/22] t/lib-pack: support SHA-256","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:07Z","receivedAt":"2020-01-25T23:00:43Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"Update the support routines for generating packs to support both SHA-1\nand SHA-256.  Compute the trailing pack checksum and its length\ncorrectly depending on the algorithm, and look up the object names based\non the algorithm as well.  Ensure we initialize the algorithm facts so\nthat our callers need not do so.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/lib-pack.sh | 35 ++++++++++++++++++++++++++++++-----\n 1 file changed, 30 insertions(+), 5 deletions(-)\n\ndiff --git a/t/lib-pack.sh b/t/lib-pack.sh\nindex c4d907a450..f3463170b3 100644\n--- a/t/lib-pack.sh\n+++ b/t/lib-pack.sh\n@@ -35,9 +35,11 @@ pack_header () {\n # have hardcoded some well-known objects. See the case statements below for the\n # complete list.\n pack_obj () {\n+\ttest_oid_init\n+\n \tcase \"$1\" in\n \t# empty blob\n-\te69de29bb2d1d6434b8b29ae775ad8c2e48c5391)\n+\t$EMPTY_BLOB)\n \t\tcase \"$2\" in\n \t\t'')\n \t\t\tprintf '\\060\\170\\234\\003\\0\\0\\0\\0\\1'\n@@ -47,7 +49,7 @@ pack_obj () {\n \t\t;;\n \n \t# blob containing \"\\7\\76\"\n-\te68fe8129b546b101aee9510c5328e7f21ca1d18)\n+\t$(test_oid packlib_7_76))\n \t\tcase \"$2\" in\n \t\t'')\n \t\t\tprintf '\\062\\170\\234\\143\\267\\3\\0\\0\\116\\0\\106'\n@@ -59,11 +61,18 @@ pack_obj () {\n \t\t\tprintf '\\234\\143\\142\\142\\142\\267\\003\\0\\0\\151\\0\\114'\n \t\t\treturn\n \t\t\t;;\n+\t\t37c8e2c15bb22b912e59b43fd51a4f7e9465ed0b5084c5a1411d991cbe630683)\n+\t\t\tprintf '\\165\\67\\310\\342\\301\\133\\262\\53\\221\\56\\131' &&\n+\t\t\tprintf '\\264\\77\\325\\32\\117\\176\\224\\145\\355\\13\\120' &&\n+\t\t\tprintf '\\204\\305\\241\\101\\35\\231\\34\\276\\143\\6\\203\\170' &&\n+\t\t\tprintf '\\234\\143\\142\\142\\142\\267\\003\\0\\0\\151\\0\\114'\n+\t\t\treturn\n+\t\t\t;;\n \t\tesac\n \t\t;;\n \n \t# blob containing \"\\7\\0\"\n-\t01d7713666f4de822776c7622c10f1b07de280dc)\n+\t$(test_oid packlib_7_0))\n \t\tcase \"$2\" in\n \t\t'')\n \t\t\tprintf '\\062\\170\\234\\143\\147\\0\\0\\0\\20\\0\\10'\n@@ -75,6 +84,13 @@ pack_obj () {\n \t\t\tprintf '\\143\\142\\142\\142\\147\\0\\0\\0\\53\\0\\16'\n \t\t\treturn\n \t\t\t;;\n+\t\t5d8e6fc40f2dab00e6983a48523fe57e621f46434cb58dbd4422fba03380d886)\n+\t\t\tprintf '\\165\\135\\216\\157\\304\\17\\55\\253\\0\\346\\230\\72' &&\n+\t\t\tprintf '\\110\\122\\77\\345\\176\\142\\37\\106\\103\\114\\265' &&\n+\t\t\tprintf '\\215\\275\\104\\42\\373\\240\\63\\200\\330\\206\\170\\234' &&\n+\t\t\tprintf '\\143\\142\\142\\142\\147\\0\\0\\0\\53\\0\\16'\n+\t\t\treturn\n+\t\t\t;;\n \t\tesac\n \t\t;;\n \tesac\n@@ -86,7 +102,7 @@ pack_obj () {\n \tthen\n \t\techo \"$1\" | git pack-objects --stdout >pack_obj.tmp &&\n \t\tsize=$(wc -c <pack_obj.tmp) &&\n-\t\tdd if=pack_obj.tmp bs=1 count=$((size - 20 - 12)) skip=12 &&\n+\t\tdd if=pack_obj.tmp bs=1 count=$((size - $(test_oid rawsz) - 12)) skip=12 &&\n \t\trm -f pack_obj.tmp\n \t\treturn\n \tfi\n@@ -97,7 +113,8 @@ pack_obj () {\n \n # Compute and append pack trailer to \"$1\"\n pack_trailer () {\n-\ttest-tool sha1 -b <\"$1\" >trailer.tmp &&\n+\ttest_oid_init &&\n+\ttest-tool $(test_oid algo) -b <\"$1\" >trailer.tmp &&\n \tcat trailer.tmp >>\"$1\" &&\n \trm -f trailer.tmp\n }\n@@ -108,3 +125,11 @@ pack_trailer () {\n clear_packs () {\n \trm -f .git/objects/pack/*\n }\n+\n+test_oid_cache <<-EOF\n+packlib_7_0 sha1:01d7713666f4de822776c7622c10f1b07de280dc\n+packlib_7_0 sha256:37c8e2c15bb22b912e59b43fd51a4f7e9465ed0b5084c5a1411d991cbe630683\n+\n+packlib_7_76 sha1:e68fe8129b546b101aee9510c5328e7f21ca1d18\n+packlib_7_76 sha256:5d8e6fc40f2dab00e6983a48523fe57e621f46434cb58dbd4422fba03380d886\n+EOF\n"},{"id":"390474","messageId":"20200125230035.136348-8-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 07/22] t3311: make test work with SHA-256","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:13Z","receivedAt":"2020-01-25T23:00:47Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"Replace the hard-coded SHA-1 constants with the use of test_oid to look\nup an appropriate constant for each hash algorithm.  In addition, adjust\nthe fanout checks to look for either zero or one slashes in the filename\nwithout needing to check for an explicit length.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t3311-notes-merge-fanout.sh | 60 ++++++++++++++++++++---------------\n 1 file changed, 35 insertions(+), 25 deletions(-)\n\ndiff --git a/t/t3311-notes-merge-fanout.sh b/t/t3311-notes-merge-fanout.sh\nindex 37151a3adc..5b675417e9 100755\n--- a/t/t3311-notes-merge-fanout.sh\n+++ b/t/t3311-notes-merge-fanout.sh\n@@ -29,15 +29,10 @@ verify_fanout () {\n \tgit ls-tree -r --name-only \"refs/notes/$notes_ref\" |\n \twhile read path\n \tdo\n-\t\tcase \"$path\" in\n-\t\t??/??????????????????????????????????????)\n-\t\t\t: true\n-\t\t\t;;\n-\t\t*)\n+\t\techo \"$path\" | grep \"^../[0-9a-f]*$\" || {\n \t\t\techo \"Invalid path \\\"$path\\\"\" &&\n-\t\t\treturn 1\n-\t\t\t;;\n-\t\tesac\n+\t\t\treturn 1;\n+\t\t}\n \tdone\n }\n \n@@ -48,15 +43,10 @@ verify_no_fanout () {\n \tgit ls-tree -r --name-only \"refs/notes/$notes_ref\" |\n \twhile read path\n \tdo\n-\t\tcase \"$path\" in\n-\t\t????????????????????????????????????????)\n-\t\t\t: true\n-\t\t\t;;\n-\t\t*)\n+\t\techo \"$path\" | grep -v \"^../.*\" || {\n \t\t\techo \"Invalid path \\\"$path\\\"\" &&\n-\t\t\treturn 1\n-\t\t\t;;\n-\t\tesac\n+\t\t\treturn 1;\n+\t\t}\n \tdone\n }\n \n@@ -67,7 +57,27 @@ test_expect_success 'setup a few initial commits with notes (notes ref: x)' '\n \tdo\n \t\ttest_commit \"commit$i\" >/dev/null &&\n \t\tgit notes add -m \"notes for commit$i\" || return 1\n-\tdone\n+\tdone &&\n+\n+\tgit log --format=oneline &&\n+\n+\ttest_oid_cache <<-EOF\n+\thash05a sha1:aed91155c7a72c2188e781fdf40e0f3761b299db\n+\thash04a sha1:99fab268f9d7ee7b011e091a436c78def8eeee69\n+\thash03a sha1:953c20ae26c7aa0b428c20693fe38bc687f9d1a9\n+\thash02a sha1:6358796131b8916eaa2dde6902642942a1cb37e1\n+\thash01a sha1:b02d459c32f0e68f2fe0981033bb34f38776ba47\n+\thash03b sha1:9f506ee70e20379d7f78204c77b334f43d77410d\n+\thash02b sha1:23a47d6ea7d589895faf800752054818e1e7627b\n+\n+\thash05a sha256:3aae5d26619d96dba93795f66325716e4cbc486884f95a6adee8fb0615a76d12\n+\thash04a sha256:07e43dd3d89fe634d3252e253b426aacc7285a995dcdbcf94ac284060a1122cf\n+\thash03a sha256:26fb52eaa7f4866bf735254587be7b31209ec10e525912ffd8e8ba549ba892ff\n+\thash02a sha256:b57ebdf23634e750dcbc4b9a37991d70f90830d568a0e4529ce9de0a3f8d605c\n+\thash01a sha256:377903b1572bd5117087a5518fcb1011b5053cccbc59e3c7c823a8615204173b\n+\thash03b sha256:04e7b392fda7c185bfa17c9179b56db732edc2dc2b3bf887308dcaabb717270d\n+\thash02b sha256:66099aaaec49a485ed990acadd9a9b81232ea592079964113d8f581ff69ef50b\n+\tEOF\n '\n \n commit_sha1=$(git rev-parse commit1^{commit})\n@@ -77,11 +87,11 @@ commit_sha4=$(git rev-parse commit4^{commit})\n commit_sha5=$(git rev-parse commit5^{commit})\n \n cat <<EOF | sort >expect_notes_x\n-aed91155c7a72c2188e781fdf40e0f3761b299db $commit_sha5\n-99fab268f9d7ee7b011e091a436c78def8eeee69 $commit_sha4\n-953c20ae26c7aa0b428c20693fe38bc687f9d1a9 $commit_sha3\n-6358796131b8916eaa2dde6902642942a1cb37e1 $commit_sha2\n-b02d459c32f0e68f2fe0981033bb34f38776ba47 $commit_sha1\n+$(test_oid hash05a) $commit_sha5\n+$(test_oid hash04a) $commit_sha4\n+$(test_oid hash03a) $commit_sha3\n+$(test_oid hash02a) $commit_sha2\n+$(test_oid hash01a) $commit_sha1\n EOF\n \n cat >expect_log_x <<EOF\n@@ -145,9 +155,9 @@ test_expect_success 'Fast-forward merge (y => x)' '\n '\n \n cat <<EOF | sort >expect_notes_z\n-9f506ee70e20379d7f78204c77b334f43d77410d $commit_sha3\n-23a47d6ea7d589895faf800752054818e1e7627b $commit_sha2\n-b02d459c32f0e68f2fe0981033bb34f38776ba47 $commit_sha1\n+$(test_oid hash03b) $commit_sha3\n+$(test_oid hash02b) $commit_sha2\n+$(test_oid hash01a) $commit_sha1\n EOF\n \n cat >expect_log_z <<EOF\n"},{"id":"390475","messageId":"20200125230035.136348-4-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 03/22] t3305: annotate with SHA1 prerequisite","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:09Z","receivedAt":"2020-01-25T23:00:47Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"This test relies on a roughly equal distribution of hashes for notes in\norder to ensure that fanouts are compressed.  If there are subtrees with\nonly one item left after removing notes, they'll end up still with one\nlevel of fanout, causing the test to fail.  The test happens to pass\nwith SHA-1, but doesn't necessarily with other hash algorithms, so\nannotate it with the SHA1 prerequisite.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t3305-notes-fanout.sh | 2 +-\n 1 file changed, 1 insertion(+), 1 deletion(-)\n\ndiff --git a/t/t3305-notes-fanout.sh b/t/t3305-notes-fanout.sh\nindex 831f83d211..3520402bb8 100755\n--- a/t/t3305-notes-fanout.sh\n+++ b/t/t3305-notes-fanout.sh\n@@ -67,7 +67,7 @@ test_expect_success 'most notes deleted correctly with git-notes' '\n \ttest_cmp expect output\n '\n \n-test_expect_success 'deleting most notes triggers fanout consolidation' '\n+test_expect_success SHA1 'deleting most notes triggers fanout consolidation' '\n \t# Expect entire notes tree to have a fanout == 0\n \tgit ls-tree -r --name-only refs/notes/commits |\n \twhile read path\n"},{"id":"390476","messageId":"20200125230035.136348-9-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 08/22] t4013: make test hash independent","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:14Z","receivedAt":"2020-01-25T23:00:48Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"This test produces a large number of diff formats and compares the\noutput with test files that have content specific to SHA-1. Since we are\nmore interested in the format of the diffs, and not their specific\nvalues, which are tested elsewhere, add a function which uses sed to\ntransform these specific object IDs into generic ones of the right size,\nwhich we can then compare.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t4013-diff-various.sh | 44 +++++++++++++++++++++++++++++++++++------\n 1 file changed, 38 insertions(+), 6 deletions(-)\n\ndiff --git a/t/t4013-diff-various.sh b/t/t4013-diff-various.sh\nindex 5ac94b390d..6f5f05c3a8 100755\n--- a/t/t4013-diff-various.sh\n+++ b/t/t4013-diff-various.sh\n@@ -120,6 +120,30 @@ test_expect_success setup '\n +*++ [initial] Initial\n EOF\n \n+process_diffs () {\n+\tx04=\"[0-9a-f][0-9a-f][0-9a-f][0-9a-f]\" &&\n+\tx07=\"$_x05[0-9a-f][0-9a-f]\" &&\n+\tsed -e \"s/$OID_REGEX/$ZERO_OID/g\" \\\n+\t    -e \"s/From $_x40 /From $ZERO_OID /\" \\\n+\t    -e \"s/from $_x40)/from $ZERO_OID)/\" \\\n+\t    -e \"s/commit $_x40\\$/commit $ZERO_OID/\" \\\n+\t    -e \"s/commit $_x40 (/commit $ZERO_OID (/\" \\\n+\t    -e \"s/$_x40 $_x40 $_x40/$ZERO_OID $ZERO_OID $ZERO_OID/\" \\\n+\t    -e \"s/$_x40 $_x40 /$ZERO_OID $ZERO_OID /\" \\\n+\t    -e \"s/^$_x40 $_x40$/$ZERO_OID $ZERO_OID/\" \\\n+\t    -e \"s/^$_x40 /$ZERO_OID /\" \\\n+\t    -e \"s/^$_x40$/$ZERO_OID/\" \\\n+\t    -e \"s/$x07\\.\\.$x07/fffffff..fffffff/g\" \\\n+\t    -e \"s/$x07,$x07\\.\\.$x07/fffffff,fffffff..fffffff/g\" \\\n+\t    -e \"s/$x07 $x07 $x07/fffffff fffffff fffffff/g\" \\\n+\t    -e \"s/$x07 $x07 /fffffff fffffff /g\" \\\n+\t    -e \"s/Merge: $x07 $x07/Merge: fffffff fffffff/g\" \\\n+\t    -e \"s/$x07\\.\\.\\./fffffff.../g\" \\\n+\t    -e \"s/ $x04\\.\\.\\./ ffff.../g\" \\\n+\t    -e \"s/ $x04/ ffff/g\" \\\n+\t    \"$1\"\n+}\n+\n V=$(git version | sed -e 's/^git version //' -e 's/\\./\\\\./g')\n while read magic cmd\n do\n@@ -158,13 +182,15 @@ do\n \t\t} >\"$actual\" &&\n \t\tif test -f \"$expect\"\n \t\tthen\n+\t\t\tprocess_diffs \"$actual\" >actual &&\n+\t\t\tprocess_diffs \"$expect\" >expect &&\n \t\t\tcase $cmd in\n \t\t\t*format-patch* | *-stat*)\n-\t\t\t\ttest_i18ncmp \"$expect\" \"$actual\";;\n+\t\t\t\ttest_i18ncmp expect actual;;\n \t\t\t*)\n-\t\t\t\ttest_cmp \"$expect\" \"$actual\";;\n+\t\t\t\ttest_cmp expect actual;;\n \t\t\tesac &&\n-\t\t\trm -f \"$actual\"\n+\t\t\trm -f \"$actual\" actual expect\n \t\telse\n \t\t\t# this is to help developing new tests.\n \t\t\tcp \"$actual\" \"$expect\"\n@@ -383,16 +409,22 @@ test_expect_success 'log -S requires an argument' '\n test_expect_success 'diff --cached on unborn branch' '\n \techo ref: refs/heads/unborn >.git/HEAD &&\n \tgit diff --cached >result &&\n-\ttest_cmp \"$TEST_DIRECTORY/t4013/diff.diff_--cached\" result\n+\tprocess_diffs result >actual &&\n+\tprocess_diffs \"$TEST_DIRECTORY/t4013/diff.diff_--cached\" >expected &&\n+\ttest_cmp expected actual\n '\n \n test_expect_success 'diff --cached -- file on unborn branch' '\n \tgit diff --cached -- file0 >result &&\n-\ttest_cmp \"$TEST_DIRECTORY/t4013/diff.diff_--cached_--_file0\" result\n+\tprocess_diffs result >actual &&\n+\tprocess_diffs \"$TEST_DIRECTORY/t4013/diff.diff_--cached_--_file0\" >expected &&\n+\ttest_cmp expected actual\n '\n test_expect_success 'diff --line-prefix with spaces' '\n \tgit diff --line-prefix=\"| | | \" --cached -- file0 >result &&\n-\ttest_cmp \"$TEST_DIRECTORY/t4013/diff.diff_--line-prefix_--cached_--_file0\" result\n+\tprocess_diffs result >actual &&\n+\tprocess_diffs \"$TEST_DIRECTORY/t4013/diff.diff_--line-prefix_--cached_--_file0\" >expected &&\n+\ttest_cmp expected actual\n '\n \n test_expect_success 'diff-tree --stdin with log formatting' '\n"},{"id":"390477","messageId":"20200125230035.136348-5-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 04/22] t3308: make test work with SHA-256","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:10Z","receivedAt":"2020-01-25T23:00:48Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"Replace the hard-coded SHA-1 constants with the use of test_oid to look\nup an appropriate constant for each hash algorithm.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t3308-notes-merge.sh | 83 ++++++++++++++++++++++++++++--------------\n 1 file changed, 55 insertions(+), 28 deletions(-)\n\ndiff --git a/t/t3308-notes-merge.sh b/t/t3308-notes-merge.sh\nindex d60588ec8f..790e292966 100755\n--- a/t/t3308-notes-merge.sh\n+++ b/t/t3308-notes-merge.sh\n@@ -20,7 +20,34 @@ test_expect_success setup '\n \tgit notes add -m \"Notes on 3rd commit\" 3rd &&\n \tgit notes add -m \"Notes on 4th commit\" 4th &&\n \t# Copy notes to remote-notes\n-\tgit fetch . refs/notes/*:refs/remote-notes/origin/*\n+\tgit fetch . refs/notes/*:refs/remote-notes/origin/* &&\n+\n+\ttest_oid_init &&\n+\ttest_oid_cache <<-EOF\n+\thash4a sha1:5e93d24084d32e1cb61f7070505b9d2530cca987\n+\thash3a sha1:8366731eeee53787d2bdf8fc1eff7d94757e8da0\n+\thash2a sha1:eede89064cd42441590d6afec6c37b321ada3389\n+\thash1a sha1:daa55ffad6cb99bf64226532147ffcaf5ce8bdd1\n+\thash5b sha1:0f2efbd00262f2fd41dfae33df8765618eeacd99\n+\thash4b sha1:dec2502dac3ea161543f71930044deff93fa945c\n+\thash3b sha1:4069cdb399fd45463ec6eef8e051a16a03592d91\n+\thash2c sha1:d000d30e6ddcfce3a8122c403226a2ce2fd04d9d\n+\thash1c sha1:43add6bd0c8c0bc871ac7991e0f5573cfba27804\n+\thash4d sha1:1f257a3a90328557c452f0817d6cc50c89d315d4\n+\thash3d sha1:05a4927951bcef347f51486575b878b2b60137f2\n+\n+\thash4a sha256:eef876be1d32ac2e2e42240e0429325cec116e55e88cb2969899fac695aa762f\n+\thash3a sha256:cf7cd1bc091d7ba4166a86df864110e42087cd893a5ae96bc50d637e0290939d\n+\thash2a sha256:21ddde7ebce2c285213898cb04deca0fd3209610cf7aaf8222e4e2f45262fae2\n+\thash1a sha256:f9fe0eda16c6027732ed9d4295689a03abd16f893be69b3dcbf4037ddb191921\n+\thash5b sha256:20046f2244577797a9e3d3f790ea9eca4d8a6bafb2a5570bcb0e03aa02ce100b\n+\thash4b sha256:f90563d134c61a95bb88afbd45d48ccc9e919c62aa6fbfcd483302b3e4d8dbcb\n+\thash3b sha256:988f2aca9f2d87e93e6a73197c2bb99560cc44a2f92d18653968f956f01221e0\n+\thash2c sha256:84153b777b4d42827a756c6578dcdb59d8ae5d1360b874fb37c430150c825c26\n+\thash1c sha256:9beb2bc4eef72e4c4087be168a20573e34d993d9ab1883055f23e322afa06567\n+\thash4d sha256:32de39dc06e679a7abb2d4a55ede7709b3124340a4a90aa305971b1c72ac319d\n+\thash3d sha256:fa73b20e41cbb7541c4c81d1535016131dbfbeb05bf6a71f6115e9cad31c7af5\n+\tEOF\n '\n \n commit_sha1=$(git rev-parse 1st^{commit})\n@@ -40,10 +67,10 @@ verify_notes () {\n }\n \n cat <<EOF | sort >expect_notes_x\n-5e93d24084d32e1cb61f7070505b9d2530cca987 $commit_sha4\n-8366731eeee53787d2bdf8fc1eff7d94757e8da0 $commit_sha3\n-eede89064cd42441590d6afec6c37b321ada3389 $commit_sha2\n-daa55ffad6cb99bf64226532147ffcaf5ce8bdd1 $commit_sha1\n+$(test_oid hash4a) $commit_sha4\n+$(test_oid hash3a) $commit_sha3\n+$(test_oid hash2a) $commit_sha2\n+$(test_oid hash1a) $commit_sha1\n EOF\n \n cat >expect_log_x <<EOF\n@@ -126,10 +153,10 @@ test_expect_success 'merge previous notes commit (y^ => y) => No-op' '\n '\n \n cat <<EOF | sort >expect_notes_y\n-0f2efbd00262f2fd41dfae33df8765618eeacd99 $commit_sha5\n-dec2502dac3ea161543f71930044deff93fa945c $commit_sha4\n-4069cdb399fd45463ec6eef8e051a16a03592d91 $commit_sha3\n-daa55ffad6cb99bf64226532147ffcaf5ce8bdd1 $commit_sha1\n+$(test_oid hash5b) $commit_sha5\n+$(test_oid hash4b) $commit_sha4\n+$(test_oid hash3b) $commit_sha3\n+$(test_oid hash1a) $commit_sha1\n EOF\n \n cat >expect_log_y <<EOF\n@@ -193,11 +220,11 @@ test_expect_success 'merge empty notes ref (z => y)' '\n '\n \n cat <<EOF | sort >expect_notes_y\n-0f2efbd00262f2fd41dfae33df8765618eeacd99 $commit_sha5\n-dec2502dac3ea161543f71930044deff93fa945c $commit_sha4\n-4069cdb399fd45463ec6eef8e051a16a03592d91 $commit_sha3\n-d000d30e6ddcfce3a8122c403226a2ce2fd04d9d $commit_sha2\n-43add6bd0c8c0bc871ac7991e0f5573cfba27804 $commit_sha1\n+$(test_oid hash5b) $commit_sha5\n+$(test_oid hash4b) $commit_sha4\n+$(test_oid hash3b) $commit_sha3\n+$(test_oid hash2c) $commit_sha2\n+$(test_oid hash1c) $commit_sha1\n EOF\n \n cat >expect_log_y <<EOF\n@@ -231,9 +258,9 @@ test_expect_success 'change notes on other notes ref (y)' '\n '\n \n cat <<EOF | sort >expect_notes_x\n-0f2efbd00262f2fd41dfae33df8765618eeacd99 $commit_sha5\n-1f257a3a90328557c452f0817d6cc50c89d315d4 $commit_sha4\n-daa55ffad6cb99bf64226532147ffcaf5ce8bdd1 $commit_sha1\n+$(test_oid hash5b) $commit_sha5\n+$(test_oid hash4d) $commit_sha4\n+$(test_oid hash1a) $commit_sha1\n EOF\n \n cat >expect_log_x <<EOF\n@@ -262,10 +289,10 @@ test_expect_success 'change notes on notes ref (x)' '\n '\n \n cat <<EOF | sort >expect_notes_x\n-0f2efbd00262f2fd41dfae33df8765618eeacd99 $commit_sha5\n-1f257a3a90328557c452f0817d6cc50c89d315d4 $commit_sha4\n-d000d30e6ddcfce3a8122c403226a2ce2fd04d9d $commit_sha2\n-43add6bd0c8c0bc871ac7991e0f5573cfba27804 $commit_sha1\n+$(test_oid hash5b) $commit_sha5\n+$(test_oid hash4d) $commit_sha4\n+$(test_oid hash2c) $commit_sha2\n+$(test_oid hash1c) $commit_sha1\n EOF\n \n cat >expect_log_x <<EOF\n@@ -296,8 +323,8 @@ test_expect_success 'merge y into x => Non-conflicting 3-way merge' '\n '\n \n cat <<EOF | sort >expect_notes_w\n-05a4927951bcef347f51486575b878b2b60137f2 $commit_sha3\n-d000d30e6ddcfce3a8122c403226a2ce2fd04d9d $commit_sha2\n+$(test_oid hash3d) $commit_sha3\n+$(test_oid hash2c) $commit_sha2\n EOF\n \n cat >expect_log_w <<EOF\n@@ -326,11 +353,11 @@ test_expect_success 'create notes on new, separate notes ref (w)' '\n '\n \n cat <<EOF | sort >expect_notes_x\n-0f2efbd00262f2fd41dfae33df8765618eeacd99 $commit_sha5\n-1f257a3a90328557c452f0817d6cc50c89d315d4 $commit_sha4\n-05a4927951bcef347f51486575b878b2b60137f2 $commit_sha3\n-d000d30e6ddcfce3a8122c403226a2ce2fd04d9d $commit_sha2\n-43add6bd0c8c0bc871ac7991e0f5573cfba27804 $commit_sha1\n+$(test_oid hash5b) $commit_sha5\n+$(test_oid hash4d) $commit_sha4\n+$(test_oid hash3d) $commit_sha3\n+$(test_oid hash2c) $commit_sha2\n+$(test_oid hash1c) $commit_sha1\n EOF\n \n cat >expect_log_x <<EOF\n"},{"id":"390478","messageId":"20200125230035.136348-6-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 05/22] t3309: make test work with SHA-256","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:11Z","receivedAt":"2020-01-25T23:00:50Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"Replace the hard-coded SHA-1 constants with the use of test_oid to look\nup an appropriate constant for each hash algorithm.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t3309-notes-merge-auto-resolve.sh | 228 ++++++++++++++++++----------\n 1 file changed, 144 insertions(+), 84 deletions(-)\n\ndiff --git a/t/t3309-notes-merge-auto-resolve.sh b/t/t3309-notes-merge-auto-resolve.sh\nindex 14c2adf970..141d3e4ca4 100755\n--- a/t/t3309-notes-merge-auto-resolve.sh\n+++ b/t/t3309-notes-merge-auto-resolve.sh\n@@ -23,7 +23,67 @@ test_expect_success 'setup commits' '\n \ttest_commit 12th &&\n \ttest_commit 13th &&\n \ttest_commit 14th &&\n-\ttest_commit 15th\n+\ttest_commit 15th &&\n+\n+\ttest_oid_cache <<-EOF\n+\thash15a sha1:457a85d6c814ea208550f15fcc48f804ac8dc023\n+\thash14a sha1:b0c95b954301d69da2bc3723f4cb1680d355937c\n+\thash13a sha1:5d30216a129eeffa97d9694ffe8c74317a560315\n+\thash12a sha1:dd161bc149470fd890dd4ab52a4cbd79bbd18c36\n+\thash11a sha1:7abbc45126d680336fb24294f013a7cdfa3ed545\n+\thash10a sha1:b8d03e173f67f6505a76f6e00cf93440200dd9be\n+\thash09a sha1:20c613c835011c48a5abe29170a2402ca6354910\n+\thash08a sha1:a3daf8a1e4e5dc3409a303ad8481d57bfea7f5d6\n+\thash07a sha1:897003322b53bc6ca098e9324ee508362347e734\n+\thash06a sha1:11d97fdebfa5ceee540a3da07bce6fa0222bc082\n+\thash15b sha1:68b8630d25516028bed862719855b3d6768d7833\n+\thash14b sha1:5de7ea7ad4f47e7ff91989fb82234634730f75df\n+\thash13b sha1:3a631fdb6f41b05b55d8f4baf20728ba8f6fccbc\n+\thash12b sha1:a66055fa82f7a03fe0c02a6aba3287a85abf7c62\n+\thash05b sha1:154508c7a0bcad82b6fe4b472bc4c26b3bf0825b\n+\thash04b sha1:e2bfd06a37dd2031684a59a6e2b033e212239c78\n+\thash03b sha1:5772f42408c0dd6f097a7ca2d24de0e78d1c46b1\n+\thash15c sha1:9b4b2c61f0615412da3c10f98ff85b57c04ec765\n+\thash11c sha1:7e3c53503a3db8dd996cb62e37c66e070b44b54d\n+\thash08c sha1:851e1638784a884c7dd26c5d41f3340f6387413a\n+\thash05c sha1:99fc34adfc400b95c67b013115e37e31aa9a6d23\n+\thash02c sha1:283b48219aee9a4105f6cab337e789065c82c2b9\n+\thash15d sha1:7c4e546efd0fe939f876beb262ece02797880b54\n+\thash05d sha1:6c841cc36ea496027290967ca96bd2bef54dbb47\n+\thash15e sha1:d682107b8bf7a7aea1e537a8d5cb6a12b60135f1\n+\thash05e sha1:357b6ca14c7afd59b7f8b8aaaa6b8b723771135b\n+\thash15f sha1:6be90240b5f54594203e25d9f2f64b7567175aee\n+\thash05f sha1:660311d7f78dc53db12ac373a43fca7465381a7e\n+\n+\thash15a sha256:45b1558e5c1b75f570010fa48aaa67bb2289fcd431b34ad81cb4c8b95f4f872a\n+\thash14a sha256:6e7af179ea4dd28afdc83ae6912ba0098cdeff764b26a8b750b157dd81749092\n+\thash13a sha256:7353089961baf555388e1bac68c67c8ea94b08ccbd97532201cf7f6790703052\n+\thash12a sha256:5863e4521689ee1879ceab3b38d39e93ab5b51ec70aaf6a96ad388fbdedfa25e\n+\thash11a sha256:82a0ec0338b4ecf8b44304badf4ad38d7469dc41827f38d7ba6c42e3bae3ee98\n+\thash10a sha256:e84f2564e92de9792c93b8d197262c735d7ccb1de6025cef8759af8f6c3308eb\n+\thash09a sha256:4dd07764bcec696f195c0ea71ae89e174876403af1637e4642b8f4453fd23028\n+\thash08a sha256:02132c4546cd88a1d0aa5854dd55da120927f7904ba16afe36fe03e91a622067\n+\thash07a sha256:369baf7d00c6720efdc10273493555f943051f84a4706fb24caeb353fa4789db\n+\thash06a sha256:52d32c10353583b2d96a5849b1f1f43c8018e76f3e8ef1b0d46eb5cff7cdefaf\n+\thash15b sha256:345e6660b345fa174738a31a7a59423c394bdf414804e200bc510c65d971ae96\n+\thash14b sha256:7653a6596021c52e405cba979eea15a729993e7102b9a61ba4667e34f0ead4a1\n+\thash13b sha256:0f202a0b6b9690de2349c173dfd766a37e82744f61c14f1c389306f1d69f470b\n+\thash12b sha256:eb00f219c026136ea6535b16ff8ec3efa510e6bf50098ca041e1a2a1d4b79840\n+\thash05b sha256:993b2290cd0c24c27c849d99f1904f3b590f77af0f539932734ad05679ac5a2f\n+\thash04b sha256:c7fba0d6104917fbf35258f40b9fa4fc697cfa992deecd1570a3b08d0a5587a9\n+\thash03b sha256:7287a2d78a3766c181b08df38951d784b08b72a44f571ed6d855bd0be22c70f6\n+\thash15c sha256:62316660a22bf97857dc4a16709ec4d93a224e8c9f37d661ef91751e1f4c4166\n+\thash11c sha256:51c3763de9b08309370adc5036d58debb331980e73097902957c444602551daa\n+\thash08c sha256:22cf1fa29599898a7218c51135d66ed85d22aad584f77db3305dedce4c3d4798\n+\thash05c sha256:2508fd86db980f0508893a1c1571bdf3b2ee113dc25ddb1a3a2fb94bd6cd0d58\n+\thash02c sha256:63bb527e0b4e1c8e1dd0d54dd778ca7c3718689fd6e37c473044cfbcf1cacfdb\n+\thash15d sha256:667acb4e2d5f8df15e5aea4506dfd16d25bc7feca70fdb0d965a7222f983bb88\n+\thash05d sha256:09e6b5a6fe666c4a027674b6611a254b7d2528cd211c6b5288d1b4db6c741dfa\n+\thash15e sha256:e8cbf52f6fcadc6de3c7761e64a89e9fe38d19a03d3e28ef6ca8596d93fc4f3a\n+\thash05e sha256:cdb1e19f7ba1539f95af51a57edeb88a7ecc97d3c2f52da8c4c86af308595607\n+\thash15f sha256:29c14cb92da448a923963b8a43994268b19c2e57913de73f3667421fd2c0eeec\n+\thash05f sha256:14a6e641b2c0a9f398ebac6b4d34afa5efea4c52d2631382f45f8f662266903b\n+\tEOF\n '\n \n commit_sha1=$(git rev-parse 1st^{commit})\n@@ -68,16 +128,16 @@ test_expect_success 'setup merge base (x)' '\n '\n \n cat <<EOF | sort >expect_notes_x\n-457a85d6c814ea208550f15fcc48f804ac8dc023 $commit_sha15\n-b0c95b954301d69da2bc3723f4cb1680d355937c $commit_sha14\n-5d30216a129eeffa97d9694ffe8c74317a560315 $commit_sha13\n-dd161bc149470fd890dd4ab52a4cbd79bbd18c36 $commit_sha12\n-7abbc45126d680336fb24294f013a7cdfa3ed545 $commit_sha11\n-b8d03e173f67f6505a76f6e00cf93440200dd9be $commit_sha10\n-20c613c835011c48a5abe29170a2402ca6354910 $commit_sha9\n-a3daf8a1e4e5dc3409a303ad8481d57bfea7f5d6 $commit_sha8\n-897003322b53bc6ca098e9324ee508362347e734 $commit_sha7\n-11d97fdebfa5ceee540a3da07bce6fa0222bc082 $commit_sha6\n+$(test_oid hash15a) $commit_sha15\n+$(test_oid hash14a) $commit_sha14\n+$(test_oid hash13a) $commit_sha13\n+$(test_oid hash12a) $commit_sha12\n+$(test_oid hash11a) $commit_sha11\n+$(test_oid hash10a) $commit_sha10\n+$(test_oid hash09a) $commit_sha9\n+$(test_oid hash08a) $commit_sha8\n+$(test_oid hash07a) $commit_sha7\n+$(test_oid hash06a) $commit_sha6\n EOF\n \n cat >expect_log_x <<EOF\n@@ -141,16 +201,16 @@ test_expect_success 'setup local branch (y)' '\n '\n \n cat <<EOF | sort >expect_notes_y\n-68b8630d25516028bed862719855b3d6768d7833 $commit_sha15\n-5de7ea7ad4f47e7ff91989fb82234634730f75df $commit_sha14\n-3a631fdb6f41b05b55d8f4baf20728ba8f6fccbc $commit_sha13\n-a66055fa82f7a03fe0c02a6aba3287a85abf7c62 $commit_sha12\n-7abbc45126d680336fb24294f013a7cdfa3ed545 $commit_sha11\n-b8d03e173f67f6505a76f6e00cf93440200dd9be $commit_sha10\n-20c613c835011c48a5abe29170a2402ca6354910 $commit_sha9\n-154508c7a0bcad82b6fe4b472bc4c26b3bf0825b $commit_sha5\n-e2bfd06a37dd2031684a59a6e2b033e212239c78 $commit_sha4\n-5772f42408c0dd6f097a7ca2d24de0e78d1c46b1 $commit_sha3\n+$(test_oid hash15b) $commit_sha15\n+$(test_oid hash14b) $commit_sha14\n+$(test_oid hash13b) $commit_sha13\n+$(test_oid hash12b) $commit_sha12\n+$(test_oid hash11a) $commit_sha11\n+$(test_oid hash10a) $commit_sha10\n+$(test_oid hash09a) $commit_sha9\n+$(test_oid hash05b) $commit_sha5\n+$(test_oid hash04b) $commit_sha4\n+$(test_oid hash03b) $commit_sha3\n EOF\n \n cat >expect_log_y <<EOF\n@@ -214,16 +274,16 @@ test_expect_success 'setup remote branch (z)' '\n '\n \n cat <<EOF | sort >expect_notes_z\n-9b4b2c61f0615412da3c10f98ff85b57c04ec765 $commit_sha15\n-5de7ea7ad4f47e7ff91989fb82234634730f75df $commit_sha14\n-5d30216a129eeffa97d9694ffe8c74317a560315 $commit_sha13\n-7e3c53503a3db8dd996cb62e37c66e070b44b54d $commit_sha11\n-b8d03e173f67f6505a76f6e00cf93440200dd9be $commit_sha10\n-851e1638784a884c7dd26c5d41f3340f6387413a $commit_sha8\n-897003322b53bc6ca098e9324ee508362347e734 $commit_sha7\n-99fc34adfc400b95c67b013115e37e31aa9a6d23 $commit_sha5\n-e2bfd06a37dd2031684a59a6e2b033e212239c78 $commit_sha4\n-283b48219aee9a4105f6cab337e789065c82c2b9 $commit_sha2\n+$(test_oid hash15c) $commit_sha15\n+$(test_oid hash14b) $commit_sha14\n+$(test_oid hash13a) $commit_sha13\n+$(test_oid hash11c) $commit_sha11\n+$(test_oid hash10a) $commit_sha10\n+$(test_oid hash08c) $commit_sha8\n+$(test_oid hash07a) $commit_sha7\n+$(test_oid hash05c) $commit_sha5\n+$(test_oid hash04b) $commit_sha4\n+$(test_oid hash02c) $commit_sha2\n EOF\n \n cat >expect_log_z <<EOF\n@@ -306,16 +366,16 @@ test_expect_success 'merge z into y with invalid configuration option => Fail/No\n '\n \n cat <<EOF | sort >expect_notes_ours\n-68b8630d25516028bed862719855b3d6768d7833 $commit_sha15\n-5de7ea7ad4f47e7ff91989fb82234634730f75df $commit_sha14\n-3a631fdb6f41b05b55d8f4baf20728ba8f6fccbc $commit_sha13\n-a66055fa82f7a03fe0c02a6aba3287a85abf7c62 $commit_sha12\n-7e3c53503a3db8dd996cb62e37c66e070b44b54d $commit_sha11\n-b8d03e173f67f6505a76f6e00cf93440200dd9be $commit_sha10\n-154508c7a0bcad82b6fe4b472bc4c26b3bf0825b $commit_sha5\n-e2bfd06a37dd2031684a59a6e2b033e212239c78 $commit_sha4\n-5772f42408c0dd6f097a7ca2d24de0e78d1c46b1 $commit_sha3\n-283b48219aee9a4105f6cab337e789065c82c2b9 $commit_sha2\n+$(test_oid hash15b) $commit_sha15\n+$(test_oid hash14b) $commit_sha14\n+$(test_oid hash13b) $commit_sha13\n+$(test_oid hash12b) $commit_sha12\n+$(test_oid hash11c) $commit_sha11\n+$(test_oid hash10a) $commit_sha10\n+$(test_oid hash05b) $commit_sha5\n+$(test_oid hash04b) $commit_sha4\n+$(test_oid hash03b) $commit_sha3\n+$(test_oid hash02c) $commit_sha2\n EOF\n \n cat >expect_log_ours <<EOF\n@@ -395,16 +455,16 @@ test_expect_success 'reset to pre-merge state (y)' '\n '\n \n cat <<EOF | sort >expect_notes_theirs\n-9b4b2c61f0615412da3c10f98ff85b57c04ec765 $commit_sha15\n-5de7ea7ad4f47e7ff91989fb82234634730f75df $commit_sha14\n-3a631fdb6f41b05b55d8f4baf20728ba8f6fccbc $commit_sha13\n-7e3c53503a3db8dd996cb62e37c66e070b44b54d $commit_sha11\n-b8d03e173f67f6505a76f6e00cf93440200dd9be $commit_sha10\n-851e1638784a884c7dd26c5d41f3340f6387413a $commit_sha8\n-99fc34adfc400b95c67b013115e37e31aa9a6d23 $commit_sha5\n-e2bfd06a37dd2031684a59a6e2b033e212239c78 $commit_sha4\n-5772f42408c0dd6f097a7ca2d24de0e78d1c46b1 $commit_sha3\n-283b48219aee9a4105f6cab337e789065c82c2b9 $commit_sha2\n+$(test_oid hash15c) $commit_sha15\n+$(test_oid hash14b) $commit_sha14\n+$(test_oid hash13b) $commit_sha13\n+$(test_oid hash11c) $commit_sha11\n+$(test_oid hash10a) $commit_sha10\n+$(test_oid hash08c) $commit_sha8\n+$(test_oid hash05c) $commit_sha5\n+$(test_oid hash04b) $commit_sha4\n+$(test_oid hash03b) $commit_sha3\n+$(test_oid hash02c) $commit_sha2\n EOF\n \n cat >expect_log_theirs <<EOF\n@@ -473,17 +533,17 @@ test_expect_success 'reset to pre-merge state (y)' '\n '\n \n cat <<EOF | sort >expect_notes_union\n-7c4e546efd0fe939f876beb262ece02797880b54 $commit_sha15\n-5de7ea7ad4f47e7ff91989fb82234634730f75df $commit_sha14\n-3a631fdb6f41b05b55d8f4baf20728ba8f6fccbc $commit_sha13\n-a66055fa82f7a03fe0c02a6aba3287a85abf7c62 $commit_sha12\n-7e3c53503a3db8dd996cb62e37c66e070b44b54d $commit_sha11\n-b8d03e173f67f6505a76f6e00cf93440200dd9be $commit_sha10\n-851e1638784a884c7dd26c5d41f3340f6387413a $commit_sha8\n-6c841cc36ea496027290967ca96bd2bef54dbb47 $commit_sha5\n-e2bfd06a37dd2031684a59a6e2b033e212239c78 $commit_sha4\n-5772f42408c0dd6f097a7ca2d24de0e78d1c46b1 $commit_sha3\n-283b48219aee9a4105f6cab337e789065c82c2b9 $commit_sha2\n+$(test_oid hash15d) $commit_sha15\n+$(test_oid hash14b) $commit_sha14\n+$(test_oid hash13b) $commit_sha13\n+$(test_oid hash12b) $commit_sha12\n+$(test_oid hash11c) $commit_sha11\n+$(test_oid hash10a) $commit_sha10\n+$(test_oid hash08c) $commit_sha8\n+$(test_oid hash05d) $commit_sha5\n+$(test_oid hash04b) $commit_sha4\n+$(test_oid hash03b) $commit_sha3\n+$(test_oid hash02c) $commit_sha2\n EOF\n \n cat >expect_log_union <<EOF\n@@ -574,17 +634,17 @@ test_expect_success 'merge z into y with \"manual\" per-ref only checks specific r\n '\n \n cat <<EOF | sort >expect_notes_union2\n-d682107b8bf7a7aea1e537a8d5cb6a12b60135f1 $commit_sha15\n-5de7ea7ad4f47e7ff91989fb82234634730f75df $commit_sha14\n-3a631fdb6f41b05b55d8f4baf20728ba8f6fccbc $commit_sha13\n-a66055fa82f7a03fe0c02a6aba3287a85abf7c62 $commit_sha12\n-7e3c53503a3db8dd996cb62e37c66e070b44b54d $commit_sha11\n-b8d03e173f67f6505a76f6e00cf93440200dd9be $commit_sha10\n-851e1638784a884c7dd26c5d41f3340f6387413a $commit_sha8\n-357b6ca14c7afd59b7f8b8aaaa6b8b723771135b $commit_sha5\n-e2bfd06a37dd2031684a59a6e2b033e212239c78 $commit_sha4\n-5772f42408c0dd6f097a7ca2d24de0e78d1c46b1 $commit_sha3\n-283b48219aee9a4105f6cab337e789065c82c2b9 $commit_sha2\n+$(test_oid hash15e) $commit_sha15\n+$(test_oid hash14b) $commit_sha14\n+$(test_oid hash13b) $commit_sha13\n+$(test_oid hash12b) $commit_sha12\n+$(test_oid hash11c) $commit_sha11\n+$(test_oid hash10a) $commit_sha10\n+$(test_oid hash08c) $commit_sha8\n+$(test_oid hash05e) $commit_sha5\n+$(test_oid hash04b) $commit_sha4\n+$(test_oid hash03b) $commit_sha3\n+$(test_oid hash02c) $commit_sha2\n EOF\n \n cat >expect_log_union2 <<EOF\n@@ -648,17 +708,17 @@ test_expect_success 'reset to pre-merge state (z)' '\n '\n \n cat <<EOF | sort >expect_notes_cat_sort_uniq\n-6be90240b5f54594203e25d9f2f64b7567175aee $commit_sha15\n-5de7ea7ad4f47e7ff91989fb82234634730f75df $commit_sha14\n-3a631fdb6f41b05b55d8f4baf20728ba8f6fccbc $commit_sha13\n-a66055fa82f7a03fe0c02a6aba3287a85abf7c62 $commit_sha12\n-7e3c53503a3db8dd996cb62e37c66e070b44b54d $commit_sha11\n-b8d03e173f67f6505a76f6e00cf93440200dd9be $commit_sha10\n-851e1638784a884c7dd26c5d41f3340f6387413a $commit_sha8\n-660311d7f78dc53db12ac373a43fca7465381a7e $commit_sha5\n-e2bfd06a37dd2031684a59a6e2b033e212239c78 $commit_sha4\n-5772f42408c0dd6f097a7ca2d24de0e78d1c46b1 $commit_sha3\n-283b48219aee9a4105f6cab337e789065c82c2b9 $commit_sha2\n+$(test_oid hash15f) $commit_sha15\n+$(test_oid hash14b) $commit_sha14\n+$(test_oid hash13b) $commit_sha13\n+$(test_oid hash12b) $commit_sha12\n+$(test_oid hash11c) $commit_sha11\n+$(test_oid hash10a) $commit_sha10\n+$(test_oid hash08c) $commit_sha8\n+$(test_oid hash05f) $commit_sha5\n+$(test_oid hash04b) $commit_sha4\n+$(test_oid hash03b) $commit_sha3\n+$(test_oid hash02c) $commit_sha2\n EOF\n \n cat >expect_log_cat_sort_uniq <<EOF\n"},{"id":"390479","messageId":"20200125230035.136348-10-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 09/22] t4060: make test work with SHA-256","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:15Z","receivedAt":"2020-01-25T23:00:51Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"In this test, there are two main types of object IDs we see in the\ndiffs: the ones for the submodules, which we care about, and the ones\nfor the individual files, which are unrelated to what we're testing.\nMuch of the test already computes the former, so extend the rest of the\ntest to do so as well.  Add a diff comparison function that normalizes\nthe differences in the latter, since they're not explicitly what we're\ntesting.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t4060-diff-submodule-option-diff-format.sh | 126 ++++++++++---------\n 1 file changed, 70 insertions(+), 56 deletions(-)\n\ndiff --git a/t/t4060-diff-submodule-option-diff-format.sh b/t/t4060-diff-submodule-option-diff-format.sh\nindex 9dcb69df5c..fc8229c726 100755\n--- a/t/t4060-diff-submodule-option-diff-format.sh\n+++ b/t/t4060-diff-submodule-option-diff-format.sh\n@@ -42,6 +42,17 @@ commit_file () {\n \tgit commit \"$@\" -m \"Commit $*\" >/dev/null\n }\n \n+diff_cmp () {\n+       for i in \"$1\" \"$2\"\n+       do\n+\t\tsed -e 's/^index 0000000\\.\\.[0-9a-f]*/index 0000000..1234567/' \\\n+\t\t-e 's/^index [0-9a-f]*\\.\\.[0-9a-f]*/index 1234567..89abcde/' \\\n+\t\t\"$i\" >\"$i.compare\" || return 1\n+       done &&\n+       test_cmp \"$1.compare\" \"$2.compare\" &&\n+       rm -f \"$1.compare\" \"$2.compare\"\n+}\n+\n test_expect_success 'setup repository' '\n \ttest_create_repo sm1 &&\n \tadd_file . foo &&\n@@ -69,7 +80,7 @@ test_expect_success 'added submodule' '\n \t@@ -0,0 +1 @@\n \t+foo2\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n test_expect_success 'added submodule, set diff.submodule' '\n@@ -93,7 +104,7 @@ test_expect_success 'added submodule, set diff.submodule' '\n \t@@ -0,0 +1 @@\n \t+foo2\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n test_expect_success '--submodule=short overrides diff.submodule' '\n@@ -109,7 +120,7 @@ test_expect_success '--submodule=short overrides diff.submodule' '\n \t@@ -0,0 +1 @@\n \t+Subproject commit $fullhead1\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n test_expect_success 'diff.submodule does not affect plumbing' '\n@@ -124,7 +135,7 @@ test_expect_success 'diff.submodule does not affect plumbing' '\n \t@@ -0,0 +1 @@\n \t+Subproject commit $fullhead1\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n commit_file sm1 &&\n@@ -142,7 +153,7 @@ test_expect_success 'modified submodule(forward)' '\n \t@@ -0,0 +1 @@\n \t+foo3\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n test_expect_success 'modified submodule(forward)' '\n@@ -157,7 +168,7 @@ test_expect_success 'modified submodule(forward)' '\n \t@@ -0,0 +1 @@\n \t+foo3\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n test_expect_success 'modified submodule(forward) --submodule' '\n@@ -166,7 +177,7 @@ test_expect_success 'modified submodule(forward) --submodule' '\n \tSubmodule sm1 $head1..$head2:\n \t  > Add foo3 ($added foo3)\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n fullhead2=$(cd sm1; git rev-parse --verify HEAD)\n@@ -181,7 +192,7 @@ test_expect_success 'modified submodule(forward) --submodule=short' '\n \t-Subproject commit $fullhead1\n \t+Subproject commit $fullhead2\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n commit_file sm1 &&\n@@ -210,7 +221,7 @@ test_expect_success 'modified submodule(backward)' '\n \t@@ -1 +0,0 @@\n \t-foo3\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n head4=$(add_file sm1 foo4 foo5)\n@@ -247,7 +258,7 @@ test_expect_success 'modified submodule(backward and forward)' '\n \t@@ -0,0 +1 @@\n \t+foo5\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n commit_file sm1 &&\n@@ -291,7 +302,7 @@ test_expect_success 'typechanged submodule(submodule->blob), --cached' '\n \t@@ -0,0 +1 @@\n \t+sm1\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n test_expect_success 'typechanged submodule(submodule->blob)' '\n@@ -327,7 +338,7 @@ test_expect_success 'typechanged submodule(submodule->blob)' '\n \t@@ -0,0 +1 @@\n \t+foo5\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n rm -rf sm1 &&\n@@ -344,7 +355,7 @@ test_expect_success 'typechanged submodule(submodule->blob)' '\n \t@@ -0,0 +1 @@\n \t+sm1\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n rm -f sm1 &&\n@@ -356,7 +367,7 @@ test_expect_success 'nonexistent commit' '\n \tcat >expected <<-EOF &&\n \tSubmodule sm1 $head4...$head6 (commits not present)\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n commit_file\n@@ -386,11 +397,12 @@ test_expect_success 'typechanged submodule(blob->submodule)' '\n \t@@ -0,0 +1 @@\n \t+foo7\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n commit_file sm1 &&\n test_expect_success 'submodule is up to date' '\n+\thead7=$(git -C sm1 rev-parse --short --verify HEAD) &&\n \tgit diff-index -p --submodule=diff HEAD >actual &&\n \ttest_must_be_empty actual\n '\n@@ -401,7 +413,7 @@ test_expect_success 'submodule contains untracked content' '\n \tcat >expected <<-EOF &&\n \tSubmodule sm1 contains untracked content\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n test_expect_success 'submodule contains untracked content (untracked ignored)' '\n@@ -433,7 +445,7 @@ test_expect_success 'submodule contains untracked and modified content' '\n \t-foo6\n \t+new\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n # NOT OK\n@@ -450,7 +462,7 @@ test_expect_success 'submodule contains untracked and modified content (untracke\n \t-foo6\n \t+new\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n test_expect_success 'submodule contains untracked and modified content (dirty ignored)' '\n@@ -478,7 +490,7 @@ test_expect_success 'submodule contains modified content' '\n \t-foo6\n \t+new\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n (cd sm1; git commit -mchange foo6 >/dev/null) &&\n@@ -486,7 +498,7 @@ head8=$(cd sm1; git rev-parse --short --verify HEAD) &&\n test_expect_success 'submodule is modified' '\n \tgit diff-index -p --submodule=diff HEAD >actual &&\n \tcat >expected <<-EOF &&\n-\tSubmodule sm1 17243c9..$head8:\n+\tSubmodule sm1 $head7..$head8:\n \tdiff --git a/sm1/foo6 b/sm1/foo6\n \tindex 462398b..3e75765 100644\n \t--- a/sm1/foo6\n@@ -495,7 +507,7 @@ test_expect_success 'submodule is modified' '\n \t-foo6\n \t+new\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n test_expect_success 'modified submodule contains untracked content' '\n@@ -503,7 +515,7 @@ test_expect_success 'modified submodule contains untracked content' '\n \tgit diff-index -p --submodule=diff HEAD >actual &&\n \tcat >expected <<-EOF &&\n \tSubmodule sm1 contains untracked content\n-\tSubmodule sm1 17243c9..$head8:\n+\tSubmodule sm1 $head7..$head8:\n \tdiff --git a/sm1/foo6 b/sm1/foo6\n \tindex 462398b..3e75765 100644\n \t--- a/sm1/foo6\n@@ -512,13 +524,13 @@ test_expect_success 'modified submodule contains untracked content' '\n \t-foo6\n \t+new\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n test_expect_success 'modified submodule contains untracked content (untracked ignored)' '\n \tgit diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual &&\n \tcat >expected <<-EOF &&\n-\tSubmodule sm1 17243c9..$head8:\n+\tSubmodule sm1 $head7..$head8:\n \tdiff --git a/sm1/foo6 b/sm1/foo6\n \tindex 462398b..3e75765 100644\n \t--- a/sm1/foo6\n@@ -527,13 +539,13 @@ test_expect_success 'modified submodule contains untracked content (untracked ig\n \t-foo6\n \t+new\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n test_expect_success 'modified submodule contains untracked content (dirty ignored)' '\n \tgit diff-index -p --ignore-submodules=dirty --submodule=diff HEAD >actual &&\n \tcat >expected <<-EOF &&\n-\tSubmodule sm1 17243c9..cfce562:\n+\tSubmodule sm1 $head7..$head8:\n \tdiff --git a/sm1/foo6 b/sm1/foo6\n \tindex 462398b..3e75765 100644\n \t--- a/sm1/foo6\n@@ -542,7 +554,7 @@ test_expect_success 'modified submodule contains untracked content (dirty ignore\n \t-foo6\n \t+new\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n test_expect_success 'modified submodule contains untracked content (all ignored)' '\n@@ -556,7 +568,7 @@ test_expect_success 'modified submodule contains untracked and modified content'\n \tcat >expected <<-EOF &&\n \tSubmodule sm1 contains untracked content\n \tSubmodule sm1 contains modified content\n-\tSubmodule sm1 17243c9..cfce562:\n+\tSubmodule sm1 $head7..$head8:\n \tdiff --git a/sm1/foo6 b/sm1/foo6\n \tindex 462398b..dfda541 100644\n \t--- a/sm1/foo6\n@@ -566,7 +578,7 @@ test_expect_success 'modified submodule contains untracked and modified content'\n \t+new\n \t+modification\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n test_expect_success 'modified submodule contains untracked and modified content (untracked ignored)' '\n@@ -574,7 +586,7 @@ test_expect_success 'modified submodule contains untracked and modified content\n \tgit diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual &&\n \tcat >expected <<-EOF &&\n \tSubmodule sm1 contains modified content\n-\tSubmodule sm1 17243c9..cfce562:\n+\tSubmodule sm1 $head7..$head8:\n \tdiff --git a/sm1/foo6 b/sm1/foo6\n \tindex 462398b..e20e2d9 100644\n \t--- a/sm1/foo6\n@@ -585,14 +597,14 @@ test_expect_success 'modified submodule contains untracked and modified content\n \t+modification\n \t+modification\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n test_expect_success 'modified submodule contains untracked and modified content (dirty ignored)' '\n \techo modification >> sm1/foo6 &&\n \tgit diff-index -p --ignore-submodules=dirty --submodule=diff HEAD >actual &&\n \tcat >expected <<-EOF &&\n-\tSubmodule sm1 17243c9..cfce562:\n+\tSubmodule sm1 $head7..$head8:\n \tdiff --git a/sm1/foo6 b/sm1/foo6\n \tindex 462398b..3e75765 100644\n \t--- a/sm1/foo6\n@@ -601,7 +613,7 @@ test_expect_success 'modified submodule contains untracked and modified content\n \t-foo6\n \t+new\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n test_expect_success 'modified submodule contains untracked and modified content (all ignored)' '\n@@ -616,7 +628,7 @@ test_expect_success 'modified submodule contains modified content' '\n \tgit diff-index -p --submodule=diff HEAD >actual &&\n \tcat >expected <<-EOF &&\n \tSubmodule sm1 contains modified content\n-\tSubmodule sm1 17243c9..cfce562:\n+\tSubmodule sm1 $head7..$head8:\n \tdiff --git a/sm1/foo6 b/sm1/foo6\n \tindex 462398b..ac466ca 100644\n \t--- a/sm1/foo6\n@@ -629,29 +641,29 @@ test_expect_success 'modified submodule contains modified content' '\n \t+modification\n \t+modification\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n rm -rf sm1\n test_expect_success 'deleted submodule' '\n \tgit diff-index -p --submodule=diff HEAD >actual &&\n \tcat >expected <<-EOF &&\n-\tSubmodule sm1 17243c9...0000000 (submodule deleted)\n+\tSubmodule sm1 $head7...0000000 (submodule deleted)\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n test_expect_success 'create second submodule' '\n \ttest_create_repo sm2 &&\n-\thead7=$(add_file sm2 foo8 foo9) &&\n+\thead9=$(add_file sm2 foo8 foo9) &&\n \tgit add sm2\n '\n \n test_expect_success 'multiple submodules' '\n \tgit diff-index -p --submodule=diff HEAD >actual &&\n \tcat >expected <<-EOF &&\n-\tSubmodule sm1 17243c9...0000000 (submodule deleted)\n-\tSubmodule sm2 0000000...a5a65c9 (new submodule)\n+\tSubmodule sm1 $head7...0000000 (submodule deleted)\n+\tSubmodule sm2 0000000...$head9 (new submodule)\n \tdiff --git a/sm2/foo8 b/sm2/foo8\n \tnew file mode 100644\n \tindex 0000000..db9916b\n@@ -667,13 +679,13 @@ test_expect_success 'multiple submodules' '\n \t@@ -0,0 +1 @@\n \t+foo9\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n test_expect_success 'path filter' '\n \tgit diff-index -p --submodule=diff HEAD sm2 >actual &&\n \tcat >expected <<-EOF &&\n-\tSubmodule sm2 0000000...a5a65c9 (new submodule)\n+\tSubmodule sm2 0000000...$head9 (new submodule)\n \tdiff --git a/sm2/foo8 b/sm2/foo8\n \tnew file mode 100644\n \tindex 0000000..db9916b\n@@ -689,15 +701,15 @@ test_expect_success 'path filter' '\n \t@@ -0,0 +1 @@\n \t+foo9\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n commit_file sm2\n test_expect_success 'given commit' '\n \tgit diff-index -p --submodule=diff HEAD^ >actual &&\n \tcat >expected <<-EOF &&\n-\tSubmodule sm1 17243c9...0000000 (submodule deleted)\n-\tSubmodule sm2 0000000...a5a65c9 (new submodule)\n+\tSubmodule sm1 $head7...0000000 (submodule deleted)\n+\tSubmodule sm2 0000000...$head9 (new submodule)\n \tdiff --git a/sm2/foo8 b/sm2/foo8\n \tnew file mode 100644\n \tindex 0000000..db9916b\n@@ -713,7 +725,7 @@ test_expect_success 'given commit' '\n \t@@ -0,0 +1 @@\n \t+foo9\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n test_expect_success 'setup .git file for sm2' '\n@@ -726,8 +738,8 @@ test_expect_success 'setup .git file for sm2' '\n test_expect_success 'diff --submodule=diff with .git file' '\n \tgit diff --submodule=diff HEAD^ >actual &&\n \tcat >expected <<-EOF &&\n-\tSubmodule sm1 17243c9...0000000 (submodule deleted)\n-\tSubmodule sm2 0000000...a5a65c9 (new submodule)\n+\tSubmodule sm1 $head7...0000000 (submodule deleted)\n+\tSubmodule sm2 0000000...$head9 (new submodule)\n \tdiff --git a/sm2/foo8 b/sm2/foo8\n \tnew file mode 100644\n \tindex 0000000..db9916b\n@@ -743,25 +755,27 @@ test_expect_success 'diff --submodule=diff with .git file' '\n \t@@ -0,0 +1 @@\n \t+foo9\n \tEOF\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n test_expect_success 'setup nested submodule' '\n \tgit submodule add -f ./sm2 &&\n \tgit commit -a -m \"add sm2\" &&\n \tgit -C sm2 submodule add ../sm2 nested &&\n-\tgit -C sm2 commit -a -m \"nested sub\"\n+\tgit -C sm2 commit -a -m \"nested sub\" &&\n+\thead10=$(git -C sm2 rev-parse --short --verify HEAD)\n '\n \n test_expect_success 'move nested submodule HEAD' '\n \techo \"nested content\" >sm2/nested/file &&\n \tgit -C sm2/nested add file &&\n-\tgit -C sm2/nested commit --allow-empty -m \"new HEAD\"\n+\tgit -C sm2/nested commit --allow-empty -m \"new HEAD\" &&\n+\thead11=$(git -C sm2/nested rev-parse --short --verify HEAD)\n '\n \n test_expect_success 'diff --submodule=diff with moved nested submodule HEAD' '\n \tcat >expected <<-EOF &&\n-\tSubmodule nested a5a65c9..b55928c:\n+\tSubmodule nested $head9..$head11:\n \tdiff --git a/nested/file b/nested/file\n \tnew file mode 100644\n \tindex 0000000..ca281f5\n@@ -772,13 +786,13 @@ test_expect_success 'diff --submodule=diff with moved nested submodule HEAD' '\n \tEOF\n \tgit -C sm2 diff --submodule=diff >actual 2>err &&\n \ttest_must_be_empty err &&\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n test_expect_success 'diff --submodule=diff recurses into nested submodules' '\n \tcat >expected <<-EOF &&\n \tSubmodule sm2 contains modified content\n-\tSubmodule sm2 a5a65c9..280969a:\n+\tSubmodule sm2 $head9..$head10:\n \tdiff --git a/sm2/.gitmodules b/sm2/.gitmodules\n \tnew file mode 100644\n \tindex 0000000..3a816b8\n@@ -788,7 +802,7 @@ test_expect_success 'diff --submodule=diff recurses into nested submodules' '\n \t+[submodule \"nested\"]\n \t+\tpath = nested\n \t+\turl = ../sm2\n-\tSubmodule nested 0000000...b55928c (new submodule)\n+\tSubmodule nested 0000000...$head11 (new submodule)\n \tdiff --git a/sm2/nested/file b/sm2/nested/file\n \tnew file mode 100644\n \tindex 0000000..ca281f5\n@@ -813,7 +827,7 @@ test_expect_success 'diff --submodule=diff recurses into nested submodules' '\n \tEOF\n \tgit diff --submodule=diff >actual 2>err &&\n \ttest_must_be_empty err &&\n-\ttest_cmp expected actual\n+\tdiff_cmp expected actual\n '\n \n test_done\n"},{"id":"390480","messageId":"20200125230035.136348-11-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 10/22] t4211: make test hash independent","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:16Z","receivedAt":"2020-01-25T23:00:52Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"This test uses several test files that contain hard-coded SHA-1 object\nIDs. Replace these values with generic ones of the correct size so that\nthe test works with either SHA-1 or SHA-256.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t4211-line-log.sh | 14 ++++++++++++--\n 1 file changed, 12 insertions(+), 2 deletions(-)\n\ndiff --git a/t/t4211-line-log.sh b/t/t4211-line-log.sh\nindex 8319163744..2cbfd8dd9e 100755\n--- a/t/t4211-line-log.sh\n+++ b/t/t4211-line-log.sh\n@@ -8,10 +8,20 @@ test_expect_success 'setup (import history)' '\n \tgit reset --hard\n '\n \n+process_output () {\n+\tx07=\"$_x05[0-9a-f][0-9a-f]\"\n+\tsed -e \"s/commit $OID_REGEX/commit $ZERO_OID/\" \\\n+\t    -e \"s/commit $_x40$/commit $ZERO_OID/\" \\\n+\t    -e \"s/Merge: $x07 $x07$/Merge: 0000000 0000000/\" \\\n+\t    \"$1\"\n+}\n+\n canned_test_1 () {\n \ttest_expect_$1 \"$2\" \"\n-\t\tgit log $2 >actual &&\n-\t\ttest_cmp \\\"\\$TEST_DIRECTORY\\\"/t4211/expect.$3 actual\n+\t\tgit log $2 >result &&\n+\t\tprocess_output result >actual &&\n+\t\tprocess_output \\\"\\$TEST_DIRECTORY\\\"/t4211/expect.$3 >expected &&\n+\t\ttest_cmp expected actual\n \t\"\n }\n \n"},{"id":"390481","messageId":"20200125230035.136348-19-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 17/23] t5616: use correct filter syntax","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:24Z","receivedAt":"2020-01-25T23:00:53Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"In the setup steps for the promisor remote tests, we clone a repository\nand filter out all trees with depth greater than or equal to zero, which\nalso filters out all blobs.\n\nWith SHA-1, this test passes because the object we happen to request\nfrom the server is the blob that the promisor remote has.  However, due\nto a different ordering with SHA-256, we request the tree containing\nthat blob, which the promisor remote does not have.  As a consequence,\nwe fail with a \"not our ref\" error.\n\nSince what we want to test is that the blob is transferred, let's adjust\nthe filter to just filter out blobs, not trees.  That means that we'll\ntransfer the previously problematic tree as part of the normal clone,\nand we can then test that the blob is fetched from the promisor remote\nas expected.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t5616-partial-clone.sh | 2 +-\n 1 file changed, 1 insertion(+), 1 deletion(-)\n\ndiff --git a/t/t5616-partial-clone.sh b/t/t5616-partial-clone.sh\nindex fea56cda6d..9fd6e780f9 100755\n--- a/t/t5616-partial-clone.sh\n+++ b/t/t5616-partial-clone.sh\n@@ -317,7 +317,7 @@ setup_triangle () {\n \tcp big-blob.txt server &&\n \tgit -C server add big-blob.txt &&\n \tgit -C server commit -m \"initial\" &&\n-\tgit clone --bare --filter=tree:0 \"file://$(pwd)/server\" client &&\n+\tgit clone --bare --filter=blob:none \"file://$(pwd)/server\" client &&\n \techo another line >>server/big-blob.txt &&\n \tgit -C server commit -am \"append line to big blob\" &&\n \n"},{"id":"390482","messageId":"20200125230035.136348-20-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 18/23] t5607: make hash size independent","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:25Z","receivedAt":"2020-01-25T23:00:54Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"Use $OID_REGEX instead of a hard-coded regular expression.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t5607-clone-bundle.sh | 2 +-\n 1 file changed, 1 insertion(+), 1 deletion(-)\n\ndiff --git a/t/t5607-clone-bundle.sh b/t/t5607-clone-bundle.sh\nindex b7a3fdf02d..9108ff6fbd 100755\n--- a/t/t5607-clone-bundle.sh\n+++ b/t/t5607-clone-bundle.sh\n@@ -64,7 +64,7 @@ test_expect_success 'ridiculously long subject in boundary' '\n \ttest -s heads &&\n \tgit fetch long-subject-bundle.bdl &&\n \tsed -n \"/^-/{p;q;}\" long-subject-bundle.bdl >boundary &&\n-\tgrep \"^-[0-9a-f]\\\\{40\\\\} \" boundary\n+\tgrep \"^-$OID_REGEX \" boundary\n '\n \n test_expect_success 'prerequisites with an empty commit message' '\n"},{"id":"390483","messageId":"20200125230035.136348-15-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 14/22] t5321: make test hash independent","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:20Z","receivedAt":"2020-01-25T23:00:56Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"Use the proper pack constants defined in lib-pack.sh to make this test\nwork with SHA-256.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t5321-pack-large-objects.sh | 4 ++--\n 1 file changed, 2 insertions(+), 2 deletions(-)\n\ndiff --git a/t/t5321-pack-large-objects.sh b/t/t5321-pack-large-objects.sh\nindex a75eab87d3..8a56d98a0e 100755\n--- a/t/t5321-pack-large-objects.sh\n+++ b/t/t5321-pack-large-objects.sh\n@@ -10,8 +10,8 @@ test_description='git pack-object with \"large\" deltas\n . \"$TEST_DIRECTORY\"/lib-pack.sh\n \n # Two similar-ish objects that we have computed deltas between.\n-A=01d7713666f4de822776c7622c10f1b07de280dc\n-B=e68fe8129b546b101aee9510c5328e7f21ca1d18\n+A=$(test_oid packlib_7_0)\n+B=$(test_oid packlib_7_76)\n \n test_expect_success 'setup' '\n \tclear_packs &&\n"},{"id":"390484","messageId":"20200125230035.136348-18-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 17/22] t5607: make hash size independent","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:23Z","receivedAt":"2020-01-25T23:00:58Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"Use $OID_REGEX instead of a hard-coded regular expression.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t5607-clone-bundle.sh | 2 +-\n 1 file changed, 1 insertion(+), 1 deletion(-)\n\ndiff --git a/t/t5607-clone-bundle.sh b/t/t5607-clone-bundle.sh\nindex b7a3fdf02d..9108ff6fbd 100755\n--- a/t/t5607-clone-bundle.sh\n+++ b/t/t5607-clone-bundle.sh\n@@ -64,7 +64,7 @@ test_expect_success 'ridiculously long subject in boundary' '\n \ttest -s heads &&\n \tgit fetch long-subject-bundle.bdl &&\n \tsed -n \"/^-/{p;q;}\" long-subject-bundle.bdl >boundary &&\n-\tgrep \"^-[0-9a-f]\\\\{40\\\\} \" boundary\n+\tgrep \"^-$OID_REGEX \" boundary\n '\n \n test_expect_success 'prerequisites with an empty commit message' '\n"},{"id":"390485","messageId":"20200125230035.136348-23-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 19/22] t5703: switch tests to use test_oid","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:28Z","receivedAt":"2020-01-25T23:00:58Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"To make this test work correctly with SHA-256, switch the hard-coded\ninvalid object IDs to use test_oid.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t5703-upload-pack-ref-in-want.sh | 5 +++--\n 1 file changed, 3 insertions(+), 2 deletions(-)\n\ndiff --git a/t/t5703-upload-pack-ref-in-want.sh b/t/t5703-upload-pack-ref-in-want.sh\nindex 5511cdcec2..8aeeaac509 100755\n--- a/t/t5703-upload-pack-ref-in-want.sh\n+++ b/t/t5703-upload-pack-ref-in-want.sh\n@@ -37,6 +37,7 @@ check_output () {\n #             \\ | /\n #               a\n test_expect_success 'setup repository' '\n+\ttest_oid_init &&\n \ttest_commit a &&\n \tgit checkout -b o/foo &&\n \ttest_commit b &&\n@@ -333,7 +334,7 @@ test_expect_success 'server is initially ahead - no ref in want' '\n \tgit -C \"$REPO\" config uploadpack.allowRefInWant false &&\n \trm -rf local &&\n \tcp -r \"$LOCAL_PRISTINE\" local &&\n-\tinconsistency master 1234567890123456789012345678901234567890 &&\n+\tinconsistency master $(test_oid numeric) &&\n \ttest_must_fail git -C local fetch 2>err &&\n \ttest_i18ngrep \"fatal: remote error: upload-pack: not our ref\" err\n '\n@@ -342,7 +343,7 @@ test_expect_success 'server is initially ahead - ref in want' '\n \tgit -C \"$REPO\" config uploadpack.allowRefInWant true &&\n \trm -rf local &&\n \tcp -r \"$LOCAL_PRISTINE\" local &&\n-\tinconsistency master 1234567890123456789012345678901234567890 &&\n+\tinconsistency master $(test_oid numeric) &&\n \tgit -C local fetch &&\n \n \tgit -C \"$REPO\" rev-parse --verify master >expected &&\n"},{"id":"390486","messageId":"20200125230035.136348-21-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 18/22] t5703: make test work with SHA-256","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:26Z","receivedAt":"2020-01-25T23:00:59Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"This test used an object ID which was 40 hex characters in length,\ncausing the test not only not to pass, but to hang, when run with\nSHA-256 as the hash.  Change this value to a fixed dummy object ID using\ntest_oid_init and test_oid.\n\nFurthermore, ensure we extract an object ID of the appropriate length\nusing cut with fields instead of a fixed length.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t5703-upload-pack-ref-in-want.sh | 2 +-\n 1 file changed, 1 insertion(+), 1 deletion(-)\n\ndiff --git a/t/t5703-upload-pack-ref-in-want.sh b/t/t5703-upload-pack-ref-in-want.sh\nindex 1424fabd4a..5511cdcec2 100755\n--- a/t/t5703-upload-pack-ref-in-want.sh\n+++ b/t/t5703-upload-pack-ref-in-want.sh\n@@ -19,7 +19,7 @@ get_actual_commits () {\n \t\t}' <out | test-tool pkt-line unpack-sideband >o.pack &&\n \tgit index-pack o.pack &&\n \tgit verify-pack -v o.idx >objs &&\n-\tgrep commit objs | cut -c-40 | sort >actual_commits\n+\tgrep commit objs | cut -d\" \" -f1 | sort >actual_commits\n }\n \n check_output () {\n"},{"id":"390487","messageId":"20200125230035.136348-26-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 21/23] t6000: abstract away SHA-1-specific constants","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:31Z","receivedAt":"2020-01-25T23:01:01Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"Adjust the test so that it computes variables for object IDs instead of\nusing hard-coded hashes.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t6000-rev-list-misc.sh | 13 ++++++++-----\n 1 file changed, 8 insertions(+), 5 deletions(-)\n\ndiff --git a/t/t6000-rev-list-misc.sh b/t/t6000-rev-list-misc.sh\nindex b8cf82349b..a0baf9ee43 100755\n--- a/t/t6000-rev-list-misc.sh\n+++ b/t/t6000-rev-list-misc.sh\n@@ -104,13 +104,16 @@ test_expect_success 'rev-list can show index objects' '\n \t#   - we do not show the root tree; since we updated the index, it\n \t#     does not have a valid cache tree\n \t#\n-\tcat >expect <<-\\EOF &&\n-\t8e4020bb5a8d8c873b25de15933e75cc0fc275df one\n-\td9d3a7417b9605cfd88ee6306b28dadc29e6ab08 only-in-index\n-\t9200b628cf9dc883a85a7abc8d6e6730baee589c two\n-\tEOF\n \techo only-in-index >only-in-index &&\n \ttest_when_finished \"git reset --hard\" &&\n+\trev1=$(git rev-parse HEAD:one) &&\n+\trev2=$(git rev-parse HEAD:two) &&\n+\trevi=$(git hash-object only-in-index) &&\n+\tcat >expect <<-EOF &&\n+\t$rev1 one\n+\t$revi only-in-index\n+\t$rev2 two\n+\tEOF\n \tgit add only-in-index &&\n \tgit rev-list --objects --indexed-objects >actual &&\n \ttest_cmp expect actual\n"},{"id":"390488","messageId":"20200125230035.136348-27-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 21/22] t6006: make hash size independent","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:32Z","receivedAt":"2020-01-25T23:01:02Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"Instead of hard-coding the length of an object ID when creating a tree,\ncompute it for the hash in use using the translation tables.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t6006-rev-list-format.sh | 4 +++-\n 1 file changed, 3 insertions(+), 1 deletion(-)\n\ndiff --git a/t/t6006-rev-list-format.sh b/t/t6006-rev-list-format.sh\nindex ebdc49c496..7e82e43a63 100755\n--- a/t/t6006-rev-list-format.sh\n+++ b/t/t6006-rev-list-format.sh\n@@ -32,6 +32,7 @@ changed_iso88591=$(echo \"$changed\" | iconv -f utf-8 -t $test_encoding)\n truncate_count=20\n \n test_expect_success 'setup' '\n+\ttest_oid_init &&\n \t: >foo &&\n \tgit add foo &&\n \tgit config i18n.commitEncoding $test_encoding &&\n@@ -463,9 +464,10 @@ test_expect_success '--abbrev' '\n '\n \n test_expect_success '%H is not affected by --abbrev-commit' '\n+\texpected=$(($(test_oid hexsz) + 1)) &&\n \tgit log -1 --format=%H --abbrev-commit --abbrev=20 HEAD >actual &&\n \tlen=$(wc -c <actual) &&\n-\ttest $len = 41\n+\ttest $len = $expected\n '\n \n test_expect_success '%h is not affected by --abbrev-commit' '\n"},{"id":"390489","messageId":"20200125230035.136348-25-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 20/22] t6000: abstract away SHA-1-specific constants","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:30Z","receivedAt":"2020-01-25T23:01:04Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"Adjust the test so that it computes variables for object IDs instead of\nusing hard-coded hashes.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t6000-rev-list-misc.sh | 13 ++++++++-----\n 1 file changed, 8 insertions(+), 5 deletions(-)\n\ndiff --git a/t/t6000-rev-list-misc.sh b/t/t6000-rev-list-misc.sh\nindex b8cf82349b..a0baf9ee43 100755\n--- a/t/t6000-rev-list-misc.sh\n+++ b/t/t6000-rev-list-misc.sh\n@@ -104,13 +104,16 @@ test_expect_success 'rev-list can show index objects' '\n \t#   - we do not show the root tree; since we updated the index, it\n \t#     does not have a valid cache tree\n \t#\n-\tcat >expect <<-\\EOF &&\n-\t8e4020bb5a8d8c873b25de15933e75cc0fc275df one\n-\td9d3a7417b9605cfd88ee6306b28dadc29e6ab08 only-in-index\n-\t9200b628cf9dc883a85a7abc8d6e6730baee589c two\n-\tEOF\n \techo only-in-index >only-in-index &&\n \ttest_when_finished \"git reset --hard\" &&\n+\trev1=$(git rev-parse HEAD:one) &&\n+\trev2=$(git rev-parse HEAD:two) &&\n+\trevi=$(git hash-object only-in-index) &&\n+\tcat >expect <<-EOF &&\n+\t$rev1 one\n+\t$revi only-in-index\n+\t$rev2 two\n+\tEOF\n \tgit add only-in-index &&\n \tgit rev-list --objects --indexed-objects >actual &&\n \ttest_cmp expect actual\n"},{"id":"390490","messageId":"20200125230035.136348-7-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 06/22] t3310: make test work with SHA-256","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:12Z","receivedAt":"2020-01-25T23:01:04Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"Replace the hard-coded SHA-1 constants with the use of test_oid to look\nup an appropriate constant for each hash algorithm.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t3310-notes-merge-manual-resolve.sh | 84 ++++++++++++++++++---------\n 1 file changed, 58 insertions(+), 26 deletions(-)\n\ndiff --git a/t/t3310-notes-merge-manual-resolve.sh b/t/t3310-notes-merge-manual-resolve.sh\nindex 2dea846e25..806d812a17 100755\n--- a/t/t3310-notes-merge-manual-resolve.sh\n+++ b/t/t3310-notes-merge-manual-resolve.sh\n@@ -13,7 +13,39 @@ test_expect_success 'setup commits' '\n \ttest_commit 2nd &&\n \ttest_commit 3rd &&\n \ttest_commit 4th &&\n-\ttest_commit 5th\n+\ttest_commit 5th &&\n+\n+\ttest_oid_cache <<-EOF\n+\thash04a sha1:6e8e3febca3c2bb896704335cc4d0c34cb2f8715\n+\thash03a sha1:e5388c10860456ee60673025345fe2e153eb8cf8\n+\thash02a sha1:ceefa674873670e7ecd131814d909723cce2b669\n+\thash04b sha1:e2bfd06a37dd2031684a59a6e2b033e212239c78\n+\thash03b sha1:5772f42408c0dd6f097a7ca2d24de0e78d1c46b1\n+\thash01b sha1:b0a6021ec006d07e80e9b20ec9b444cbd9d560d3\n+\thash04c sha1:cff59c793c20bb49a4e01bc06fb06bad642e0d54\n+\thash02c sha1:283b48219aee9a4105f6cab337e789065c82c2b9\n+\thash01c sha1:0a81da8956346e19bcb27a906f04af327e03e31b\n+\thash04d sha1:00494adecf2d9635a02fa431308d67993f853968\n+\thash01e sha1:f75d1df88cbfe4258d49852f26cfc83f2ad4494b\n+\thash04f sha1:021faa20e931fb48986ffc6282b4bb05553ac946\n+\thash01f sha1:0a59e787e6d688aa6309e56e8c1b89431a0fc1c1\n+\thash05g sha1:304dfb4325cf243025b9957486eb605a9b51c199\n+\n+\thash04a\tsha256:f18a935e65866345098b3b754071dbf9f3aa3520eb27a7b036b278c5e2f1ed7e\n+\thash03a\tsha256:713035dc94067a64e5fa6e4e1821b7c3bde49a77c7cb3f80eaadefa1ca41b3d2\n+\thash02a\tsha256:f160a67e048b6fa75bec3952184154045076692cf5dccd3da21e3fd34b7a3f0f\n+\thash04b sha256:c7fba0d6104917fbf35258f40b9fa4fc697cfa992deecd1570a3b08d0a5587a9\n+\thash03b sha256:7287a2d78a3766c181b08df38951d784b08b72a44f571ed6d855bd0be22c70f6\n+\thash01b sha256:da96cf778c15d0a2bb76f98b2a62f6c9c01730fa7030e8f08ef0191048e7d620\n+\thash04c sha256:cb615d2def4b834d5f55b2351df97dc92bee4f5009d285201427f349081c8aca\n+\thash02c sha256:63bb527e0b4e1c8e1dd0d54dd778ca7c3718689fd6e37c473044cfbcf1cacfdb\n+\thash01c sha256:5b87237ac1fbae0246256fed9f9a1f077c4140fb7e6444925f8dbfa5ae406cd8\n+\thash04d sha256:eeddc9f9f6cb3d6b39b861659853f10891dc373e0b6eecb09e03e39b6ce64714\n+\thash01e sha256:108f521b1a74c2e6d0b52a4eda87e09162bf847f7d190cfce496ee1af0b29a5a\n+\thash04f sha256:901acda0454502b3bbd281f130c419e6c8de78afcf72a8def8d45ad31462bce4\n+\thash01f sha256:a2d99d1b8bf23c8af7d9d91368454adc110dfd5cc068a4cebb486ee8f5a1e16c\n+\thash05g sha256:4fef015b01da8efe929a68e3bb9b8fbad81f53995f097befe8ebc93f12ab98ec\n+\tEOF\n '\n \n commit_sha1=$(git rev-parse 1st^{commit})\n@@ -33,9 +65,9 @@ verify_notes () {\n }\n \n cat <<EOF | sort >expect_notes_x\n-6e8e3febca3c2bb896704335cc4d0c34cb2f8715 $commit_sha4\n-e5388c10860456ee60673025345fe2e153eb8cf8 $commit_sha3\n-ceefa674873670e7ecd131814d909723cce2b669 $commit_sha2\n+$(test_oid hash04a) $commit_sha4\n+$(test_oid hash03a) $commit_sha3\n+$(test_oid hash02a) $commit_sha2\n EOF\n \n cat >expect_log_x <<EOF\n@@ -63,9 +95,9 @@ test_expect_success 'setup merge base (x)' '\n '\n \n cat <<EOF | sort >expect_notes_y\n-e2bfd06a37dd2031684a59a6e2b033e212239c78 $commit_sha4\n-5772f42408c0dd6f097a7ca2d24de0e78d1c46b1 $commit_sha3\n-b0a6021ec006d07e80e9b20ec9b444cbd9d560d3 $commit_sha1\n+$(test_oid hash04b) $commit_sha4\n+$(test_oid hash03b) $commit_sha3\n+$(test_oid hash01b) $commit_sha1\n EOF\n \n cat >expect_log_y <<EOF\n@@ -95,9 +127,9 @@ test_expect_success 'setup local branch (y)' '\n '\n \n cat <<EOF | sort >expect_notes_z\n-cff59c793c20bb49a4e01bc06fb06bad642e0d54 $commit_sha4\n-283b48219aee9a4105f6cab337e789065c82c2b9 $commit_sha2\n-0a81da8956346e19bcb27a906f04af327e03e31b $commit_sha1\n+$(test_oid hash04c) $commit_sha4\n+$(test_oid hash02c) $commit_sha2\n+$(test_oid hash01c) $commit_sha1\n EOF\n \n cat >expect_log_z <<EOF\n@@ -193,9 +225,9 @@ test_expect_success 'merge z into m (== y) with default (\"manual\") resolver => C\n '\n \n cat <<EOF | sort >expect_notes_z\n-00494adecf2d9635a02fa431308d67993f853968 $commit_sha4\n-283b48219aee9a4105f6cab337e789065c82c2b9 $commit_sha2\n-0a81da8956346e19bcb27a906f04af327e03e31b $commit_sha1\n+$(test_oid hash04d) $commit_sha4\n+$(test_oid hash02c) $commit_sha2\n+$(test_oid hash01c) $commit_sha1\n EOF\n \n cat >expect_log_z <<EOF\n@@ -231,8 +263,8 @@ test_expect_success 'cannot do merge w/conflicts when previous merge is unfinish\n # Setup non-conflicting merge between x and new notes ref w\n \n cat <<EOF | sort >expect_notes_w\n-ceefa674873670e7ecd131814d909723cce2b669 $commit_sha2\n-f75d1df88cbfe4258d49852f26cfc83f2ad4494b $commit_sha1\n+$(test_oid hash02a) $commit_sha2\n+$(test_oid hash01e) $commit_sha1\n EOF\n \n cat >expect_log_w <<EOF\n@@ -258,10 +290,10 @@ test_expect_success 'setup unrelated notes ref (w)' '\n '\n \n cat <<EOF | sort >expect_notes_w\n-6e8e3febca3c2bb896704335cc4d0c34cb2f8715 $commit_sha4\n-e5388c10860456ee60673025345fe2e153eb8cf8 $commit_sha3\n-ceefa674873670e7ecd131814d909723cce2b669 $commit_sha2\n-f75d1df88cbfe4258d49852f26cfc83f2ad4494b $commit_sha1\n+$(test_oid hash04a) $commit_sha4\n+$(test_oid hash03a) $commit_sha3\n+$(test_oid hash02a) $commit_sha2\n+$(test_oid hash01e) $commit_sha1\n EOF\n \n cat >expect_log_w <<EOF\n@@ -291,10 +323,10 @@ test_expect_success 'can do merge without conflicts even if previous merge is un\n '\n \n cat <<EOF | sort >expect_notes_m\n-021faa20e931fb48986ffc6282b4bb05553ac946 $commit_sha4\n-5772f42408c0dd6f097a7ca2d24de0e78d1c46b1 $commit_sha3\n-283b48219aee9a4105f6cab337e789065c82c2b9 $commit_sha2\n-0a59e787e6d688aa6309e56e8c1b89431a0fc1c1 $commit_sha1\n+$(test_oid hash04f) $commit_sha4\n+$(test_oid hash03b) $commit_sha3\n+$(test_oid hash02c) $commit_sha2\n+$(test_oid hash01f) $commit_sha1\n EOF\n \n cat >expect_log_m <<EOF\n@@ -430,9 +462,9 @@ test_expect_success 'redo merge of z into m (== y) with default (\"manual\") resol\n '\n \n cat <<EOF | sort >expect_notes_m\n-304dfb4325cf243025b9957486eb605a9b51c199 $commit_sha5\n-283b48219aee9a4105f6cab337e789065c82c2b9 $commit_sha2\n-0a59e787e6d688aa6309e56e8c1b89431a0fc1c1 $commit_sha1\n+$(test_oid hash05g) $commit_sha5\n+$(test_oid hash02c) $commit_sha2\n+$(test_oid hash01f) $commit_sha1\n EOF\n \n cat >expect_log_m <<EOF\n"},{"id":"390491","messageId":"20200125230035.136348-28-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 22/23] t6006: make hash size independent","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:33Z","receivedAt":"2020-01-25T23:01:05Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"Instead of hard-coding the length of an object ID when creating a tree,\ncompute it for the hash in use using the translation tables.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t6006-rev-list-format.sh | 4 +++-\n 1 file changed, 3 insertions(+), 1 deletion(-)\n\ndiff --git a/t/t6006-rev-list-format.sh b/t/t6006-rev-list-format.sh\nindex ebdc49c496..7e82e43a63 100755\n--- a/t/t6006-rev-list-format.sh\n+++ b/t/t6006-rev-list-format.sh\n@@ -32,6 +32,7 @@ changed_iso88591=$(echo \"$changed\" | iconv -f utf-8 -t $test_encoding)\n truncate_count=20\n \n test_expect_success 'setup' '\n+\ttest_oid_init &&\n \t: >foo &&\n \tgit add foo &&\n \tgit config i18n.commitEncoding $test_encoding &&\n@@ -463,9 +464,10 @@ test_expect_success '--abbrev' '\n '\n \n test_expect_success '%H is not affected by --abbrev-commit' '\n+\texpected=$(($(test_oid hexsz) + 1)) &&\n \tgit log -1 --format=%H --abbrev-commit --abbrev=20 HEAD >actual &&\n \tlen=$(wc -c <actual) &&\n-\ttest $len = 41\n+\ttest $len = $expected\n '\n \n test_expect_success '%h is not affected by --abbrev-commit' '\n"},{"id":"390492","messageId":"20200125230035.136348-30-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 23/23] t6024: update for SHA-256","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:35Z","receivedAt":"2020-01-25T23:01:07Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"To make this test work with SHA-256, compute two of the items in the\nconflicted index entry.  The other entry is a conflict within a conflict\nand computing it is difficult, so use test_oid_cache to specify the\nproper values for both hash algorithms.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t6024-recursive-merge.sh | 15 ++++++++++-----\n 1 file changed, 10 insertions(+), 5 deletions(-)\n\ndiff --git a/t/t6024-recursive-merge.sh b/t/t6024-recursive-merge.sh\nindex 0c9e3c20e8..332cfc53fd 100755\n--- a/t/t6024-recursive-merge.sh\n+++ b/t/t6024-recursive-merge.sh\n@@ -57,7 +57,12 @@ test_expect_success 'setup tests' '\n \tgit rev-parse C >.git/MERGE_HEAD &&\n \techo F >a1 &&\n \tgit update-index a1 &&\n-\tGIT_AUTHOR_DATE=\"2006-12-12 23:00:08\" git commit -m F\n+\tGIT_AUTHOR_DATE=\"2006-12-12 23:00:08\" git commit -m F &&\n+\n+\ttest_oid_cache <<-EOF\n+\tidxstage1 sha1:ec3fe2a791706733f2d8fa7ad45d9a9672031f5e\n+\tidxstage1 sha256:b3c8488929903aaebdeb22270cb6d36e5b8724b01ae0d4da24632f158c99676f\n+\tEOF\n '\n \n test_expect_success 'combined merge conflicts' '\n@@ -79,10 +84,10 @@ test_expect_success 'result contains a conflict' '\n test_expect_success 'virtual trees were processed' '\n \tgit ls-files --stage >out &&\n \n-\tcat >expect <<-\\EOF &&\n-\t100644 ec3fe2a791706733f2d8fa7ad45d9a9672031f5e 1\ta1\n-\t100644 cf84443e49e1b366fac938711ddf4be2d4d1d9e9 2\ta1\n-\t100644 fd7923529855d0b274795ae3349c5e0438333979 3\ta1\n+\tcat >expect <<-EOF &&\n+\t100644 $(test_oid idxstage1) 1\ta1\n+\t100644 $(git rev-parse F:a1) 2\ta1\n+\t100644 $(git rev-parse G:a1) 3\ta1\n \tEOF\n \n \ttest_cmp expect out\n"},{"id":"390493","messageId":"20200125230035.136348-3-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 02/22] t3206: make hash size independent","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:08Z","receivedAt":"2020-01-25T23:01:08Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"Fix the one assertion in this test that still uses SHA-1 to use test_oid\nto be independent of the hash.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t3206-range-diff.sh | 14 +++++++++++---\n 1 file changed, 11 insertions(+), 3 deletions(-)\n\ndiff --git a/t/t3206-range-diff.sh b/t/t3206-range-diff.sh\nindex 0575dd72b1..bd808f87ed 100755\n--- a/t/t3206-range-diff.sh\n+++ b/t/t3206-range-diff.sh\n@@ -102,6 +102,14 @@ test_expect_success 'setup' '\n \tn3 sha256:3b0a644\n \tn4 sha256:e461653\n \n+\t# mode change\n+\to1 sha1:4d39cb3\n+\to2 sha1:26c107f\n+\to3 sha1:4c1e0f5\n+\to1 sha256:d0dd598\n+\to2 sha256:c4a279e\n+\to3 sha256:78459d7\n+\n \t# added and removed\n \ts1 sha1:096b1ba\n \ts2 sha1:d92e698\n@@ -336,7 +344,7 @@ test_expect_success 'renamed file' '\n test_expect_success 'file with mode only change' '\n \tgit range-diff --no-color --submodule=log topic...mode-only-change >actual &&\n \tsed s/Z/\\ /g >expect <<-EOF &&\n-\t1:  fccce22 ! 1:  4d39cb3 s/4/A/\n+\t1:  $(test_oid t2) ! 1:  $(test_oid o1) s/4/A/\n \t    @@ Metadata\n \t    ZAuthor: Thomas Rast <trast@inf.ethz.ch>\n \t    Z\n@@ -352,7 +360,7 @@ test_expect_success 'file with mode only change' '\n \t    Z 7\n \t    +\n \t    + ## other-file (new) ##\n-\t2:  147e64e ! 2:  26c107f s/11/B/\n+\t2:  $(test_oid t3) ! 2:  $(test_oid o2) s/11/B/\n \t    @@ Metadata\n \t    ZAuthor: Thomas Rast <trast@inf.ethz.ch>\n \t    Z\n@@ -368,7 +376,7 @@ test_expect_success 'file with mode only change' '\n \t    Z 14\n \t    +\n \t    + ## other-file (mode change 100644 => 100755) ##\n-\t3:  a63e992 = 3:  4c1e0f5 s/12/B/\n+\t3:  $(test_oid t4) = 3:  $(test_oid o3) s/12/B/\n \tEOF\n \ttest_cmp expect actual\n '\n"},{"id":"390494","messageId":"20200125230035.136348-29-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 22/22] t6024: update for SHA-256","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:34Z","receivedAt":"2020-01-25T23:01:09Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"To make this test work with SHA-256, compute two of the items in the\nconflicted index entry.  The other entry is a conflict within a conflict\nand computing it is difficult, so use test_oid_cache to specify the\nproper values for both hash algorithms.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t6024-recursive-merge.sh | 15 ++++++++++-----\n 1 file changed, 10 insertions(+), 5 deletions(-)\n\ndiff --git a/t/t6024-recursive-merge.sh b/t/t6024-recursive-merge.sh\nindex 0c9e3c20e8..332cfc53fd 100755\n--- a/t/t6024-recursive-merge.sh\n+++ b/t/t6024-recursive-merge.sh\n@@ -57,7 +57,12 @@ test_expect_success 'setup tests' '\n \tgit rev-parse C >.git/MERGE_HEAD &&\n \techo F >a1 &&\n \tgit update-index a1 &&\n-\tGIT_AUTHOR_DATE=\"2006-12-12 23:00:08\" git commit -m F\n+\tGIT_AUTHOR_DATE=\"2006-12-12 23:00:08\" git commit -m F &&\n+\n+\ttest_oid_cache <<-EOF\n+\tidxstage1 sha1:ec3fe2a791706733f2d8fa7ad45d9a9672031f5e\n+\tidxstage1 sha256:b3c8488929903aaebdeb22270cb6d36e5b8724b01ae0d4da24632f158c99676f\n+\tEOF\n '\n \n test_expect_success 'combined merge conflicts' '\n@@ -79,10 +84,10 @@ test_expect_success 'result contains a conflict' '\n test_expect_success 'virtual trees were processed' '\n \tgit ls-files --stage >out &&\n \n-\tcat >expect <<-\\EOF &&\n-\t100644 ec3fe2a791706733f2d8fa7ad45d9a9672031f5e 1\ta1\n-\t100644 cf84443e49e1b366fac938711ddf4be2d4d1d9e9 2\ta1\n-\t100644 fd7923529855d0b274795ae3349c5e0438333979 3\ta1\n+\tcat >expect <<-EOF &&\n+\t100644 $(test_oid idxstage1) 1\ta1\n+\t100644 $(git rev-parse F:a1) 2\ta1\n+\t100644 $(git rev-parse G:a1) 3\ta1\n \tEOF\n \n \ttest_cmp expect out\n"},{"id":"390495","messageId":"20200125230035.136348-24-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 20/23] t5703: switch tests to use test_oid","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:29Z","receivedAt":"2020-01-25T23:01:10Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"To make this test work correctly with SHA-256, switch the hard-coded\ninvalid object IDs to use test_oid.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t5703-upload-pack-ref-in-want.sh | 5 +++--\n 1 file changed, 3 insertions(+), 2 deletions(-)\n\ndiff --git a/t/t5703-upload-pack-ref-in-want.sh b/t/t5703-upload-pack-ref-in-want.sh\nindex 5511cdcec2..8aeeaac509 100755\n--- a/t/t5703-upload-pack-ref-in-want.sh\n+++ b/t/t5703-upload-pack-ref-in-want.sh\n@@ -37,6 +37,7 @@ check_output () {\n #             \\ | /\n #               a\n test_expect_success 'setup repository' '\n+\ttest_oid_init &&\n \ttest_commit a &&\n \tgit checkout -b o/foo &&\n \ttest_commit b &&\n@@ -333,7 +334,7 @@ test_expect_success 'server is initially ahead - no ref in want' '\n \tgit -C \"$REPO\" config uploadpack.allowRefInWant false &&\n \trm -rf local &&\n \tcp -r \"$LOCAL_PRISTINE\" local &&\n-\tinconsistency master 1234567890123456789012345678901234567890 &&\n+\tinconsistency master $(test_oid numeric) &&\n \ttest_must_fail git -C local fetch 2>err &&\n \ttest_i18ngrep \"fatal: remote error: upload-pack: not our ref\" err\n '\n@@ -342,7 +343,7 @@ test_expect_success 'server is initially ahead - ref in want' '\n \tgit -C \"$REPO\" config uploadpack.allowRefInWant true &&\n \trm -rf local &&\n \tcp -r \"$LOCAL_PRISTINE\" local &&\n-\tinconsistency master 1234567890123456789012345678901234567890 &&\n+\tinconsistency master $(test_oid numeric) &&\n \tgit -C local fetch &&\n \n \tgit -C \"$REPO\" rev-parse --verify master >expected &&\n"},{"id":"390496","messageId":"20200125230035.136348-22-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 19/23] t5703: make test work with SHA-256","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:27Z","receivedAt":"2020-01-25T23:01:11Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"This test used an object ID which was 40 hex characters in length,\ncausing the test not only not to pass, but to hang, when run with\nSHA-256 as the hash.  Change this value to a fixed dummy object ID using\ntest_oid_init and test_oid.\n\nFurthermore, ensure we extract an object ID of the appropriate length\nusing cut with fields instead of a fixed length.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t5703-upload-pack-ref-in-want.sh | 2 +-\n 1 file changed, 1 insertion(+), 1 deletion(-)\n\ndiff --git a/t/t5703-upload-pack-ref-in-want.sh b/t/t5703-upload-pack-ref-in-want.sh\nindex 1424fabd4a..5511cdcec2 100755\n--- a/t/t5703-upload-pack-ref-in-want.sh\n+++ b/t/t5703-upload-pack-ref-in-want.sh\n@@ -19,7 +19,7 @@ get_actual_commits () {\n \t\t}' <out | test-tool pkt-line unpack-sideband >o.pack &&\n \tgit index-pack o.pack &&\n \tgit verify-pack -v o.idx >objs &&\n-\tgrep commit objs | cut -c-40 | sort >actual_commits\n+\tgrep commit objs | cut -d\" \" -f1 | sort >actual_commits\n }\n \n check_output () {\n"},{"id":"390497","messageId":"20200125230035.136348-16-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 15/22] t5515: make test hash independent","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:21Z","receivedAt":"2020-01-25T23:01:12Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"This test contains a large number of data files, mostly using the same\nobject ID values for refs. Instead of producing two separate sets of\ntest files, keep the test files using SHA-1 and translate them on the\nfly by replacing the SHA-1 values with the values for the current hash\nalgorithm in use.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t5515-fetch-merge-logic.sh | 51 +++++++++++++++++++++++++++++++++---\n 1 file changed, 47 insertions(+), 4 deletions(-)\n\ndiff --git a/t/t5515-fetch-merge-logic.sh b/t/t5515-fetch-merge-logic.sh\nindex 961eb35c99..ed49df582d 100755\n--- a/t/t5515-fetch-merge-logic.sh\n+++ b/t/t5515-fetch-merge-logic.sh\n@@ -12,11 +12,50 @@ GIT_TEST_PROTOCOL_VERSION=\n \n . ./test-lib.sh\n \n+convert_expected () {\n+\tfile=\"$1\" &&\n+\tfor i in one three_file master master2 one_tree three two two2 three2\n+\tdo\n+\t\tsed -e \"s/$(test_oid --hash=sha1 \"$i\")/$(test_oid \"$i\")/g\" \\\n+\t\t\t\"$file\" >\"$file.tmp\" &&\n+\t\tmv \"$file.tmp\" \"$file\"\n+\tdone\n+}\n+\n test_expect_success setup '\n \tGIT_AUTHOR_DATE=\"2006-06-26 00:00:00 +0000\" &&\n \tGIT_COMMITTER_DATE=\"2006-06-26 00:00:00 +0000\" &&\n \texport GIT_AUTHOR_DATE GIT_COMMITTER_DATE &&\n \n+\ttest_oid_cache <<-EOF &&\n+\tone sha1:8e32a6d901327a23ef831511badce7bf3bf46689\n+\tone sha256:8739546433ab1ac72ee93088dce611210effee072b2b586ceac6dde43ebec9ce\n+\n+\tthree_file sha1:0e3b14047d3ee365f4f2a1b673db059c3972589c\n+\tthree_file sha256:bc4447d50c07497a8bfe6eef817f2364ecca9d471452e43b52756cc1a908bd32\n+\n+\tmaster sha1:6c9dec2b923228c9ff994c6cfe4ae16c12408dc5\n+\tmaster sha256:8521c3072461fcfe8f32d67f95cc6e6b832a2db2fa29769ffc788bce85ebcd75\n+\n+\tone_tree sha1:22feea448b023a2d864ef94b013735af34d238ba\n+\tone_tree sha256:6e4743f4ef2356b881dda5e91f5c7cdffe870faf350bf7b312f80a20935f5d83\n+\n+\tthree sha1:c61a82b60967180544e3c19f819ddbd0c9f89899\n+\tthree sha256:0cc6d1eda617ded715170786e31ba4e2d0185404ec5a3508dd0d73b324860c6a\n+\n+\ttwo sha1:525b7fb068d59950d185a8779dc957c77eed73ba\n+\ttwo sha256:3b21de3440cd38c2a9e9b464adb923f7054949ed4c918e1a0ac4c95cd52774db\n+\n+\tmaster2 sha1:754b754407bf032e9a2f9d5a9ad05ca79a6b228f\n+\tmaster2 sha256:6c7abaea8a6d8ef4d89877e68462758dc6774690fbbbb0e6d7dd57415c9abde0\n+\n+\ttwo2 sha1:6134ee8f857693b96ff1cc98d3e2fd62b199e5a8\n+\ttwo2 sha256:87a2d3ee29c83a3dc7afd41c0606b11f67603120b910a7be7840accdc18344d4\n+\n+\tthree2 sha1:0567da4d5edd2ff4bb292a465ba9e64dcad9536b\n+\tthree2 sha256:cceb3e8eca364fa9a0a39a1efbebecacc664af86cbbd8070571f5faeb5f0e8c3\n+\tEOF\n+\n \techo >file original &&\n \tgit add file &&\n \tgit commit -a -m One &&\n@@ -137,6 +176,10 @@ do\n \tactual_r=\"$pfx-refs.$test\"\n \n \ttest_expect_success \"$cmd\" '\n+\t\tcp \"$expect_f\" expect_f &&\n+\t\tconvert_expected expect_f &&\n+\t\tcp \"$expect_r\" expect_r &&\n+\t\tconvert_expected expect_r &&\n \t\t{\n \t\t\techo \"# $cmd\"\n \t\t\tset x $cmd; shift\n@@ -152,18 +195,18 @@ do\n \t\t\tcat .git/FETCH_HEAD\n \t\t} >\"$actual_f\" &&\n \t\tgit show-ref >\"$actual_r\" &&\n-\t\tif test -f \"$expect_f\"\n+\t\tif test -f \"expect_f\"\n \t\tthen\n-\t\t\ttest_cmp \"$expect_f\" \"$actual_f\" &&\n+\t\t\ttest_cmp \"expect_f\" \"$actual_f\" &&\n \t\t\trm -f \"$actual_f\"\n \t\telse\n \t\t\t# this is to help developing new tests.\n \t\t\tcp \"$actual_f\" \"$expect_f\"\n \t\t\tfalse\n \t\tfi &&\n-\t\tif test -f \"$expect_r\"\n+\t\tif test -f \"expect_r\"\n \t\tthen\n-\t\t\ttest_cmp \"$expect_r\" \"$actual_r\" &&\n+\t\t\ttest_cmp \"expect_r\" \"$actual_r\" &&\n \t\t\trm -f \"$actual_r\"\n \t\telse\n \t\t\t# this is to help developing new tests.\n"},{"id":"390498","messageId":"20200125230035.136348-17-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 16/22] t5318: update for SHA-256","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:22Z","receivedAt":"2020-01-25T23:01:14Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"Switch two tests to use $ZERO_OID to represent the all-zeros object ID.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t5318-commit-graph.sh | 4 ++--\n 1 file changed, 2 insertions(+), 2 deletions(-)\n\ndiff --git a/t/t5318-commit-graph.sh b/t/t5318-commit-graph.sh\nindex 3f03de6018..55a94072b1 100755\n--- a/t/t5318-commit-graph.sh\n+++ b/t/t5318-commit-graph.sh\n@@ -629,7 +629,7 @@ test_expect_success 'corrupt commit-graph write (broken parent)' '\n \t\tempty=\"$(git mktree </dev/null)\" &&\n \t\tcat >broken <<-EOF &&\n \t\ttree $empty\n-\t\tparent 0000000000000000000000000000000000000000\n+\t\tparent $ZERO_OID\n \t\tauthor whatever <whatever@example.com> 1234 -0000\n \t\tcommitter whatever <whatever@example.com> 1234 -0000\n \n@@ -650,7 +650,7 @@ test_expect_success 'corrupt commit-graph write (missing tree)' '\n \t\tcd repo &&\n \t\ttree=\"$(git mktree </dev/null)\" &&\n \t\tcat >broken <<-EOF &&\n-\t\tparent 0000000000000000000000000000000000000000\n+\t\tparent $ZERO_OID\n \t\tauthor whatever <whatever@example.com> 1234 -0000\n \t\tcommitter whatever <whatever@example.com> 1234 -0000\n \n"},{"id":"390499","messageId":"20200125230035.136348-14-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 13/22] t5313: make test hash independent","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:19Z","receivedAt":"2020-01-25T23:01:14Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"Make this test hash independent by computing the length of the object\noffsets and looking up values which will hash to object IDs with the\nright properties.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t5313-pack-bounds-checks.sh | 19 +++++++++++++++----\n 1 file changed, 15 insertions(+), 4 deletions(-)\n\ndiff --git a/t/t5313-pack-bounds-checks.sh b/t/t5313-pack-bounds-checks.sh\nindex f1708d415e..8d805f845a 100755\n--- a/t/t5313-pack-bounds-checks.sh\n+++ b/t/t5313-pack-bounds-checks.sh\n@@ -38,16 +38,27 @@ munge () {\n # for the initial, and another ofs(4*nr) past that for the extended.\n #\n ofs_table () {\n-\techo $((4 + 4 + 4*256 + 20*$1 + 4*$1))\n+\techo $((4 + 4 + 4*256 + $(test_oid rawsz)*$1 + 4*$1))\n }\n extended_table () {\n \techo $(($(ofs_table \"$1\") + 4*$1))\n }\n \n+test_expect_success 'setup' '\n+\ttest_oid_init &&\n+\ttest_oid_cache <<-EOF\n+\toid000 sha1:1485\n+\toid000 sha256:4222\n+\n+\toidfff sha1:74\n+\toidfff sha256:1350\n+\tEOF\n+'\n+\n test_expect_success 'set up base packfile and variables' '\n \t# the hash of this content starts with ff, which\n \t# makes some later computations much simpler\n-\techo 74 >file &&\n+\techo $(test_oid oidfff) >file &&\n \tgit add file &&\n \tgit commit -m base &&\n \tgit repack -ad &&\n@@ -140,10 +151,10 @@ test_expect_success 'bogus offset inside v2 extended table' '\n \t# an extended table (if the first object were larger than 2^31).\n \t#\n \t# Note that the value is important here. We want $object as\n-\t# the second entry in sorted-sha1 order. The sha1 of 1485 starts\n+\t# the second entry in sorted-sha1 order. The hash of this object starts\n \t# with \"000\", which sorts before that of $object (which starts\n \t# with \"fff\").\n-\tsecond=$(echo 1485 | git hash-object -w --stdin) &&\n+\tsecond=$(test_oid oid000 | git hash-object -w --stdin) &&\n \tdo_pack \"$object $second\" --index-version=2 &&\n \n \t# We have to make extra room for the table, so we cannot\n"},{"id":"390500","messageId":"20200125230035.136348-12-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 11/22] t5302: make hash size independent","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:17Z","receivedAt":"2020-01-25T23:01:15Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"Compute the length of object IDs and pack offsets instead of hard-coding\nconstants.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t5302-pack-index.sh | 18 +++++++++++-------\n 1 file changed, 11 insertions(+), 7 deletions(-)\n\ndiff --git a/t/t5302-pack-index.sh b/t/t5302-pack-index.sh\nindex 91d51b35f9..93ac003639 100755\n--- a/t/t5302-pack-index.sh\n+++ b/t/t5302-pack-index.sh\n@@ -8,7 +8,8 @@ test_description='pack index with 64-bit offsets and object CRC'\n \n test_expect_success \\\n     'setup' \\\n-    'rm -rf .git &&\n+    'test_oid_init &&\n+     rm -rf .git &&\n      git init &&\n      git config pack.threads 1 &&\n      i=1 &&\n@@ -32,7 +33,9 @@ test_expect_success \\\n \t echo $tree &&\n \t git ls-tree $tree | sed -e \"s/.* \\\\([0-9a-f]*\\\\)\t.*/\\\\1/\"\n      } >obj-list &&\n-     git update-ref HEAD $commit'\n+     git update-ref HEAD $commit &&\n+     rawsz=$(test_oid rawsz)\n+'\n \n test_expect_success \\\n     'pack-objects with index version 1' \\\n@@ -152,6 +155,7 @@ test_expect_success \\\n     '[index v1] 2) create a stealth corruption in a delta base reference' \\\n     '# This test assumes file_101 is a delta smaller than 16 bytes.\n      # It should be against file_100 but we substitute its base for file_099\n+     offset=$((rawsz + 4)) &&\n      sha1_101=$(git hash-object file_101) &&\n      sha1_099=$(git hash-object file_099) &&\n      offs_101=$(index_obj_offset 1.idx $sha1_101) &&\n@@ -159,8 +163,8 @@ test_expect_success \\\n      chmod +w \".git/objects/pack/pack-${pack1}.pack\" &&\n      dd of=\".git/objects/pack/pack-${pack1}.pack\" seek=$(($offs_101 + 1)) \\\n         if=\".git/objects/pack/pack-${pack1}.idx\" \\\n-        skip=$((4 + 256 * 4 + $nr_099 * 24)) \\\n-        bs=1 count=20 conv=notrunc &&\n+        skip=$((4 + 256 * 4 + $nr_099 * offset)) \\\n+        bs=1 count=$rawsz conv=notrunc &&\n      git cat-file blob $sha1_101 > file_101_foo1'\n \n test_expect_success \\\n@@ -200,8 +204,8 @@ test_expect_success \\\n      chmod +w \".git/objects/pack/pack-${pack1}.pack\" &&\n      dd of=\".git/objects/pack/pack-${pack1}.pack\" seek=$(($offs_101 + 1)) \\\n         if=\".git/objects/pack/pack-${pack1}.idx\" \\\n-        skip=$((8 + 256 * 4 + $nr_099 * 20)) \\\n-        bs=1 count=20 conv=notrunc &&\n+        skip=$((8 + 256 * 4 + $nr_099 * rawsz)) \\\n+        bs=1 count=$rawsz conv=notrunc &&\n      git cat-file blob $sha1_101 > file_101_foo2'\n \n test_expect_success \\\n@@ -226,7 +230,7 @@ test_expect_success \\\n      nr=$(index_obj_nr \".git/objects/pack/pack-${pack1}.idx\" $obj) &&\n      chmod +w \".git/objects/pack/pack-${pack1}.idx\" &&\n      printf xxxx | dd of=\".git/objects/pack/pack-${pack1}.idx\" conv=notrunc \\\n-        bs=1 count=4 seek=$((8 + 256 * 4 + $(wc -l <obj-list) * 20 + $nr * 4)) &&\n+        bs=1 count=4 seek=$((8 + 256 * 4 + $(wc -l <obj-list) * rawsz + $nr * 4)) &&\n      ( while read obj\n        do git cat-file -p $obj >/dev/null || exit 1\n        done <obj-list ) &&\n"},{"id":"390501","messageId":"20200125230035.136348-13-sandals@crustytoothpaste.net","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"[PATCH v2 12/22] t5309: make test hash independent","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-25T23:00:18Z","receivedAt":"2020-01-25T23:01:16Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"Use the proper pack constants defined in lib-pack.sh to make this test\nwork with SHA-256.\n\nSigned-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n---\n t/t5309-pack-delta-cycles.sh | 10 ++--------\n 1 file changed, 2 insertions(+), 8 deletions(-)\n\ndiff --git a/t/t5309-pack-delta-cycles.sh b/t/t5309-pack-delta-cycles.sh\nindex 491556dad9..b6b9792913 100755\n--- a/t/t5309-pack-delta-cycles.sh\n+++ b/t/t5309-pack-delta-cycles.sh\n@@ -4,15 +4,9 @@ test_description='test index-pack handling of delta cycles in packfiles'\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-pack.sh\n \n-if ! test_have_prereq SHA1\n-then\n-       skip_all='not using SHA-1 for objects'\n-       test_done\n-fi\n-\n # Two similar-ish objects that we have computed deltas between.\n-A=01d7713666f4de822776c7622c10f1b07de280dc\n-B=e68fe8129b546b101aee9510c5328e7f21ca1d18\n+A=$(test_oid packlib_7_0)\n+B=$(test_oid packlib_7_76)\n \n # double-check our hand-constucted packs\n test_expect_success 'index-pack works with a single delta (A->B)' '\n"},{"id":"390508","messageId":"nycvar.QRO.7.76.6.2001261120430.46@tvgsbejvaqbjf.bet","threadId":"52696","inReplyTo":"20200125230035.136348-1-sandals@crustytoothpaste.net","subject":"Re: [PATCH v2 00/23] SHA-256 test fixes, part 8","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2020-01-26T10:25:31Z","receivedAt":"2020-01-26T10:25:42Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi brian,\n\nOn Sat, 25 Jan 2020, brian m. carlson wrote:\n\n> This is the second-to-last series of test fixes for SHA-256.\n>\n> As mentioned previously, the patch for t3305 seems to indicate a bug in\n> the notes code and I'm not familiar enough with that code to apply a\n> fix.  This is a band-aid to get it working with SHA-256, but any\n> comments on a more robust approach would of course be welcome.\n>\n> Changes from v1:\n> * Drop patch for t3404 in favor of Dscho's fix.\n> * Drop patch for t5616 in favor of Jonathan Tan's fix.\n> * Add missing sign-off.\n> * Move test_oid_init into the correct patch.\n\nWould you terribly mind pushing up your local branch to a public place? I\nused the apply-from-public-inbox.sh script I maintain at\nhttps://github.com/git-for-windows/build-extra to apply your patch series\non top of v2.25.0, but I got this:\n\n\tApplying: t5607: make hash size independent\n\tUsing index info to reconstruct a base tree...\n\tM       t/t5607-clone-bundle.sh\n\tFalling back to patching base and 3-way merge...\n\tNo changes -- Patch already applied.\n\n(I want to have a look at the notes fanout. Will keep you posted on my\ninvestigation there.)\n\nThanks,\nDscho\n"},{"id":"390509","messageId":"nycvar.QRO.7.76.6.2001261209590.46@tvgsbejvaqbjf.bet","threadId":"52696","inReplyTo":"20200125230035.136348-4-sandals@crustytoothpaste.net","subject":"Re: [PATCH v2 03/22] t3305: annotate with SHA1 prerequisite","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2020-01-26T11:15:52Z","receivedAt":"2020-01-26T11:16:09Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi brian,\n\nOn Sat, 25 Jan 2020, brian m. carlson wrote:\n\n> This test relies on a roughly equal distribution of hashes for notes in\n> order to ensure that fanouts are compressed.  If there are subtrees with\n> only one item left after removing notes, they'll end up still with one\n> level of fanout, causing the test to fail.\n\nThat is _almost_ correct: The heuristic wants to see one bucket that has\na note in it. Or something like that.\n\nSee 73f77b909f8 (Notes API: for_each_note(): Traverse the entire notes\ntree with a callback, 2010-02-13) for details. (Cc:ing Johan.)\n\n> The test happens to pass with SHA-1, but doesn't necessarily with other\n> hash algorithms, so annotate it with the SHA1 prerequisite.\n\nI would rather see this tested, still, and reducing the number of notes\nthat are retained from 50 to 20 before testing that the fanout has been\nreduced to 0 seems to do the trick. Therefore, I would love to submit this\nfor squashing:\n\n-- snip --\ndiff --git a/t/t3305-notes-fanout.sh b/t/t3305-notes-fanout.sh\nindex 3520402bb81..39b12c9902c 100755\n--- a/t/t3305-notes-fanout.sh\n+++ b/t/t3305-notes-fanout.sh\n@@ -43,7 +43,7 @@ test_expect_success 'many notes created with git-notes triggers fanout' '\n '\n\n test_expect_success 'deleting most notes with git-notes' '\n-\tnum_notes=250 &&\n+\tnum_notes=280 &&\n \ti=0 &&\n \tgit rev-list HEAD |\n \twhile test $i -lt $num_notes && read sha1\n@@ -56,8 +56,8 @@ test_expect_success 'deleting most notes with git-notes' '\n '\n\n test_expect_success 'most notes deleted correctly with git-notes' '\n-\tgit log HEAD~250 | grep \"^    \" > output &&\n-\ti=50 &&\n+\tgit log HEAD~280 | grep \"^    \" > output &&\n+\ti=20 &&\n \twhile test $i -gt 0\n \tdo\n \t\techo \"    commit #$i\" &&\n@@ -67,7 +67,7 @@ test_expect_success 'most notes deleted correctly with git-notes' '\n \ttest_cmp expect output\n '\n\n-test_expect_success SHA1 'deleting most notes triggers fanout consolidation' '\n+test_expect_success 'deleting most notes triggers fanout consolidation' '\n \t# Expect entire notes tree to have a fanout == 0\n \tgit ls-tree -r --name-only refs/notes/commits |\n \twhile read path\n-- snap --\n\nThanks,\nDscho\n\n>\n> Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n> ---\n>  t/t3305-notes-fanout.sh | 2 +-\n>  1 file changed, 1 insertion(+), 1 deletion(-)\n>\n> diff --git a/t/t3305-notes-fanout.sh b/t/t3305-notes-fanout.sh\n> index 831f83d211..3520402bb8 100755\n> --- a/t/t3305-notes-fanout.sh\n> +++ b/t/t3305-notes-fanout.sh\n> @@ -67,7 +67,7 @@ test_expect_success 'most notes deleted correctly with git-notes' '\n>  \ttest_cmp expect output\n>  '\n>\n> -test_expect_success 'deleting most notes triggers fanout consolidation' '\n> +test_expect_success SHA1 'deleting most notes triggers fanout consolidation' '\n>  \t# Expect entire notes tree to have a fanout == 0\n>  \tgit ls-tree -r --name-only refs/notes/commits |\n>  \twhile read path\n>\n"},{"id":"390515","messageId":"CALKQrgcF0KK1gEvyKe3th2w0YJBbmv+grgbCeN4fOzHKo=H1UA@mail.gmail.com","threadId":"52696","inReplyTo":"nycvar.QRO.7.76.6.2001261209590.46@tvgsbejvaqbjf.bet","subject":"Re: [PATCH v2 03/22] t3305: annotate with SHA1 prerequisite","fromName":"Johan Herland","fromEmail":"johan@herland.net","sentAt":"2020-01-26T18:18:15Z","receivedAt":"2020-01-26T18:54:04Z","isPatch":true,"sender":{"key":"johan@herland.net","avatar":"https://avatars.githubusercontent.com/u/547031?v=4"},"body":"On Sun, Jan 26, 2020 at 12:16 PM Johannes Schindelin\n<Johannes.Schindelin@gmx.de> wrote:\n> On Sat, 25 Jan 2020, brian m. carlson wrote:\n> > This test relies on a roughly equal distribution of hashes for notes in\n> > order to ensure that fanouts are compressed.  If there are subtrees with\n> > only one item left after removing notes, they'll end up still with one\n> > level of fanout, causing the test to fail.\n>\n> That is _almost_ correct: The heuristic wants to see one bucket that has\n> a note in it. Or something like that.\n>\n> See 73f77b909f8 (Notes API: for_each_note(): Traverse the entire notes\n> tree with a callback, 2010-02-13) for details. (Cc:ing Johan.)\n\nSomething like that, yeah... Re-reading this code, I believe we stop\nthe fanout at the current level when we can find one or more notes\nthat do not share the high-nibble of their path with another note.\n\nHere we're at the top level, so this corresponds to looking at the\nvery first hex character (0-9a-f) of the path (oid of annotated\nobject), and if there are at least two such objects for each hex\ncharacter, we will use a fanout of 1, otherwise, we collapse the\nfanout to 0.\n\nHence we need an absolute minimum of 32 notes (and some rotten luck)\nto get a fanout of 1. As the number of notes increase, the probably of\nfanning out increases, passing 50% at ~79 notes, and reaching ~100%\nsomewhere north of 150 notes.\n\n> > The test happens to pass with SHA-1, but doesn't necessarily with other\n> > hash algorithms, so annotate it with the SHA1 prerequisite.\n>\n> I would rather see this tested, still, and reducing the number of notes\n> that are retained from 50 to 20 before testing that the fanout has been\n> reduced to 0 seems to do the trick. Therefore, I would love to submit this\n> for squashing:\n\nYes, it seems that for SHA1 and the (deterministic) objects used in\nthe test, we got away with 50 notes, but that is not the case for\nother hash algorithms. Lowering the number to 20 definitely results a\nfanout of 0, as should any other number below 32.\n\n+1 to Dscho's squash.\n\n...Johan\n\n-- \nJohan Herland, <johan@herland.net>\nwww.herland.net\n"},{"id":"390516","messageId":"20200126194233.GD4113372@camp.crustytoothpaste.net","threadId":"52696","inReplyTo":"nycvar.QRO.7.76.6.2001261120430.46@tvgsbejvaqbjf.bet","subject":"Re: [PATCH v2 00/23] SHA-256 test fixes, part 8","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-26T19:42:33Z","receivedAt":"2020-01-26T19:42:40Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"On 2020-01-26 at 10:25:31, Johannes Schindelin wrote:\n> Hi brian,\n> \n> On Sat, 25 Jan 2020, brian m. carlson wrote:\n> \n> > This is the second-to-last series of test fixes for SHA-256.\n> >\n> > As mentioned previously, the patch for t3305 seems to indicate a bug in\n> > the notes code and I'm not familiar enough with that code to apply a\n> > fix.  This is a band-aid to get it working with SHA-256, but any\n> > comments on a more robust approach would of course be welcome.\n> >\n> > Changes from v1:\n> > * Drop patch for t3404 in favor of Dscho's fix.\n> > * Drop patch for t5616 in favor of Jonathan Tan's fix.\n> > * Add missing sign-off.\n> > * Move test_oid_init into the correct patch.\n> \n> Would you terribly mind pushing up your local branch to a public place? I\n> used the apply-from-public-inbox.sh script I maintain at\n> https://github.com/git-for-windows/build-extra to apply your patch series\n> on top of v2.25.0, but I got this:\n> \n> \tApplying: t5607: make hash size independent\n> \tUsing index info to reconstruct a base tree...\n> \tM       t/t5607-clone-bundle.sh\n> \tFalling back to patching base and 3-way merge...\n> \tNo changes -- Patch already applied.\n> \n> (I want to have a look at the notes fanout. Will keep you posted on my\n> investigation there.)\n\nThe branch is test-fixes-part8 on https://github.com/bk2204/git.git.\nIt's currently based off master.\n-- \nbrian m. carlson: Houston, Texas, US\nOpenPGP: https://keybase.io/bk2204\n"},{"id":"390517","messageId":"20200126194456.GE4113372@camp.crustytoothpaste.net","threadId":"52696","inReplyTo":"nycvar.QRO.7.76.6.2001261209590.46@tvgsbejvaqbjf.bet","subject":"Re: [PATCH v2 03/22] t3305: annotate with SHA1 prerequisite","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-26T19:44:56Z","receivedAt":"2020-01-26T19:45:02Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"On 2020-01-26 at 11:15:52, Johannes Schindelin wrote:\n> I would rather see this tested, still, and reducing the number of notes\n> that are retained from 50 to 20 before testing that the fanout has been\n> reduced to 0 seems to do the trick. Therefore, I would love to submit this\n> for squashing:\n> \n> -- snip --\n> diff --git a/t/t3305-notes-fanout.sh b/t/t3305-notes-fanout.sh\n> index 3520402bb81..39b12c9902c 100755\n> --- a/t/t3305-notes-fanout.sh\n> +++ b/t/t3305-notes-fanout.sh\n> @@ -43,7 +43,7 @@ test_expect_success 'many notes created with git-notes triggers fanout' '\n>  '\n> \n>  test_expect_success 'deleting most notes with git-notes' '\n> -\tnum_notes=250 &&\n> +\tnum_notes=280 &&\n>  \ti=0 &&\n>  \tgit rev-list HEAD |\n>  \twhile test $i -lt $num_notes && read sha1\n> @@ -56,8 +56,8 @@ test_expect_success 'deleting most notes with git-notes' '\n>  '\n> \n>  test_expect_success 'most notes deleted correctly with git-notes' '\n> -\tgit log HEAD~250 | grep \"^    \" > output &&\n> -\ti=50 &&\n> +\tgit log HEAD~280 | grep \"^    \" > output &&\n> +\ti=20 &&\n>  \twhile test $i -gt 0\n>  \tdo\n>  \t\techo \"    commit #$i\" &&\n> @@ -67,7 +67,7 @@ test_expect_success 'most notes deleted correctly with git-notes' '\n>  \ttest_cmp expect output\n>  '\n> \n> -test_expect_success SHA1 'deleting most notes triggers fanout consolidation' '\n> +test_expect_success 'deleting most notes triggers fanout consolidation' '\n>  \t# Expect entire notes tree to have a fanout == 0\n>  \tgit ls-tree -r --name-only refs/notes/commits |\n>  \twhile read path\n> -- snap --\n\nSure, that's a fine solution instead.  I'll squash that in and update\nthe commit message.  I'll CC you for your sign-off once I've done that.\n-- \nbrian m. carlson: Houston, Texas, US\nOpenPGP: https://keybase.io/bk2204\n"},{"id":"390520","messageId":"nycvar.QRO.7.76.6.2001261957060.46@tvgsbejvaqbjf.bet","threadId":"52696","inReplyTo":"CALKQrgcF0KK1gEvyKe3th2w0YJBbmv+grgbCeN4fOzHKo=H1UA@mail.gmail.com","subject":"Re: [PATCH v2 03/22] t3305: annotate with SHA1 prerequisite","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2020-01-26T21:28:58Z","receivedAt":"2020-01-26T21:29:15Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi Johan,\n\nOn Sun, 26 Jan 2020, Johan Herland wrote:\n\n> On Sun, Jan 26, 2020 at 12:16 PM Johannes Schindelin\n> <Johannes.Schindelin@gmx.de> wrote:\n> > On Sat, 25 Jan 2020, brian m. carlson wrote:\n> > > This test relies on a roughly equal distribution of hashes for notes in\n> > > order to ensure that fanouts are compressed.  If there are subtrees with\n> > > only one item left after removing notes, they'll end up still with one\n> > > level of fanout, causing the test to fail.\n> >\n> > That is _almost_ correct: The heuristic wants to see one bucket that has\n> > a note in it. Or something like that.\n> >\n> > See 73f77b909f8 (Notes API: for_each_note(): Traverse the entire notes\n> > tree with a callback, 2010-02-13) for details. (Cc:ing Johan.)\n>\n> Something like that, yeah... Re-reading this code, I believe we stop\n> the fanout at the current level when we can find one or more notes\n> that do not share the high-nibble of their path with another note.\n>\n> Here we're at the top level, so this corresponds to looking at the\n> very first hex character (0-9a-f) of the path (oid of annotated\n> object), and if there are at least two such objects for each hex\n> character, we will use a fanout of 1, otherwise, we collapse the\n> fanout to 0.\n\nThat makes sense, but when I looked at the failed test, there seems\nsomething else at play, at least in addition to what you said: for\n_adding_ notes, your description is 100% accurate, but when deleting\nnotes, we are apparently not collapsing `PTR_TYPE_SUBTREE` nodes \"quickly\"\nenough. Let me show you the part of `git ls-tree -r refs/notes/commits`\nthat starts with the hex digits 7, 8 and 9:\n\n-- snip --\n100644 blob 22939636f79a53181ea58f04f2136bd745976edd0018465e60a8df89816a9c2b 72/67b1c94ab5ddf005fd4b0e50b6a7816a62e7ed0459cec6aa1a00577b2111ba\n100644 blob 2e3f3dad7043b2d02d09ca12b299acbe05d781357d3a56a2d012fdf787409459 76/62d4b264094ca479be86ef7aa66daae63e45afa633a3892dc787b13ecff495\n100644 blob 22e7f0c5af7315d692f8a107a43ba0784e1ab00a20ea803fab1acad1319e5f79 7b/8c0a9c86815a94da7ef90b356b1f98d6a4099af3fdc3d8625a8fa793b63821\n100644 blob b3ce67c9d5507dc00d95d8fb2000c1d5b70908ad1d2c034e5833f57b7bb85511 7f/0af9cf9259cd6e67c0af3324ca443dd3d56694fbdc94d28e300a768d3d0e6e\n100644 blob fafb40e32e87a2c481df6ceb37804d80c995faec3d7772c071b129fd47c2ba8a 8a/f1ad99a5e559f5835007f2bcb1b07de0e8c7434e7fbaa676a2edbd796a7f60\n100644 blob b811e8da7c7acc83ef025753504ff6ed2d1eb8d2bb832d6b7487a7786d67aa53 93/f364fafaee6a178d8e8939f15d5b260f71940f663c3731396ee43082fd6551\n100644 blob 0b1915ccb6f64cac64f2297893bce1ba7408660f79182302faaada71ee8c3c1c 96/b562b168f94e5c6e6a1e40ec4b817aa168c99769b1d9a46f7e048e93897fb4\n-- snap --\n\nThis command was run in the worktree after running an unmodified t3305\nwith `GIT_TEST_DEFAULT_HASH=sha256` in brian's `transition-stage-4` branch\n(well, I removed the `SHA1` prereq again, that's the modification I made).\n\nAs you can see, there _is_ a fanout of 1, but there is only a single note\nfor a commit whose ID starts with `8`.\n\nDebugging a little, it seems that the `PTR_TYPE_SUBTREE` node for `8` was\nnot collapsed, even if there was only one item left.\n\nSo I formed a hypothesis that the subtrees are only removed when the\n_last_ item is removed for any given leading nybble, but that turned out\nto also be incorrect. It is a bit more tricky than that. This is the\nsmallest set to which I was able to reduce the notes without reducing the\nfanout to 0:\n\n-- snip --\n100644 blob cc2ee5e00d8bc3805d704b67439dc8175bcf9497603288e6de2d4d8b3fc7be9f\t05/b6e3d1394d020129f71fd8e41cf7ea8cbc58ae0f1332abd5da0c74ea194b71\n100644 blob 1c6afe76a1bcd0103c36ab9707a2ca9e68974b6a6bbaae564c0509c43b4392bd\t1e/311d64dc3ad5491964bcded60fee15b19d5b9c916a7e62a4f0746fa4e81fa6\n100644 blob cf97d105e3970ef1cf9b12ac092be80abcd496c593bc8ca5550d059c3967630a\t28/79e092d524b7ae9a42026ab2886094cce8ffc63175f8b3fd5de84faef10df3\n100644 blob 78ef788b804dd0e5415c386b4a29668f61033483c35438f0471dfd7c4bfa093b\t36/fe8fe67a2e9d0203c665d6e08ca454833ec32a97369769a7138d3938c0000b\n100644 blob f46845c2d7e3272319aa5c18e359fdbc37731c88a945bb9632b8c4321983c75a\t4a/a271a09d848f99d3fb978e5c156baa812a0fa1c30a88c885831641630be01a\n100644 blob ecf5a4a178ca4b51cea457abe7c935761ca15a1d817f83c2da6816ede84db779\t51/eaee3ca1a8698cb0aaa4de2d3f339985570da68b28e84af752e1cfd25f5197\n100644 blob 2f4e9d6a4a1d050f8cb932ba545e53b48d9b669f6e00dc4a962d88ee9d92482b\t62/dd63d43070c3ca7e3a6cdfa4ed970256a00a06e88d10fcb0532acd51419e0f\n100644 blob 22939636f79a53181ea58f04f2136bd745976edd0018465e60a8df89816a9c2b\t72/67b1c94ab5ddf005fd4b0e50b6a7816a62e7ed0459cec6aa1a00577b2111ba\n100644 blob fafb40e32e87a2c481df6ceb37804d80c995faec3d7772c071b129fd47c2ba8a\t8a/f1ad99a5e559f5835007f2bcb1b07de0e8c7434e7fbaa676a2edbd796a7f60\n100644 blob b811e8da7c7acc83ef025753504ff6ed2d1eb8d2bb832d6b7487a7786d67aa53\t93/f364fafaee6a178d8e8939f15d5b260f71940f663c3731396ee43082fd6551\n100644 blob 589656c26944c471b5ac65739f8c7b96663a9f827a3d27beb49e39e3707b7294\ta2/0e8f30856061125d479779755ef3238a7b561f9336e0143c437daac7d93f4c\n100644 blob 7eaa9350d5c6bd6fd0fc4071c5d6a266949046c67987a9e1f665ba34d95f419d\ta2/80d13a05aa68cc5ef948a8b69067807457fd37c00ce4a234fa4a0c0753ef4e\n100644 blob 7a8378dd60d6024db645757eac7271a80b101a2df230ebd1a57ff52ff2d32e36\tb9/2a3a7dc6db290d93f79150bfb31447f3e550cfe4a63c5ddbeac18fec755e86\n100644 blob 86fff6007d9911249bee803a6630e182677355a5574e637d1a8301e219c5da86\tc1/52ffd73d1c5e7c121c7c247682f1ee971f6f09101c96a84486d18be41d0dd0\n100644 blob cd887698e1da81a76ae1caf0eaec19d60830a13ead152ec4700be511ceb8ee33\td0/3f742b8b95f68478946d7fe7495da9462801fadeaaa06c11bf54dbc46610f5\n100644 blob 19f7bdfee9687311dbe1195e0a64954b677ae68e6d734fd5fb76ea4ad4f93782\tea/356ae2d38123b46639db98df14953f4c7cdd91738779174ec67876ce9487e3\n100644 blob 948c0cba23ec0405c622c9dea8ed8dd7b3fa043c86b5e5a8b4de0d1c6a0e67b9\tf7/802d4c716fed3c76fe58c86ac7c3ae3e19b8c0d3ea97c9f90f5939fe5a78d8\n100644 blob 28690ad489e29e3607c82e1f626ec24d7f831555c802108bfe9b993fbd794a7e\tf7/da03e811b7d9071ee19dabdc721e0f863e28c92dfa3257474282396a73bb44\n-- snap --\n\nYou will note that there are two entries that start with `a2`, and two\nentries that start with `f7`. If I remove any of those, the corresponding\nsubtree will be collapsed, and the fanout will be reduced to 0.\n\nBut it is only happenstance with SHA-256 that there are these entries that\nagree not only in the first, but also in the second leading nybble.\n\nTherefore...\n\n> Hence we need an absolute minimum of 32 notes (and some rotten luck)\n> to get a fanout of 1. As the number of notes increase, the probably of\n> fanning out increases, passing 50% at ~79 notes, and reaching ~100%\n> somewhere north of 150 notes.\n\n... I would register that we need an absolute minimum of 16 notes (and\nsome rather crafty craft) to get a fanout of 1.\n\nIn that light, I think that I would prefer to retract my patch that\n\"only\" reduces the remaining number of notes to 20: it should reduce them\nto 15 or less. So why not reduce it to 10 (because it is only one changed\ndigit).\n\n> > > The test happens to pass with SHA-1, but doesn't necessarily with other\n> > > hash algorithms, so annotate it with the SHA1 prerequisite.\n> >\n> > I would rather see this tested, still, and reducing the number of notes\n> > that are retained from 50 to 20 before testing that the fanout has been\n> > reduced to 0 seems to do the trick. Therefore, I would love to submit this\n> > for squashing:\n>\n> Yes, it seems that for SHA1 and the (deterministic) objects used in\n> the test, we got away with 50 notes, but that is not the case for\n> other hash algorithms. Lowering the number to 20 definitely results a\n> fanout of 0, as should any other number below 32.\n>\n> +1 to Dscho's squash.\n>\n> ...Johan\n\nThank you so much for the analysis. To be honest, I did not quite\nunderstand all the details of the comment added in 73f77b989f8 when I\nwrote the patch I suggested, so I basically just picked that number \"20\"\nout of thin air.\n\nTogether with your insights, I would like to propose this commit message\nfor the squashed commits (I left in the hunk that removes the `SHA1`\nprerequisite, but of course that won't be part of the final commit):\n\n-- snip --\nt3305: make fanout test more robust (needed for SHA-256)\n\nTo make things more performant, notes are stored in a \"fanout\": when\nthere are enough commit notes, they are no longer stored as verbatim\ncommit IDs at the top-level tree of the notes ref, but instead the tree\nis deepened much like the loose object cache: subtrees are introduced\nwhose names are the two hex digits they \"chomp off\" the commit IDs.\n\nThe test case 'deleting most notes triggers fanout consolidation' wants\nto verify that the fanout level is reduced automatically when enough\nnotes have been deleted.\n\nHowever, that test case expected that reduction to level 0 (i.e. _no_\nfanout subtrees) to happen after reducing the originally-added 300 notes\nto 50, which _happened_ to work with SHA-1-based commit IDs, but it is\nno longer works with SHA-256-based ones.\n\nThe reason: The heuristic for the fanout looks at the number of entries\nfor leading nybbles (read: hex digits) of the commit IDs. If there are\nmore than a single annotated commit for all of the 16 hex digits, the\nfanout is incremented. It is a bit more tricky when reducing the number\nof notes: the fanout is reduced reliably only if there are less notes\nthan hex digits (i.e. less than 15 notes) for a given prefix.\n\nFor good measure, let's reduce the number of notes to 10 in the test\ncase 'deleting most notes with git-notes' so that the test case\n'deleting most notes triggers fanout consolidation' is guaranteed to\nsucceed with _any_ hash algorithm.\n\nOriginal-patch-by: brian m. carlson <sandals@crustytoothpaste.net>\nHelped-by: Johan Herland <johan@herland.net>\nSigned-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>\n---\ndiff --git a/t/t3305-notes-fanout.sh b/t/t3305-notes-fanout.sh\nindex 3520402bb81..b83c2670ebe 100755\n--- a/t/t3305-notes-fanout.sh\n+++ b/t/t3305-notes-fanout.sh\n@@ -43,7 +43,7 @@ test_expect_success 'many notes created with git-notes triggers fanout' '\n '\n\n test_expect_success 'deleting most notes with git-notes' '\n-\tnum_notes=250 &&\n+\tnum_notes=290 &&\n \ti=0 &&\n \tgit rev-list HEAD |\n \twhile test $i -lt $num_notes && read sha1\n@@ -56,8 +56,8 @@ test_expect_success 'deleting most notes with git-notes' '\n '\n\n test_expect_success 'most notes deleted correctly with git-notes' '\n-\tgit log HEAD~250 | grep \"^    \" > output &&\n-\ti=50 &&\n+\tgit log HEAD~290 | grep \"^    \" > output &&\n+\ti=10 &&\n \twhile test $i -gt 0\n \tdo\n \t\techo \"    commit #$i\" &&\n@@ -67,7 +67,7 @@ test_expect_success 'most notes deleted correctly with git-notes' '\n \ttest_cmp expect output\n '\n\n-test_expect_success SHA1 'deleting most notes triggers fanout consolidation' '\n+test_expect_success 'deleting most notes triggers fanout consolidation' '\n \t# Expect entire notes tree to have a fanout == 0\n \tgit ls-tree -r --name-only refs/notes/commits |\n \twhile read path\n-- snap --\n\nbrian, would you mind adopting this patch into your patch series? For your\nconvenience, I pushed it up as `t3305-sha256-fanout` (based on your\n`transition-stage-4`) to https://github.com/dscho/git.\n\nThanks, Dscho\n"},{"id":"390521","messageId":"nycvar.QRO.7.76.6.2001262230420.46@tvgsbejvaqbjf.bet","threadId":"52696","inReplyTo":"20200126194233.GD4113372@camp.crustytoothpaste.net","subject":"Re: [PATCH v2 00/23] SHA-256 test fixes, part 8","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2020-01-26T21:30:54Z","receivedAt":"2020-01-26T21:31:02Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi brian,\n\nOn Sun, 26 Jan 2020, brian m. carlson wrote:\n\n> On 2020-01-26 at 10:25:31, Johannes Schindelin wrote:\n> > Hi brian,\n> >\n> > On Sat, 25 Jan 2020, brian m. carlson wrote:\n> >\n> > > This is the second-to-last series of test fixes for SHA-256.\n> > >\n> > > As mentioned previously, the patch for t3305 seems to indicate a bug in\n> > > the notes code and I'm not familiar enough with that code to apply a\n> > > fix.  This is a band-aid to get it working with SHA-256, but any\n> > > comments on a more robust approach would of course be welcome.\n> > >\n> > > Changes from v1:\n> > > * Drop patch for t3404 in favor of Dscho's fix.\n> > > * Drop patch for t5616 in favor of Jonathan Tan's fix.\n> > > * Add missing sign-off.\n> > > * Move test_oid_init into the correct patch.\n> >\n> > Would you terribly mind pushing up your local branch to a public place? I\n> > used the apply-from-public-inbox.sh script I maintain at\n> > https://github.com/git-for-windows/build-extra to apply your patch series\n> > on top of v2.25.0, but I got this:\n> >\n> > \tApplying: t5607: make hash size independent\n> > \tUsing index info to reconstruct a base tree...\n> > \tM       t/t5607-clone-bundle.sh\n> > \tFalling back to patching base and 3-way merge...\n> > \tNo changes -- Patch already applied.\n> >\n> > (I want to have a look at the notes fanout. Will keep you posted on my\n> > investigation there.)\n>\n> The branch is test-fixes-part8 on https://github.com/bk2204/git.git.\n> It's currently based off master.\n\nThank you!\nDscho\n"},{"id":"390522","messageId":"20200126215015.GF4113372@camp.crustytoothpaste.net","threadId":"52696","inReplyTo":"nycvar.QRO.7.76.6.2001261957060.46@tvgsbejvaqbjf.bet","subject":"Re: [PATCH v2 03/22] t3305: annotate with SHA1 prerequisite","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-26T21:50:15Z","receivedAt":"2020-01-26T21:50:23Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"On 2020-01-26 at 21:28:58, Johannes Schindelin wrote:\n> brian, would you mind adopting this patch into your patch series? For your\n> convenience, I pushed it up as `t3305-sha256-fanout` (based on your\n> `transition-stage-4`) to https://github.com/dscho/git.\n\nAbsolutely.  Thanks so much for both of your work on this, and for\nconfirming that it's just a heuristic difference and not a bug in the\ncode.\n\nI'll send out a v3 soon.\n-- \nbrian m. carlson: Houston, Texas, US\nOpenPGP: https://keybase.io/bk2204\n"},{"id":"390523","messageId":"nycvar.QRO.7.76.6.2001262303530.46@tvgsbejvaqbjf.bet","threadId":"52696","inReplyTo":"20200125230035.136348-9-sandals@crustytoothpaste.net","subject":"Re: [PATCH v2 08/22] t4013: make test hash independent","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2020-01-26T22:08:18Z","receivedAt":"2020-01-26T22:08:29Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi brian,\n\nOn Sat, 25 Jan 2020, brian m. carlson wrote:\n\n> This test produces a large number of diff formats and compares the\n> output with test files that have content specific to SHA-1. Since we are\n> more interested in the format of the diffs, and not their specific\n> values, which are tested elsewhere, add a function which uses sed to\n> transform these specific object IDs into generic ones of the right size,\n> which we can then compare.\n>\n> Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n> ---\n>  t/t4013-diff-various.sh | 44 +++++++++++++++++++++++++++++++++++------\n>  1 file changed, 38 insertions(+), 6 deletions(-)\n>\n> diff --git a/t/t4013-diff-various.sh b/t/t4013-diff-various.sh\n> index 5ac94b390d..6f5f05c3a8 100755\n> --- a/t/t4013-diff-various.sh\n> +++ b/t/t4013-diff-various.sh\n> @@ -120,6 +120,30 @@ test_expect_success setup '\n>  +*++ [initial] Initial\n>  EOF\n>\n> +process_diffs () {\n> +\tx04=\"[0-9a-f][0-9a-f][0-9a-f][0-9a-f]\" &&\n> +\tx07=\"$_x05[0-9a-f][0-9a-f]\" &&\n\nAny reason not to stay with the convention, i.e. using `_x04` and `_x07`\nhere (with leading underscores)?\n\n> +\tsed -e \"s/$OID_REGEX/$ZERO_OID/g\" \\\n> +\t    -e \"s/From $_x40 /From $ZERO_OID /\" \\\n> +\t    -e \"s/from $_x40)/from $ZERO_OID)/\" \\\n> +\t    -e \"s/commit $_x40\\$/commit $ZERO_OID/\" \\\n> +\t    -e \"s/commit $_x40 (/commit $ZERO_OID (/\" \\\n> +\t    -e \"s/$_x40 $_x40 $_x40/$ZERO_OID $ZERO_OID $ZERO_OID/\" \\\n> +\t    -e \"s/$_x40 $_x40 /$ZERO_OID $ZERO_OID /\" \\\n> +\t    -e \"s/^$_x40 $_x40$/$ZERO_OID $ZERO_OID/\" \\\n> +\t    -e \"s/^$_x40 /$ZERO_OID /\" \\\n> +\t    -e \"s/^$_x40$/$ZERO_OID/\" \\\n> +\t    -e \"s/$x07\\.\\.$x07/fffffff..fffffff/g\" \\\n> +\t    -e \"s/$x07,$x07\\.\\.$x07/fffffff,fffffff..fffffff/g\" \\\n> +\t    -e \"s/$x07 $x07 $x07/fffffff fffffff fffffff/g\" \\\n> +\t    -e \"s/$x07 $x07 /fffffff fffffff /g\" \\\n> +\t    -e \"s/Merge: $x07 $x07/Merge: fffffff fffffff/g\" \\\n> +\t    -e \"s/$x07\\.\\.\\./fffffff.../g\" \\\n> +\t    -e \"s/ $x04\\.\\.\\./ ffff.../g\" \\\n> +\t    -e \"s/ $x04/ ffff/g\" \\\n> +\t    \"$1\"\n> +}\n> +\n>  V=$(git version | sed -e 's/^git version //' -e 's/\\./\\\\./g')\n>  while read magic cmd\n>  do\n> @@ -158,13 +182,15 @@ do\n>  \t\t} >\"$actual\" &&\n>  \t\tif test -f \"$expect\"\n>  \t\tthen\n> +\t\t\tprocess_diffs \"$actual\" >actual &&\n> +\t\t\tprocess_diffs \"$expect\" >expect &&\n>  \t\t\tcase $cmd in\n>  \t\t\t*format-patch* | *-stat*)\n> -\t\t\t\ttest_i18ncmp \"$expect\" \"$actual\";;\n> +\t\t\t\ttest_i18ncmp expect actual;;\n>  \t\t\t*)\n> -\t\t\t\ttest_cmp \"$expect\" \"$actual\";;\n> +\t\t\t\ttest_cmp expect actual;;\n>  \t\t\tesac &&\n> -\t\t\trm -f \"$actual\"\n> +\t\t\trm -f \"$actual\" actual expect\n>  \t\telse\n>  \t\t\t# this is to help developing new tests.\n>  \t\t\tcp \"$actual\" \"$expect\"\n> @@ -383,16 +409,22 @@ test_expect_success 'log -S requires an argument' '\n>  test_expect_success 'diff --cached on unborn branch' '\n>  \techo ref: refs/heads/unborn >.git/HEAD &&\n>  \tgit diff --cached >result &&\n> -\ttest_cmp \"$TEST_DIRECTORY/t4013/diff.diff_--cached\" result\n> +\tprocess_diffs result >actual &&\n> +\tprocess_diffs \"$TEST_DIRECTORY/t4013/diff.diff_--cached\" >expected &&\n\nI was about to suggest letting `process_diffs` work in-place, but this\nline makes that idea moot.\n\nAnother idea I had was to implement a `test_cmp_diff` that processes the\ndiffs and then compares them, but I guess that would be _less_ concise\nthan this patch.\n\nLooks good,\nDscho\n\n> +\ttest_cmp expected actual\n>  '\n>\n>  test_expect_success 'diff --cached -- file on unborn branch' '\n>  \tgit diff --cached -- file0 >result &&\n> -\ttest_cmp \"$TEST_DIRECTORY/t4013/diff.diff_--cached_--_file0\" result\n> +\tprocess_diffs result >actual &&\n> +\tprocess_diffs \"$TEST_DIRECTORY/t4013/diff.diff_--cached_--_file0\" >expected &&\n> +\ttest_cmp expected actual\n>  '\n>  test_expect_success 'diff --line-prefix with spaces' '\n>  \tgit diff --line-prefix=\"| | | \" --cached -- file0 >result &&\n> -\ttest_cmp \"$TEST_DIRECTORY/t4013/diff.diff_--line-prefix_--cached_--_file0\" result\n> +\tprocess_diffs result >actual &&\n> +\tprocess_diffs \"$TEST_DIRECTORY/t4013/diff.diff_--line-prefix_--cached_--_file0\" >expected &&\n> +\ttest_cmp expected actual\n>  '\n>\n>  test_expect_success 'diff-tree --stdin with log formatting' '\n>\n"},{"id":"390524","messageId":"nycvar.QRO.7.76.6.2001262311220.46@tvgsbejvaqbjf.bet","threadId":"52696","inReplyTo":"20200125230035.136348-11-sandals@crustytoothpaste.net","subject":"Re: [PATCH v2 10/22] t4211: make test hash independent","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2020-01-26T22:13:56Z","receivedAt":"2020-01-26T22:14:04Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi brian,\n\nOn Sat, 25 Jan 2020, brian m. carlson wrote:\n\n> This test uses several test files that contain hard-coded SHA-1 object\n> IDs. Replace these values with generic ones of the correct size so that\n> the test works with either SHA-1 or SHA-256.\n>\n> Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n> ---\n\nAn alternative would be, of course, to change the files in t/t4211/ to\nhave SHA-256 variants, and then to implement a helper to replace those by\nSHA-1 variants when needed.\n\nIt would be quite a bit more work (and I'd be willing to carry at least\nsome of it), but I think it would be worth it, in order to keep the\nassociated safety against regressions. Would you agree?\n\nCiao,\nDscho\n\n>  t/t4211-line-log.sh | 14 ++++++++++++--\n>  1 file changed, 12 insertions(+), 2 deletions(-)\n>\n> diff --git a/t/t4211-line-log.sh b/t/t4211-line-log.sh\n> index 8319163744..2cbfd8dd9e 100755\n> --- a/t/t4211-line-log.sh\n> +++ b/t/t4211-line-log.sh\n> @@ -8,10 +8,20 @@ test_expect_success 'setup (import history)' '\n>  \tgit reset --hard\n>  '\n>\n> +process_output () {\n> +\tx07=\"$_x05[0-9a-f][0-9a-f]\"\n> +\tsed -e \"s/commit $OID_REGEX/commit $ZERO_OID/\" \\\n> +\t    -e \"s/commit $_x40$/commit $ZERO_OID/\" \\\n> +\t    -e \"s/Merge: $x07 $x07$/Merge: 0000000 0000000/\" \\\n> +\t    \"$1\"\n> +}\n> +\n>  canned_test_1 () {\n>  \ttest_expect_$1 \"$2\" \"\n> -\t\tgit log $2 >actual &&\n> -\t\ttest_cmp \\\"\\$TEST_DIRECTORY\\\"/t4211/expect.$3 actual\n> +\t\tgit log $2 >result &&\n> +\t\tprocess_output result >actual &&\n> +\t\tprocess_output \\\"\\$TEST_DIRECTORY\\\"/t4211/expect.$3 >expected &&\n> +\t\ttest_cmp expected actual\n>  \t\"\n>  }\n>\n>\n"},{"id":"390525","messageId":"nycvar.QRO.7.76.6.2001262315150.46@tvgsbejvaqbjf.bet","threadId":"52696","inReplyTo":"20200125230035.136348-12-sandals@crustytoothpaste.net","subject":"Re: [PATCH v2 11/22] t5302: make hash size independent","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2020-01-26T22:23:32Z","receivedAt":"2020-01-26T22:23:41Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi brian,\n\nOn Sat, 25 Jan 2020, brian m. carlson wrote:\n\n> Compute the length of object IDs and pack offsets instead of hard-coding\n> constants.\n>\n> Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n> ---\n>  t/t5302-pack-index.sh | 18 +++++++++++-------\n>  1 file changed, 11 insertions(+), 7 deletions(-)\n>\n> diff --git a/t/t5302-pack-index.sh b/t/t5302-pack-index.sh\n> index 91d51b35f9..93ac003639 100755\n> --- a/t/t5302-pack-index.sh\n> +++ b/t/t5302-pack-index.sh\n> @@ -8,7 +8,8 @@ test_description='pack index with 64-bit offsets and object CRC'\n>\n>  test_expect_success \\\n>      'setup' \\\n> -    'rm -rf .git &&\n> +    'test_oid_init &&\n> +     rm -rf .git &&\n\nWhy not consolidate the `test_expect_success` line into the current\nconvention at the same time (\"while at it\")? I.e.\n\n\ttest_expect_success 'setup' '\n\n>       git init &&\n>       git config pack.threads 1 &&\n>       i=1 &&\n> @@ -32,7 +33,9 @@ test_expect_success \\\n>  \t echo $tree &&\n>  \t git ls-tree $tree | sed -e \"s/.* \\\\([0-9a-f]*\\\\)\t.*/\\\\1/\"\n>       } >obj-list &&\n> -     git update-ref HEAD $commit'\n> +     git update-ref HEAD $commit &&\n> +     rawsz=$(test_oid rawsz)\n\nSince the `rawsz` assignment has a lot to do with `test_oid_init`, I would\ncoddle this added line with the `test_oid_init` line above instead of\nadding it here.\n\n> +'\n>\n>  test_expect_success \\\n>      'pack-objects with index version 1' \\\n> @@ -152,6 +155,7 @@ test_expect_success \\\n>      '[index v1] 2) create a stealth corruption in a delta base reference' \\\n>      '# This test assumes file_101 is a delta smaller than 16 bytes.\n>       # It should be against file_100 but we substitute its base for file_099\n> +     offset=$((rawsz + 4)) &&\n>       sha1_101=$(git hash-object file_101) &&\n>       sha1_099=$(git hash-object file_099) &&\n>       offs_101=$(index_obj_offset 1.idx $sha1_101) &&\n> @@ -159,8 +163,8 @@ test_expect_success \\\n>       chmod +w \".git/objects/pack/pack-${pack1}.pack\" &&\n>       dd of=\".git/objects/pack/pack-${pack1}.pack\" seek=$(($offs_101 + 1)) \\\n>          if=\".git/objects/pack/pack-${pack1}.idx\" \\\n> -        skip=$((4 + 256 * 4 + $nr_099 * 24)) \\\n> -        bs=1 count=20 conv=notrunc &&\n> +        skip=$((4 + 256 * 4 + $nr_099 * offset)) \\\n> +        bs=1 count=$rawsz conv=notrunc &&\n\nSimilarly, the `offset` variable is only used here, so I would assign it\njust before the `dd` call. The name `offset` might be a bit to generic not\nto be reused, either, maybe `recordsz` or `index_entry_size` or `entrysz`?\n\nApart from that, the patch looks obviously good to me.\n\nCiao,\nDscho\n\nP.S.: I'll stop reviewing here for now (It is not that I am tired of\nlooking at your patches, it is that I am just tired).\n\n>       git cat-file blob $sha1_101 > file_101_foo1'\n>\n>  test_expect_success \\\n> @@ -200,8 +204,8 @@ test_expect_success \\\n>       chmod +w \".git/objects/pack/pack-${pack1}.pack\" &&\n>       dd of=\".git/objects/pack/pack-${pack1}.pack\" seek=$(($offs_101 + 1)) \\\n>          if=\".git/objects/pack/pack-${pack1}.idx\" \\\n> -        skip=$((8 + 256 * 4 + $nr_099 * 20)) \\\n> -        bs=1 count=20 conv=notrunc &&\n> +        skip=$((8 + 256 * 4 + $nr_099 * rawsz)) \\\n> +        bs=1 count=$rawsz conv=notrunc &&\n>       git cat-file blob $sha1_101 > file_101_foo2'\n>\n>  test_expect_success \\\n> @@ -226,7 +230,7 @@ test_expect_success \\\n>       nr=$(index_obj_nr \".git/objects/pack/pack-${pack1}.idx\" $obj) &&\n>       chmod +w \".git/objects/pack/pack-${pack1}.idx\" &&\n>       printf xxxx | dd of=\".git/objects/pack/pack-${pack1}.idx\" conv=notrunc \\\n> -        bs=1 count=4 seek=$((8 + 256 * 4 + $(wc -l <obj-list) * 20 + $nr * 4)) &&\n> +        bs=1 count=4 seek=$((8 + 256 * 4 + $(wc -l <obj-list) * rawsz + $nr * 4)) &&\n>       ( while read obj\n>         do git cat-file -p $obj >/dev/null || exit 1\n>         done <obj-list ) &&\n>\n"},{"id":"390526","messageId":"20200126222658.GG4113372@camp.crustytoothpaste.net","threadId":"52696","inReplyTo":"nycvar.QRO.7.76.6.2001262303530.46@tvgsbejvaqbjf.bet","subject":"Re: [PATCH v2 08/22] t4013: make test hash independent","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-26T22:26:58Z","receivedAt":"2020-01-26T22:27:05Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"On 2020-01-26 at 22:08:18, Johannes Schindelin wrote:\n> > diff --git a/t/t4013-diff-various.sh b/t/t4013-diff-various.sh\n> > index 5ac94b390d..6f5f05c3a8 100755\n> > --- a/t/t4013-diff-various.sh\n> > +++ b/t/t4013-diff-various.sh\n> > @@ -120,6 +120,30 @@ test_expect_success setup '\n> >  +*++ [initial] Initial\n> >  EOF\n> >\n> > +process_diffs () {\n> > +\tx04=\"[0-9a-f][0-9a-f][0-9a-f][0-9a-f]\" &&\n> > +\tx07=\"$_x05[0-9a-f][0-9a-f]\" &&\n> \n> Any reason not to stay with the convention, i.e. using `_x04` and `_x07`\n> here (with leading underscores)?\n\nNone in particular.  I have a slight bias against initial underscores\nfrom C, where that has a specific meaning, but I agree consistency is\ngood, so I'll make that change.\n\n> > +\tsed -e \"s/$OID_REGEX/$ZERO_OID/g\" \\\n> > +\t    -e \"s/From $_x40 /From $ZERO_OID /\" \\\n> > +\t    -e \"s/from $_x40)/from $ZERO_OID)/\" \\\n> > +\t    -e \"s/commit $_x40\\$/commit $ZERO_OID/\" \\\n> > +\t    -e \"s/commit $_x40 (/commit $ZERO_OID (/\" \\\n> > +\t    -e \"s/$_x40 $_x40 $_x40/$ZERO_OID $ZERO_OID $ZERO_OID/\" \\\n> > +\t    -e \"s/$_x40 $_x40 /$ZERO_OID $ZERO_OID /\" \\\n> > +\t    -e \"s/^$_x40 $_x40$/$ZERO_OID $ZERO_OID/\" \\\n> > +\t    -e \"s/^$_x40 /$ZERO_OID /\" \\\n> > +\t    -e \"s/^$_x40$/$ZERO_OID/\" \\\n> > +\t    -e \"s/$x07\\.\\.$x07/fffffff..fffffff/g\" \\\n> > +\t    -e \"s/$x07,$x07\\.\\.$x07/fffffff,fffffff..fffffff/g\" \\\n> > +\t    -e \"s/$x07 $x07 $x07/fffffff fffffff fffffff/g\" \\\n> > +\t    -e \"s/$x07 $x07 /fffffff fffffff /g\" \\\n> > +\t    -e \"s/Merge: $x07 $x07/Merge: fffffff fffffff/g\" \\\n> > +\t    -e \"s/$x07\\.\\.\\./fffffff.../g\" \\\n> > +\t    -e \"s/ $x04\\.\\.\\./ ffff.../g\" \\\n> > +\t    -e \"s/ $x04/ ffff/g\" \\\n> > +\t    \"$1\"\n> > +}\n> > +\n> >  V=$(git version | sed -e 's/^git version //' -e 's/\\./\\\\./g')\n> >  while read magic cmd\n> >  do\n> > @@ -158,13 +182,15 @@ do\n> >  \t\t} >\"$actual\" &&\n> >  \t\tif test -f \"$expect\"\n> >  \t\tthen\n> > +\t\t\tprocess_diffs \"$actual\" >actual &&\n> > +\t\t\tprocess_diffs \"$expect\" >expect &&\n> >  \t\t\tcase $cmd in\n> >  \t\t\t*format-patch* | *-stat*)\n> > -\t\t\t\ttest_i18ncmp \"$expect\" \"$actual\";;\n> > +\t\t\t\ttest_i18ncmp expect actual;;\n> >  \t\t\t*)\n> > -\t\t\t\ttest_cmp \"$expect\" \"$actual\";;\n> > +\t\t\t\ttest_cmp expect actual;;\n> >  \t\t\tesac &&\n> > -\t\t\trm -f \"$actual\"\n> > +\t\t\trm -f \"$actual\" actual expect\n> >  \t\telse\n> >  \t\t\t# this is to help developing new tests.\n> >  \t\t\tcp \"$actual\" \"$expect\"\n> > @@ -383,16 +409,22 @@ test_expect_success 'log -S requires an argument' '\n> >  test_expect_success 'diff --cached on unborn branch' '\n> >  \techo ref: refs/heads/unborn >.git/HEAD &&\n> >  \tgit diff --cached >result &&\n> > -\ttest_cmp \"$TEST_DIRECTORY/t4013/diff.diff_--cached\" result\n> > +\tprocess_diffs result >actual &&\n> > +\tprocess_diffs \"$TEST_DIRECTORY/t4013/diff.diff_--cached\" >expected &&\n> \n> I was about to suggest letting `process_diffs` work in-place, but this\n> line makes that idea moot.\n\nIf I could have done that, I would.\n\n> Another idea I had was to implement a `test_cmp_diff` that processes the\n> diffs and then compares them, but I guess that would be _less_ concise\n> than this patch.\n\nYeah, this is a tricky test to work with because it does so many\ndifferent things and trying to handle all of them in a tidy way is hard\n(as one can intuit from the giant sed statement).  As part of the patch\nyou quoted above, we sometimes use test_i18ncmp and sometimes use\ntest_cmp here, so it's not easy hard to pick something that works for\nall of these cases without some duplication.\n-- \nbrian m. carlson: Houston, Texas, US\nOpenPGP: https://keybase.io/bk2204\n"},{"id":"390527","messageId":"20200126223344.GH4113372@camp.crustytoothpaste.net","threadId":"52696","inReplyTo":"nycvar.QRO.7.76.6.2001262315150.46@tvgsbejvaqbjf.bet","subject":"Re: [PATCH v2 11/22] t5302: make hash size independent","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-26T22:33:44Z","receivedAt":"2020-01-26T22:33:50Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"On 2020-01-26 at 22:23:32, Johannes Schindelin wrote:\n> On Sat, 25 Jan 2020, brian m. carlson wrote:\n> \n> > Compute the length of object IDs and pack offsets instead of hard-coding\n> > constants.\n> >\n> > Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n> > ---\n> >  t/t5302-pack-index.sh | 18 +++++++++++-------\n> >  1 file changed, 11 insertions(+), 7 deletions(-)\n> >\n> > diff --git a/t/t5302-pack-index.sh b/t/t5302-pack-index.sh\n> > index 91d51b35f9..93ac003639 100755\n> > --- a/t/t5302-pack-index.sh\n> > +++ b/t/t5302-pack-index.sh\n> > @@ -8,7 +8,8 @@ test_description='pack index with 64-bit offsets and object CRC'\n> >\n> >  test_expect_success \\\n> >      'setup' \\\n> > -    'rm -rf .git &&\n> > +    'test_oid_init &&\n> > +     rm -rf .git &&\n> \n> Why not consolidate the `test_expect_success` line into the current\n> convention at the same time (\"while at it\")? I.e.\n> \n> \ttest_expect_success 'setup' '\n\nSounds good.\n\n> >       git init &&\n> >       git config pack.threads 1 &&\n> >       i=1 &&\n> > @@ -32,7 +33,9 @@ test_expect_success \\\n> >  \t echo $tree &&\n> >  \t git ls-tree $tree | sed -e \"s/.* \\\\([0-9a-f]*\\\\)\t.*/\\\\1/\"\n> >       } >obj-list &&\n> > -     git update-ref HEAD $commit'\n> > +     git update-ref HEAD $commit &&\n> > +     rawsz=$(test_oid rawsz)\n> \n> Since the `rawsz` assignment has a lot to do with `test_oid_init`, I would\n> coddle this added line with the `test_oid_init` line above instead of\n> adding it here.\n\nSure, that seems like a good idea.\n\n> > +'\n> >\n> >  test_expect_success \\\n> >      'pack-objects with index version 1' \\\n> > @@ -152,6 +155,7 @@ test_expect_success \\\n> >      '[index v1] 2) create a stealth corruption in a delta base reference' \\\n> >      '# This test assumes file_101 is a delta smaller than 16 bytes.\n> >       # It should be against file_100 but we substitute its base for file_099\n> > +     offset=$((rawsz + 4)) &&\n> >       sha1_101=$(git hash-object file_101) &&\n> >       sha1_099=$(git hash-object file_099) &&\n> >       offs_101=$(index_obj_offset 1.idx $sha1_101) &&\n> > @@ -159,8 +163,8 @@ test_expect_success \\\n> >       chmod +w \".git/objects/pack/pack-${pack1}.pack\" &&\n> >       dd of=\".git/objects/pack/pack-${pack1}.pack\" seek=$(($offs_101 + 1)) \\\n> >          if=\".git/objects/pack/pack-${pack1}.idx\" \\\n> > -        skip=$((4 + 256 * 4 + $nr_099 * 24)) \\\n> > -        bs=1 count=20 conv=notrunc &&\n> > +        skip=$((4 + 256 * 4 + $nr_099 * offset)) \\\n> > +        bs=1 count=$rawsz conv=notrunc &&\n> \n> Similarly, the `offset` variable is only used here, so I would assign it\n> just before the `dd` call. The name `offset` might be a bit to generic not\n> to be reused, either, maybe `recordsz` or `index_entry_size` or `entrysz`?\n\nYeah, those would be better names.  As I will freely admit, I'm bad at\nnaming things.\n\n> P.S.: I'll stop reviewing here for now (It is not that I am tired of\n> looking at your patches, it is that I am just tired).\n\nSure.  It's late where you are.  I appreciate your review.\n-- \nbrian m. carlson: Houston, Texas, US\nOpenPGP: https://keybase.io/bk2204\n"},{"id":"390528","messageId":"CALKQrgc9EwjJL=u8eWbSbXOL9Hu8G0LD6cxTfaa50Nfx2iYDrg@mail.gmail.com","threadId":"52696","inReplyTo":"nycvar.QRO.7.76.6.2001261957060.46@tvgsbejvaqbjf.bet","subject":"Re: [PATCH v2 03/22] t3305: annotate with SHA1 prerequisite","fromName":"Johan Herland","fromEmail":"johan@herland.net","sentAt":"2020-01-26T23:57:18Z","receivedAt":"2020-01-26T23:57:40Z","isPatch":true,"sender":{"key":"johan@herland.net","avatar":"https://avatars.githubusercontent.com/u/547031?v=4"},"body":"Hi Johannes,\n\nOn Sun, Jan 26, 2020 at 10:29 PM Johannes Schindelin\n<Johannes.Schindelin@gmx.de> wrote:\n> On Sun, 26 Jan 2020, Johan Herland wrote:\n> > On Sun, Jan 26, 2020 at 12:16 PM Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:\n> > > On Sat, 25 Jan 2020, brian m. carlson wrote:\n> > > > This test relies on a roughly equal distribution of hashes for notes in\n> > > > order to ensure that fanouts are compressed.  If there are subtrees with\n> > > > only one item left after removing notes, they'll end up still with one\n> > > > level of fanout, causing the test to fail.\n> > >\n> > > That is _almost_ correct: The heuristic wants to see one bucket that has\n> > > a note in it. Or something like that.\n> > >\n> > > See 73f77b909f8 (Notes API: for_each_note(): Traverse the entire notes\n> > > tree with a callback, 2010-02-13) for details. (Cc:ing Johan.)\n> >\n> > Something like that, yeah... Re-reading this code, I believe we stop\n> > the fanout at the current level when we can find one or more notes\n> > that do not share the high-nibble of their path with another note.\n> >\n> > Here we're at the top level, so this corresponds to looking at the\n> > very first hex character (0-9a-f) of the path (oid of annotated\n> > object), and if there are at least two such objects for each hex\n> > character, we will use a fanout of 1, otherwise, we collapse the\n> > fanout to 0.\n>\n> That makes sense, but when I looked at the failed test, there seems\n> something else at play, at least in addition to what you said: for\n> _adding_ notes, your description is 100% accurate, but when deleting\n> notes, we are apparently not collapsing `PTR_TYPE_SUBTREE` nodes \"quickly\"\n> enough. Let me show you the part of `git ls-tree -r refs/notes/commits`\n> that starts with the hex digits 7, 8 and 9:\n>\n> -- snip --\n> 100644 blob 22939636f79a53181ea58f04f2136bd745976edd0018465e60a8df89816a9c2b 72/67b1c94ab5ddf005fd4b0e50b6a7816a62e7ed0459cec6aa1a00577b2111ba\n> 100644 blob 2e3f3dad7043b2d02d09ca12b299acbe05d781357d3a56a2d012fdf787409459 76/62d4b264094ca479be86ef7aa66daae63e45afa633a3892dc787b13ecff495\n> 100644 blob 22e7f0c5af7315d692f8a107a43ba0784e1ab00a20ea803fab1acad1319e5f79 7b/8c0a9c86815a94da7ef90b356b1f98d6a4099af3fdc3d8625a8fa793b63821\n> 100644 blob b3ce67c9d5507dc00d95d8fb2000c1d5b70908ad1d2c034e5833f57b7bb85511 7f/0af9cf9259cd6e67c0af3324ca443dd3d56694fbdc94d28e300a768d3d0e6e\n> 100644 blob fafb40e32e87a2c481df6ceb37804d80c995faec3d7772c071b129fd47c2ba8a 8a/f1ad99a5e559f5835007f2bcb1b07de0e8c7434e7fbaa676a2edbd796a7f60\n> 100644 blob b811e8da7c7acc83ef025753504ff6ed2d1eb8d2bb832d6b7487a7786d67aa53 93/f364fafaee6a178d8e8939f15d5b260f71940f663c3731396ee43082fd6551\n> 100644 blob 0b1915ccb6f64cac64f2297893bce1ba7408660f79182302faaada71ee8c3c1c 96/b562b168f94e5c6e6a1e40ec4b817aa168c99769b1d9a46f7e048e93897fb4\n> -- snap --\n>\n> This command was run in the worktree after running an unmodified t3305\n> with `GIT_TEST_DEFAULT_HASH=sha256` in brian's `transition-stage-4` branch\n> (well, I removed the `SHA1` prereq again, that's the modification I made).\n>\n> As you can see, there _is_ a fanout of 1, but there is only a single note\n> for a commit whose ID starts with `8`.\n\nAh, yes, I glossed over the subtrees in my analysis, blindly assuming\nthat they would collapse more \"quickly\" than they do...\n\nIt seems the code values not unpacking subtrees \"unnecessarily\", and\nthis causes them to remain for longer than perhaps ideal.\n\n> Debugging a little, it seems that the `PTR_TYPE_SUBTREE` node for `8` was\n> not collapsed, even if there was only one item left.\n>\n> So I formed a hypothesis that the subtrees are only removed when the\n> _last_ item is removed for any given leading nybble, but that turned out\n> to also be incorrect. It is a bit more tricky than that. This is the\n> smallest set to which I was able to reduce the notes without reducing the\n> fanout to 0:\n>\n> -- snip --\n> 100644 blob cc2ee5e00d8bc3805d704b67439dc8175bcf9497603288e6de2d4d8b3fc7be9f    05/b6e3d1394d020129f71fd8e41cf7ea8cbc58ae0f1332abd5da0c74ea194b71\n> 100644 blob 1c6afe76a1bcd0103c36ab9707a2ca9e68974b6a6bbaae564c0509c43b4392bd    1e/311d64dc3ad5491964bcded60fee15b19d5b9c916a7e62a4f0746fa4e81fa6\n> 100644 blob cf97d105e3970ef1cf9b12ac092be80abcd496c593bc8ca5550d059c3967630a    28/79e092d524b7ae9a42026ab2886094cce8ffc63175f8b3fd5de84faef10df3\n> 100644 blob 78ef788b804dd0e5415c386b4a29668f61033483c35438f0471dfd7c4bfa093b    36/fe8fe67a2e9d0203c665d6e08ca454833ec32a97369769a7138d3938c0000b\n> 100644 blob f46845c2d7e3272319aa5c18e359fdbc37731c88a945bb9632b8c4321983c75a    4a/a271a09d848f99d3fb978e5c156baa812a0fa1c30a88c885831641630be01a\n> 100644 blob ecf5a4a178ca4b51cea457abe7c935761ca15a1d817f83c2da6816ede84db779    51/eaee3ca1a8698cb0aaa4de2d3f339985570da68b28e84af752e1cfd25f5197\n> 100644 blob 2f4e9d6a4a1d050f8cb932ba545e53b48d9b669f6e00dc4a962d88ee9d92482b    62/dd63d43070c3ca7e3a6cdfa4ed970256a00a06e88d10fcb0532acd51419e0f\n> 100644 blob 22939636f79a53181ea58f04f2136bd745976edd0018465e60a8df89816a9c2b    72/67b1c94ab5ddf005fd4b0e50b6a7816a62e7ed0459cec6aa1a00577b2111ba\n> 100644 blob fafb40e32e87a2c481df6ceb37804d80c995faec3d7772c071b129fd47c2ba8a    8a/f1ad99a5e559f5835007f2bcb1b07de0e8c7434e7fbaa676a2edbd796a7f60\n> 100644 blob b811e8da7c7acc83ef025753504ff6ed2d1eb8d2bb832d6b7487a7786d67aa53    93/f364fafaee6a178d8e8939f15d5b260f71940f663c3731396ee43082fd6551\n> 100644 blob 589656c26944c471b5ac65739f8c7b96663a9f827a3d27beb49e39e3707b7294    a2/0e8f30856061125d479779755ef3238a7b561f9336e0143c437daac7d93f4c\n> 100644 blob 7eaa9350d5c6bd6fd0fc4071c5d6a266949046c67987a9e1f665ba34d95f419d    a2/80d13a05aa68cc5ef948a8b69067807457fd37c00ce4a234fa4a0c0753ef4e\n> 100644 blob 7a8378dd60d6024db645757eac7271a80b101a2df230ebd1a57ff52ff2d32e36    b9/2a3a7dc6db290d93f79150bfb31447f3e550cfe4a63c5ddbeac18fec755e86\n> 100644 blob 86fff6007d9911249bee803a6630e182677355a5574e637d1a8301e219c5da86    c1/52ffd73d1c5e7c121c7c247682f1ee971f6f09101c96a84486d18be41d0dd0\n> 100644 blob cd887698e1da81a76ae1caf0eaec19d60830a13ead152ec4700be511ceb8ee33    d0/3f742b8b95f68478946d7fe7495da9462801fadeaaa06c11bf54dbc46610f5\n> 100644 blob 19f7bdfee9687311dbe1195e0a64954b677ae68e6d734fd5fb76ea4ad4f93782    ea/356ae2d38123b46639db98df14953f4c7cdd91738779174ec67876ce9487e3\n> 100644 blob 948c0cba23ec0405c622c9dea8ed8dd7b3fa043c86b5e5a8b4de0d1c6a0e67b9    f7/802d4c716fed3c76fe58c86ac7c3ae3e19b8c0d3ea97c9f90f5939fe5a78d8\n> 100644 blob 28690ad489e29e3607c82e1f626ec24d7f831555c802108bfe9b993fbd794a7e    f7/da03e811b7d9071ee19dabdc721e0f863e28c92dfa3257474282396a73bb44\n> -- snap --\n>\n> You will note that there are two entries that start with `a2`, and two\n> entries that start with `f7`. If I remove any of those, the corresponding\n> subtree will be collapsed, and the fanout will be reduced to 0.\n\nI'm looking at note_tree_remove() and note_tree_consolidate() to\nexplain this behavior. AFAICS, at the point where you remove, say, the\na20e8f entry, the note tree structure should consist of a single\nint_node containing 16 subtree entries. note_tree_remove() will search\nfor the a20e8f entry which will cause the a2 subtree to be unpacked\nand replaced with an int_node (representing 'a') referencing another\nint_node (representing '2') containing two leaf_nodes. One of the leaf\nnodes will be removed, and note_tree_consolidate() will then replace\nthe 2 int_nodes with the last remaining leaf_node. At this point the\nroot int_node should now contain 15 subtrees (not yet unpacked) and 1\n\"regular\" leaf_node.\n\nWe then move on to write_notes_tree() to write out the resulting tree.\nThis ends up calling determine_fanout() (via for_each_note_helper()),\nwhich will look at the root int_node, find the one \"regular\" leaf_node\nthere, and use that to return fanout = 0. (At which point the other\nsubtrees will be unpacked and the entire tree is \"flattened\".)\n\nI now wonder why this did not happen before we got down to 17 notes.\nLet's assume (as is most probable) that the previous notes removed\nonly shared _one_ leading nibble (not two). The root int_node would\nhave an int_node for the first-nibble which would contain two\nsubtrees, one for each second-nibble. One of these would be unpacked\nand promptly removed, and then note_tree_consolidate() would be left\nwith the int_node for the first-nibble containing a single subtree\nentry. AFAICS note_tree_consolidate() does _not_ collapse this\nint_node (and move the subtree into the root node), although I can't\nimmediately see why it could/should not do this. Even if it did,\nthough, that would not be enough to trigger a lower fanout, as\ndetermine_fanout() does not distinguish between int_nodes and subtree\nnodes.\n\nHowever, I suspect there may be room for further improvement here: If\nwe find ourselves consolidating an int_node whose _only_ non-NULL\nentry is a subtree, it is a fairly safe assumption that the subtree\nitself is probably close to empty as well, and we can probably bear\nthe cost of more eagerly unpacking it, as we are then more likely to\ntrigger a lower fanout when writing out the notes tree. At that point\ngoing from fanout 1 to fanout 0 should certainly happen at a less\nridiculous total note count than 17...\n\n> But it is only happenstance with SHA-256 that there are these entries that\n> agree not only in the first, but also in the second leading nybble.\n\nTrue.\n\n> Therefore...\n>\n> > Hence we need an absolute minimum of 32 notes (and some rotten luck)\n> > to get a fanout of 1. As the number of notes increase, the probably of\n> > fanning out increases, passing 50% at ~79 notes, and reaching ~100%\n> > somewhere north of 150 notes.\n>\n> ... I would register that we need an absolute minimum of 16 notes (and\n> some rather crafty craft) to get a fanout of 1.\n>\n> In that light, I think that I would prefer to retract my patch that\n> \"only\" reduces the remaining number of notes to 20: it should reduce them\n> to 15 or less. So why not reduce it to 10 (because it is only one changed\n> digit).\n\nAgreed. The thing we're looking for in the test (and what is certainly\nmore important) is that we _do_ consolidate the fanout when the note\ncount decreases. The details around exactly when that happens is more\nof a performance tuning issue, and not something that should break the\ntest.\n\n> > > > The test happens to pass with SHA-1, but doesn't necessarily with other\n> > > > hash algorithms, so annotate it with the SHA1 prerequisite.\n> > >\n> > > I would rather see this tested, still, and reducing the number of notes\n> > > that are retained from 50 to 20 before testing that the fanout has been\n> > > reduced to 0 seems to do the trick. Therefore, I would love to submit this\n> > > for squashing:\n> >\n> > Yes, it seems that for SHA1 and the (deterministic) objects used in\n> > the test, we got away with 50 notes, but that is not the case for\n> > other hash algorithms. Lowering the number to 20 definitely results a\n> > fanout of 0, as should any other number below 32.\n> >\n> > +1 to Dscho's squash.\n> >\n> > ...Johan\n>\n> Thank you so much for the analysis. To be honest, I did not quite\n> understand all the details of the comment added in 73f77b989f8 when I\n> wrote the patch I suggested, so I basically just picked that number \"20\"\n> out of thin air.\n>\n> Together with your insights, I would like to propose this commit message\n> for the squashed commits (I left in the hunk that removes the `SHA1`\n> prerequisite, but of course that won't be part of the final commit):\n>\n> -- snip --\n> t3305: make fanout test more robust (needed for SHA-256)\n>\n> To make things more performant, notes are stored in a \"fanout\": when\n> there are enough commit notes, they are no longer stored as verbatim\n> commit IDs at the top-level tree of the notes ref, but instead the tree\n> is deepened much like the loose object cache: subtrees are introduced\n> whose names are the two hex digits they \"chomp off\" the commit IDs.\n>\n> The test case 'deleting most notes triggers fanout consolidation' wants\n> to verify that the fanout level is reduced automatically when enough\n> notes have been deleted.\n>\n> However, that test case expected that reduction to level 0 (i.e. _no_\n> fanout subtrees) to happen after reducing the originally-added 300 notes\n> to 50, which _happened_ to work with SHA-1-based commit IDs, but it is\n> no longer works with SHA-256-based ones.\n>\n> The reason: The heuristic for the fanout looks at the number of entries\n> for leading nybbles (read: hex digits) of the commit IDs. If there are\n> more than a single annotated commit for all of the 16 hex digits, the\n> fanout is incremented. It is a bit more tricky when reducing the number\n> of notes: the fanout is reduced reliably only if there are less notes\n> than hex digits (i.e. less than 15 notes) for a given prefix.\n>\n> For good measure, let's reduce the number of notes to 10 in the test\n> case 'deleting most notes with git-notes' so that the test case\n> 'deleting most notes triggers fanout consolidation' is guaranteed to\n> succeed with _any_ hash algorithm.\n\nGreat commit message.\n\n> Original-patch-by: brian m. carlson <sandals@crustytoothpaste.net>\n> Helped-by: Johan Herland <johan@herland.net>\n> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>\n\nSigned-off-by: Johan Herland <johan@herland.net>\n\n\nHave fun!\n...Johan\n\n-- \nJohan Herland, <johan@herland.net>\nwww.herland.net\n"},{"id":"390554","messageId":"nycvar.QRO.7.76.6.2001271321290.46@tvgsbejvaqbjf.bet","threadId":"52696","inReplyTo":"CALKQrgc9EwjJL=u8eWbSbXOL9Hu8G0LD6cxTfaa50Nfx2iYDrg@mail.gmail.com","subject":"Re: [PATCH v2 03/22] t3305: annotate with SHA1 prerequisite","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2020-01-27T12:22:10Z","receivedAt":"2020-01-27T12:22:29Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi Johan,\n\nOn Mon, 27 Jan 2020, Johan Herland wrote:\n\n> On Sun, Jan 26, 2020 at 10:29 PM Johannes Schindelin\n> <Johannes.Schindelin@gmx.de> wrote:\n> > On Sun, 26 Jan 2020, Johan Herland wrote:\n> > > On Sun, Jan 26, 2020 at 12:16 PM Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:\n> > > > On Sat, 25 Jan 2020, brian m. carlson wrote:\n> > > > > This test relies on a roughly equal distribution of hashes for notes in\n> > > > > order to ensure that fanouts are compressed.  If there are subtrees with\n> > > > > only one item left after removing notes, they'll end up still with one\n> > > > > level of fanout, causing the test to fail.\n> > > >\n> > > > That is _almost_ correct: The heuristic wants to see one bucket that has\n> > > > a note in it. Or something like that.\n> > > >\n> > > > See 73f77b909f8 (Notes API: for_each_note(): Traverse the entire notes\n> > > > tree with a callback, 2010-02-13) for details. (Cc:ing Johan.)\n> > >\n> > > Something like that, yeah... Re-reading this code, I believe we stop\n> > > the fanout at the current level when we can find one or more notes\n> > > that do not share the high-nibble of their path with another note.\n> > >\n> > > Here we're at the top level, so this corresponds to looking at the\n> > > very first hex character (0-9a-f) of the path (oid of annotated\n> > > object), and if there are at least two such objects for each hex\n> > > character, we will use a fanout of 1, otherwise, we collapse the\n> > > fanout to 0.\n> >\n> > That makes sense, but when I looked at the failed test, there seems\n> > something else at play, at least in addition to what you said: for\n> > _adding_ notes, your description is 100% accurate, but when deleting\n> > notes, we are apparently not collapsing `PTR_TYPE_SUBTREE` nodes \"quickly\"\n> > enough. Let me show you the part of `git ls-tree -r refs/notes/commits`\n> > that starts with the hex digits 7, 8 and 9:\n> >\n> > -- snip --\n> > 100644 blob 22939636f79a53181ea58f04f2136bd745976edd0018465e60a8df89816a9c2b 72/67b1c94ab5ddf005fd4b0e50b6a7816a62e7ed0459cec6aa1a00577b2111ba\n> > 100644 blob 2e3f3dad7043b2d02d09ca12b299acbe05d781357d3a56a2d012fdf787409459 76/62d4b264094ca479be86ef7aa66daae63e45afa633a3892dc787b13ecff495\n> > 100644 blob 22e7f0c5af7315d692f8a107a43ba0784e1ab00a20ea803fab1acad1319e5f79 7b/8c0a9c86815a94da7ef90b356b1f98d6a4099af3fdc3d8625a8fa793b63821\n> > 100644 blob b3ce67c9d5507dc00d95d8fb2000c1d5b70908ad1d2c034e5833f57b7bb85511 7f/0af9cf9259cd6e67c0af3324ca443dd3d56694fbdc94d28e300a768d3d0e6e\n> > 100644 blob fafb40e32e87a2c481df6ceb37804d80c995faec3d7772c071b129fd47c2ba8a 8a/f1ad99a5e559f5835007f2bcb1b07de0e8c7434e7fbaa676a2edbd796a7f60\n> > 100644 blob b811e8da7c7acc83ef025753504ff6ed2d1eb8d2bb832d6b7487a7786d67aa53 93/f364fafaee6a178d8e8939f15d5b260f71940f663c3731396ee43082fd6551\n> > 100644 blob 0b1915ccb6f64cac64f2297893bce1ba7408660f79182302faaada71ee8c3c1c 96/b562b168f94e5c6e6a1e40ec4b817aa168c99769b1d9a46f7e048e93897fb4\n> > -- snap --\n> >\n> > This command was run in the worktree after running an unmodified t3305\n> > with `GIT_TEST_DEFAULT_HASH=sha256` in brian's `transition-stage-4` branch\n> > (well, I removed the `SHA1` prereq again, that's the modification I made).\n> >\n> > As you can see, there _is_ a fanout of 1, but there is only a single note\n> > for a commit whose ID starts with `8`.\n>\n> Ah, yes, I glossed over the subtrees in my analysis, blindly assuming\n> that they would collapse more \"quickly\" than they do...\n>\n> It seems the code values not unpacking subtrees \"unnecessarily\", and\n> this causes them to remain for longer than perhaps ideal.\n>\n> > Debugging a little, it seems that the `PTR_TYPE_SUBTREE` node for `8` was\n> > not collapsed, even if there was only one item left.\n> >\n> > So I formed a hypothesis that the subtrees are only removed when the\n> > _last_ item is removed for any given leading nybble, but that turned out\n> > to also be incorrect. It is a bit more tricky than that. This is the\n> > smallest set to which I was able to reduce the notes without reducing the\n> > fanout to 0:\n> >\n> > -- snip --\n> > 100644 blob cc2ee5e00d8bc3805d704b67439dc8175bcf9497603288e6de2d4d8b3fc7be9f    05/b6e3d1394d020129f71fd8e41cf7ea8cbc58ae0f1332abd5da0c74ea194b71\n> > 100644 blob 1c6afe76a1bcd0103c36ab9707a2ca9e68974b6a6bbaae564c0509c43b4392bd    1e/311d64dc3ad5491964bcded60fee15b19d5b9c916a7e62a4f0746fa4e81fa6\n> > 100644 blob cf97d105e3970ef1cf9b12ac092be80abcd496c593bc8ca5550d059c3967630a    28/79e092d524b7ae9a42026ab2886094cce8ffc63175f8b3fd5de84faef10df3\n> > 100644 blob 78ef788b804dd0e5415c386b4a29668f61033483c35438f0471dfd7c4bfa093b    36/fe8fe67a2e9d0203c665d6e08ca454833ec32a97369769a7138d3938c0000b\n> > 100644 blob f46845c2d7e3272319aa5c18e359fdbc37731c88a945bb9632b8c4321983c75a    4a/a271a09d848f99d3fb978e5c156baa812a0fa1c30a88c885831641630be01a\n> > 100644 blob ecf5a4a178ca4b51cea457abe7c935761ca15a1d817f83c2da6816ede84db779    51/eaee3ca1a8698cb0aaa4de2d3f339985570da68b28e84af752e1cfd25f5197\n> > 100644 blob 2f4e9d6a4a1d050f8cb932ba545e53b48d9b669f6e00dc4a962d88ee9d92482b    62/dd63d43070c3ca7e3a6cdfa4ed970256a00a06e88d10fcb0532acd51419e0f\n> > 100644 blob 22939636f79a53181ea58f04f2136bd745976edd0018465e60a8df89816a9c2b    72/67b1c94ab5ddf005fd4b0e50b6a7816a62e7ed0459cec6aa1a00577b2111ba\n> > 100644 blob fafb40e32e87a2c481df6ceb37804d80c995faec3d7772c071b129fd47c2ba8a    8a/f1ad99a5e559f5835007f2bcb1b07de0e8c7434e7fbaa676a2edbd796a7f60\n> > 100644 blob b811e8da7c7acc83ef025753504ff6ed2d1eb8d2bb832d6b7487a7786d67aa53    93/f364fafaee6a178d8e8939f15d5b260f71940f663c3731396ee43082fd6551\n> > 100644 blob 589656c26944c471b5ac65739f8c7b96663a9f827a3d27beb49e39e3707b7294    a2/0e8f30856061125d479779755ef3238a7b561f9336e0143c437daac7d93f4c\n> > 100644 blob 7eaa9350d5c6bd6fd0fc4071c5d6a266949046c67987a9e1f665ba34d95f419d    a2/80d13a05aa68cc5ef948a8b69067807457fd37c00ce4a234fa4a0c0753ef4e\n> > 100644 blob 7a8378dd60d6024db645757eac7271a80b101a2df230ebd1a57ff52ff2d32e36    b9/2a3a7dc6db290d93f79150bfb31447f3e550cfe4a63c5ddbeac18fec755e86\n> > 100644 blob 86fff6007d9911249bee803a6630e182677355a5574e637d1a8301e219c5da86    c1/52ffd73d1c5e7c121c7c247682f1ee971f6f09101c96a84486d18be41d0dd0\n> > 100644 blob cd887698e1da81a76ae1caf0eaec19d60830a13ead152ec4700be511ceb8ee33    d0/3f742b8b95f68478946d7fe7495da9462801fadeaaa06c11bf54dbc46610f5\n> > 100644 blob 19f7bdfee9687311dbe1195e0a64954b677ae68e6d734fd5fb76ea4ad4f93782    ea/356ae2d38123b46639db98df14953f4c7cdd91738779174ec67876ce9487e3\n> > 100644 blob 948c0cba23ec0405c622c9dea8ed8dd7b3fa043c86b5e5a8b4de0d1c6a0e67b9    f7/802d4c716fed3c76fe58c86ac7c3ae3e19b8c0d3ea97c9f90f5939fe5a78d8\n> > 100644 blob 28690ad489e29e3607c82e1f626ec24d7f831555c802108bfe9b993fbd794a7e    f7/da03e811b7d9071ee19dabdc721e0f863e28c92dfa3257474282396a73bb44\n> > -- snap --\n> >\n> > You will note that there are two entries that start with `a2`, and two\n> > entries that start with `f7`. If I remove any of those, the corresponding\n> > subtree will be collapsed, and the fanout will be reduced to 0.\n>\n> I'm looking at note_tree_remove() and note_tree_consolidate() to\n> explain this behavior. AFAICS, at the point where you remove, say, the\n> a20e8f entry, the note tree structure should consist of a single\n> int_node containing 16 subtree entries. note_tree_remove() will search\n> for the a20e8f entry which will cause the a2 subtree to be unpacked\n> and replaced with an int_node (representing 'a') referencing another\n> int_node (representing '2') containing two leaf_nodes. One of the leaf\n> nodes will be removed, and note_tree_consolidate() will then replace\n> the 2 int_nodes with the last remaining leaf_node. At this point the\n> root int_node should now contain 15 subtrees (not yet unpacked) and 1\n> \"regular\" leaf_node.\n>\n> We then move on to write_notes_tree() to write out the resulting tree.\n> This ends up calling determine_fanout() (via for_each_note_helper()),\n> which will look at the root int_node, find the one \"regular\" leaf_node\n> there, and use that to return fanout = 0. (At which point the other\n> subtrees will be unpacked and the entire tree is \"flattened\".)\n>\n> I now wonder why this did not happen before we got down to 17 notes.\n> Let's assume (as is most probable) that the previous notes removed\n> only shared _one_ leading nibble (not two). The root int_node would\n> have an int_node for the first-nibble which would contain two\n> subtrees, one for each second-nibble. One of these would be unpacked\n> and promptly removed, and then note_tree_consolidate() would be left\n> with the int_node for the first-nibble containing a single subtree\n> entry. AFAICS note_tree_consolidate() does _not_ collapse this\n> int_node (and move the subtree into the root node), although I can't\n> immediately see why it could/should not do this. Even if it did,\n> though, that would not be enough to trigger a lower fanout, as\n> determine_fanout() does not distinguish between int_nodes and subtree\n> nodes.\n>\n> However, I suspect there may be room for further improvement here: If\n> we find ourselves consolidating an int_node whose _only_ non-NULL\n> entry is a subtree, it is a fairly safe assumption that the subtree\n> itself is probably close to empty as well, and we can probably bear\n> the cost of more eagerly unpacking it, as we are then more likely to\n> trigger a lower fanout when writing out the notes tree. At that point\n> going from fanout 1 to fanout 0 should certainly happen at a less\n> ridiculous total note count than 17...\n\nThank you for digging in even further!\n\n> > But it is only happenstance with SHA-256 that there are these entries that\n> > agree not only in the first, but also in the second leading nybble.\n>\n> True.\n>\n> > Therefore...\n> >\n> > > Hence we need an absolute minimum of 32 notes (and some rotten luck)\n> > > to get a fanout of 1. As the number of notes increase, the probably of\n> > > fanning out increases, passing 50% at ~79 notes, and reaching ~100%\n> > > somewhere north of 150 notes.\n> >\n> > ... I would register that we need an absolute minimum of 16 notes (and\n> > some rather crafty craft) to get a fanout of 1.\n> >\n> > In that light, I think that I would prefer to retract my patch that\n> > \"only\" reduces the remaining number of notes to 20: it should reduce them\n> > to 15 or less. So why not reduce it to 10 (because it is only one changed\n> > digit).\n>\n> Agreed. The thing we're looking for in the test (and what is certainly\n> more important) is that we _do_ consolidate the fanout when the note\n> count decreases. The details around exactly when that happens is more\n> of a performance tuning issue, and not something that should break the\n> test.\n>\n> > > > > The test happens to pass with SHA-1, but doesn't necessarily with other\n> > > > > hash algorithms, so annotate it with the SHA1 prerequisite.\n> > > >\n> > > > I would rather see this tested, still, and reducing the number of notes\n> > > > that are retained from 50 to 20 before testing that the fanout has been\n> > > > reduced to 0 seems to do the trick. Therefore, I would love to submit this\n> > > > for squashing:\n> > >\n> > > Yes, it seems that for SHA1 and the (deterministic) objects used in\n> > > the test, we got away with 50 notes, but that is not the case for\n> > > other hash algorithms. Lowering the number to 20 definitely results a\n> > > fanout of 0, as should any other number below 32.\n> > >\n> > > +1 to Dscho's squash.\n> > >\n> > > ...Johan\n> >\n> > Thank you so much for the analysis. To be honest, I did not quite\n> > understand all the details of the comment added in 73f77b989f8 when I\n> > wrote the patch I suggested, so I basically just picked that number \"20\"\n> > out of thin air.\n> >\n> > Together with your insights, I would like to propose this commit message\n> > for the squashed commits (I left in the hunk that removes the `SHA1`\n> > prerequisite, but of course that won't be part of the final commit):\n> >\n> > -- snip --\n> > t3305: make fanout test more robust (needed for SHA-256)\n> >\n> > To make things more performant, notes are stored in a \"fanout\": when\n> > there are enough commit notes, they are no longer stored as verbatim\n> > commit IDs at the top-level tree of the notes ref, but instead the tree\n> > is deepened much like the loose object cache: subtrees are introduced\n> > whose names are the two hex digits they \"chomp off\" the commit IDs.\n> >\n> > The test case 'deleting most notes triggers fanout consolidation' wants\n> > to verify that the fanout level is reduced automatically when enough\n> > notes have been deleted.\n> >\n> > However, that test case expected that reduction to level 0 (i.e. _no_\n> > fanout subtrees) to happen after reducing the originally-added 300 notes\n> > to 50, which _happened_ to work with SHA-1-based commit IDs, but it is\n> > no longer works with SHA-256-based ones.\n> >\n> > The reason: The heuristic for the fanout looks at the number of entries\n> > for leading nybbles (read: hex digits) of the commit IDs. If there are\n> > more than a single annotated commit for all of the 16 hex digits, the\n> > fanout is incremented. It is a bit more tricky when reducing the number\n> > of notes: the fanout is reduced reliably only if there are less notes\n> > than hex digits (i.e. less than 15 notes) for a given prefix.\n> >\n> > For good measure, let's reduce the number of notes to 10 in the test\n> > case 'deleting most notes with git-notes' so that the test case\n> > 'deleting most notes triggers fanout consolidation' is guaranteed to\n> > succeed with _any_ hash algorithm.\n>\n> Great commit message.\n>\n> > Original-patch-by: brian m. carlson <sandals@crustytoothpaste.net>\n> > Helped-by: Johan Herland <johan@herland.net>\n> > Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>\n>\n> Signed-off-by: Johan Herland <johan@herland.net>\n\nExcellent!\n\n> Have fun!\n> ...Johan\n\nYou, too. Thank you!\nDscho\n\n>\n> --\n> Johan Herland, <johan@herland.net>\n> www.herland.net\n>\n"},{"id":"390644","messageId":"xmqqpnf38n2s.fsf@gitster-ct.c.googlers.com","threadId":"52696","inReplyTo":"20200125230035.136348-14-sandals@crustytoothpaste.net","subject":"Re: [PATCH v2 13/22] t5313: make test hash independent","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2020-01-28T18:15:07Z","receivedAt":"2020-01-28T18:15:14Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"\"brian m. carlson\" <sandals@crustytoothpaste.net> writes:\n\n> Make this test hash independent by computing the length of the object\n> offsets and looking up values which will hash to object IDs with the\n> right properties.\n>\n> Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n> ---\n>  t/t5313-pack-bounds-checks.sh | 19 +++++++++++++++----\n>  1 file changed, 15 insertions(+), 4 deletions(-)\n>\n> diff --git a/t/t5313-pack-bounds-checks.sh b/t/t5313-pack-bounds-checks.sh\n> index f1708d415e..8d805f845a 100755\n> --- a/t/t5313-pack-bounds-checks.sh\n> +++ b/t/t5313-pack-bounds-checks.sh\n> @@ -38,16 +38,27 @@ munge () {\n>  # for the initial, and another ofs(4*nr) past that for the extended.\n>  #\n>  ofs_table () {\n> -\techo $((4 + 4 + 4*256 + 20*$1 + 4*$1))\n> +\techo $((4 + 4 + 4*256 + $(test_oid rawsz)*$1 + 4*$1))\n>  }\n>  extended_table () {\n>  \techo $(($(ofs_table \"$1\") + 4*$1))\n>  }\n>  \n> +test_expect_success 'setup' '\n> +\ttest_oid_init &&\n> +\ttest_oid_cache <<-EOF\n> +\toid000 sha1:1485\n> +\toid000 sha256:4222\n> +\n> +\toidfff sha1:74\n> +\toidfff sha256:1350\n> +\tEOF\n> +'\n> +\n>  test_expect_success 'set up base packfile and variables' '\n>  \t# the hash of this content starts with ff, which\n>  \t# makes some later computations much simpler\n> -\techo 74 >file &&\n> +\techo $(test_oid oidfff) >file &&\n>  \tgit add file &&\n>  \tgit commit -m base &&\n>  \tgit repack -ad &&\n> @@ -140,10 +151,10 @@ test_expect_success 'bogus offset inside v2 extended table' '\n>  \t# an extended table (if the first object were larger than 2^31).\n>  \t#\n>  \t# Note that the value is important here. We want $object as\n> -\t# the second entry in sorted-sha1 order. The sha1 of 1485 starts\n> +\t# the second entry in sorted-sha1 order. The hash of this object starts\n\nMicronit: \"shorted-hash order\", no?\n\n>  \t# with \"000\", which sorts before that of $object (which starts\n>  \t# with \"fff\").\n> -\tsecond=$(echo 1485 | git hash-object -w --stdin) &&\n> +\tsecond=$(test_oid oid000 | git hash-object -w --stdin) &&\n>  \tdo_pack \"$object $second\" --index-version=2 &&\n>  \n>  \t# We have to make extra room for the table, so we cannot\n"},{"id":"390658","messageId":"xmqqk15b8mfs.fsf@gitster-ct.c.googlers.com","threadId":"52696","inReplyTo":"20200125230035.136348-16-sandals@crustytoothpaste.net","subject":"Re: [PATCH v2 15/22] t5515: make test hash independent","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2020-01-28T18:28:55Z","receivedAt":"2020-01-28T18:29:03Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"\"brian m. carlson\" <sandals@crustytoothpaste.net> writes:\n\n> +convert_expected () {\n> +\tfile=\"$1\" &&\n> +\tfor i in one three_file master master2 one_tree three two two2 three2\n> +\tdo\n> +\t\tsed -e \"s/$(test_oid --hash=sha1 \"$i\")/$(test_oid \"$i\")/g\" \\\n> +\t\t\t\"$file\" >\"$file.tmp\" &&\n> +\t\tmv \"$file.tmp\" \"$file\"\n> +\tdone\n> +}\n\nPerhaps we can avoid rewriting the same file that many times, by\nfeeding the mapping to a single invocation of sed?  E.g.\n\n\tsedScript=\n\tfor i in one three_file master master2 one_tree three two two2 three2\n\tdo\n\t\ti=\"s/$(test_oid --hash=sha1 $i/$(test_oid $i)/g\"\n\t\tsedScript=$sedScript${sedScript:+;}$i\"\n\tdone &&\n\tsed -e \"$sedScript\" \"$file\" >\"$file.new\" &&\n\tmv \"$file.new\" \"$file\"\n\nIf somebody's \"sed\" does not like multiple command concatenated with\n\";\", we can take advantage of the fact that we are just replacing\nhexadecimal string without anything funny and go eval, e.g.\n\n\tsedCmd=\"sed\"\n\tfor i in one three_file master master2 one_tree three two two2 three2\n\tdo\n\t\tsedCmd=\"$sedCmd -e s/$(test_oid --hash=sha1 $i/$(test_oid $i)/g\"\n\tdone &&\n\teval \"$sedCmd\" \"$file\" >\"$file.new\" &&\n\tmv \"$file.new\" \"$file\"\n\n"},{"id":"390660","messageId":"xmqqftfz8kpy.fsf@gitster-ct.c.googlers.com","threadId":"52696","inReplyTo":"20200125230035.136348-19-sandals@crustytoothpaste.net","subject":"Re: [PATCH v2 17/23] t5616: use correct filter syntax","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2020-01-28T19:06:01Z","receivedAt":"2020-01-28T19:06:09Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"\"brian m. carlson\" <sandals@crustytoothpaste.net> writes:\n\n> In the setup steps for the promisor remote tests, we clone a repository\n> and filter out all trees with depth greater than or equal to zero, which\n> also filters out all blobs.\n>\n> With SHA-1, this test passes because the object we happen to request\n> from the server is the blob that the promisor remote has.  However, due\n> to a different ordering with SHA-256, we request the tree containing\n> that blob, which the promisor remote does not have.  As a consequence,\n> we fail with a \"not our ref\" error.\n\nSorry, but I do not understand this part.\n\nThe object name of the original blob (which is the only thing\n\"promisor-remote\" is given) may sort earlier or later than other\nobjects that are missing in the \"client\" repository, but it is not\nclear how it makes difference in the final outcome---even if the\nblob is asked first (in the SHA-1 version), wouldn't we need to\nfetch the tree after that, and wouldn't that fail?  If the SHA-256\nversion that happens to ask for the tree first and fails, wouldn't\nthat mean we need to fetch both anyway?\n\nIs it that the current test with SHA-1 is broken in that it lets the\nlazy fetch fail (due to missing tree) but because the failure happens\nafter the blob gets feteched, and it ignores the failure of the lazy\nfetch, and only checks if the blob got fetched, it happens to \"pass\"?\n\n> Since what we want to test is that the blob is transferred, let's adjust\n> the filter to just filter out blobs, not trees.  That means that we'll\n> transfer the previously problematic tree as part of the normal clone,\n> and we can then test that the blob is fetched from the promisor remote\n> as expected.\n>\n> Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n> ---\n>  t/t5616-partial-clone.sh | 2 +-\n>  1 file changed, 1 insertion(+), 1 deletion(-)\n>\n> diff --git a/t/t5616-partial-clone.sh b/t/t5616-partial-clone.sh\n> index fea56cda6d..9fd6e780f9 100755\n> --- a/t/t5616-partial-clone.sh\n> +++ b/t/t5616-partial-clone.sh\n> @@ -317,7 +317,7 @@ setup_triangle () {\n>  \tcp big-blob.txt server &&\n>  \tgit -C server add big-blob.txt &&\n>  \tgit -C server commit -m \"initial\" &&\n> -\tgit clone --bare --filter=tree:0 \"file://$(pwd)/server\" client &&\n> +\tgit clone --bare --filter=blob:none \"file://$(pwd)/server\" client &&\n>  \techo another line >>server/big-blob.txt &&\n>  \tgit -C server commit -am \"append line to big blob\" &&\n>  \n"},{"id":"390661","messageId":"xmqqblqn8kjj.fsf@gitster-ct.c.googlers.com","threadId":"52696","inReplyTo":"20200125230035.136348-21-sandals@crustytoothpaste.net","subject":"Re: [PATCH v2 18/22] t5703: make test work with SHA-256","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2020-01-28T19:09:52Z","receivedAt":"2020-01-28T19:09:58Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"\"brian m. carlson\" <sandals@crustytoothpaste.net> writes:\n\n> This test used an object ID which was 40 hex characters in length,\n> causing the test not only not to pass, but to hang, when run with\n> SHA-256 as the hash.  Change this value to a fixed dummy object ID using\n> test_oid_init and test_oid.\n\nHas the above part been split into another patch?\n\n> Furthermore, ensure we extract an object ID of the appropriate length\n> using cut with fields instead of a fixed length.\n\nThis one makes sense.\n\n> Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>\n> ---\n>  t/t5703-upload-pack-ref-in-want.sh | 2 +-\n>  1 file changed, 1 insertion(+), 1 deletion(-)\n>\n> diff --git a/t/t5703-upload-pack-ref-in-want.sh b/t/t5703-upload-pack-ref-in-want.sh\n> index 1424fabd4a..5511cdcec2 100755\n> --- a/t/t5703-upload-pack-ref-in-want.sh\n> +++ b/t/t5703-upload-pack-ref-in-want.sh\n> @@ -19,7 +19,7 @@ get_actual_commits () {\n>  \t\t}' <out | test-tool pkt-line unpack-sideband >o.pack &&\n>  \tgit index-pack o.pack &&\n>  \tgit verify-pack -v o.idx >objs &&\n> -\tgrep commit objs | cut -c-40 | sort >actual_commits\n> +\tgrep commit objs | cut -d\" \" -f1 | sort >actual_commits\n>  }\n>  \n>  check_output () {\n"},{"id":"390692","messageId":"20200129034601.GK4113372@camp.crustytoothpaste.net","threadId":"52696","inReplyTo":"xmqqblqn8kjj.fsf@gitster-ct.c.googlers.com","subject":"Re: [PATCH v2 18/22] t5703: make test work with SHA-256","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-29T03:46:01Z","receivedAt":"2020-01-29T03:46:10Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"On 2020-01-28 at 19:09:52, Junio C Hamano wrote:\n> \"brian m. carlson\" <sandals@crustytoothpaste.net> writes:\n> \n> > This test used an object ID which was 40 hex characters in length,\n> > causing the test not only not to pass, but to hang, when run with\n> > SHA-256 as the hash.  Change this value to a fixed dummy object ID using\n> > test_oid_init and test_oid.\n> \n> Has the above part been split into another patch?\n\nI think it has been.  I'll just squash them together, since it doesn't\nreally make sense to separate them out.\n-- \nbrian m. carlson: Houston, Texas, US\nOpenPGP: https://keybase.io/bk2204\n"},{"id":"390693","messageId":"20200129035333.GL4113372@camp.crustytoothpaste.net","threadId":"52696","inReplyTo":"xmqqftfz8kpy.fsf@gitster-ct.c.googlers.com","subject":"Re: [PATCH v2 17/23] t5616: use correct filter syntax","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-29T03:53:33Z","receivedAt":"2020-01-29T03:54:04Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"On 2020-01-28 at 19:06:01, Junio C Hamano wrote:\n> \"brian m. carlson\" <sandals@crustytoothpaste.net> writes:\n> \n> > In the setup steps for the promisor remote tests, we clone a repository\n> > and filter out all trees with depth greater than or equal to zero, which\n> > also filters out all blobs.\n> >\n> > With SHA-1, this test passes because the object we happen to request\n> > from the server is the blob that the promisor remote has.  However, due\n> > to a different ordering with SHA-256, we request the tree containing\n> > that blob, which the promisor remote does not have.  As a consequence,\n> > we fail with a \"not our ref\" error.\n> \n> Sorry, but I do not understand this part.\n> \n> The object name of the original blob (which is the only thing\n> \"promisor-remote\" is given) may sort earlier or later than other\n> objects that are missing in the \"client\" repository, but it is not\n> clear how it makes difference in the final outcome---even if the\n> blob is asked first (in the SHA-1 version), wouldn't we need to\n> fetch the tree after that, and wouldn't that fail?  If the SHA-256\n> version that happens to ask for the tree first and fails, wouldn't\n> that mean we need to fetch both anyway?\n> \n> Is it that the current test with SHA-1 is broken in that it lets the\n> lazy fetch fail (due to missing tree) but because the failure happens\n> after the blob gets feteched, and it ignores the failure of the lazy\n> fetch, and only checks if the blob got fetched, it happens to \"pass\"?\n\nI think Jonathan Tan figured out that my analysis was wrong, and that\nthe issue is that the larger object ID length causes deltification to\nhappen.  The test assumes that the tree is sent as a non-delta object,\nand when it's sent as a deltaed object instead, we fail.  He explains\nthis quite well in <20200113202823.228062-1-jonathantanmy@google.com>,\nwhich you seem to have picked up.\n\nSince my analysis was wrong here and he's provided a patch which fixes\nthe issue in a much more robust way, I'm dropping this patch in v3.\n-- \nbrian m. carlson: Houston, Texas, US\nOpenPGP: https://keybase.io/bk2204\n"},{"id":"390694","messageId":"20200129040445.GM4113372@camp.crustytoothpaste.net","threadId":"52696","inReplyTo":"xmqqk15b8mfs.fsf@gitster-ct.c.googlers.com","subject":"Re: [PATCH v2 15/22] t5515: make test hash independent","fromName":"brian m. carlson","fromEmail":"sandals@crustytoothpaste.net","sentAt":"2020-01-29T04:04:45Z","receivedAt":"2020-01-29T04:04:52Z","isPatch":true,"sender":{"key":"sandals@crustytoothpaste.net","avatar":"https://avatars.githubusercontent.com/u/497054?v=4"},"body":"On 2020-01-28 at 18:28:55, Junio C Hamano wrote:\n> \"brian m. carlson\" <sandals@crustytoothpaste.net> writes:\n> \n> > +convert_expected () {\n> > +\tfile=\"$1\" &&\n> > +\tfor i in one three_file master master2 one_tree three two two2 three2\n> > +\tdo\n> > +\t\tsed -e \"s/$(test_oid --hash=sha1 \"$i\")/$(test_oid \"$i\")/g\" \\\n> > +\t\t\t\"$file\" >\"$file.tmp\" &&\n> > +\t\tmv \"$file.tmp\" \"$file\"\n> > +\tdone\n> > +}\n> \n> Perhaps we can avoid rewriting the same file that many times, by\n> feeding the mapping to a single invocation of sed?  E.g.\n> \n> \tsedScript=\n> \tfor i in one three_file master master2 one_tree three two two2 three2\n> \tdo\n> \t\ti=\"s/$(test_oid --hash=sha1 $i/$(test_oid $i)/g\"\n> \t\tsedScript=$sedScript${sedScript:+;}$i\"\n> \tdone &&\n> \tsed -e \"$sedScript\" \"$file\" >\"$file.new\" &&\n> \tmv \"$file.new\" \"$file\"\n\nThis is a good idea.  We could also write a small sed script to a file\nat the beginning and invoke it with sed -f.  That's portable (POSIX\nsupports it) and should be easy and efficient to do.\n-- \nbrian m. carlson: Houston, Texas, US\nOpenPGP: https://keybase.io/bk2204\n"}]}