mbox series

[v5,00/39] SHA-256, part 3/3

Message ID 20200728233446.3066485-1-sandals@crustytoothpaste.net (mailing list archive)
Headers show
Series SHA-256, part 3/3 | expand

Message

brian m. carlson July 28, 2020, 11:34 p.m. UTC
This is the final part required for the stage 4 implementation of
SHA-256.

Changes from v4:
* Fix several commit message to fix typos and inaccuracies.
* Remove useless touch statement in tests.
* Adjust several tests to introduce less dependence on previous test
  assertions other than the setup ones.
* Loosen the regexp for object IDs in a Perl script in a test.
* Ensure help functionality works for git http-fetch.
* Switch http-fetch.c to use the already existing struct argv_array
  instance.
* Avoid a memory leak, albeit a minor one.
* Improve error message for unknown bundle hash algorithm.
* Hoist a strbuf_rtrim in the bundle parsing code to simplify things.
* Specify a minimum version instead of a default version in the bundle
  code.
* Remove a useless line in tests.
* Avoid invoking git hash-object needlessly for the SHA1 prerequisite.
* Be explicit about which algorithms we're testing in CI.
* Properly capitalize "core.repositoryFormatVersion" in documentation.

Changes from v2:
* Move bundle signature parsing into a function.
* Improve parsing of bundle capabilities.
* Improve t5510 to select only the interesting lines with sed.
* Use cat and a heredoc instead of multiple echos.
* Use test_i18ngrep where appropriate.
* Reject extensions.objectFormat for repo v0.
* Update documentation accordingly.

Changes from v1:
* Add a patch to add a bundle v3 format with capabilities that include
  the hash algorithm.
* Remove bundle detection of hash algorithm using hash algorithm length.
* Fix typo in the extensions.objectFormat documentation.
* Document that extensions.objectFormat is ignored for repo v0.
* Use test instead of brackets.
* Use a command group instead of a subshell for efficiency.
* Drop the bizarre test_might_fail, since it isn't needed (and is
  bizarre and wrong).
* Write "SHA-256" instead of "NewHash" in commit messages.
* Split SHA-256 CI tests to an independent run and avoid running a third
  test run to a single CI job.

Range-diff below.

Johannes Schindelin (1):
  t3404: prepare 'short SHA-1 collision' tests for SHA-256

brian m. carlson (38):
  t: make test-bloom initialize repository
  t1001: use $ZERO_OID
  t3305: make hash agnostic
  t6100: make hash size independent
  t6101: make hash size independent
  t6301: make hash size independent
  t6500: specify test values for SHA-256
  t6501: avoid hard-coded objects
  t7003: compute appropriate length constant
  t7063: make hash size independent
  t7201: abstract away SHA-1-specific constants
  t7102: abstract away SHA-1-specific constants
  t7400: make hash size independent
  t7405: make hash size independent
  t7506: avoid checking for SHA-1-specific constants
  t7508: use $ZERO_OID instead of hard-coded constant
  t8002: make hash size independent
  t8003: make hash size independent
  t8011: make hash size independent
  t9300: abstract away SHA-1-specific constants
  t9300: use $ZERO_OID instead of hard-coded object ID
  t9301: make hash size independent
  t9350: make hash size independent
  t9500: ensure that algorithm info is preserved in config
  t9700: make hash size independent
  t5308: make test work with SHA-256
  t0410: mark test with SHA1 prerequisite
  http-fetch: set up git directory before parsing pack hashes
  builtin/verify-pack: implement an --object-format option
  bundle: add new version for use with SHA-256
  setup: add support for reading extensions.objectformat
  Enable SHA-256 support by default
  t: add test_oid option to select hash algorithm
  t: allow testing different hash algorithms via environment
  t: make SHA1 prerequisite depend on default hash
  ci: run tests with SHA-256
  docs: add documentation for extensions.objectFormat
  t: remove test_oid_init in tests

 Documentation/config.txt                  |   2 +
 Documentation/config/extensions.txt       |   8 ++
 Documentation/git-bundle.txt              |   9 +-
 Documentation/technical/bundle-format.txt |  30 ++++-
 builtin/bundle.c                          |   5 +-
 builtin/init-db.c                         |   5 -
 builtin/verify-pack.c                     |  23 ++--
 bundle.c                                  |  83 +++++++++---
 bundle.h                                  |   4 +-
 ci/run-build-and-tests.sh                 |   6 +
 config.mak.dev                            |   2 -
 http-fetch.c                              |   4 +-
 repository.c                              |   4 -
 setup.c                                   |  16 ++-
 t/helper/test-bloom.c                     |   2 +
 t/lib-pack.sh                             |  11 +-
 t/lib-submodule-update.sh                 |   1 -
 t/t0000-basic.sh                          |  15 ++-
 t/t0001-init.sh                           |  33 +++++
 t/t0410-partial-clone.sh                  |   4 +-
 t/t1006-cat-file.sh                       |   2 -
 t/t1050-large.sh                          |   1 -
 t/t1091-sparse-checkout-builtin.sh        |   4 +-
 t/t1410-reflog.sh                         |   1 -
 t/t1450-fsck.sh                           |   1 -
 t/t1500-rev-parse.sh                      |   1 -
 t/t3305-notes-fanout.sh                   |   2 +-
 t/t3308-notes-merge.sh                    |   1 -
 t/t3404-rebase-interactive.sh             |  49 +++++--
 t/t3600-rm.sh                             |   1 -
 t/t3800-mktag.sh                          |   1 -
 t/t4002-diff-basic.sh                     |   2 -
 t/t4027-diff-submodule.sh                 |   1 -
 t/t4134-apply-submodule.sh                |   1 -
 t/t4200-rerere.sh                         |   1 -
 t/t4211-line-log.sh                       |   1 -
 t/t5300-pack-object.sh                    |   3 +-
 t/t5302-pack-index.sh                     |   1 -
 t/t5308-pack-detect-duplicates.sh         |  20 +--
 t/t5313-pack-bounds-checks.sh             |   1 -
 t/t5318-commit-graph.sh                   |   3 +-
 t/t5319-multi-pack-index.sh               |   1 -
 t/t5324-split-commit-graph.sh             |   1 -
 t/t5504-fetch-receive-strict.sh           |   1 -
 t/t5510-fetch.sh                          |  16 ++-
 t/t5530-upload-pack-error.sh              |   1 -
 t/t5562-http-backend-content-length.sh    |   1 -
 t/t5607-clone-bundle.sh                   |  31 +++++
 t/t5702-protocol-v2.sh                    |   3 +-
 t/t5703-upload-pack-ref-in-want.sh        |   1 -
 t/t6006-rev-list-format.sh                |   1 -
 t/t6100-rev-list-in-order.sh              |   4 +-
 t/t6101-rev-parse-parents.sh              |   2 +-
 t/t6301-for-each-ref-errors.sh            |   2 +-
 t/t6500-gc.sh                             |  27 +++-
 t/t6501-freshen-objects.sh                |  14 +-
 t/t7003-filter-branch.sh                  |   3 +-
 t/t7063-status-untracked-cache.sh         | 150 ++++++++++++----------
 t/t7102-reset.sh                          |  93 ++++++++------
 t/t7201-co.sh                             |   6 +-
 t/t7400-submodule-basic.sh                |  26 ++--
 t/t7405-submodule-merge.sh                |   4 +-
 t/t7506-status-submodule.sh               |  12 +-
 t/t7508-status.sh                         |   2 +-
 t/t8002-blame.sh                          |  18 ++-
 t/t8003-blame-corner-cases.sh             |   3 +-
 t/t8011-blame-split-file.sh               |   2 +-
 t/t9300-fast-import.sh                    | 118 +++++++++--------
 t/t9301-fast-import-notes.sh              |  13 +-
 t/t9350-fast-export.sh                    |  15 +--
 t/t9500-gitweb-standalone-no-errors.sh    |  22 +++-
 t/t9700/test.pl                           |   6 +-
 t/test-lib-functions.sh                   |  16 ++-
 t/test-lib.sh                             |   9 +-
 74 files changed, 635 insertions(+), 354 deletions(-)
 create mode 100644 Documentation/config/extensions.txt

Diff-intervalle contre v4 :
 1:  2d720a6beb =  1:  fb53834bd3 t: make test-bloom initialize repository
 2:  530704736a =  2:  8170f55d65 t1001: use $ZERO_OID
 3:  33e7822d0e =  3:  4b14099f1a t3305: make hash agnostic
 4:  82a6827f45 !  4:  8d3ce7cccd t3404: prepare 'short SHA-1 collision' tests for SHA-256
    @@ Commit message
         commit message "collide2" to find such a collision. To make it easier to
         find such a collision, we reduce the number of digits to 4.
     
    -    The `t/oid-info/oid` file now lists the values found in that way, and
    -    the test cases are modified to use those values.
    -
         As the tests are no longer dependent on SHA-1, we also rename their
         titles to talk about "commit IDs" instead of "SHA-1s".
     
 5:  23cbd25060 =  5:  8329368075 t6100: make hash size independent
 6:  9e2553b1f2 =  6:  63595c30d4 t6101: make hash size independent
 7:  c2c5dd407e =  7:  88c7a501db t6301: make hash size independent
 8:  1ab4ed032a =  8:  4546001417 t6500: specify test values for SHA-256
 9:  54fcc025bb =  9:  4a9304a648 t6501: avoid hard-coded objects
10:  a2f420fcd4 = 10:  7785b7cc1f t7003: compute appropriate length constant
11:  766bba42f6 ! 11:  71db1716f5 t7063: make hash size independent
    @@ Metadata
      ## Commit message ##
         t7063: make hash size independent
     
    -    Use test_oid instead of hard-coding a fixed size all-zeros object ID.
    +    Use test_oid instead of hard-coding algorithm-specific constants and
    +    all-zero values.
     
         Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
     
    @@ t/t7063-status-untracked-cache.sh: EOF
      two
      EOF
      	test_cmp ../expect-from-test-dump ../actual
    -@@ t/t7063-status-untracked-cache.sh: test_expect_success 'using --untracked-cache does not fail when core.untrackedCa
    - '
    - 
    - test_expect_success 'setting core.untrackedCache to keep' '
    -+	touch ../expect-from-test-dump &&
    - 	git config core.untrackedCache keep &&
    - 	git update-index --untracked-cache &&
    - 	test-tool dump-untracked-cache >../actual &&
     @@ t/t7063-status-untracked-cache.sh: test_expect_success '"status" after file replacement should be clean with UC=tru
      	test-tool dump-untracked-cache >../actual &&
      	grep -F "recurse valid" ../actual >../actual.grep &&
12:  66d242ccd9 ! 12:  79dcdc3496 t7201: abstract away SHA-1-specific constants
    @@ t/t7201-co.sh: test_expect_success 'switch to another branch while carrying a de
      	test_line_count = 1 messages &&
      	H=$(git rev-parse --verify HEAD) &&
      	M=$(git show-ref -s --verify refs/heads/master) &&
    -@@ t/t7201-co.sh: test_expect_success 'checkout to detach HEAD' '
    +@@ t/t7201-co.sh: test_expect_success 'checkout to detach HEAD (with advice declined)' '
    + 
    + test_expect_success 'checkout to detach HEAD' '
      	git config advice.detachedHead true &&
    ++	rev=$(git rev-parse --short renamer^) &&
      	git checkout -f renamer && git clean -f &&
      	GIT_TEST_GETTEXT_POISON=false git checkout renamer^ 2>messages &&
     -	grep "HEAD is now at 7329388" messages &&
13:  090041ee54 = 13:  f89560df08 t7102: abstract away SHA-1-specific constants
14:  4a6991d6a1 = 14:  79800ba8a3 t7400: make hash size independent
15:  d39bbeb5a2 = 15:  07d287fe0f t7405: make hash size independent
16:  5b0d52ae0e = 16:  1ee37967f2 t7506: avoid checking for SHA-1-specific constants
17:  54d1706107 = 17:  ba3c997fd7 t7508: use $ZERO_OID instead of hard-coded constant
18:  f3f4239ce9 ! 18:  362e0a9440 t8002: make hash size independent
    @@ Metadata
      ## Commit message ##
         t8002: make hash size independent
     
    -    Compute the length of an object ID instead of of hard-coding 40-based
    +    Compute the length of an object ID instead of hard-coding 40-based
         values.
     
         Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
    @@ t/t8002-blame.sh: test_description='git blame'
      . "$TEST_DIRECTORY"/annotate-tests.sh
      
     +test_expect_success 'setup' '
    -+	test_oid_init
    ++	hexsz=$(test_oid hexsz)
     +'
     +
      test_expect_success 'blame untracked file in empty repo' '
    @@ t/t8002-blame.sh: test_expect_success 'blame --abbrev=<n> works' '
      test_expect_success 'blame -l aligns regular and boundary commits' '
     -	check_abbrev 40 -l HEAD &&
     -	check_abbrev 39 -l ^HEAD
    -+	hexsz=$(test_oid hexsz) &&
     +	check_abbrev $hexsz         -l HEAD &&
     +	check_abbrev $((hexsz - 1)) -l ^HEAD
      '
19:  719db3822e = 19:  eeeba30e75 t8003: make hash size independent
20:  803e5665e9 ! 20:  a71b7fb7f1 t8011: make hash size independent
    @@ t/t8011-blame-split-file.sh: test_expect_success 'setup simulated porcelain' '
      	my $field = shift;
      	while (<>) {
     -		if (/^[0-9a-f]{40} /) {
    -+		if (/^[0-9a-f]{40,64} /) {
    ++		if (/^[0-9a-f]{40,} /) {
      			flush();
      			$hash = $&;
      		} elsif (/^$field (.*)/) {
21:  d1c4351bc9 ! 21:  b9a4ac6547 t9300: abstract away SHA-1-specific constants
    @@ Commit message
         t9300: abstract away SHA-1-specific constants
     
         Adjust the test so that it computes variables for object IDs instead of
    -    using hard-coded hashes.
    +    using hard-coded hashes.  In addition, use cut to filter out the object
    +    IDs and verify only the information that we're really interested in.
     
         Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
     
      ## t/t9300-fast-import.sh ##
     @@ t/t9300-fast-import.sh: test_expect_success 'A: verify pack' '
    + '
      
      test_expect_success 'A: verify diff' '
    ++	copy=$(git rev-parse --verify master:file2) &&
      	cat >expect <<-EOF &&
     -	:000000 100755 0000000000000000000000000000000000000000 7123f7f44e39be127c5eb701e5968176ee9d78b1 A	copy-of-file2
    -+	:000000 100755 0000000000000000000000000000000000000000 $(git rev-parse --verify master:file2) A	copy-of-file2
    ++	:000000 100755 0000000000000000000000000000000000000000 $copy A	copy-of-file2
      	EOF
      	git diff-tree -M -r master verify--import-marks >actual &&
      	compare_diff_raw expect actual &&
22:  db74bf3c8c ! 22:  8d617381c0 t9300: use $ZERO_OID instead of hard-coded object ID
    @@ t/t9300-fast-import.sh: test_expect_success 'A: create pack from stdin' '
      	tag nested
      	mark :7
     @@ t/t9300-fast-import.sh: test_expect_success 'A: verify pack' '
    - 
      test_expect_success 'A: verify diff' '
    + 	copy=$(git rev-parse --verify master:file2) &&
      	cat >expect <<-EOF &&
    --	:000000 100755 0000000000000000000000000000000000000000 $(git rev-parse --verify master:file2) A	copy-of-file2
    -+	:000000 100755 $ZERO_OID $(git rev-parse --verify master:file2) A	copy-of-file2
    +-	:000000 100755 0000000000000000000000000000000000000000 $copy A	copy-of-file2
    ++	:000000 100755 $ZERO_OID $copy A	copy-of-file2
      	EOF
      	git diff-tree -M -r master verify--import-marks >actual &&
      	compare_diff_raw expect actual &&
23:  fa7daed2bf = 23:  d3ddbe3bcf t9301: make hash size independent
24:  84aef86ac0 = 24:  70bfe6c076 t9350: make hash size independent
25:  541108fc64 = 25:  c784e76075 t9500: ensure that algorithm info is preserved in config
26:  2de5d2da58 = 26:  00e82dc23e t9700: make hash size independent
27:  c916058c38 = 27:  2d03d136df t5308: make test work with SHA-256
28:  b0781430ef = 28:  d8941dd81d t0410: mark test with SHA1 prerequisite
29:  230a933e87 ! 29:  39eb2e82b5 http-fetch: set up git directory before parsing pack hashes
    @@ Commit message
         To ensure that we can parse packfile hashes of the right length, let's
         set up the git directory before we start parsing arguments.
     
    +    Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
    +
      ## http-fetch.c ##
     @@ http-fetch.c: int cmd_main(int argc, const char **argv)
      	int packfile = 0;
      	struct object_id packfile_hash;
      
    -+	setup_git_directory();
    ++	setup_git_directory_gently(NULL);
     +
      	while (arg < argc && argv[arg][0] == '-') {
      		const char *p;
30:  d3dbe9e760 ! 30:  7c71a12f67 builtin/verify-pack: implement an --object-format option
    @@ builtin/verify-pack.c
      {
      	struct child_process index_pack = CHILD_PROCESS_INIT;
     -	const char *argv[] = {"index-pack", NULL, NULL, NULL };
    --	struct strbuf arg = STRBUF_INIT;
    -+	struct argv_array argv = ARGV_ARRAY_INIT;
    -+	struct strbuf arg = STRBUF_INIT, hash_arg = STRBUF_INIT;
    ++	struct argv_array *argv = &index_pack.args;
    + 	struct strbuf arg = STRBUF_INIT;
      	int verbose = flags & VERIFY_PACK_VERBOSE;
      	int stat_only = flags & VERIFY_PACK_STAT_ONLY;
      	int err;
      
    -+	argv_array_push(&argv, "index-pack");
    ++	argv_array_push(argv, "index-pack");
     +
      	if (stat_only)
     -		argv[1] = "--verify-stat-only";
    -+		argv_array_push(&argv, "--verify-stat-only");
    ++		argv_array_push(argv, "--verify-stat-only");
      	else if (verbose)
     -		argv[1] = "--verify-stat";
    -+		argv_array_push(&argv, "--verify-stat");
    ++		argv_array_push(argv, "--verify-stat");
      	else
     -		argv[1] = "--verify";
    -+		argv_array_push(&argv, "--verify");
    ++		argv_array_push(argv, "--verify");
     +
    -+	if (hash_algo) {
    -+		strbuf_addf(&hash_arg, "--object-format=%s", hash_algo);
    -+		argv_array_push(&argv, hash_arg.buf);
    -+	}
    ++	if (hash_algo)
    ++		argv_array_pushf(argv, "--object-format=%s", hash_algo);
      
      	/*
      	 * In addition to "foo.pack" we accept "foo.idx" and "foo";
    @@ builtin/verify-pack.c: static int verify_one_pack(const char *path, unsigned int
      	    !ends_with(arg.buf, ".pack"))
      		strbuf_addstr(&arg, ".pack");
     -	argv[2] = arg.buf;
    -+	argv_array_push(&argv, arg.buf);
    ++	argv_array_push(argv, arg.buf);
      
     -	index_pack.argv = argv;
    -+	index_pack.argv = argv.argv;
      	index_pack.git_cmd = 1;
      
      	err = run_command(&index_pack);
    -@@ builtin/verify-pack.c: static int verify_one_pack(const char *path, unsigned int flags)
    - 		}
    - 	}
    - 	strbuf_release(&arg);
    -+	argv_array_clear(&argv);
    - 
    - 	return err;
    - }
     @@ builtin/verify-pack.c: int cmd_verify_pack(int argc, const char **argv, const char *prefix)
      {
      	int err = 0;
31:  e3805101ce ! 31:  9a0345a1f6 bundle: add new version for use with SHA-256
    @@ bundle.c: static void add_to_ref_list(const struct object_id *oid, const char *n
     +	if (skip_prefix(capability, "object-format=", &arg)) {
     +		int algo = hash_algo_by_name(arg);
     +		if (algo == GIT_HASH_UNKNOWN)
    -+			return error(_("unable to detect hash algorithm"));
    ++			return error(_("unrecognized bundle hash algorithm: %s"), arg);
     +		header->hash_algo = &hash_algos[algo];
     +		return 0;
     +	}
    @@ bundle.c: static int parse_bundle_header(int fd, struct bundle_header *header,
      		int is_prereq = 0;
      		const char *p;
      
    -+		if (header->version == 3 && *buf.buf == '@') {
    -+			buf.buf[--buf.len] = '\0';
    -+			if (parse_capability(header, buf.buf + 1)) {
    -+				status = -1;
    -+				break;
    -+			}
    -+			continue;
    -+		}
    -+
    - 		if (*buf.buf == '-') {
    - 			is_prereq = 1;
    - 			strbuf_remove(&buf, 0, 1);
    - 		}
    +-		if (*buf.buf == '-') {
    +-			is_prereq = 1;
    +-			strbuf_remove(&buf, 0, 1);
    +-		}
      		strbuf_rtrim(&buf);
      
     -		if (!header->hash_algo) {
     -			header->hash_algo = detect_hash_algo(&buf);
     -			if (!header->hash_algo) {
     -				error(_("unknown hash algorithm length"));
    --				status = -1;
    --				break;
    --			}
    --		}
    --
    ++		if (header->version == 3 && *buf.buf == '@') {
    ++			if (parse_capability(header, buf.buf + 1)) {
    + 				status = -1;
    + 				break;
    + 			}
    ++			continue;
    ++		}
    ++
    ++		if (*buf.buf == '-') {
    ++			is_prereq = 1;
    ++			strbuf_remove(&buf, 0, 1);
    + 		}
    + 
      		/*
    - 		 * Tip lines have object name, SP, and refname.
    - 		 * Prerequisites have object name that is optionally
     @@ bundle.c: static int write_bundle_refs(int bundle_fd, struct rev_info *revs)
      }
      
    @@ bundle.c: static int write_bundle_refs(int bundle_fd, struct rev_info *revs)
      	int bundle_to_stdout;
      	int ref_count = 0;
      	struct rev_info revs;
    -+	int default_version = the_hash_algo == &hash_algos[GIT_HASH_SHA1] ? 2 : 3;
    ++	int min_version = the_hash_algo == &hash_algos[GIT_HASH_SHA1] ? 2 : 3;
      
      	bundle_to_stdout = !strcmp(path, "-");
      	if (bundle_to_stdout)
    @@ bundle.c: int create_bundle(struct repository *r, const char *path,
     -	/* write signature */
     -	write_or_die(bundle_fd, bundle_signature, strlen(bundle_signature));
     +	if (version == -1)
    -+		version = default_version;
    ++		version = min_version;
     +
     +	if (version < 2 || version > 3) {
     +		die(_("unsupported bundle version %d"), version);
    -+	} else if (version < default_version) {
    ++	} else if (version < min_version) {
     +		die(_("cannot write bundle version %d with algorithm %s"), version, the_hash_algo->name);
     +	} else if (version == 2) {
     +		write_or_die(bundle_fd, v2_bundle_signature, strlen(v2_bundle_signature));
    @@ t/t5510-fetch.sh: test_expect_success 'create bundle 1' '
      '
      
      test_expect_success 'header of bundle looks right' '
    - 	head -n 4 "$D"/bundle1 &&
    +-	head -n 4 "$D"/bundle1 &&
     -	head -n 1 "$D"/bundle1 | grep "^#" &&
     -	head -n 2 "$D"/bundle1 | grep "^-$OID_REGEX " &&
     -	head -n 3 "$D"/bundle1 | grep "^$OID_REGEX " &&
    @@ t/t5510-fetch.sh: test_expect_success 'create bundle 1' '
     +	cat >expect <<-EOF &&
     +	# v3 git bundle
     +	@object-format=$(test_oid algo)
    -+	-OID message
    -+	OID message
    ++	-OID updated by origin
    ++	OID refs/heads/master
     +
     +	EOF
    -+	sed -e "s/$OID_REGEX .*/OID message/g" -e "5q" "$D"/bundle1 >actual &&
    ++	sed -e "s/$OID_REGEX/OID/g" -e "5q" "$D"/bundle1 >actual &&
     +	test_cmp expect actual
      '
      
32:  c941fcf63c = 32:  4b72b98ce7 setup: add support for reading extensions.objectformat
33:  7c6264ac79 ! 33:  73ef3ef66a Enable SHA-256 support by default
    @@ t/t0001-init.sh: test_expect_success 're-init from a linked worktree' '
     +'
     +
     +test_expect_success 'init honors --object-format' '
    -+	git init --object-format=sha256 explicit &&
    -+	git -C explicit rev-parse --show-object-format >actual &&
    ++	git init --object-format=sha1 explicit-sha1 &&
    ++	git -C explicit-sha1 rev-parse --show-object-format >actual &&
    ++	echo sha1 >expected &&
    ++	test_cmp expected actual &&
    ++	git init --object-format=sha256 explicit-sha256 &&
    ++	git -C explicit-sha256 rev-parse --show-object-format >actual &&
     +	echo sha256 >expected &&
     +	test_cmp expected actual
     +'
34:  2719ab94e6 = 34:  2512a1669c t: add test_oid option to select hash algorithm
35:  1c8e5041d1 = 35:  015636559b t: allow testing different hash algorithms via environment
36:  7213d59222 <  -:  ---------- t: make SHA1 prerequisite depend on default hash
 -:  ---------- > 36:  6f2dec51cd t: make SHA1 prerequisite depend on default hash
37:  caf6c026ba ! 37:  32536503f3 ci: run tests with SHA-256
    @@ Commit message
         run as fast as possible, so we wouldn't want to add a third run to the
         linux-gcc job.  To make sure we properly exercise the code, let's run
         the tests in the default mode (SHA-1) first and then run a second time
    -    with SHA-256.
    +    with SHA-256.  We explicitly specify SHA-1 for the first run so that if
    +    we change the default in the future, we make sure to test both cases.
     
         Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
     
    @@ ci/run-build-and-tests.sh: linux-gcc)
      	make test
      	;;
     +linux-clang)
    ++	export GIT_TEST_DEFAULT_HASH=sha1
     +	make test
     +	export GIT_TEST_DEFAULT_HASH=sha256
     +	make test
38:  ec4e6ae166 ! 38:  cc5679d353 docs: add documentation for extensions.objectFormat
    @@ Documentation/config/extensions.txt (new)
     +extensions.objectFormat::
     +	Specify the hash algorithm to use.  The acceptable values are `sha1` and
     +	`sha256`.  If not specified, `sha1` is assumed.  It is an error to specify
    -+	this key unless `core.repositoryformatversion` is 1.
    ++	this key unless `core.repositoryFormatVersion` is 1.
     ++
     +Note that this setting should only be set by linkgit:git-init[1] or
     +linkgit:git-clone[1].  Trying to change it after initialization will not
39:  3185c62cfc ! 39:  307b75c88e t: remove test_oid_init in tests
    @@ t/t7003-filter-branch.sh: test_description='git filter-branch'
      	GIT_COMMITTER_DATE="@0 +0000" GIT_AUTHOR_DATE="@0 +0000" &&
      	test_commit --notick B &&
     
    - ## t/t8002-blame.sh ##
    -@@ t/t8002-blame.sh: test_description='git blame'
    - PROG='git blame -c'
    - . "$TEST_DIRECTORY"/annotate-tests.sh
    - 
    --test_expect_success 'setup' '
    --	test_oid_init
    --'
    --
    - test_expect_success 'blame untracked file in empty repo' '
    - 	>untracked &&
    - 	test_must_fail git blame untracked
    -
      ## t/t8003-blame-corner-cases.sh ##
     @@ t/t8003-blame-corner-cases.sh: test_description='git blame corner cases'
      pick_fc='s/^[0-9a-f^]* *\([^ ]*\) *(\([^ ]*\) .*/\1-\2/'