From 28ee08caa62dcd2d262d5a7eff929dd5921b8835 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Sat, 28 Feb 2026 16:10:50 +0100 Subject: [PATCH 1/4] Make `hash_kind_from_env` public --- tests/tools/src/lib.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/tests/tools/src/lib.rs b/tests/tools/src/lib.rs index f236f8ea0..5d01e0287 100644 --- a/tests/tools/src/lib.rs +++ b/tests/tools/src/lib.rs @@ -1266,8 +1266,13 @@ where Ok((script_result_directory, res)) } -fn hash_kind_from_env() -> gix_hash::Kind { - env::var_os("GIX_TEST_FIXTURE_HASH").and_then(|value| value.into_string().ok()).map(|object_kind| { +/// Returns the hash function that is used when creating or loading test fixtures. The value +/// returned is derived from the environment variable `GIX_TEST_FIXTURE_HASH`. Use this, e. g., +/// when you need to run different assertions depending on the hash function used in a specific +/// fixture. +pub fn hash_kind_from_env() -> gix_hash::Kind { + static FIXTURE_HASH: LazyLock = LazyLock::new(|| { + env::var_os("GIX_TEST_FIXTURE_HASH").and_then(|value| value.into_string().ok()).map(|object_kind| { gix_hash::Kind::from_str(&object_kind).unwrap_or_else(|_| { panic!( "GIX_TEST_FIXTURE_HASH was set to {object_kind} which is an invalid value. Valid values are {}. Exiting.", @@ -1275,6 +1280,8 @@ fn hash_kind_from_env() -> gix_hash::Kind { ) }) }).unwrap_or_default() + }); + *FIXTURE_HASH } #[cfg(windows)] From 07f455b238d4d5e580916422ab24c338beaf32de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Sat, 28 Feb 2026 15:59:30 +0100 Subject: [PATCH 2/4] Use `GIX_TEST_FIXTURE_HASH` for `gix-refspec` --- gix-refspec/Cargo.toml | 1 + .../parse_baseline_sha256.tar | Bin 0 -> 52224 bytes gix-refspec/tests/fixtures/match_baseline.sh | 24 +++++++--- gix-refspec/tests/refspec/match_group.rs | 43 ++++++++++++------ gix-refspec/tests/refspec/spec.rs | 10 ++++ justfile | 2 + 6 files changed, 60 insertions(+), 20 deletions(-) create mode 100644 gix-refspec/tests/fixtures/generated-archives/parse_baseline_sha256.tar diff --git a/gix-refspec/Cargo.toml b/gix-refspec/Cargo.toml index f09490380..6000738ae 100644 --- a/gix-refspec/Cargo.toml +++ b/gix-refspec/Cargo.toml @@ -31,6 +31,7 @@ smallvec = "1.15.1" [dev-dependencies] gix-testtools = { path = "../tests/tools" } +gix-hash = { path = "../gix-hash", features = ["sha1", "sha256"] } insta = "1.46.3" [package.metadata.docs.rs] diff --git a/gix-refspec/tests/fixtures/generated-archives/parse_baseline_sha256.tar b/gix-refspec/tests/fixtures/generated-archives/parse_baseline_sha256.tar new file mode 100644 index 0000000000000000000000000000000000000000..947fbb4c7ae56a0131c50bf71aa3b8c156aafc47 GIT binary patch literal 52224 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 Um!WI%Y=MCV1{N6jUxR`F2a`hfyZ`_I literal 0 HcmV?d00001 diff --git a/gix-refspec/tests/fixtures/match_baseline.sh b/gix-refspec/tests/fixtures/match_baseline.sh index 74980db9d..fa1371520 100755 --- a/gix-refspec/tests/fixtures/match_baseline.sh +++ b/gix-refspec/tests/fixtures/match_baseline.sh @@ -43,12 +43,24 @@ git clone --shared ./base clone baseline "main" baseline "v0.0-f1" baseline "tags/v0.0-f2" - baseline "78b1c1be9421b33a49a7a8176d93eeeafa112da1" - baseline "9d2fab1a0ba3585d0bc50922bfdd04ebb59361df" - baseline "78b1c1be9421b33a49a7a8176d93eeeafa112da1:special" - baseline "78b1c1be9421b33a49a7a8176d93eeeafa112da1:1111111111111111111111111111111111111111" - baseline "9d2fab1a0ba3585d0bc50922bfdd04ebb59361df:tags/special" - baseline "9d2fab1a0ba3585d0bc50922bfdd04ebb59361df:refs/tags/special" + case $GIX_TEST_FIXTURE_HASH in + sha1) + baseline "78b1c1be9421b33a49a7a8176d93eeeafa112da1" + baseline "9d2fab1a0ba3585d0bc50922bfdd04ebb59361df" + baseline "78b1c1be9421b33a49a7a8176d93eeeafa112da1:special" + baseline "78b1c1be9421b33a49a7a8176d93eeeafa112da1:1111111111111111111111111111111111111111" + baseline "9d2fab1a0ba3585d0bc50922bfdd04ebb59361df:tags/special" + baseline "9d2fab1a0ba3585d0bc50922bfdd04ebb59361df:refs/tags/special" ;; + sha256) + baseline "b071221ea854da2958fba3a37527ca5cf32c4ebcd71ab0b68b6b8f10f04e93ad" + baseline "ac050883b75422e0d03bfee760c591b292cbc10cee8ad934480ea5fb2ebc44fe" + baseline "b071221ea854da2958fba3a37527ca5cf32c4ebcd71ab0b68b6b8f10f04e93ad:special" + baseline "b071221ea854da2958fba3a37527ca5cf32c4ebcd71ab0b68b6b8f10f04e93ad:1111111111111111111111111111111111111111" + baseline "ac050883b75422e0d03bfee760c591b292cbc10cee8ad934480ea5fb2ebc44fe:tags/special" + baseline "ac050883b75422e0d03bfee760c591b292cbc10cee8ad934480ea5fb2ebc44fe:refs/tags/special" ;; + *) + exit 1 ;; + esac baseline "f1:origin/f1" baseline "f1:remotes/origin/f1" baseline "f1:notes/f1" diff --git a/gix-refspec/tests/refspec/match_group.rs b/gix-refspec/tests/refspec/match_group.rs index 032dc3603..845d68d6d 100644 --- a/gix-refspec/tests/refspec/match_group.rs +++ b/gix-refspec/tests/refspec/match_group.rs @@ -1,38 +1,53 @@ mod single { use crate::matching::baseline; + fn test_hashes() -> (String, String) { + let annotated_tag = match gix_testtools::hash_kind_from_env() { + gix_hash::Kind::Sha1 => "78b1c1be9421b33a49a7a8176d93eeeafa112da1", + gix_hash::Kind::Sha256 => "b071221ea854da2958fba3a37527ca5cf32c4ebcd71ab0b68b6b8f10f04e93ad", + _ => unimplemented!(), + }; + let initial_commit = match gix_testtools::hash_kind_from_env() { + gix_hash::Kind::Sha1 => "9d2fab1a0ba3585d0bc50922bfdd04ebb59361df", + gix_hash::Kind::Sha256 => "ac050883b75422e0d03bfee760c591b292cbc10cee8ad934480ea5fb2ebc44fe", + _ => unimplemented!(), + }; + + (annotated_tag.into(), initial_commit.into()) + } + #[test] fn fetch_only() { + let (annotated_tag, initial_commit) = test_hashes(); + baseline::agrees_with_fetch_specs(Some("refs/heads/main")); baseline::agrees_with_fetch_specs(Some("heads/main")); baseline::agrees_with_fetch_specs(Some("main")); baseline::agrees_with_fetch_specs(Some("v0.0-f1")); baseline::agrees_with_fetch_specs(Some("tags/v0.0-f2")); - baseline::of_objects_always_matches_if_the_server_has_the_object(Some( - "78b1c1be9421b33a49a7a8176d93eeeafa112da1", - )); - baseline::of_objects_always_matches_if_the_server_has_the_object(Some( - "9d2fab1a0ba3585d0bc50922bfdd04ebb59361df", - )); + baseline::of_objects_always_matches_if_the_server_has_the_object(Some(annotated_tag.as_ref())); + baseline::of_objects_always_matches_if_the_server_has_the_object(Some(initial_commit.as_ref())); } #[test] fn fetch_and_update() { + let (annotated_tag, initial_commit) = test_hashes(); + baseline::of_objects_with_destinations_are_written_into_given_local_branches( - Some("78b1c1be9421b33a49a7a8176d93eeeafa112da1:special"), - ["78b1c1be9421b33a49a7a8176d93eeeafa112da1:refs/heads/special"], + Some(format!("{annotated_tag}:special").as_ref()), + [format!("{annotated_tag}:refs/heads/special").as_ref()], ); baseline::of_objects_with_destinations_are_written_into_given_local_branches( - Some("78b1c1be9421b33a49a7a8176d93eeeafa112da1:1111111111111111111111111111111111111111"), - ["78b1c1be9421b33a49a7a8176d93eeeafa112da1:refs/heads/1111111111111111111111111111111111111111"], + Some(format!("{annotated_tag}:1111111111111111111111111111111111111111").as_ref()), + [format!("{annotated_tag}:refs/heads/1111111111111111111111111111111111111111").as_ref()], ); baseline::of_objects_with_destinations_are_written_into_given_local_branches( - Some("9d2fab1a0ba3585d0bc50922bfdd04ebb59361df:tags/special"), - ["9d2fab1a0ba3585d0bc50922bfdd04ebb59361df:refs/tags/special"], + Some(format!("{initial_commit}:tags/special").as_ref()), + [format!("{initial_commit}:refs/tags/special").as_ref()], ); baseline::of_objects_with_destinations_are_written_into_given_local_branches( - Some("9d2fab1a0ba3585d0bc50922bfdd04ebb59361df:refs/tags/special"), - ["9d2fab1a0ba3585d0bc50922bfdd04ebb59361df:refs/tags/special"], + Some(format!("{initial_commit}:refs/tags/special").as_ref()), + [format!("{initial_commit}:refs/tags/special").as_ref()], ); baseline::agrees_but_observable_refs_are_vague(Some("f1:origin/f1"), ["refs/heads/f1:refs/heads/origin/f1"]); diff --git a/gix-refspec/tests/refspec/spec.rs b/gix-refspec/tests/refspec/spec.rs index 4b31a1447..1a17db24e 100644 --- a/gix-refspec/tests/refspec/spec.rs +++ b/gix-refspec/tests/refspec/spec.rs @@ -53,6 +53,12 @@ mod prefix { parse("e69de29bb2d1d6434b8b29ae775ad8c2e48c5391").to_ref().prefix(), None ); + assert_eq!( + parse("b071221ea854da2958fba3a37527ca5cf32c4ebcd71ab0b68b6b8f10f04e93ad") + .to_ref() + .prefix(), + None + ); } fn parse(spec: &str) -> RefSpec { @@ -117,6 +123,10 @@ mod expand_prefixes { #[test] fn object_names_expand_to_nothing() { assert_eq!(parse("e69de29bb2d1d6434b8b29ae775ad8c2e48c5391").len(), 0); + assert_eq!( + parse("b071221ea854da2958fba3a37527ca5cf32c4ebcd71ab0b68b6b8f10f04e93ad").len(), + 0 + ); } fn parse(spec: &str) -> Vec { diff --git a/justfile b/justfile index 9e4663c67..01ea97341 100755 --- a/justfile +++ b/justfile @@ -230,6 +230,8 @@ unit-tests: cargo nextest run -p gix-protocol --features blocking-client --no-fail-fast cargo nextest run -p gix-protocol --features async-client --no-fail-fast cargo nextest run -p gix-blame --no-fail-fast + env GIX_TEST_FIXTURE_HASH=sha1 cargo nextest run -p gix-refspec --no-fail-fast + env GIX_TEST_FIXTURE_HASH=sha256 cargo nextest run -p gix-refspec --no-fail-fast cargo nextest run -p gix --no-default-features --no-fail-fast cargo nextest run -p gix --no-default-features --features basic,comfort,max-performance-safe --no-fail-fast cargo nextest run -p gix --no-default-features --features basic,extras,comfort,need-more-recent-msrv --no-fail-fast From 373f6127bfaa2e273f3383a02187fc2547e34398 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Sat, 28 Feb 2026 22:46:52 +0100 Subject: [PATCH 3/4] Assume sha1 when GIX_TEST_FIXTURE_HASH is unset or null --- gix-refspec/tests/fixtures/match_baseline.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gix-refspec/tests/fixtures/match_baseline.sh b/gix-refspec/tests/fixtures/match_baseline.sh index fa1371520..c068b6c0e 100755 --- a/gix-refspec/tests/fixtures/match_baseline.sh +++ b/gix-refspec/tests/fixtures/match_baseline.sh @@ -43,7 +43,7 @@ git clone --shared ./base clone baseline "main" baseline "v0.0-f1" baseline "tags/v0.0-f2" - case $GIX_TEST_FIXTURE_HASH in + case ${GIX_TEST_FIXTURE_HASH:-sha1} in sha1) baseline "78b1c1be9421b33a49a7a8176d93eeeafa112da1" baseline "9d2fab1a0ba3585d0bc50922bfdd04ebb59361df" From 37bef49f8a29816196ffa18d22839b8b8a2aee1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Mon, 2 Mar 2026 18:55:29 +0100 Subject: [PATCH 4/4] feat: add `sha256` to `gix` --- gix/Cargo.toml | 9 ++++++++- justfile | 2 ++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/gix/Cargo.toml b/gix/Cargo.toml index ccde5a227..52fceed45 100644 --- a/gix/Cargo.toml +++ b/gix/Cargo.toml @@ -85,7 +85,7 @@ comfort = [ #! Support for various hash algorithms is controlled here. The idea is to allow applications to #! compile in only the ones they need, which is why within the entire `gix` stack there is no #! crate that sets an algorithm, except for the top-level `gix` crate for convenience. -#! +#! #! At least one hash algorithm must be enabled for compilation to succeed. ## Enable support for the SHA-1 hash throughout the `gix` stack. @@ -120,6 +120,13 @@ sha1 = [ "gix-worktree-stream?/sha1", ] +## Enable support for the SHA-256 hash throughout the `gix` stack. +## +## Note that, as of 2026-03-02, only `gix-hash` offers that flag yet. +sha256 = [ + "gix-hash/sha256", +] + #! #### Components #! #! A component is a distinct feature which may be comprised of one or more methods around a particular topic. diff --git a/justfile b/justfile index 01ea97341..8435909f2 100755 --- a/justfile +++ b/justfile @@ -182,6 +182,8 @@ check: cargo check -p gix --no-default-features --features interrupt --tests cargo check -p gix --no-default-features --features blame --tests cargo check -p gix --no-default-features --features sha1 + cargo check -p gix --no-default-features --features sha1,sha256 + cargo check -p gix --no-default-features 2>&1 >/dev/null | grep 'Please set either the `sha1` or the `sha256` feature flag' cargo check -p gix-odb --features serde 2>&1 >/dev/null | grep 'Please set either the `sha1` or the `sha256` feature flag' cargo check -p gix-odb --features sha1,serde cargo check --no-default-features --features max-control,sha1