All of lore.kernel.org
 help / color / mirror / Atom feed
From: "brian m. carlson" <sandals@crustytoothpaste.net>
To: <git@vger.kernel.org>
Cc: Eric Sunshine <sunshine@sunshineco.com>
Subject: [PATCH v6 31/39] bundle: add new version for use with SHA-256
Date: Wed, 29 Jul 2020 23:14:20 +0000	[thread overview]
Message-ID: <20200729231428.3658647-32-sandals@crustytoothpaste.net> (raw)
In-Reply-To: <20200729231428.3658647-1-sandals@crustytoothpaste.net>

Currently we detect the hash algorithm in use by the length of the
object ID.  This is inelegant and prevents us from using a different
hash algorithm that is also 256 bits in length.

Since we cannot extend the v2 format in a backward-compatible way, let's
add a v3 format, which is identical, except for the addition of
capabilities, which are prefixed by an at sign.  We add "object-format"
as the only capability and reject unknown capabilities, since we do not
have a network connection and therefore cannot negotiate with the other
side.

For compatibility, default to the v2 format for SHA-1 and require v3
for SHA-256.

In t5510, always use format v3 so we can be sure we produce consistent
results across hash algorithms.  Since head -n N lists the top N lines
instead of the Nth line, let's run our output through sed to normalize
it and compare it against a fixed value, which will make sure we get
exactly what we're expecting.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
---
 Documentation/git-bundle.txt              |  9 ++-
 Documentation/technical/bundle-format.txt | 30 +++++++-
 builtin/bundle.c                          |  5 +-
 bundle.c                                  | 83 +++++++++++++++++------
 bundle.h                                  |  4 +-
 t/t5510-fetch.sh                          | 16 +++--
 t/t5607-clone-bundle.sh                   | 31 +++++++++
 7 files changed, 147 insertions(+), 31 deletions(-)

diff --git a/Documentation/git-bundle.txt b/Documentation/git-bundle.txt
index d34b0964be..53804cad4b 100644
--- a/Documentation/git-bundle.txt
+++ b/Documentation/git-bundle.txt
@@ -9,7 +9,8 @@ git-bundle - Move objects and refs by archive
 SYNOPSIS
 --------
 [verse]
-'git bundle' create [-q | --quiet | --progress | --all-progress] [--all-progress-implied] <file> <git-rev-list-args>
+'git bundle' create [-q | --quiet | --progress | --all-progress] [--all-progress-implied]
+		    [--version=<version>] <file> <git-rev-list-args>
 'git bundle' verify [-q | --quiet] <file>
 'git bundle' list-heads <file> [<refname>...]
 'git bundle' unbundle <file> [<refname>...]
@@ -102,6 +103,12 @@ unbundle <file>::
 	is activated.  Unlike --all-progress this flag doesn't actually
 	force any progress display by itself.
 
+--version=<version>::
+	Specify the bundle version.  Version 2 is the older format and can only be
+	used with SHA-1 repositories; the newer version 3 contains capabilities that
+	permit extensions. The default is the oldest supported format, based on the
+	hash algorithm in use.
+
 -q::
 --quiet::
 	This flag makes the command not to report its progress
diff --git a/Documentation/technical/bundle-format.txt b/Documentation/technical/bundle-format.txt
index 0e828151a5..bac558d049 100644
--- a/Documentation/technical/bundle-format.txt
+++ b/Documentation/technical/bundle-format.txt
@@ -7,6 +7,8 @@ The Git bundle format is a format that represents both refs and Git objects.
 We will use ABNF notation to define the Git bundle format. See
 protocol-common.txt for the details.
 
+A v2 bundle looks like this:
+
 ----
 bundle    = signature *prerequisite *reference LF pack
 signature = "# v2 git bundle" LF
@@ -18,9 +20,28 @@ reference    = obj-id SP refname LF
 pack         = ... ; packfile
 ----
 
+A v3 bundle looks like this:
+
+----
+bundle    = signature *capability *prerequisite *reference LF pack
+signature = "# v3 git bundle" LF
+
+capability   = "@" key ["=" value] LF
+prerequisite = "-" obj-id SP comment LF
+comment      = *CHAR
+reference    = obj-id SP refname LF
+key          = 1*(ALPHA / DIGIT / "-")
+value        = *(%01-09 / %0b-FF)
+
+pack         = ... ; packfile
+----
+
 == Semantics
 
-A Git bundle consists of three parts.
+A Git bundle consists of several parts.
+
+* "Capabilities", which are only in the v3 format, indicate functionality that
+	the bundle requires to be read properly.
 
 * "Prerequisites" lists the objects that are NOT included in the bundle and the
   reader of the bundle MUST already have, in order to use the data in the
@@ -46,3 +67,10 @@ put any string here. The reader of the bundle MUST ignore the comment.
 Note that the prerequisites does not represent a shallow-clone boundary. The
 semantics of the prerequisites and the shallow-clone boundaries are different,
 and the Git bundle v2 format cannot represent a shallow clone repository.
+
+== Capabilities
+
+Because there is no opportunity for negotiation, unknown capabilities cause 'git
+bundle' to abort.  The only known capability is `object-format`, which specifies
+the hash algorithm in use, and can take the same values as the
+`extensions.objectFormat` configuration value.
diff --git a/builtin/bundle.c b/builtin/bundle.c
index f049d27a14..e1a85e7dcc 100644
--- a/builtin/bundle.c
+++ b/builtin/bundle.c
@@ -60,6 +60,7 @@ static int cmd_bundle_create(int argc, const char **argv, const char *prefix) {
 	int all_progress_implied = 0;
 	int progress = isatty(STDERR_FILENO);
 	struct argv_array pack_opts;
+	int version = -1;
 
 	struct option options[] = {
 		OPT_SET_INT('q', "quiet", &progress,
@@ -71,6 +72,8 @@ static int cmd_bundle_create(int argc, const char **argv, const char *prefix) {
 		OPT_BOOL(0, "all-progress-implied",
 			 &all_progress_implied,
 			 N_("similar to --all-progress when progress meter is shown")),
+		OPT_INTEGER(0, "version", &version,
+			    N_("specify bundle format version")),
 		OPT_END()
 	};
 	const char* bundle_file;
@@ -91,7 +94,7 @@ static int cmd_bundle_create(int argc, const char **argv, const char *prefix) {
 
 	if (!startup_info->have_repository)
 		die(_("Need a repository to create a bundle."));
-	return !!create_bundle(the_repository, bundle_file, argc, argv, &pack_opts);
+	return !!create_bundle(the_repository, bundle_file, argc, argv, &pack_opts, version);
 }
 
 static int cmd_bundle_verify(int argc, const char **argv, const char *prefix) {
diff --git a/bundle.c b/bundle.c
index 2a0d744d3f..35585f237c 100644
--- a/bundle.c
+++ b/bundle.c
@@ -12,7 +12,16 @@
 #include "refs.h"
 #include "argv-array.h"
 
-static const char bundle_signature[] = "# v2 git bundle\n";
+
+static const char v2_bundle_signature[] = "# v2 git bundle\n";
+static const char v3_bundle_signature[] = "# v3 git bundle\n";
+static struct {
+	int version;
+	const char *signature;
+} bundle_sigs[] = {
+	{ 2, v2_bundle_signature },
+	{ 3, v3_bundle_signature },
+};
 
 static void add_to_ref_list(const struct object_id *oid, const char *name,
 		struct ref_list *list)
@@ -23,15 +32,30 @@ static void add_to_ref_list(const struct object_id *oid, const char *name,
 	list->nr++;
 }
 
-static const struct git_hash_algo *detect_hash_algo(struct strbuf *buf)
+static int parse_capability(struct bundle_header *header, const char *capability)
 {
-	size_t len = strcspn(buf->buf, " \n");
-	int algo;
+	const char *arg;
+	if (skip_prefix(capability, "object-format=", &arg)) {
+		int algo = hash_algo_by_name(arg);
+		if (algo == GIT_HASH_UNKNOWN)
+			return error(_("unrecognized bundle hash algorithm: %s"), arg);
+		header->hash_algo = &hash_algos[algo];
+		return 0;
+	}
+	return error(_("unknown capability '%s'"), capability);
+}
 
-	algo = hash_algo_by_length(len / 2);
-	if (algo == GIT_HASH_UNKNOWN)
-		return NULL;
-	return &hash_algos[algo];
+static int parse_bundle_signature(struct bundle_header *header, const char *line)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(bundle_sigs); i++) {
+		if (!strcmp(line, bundle_sigs[i].signature)) {
+			header->version = bundle_sigs[i].version;
+			return 0;
+		}
+	}
+	return -1;
 }
 
 static int parse_bundle_header(int fd, struct bundle_header *header,
@@ -42,14 +66,16 @@ static int parse_bundle_header(int fd, struct bundle_header *header,
 
 	/* The bundle header begins with the signature */
 	if (strbuf_getwholeline_fd(&buf, fd, '\n') ||
-	    strcmp(buf.buf, bundle_signature)) {
+	    parse_bundle_signature(header, buf.buf)) {
 		if (report_path)
-			error(_("'%s' does not look like a v2 bundle file"),
+			error(_("'%s' does not look like a v2 or v3 bundle file"),
 			      report_path);
 		status = -1;
 		goto abort;
 	}
 
+	header->hash_algo = the_hash_algo;
+
 	/* The bundle header ends with an empty line */
 	while (!strbuf_getwholeline_fd(&buf, fd, '\n') &&
 	       buf.len && buf.buf[0] != '\n') {
@@ -57,19 +83,19 @@ static int parse_bundle_header(int fd, struct bundle_header *header,
 		int is_prereq = 0;
 		const char *p;
 
-		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"));
+		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);
 		}
 
 		/*
@@ -449,13 +475,14 @@ static int write_bundle_refs(int bundle_fd, struct rev_info *revs)
 }
 
 int create_bundle(struct repository *r, const char *path,
-		  int argc, const char **argv, struct argv_array *pack_options)
+		  int argc, const char **argv, struct argv_array *pack_options, int version)
 {
 	struct lock_file lock = LOCK_INIT;
 	int bundle_fd = -1;
 	int bundle_to_stdout;
 	int ref_count = 0;
 	struct rev_info revs;
+	int min_version = the_hash_algo == &hash_algos[GIT_HASH_SHA1] ? 2 : 3;
 
 	bundle_to_stdout = !strcmp(path, "-");
 	if (bundle_to_stdout)
@@ -464,8 +491,22 @@ int create_bundle(struct repository *r, const char *path,
 		bundle_fd = hold_lock_file_for_update(&lock, path,
 						      LOCK_DIE_ON_ERROR);
 
-	/* write signature */
-	write_or_die(bundle_fd, bundle_signature, strlen(bundle_signature));
+	if (version == -1)
+		version = min_version;
+
+	if (version < 2 || version > 3) {
+		die(_("unsupported bundle version %d"), 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));
+	} else {
+		const char *capability = "@object-format=";
+		write_or_die(bundle_fd, v3_bundle_signature, strlen(v3_bundle_signature));
+		write_or_die(bundle_fd, capability, strlen(capability));
+		write_or_die(bundle_fd, the_hash_algo->name, strlen(the_hash_algo->name));
+		write_or_die(bundle_fd, "\n", 1);
+	}
 
 	/* init revs to list objects for pack-objects later */
 	save_commit_buffer = 0;
diff --git a/bundle.h b/bundle.h
index 2dc9442024..70c84cab08 100644
--- a/bundle.h
+++ b/bundle.h
@@ -13,6 +13,7 @@ struct ref_list {
 };
 
 struct bundle_header {
+	unsigned version;
 	struct ref_list prerequisites;
 	struct ref_list references;
 	const struct git_hash_algo *hash_algo;
@@ -21,7 +22,8 @@ struct bundle_header {
 int is_bundle(const char *path, int quiet);
 int read_bundle_header(const char *path, struct bundle_header *header);
 int create_bundle(struct repository *r, const char *path,
-		  int argc, const char **argv, struct argv_array *pack_options);
+		  int argc, const char **argv, struct argv_array *pack_options,
+		  int version);
 int verify_bundle(struct repository *r, struct bundle_header *header, int verbose);
 #define BUNDLE_VERBOSE 1
 int unbundle(struct repository *r, struct bundle_header *header,
diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh
index a66dbe0bde..9243335ab0 100755
--- a/t/t5510-fetch.sh
+++ b/t/t5510-fetch.sh
@@ -281,15 +281,19 @@ test_expect_success 'create bundle 1' '
 	cd "$D" &&
 	echo >file updated again by origin &&
 	git commit -a -m "tip" &&
-	git bundle create bundle1 master^..master
+	git bundle create --version=3 bundle1 master^..master
 '
 
 test_expect_success 'header of bundle looks right' '
-	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 " &&
-	head -n 4 "$D"/bundle1 | grep "^$"
+	cat >expect <<-EOF &&
+	# v3 git bundle
+	@object-format=$(test_oid algo)
+	-OID updated by origin
+	OID refs/heads/master
+
+	EOF
+	sed -e "s/$OID_REGEX/OID/g" -e "5q" "$D"/bundle1 >actual &&
+	test_cmp expect actual
 '
 
 test_expect_success 'create bundle 2' '
diff --git a/t/t5607-clone-bundle.sh b/t/t5607-clone-bundle.sh
index 6d5a977fcb..26985f4b44 100755
--- a/t/t5607-clone-bundle.sh
+++ b/t/t5607-clone-bundle.sh
@@ -4,6 +4,10 @@ test_description='some bundle related tests'
 . ./test-lib.sh
 
 test_expect_success 'setup' '
+	test_oid_cache <<-EOF &&
+	version sha1:2
+	version sha256:3
+	EOF
 	test_commit initial &&
 	test_tick &&
 	git tag -m tag tag &&
@@ -94,4 +98,31 @@ test_expect_success 'fetch SHA-1 from bundle' '
 	git fetch --no-tags foo/tip.bundle "$(cat hash)"
 '
 
+test_expect_success 'git bundle uses expected default format' '
+	git bundle create bundle HEAD^.. &&
+	head -n1 bundle | grep "^# v$(test_oid version) git bundle$"
+'
+
+test_expect_success 'git bundle v3 has expected contents' '
+	git branch side HEAD &&
+	git bundle create --version=3 bundle HEAD^..side &&
+	head -n2 bundle >actual &&
+	cat >expect <<-EOF &&
+	# v3 git bundle
+	@object-format=$(test_oid algo)
+	EOF
+	test_cmp expect actual &&
+	git bundle verify bundle
+'
+
+test_expect_success 'git bundle v3 rejects unknown capabilities' '
+	cat >new <<-EOF &&
+	# v3 git bundle
+	@object-format=$(test_oid algo)
+	@unknown=silly
+	EOF
+	test_must_fail git bundle verify new 2>output &&
+	test_i18ngrep "unknown capability .unknown=silly." output
+'
+
 test_done

  parent reply	other threads:[~2020-07-29 23:15 UTC|newest]

Thread overview: 116+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-28 23:34 [PATCH v5 00/39] SHA-256, part 3/3 brian m. carlson
2020-07-28 23:34 ` [PATCH v5 01/39] t: make test-bloom initialize repository brian m. carlson
2020-07-28 23:34 ` [PATCH v5 02/39] t1001: use $ZERO_OID brian m. carlson
2020-07-28 23:34 ` [PATCH v5 03/39] t3305: make hash agnostic brian m. carlson
2020-07-28 23:34 ` [PATCH v5 04/39] t3404: prepare 'short SHA-1 collision' tests for SHA-256 brian m. carlson
2020-07-28 23:34 ` [PATCH v5 05/39] t6100: make hash size independent brian m. carlson
2020-07-28 23:34 ` [PATCH v5 06/39] t6101: " brian m. carlson
2020-07-28 23:34 ` [PATCH v5 07/39] t6301: " brian m. carlson
2020-07-28 23:34 ` [PATCH v5 08/39] t6500: specify test values for SHA-256 brian m. carlson
2020-07-28 23:34 ` [PATCH v5 09/39] t6501: avoid hard-coded objects brian m. carlson
2020-07-28 23:34 ` [PATCH v5 10/39] t7003: compute appropriate length constant brian m. carlson
2020-07-28 23:34 ` [PATCH v5 11/39] t7063: make hash size independent brian m. carlson
2020-07-28 23:34 ` [PATCH v5 12/39] t7201: abstract away SHA-1-specific constants brian m. carlson
2020-07-28 23:34 ` [PATCH v5 13/39] t7102: " brian m. carlson
2020-07-28 23:34 ` [PATCH v5 14/39] t7400: make hash size independent brian m. carlson
2020-07-28 23:34 ` [PATCH v5 15/39] t7405: " brian m. carlson
2020-07-28 23:34 ` [PATCH v5 16/39] t7506: avoid checking for SHA-1-specific constants brian m. carlson
2020-07-28 23:34 ` [PATCH v5 17/39] t7508: use $ZERO_OID instead of hard-coded constant brian m. carlson
2020-07-28 23:34 ` [PATCH v5 18/39] t8002: make hash size independent brian m. carlson
2020-07-29  2:24   ` Eric Sunshine
2020-07-29 22:31     ` brian m. carlson
2020-07-28 23:34 ` [PATCH v5 19/39] t8003: " brian m. carlson
2020-07-28 23:34 ` [PATCH v5 20/39] t8011: " brian m. carlson
2020-07-28 23:34 ` [PATCH v5 21/39] t9300: abstract away SHA-1-specific constants brian m. carlson
2020-07-28 23:34 ` [PATCH v5 22/39] t9300: use $ZERO_OID instead of hard-coded object ID brian m. carlson
2020-07-28 23:34 ` [PATCH v5 23/39] t9301: make hash size independent brian m. carlson
2020-07-28 23:34 ` [PATCH v5 24/39] t9350: " brian m. carlson
2020-07-28 23:34 ` [PATCH v5 25/39] t9500: ensure that algorithm info is preserved in config brian m. carlson
2020-07-28 23:34 ` [PATCH v5 26/39] t9700: make hash size independent brian m. carlson
2020-07-28 23:34 ` [PATCH v5 27/39] t5308: make test work with SHA-256 brian m. carlson
2020-07-28 23:34 ` [PATCH v5 28/39] t0410: mark test with SHA1 prerequisite brian m. carlson
2020-07-28 23:34 ` [PATCH v5 29/39] http-fetch: set up git directory before parsing pack hashes brian m. carlson
2020-07-29  2:36   ` Eric Sunshine
2020-07-28 23:34 ` [PATCH v5 30/39] builtin/verify-pack: implement an --object-format option brian m. carlson
2020-07-28 23:34 ` [PATCH v5 31/39] bundle: add new version for use with SHA-256 brian m. carlson
2020-07-29  2:53   ` Eric Sunshine
2020-07-29 22:28     ` brian m. carlson
2020-07-28 23:34 ` [PATCH v5 32/39] setup: add support for reading extensions.objectformat brian m. carlson
2020-07-28 23:34 ` [PATCH v5 33/39] Enable SHA-256 support by default brian m. carlson
2020-07-29  2:57   ` Eric Sunshine
2020-07-28 23:34 ` [PATCH v5 34/39] t: add test_oid option to select hash algorithm brian m. carlson
2020-07-28 23:34 ` [PATCH v5 35/39] t: allow testing different hash algorithms via environment brian m. carlson
2020-07-28 23:34 ` [PATCH v5 36/39] t: make SHA1 prerequisite depend on default hash brian m. carlson
2020-07-29  3:01   ` Eric Sunshine
2020-07-28 23:34 ` [PATCH v5 37/39] ci: run tests with SHA-256 brian m. carlson
2020-07-28 23:34 ` [PATCH v5 38/39] docs: add documentation for extensions.objectFormat brian m. carlson
2020-07-28 23:34 ` [PATCH v5 39/39] t: remove test_oid_init in tests brian m. carlson
2020-07-29 23:13 ` [PATCH v6 00/39] SHA-256, part 3/3 brian m. carlson
2020-07-29 23:13   ` [PATCH v6 01/39] t: make test-bloom initialize repository brian m. carlson
2020-07-29 23:13   ` [PATCH v6 02/39] t1001: use $ZERO_OID brian m. carlson
2020-07-29 23:13   ` [PATCH v6 03/39] t3305: make hash agnostic brian m. carlson
2020-07-29 23:13   ` [PATCH v6 04/39] t3404: prepare 'short SHA-1 collision' tests for SHA-256 brian m. carlson
2020-07-29 23:13   ` [PATCH v6 05/39] t6100: make hash size independent brian m. carlson
2020-07-29 23:13   ` [PATCH v6 06/39] t6101: " brian m. carlson
2020-07-29 23:13   ` [PATCH v6 07/39] t6301: " brian m. carlson
2020-07-29 23:13   ` [PATCH v6 08/39] t6500: specify test values for SHA-256 brian m. carlson
2020-07-29 23:13   ` [PATCH v6 09/39] t6501: avoid hard-coded objects brian m. carlson
2020-07-29 23:13   ` [PATCH v6 10/39] t7003: compute appropriate length constant brian m. carlson
2020-07-29 23:14   ` [PATCH v6 11/39] t7063: make hash size independent brian m. carlson
2020-07-29 23:14   ` [PATCH v6 12/39] t7201: abstract away SHA-1-specific constants brian m. carlson
2020-07-29 23:14   ` [PATCH v6 13/39] t7102: " brian m. carlson
2020-07-29 23:14   ` [PATCH v6 14/39] t7400: make hash size independent brian m. carlson
2020-07-29 23:14   ` [PATCH v6 15/39] t7405: " brian m. carlson
2020-07-29 23:14   ` [PATCH v6 16/39] t7506: avoid checking for SHA-1-specific constants brian m. carlson
2020-07-29 23:14   ` [PATCH v6 17/39] t7508: use $ZERO_OID instead of hard-coded constant brian m. carlson
2020-07-29 23:14   ` [PATCH v6 18/39] t8002: make hash size independent brian m. carlson
2020-07-29 23:14   ` [PATCH v6 19/39] t8003: " brian m. carlson
2020-07-29 23:14   ` [PATCH v6 20/39] t8011: " brian m. carlson
2020-07-29 23:14   ` [PATCH v6 21/39] t9300: abstract away SHA-1-specific constants brian m. carlson
2020-07-29 23:14   ` [PATCH v6 22/39] t9300: use $ZERO_OID instead of hard-coded object ID brian m. carlson
2020-07-29 23:14   ` [PATCH v6 23/39] t9301: make hash size independent brian m. carlson
2020-07-29 23:14   ` [PATCH v6 24/39] t9350: " brian m. carlson
2020-07-29 23:14   ` [PATCH v6 25/39] t9500: ensure that algorithm info is preserved in config brian m. carlson
2020-07-29 23:14   ` [PATCH v6 26/39] t9700: make hash size independent brian m. carlson
2020-07-29 23:14   ` [PATCH v6 27/39] t5308: make test work with SHA-256 brian m. carlson
2020-07-29 23:14   ` [PATCH v6 28/39] t0410: mark test with SHA1 prerequisite brian m. carlson
2020-07-29 23:14   ` [PATCH v6 29/39] http-fetch: set up git directory before parsing pack hashes brian m. carlson
2020-07-29 23:14   ` [PATCH v6 30/39] builtin/verify-pack: implement an --object-format option brian m. carlson
2020-07-29 23:14   ` brian m. carlson [this message]
2020-07-29 23:14   ` [PATCH v6 32/39] setup: add support for reading extensions.objectformat brian m. carlson
2020-07-29 23:14   ` [PATCH v6 33/39] repository: enable SHA-256 support by default brian m. carlson
2020-07-29 23:14   ` [PATCH v6 34/39] t: add test_oid option to select hash algorithm brian m. carlson
2020-07-29 23:14   ` [PATCH v6 35/39] t: allow testing different hash algorithms via environment brian m. carlson
2020-07-29 23:14   ` [PATCH v6 36/39] t: make SHA1 prerequisite depend on default hash brian m. carlson
2020-07-29 23:14   ` [PATCH v6 37/39] ci: run tests with SHA-256 brian m. carlson
2020-07-29 23:14   ` [PATCH v6 38/39] docs: add documentation for extensions.objectFormat brian m. carlson
2020-07-29 23:14   ` [PATCH v6 39/39] t: remove test_oid_init in tests brian m. carlson
2020-07-30  2:48   ` [PATCH v6 00/39] SHA-256, part 3/3 Eric Sunshine
2020-07-30 16:18     ` Junio C Hamano
2021-03-10 12:04   ` Ævar Arnfjörð Bjarmason
2021-03-10 16:36     ` Elijah Newren
2021-03-10 17:08       ` Jeff King
2021-03-10 17:06     ` [PATCH 0/3] sha256 fixes for filter-branch Jeff King
2021-03-10 17:07       ` [PATCH 1/3] t7003: test ref rewriting explicitly Jeff King
2021-03-11  0:10         ` Ævar Arnfjörð Bjarmason
2021-03-11  1:55           ` brian m. carlson
2021-03-11  2:24             ` Jeff King
2021-03-11  2:49               ` brian m. carlson
2021-03-10 17:07       ` [PATCH 2/3] filter-branch: drop multiple-ancestor warning Jeff King
2021-03-10 22:16         ` Junio C Hamano
2021-03-10 17:07       ` [PATCH 3/3] filter-branch: drop $_x40 glob Jeff King
2021-03-10 22:23         ` Junio C Hamano
2021-03-11  0:14         ` [PATCH 0/4] bisect + tests: remove old $_x05, $_x35 and $_x40 variables Ævar Arnfjörð Bjarmason
2021-03-11  0:14         ` [PATCH 1/4] git-bisect: remove unused SHA-1 $x40 shell variable Ævar Arnfjörð Bjarmason
2021-03-11  0:14         ` [PATCH 2/4] test-lib: remove unused $_x40 and $_z40 variables Ævar Arnfjörð Bjarmason
2021-03-11  1:02           ` Junio C Hamano
2021-03-11  0:14         ` [PATCH 3/4] shortlog tests: rewrite to get rid of --abbrev=35 hardcoding Ævar Arnfjörð Bjarmason
2021-03-11  1:18           ` Junio C Hamano
2021-03-11 19:15           ` Jeff King
2021-03-11  0:14         ` [PATCH 4/4] tests: get rid of $_x05 from the test suite Ævar Arnfjörð Bjarmason
2021-03-11  1:23           ` Junio C Hamano
2021-03-11 10:29             ` Ævar Arnfjörð Bjarmason
2021-03-11 17:40               ` Junio C Hamano
2021-03-10 17:54       ` [PATCH 0/3] sha256 fixes for filter-branch Elijah Newren
2021-03-10 22:24         ` Junio C Hamano
2021-03-10 23:32       ` brian m. carlson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200729231428.3658647-32-sandals@crustytoothpaste.net \
    --to=sandals@crustytoothpaste.net \
    --cc=git@vger.kernel.org \
    --cc=sunshine@sunshineco.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.