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

Re* [PATCH v2] show-index: fix uninitialized hash function

From
Junio C Hamano <gitster@pobox.com>
Date
Jul 15, 2024, 16:22 UTC
Message-ID
<xmqqzfqi4oc6.fsf_-_@gitster.g>
In-Reply-To
<20240715102344.182388-1-abhijeet.nkt@gmail.com>
Abhijeet Sonar <abhijeet.nkt@gmail.com> writes:
>  t/t8101-show-index-hash-function.sh | 15 +++++++++++++++
>  2 files changed, 18 insertions(+)
>  create mode 100755 t/t8101-show-index-hash-function.sh

Thanks. But let's not waste the scarce resource that is a test number for a single oddball test (and as t/README says t8xxx series is for forensics Porcelains).

> +test_expect_success 'show-index: should not fail outside a repository' '
> +    git init --object-format=sha1 && (
> +        echo "" | git hash-object -w --stdin | git pack-objects test &&

Our tests run in an already initialized repository, and some test configuration would use sha256 to initialize that repository. So the above is not a good idea, unless you use a new directory. We often create a new directory inside the initial directory the test begins in, and then in a subshell chdir into the directory.

We frown upon a pipeline that has "git" as an upstream, because the exit status from such invocation of "git" will be hidden.

	git init --object-format=sha1 sample &&
	(
		cd sample &&
		O=$(git hash-object -w /dev/null) &&
		T=$(echo "$O" | git pack-objects test) &&

would give you a pair of files "test-$T.idx" and "test-$T.pack" and it will notice if hash-object or pack-objects fail.

> +        rm -rf .git &&

This alone does *not* necessarily make the directory you are using for test completely unassociated with any repository. If you are working with the source code of Git from a repository (as opposed to extracted tar archive), with that "rm -fr", you may have made the directory not a Git repository, but then that directory is now a mere subdirectory "t/trash directory.t8101-show-index-hash-function" of the repository that houses the Git source code (unless you are using the --root=<directory> option to run the tests).

When we test behaviour of commands outside a repository, we use the GIT_CEILING_DIRECTORIES feature, often via the nongit helper function that is defined in t/test-lib-functions.sh (which becomes available to tests by doing ". ./test-lib.sh".

In t5300-pack-object.sh we see these bits already.
    test_expect_success 'index-pack --stdin complains of non-repo' '
            nongit test_must_fail git index-pack \
                    --object-format=$(test_oid algo) --stdin <foo.pack &&
            test_path_is_missing non-repo/.git
    '
    test_expect_success 'index-pack <pack> works in non-repo' '
            nongit git index-pack \
                    --object-format=$(test_oid algo) ../foo.pack &&
            test_path_is_file foo.idx
    '

I wonder if it is sufficient to add a new test after these two steps, something like

    test_expect_success SHA1 'show-index works OK outside a repository' '
	    nongit git show-index <foo.idx
    '
perhaps?
With that, your patch would become like so:
------------ >8 ----------------------- >8 ------------
From: Abhijeet Sonar <abhijeet.nkt@gmail.com>
Date: Mon, 15 Jul 2024 15:53:43 +0530
Subject: [PATCH] show-index: fix uninitialized hash function

As stated in the docs, show-index should use SHA1 as the default hash algorithm when run outside a repository.

However, 'the_hash_algo' is left uninitialized if we are not in a repository and no explicit hash function is specified, causing a crash.

Fix it by falling back to SHA1 when it is found uninitialized. Also add test that verifies this behaviour.

Signed-off-by: Abhijeet Sonar <abhijeet.nkt@gmail.com>
[jc: fixed up the test]
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 builtin/show-index.c   | 3 +++
 t/t5300-pack-object.sh | 4 ++++
 2 files changed, 7 insertions(+)
diff --git a/builtin/show-index.c b/builtin/show-index.c
index 540dc3dad1..bb6d9e3c40 100644
--- a/builtin/show-index.c
+++ b/builtin/show-index.c
@@ -35,6 +35,9 @@ int cmd_show_index(int argc, const char **argv, const char *prefix)
 		repo_set_hash_algo(the_repository, hash_algo);
 	}
 
+	if (!the_hash_algo)
+		repo_set_hash_algo(the_repository, GIT_HASH_SHA1);
+
 	hashsz = the_hash_algo->rawsz;
 
 	if (fread(top_index, 2 * 4, 1, stdin) != 1)
diff --git a/t/t5300-pack-object.sh b/t/t5300-pack-object.sh
index 4ad023c846..83933eca5d 100755
--- a/t/t5300-pack-object.sh
+++ b/t/t5300-pack-object.sh
@@ -523,6 +523,10 @@ test_expect_success 'index-pack --strict <pack> works in non-repo' '
 	test_path_is_file foo.idx
 '
 
+test_expect_success SHA1 'show-index works OK outside a repository' '
+	nongit git show-index <foo.idx
+'
+
 test_expect_success !PTHREADS,!FAIL_PREREQS \
 	'index-pack --threads=N or pack.threads=N warns when no pthreads' '
 	test_must_fail git index-pack --threads=2 2>err &&
-- 
2.46.0-rc0-140-g824782812f
Previous: Abhijeet SonarNext: Abhijeet Sonar
Message 4 of 27 in “show-index: fix uninitialized hash function”
  1. show-index: fix uninitialized hash functionAbhijeet Sonar, Jul 12, 2024
  2. Junio C HamanoJul 12, 2024
  3. show-index: fix uninitialized hash functionAbhijeet Sonar, Jul 15, 2024
  4. Re* [PATCH v2] show-index: fix uninitialized hash functionJunio C Hamano, Jul 15, 2024
  5. show-index: fix uninitialized hash functionAbhijeet Sonar, Oct 26, 2024
  6. Taylor BlauOct 28, 2024
  7. Patrick SteinhardtOct 28, 2024
  8. Taylor BlauOct 28, 2024
  9. show-index: fix uninitialized hash functionAbhijeet Sonar, Nov 1, 2024
  10. Junio C HamanoNov 2, 2024
  11. Abhijeet SonarNov 2, 2024
  12. 0/2 show-index: fix uninitialized hash functionAbhijeet Sonar, Nov 4, 2024
  13. 1/2 show-index: fix uninitialized hash functionAbhijeet Sonar, Nov 4, 2024
  14. 2/2 t5300: add test for 'show-index --object-format'Abhijeet Sonar, Nov 4, 2024
  15. Junio C HamanoNov 5, 2024
  16. 0/2 show-index: fix uninitialized hash functionAbhijeet Sonar, Nov 9, 2024
  17. 1/2 show-index: fix uninitialized hash functionAbhijeet Sonar, Nov 9, 2024
  18. 2/2 t5300: add test for 'show-index --object-format'Abhijeet Sonar, Nov 9, 2024
  19. Junio C HamanoNov 11, 2024
  20. Patrick SteinhardtDec 16, 2024
  21. Junio C HamanoDec 16, 2024
  22. Abhijeet SonarOct 29, 2024
  23. Abhijeet SonarOct 29, 2024
  24. Abhijeet SonarOct 26, 2024
  25. brian m. carlsonJul 15, 2024
  26. Abhijeet SonarJul 15, 2024
  27. Eric SunshineJul 12, 2024

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.