diff --git a/gix-index/tests/fixtures/generated-archives/.gitignore b/gix-index/tests/fixtures/generated-archives/.gitignore index bcc0af9ed92..4e99a41e170 100644 --- a/gix-index/tests/fixtures/generated-archives/.gitignore +++ b/gix-index/tests/fixtures/generated-archives/.gitignore @@ -5,3 +5,4 @@ # range (e.g., ext4 vs HFS+/APFS vs NTFS), so they cannot be round-tripped # through a committed tar — the fixture must be regenerated per host. file_metadata.tar +file_metadata_sha256.tar diff --git a/gix-index/tests/fixtures/generated-archives/make_symlink_prefix_reuse_advisory_sha256.tar b/gix-index/tests/fixtures/generated-archives/make_symlink_prefix_reuse_advisory_sha256.tar new file mode 100644 index 00000000000..45a7226aff9 Binary files /dev/null and b/gix-index/tests/fixtures/generated-archives/make_symlink_prefix_reuse_advisory_sha256.tar differ diff --git a/gix-index/tests/fixtures/generated-archives/make_traverse_literal_separators_sha256.tar b/gix-index/tests/fixtures/generated-archives/make_traverse_literal_separators_sha256.tar new file mode 100644 index 00000000000..ae55a43303c Binary files /dev/null and b/gix-index/tests/fixtures/generated-archives/make_traverse_literal_separators_sha256.tar differ diff --git a/gix-index/tests/fixtures/generated-archives/untracked_cache_empty_sha256.tar b/gix-index/tests/fixtures/generated-archives/untracked_cache_empty_sha256.tar new file mode 100644 index 00000000000..7be132f9e1d Binary files /dev/null and b/gix-index/tests/fixtures/generated-archives/untracked_cache_empty_sha256.tar differ diff --git a/gix-index/tests/fixtures/generated-archives/untracked_cache_nested_sha256.tar b/gix-index/tests/fixtures/generated-archives/untracked_cache_nested_sha256.tar new file mode 100644 index 00000000000..25595d27655 Binary files /dev/null and b/gix-index/tests/fixtures/generated-archives/untracked_cache_nested_sha256.tar differ diff --git a/gix-index/tests/fixtures/generated-archives/untracked_cache_populated_sha256.tar b/gix-index/tests/fixtures/generated-archives/untracked_cache_populated_sha256.tar new file mode 100644 index 00000000000..90c2de09613 Binary files /dev/null and b/gix-index/tests/fixtures/generated-archives/untracked_cache_populated_sha256.tar differ diff --git a/gix-index/tests/fixtures/generated-archives/v2_all_file_kinds_sha256.tar b/gix-index/tests/fixtures/generated-archives/v2_all_file_kinds_sha256.tar new file mode 100644 index 00000000000..90c9ff72afb Binary files /dev/null and b/gix-index/tests/fixtures/generated-archives/v2_all_file_kinds_sha256.tar differ diff --git a/gix-index/tests/fixtures/generated-archives/v2_empty.tar b/gix-index/tests/fixtures/generated-archives/v2_empty.tar index 543b094711d..f44224733c2 100644 Binary files a/gix-index/tests/fixtures/generated-archives/v2_empty.tar and b/gix-index/tests/fixtures/generated-archives/v2_empty.tar differ diff --git a/gix-index/tests/fixtures/generated-archives/v2_empty_sha256.tar b/gix-index/tests/fixtures/generated-archives/v2_empty_sha256.tar new file mode 100644 index 00000000000..87ba6686fcc Binary files /dev/null and b/gix-index/tests/fixtures/generated-archives/v2_empty_sha256.tar differ diff --git a/gix-index/tests/fixtures/generated-archives/v2_icase_name_clashes_sha256.tar b/gix-index/tests/fixtures/generated-archives/v2_icase_name_clashes_sha256.tar new file mode 100644 index 00000000000..0cba12bf694 Binary files /dev/null and b/gix-index/tests/fixtures/generated-archives/v2_icase_name_clashes_sha256.tar differ diff --git a/gix-index/tests/fixtures/generated-archives/v2_more_files_sha256.tar b/gix-index/tests/fixtures/generated-archives/v2_more_files_sha256.tar new file mode 100644 index 00000000000..1ee5d03c274 Binary files /dev/null and b/gix-index/tests/fixtures/generated-archives/v2_more_files_sha256.tar differ diff --git a/gix-index/tests/fixtures/generated-archives/v2_sha256.tar b/gix-index/tests/fixtures/generated-archives/v2_sha256.tar new file mode 100644 index 00000000000..26bae094f21 Binary files /dev/null and b/gix-index/tests/fixtures/generated-archives/v2_sha256.tar differ diff --git a/gix-index/tests/fixtures/generated-archives/v2_sparse_index_no_dirs_sha256.tar b/gix-index/tests/fixtures/generated-archives/v2_sparse_index_no_dirs_sha256.tar new file mode 100644 index 00000000000..e83a43c3a27 Binary files /dev/null and b/gix-index/tests/fixtures/generated-archives/v2_sparse_index_no_dirs_sha256.tar differ diff --git a/gix-index/tests/fixtures/generated-archives/v2_split_index_recursive_sha256.tar b/gix-index/tests/fixtures/generated-archives/v2_split_index_recursive_sha256.tar new file mode 100644 index 00000000000..11671d5df25 Binary files /dev/null and b/gix-index/tests/fixtures/generated-archives/v2_split_index_recursive_sha256.tar differ diff --git a/gix-index/tests/fixtures/generated-archives/v2_split_index_sha256.tar b/gix-index/tests/fixtures/generated-archives/v2_split_index_sha256.tar new file mode 100644 index 00000000000..da16cc058cf Binary files /dev/null and b/gix-index/tests/fixtures/generated-archives/v2_split_index_sha256.tar differ diff --git a/gix-index/tests/fixtures/generated-archives/v2_split_vs_regular_index_sha256.tar b/gix-index/tests/fixtures/generated-archives/v2_split_vs_regular_index_sha256.tar new file mode 100644 index 00000000000..597e2d1e141 Binary files /dev/null and b/gix-index/tests/fixtures/generated-archives/v2_split_vs_regular_index_sha256.tar differ diff --git a/gix-index/tests/fixtures/generated-archives/v3_added_files_sha256.tar b/gix-index/tests/fixtures/generated-archives/v3_added_files_sha256.tar new file mode 100644 index 00000000000..65883fd5b3d Binary files /dev/null and b/gix-index/tests/fixtures/generated-archives/v3_added_files_sha256.tar differ diff --git a/gix-index/tests/fixtures/generated-archives/v3_skip_worktree_sha256.tar b/gix-index/tests/fixtures/generated-archives/v3_skip_worktree_sha256.tar new file mode 100644 index 00000000000..5b97af0094a Binary files /dev/null and b/gix-index/tests/fixtures/generated-archives/v3_skip_worktree_sha256.tar differ diff --git a/gix-index/tests/fixtures/generated-archives/v3_sparse_index_non_cone_sha256.tar b/gix-index/tests/fixtures/generated-archives/v3_sparse_index_non_cone_sha256.tar new file mode 100644 index 00000000000..d3511719b76 Binary files /dev/null and b/gix-index/tests/fixtures/generated-archives/v3_sparse_index_non_cone_sha256.tar differ diff --git a/gix-index/tests/fixtures/generated-archives/v3_sparse_index_sha256.tar b/gix-index/tests/fixtures/generated-archives/v3_sparse_index_sha256.tar new file mode 100644 index 00000000000..567011b9b52 Binary files /dev/null and b/gix-index/tests/fixtures/generated-archives/v3_sparse_index_sha256.tar differ diff --git a/gix-index/tests/fixtures/generated-archives/v4_more_files_IEOT_sha256.tar b/gix-index/tests/fixtures/generated-archives/v4_more_files_IEOT_sha256.tar new file mode 100644 index 00000000000..5ede6da1ad5 Binary files /dev/null and b/gix-index/tests/fixtures/generated-archives/v4_more_files_IEOT_sha256.tar differ diff --git a/gix-index/tests/fixtures/make_index/v2_empty.sh b/gix-index/tests/fixtures/make_index/v2_empty.sh index d36f819498f..684ea5153e0 100755 --- a/gix-index/tests/fixtures/make_index/v2_empty.sh +++ b/gix-index/tests/fixtures/make_index/v2_empty.sh @@ -2,4 +2,13 @@ set -eu -o pipefail git init -q -git read-tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 + +# Create an empty index. +case ${GIX_TEST_FIXTURE_HASH:-sha1} in + sha1) + git read-tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 ;; + sha256) + git read-tree 6ef19b41225c5369f1c104d45d8d85efa9b057b53b14b4b9b939dd74decc5321 ;; + *) + exit 1 ;; +esac diff --git a/gix-index/tests/index/file/init.rs b/gix-index/tests/index/file/init.rs index 38a89b9a07b..a7fdf447323 100644 --- a/gix-index/tests/index/file/init.rs +++ b/gix-index/tests/index/file/init.rs @@ -5,7 +5,7 @@ mod at_or_new { fn opens_existing() { gix_index::File::at_or_default( Generated("v4_more_files_IEOT").to_path(), - gix_hash::Kind::Sha1, + gix_testtools::object_hash(), false, Default::default(), ) @@ -16,13 +16,17 @@ mod at_or_new { fn create_empty_in_memory_state_if_file_does_not_exist() { let index = gix_index::File::at_or_default( "__definitely no file that exists ever__", - gix_hash::Kind::Sha1, + gix_testtools::object_hash(), false, Default::default(), ) .expect("file is defaulting to a new one"); assert!(!index.path().is_file(), "the file wasn't created yet"); - assert_eq!(index.object_hash(), gix_hash::Kind::Sha1, "object hash is respected"); + assert_eq!( + index.object_hash(), + gix_testtools::object_hash(), + "object hash is respected" + ); assert_eq!(index.entries().len(), 0, "index is empty"); } } @@ -44,11 +48,21 @@ mod from_state { ]; for (fixture, expected_version) in fixtures { + // Loose fixtures are pre-created and only exist as SHA-1 variants. + if gix_testtools::object_hash() != gix_hash::Kind::Sha1 && matches!(fixture, Loose(_)) { + continue; + } + let tmp = gix_testtools::tempfile::TempDir::new()?; let new_index_path = tmp.path().join(fixture.to_name()); assert!(!new_index_path.exists()); - let index = gix_index::File::at(fixture.to_path(), gix_hash::Kind::Sha1, false, Default::default())?; + let index = gix_index::File::at( + fixture.to_path(), + gix_testtools::object_hash(), + false, + Default::default(), + )?; let mut index = gix_index::File::from_state(index.into(), new_index_path.clone()); assert!(index.checksum().is_none()); assert_eq!(index.path(), new_index_path); diff --git a/gix-index/tests/index/file/read.rs b/gix-index/tests/index/file/read.rs index 83a4bc2c69a..82c12bb5c3e 100644 --- a/gix-index/tests/index/file/read.rs +++ b/gix-index/tests/index/file/read.rs @@ -5,6 +5,7 @@ use gix_index::{ Version, entry::{self, Flags, Mode}, }; +use gix_testtools::normalize_debug_snapshot; use crate::{Fixture, hex_to_id, loose_file_path}; @@ -20,25 +21,36 @@ pub(crate) fn loose_file(name: &str) -> gix_index::File { let file = gix_index::File::at(path, gix_hash::Kind::Sha1, false, Default::default()).unwrap(); verify(file) } + pub(crate) fn try_file(name: &str, needs_archive: bool) -> Result { let path = if needs_archive { crate::fixture_index_path_needs_archive(name) } else { crate::fixture_index_path(name) }; - let file = gix_index::File::at(path, gix_hash::Kind::Sha1, false, Default::default())?; + let object_hash = gix_testtools::object_hash(); + let file = gix_index::File::at(path, object_hash, false, Default::default())?; Ok(verify(file)) } + pub(crate) fn file(name: &str) -> gix_index::File { try_file(name, false).unwrap() } + /// Needed if we have to freeze the fixture if contents depends on filesystem traversal order /// This is Ok and similar to our manual copies of indices, except that it can be regenerated. fn file_needs_archive(name: &str) -> gix_index::File { try_file(name, true).unwrap() } + fn file_opt(name: &str, opts: gix_index::decode::Options) -> gix_index::File { - let file = gix_index::File::at(crate::fixture_index_path(name), gix_hash::Kind::Sha1, false, opts).unwrap(); + let file = gix_index::File::at( + crate::fixture_index_path(name), + gix_testtools::object_hash(), + false, + opts, + ) + .unwrap(); verify(file) } @@ -58,6 +70,7 @@ fn with_index_file_snapshot_filters(has_stable_mtimes: bool, run: impl FnOnce()) let mut filters = vec![ (r#"(path: )"[^"]*""#, r#"$1"[redacted]""#), (r#"(identifier: )"[^"]*""#, r#"$1"[redacted]""#), + (r"(object_hash: )Sha(1|256)", "$1[redacted]"), ( r"(?s)FileTime \{\s+seconds: \d+,\s+nanos: \d+,\s+\}", "FileTime { ... }", @@ -117,6 +130,10 @@ fn v2_empty() { #[test] fn v2_empty_skip_hash() { + if gix_testtools::object_hash() != gix_hash::Kind::Sha1 { + return; + } + let file = loose_file("skip_hash"); assert_eq!(file.version(), Version::V2); assert_eq!(file.entries().len(), 0); @@ -134,6 +151,10 @@ fn v2_empty_skip_hash() { #[test] fn v2_with_multiple_entries_without_eoie_ext() { + if gix_testtools::object_hash() != gix_hash::Kind::Sha1 { + return; + } + let file = file_needs_archive("v2_more_files"); with_index_file_snapshot_filters(true, || { insta::assert_snapshot!(format!("{file:#?}"), @r#" @@ -142,7 +163,7 @@ fn v2_with_multiple_entries_without_eoie_ext() { checksum: Some( Sha1(43bcf12743f506ab5fefaf13f8f5a7eed3d747fe), ), - object_hash: Sha1, + object_hash: [redacted], timestamp: FileTime { ... }, version: V2, entries: [ @@ -201,7 +222,7 @@ fn find_shared_index_for(index: impl AsRef) -> PathBuf { fn split_index_without_any_extension() { let file = gix_index::File::at( find_shared_index_for(crate::fixture_index_path("v2_split_index")), - gix_hash::Kind::Sha1, + gix_testtools::object_hash(), false, Default::default(), ) @@ -267,19 +288,19 @@ fn untr_extension_empty() { let file = file_needs_archive("untracked_cache_empty"); with_index_file_snapshot_filters(false, || { - insta::assert_debug_snapshot!(&file, @r#" + insta::assert_snapshot!(normalize_debug_snapshot(&file).0, @r#" File { path: "[redacted]", checksum: Some( - Sha1(e6e8bff2dab8feaa4cf41fd352248b0fc10acb56), + Oid(1), ), - object_hash: Sha1, + object_hash: [redacted], timestamp: FileTime { ... }, version: V2, entries: [ - Mode(FILE) e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 tracked-dir/tracked-file, - Mode(FILE) e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 tracked-root-one, - Mode(FILE) e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 tracked-root-two, + Mode(FILE) Oid(2) tracked-dir/tracked-file, + Mode(FILE) Oid(2) tracked-root-one, + Mode(FILE) Oid(2) tracked-root-two, ], path_backing_size_bytes: 56, is_sparse: false, @@ -309,19 +330,19 @@ fn untr_extension_populated() { let file = file_needs_archive("untracked_cache_populated"); with_index_file_snapshot_filters(true, || { - insta::assert_debug_snapshot!(&file, @r#" + insta::assert_snapshot!(normalize_debug_snapshot(&file).0, @r#" File { path: "[redacted]", checksum: Some( - Sha1(dabefe909b6858676ca56f46db0d9a30ad0d2a97), + Oid(1), ), - object_hash: Sha1, + object_hash: [redacted], timestamp: FileTime { ... }, version: V2, entries: [ - Mode(FILE) mtime: Time { secs: 2147483647, nsecs: 123456789 } e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 tracked-dir/tracked-file, - Mode(FILE) mtime: Time { secs: 2147483647, nsecs: 123456789 } e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 tracked-root-one, - Mode(FILE) mtime: Time { secs: 2147483647, nsecs: 123456789 } e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 tracked-root-two, + Mode(FILE) mtime: Time { secs: 2147483647, nsecs: 123456789 } Oid(2) tracked-dir/tracked-file, + Mode(FILE) mtime: Time { secs: 2147483647, nsecs: 123456789 } Oid(2) tracked-root-one, + Mode(FILE) mtime: Time { secs: 2147483647, nsecs: 123456789 } Oid(2) tracked-root-two, ], path_backing_size_bytes: 56, is_sparse: false, @@ -336,7 +357,7 @@ fn untr_extension_populated() { info_exclude: Some( OidStat { stat: Stat { mtime: Time { secs: 2147483647, nsecs: 123456789 }, ctime: Time { ... }, ... }, - id: Sha1(e69de29bb2d1d6434b8b29ae775ad8c2e48c5391), + id: Oid(2), }, ), excludes_file: None, @@ -413,20 +434,20 @@ fn untr_extension_nested() { let file = file_needs_archive("untracked_cache_nested"); with_index_file_snapshot_filters(true, || { - insta::assert_debug_snapshot!(&file, @r#" + insta::assert_snapshot!(normalize_debug_snapshot(&file).0, @r#" File { path: "[redacted]", checksum: Some( - Sha1(bf50cd966cc718b67d3a326d01aa111f78901c1e), + Oid(1), ), - object_hash: Sha1, + object_hash: [redacted], timestamp: FileTime { ... }, version: V2, entries: [ - Mode(FILE) mtime: Time { secs: 2147483647, nsecs: 123456789 } 55535cdccae965cd0ea191aa22df1145a983b2f9 tracked-dir-with-ignore/.gitignore, - Mode(FILE) mtime: Time { secs: 2147483647, nsecs: 123456789 } e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 tracked-dir-with-ignore/tracked-file, - Mode(FILE) mtime: Time { secs: 2147483647, nsecs: 123456789 } e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 tracked-root-one, - Mode(FILE) mtime: Time { secs: 2147483647, nsecs: 123456789 } e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 tracked-root-two, + Mode(FILE) mtime: Time { secs: 2147483647, nsecs: 123456789 } Oid(2) tracked-dir-with-ignore/.gitignore, + Mode(FILE) mtime: Time { secs: 2147483647, nsecs: 123456789 } Oid(3) tracked-dir-with-ignore/tracked-file, + Mode(FILE) mtime: Time { secs: 2147483647, nsecs: 123456789 } Oid(3) tracked-root-one, + Mode(FILE) mtime: Time { secs: 2147483647, nsecs: 123456789 } Oid(3) tracked-root-two, ], path_backing_size_bytes: 102, is_sparse: false, @@ -441,7 +462,7 @@ fn untr_extension_nested() { info_exclude: Some( OidStat { stat: Stat { mtime: Time { secs: 2147483647, nsecs: 123456789 }, ctime: Time { ... }, ... }, - id: Sha1(e69de29bb2d1d6434b8b29ae775ad8c2e48c5391), + id: Oid(3), }, ), excludes_file: None, @@ -479,7 +500,7 @@ fn untr_extension_nested() { Stat { mtime: Time { secs: 2147483647, nsecs: 123456789 }, ctime: Time { ... }, ... }, ), exclude_file_oid: Some( - Sha1(55535cdccae965cd0ea191aa22df1145a983b2f9), + Oid(2), ), check_only: false, }, @@ -681,7 +702,7 @@ fn split_index_and_regular_index_of_same_content_are_indeed_the_same() { let split = verify( gix_index::File::at( base.join("split/.git/index"), - gix_hash::Kind::Sha1, + gix_testtools::object_hash(), false, Default::default(), ) @@ -696,7 +717,7 @@ fn split_index_and_regular_index_of_same_content_are_indeed_the_same() { let regular = verify( gix_index::File::at( base.join("regular/.git/index"), - gix_hash::Kind::Sha1, + gix_testtools::object_hash(), false, Default::default(), ) diff --git a/gix-index/tests/index/file/write.rs b/gix-index/tests/index/file/write.rs index b272258904d..c1de3974cd6 100644 --- a/gix-index/tests/index/file/write.rs +++ b/gix-index/tests/index/file/write.rs @@ -23,12 +23,22 @@ fn roundtrips() -> crate::Result { ]; for (fixture, options) in input { + // Loose fixtures only exist as SHA-1 version. + if gix_testtools::object_hash() != gix_hash::Kind::Sha1 && matches!(fixture, Loose(_)) { + continue; + } + let expected = fixture.open(); let expected_bytes = std::fs::read(fixture.to_path())?; let mut out_bytes = Vec::new(); let (actual_version, _digest) = expected.write_to(&mut out_bytes, options)?; - let (actual, _) = State::from_bytes(&out_bytes, FileTime::now(), gix_hash::Kind::Sha1, Default::default())?; + let (actual, _) = State::from_bytes( + &out_bytes, + FileTime::now(), + gix_testtools::object_hash(), + Default::default(), + )?; let name = fixture.to_name(); compare_states_against_baseline(&actual, actual_version, &expected, options, name); @@ -109,7 +119,12 @@ fn roundtrips_sparse_index() -> crate::Result { let mut out_bytes = Vec::new(); let (actual_version, _) = expected.write_to(&mut out_bytes, options)?; - let (actual, _) = State::from_bytes(&out_bytes, FileTime::now(), gix_hash::Kind::Sha1, Default::default())?; + let (actual, _) = State::from_bytes( + &out_bytes, + FileTime::now(), + gix_testtools::object_hash(), + Default::default(), + )?; compare_states_against_baseline(&actual, actual_version, &expected, options, fixture.to_name()); // TODO: make this work and re-enable it, once this is done the fixtures can be merged into the main "roundtrip" test @@ -143,6 +158,11 @@ fn state_comparisons_with_various_extension_configurations() { // TODO: this fails because git writes the sdir extension in this case while gitoxide doesn't // Generated("v2_sparse_index_no_dirs"), ] { + // Loose fixtures only exist as SHA-1 version. + if gix_testtools::object_hash() != gix_hash::Kind::Sha1 && matches!(fixture, Loose(_)) { + continue; + } + for options in [ options_with(write::Extensions::None), options_with(write::Extensions::All), @@ -162,7 +182,7 @@ fn state_comparisons_with_various_extension_configurations() { let (actual_version, _digest) = expected.write_to(&mut out, options).unwrap(); let (actual, _) = - State::from_bytes(&out, FileTime::now(), gix_hash::Kind::Sha1, Default::default()).unwrap(); + State::from_bytes(&out, FileTime::now(), gix_testtools::object_hash(), Default::default()).unwrap(); compare_states(&actual, actual_version, &expected, options, fixture); } } @@ -193,7 +213,8 @@ fn remove_flag_is_respected() -> crate::Result { let mut buf = Vec::::new(); index.write_to(&mut buf, Default::default())?; - let (state, _checksum) = State::from_bytes(&buf, FileTime::now(), gix_hash::Kind::Sha1, Default::default())?; + let (state, _checksum) = + State::from_bytes(&buf, FileTime::now(), gix_testtools::object_hash(), Default::default())?; assert_eq!( state.entries().len(), total_entries - entries_to_remove, diff --git a/gix-index/tests/index/init.rs b/gix-index/tests/index/init.rs index 85f6b144def..0f46a8693c4 100644 --- a/gix-index/tests/index/init.rs +++ b/gix-index/tests/index/init.rs @@ -1,6 +1,6 @@ use std::{error::Error, path::Path}; -use crate::scripted_fixture_read_only; +use crate::{odb_at, scripted_fixture_read_only}; use gix_index::State; #[test] @@ -18,9 +18,13 @@ fn from_tree() -> crate::Result { let tree_id = tree_id(&worktree_dir); let git_dir = worktree_dir.join(".git"); - let expected_state = - gix_index::File::at(git_dir.join("index"), gix_hash::Kind::Sha1, false, Default::default())?; - let odb = gix_odb::at(git_dir.join("objects"))?; + let expected_state = gix_index::File::at( + git_dir.join("index"), + gix_testtools::object_hash(), + false, + Default::default(), + )?; + let odb = odb_at(git_dir.join("objects"))?; let actual_state = State::from_tree(&tree_id, &odb, Default::default())?; compare_states(&actual_state, &expected_state, fixture); @@ -40,7 +44,7 @@ fn from_tree_validation() -> crate::Result { let worktree_dir = root.join(repo_name); let tree_id = tree_id(&worktree_dir); let git_dir = worktree_dir.join(".git"); - let odb = gix_odb::at(git_dir.join("objects"))?; + let odb = odb_at(git_dir.join("objects"))?; let err = State::from_tree(&tree_id, &odb, Default::default()).unwrap_err(); assert_eq!( @@ -56,7 +60,7 @@ fn from_tree_validation() -> crate::Result { fn from_tree_returns_file_directory_conflicts_until_fixed() -> crate::Result { let worktree_dir = scripted_fixture_read_only("make_symlink_prefix_reuse_advisory.sh")?; let tree_id = tree_id(&worktree_dir); - let odb = gix_odb::at(worktree_dir.join(".git").join("objects"))?; + let odb = odb_at(worktree_dir.join(".git").join("objects"))?; let actual_state = State::from_tree(&tree_id, &odb, Default::default())?; actual_state diff --git a/gix-index/tests/index/main.rs b/gix-index/tests/index/main.rs index 8d2c2157cf3..70f9add090b 100644 --- a/gix-index/tests/index/main.rs +++ b/gix-index/tests/index/main.rs @@ -12,8 +12,54 @@ mod fs; mod fuzzed; mod init; +static SHA1_TO_SHA256_HASHES: std::sync::LazyLock> = + std::sync::LazyLock::new(|| { + [ + ( + "496d6428b9cf92981dc9495211e6e1120fb6f2ba", + "5f6f307bcc469c02acba4f7da42d8d4defdda8209777fe732956f1e2fa0db3ff", + ), + ( + "4b825dc642cb6eb9a060e54bf8d69288fbee4904", + "6ef19b41225c5369f1c104d45d8d85efa9b057b53b14b4b9b939dd74decc5321", + ), + ( + "72d53f787d86a932a25a8537cee236d81846a8f1", + "645f454faab2cb984a331efafb76345242aa1d2029dff13a63935a31752f05ee", + ), + ( + "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", + "473a0f4c3be8a93681a267e3b1e9a7dcda1185436fe141f7749120a303721813", + ), + ] + .into() + }); + +/// Convert a hexadecimal hash into its corresponding `ObjectId` or _panic_. pub fn hex_to_id(hex: &str) -> ObjectId { - ObjectId::from_hex(hex.as_bytes()).expect("40 bytes hex") + match gix_testtools::object_hash() { + gix_hash::Kind::Sha1 => ObjectId::from_hex(hex.as_bytes()).expect("40 bytes hex"), + gix_hash::Kind::Sha256 => ObjectId::from_hex( + SHA1_TO_SHA256_HASHES + .get(hex) + .unwrap_or_else(|| panic!("SHA-1 {hex} wasn't mapped to SHA-256 yet")) + .as_bytes(), + ) + .expect("64 bytes hex"), + _ => unimplemented!(), + } +} + +/// Get an object database handle for `objects_dir`, respecting the hash kind configured for tests. +pub fn odb_at(objects_dir: impl Into) -> Result { + Ok(gix_odb::at_opts( + objects_dir, + Vec::new(), + gix_odb::store::init::Options { + object_hash: gix_testtools::object_hash(), + ..Default::default() + }, + )?) } pub fn fixture_index_path(name: &str) -> PathBuf { @@ -82,7 +128,15 @@ impl Fixture { } pub fn open(&self) -> gix_index::File { - gix_index::File::at(self.to_path(), gix_hash::Kind::Sha1, false, Default::default()) + let object_hash = match self { + // Generated fixtures are generated by `gix_testtools`, respecting + // `GIX_TEST_FIXTURE_HASH`. + Fixture::Generated(_) => gix_testtools::object_hash(), + // Loose fixtures are not generated by `gix_testtools`. They contain hard-coded SHA-1 + // hashes. + Fixture::Loose(_) => gix_hash::Kind::Sha1, + }; + gix_index::File::at(self.to_path(), object_hash, false, Default::default()) .expect("fixtures are always readable") } } diff --git a/gix-status/tests/status/main.rs b/gix-status/tests/status/main.rs index fc204d2fd79..b26ecdc4a29 100644 --- a/gix-status/tests/status/main.rs +++ b/gix-status/tests/status/main.rs @@ -110,7 +110,7 @@ static SHA1_TO_SHA256_HASHES: std::sync::LazyLock> = std::sy }); fn hex_to_id(hex: &str) -> gix_hash::ObjectId { - match gix_testtools::object_hash_from_env().unwrap_or_default() { + match gix_testtools::object_hash() { gix_hash::Kind::Sha1 => ObjectId::from_hex(hex.as_bytes()).expect("40 bytes hex"), gix_hash::Kind::Sha256 => ObjectId::from_hex( SHA1_TO_SHA256_HASHES diff --git a/gix-traverse/tests/traverse/util.rs b/gix-traverse/tests/traverse/util.rs index 2ff88d87196..0cee3aef301 100644 --- a/gix-traverse/tests/traverse/util.rs +++ b/gix-traverse/tests/traverse/util.rs @@ -227,7 +227,7 @@ static SHA1_TO_SHA256_HASHES: std::sync::LazyLock> = std::sy /// Convert a hexadecimal hash into its corresponding `ObjectId` or _panic_. pub fn hex_to_id(hex: &str) -> ObjectId { - match gix_testtools::object_hash_from_env().unwrap_or_default() { + match gix_testtools::object_hash() { gix_hash::Kind::Sha1 => ObjectId::from_hex(hex.as_bytes()).expect("40 bytes hex"), gix_hash::Kind::Sha256 => ObjectId::from_hex( SHA1_TO_SHA256_HASHES @@ -251,7 +251,7 @@ pub fn odb_at(objects_dir: impl Into) -> Result { objects_dir, Vec::new(), gix_odb::store::init::Options { - object_hash: gix_testtools::object_hash_from_env().unwrap_or_default(), + object_hash: gix_testtools::object_hash(), ..Default::default() }, )?) diff --git a/gix/tests/gix/util.rs b/gix/tests/gix/util.rs index ac2fd3f2cc7..7130789b285 100644 --- a/gix/tests/gix/util.rs +++ b/gix/tests/gix/util.rs @@ -151,7 +151,7 @@ static SHA1_TO_SHA256_HASHES: std::sync::LazyLock> = std::sy /// This takes `GIX_TEST_FIXTURE_HASH` into account, so it maps SHA-1 hashes to their /// corresponding SHA-256 hashes. pub fn hex_to_id(hex: &str) -> gix_hash::ObjectId { - match gix_testtools::object_hash_from_env().unwrap_or_default() { + match gix_testtools::object_hash() { gix_hash::Kind::Sha1 => gix_hash::ObjectId::from_hex(hex.as_bytes()).expect("40 bytes hex"), gix_hash::Kind::Sha256 => gix_hash::ObjectId::from_hex( SHA1_TO_SHA256_HASHES diff --git a/justfile b/justfile index 46d681cd181..2b9cfe8199c 100755 --- a/justfile +++ b/justfile @@ -191,7 +191,8 @@ unit-tests: env GIX_TEST_FIXTURE_HASH=sha1 cargo nextest run -p gix-diff --no-fail-fast env GIX_TEST_FIXTURE_HASH=sha256 cargo nextest run -p gix-diff --no-fail-fast cargo nextest run -p gix-pack --features parallel --no-fail-fast - cargo nextest run -p gix-index --features parallel --no-fail-fast + env GIX_TEST_FIXTURE_HASH=sha1 cargo nextest run -p gix-index --features parallel --no-fail-fast + env GIX_TEST_FIXTURE_HASH=sha256 cargo nextest run -p gix-index --features parallel --no-fail-fast cargo nextest run -p gix-packetline --features blocking-io,maybe-async/is_sync --test blocking-packetline --no-fail-fast cargo nextest run -p gix-packetline --features async-io --test async-packetline --no-fail-fast cargo nextest run -p gix-transport --features http-client-curl,maybe-async/is_sync --no-fail-fast