[03/15] rev-parse: add an --object-format option
diff mbox series

Message ID 20191005211209.18237-4-sandals@crustytoothpaste.net
State New
Headers show
Series
  • SHA-256 test fixes, part 6
Related show

Commit Message

brian m. carlson Oct. 5, 2019, 9:11 p.m. UTC
Add an option to print the object format used for input, output, or
storage. This allows shell scripts to discover the hash algorithm in
use.

Since the transition plan allows for multiple input algorithms, document
that we may provide multiple results for input, and the format that the
results may take. While we don't support this now, documenting it early
means that script authors can future-proof their scripts for when we do.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
---
 Documentation/git-rev-parse.txt |  7 +++++++
 builtin/rev-parse.c             | 11 +++++++++++
 t/t1500-rev-parse.sh            | 15 +++++++++++++++
 3 files changed, 33 insertions(+)

Comments

Derrick Stolee Oct. 8, 2019, 11:51 a.m. UTC | #1
On 10/5/2019 5:11 PM, brian m. carlson wrote:
> Add an option to print the object format used for input, output, or
> storage. This allows shell scripts to discover the hash algorithm in
> use.

Why put this in 'rev-parse'? Is a test helper not an option for this?

-Stolee
brian m. carlson Oct. 8, 2019, 7:31 p.m. UTC | #2
On 2019-10-08 at 11:51:45, Derrick Stolee wrote:
> On 10/5/2019 5:11 PM, brian m. carlson wrote:
> > Add an option to print the object format used for input, output, or
> > storage. This allows shell scripts to discover the hash algorithm in
> > use.
> 
> Why put this in 'rev-parse'? Is a test helper not an option for this?

We do have a test helper for this, which is the first patch in the
series.  This rev-parse option is designed to be useful to scripters
more than anything else, and it will make an appearance in a later
series.

I sent it here since it's vaguely useful for tests and I also wanted to
make sure it was available sooner rather than later so folks can start
using it.

Patch
diff mbox series

diff --git a/Documentation/git-rev-parse.txt b/Documentation/git-rev-parse.txt
index e72d332b83..8a72190940 100644
--- a/Documentation/git-rev-parse.txt
+++ b/Documentation/git-rev-parse.txt
@@ -274,6 +274,13 @@  print a message to stderr and exit with nonzero status.
 	Show the path to the shared index file in split index mode, or
 	empty if not in split-index mode.
 
+--object-format[=(storage|input|output)]::
+	Show the object format (hash algorithm) used for the repository
+	for storage inside the `.git` directory, input, or output. For
+	input, multiple algorithms may be printed, space-separated.
+	If not specified, the default is "storage".
+
+
 Other Options
 ~~~~~~~~~~~~~
 
diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c
index f8bbe6d47e..8036219921 100644
--- a/builtin/rev-parse.c
+++ b/builtin/rev-parse.c
@@ -918,6 +918,17 @@  int cmd_rev_parse(int argc, const char **argv, const char *prefix)
 				show_datestring("--min-age=", arg);
 				continue;
 			}
+			if (opt_with_value(arg, "--object-format", &arg)) {
+				const char *val = arg ? arg : "storage";
+
+				if (strcmp(val, "storage") &&
+				    strcmp(val, "input") &&
+				    strcmp(val, "output"))
+					die("unknown mode for --object-format: %s",
+					    arg);
+				puts(the_hash_algo->name);
+				continue;
+			}
 			if (show_flag(arg) && verify)
 				die_no_single_rev(quiet);
 			continue;
diff --git a/t/t1500-rev-parse.sh b/t/t1500-rev-parse.sh
index 01abee533d..fb3d81df4c 100755
--- a/t/t1500-rev-parse.sh
+++ b/t/t1500-rev-parse.sh
@@ -59,6 +59,7 @@  test_rev_parse () {
 ROOT=$(pwd)
 
 test_expect_success 'setup' '
+	test_oid_init &&
 	mkdir -p sub/dir work &&
 	cp -R .git repo.git
 '
@@ -131,6 +132,20 @@  test_expect_success 'rev-parse --is-shallow-repository in non-shallow repo' '
 	test_cmp expect actual
 '
 
+test_expect_success 'rev-parse --object-format in repo' '
+	echo "$(test_oid algo)" >expect &&
+	git rev-parse --object-format >actual &&
+	test_cmp expect actual &&
+	git rev-parse --object-format=storage >actual &&
+	test_cmp expect actual &&
+	git rev-parse --object-format=input >actual &&
+	test_cmp expect actual &&
+	git rev-parse --object-format=output >actual &&
+	test_cmp expect actual &&
+	test_must_fail git rev-parse --object-format=squeamish-ossifrage 2>err &&
+	grep "unknown mode for --object-format: squeamish-ossifrage" err
+'
+
 test_expect_success 'showing the superproject correctly' '
 	git rev-parse --show-superproject-working-tree >out &&
 	test_must_be_empty out &&