[PATCH 00/14] SHA-1/SHA-256 interoperability, part 2
- From
brian m. carlson <sandals@crustytoothpaste.net>
- Date
- Oct 27, 2025, 00:43 UTC
- Message-ID
- <20251027004404.2152927-1-sandals@crustytoothpaste.net>
This is the second part of the SHA-1/SHA-256 interoperability work. It introduces our first major use of Rust code to implement a loose object format as well as preparatory work to make that happen, including changing types to more Rust-friendly ones. Since Rust will be required for the interoperability work, we require that in the testsuite.
We also verify that our object ID algorithm is valid when looking up data in the hash map since the Rust code intentionally has no knowledge about global mutable state like the_repository and so cannot default to the main hash algorithm when we've zero-initialized a struct object_id.
The advantage to this Rust code is that it is comprehensively tested with unit testing. We can serialize our loose object map and then verify that we can also load it again and perform various testing, such as whether certain object IDs are found in the map and mapped correctly. We can also test our slightly subtle custom binary search code effectively and be confident that it works, since Rust doesn't provide a way to binary search slices of variable length.
The new Rust files have adopted an approach that is slightly different from some of our other files and placed a license notice at the top. This is required because of DCO part (a): "I have the right to submit it under the open source license indicated in the file". It also avoids ambiguity if the file is copied into a separate location (such as an LLM training corpus).
brian m. carlson (14): repository: require Rust support for interoperability conversion: don't crash when no destination algo hash: use uint32_t for object_id algorithm rust: add a ObjectID struct rust: add a hash algorithm abstraction hash: add a function to look up hash algo structs csum-file: define hashwrite's count as a uint32_t write-or-die: add an fsync component for the loose object map hash: expose hash context functions to Rust rust: add a build.rs script for tests rust: add functionality to hash an object rust: add a new binary loose object map format rust: add a small wrapper around the hashfile code object-file-convert: always make sure object ID algo is valid
Documentation/gitformat-loose.adoc | 104 ++++ Makefile | 5 +- build.rs | 21 + csum-file.c | 2 +- csum-file.h | 2 +- hash.c | 46 +- hash.h | 38 +- object-file-convert.c | 14 +- oidtree.c | 2 +- repository.c | 13 +- repository.h | 4 +- serve.c | 2 +- src/csum_file.rs | 81 +++ src/hash.rs | 335 +++++++++++ src/lib.rs | 3 + src/loose.rs | 912 +++++++++++++++++++++++++++++ src/meson.build | 3 + t/t1006-cat-file.sh | 82 ++- t/t1016-compatObjectFormat.sh | 6 + t/t1500-rev-parse.sh | 2 +- t/t9305-fast-import-signatures.sh | 4 +- t/t9350-fast-export.sh | 4 +- t/test-lib.sh | 4 + write-or-die.h | 4 +- 24 files changed, 1619 insertions(+), 74 deletions(-) create mode 100644 build.rs create mode 100644 src/csum_file.rs create mode 100644 src/hash.rs create mode 100644 src/loose.rs