Git development
 help / color / mirror / Atom feed
From: "Srujith A Poojary via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Okhuomon Ajayi <okhuomonajayi54@gmail.com>,
	Srujith A Poojary <poojarysrujith@gmail.com>,
	Srujith A Poojary <poojarysrujith@gmail.com>
Subject: [PATCH v5] submodule: use the submodule repository to abbreviate commits
Date: Wed, 04 Nov 2026 03:43:01 +0000	[thread overview]
Message-ID: <pull.2288.v5.git.1793763781129.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.2288.git.1793435149942.gitgitgadget@gmail.com>

From: Srujith A Poojary <poojarysrujith@gmail.com>

The commit IDs shown in a submodule diff header belong to the
submodule's object database. However, strbuf_add_unique_abbrev()
uses the_repository, so it checks the superproject's object
database when abbreviating those IDs.

Use the submodule repository when it is available, and fall back
to the repository from the diff options when it is not.

The expected abbreviation for a submodule commit depends on the
repository's hash algorithm. Use test_oid_cache to provide the
expected value for each algorithm and remove the SHA1 prerequisite
so this test runs with both SHA-1 and SHA-256.

Signed-off-by: Srujith A Poojary <poojarysrujith@gmail.com>
---
    [Outreachy PATCH] t4041: use submodule repository for commit
    abbreviations

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-2288%2Fpoojarysrujith%2Fmicroproject-git-libification-v5
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-2288/poojarysrujith/microproject-git-libification-v5
Pull-Request: https://github.com/gitgitgadget/git/pull/2288

Range-diff vs v4:

 1:  a8c54b9292 ! 1:  f94aa2476f submodule: use the submodule repository to abbreviate commits
     @@ Commit message
          Use the submodule repository when it is available, and fall back
          to the repository from the diff options when it is not.
      
     +    The expected abbreviation for a submodule commit depends on the
     +    repository's hash algorithm. Use test_oid_cache to provide the
     +    expected value for each algorithm and remove the SHA1 prerequisite
     +    so this test runs with both SHA-1 and SHA-256.
     +
          Signed-off-by: Srujith A Poojary <poojarysrujith@gmail.com>
      
       ## submodule.c ##
     @@ t/t4041-diff-submodule-option.sh: export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
       
       . ./test-lib.sh
       
     -+test_expect_success SHA1 'submodule commit abbreviation uses submodule object database' '
     ++test_expect_success 'submodule commit abbreviation uses submodule object database' '
     ++	test_oid_cache <<-EOF &&
     ++	submodule_commit1_abbrev sha1:0000000000e
     ++	submodule_commit1_abbrev sha256:24c81a5
     ++	EOF
      +	test_when_finished "rm -rf collision-super" &&
      +	git init -q collision-super &&
      +	git init -q collision-super/sm1 &&
     @@ t/t4041-diff-submodule-option.sh: export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
      +	git -C collision-super update-index --add --cacheinfo 160000,"$commit1",sm1 &&
      +	git -C collision-super commit -q -m "Add submodule" &&
      +	git -C collision-super diff --submodule=log >actual &&
     -+	printf "Submodule sm1 0000000000e..%s:\n  > child\n" \
     ++	printf "Submodule sm1 %s..%s:\n  > child\n" \
     ++		"$(test_oid submodule_commit1_abbrev)" \
      +		"$(git -C collision-super/sm1 rev-parse --short "$commit2")" >expected &&
      +	test_cmp expected actual
      +'
 2:  99a1234544 < -:  ---------- t4041: test SHA-256 submodule abbreviations


 submodule.c                      |  5 +++--
 t/t4041-diff-submodule-option.sh | 23 +++++++++++++++++++++++
 2 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/submodule.c b/submodule.c
index 6fcb606f7e..1302c11ddf 100644
--- a/submodule.c
+++ b/submodule.c
@@ -543,6 +543,7 @@ static void show_submodule_header(struct diff_options *o,
 		struct commit **left, struct commit **right,
 		struct commit_list **merge_bases)
 {
+	struct repository *repo = sub ? sub : o->repo;
 	const char *message = NULL;
 	struct strbuf sb = STRBUF_INIT;
 	int fast_forward = 0, fast_backward = 0;
@@ -599,9 +600,9 @@ static void show_submodule_header(struct diff_options *o,
 
 output_header:
 	strbuf_addf(&sb, "Submodule %s ", path);
-	strbuf_add_unique_abbrev(&sb, one, DEFAULT_ABBREV);
+	strbuf_repo_add_unique_abbrev(&sb, repo, one, DEFAULT_ABBREV);
 	strbuf_addstr(&sb, (fast_backward || fast_forward) ? ".." : "...");
-	strbuf_add_unique_abbrev(&sb, two, DEFAULT_ABBREV);
+	strbuf_repo_add_unique_abbrev(&sb, repo, two, DEFAULT_ABBREV);
 	if (message)
 		strbuf_addf(&sb, " %s\n", message);
 	else
diff --git a/t/t4041-diff-submodule-option.sh b/t/t4041-diff-submodule-option.sh
index 4dd4954260..4539d6bba5 100755
--- a/t/t4041-diff-submodule-option.sh
+++ b/t/t4041-diff-submodule-option.sh
@@ -14,6 +14,29 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
 . ./test-lib.sh
 
+test_expect_success 'submodule commit abbreviation uses submodule object database' '
+	test_oid_cache <<-EOF &&
+	submodule_commit1_abbrev sha1:0000000000e
+	submodule_commit1_abbrev sha256:24c81a5
+	EOF
+	test_when_finished "rm -rf collision-super" &&
+	git init -q collision-super &&
+	git init -q collision-super/sm1 &&
+	printf "0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n\nb1rwzyc3\n" >collision-super/sm1/a0blgqsjc &&
+	git -C collision-super/sm1 add a0blgqsjc &&
+	tree=$(git -C collision-super/sm1 write-tree) &&
+	commit1=$(GIT_AUTHOR_DATE="1112911993 -0700" GIT_COMMITTER_DATE="1112911993 -0700" git -C collision-super/sm1 commit-tree "$tree" -m a2onsxbvj) &&
+	commit2=$(printf "child\n" | GIT_AUTHOR_DATE="1112912053 -0700" GIT_COMMITTER_DATE="1112912053 -0700" git -C collision-super/sm1 commit-tree "$tree" -p "$commit1") &&
+	git -C collision-super/sm1 checkout -q "$commit2" &&
+	git -C collision-super update-index --add --cacheinfo 160000,"$commit1",sm1 &&
+	git -C collision-super commit -q -m "Add submodule" &&
+	git -C collision-super diff --submodule=log >actual &&
+	printf "Submodule sm1 %s..%s:\n  > child\n" \
+		"$(test_oid submodule_commit1_abbrev)" \
+		"$(git -C collision-super/sm1 rev-parse --short "$commit2")" >expected &&
+	test_cmp expected actual
+'
+
 # Test non-UTF-8 encoding in case iconv is available.
 if test_have_prereq ICONV
 then

base-commit: 50fe5cc63f9cd6e89b87a2c9ccf96a444f4cfdb7
-- 
gitgitgadget

  parent reply	other threads:[~2026-11-04  3:43 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-31  8:25 [PATCH] [Outreachy PATCH] t4041: use submodule repository for commit abbreviations Srujith A Poojary via GitGitGadget
2026-10-31 16:46 ` Okhuomon Ajayi
2026-10-31 19:08   ` Srujith Poojary
2026-10-31 18:57 ` [PATCH v2] Submodule: use the submodule repository to abbreviate commits Srujith A Poojary via GitGitGadget
2026-10-31 19:09   ` Okhuomon Ajayi
2026-10-31 19:37     ` Srujith Poojary
2026-10-31 19:24 ` [PATCH v3] submodule: " Srujith A Poojary via GitGitGadget
2026-11-01 21:45   ` Junio C Hamano
2026-11-02 19:40 ` [PATCH v4 0/2] [Outreachy PATCH] t4041: use submodule repository for commit abbreviations Srujith A Poojary via GitGitGadget
2026-11-02 19:40   ` [PATCH v4 1/2] submodule: use the submodule repository to abbreviate commits Srujith A Poojary via GitGitGadget
2026-11-02 19:49     ` Srujith Poojary
2026-11-02 19:40   ` [PATCH v4 2/2] t4041: test SHA-256 submodule abbreviations Srujith A Poojary via GitGitGadget
2026-11-03 17:31     ` Junio C Hamano
2026-11-04  3:58       ` Srujith Poojary
2026-11-03 17:27   ` [PATCH v4 0/2] [Outreachy PATCH] t4041: use submodule repository for commit abbreviations Junio C Hamano
2026-11-04  3:43 ` Srujith A Poojary via GitGitGadget [this message]
2026-11-04 14:38   ` [PATCH v5] submodule: use the submodule repository to abbreviate commits Junio C Hamano
2026-11-04 19:45 ` [PATCH v6] " Srujith A Poojary via GitGitGadget

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=pull.2288.v5.git.1793763781129.gitgitgadget@gmail.com \
    --to=gitgitgadget@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=okhuomonajayi54@gmail.com \
    --cc=poojarysrujith@gmail.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox