From f26762623b22314c7571ccf6668c12fb70e4941b Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Mon, 27 Apr 2026 11:37:07 +0800 Subject: [PATCH 1/8] remove `memchr` dependency from `gix-imara-diff` It's replaced with `BStrSlice::find_byte` which is the same under the hood. --- gix-imara-diff/Cargo.toml | 1 - gix-imara-diff/src/sources.rs | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/gix-imara-diff/Cargo.toml b/gix-imara-diff/Cargo.toml index 1dea43e7813..f124bab22a2 100644 --- a/gix-imara-diff/Cargo.toml +++ b/gix-imara-diff/Cargo.toml @@ -18,7 +18,6 @@ include = ["/src/**/*", "/LICENSE", "/README.md", "!/src/tests.rs"] [dependencies] bstr = { version = "1.12.0", default-features = false } hashbrown = { version = ">=0.15,<=0.16", default-features = false, features = ["default-hasher", "inline-more"] } -memchr = "2.7.4" [features] default = [] diff --git a/gix-imara-diff/src/sources.rs b/gix-imara-diff/src/sources.rs index 5ee1abdf4a1..9b2d5ea0d1d 100644 --- a/gix-imara-diff/src/sources.rs +++ b/gix-imara-diff/src/sources.rs @@ -8,7 +8,7 @@ use std::str::from_utf8_unchecked; -use memchr::memchr; +use bstr::ByteSlice; use crate::TokenSource; @@ -175,7 +175,7 @@ impl<'a> Iterator for BStrLines<'a> { if self.0.is_empty() { return None; } - let line_len = memchr(b'\n', self.0).map_or(self.0.len(), |len| len + 1); + let line_len = self.0.find_byte(b'\n').map_or(self.0.len(), |len| len + 1); let (line, rem) = self.0.split_at(line_len); self.0 = rem.into(); Some(line.into()) @@ -208,7 +208,7 @@ impl<'a> Iterator for ByteLines<'a> { if self.0.is_empty() { return None; } - let line_len = memchr(b'\n', self.0).map_or(self.0.len(), |len| len + 1); + let line_len = self.0.find_byte(b'\n').map_or(self.0.len(), |len| len + 1); let (line, rem) = self.0.split_at(line_len); self.0 = rem; Some(line) From b060eb24a0688fa5649b937052e5f314123bc1a6 Mon Sep 17 00:00:00 2001 From: "GPT 5.5" Date: Sun, 26 Apr 2026 10:05:09 +0800 Subject: [PATCH 2/8] fix!: remove `winnow` from the public `gix-actor` API for parsing (#2545) It's too easy to not detect `winnow` updates as a breaking change, and then make patch releases that break existing builds. Co-authored-by: Sebastian Thiel --- Cargo.lock | 1 - gix-actor/Cargo.toml | 1 - gix-actor/fuzz/fuzz_targets/actors.rs | 6 +- gix-actor/src/decode.rs | 22 +++++ gix-actor/src/identity.rs | 8 +- gix-actor/src/lib.rs | 6 +- gix-actor/src/signature/decode.rs | 126 +++++++++----------------- gix-actor/src/signature/mod.rs | 8 +- gix-actor/tests/actor/identity.rs | 4 +- gix-actor/tests/actor/signature.rs | 12 +-- 10 files changed, 82 insertions(+), 112 deletions(-) create mode 100644 gix-actor/src/decode.rs diff --git a/Cargo.lock b/Cargo.lock index f4df53efe51..47323c1ae25 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1497,7 +1497,6 @@ dependencies = [ "gix-testtools", "pretty_assertions", "serde", - "winnow", ] [[package]] diff --git a/gix-actor/Cargo.toml b/gix-actor/Cargo.toml index e1c2fc2504f..d8015c26d88 100644 --- a/gix-actor/Cargo.toml +++ b/gix-actor/Cargo.toml @@ -26,7 +26,6 @@ bstr = { version = "1.12.0", default-features = false, features = [ "std", "unicode", ] } -winnow = { version = "1.0.0", features = ["simd"] } serde = { version = "1.0.114", optional = true, default-features = false, features = [ "derive", ] } diff --git a/gix-actor/fuzz/fuzz_targets/actors.rs b/gix-actor/fuzz/fuzz_targets/actors.rs index b0773d21c0a..33d9a132491 100644 --- a/gix-actor/fuzz/fuzz_targets/actors.rs +++ b/gix-actor/fuzz/fuzz_targets/actors.rs @@ -1,6 +1,6 @@ #![no_main] -use gix_actor::{IdentityRef, Signature, SignatureRef}; +use gix_actor::{IdentityRef, SignatureRef}; use libfuzzer_sys::fuzz_target; use std::hint::black_box; @@ -24,10 +24,10 @@ fn inspect_signature(signature: SignatureRef<'_>) { } fuzz_target!(|input: &[u8]| { - if let Ok(identity) = IdentityRef::from_bytes::<()>(input) { + if let Ok(identity) = IdentityRef::from_bytes(input) { inspect_identity(identity); } - if let Ok(signature) = SignatureRef::from_bytes::<()>(input) { + if let Ok(signature) = SignatureRef::from_bytes(input) { inspect_signature(signature); } }); diff --git a/gix-actor/src/decode.rs b/gix-actor/src/decode.rs new file mode 100644 index 00000000000..8fc428185dd --- /dev/null +++ b/gix-actor/src/decode.rs @@ -0,0 +1,22 @@ +/// Parser errors for actor identities and signatures. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Ord, PartialOrd)] +pub enum Error { + /// A closing `>` was not found before the end of the line. + MissingClosingBracket, + /// An opening `<` was not found before the closing `>`. + MissingOpeningBracket, + /// Duplicate delimiters overlap. + DelimiterOverlap, +} + +impl std::fmt::Display for Error { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str(match self { + Error::MissingClosingBracket => "Closing '>' not found", + Error::MissingOpeningBracket => "Opening '<' not found", + Error::DelimiterOverlap => "Skipped parts run into each other", + }) + } +} + +impl std::error::Error for Error {} diff --git a/gix-actor/src/identity.rs b/gix-actor/src/identity.rs index f6fbac1d4a7..9e1b5fd99e4 100644 --- a/gix-actor/src/identity.rs +++ b/gix-actor/src/identity.rs @@ -1,15 +1,11 @@ use bstr::ByteSlice; -use winnow::{error::StrContext, prelude::*}; use crate::{signature::decode, Identity, IdentityRef}; impl<'a> IdentityRef<'a> { /// Deserialize an identity from the given `data`. - pub fn from_bytes(mut data: &'a [u8]) -> Result> - where - E: winnow::error::ParserError<&'a [u8]> + winnow::error::AddContext<&'a [u8], StrContext>, - { - decode::identity.parse_next(&mut data) + pub fn from_bytes(mut data: &'a [u8]) -> Result { + decode::identity(&mut data) } /// Create an owned instance from this shared one. diff --git a/gix-actor/src/lib.rs b/gix-actor/src/lib.rs index 92db2ee6cb2..545a5eb2f7e 100644 --- a/gix-actor/src/lib.rs +++ b/gix-actor/src/lib.rs @@ -5,13 +5,13 @@ //! ``` //! use gix_actor::{IdentityRef, SignatureRef}; //! -//! let actor = IdentityRef::from_bytes::<()>(b" Taylor Example < taylor@example.com >") +//! let actor = IdentityRef::from_bytes(b" Taylor Example < taylor@example.com >") //! .unwrap() //! .trim(); //! assert_eq!(actor.name, "Taylor Example"); //! assert_eq!(actor.email, "taylor@example.com"); //! -//! let signature = SignatureRef::from_bytes::<()>(b"Taylor Example 1711398853 +0800") +//! let signature = SignatureRef::from_bytes(b"Taylor Example 1711398853 +0800") //! .unwrap() //! .trim(); //! assert_eq!(signature.actor(), actor); @@ -44,6 +44,8 @@ use bstr::{BStr, BString}; /// For convenience to allow using `gix-date` without adding it to own cargo manifest. pub use gix_date as date; +/// Decode actor identities and signatures. +pub mod decode; mod identity; /// pub mod signature; diff --git a/gix-actor/src/signature/decode.rs b/gix-actor/src/signature/decode.rs index 87f5680c3ba..72dfef955aa 100644 --- a/gix-actor/src/signature/decode.rs +++ b/gix-actor/src/signature/decode.rs @@ -1,98 +1,62 @@ pub(crate) mod function { use bstr::ByteSlice; - use winnow::{ - combinator::{opt, separated_pair}, - error::{AddContext, ErrMode, ParserError, StrContext}, - prelude::*, - stream::{AsChar, Stream}, - token::take_while, - }; - - use crate::{IdentityRef, SignatureRef}; - - /// Parse a signature from the bytes input `i` using `nom`. - pub fn decode<'a, E: ParserError<&'a [u8]> + AddContext<&'a [u8], StrContext>>( - i: &mut &'a [u8], - ) -> ModalResult, E> { - separated_pair( - identity, - opt(b" "), - opt(( - take_while(0.., |b: u8| b == b'+' || b == b'-' || b.is_space() || b.is_dec_digit()).map(|v: &[u8]| v), - )) - .map(|maybe_bytes| { - if let Some((bytes,)) = maybe_bytes { - // SAFETY: The parser validated that there are only ASCII characters. - #[allow(unsafe_code)] - unsafe { - std::str::from_utf8_unchecked(bytes) - } - } else { - "" - } - }), - ) - .context(StrContext::Expected(" <> <+|->".into())) - .map(|(identity, time)| SignatureRef { + + use crate::{decode::Error, IdentityRef, SignatureRef}; + + /// Parse a signature from the bytes input `i`, and change it to point to the unparsed bytes afterwards. + pub fn decode<'a>(i: &mut &'a [u8]) -> Result, Error> { + let identity = identity(i)?; + if i.first() == Some(&b' ') { + *i = &i[1..]; + } + + let time_len = i.iter().position(|b| !is_time_byte(*b)).unwrap_or(i.len()); + let (time, rest) = i.split_at(time_len); + *i = rest; + // SAFETY: The parser validated that there are only ASCII characters with `is_time_byte()`. + #[allow(unsafe_code)] + let time = unsafe { std::str::from_utf8_unchecked(time) }; + + Ok(SignatureRef { name: identity.name, email: identity.email, time, }) - .parse_next(i) } - /// Parse an identity from the bytes input `i` (like `name `) using `nom`. - pub fn identity<'a, E: ParserError<&'a [u8]> + AddContext<&'a [u8], StrContext>>( - i: &mut &'a [u8], - ) -> ModalResult, E> { - let start = i.checkpoint(); + /// Parse an identity from the bytes input `i` (like `name `). + pub fn identity<'a>(i: &mut &'a [u8]) -> Result, Error> { let eol_idx = i.find_byte(b'\n').unwrap_or(i.len()); - let right_delim_idx = i[..eol_idx] - .rfind_byte(b'>') - .ok_or(ErrMode::Cut(E::from_input(i).add_context( - i, - &start, - StrContext::Label("Closing '>' not found"), - )))?; + let right_delim_idx = i[..eol_idx].rfind_byte(b'>').ok_or(Error::MissingClosingBracket)?; let i_name_and_email = &i[..right_delim_idx]; let skip_from_right = i_name_and_email.iter().rev().take_while(|b| **b == b'>').count(); - let left_delim_idx = i_name_and_email - .find_byte(b'<') - .ok_or(ErrMode::Cut(E::from_input(i).add_context( - &i_name_and_email, - &start, - StrContext::Label("Opening '<' not found"), - )))?; + let left_delim_idx = i_name_and_email.find_byte(b'<').ok_or(Error::MissingOpeningBracket)?; let skip_from_left = i[left_delim_idx..].iter().take_while(|b| **b == b'<').count(); let mut name = i[..left_delim_idx].as_bstr(); name = name.strip_suffix(b" ").unwrap_or(name).as_bstr(); let email = i .get(left_delim_idx + skip_from_left..right_delim_idx - skip_from_right) - .ok_or(ErrMode::Cut(E::from_input(i).add_context( - &i_name_and_email, - &start, - StrContext::Label("Skipped parts run into each other"), - )))? + .ok_or(Error::DelimiterOverlap)? .as_bstr(); *i = i.get(right_delim_idx + 1..).unwrap_or(&[]); Ok(IdentityRef { name, email }) } + + fn is_time_byte(b: u8) -> bool { + matches!(b, b'+' | b'-' | b'0'..=b'9' | b' ' | b'\t') + } } pub use function::identity; #[cfg(test)] mod tests { mod parse_signature { - use gix_testtools::to_bstr_err; - use winnow::prelude::*; + use crate::{decode::Error, signature, SignatureRef}; - use crate::{signature, SignatureRef}; - - fn decode<'i>( - i: &mut &'i [u8], - ) -> ModalResult, winnow::error::TreeError<&'i [u8], winnow::error::StrContext>> { - signature::decode.parse_next(i) + fn decode(i: &[u8]) -> Result<(&[u8], SignatureRef<'_>), Error> { + let mut i = i; + signature::decode(&mut i).map(|signature| (i, signature)) } fn signature(name: &'static str, email: &'static str, time: &'static str) -> SignatureRef<'static> { @@ -105,8 +69,7 @@ mod tests { #[test] fn tz_minus() { - let actual = decode - .parse_peek(b"Sebastian Thiel 1528473343 -0230") + let actual = decode(b"Sebastian Thiel 1528473343 -0230") .expect("parse to work") .1; assert_eq!( @@ -126,8 +89,7 @@ mod tests { #[test] fn tz_plus() { assert_eq!( - decode - .parse_peek(b"Sebastian Thiel 1528473343 +0230") + decode(b"Sebastian Thiel 1528473343 +0230") .expect("parse to work") .1, signature("Sebastian Thiel", "byronimo@gmail.com", "1528473343 +0230") @@ -137,8 +99,7 @@ mod tests { #[test] fn email_with_space() { assert_eq!( - decode - .parse_peek(b"Sebastian Thiel <\tbyronimo@gmail.com > 1528473343 +0230") + decode(b"Sebastian Thiel <\tbyronimo@gmail.com > 1528473343 +0230") .expect("parse to work") .1, signature("Sebastian Thiel", "\tbyronimo@gmail.com ", "1528473343 +0230") @@ -148,8 +109,7 @@ mod tests { #[test] fn negative_offset_0000() { assert_eq!( - decode - .parse_peek(b"Sebastian Thiel 1528473343 -0000") + decode(b"Sebastian Thiel 1528473343 -0000") .expect("parse to work") .1, signature("Sebastian Thiel", "byronimo@gmail.com", "1528473343 -0000") @@ -159,8 +119,7 @@ mod tests { #[test] fn negative_offset_double_dash() { assert_eq!( - decode - .parse_peek(b"name 1288373970 --700") + decode(b"name 1288373970 --700") .expect("parse to work") .1, signature("name", "name@example.com", "1288373970 --700") @@ -170,7 +129,7 @@ mod tests { #[test] fn empty_name_and_email() { assert_eq!( - decode.parse_peek(b" <> 12345 -1215").expect("parse to work").1, + decode(b" <> 12345 -1215").expect("parse to work").1, signature("", "", "12345 -1215") ); } @@ -178,18 +137,15 @@ mod tests { #[test] fn invalid_signature() { assert_eq!( - decode.parse_peek(b"hello < 12345 -1215") - .map_err(to_bstr_err) - .expect_err("parse fails as > is missing") - .to_string(), - " at 'hello < 12345 -1215'\n 0: invalid Closing '>' not found at 'hello < 12345 -1215'\n 1: expected ` <> <+|->` at 'hello < 12345 -1215'\n" - ); + decode(b"hello < 12345 -1215").expect_err("parse fails as > is missing"), + Error::MissingClosingBracket + ); } #[test] fn invalid_time() { assert_eq!( - decode.parse_peek(b"hello <> abc -1215").expect("parse to work").1, + decode(b"hello <> abc -1215").expect("parse to work").1, signature("hello", "", "") ); } diff --git a/gix-actor/src/signature/mod.rs b/gix-actor/src/signature/mod.rs index 472f7aca45c..4bc5db540f4 100644 --- a/gix-actor/src/signature/mod.rs +++ b/gix-actor/src/signature/mod.rs @@ -1,17 +1,13 @@ mod _ref { use bstr::ByteSlice; - use winnow::{error::StrContext, prelude::*}; use crate::{signature::decode, IdentityRef, Signature, SignatureRef}; /// Lifecycle impl<'a> SignatureRef<'a> { /// Deserialize a signature from the given `data`. - pub fn from_bytes(mut data: &'a [u8]) -> Result, winnow::error::ErrMode> - where - E: winnow::error::ParserError<&'a [u8]> + winnow::error::AddContext<&'a [u8], StrContext>, - { - decode.parse_next(&mut data) + pub fn from_bytes(mut data: &'a [u8]) -> Result, crate::decode::Error> { + decode(&mut data) } /// Try to parse the timestamp and create an owned instance from this shared one. diff --git a/gix-actor/tests/actor/identity.rs b/gix-actor/tests/actor/identity.rs index e68dbcea4cd..7f600c01949 100644 --- a/gix-actor/tests/actor/identity.rs +++ b/gix-actor/tests/actor/identity.rs @@ -12,7 +12,7 @@ fn round_trip() -> gix_testtools::Result { b".. whitespace \t is explicitly allowed - unicode aware trimming must be done elsewhere " ]; for input in DEFAULTS { - let signature: Identity = gix_actor::IdentityRef::from_bytes::<()>(input).unwrap().into(); + let signature: Identity = gix_actor::IdentityRef::from_bytes(input).unwrap().into(); let mut output = Vec::new(); signature.write_to(&mut output)?; assert_eq!(output.as_bstr(), input.as_bstr()); @@ -32,7 +32,7 @@ fn lenient_parsing() -> gix_testtools::Result { "fl (input.as_bytes()).unwrap(); + let identity = gix_actor::IdentityRef::from_bytes(input.as_bytes()).unwrap(); assert_eq!(identity.name, "First Last"); assert_eq!( identity.email, expected_email, diff --git a/gix-actor/tests/actor/signature.rs b/gix-actor/tests/actor/signature.rs index c88a07f214d..c5191b2a5a2 100644 --- a/gix-actor/tests/actor/signature.rs +++ b/gix-actor/tests/actor/signature.rs @@ -49,7 +49,7 @@ use gix_actor::{Signature, SignatureRef}; #[test] fn trim() { - let sig = gix_actor::SignatureRef::from_bytes::<()>(b" \t hello there \t < \t email \t > 1 -0030").unwrap(); + let sig = gix_actor::SignatureRef::from_bytes(b" \t hello there \t < \t email \t > 1 -0030").unwrap(); let sig = sig.trim(); assert_eq!(sig.name, "hello there"); assert_eq!(sig.email, "email"); @@ -65,7 +65,7 @@ fn round_trip() -> Result<(), Box> { ]; for input in DEFAULTS { - let signature: Signature = gix_actor::SignatureRef::from_bytes::<()>(input).unwrap().into(); + let signature: Signature = gix_actor::SignatureRef::from_bytes(input).unwrap().into(); let mut output = Vec::new(); signature.write_to(&mut output)?; assert_eq!(output.as_bstr(), input.as_bstr()); @@ -76,7 +76,7 @@ fn round_trip() -> Result<(), Box> { #[test] fn signature_ref_round_trips_with_seconds_in_offset() -> Result<(), Box> { let input = b"Sebastian Thiel 1313584730 +051800"; // Seen in the wild - let signature: SignatureRef = gix_actor::SignatureRef::from_bytes::<()>(input).unwrap(); + let signature: SignatureRef = gix_actor::SignatureRef::from_bytes(input).unwrap(); let mut output = Vec::new(); signature.write_to(&mut output)?; assert_eq!(output.as_bstr(), input.as_bstr()); @@ -85,7 +85,7 @@ fn signature_ref_round_trips_with_seconds_in_offset() -> Result<(), Box(b"first last 1312735823 +051800") + let signature = gix_actor::SignatureRef::from_bytes(b"first last 1312735823 +051800") .expect("deal with trailing zeroes in timestamp by discarding it"); assert_eq!( signature, @@ -96,7 +96,7 @@ fn parse_timestamp_with_trailing_digits() { } ); - let signature = gix_actor::SignatureRef::from_bytes::<()>(b"first last 1312735823 +0518") + let signature = gix_actor::SignatureRef::from_bytes(b"first last 1312735823 +0518") .expect("this naturally works as the timestamp does not have trailing zeroes"); assert_eq!( signature, @@ -110,7 +110,7 @@ fn parse_timestamp_with_trailing_digits() { #[test] fn parse_missing_timestamp() { - let signature = gix_actor::SignatureRef::from_bytes::<()>(b"first last ") + let signature = gix_actor::SignatureRef::from_bytes(b"first last ") .expect("deal with missing timestamp in signature by zeroing it"); assert_eq!( signature, From 91c854e7b9f41738d0fde825cd474b8c00c1a49b Mon Sep 17 00:00:00 2001 From: "GPT 5.5" Date: Sun, 26 Apr 2026 10:23:33 +0800 Subject: [PATCH 3/8] fix!: remove `winnow` and replace it with hand-implemented parsers everywhere. This will allow for simplified maintenance and editing (both human and machine) down the road, and enable additional performance optimisations. Parser compbinators to me ultimately were a failed experiment as I couldn't maintain them anyway, with it being too difficult for me to grasp and express everything in its very own kind of language, with a lot of different things to consider. Note that this also removes detailed errors from all parsers that previously used `winnow`, with the option to re-add those if there is demand. Co-authored-by: Sebastian Thiel --- Cargo.lock | 11 +- gitoxide-core/src/hours/mod.rs | 4 +- gitoxide-core/src/repository/mailmap.rs | 2 +- gix-actor/src/decode.rs | 22 - gix-actor/src/identity.rs | 14 +- gix-actor/src/lib.rs | 2 - gix-actor/src/signature/decode.rs | 32 +- gix-actor/src/signature/mod.rs | 15 +- gix-config/Cargo.toml | 2 - gix-config/src/lib.rs | 2 +- gix-config/src/parse/from_bytes/mod.rs | 412 ++++++++++++++++++ .../src/parse/{nom => from_bytes}/tests.rs | 309 ++++++++++--- gix-config/src/parse/mod.rs | 5 +- gix-config/src/parse/nom/mod.rs | 377 ---------------- gix-mailmap/fuzz/fuzz_targets/mailmap.rs | 2 +- gix-mailmap/src/lib.rs | 2 +- gix-object/Cargo.toml | 8 +- gix-object/src/commit/decode.rs | 154 ++++--- gix-object/src/commit/message/decode.rs | 59 +-- gix-object/src/commit/message/mod.rs | 2 +- gix-object/src/commit/mod.rs | 5 +- gix-object/src/commit/ref_iter.rs | 89 ++-- gix-object/src/lib.rs | 78 +--- gix-object/src/parse.rs | 201 ++++++--- gix-object/src/tag/decode.rs | 233 +++++++--- gix-object/src/tag/mod.rs | 5 +- gix-object/src/tag/ref_iter.rs | 35 +- gix-object/src/tree/ref_iter.rs | 15 +- gix-object/tests/object/commit/from_bytes.rs | 13 + gix-object/tests/object/commit/mod.rs | 9 +- gix-object/tests/object/tag.rs | 141 +++++- gix-object/tests/object/tree/from_bytes.rs | 7 +- gix-path/tests/path/realpath.rs | 2 +- gix-protocol/Cargo.toml | 1 - gix-protocol/src/remote_progress.rs | 102 +++-- gix-ref/Cargo.toml | 1 - gix-ref/src/parse.rs | 42 +- gix-ref/src/store/file/log/line.rs | 161 +++---- .../src/store/file/loose/reference/decode.rs | 45 +- gix-ref/src/store/packed/buffer.rs | 8 +- gix-ref/src/store/packed/decode.rs | 112 +++-- gix-ref/src/store/packed/decode/tests.rs | 75 ++-- gix-ref/src/store/packed/find.rs | 10 +- gix-ref/src/store/packed/iter.rs | 16 +- gix-ref/tests/refs/file/reference.rs | 8 + gix/Cargo.toml | 6 - justfile | 8 +- tests/tools/Cargo.toml | 1 - tests/tools/src/lib.rs | 8 - 49 files changed, 1635 insertions(+), 1238 deletions(-) delete mode 100644 gix-actor/src/decode.rs create mode 100644 gix-config/src/parse/from_bytes/mod.rs rename gix-config/src/parse/{nom => from_bytes}/tests.rs (72%) delete mode 100644 gix-config/src/parse/nom/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 47323c1ae25..3dbaaea9cb5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1622,12 +1622,10 @@ dependencies = [ "gix-path", "gix-ref", "gix-sec", - "memchr", "serde", "smallvec", "thiserror 2.0.18", "unicode-bom", - "winnow", ] [[package]] @@ -1927,7 +1925,6 @@ dependencies = [ "gix-imara-diff", "gix-object", "hashbrown 0.16.1", - "memchr", ] [[package]] @@ -2070,6 +2067,7 @@ dependencies = [ "document-features", "gix-actor", "gix-date", + "gix-error", "gix-features", "gix-hash", "gix-hashtable", @@ -2084,7 +2082,6 @@ dependencies = [ "smallvec", "termtree", "thiserror 2.0.18", - "winnow", ] [[package]] @@ -2259,7 +2256,6 @@ dependencies = [ "nonempty", "serde", "thiserror 2.0.18", - "winnow", ] [[package]] @@ -2295,7 +2291,6 @@ dependencies = [ "memmap2", "serde", "thiserror 2.0.18", - "winnow", ] [[package]] @@ -2496,7 +2491,6 @@ dependencies = [ "serial_test", "tar", "tempfile", - "winnow", "xz2", ] @@ -6105,9 +6099,6 @@ name = "winnow" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0" -dependencies = [ - "memchr", -] [[package]] name = "winreg" diff --git a/gitoxide-core/src/hours/mod.rs b/gitoxide-core/src/hours/mod.rs index 40fd0f2955a..0aa7ad60a11 100644 --- a/gitoxide-core/src/hours/mod.rs +++ b/gitoxide-core/src/hours/mod.rs @@ -71,10 +71,10 @@ impl ParsedIdentity<'_> { fn parse_trailer_identity(trailer: gix::objs::commit::message::body::TrailerRef<'_>) -> Option> { match trailer.value { - std::borrow::Cow::Borrowed(value) => IdentityRef::from_bytes::(value.as_ref()) + std::borrow::Cow::Borrowed(value) => IdentityRef::from_bytes(value.as_ref()) .ok() .map(|identity| ParsedIdentity::Borrowed(identity.trim())), - std::borrow::Cow::Owned(value) => IdentityRef::from_bytes::(value.as_ref()) + std::borrow::Cow::Owned(value) => IdentityRef::from_bytes(value.as_ref()) .ok() .map(|identity| ParsedIdentity::Owned(identity.trim().to_owned())), } diff --git a/gitoxide-core/src/repository/mailmap.rs b/gitoxide-core/src/repository/mailmap.rs index 9252bdafde0..b8d20107db1 100644 --- a/gitoxide-core/src/repository/mailmap.rs +++ b/gitoxide-core/src/repository/mailmap.rs @@ -71,7 +71,7 @@ pub fn check( let mut buf = Vec::new(); for contact in contacts { - let actor = match gix::actor::IdentityRef::from_bytes::<()>(&contact) { + let actor = match gix::actor::IdentityRef::from_bytes(&contact) { Ok(a) => a, Err(_) => { let Some(email) = contact diff --git a/gix-actor/src/decode.rs b/gix-actor/src/decode.rs deleted file mode 100644 index 8fc428185dd..00000000000 --- a/gix-actor/src/decode.rs +++ /dev/null @@ -1,22 +0,0 @@ -/// Parser errors for actor identities and signatures. -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Ord, PartialOrd)] -pub enum Error { - /// A closing `>` was not found before the end of the line. - MissingClosingBracket, - /// An opening `<` was not found before the closing `>`. - MissingOpeningBracket, - /// Duplicate delimiters overlap. - DelimiterOverlap, -} - -impl std::fmt::Display for Error { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.write_str(match self { - Error::MissingClosingBracket => "Closing '>' not found", - Error::MissingOpeningBracket => "Opening '<' not found", - Error::DelimiterOverlap => "Skipped parts run into each other", - }) - } -} - -impl std::error::Error for Error {} diff --git a/gix-actor/src/identity.rs b/gix-actor/src/identity.rs index 9e1b5fd99e4..e900ec3ea5c 100644 --- a/gix-actor/src/identity.rs +++ b/gix-actor/src/identity.rs @@ -4,8 +4,18 @@ use crate::{signature::decode, Identity, IdentityRef}; impl<'a> IdentityRef<'a> { /// Deserialize an identity from the given `data`. - pub fn from_bytes(mut data: &'a [u8]) -> Result { - decode::identity(&mut data) + /// + /// Typical input is `Name 1700000000 +0000`. + pub fn from_bytes(mut data: &'a [u8]) -> Result { + Self::from_bytes_consuming(&mut data) + } + + /// Deserialize an identity from the given `data` and advance it past the identity. + /// + /// Typical input is `Name 1700000000 +0000`; on success, + /// `data` points to the bytes immediately after the closing `>`. + pub fn from_bytes_consuming(data: &mut &'a [u8]) -> Result { + decode::identity(data) } /// Create an owned instance from this shared one. diff --git a/gix-actor/src/lib.rs b/gix-actor/src/lib.rs index 545a5eb2f7e..f65cd0ef3f3 100644 --- a/gix-actor/src/lib.rs +++ b/gix-actor/src/lib.rs @@ -44,8 +44,6 @@ use bstr::{BStr, BString}; /// For convenience to allow using `gix-date` without adding it to own cargo manifest. pub use gix_date as date; -/// Decode actor identities and signatures. -pub mod decode; mod identity; /// pub mod signature; diff --git a/gix-actor/src/signature/decode.rs b/gix-actor/src/signature/decode.rs index 72dfef955aa..271503c3e7a 100644 --- a/gix-actor/src/signature/decode.rs +++ b/gix-actor/src/signature/decode.rs @@ -1,10 +1,11 @@ pub(crate) mod function { use bstr::ByteSlice; + use gix_error::ValidationError; - use crate::{decode::Error, IdentityRef, SignatureRef}; + use crate::{IdentityRef, SignatureRef}; /// Parse a signature from the bytes input `i`, and change it to point to the unparsed bytes afterwards. - pub fn decode<'a>(i: &mut &'a [u8]) -> Result, Error> { + pub fn decode<'a>(i: &mut &'a [u8]) -> Result, ValidationError> { let identity = identity(i)?; if i.first() == Some(&b' ') { *i = &i[1..]; @@ -25,19 +26,23 @@ pub(crate) mod function { } /// Parse an identity from the bytes input `i` (like `name `). - pub fn identity<'a>(i: &mut &'a [u8]) -> Result, Error> { + pub fn identity<'a>(i: &mut &'a [u8]) -> Result, ValidationError> { let eol_idx = i.find_byte(b'\n').unwrap_or(i.len()); - let right_delim_idx = i[..eol_idx].rfind_byte(b'>').ok_or(Error::MissingClosingBracket)?; + let right_delim_idx = i[..eol_idx] + .rfind_byte(b'>') + .ok_or_else(|| ValidationError::new("Closing '>' not found"))?; let i_name_and_email = &i[..right_delim_idx]; let skip_from_right = i_name_and_email.iter().rev().take_while(|b| **b == b'>').count(); - let left_delim_idx = i_name_and_email.find_byte(b'<').ok_or(Error::MissingOpeningBracket)?; + let left_delim_idx = i_name_and_email + .find_byte(b'<') + .ok_or_else(|| ValidationError::new("Opening '<' not found"))?; let skip_from_left = i[left_delim_idx..].iter().take_while(|b| **b == b'<').count(); let mut name = i[..left_delim_idx].as_bstr(); name = name.strip_suffix(b" ").unwrap_or(name).as_bstr(); let email = i .get(left_delim_idx + skip_from_left..right_delim_idx - skip_from_right) - .ok_or(Error::DelimiterOverlap)? + .ok_or_else(|| ValidationError::new("Skipped parts run into each other"))? .as_bstr(); *i = i.get(right_delim_idx + 1..).unwrap_or(&[]); Ok(IdentityRef { name, email }) @@ -52,11 +57,12 @@ pub use function::identity; #[cfg(test)] mod tests { mod parse_signature { - use crate::{decode::Error, signature, SignatureRef}; + use gix_error::ValidationError; - fn decode(i: &[u8]) -> Result<(&[u8], SignatureRef<'_>), Error> { - let mut i = i; - signature::decode(&mut i).map(|signature| (i, signature)) + use crate::SignatureRef; + + fn decode(mut i: &[u8]) -> Result<(&[u8], SignatureRef<'_>), ValidationError> { + SignatureRef::from_bytes_consuming(&mut i).map(|signature| (i, signature)) } fn signature(name: &'static str, email: &'static str, time: &'static str) -> SignatureRef<'static> { @@ -137,8 +143,10 @@ mod tests { #[test] fn invalid_signature() { assert_eq!( - decode(b"hello < 12345 -1215").expect_err("parse fails as > is missing"), - Error::MissingClosingBracket + decode(b"hello < 12345 -1215") + .expect_err("parse fails as > is missing") + .to_string(), + "Closing '>' not found" ); } diff --git a/gix-actor/src/signature/mod.rs b/gix-actor/src/signature/mod.rs index 4bc5db540f4..2e675dbc773 100644 --- a/gix-actor/src/signature/mod.rs +++ b/gix-actor/src/signature/mod.rs @@ -6,8 +6,19 @@ mod _ref { /// Lifecycle impl<'a> SignatureRef<'a> { /// Deserialize a signature from the given `data`. - pub fn from_bytes(mut data: &'a [u8]) -> Result, crate::decode::Error> { - decode(&mut data) + /// + /// Typical input is `Name 1700000000 +0000`. + pub fn from_bytes(mut data: &'a [u8]) -> Result, gix_error::ValidationError> { + Self::from_bytes_consuming(&mut data) + } + + /// Deserialize a signature from the given `data` and advance it past the signature. + /// + /// Typical input is `Name 1700000000 +0000`; on + /// success, `data` points to the bytes immediately after the parsed + /// signature. + pub fn from_bytes_consuming(data: &mut &'a [u8]) -> Result, gix_error::ValidationError> { + decode(data) } /// Try to parse the timestamp and create an owned instance from this shared one. diff --git a/gix-config/Cargo.toml b/gix-config/Cargo.toml index 4200bb0bead..0d946e57834 100644 --- a/gix-config/Cargo.toml +++ b/gix-config/Cargo.toml @@ -28,8 +28,6 @@ gix-sec = { version = "^0.13.3", path = "../gix-sec" } gix-ref = { version = "^0.62.0", path = "../gix-ref" } gix-glob = { version = "^0.25.0", path = "../gix-glob" } -winnow = { version = "1.0.0", features = ["simd"] } -memchr = "2" thiserror = "2.0.18" unicode-bom = { version = "2.0.3" } bstr = { version = "1.12.0", default-features = false, features = ["std"] } diff --git a/gix-config/src/lib.rs b/gix-config/src/lib.rs index ff1b7a0a76e..4301fdb0899 100644 --- a/gix-config/src/lib.rs +++ b/gix-config/src/lib.rs @@ -54,7 +54,7 @@ doc = ::document_features::document_features!() )] #![cfg_attr(all(doc, feature = "document-features"), feature(doc_cfg))] -#![deny(missing_docs, rust_2018_idioms, unsafe_code)] +#![deny(missing_docs, unsafe_code)] pub mod file; diff --git a/gix-config/src/parse/from_bytes/mod.rs b/gix-config/src/parse/from_bytes/mod.rs new file mode 100644 index 00000000000..80145b5591a --- /dev/null +++ b/gix-config/src/parse/from_bytes/mod.rs @@ -0,0 +1,412 @@ +use std::borrow::Cow; + +use bstr::{BStr, ByteSlice}; + +use crate::parse::{error::ParseNode, section, Comment, Error, Event}; + +type ParseResult = Result; + +/// Attempt to zero-copy parse the provided `input`, passing results to `dispatch`. +/// +/// The `input` is a complete Git config file. A UTF BOM is skipped, leading +/// comments, whitespace, and newlines are emitted first via `dispatch`, +/// and then one or more sections are parsed until EOF. +/// +/// On success, all input is consumed. +/// On failure, the returned [`Error`] reports the line number, the parser node +/// that was active, and the remaining bytes at the point where parsing stopped. +pub fn from_bytes<'i>(mut input: &'i [u8], dispatch: &mut dyn FnMut(Event<'i>)) -> Result<(), Error> { + let original = input; + + let bom = unicode_bom::Bom::from(input); + input = &input[bom.len()..]; + + loop { + let before = input; + if let Ok(comment) = comment(&mut input) { + dispatch(Event::Comment(comment)); + } else if let Ok(whitespace) = take_spaces1(&mut input) { + dispatch(Event::Whitespace(Cow::Borrowed(whitespace))); + } else if let Ok(newline) = take_newlines1(&mut input) { + dispatch(Event::Newline(Cow::Borrowed(newline))); + } + if input.len() == before.len() { + break; + } + } + + if input.is_empty() { + return Ok(()); + } + + let mut node = ParseNode::SectionHeader; + while !input.is_empty() { + section(&mut input, &mut node, dispatch).map_err(|_| Error { + line_number: newlines_from(original, input), + last_attempted_parser: node, + parsed_until: input.as_bstr().into(), + })?; + } + Ok(()) +} + +/// Count newline bytes in `original` up to the beginning of `input`. +/// +/// `rest` is expected to be a suffix of `original`, i.e. the unconsumed input, +/// and the returned count is used as the zero-based parse error line offset. +fn newlines_from(original: &[u8], rest: &[u8]) -> usize { + let consumed = original.len().saturating_sub(rest.len()); + original[..consumed].iter().filter(|c| **c == b'\n').count() +} + +/// Parse a single Git config comment. +/// +/// A comment starts with `;` or `#` and continues until, but not including, the +/// next `\n` or EOF. On success, `i` is advanced to the newline or empty suffix +/// and the returned [`Comment`] borrows the marker and text from the input. +fn comment<'i>(i: &mut &'i [u8]) -> ParseResult> { + let Some((&tag, rest)) = i.split_first() else { + return Err(()); + }; + if tag != b';' && tag != b'#' { + return Err(()); + } + let end = rest.find_byte(b'\n').unwrap_or(rest.len()); + let text = rest[..end].as_bstr(); + *i = &rest[end..]; + Ok(Comment { + tag, + text: Cow::Borrowed(text), + }) +} + +/// Parse a section header and all following items until the next section or EOF. +/// +/// A section starts with a [`section_header`]. The body may contain whitespace, +/// newlines, key/value pairs, and comments in sequence. Parsed items are emitted +/// to `dispatch`, `node` is updated before parsing key names and values for +/// error reporting, and `i` is advanced past all consumed section content. +fn section<'i>(i: &mut &'i [u8], node: &mut ParseNode, dispatch: &mut dyn FnMut(Event<'i>)) -> ParseResult<()> { + let header = section_header(i)?; + dispatch(Event::SectionHeader(header)); + + loop { + let before = *i; + + if let Ok(v) = take_spaces1(i) { + dispatch(Event::Whitespace(Cow::Borrowed(v.as_bstr()))); + } + if let Ok(v) = take_newlines1(i) { + dispatch(Event::Newline(Cow::Borrowed(v.as_bstr()))); + } + + key_value_pair(i, node, dispatch)?; + + if let Ok(comment) = comment(i) { + dispatch(Event::Comment(comment)); + } + + if i.len() == before.len() { + break; + } + } + + Ok(()) +} + +/// Parse a Git config section header. +/// +/// Accepted forms are `[name]`, `[name.subsection]`, and the legacy +/// `[name "subsection"]` form. Section names contain ASCII alphanumeric bytes, +/// `-`, and `.`, and may be empty only for compatibility with Git's quoted +/// subsection form. Quoted subsection names are parsed by [`sub_section`]. On +/// success, `i` is advanced past the closing `]`. +fn section_header<'i>(i: &mut &'i [u8]) -> ParseResult> { + let mut c = *i; + c = c.strip_prefix(b"[").ok_or(())?; + let name = { + let rest = c; + let name_len = rest.iter().take_while(|b| is_section_char(**b)).count(); + c = &rest[name_len..]; + rest[..name_len].as_bstr() + }; + + if let Some(rest) = c.strip_prefix(b"]") { + if name.is_empty() { + return Err(()); + } + *i = rest; + return match name.find_byte(b'.') { + Some(index) => Ok(section::Header { + name: section::Name(Cow::Borrowed(name[..index].as_bstr())), + separator: name.get(index..=index).map(|s| Cow::Borrowed(s.as_bstr())), + subsection_name: name.get(index + 1..).map(|s| Cow::Borrowed(s.as_bstr())), + }), + None => Ok(section::Header { + name: section::Name(Cow::Borrowed(name.as_bstr())), + separator: None, + subsection_name: None, + }), + }; + } + + let whitespace = take_spaces1(&mut c)?; + let Some(rest) = c.strip_prefix(b"\"") else { + return Err(()); + }; + c = rest; + let subsection_name = sub_section(&mut c)?; + let Some(rest) = c.strip_prefix(b"\"]") else { + return Err(()); + }; + *i = rest; + Ok(section::Header { + name: section::Name(Cow::Borrowed(name)), + separator: Some(Cow::Borrowed(whitespace)), + subsection_name: Some(subsection_name), + }) +} + +/// Return true if `c` is accepted in an unquoted section header name. +/// +/// Valid bytes are ASCII alphanumeric characters, `-`, and `.`. +fn is_section_char(c: u8) -> bool { + c.is_ascii_alphanumeric() || c == b'-' || c == b'.' +} + +/// Parse the contents of a quoted legacy subsection name. +/// +/// Input starts immediately after the opening quote in `[section "sub"]`. +/// Parsing stops before the closing quote. Backslash escapes copy the escaped +/// byte into an owned buffer; otherwise the returned value borrows from the +/// input. Newlines and NUL bytes are rejected. On success, `i` is advanced to +/// the closing quote. +fn sub_section<'i>(i: &mut &'i [u8]) -> ParseResult> { + let mut c = *i; + let input = c; + let mut out: Option> = None; + let mut borrowed_len = 0usize; + while let Some(&b) = c.first() { + match b { + b'"' => break, + b'\n' | 0 => return Err(()), + b'\\' => { + let escaped = *c.get(1).ok_or(())?; + if escaped == b'\n' { + return Err(()); + } + let out = out.get_or_insert_with(|| input[..borrowed_len].to_vec()); + out.push(escaped); + c = &c[2..]; + borrowed_len = input.len() - c.len(); + } + _ => { + if let Some(out) = out.as_mut() { + out.push(b); + } + c = &c[1..]; + borrowed_len = input.len() - c.len(); + } + } + } + *i = c; + Ok(match out { + Some(out) => Cow::Owned(out.into()), + None => Cow::Borrowed(input[..borrowed_len].as_bstr()), + }) +} + +/// Parse a config key or value name. +/// +/// Names must start with an ASCII alphabetic byte and may continue with ASCII +/// alphanumeric bytes or `-`. On success, `i` is advanced past the name and the +/// returned value borrows the consumed bytes. +fn config_name<'i>(i: &mut &'i [u8]) -> ParseResult<&'i BStr> { + if !i.first().is_some_and(u8::is_ascii_alphabetic) { + return Err(()); + } + let len = i + .iter() + .take_while(|c| c.is_ascii_alphanumeric() || **c == b'-') + .count(); + let (name, rest) = i.split_at(len); + *i = rest; + Ok(name.as_bstr()) +} + +/// Parse an optional key/value pair in a section body. +/// +/// If a key name is present, this emits [`Event::SectionValueName`], optional +/// whitespace, and then the value events produced by [`config_value`]. If no +/// key name is present, this succeeds without emitting anything. +/// `node` is updated to distinguish name and value parse errors. +fn key_value_pair<'i>(i: &mut &'i [u8], node: &mut ParseNode, dispatch: &mut dyn FnMut(Event<'i>)) -> ParseResult<()> { + *node = ParseNode::Name; + let Ok(name) = config_name(i) else { return Ok(()) }; + + dispatch(Event::SectionValueName(section::ValueName(Cow::Borrowed(name)))); + + if let Ok(whitespace) = take_spaces1(i) { + dispatch(Event::Whitespace(Cow::Borrowed(whitespace))); + } + + *node = ParseNode::Value; + config_value(i, dispatch) +} + +/// Parse the value portion of a key/value pair. +/// +/// If `=` is present, this emits [`Event::KeyValueSeparator`], optional +/// whitespace, and delegates to [`value`]. If `=` is absent, the key is an +/// implicit boolean and an empty [`Event::Value`] is emitted. +fn config_value<'i>(i: &mut &'i [u8], dispatch: &mut dyn FnMut(Event<'i>)) -> ParseResult<()> { + if let Some(rest) = i.strip_prefix(b"=") { + *i = rest; + dispatch(Event::KeyValueSeparator); + if let Ok(whitespace) = take_spaces1(i) { + dispatch(Event::Whitespace(Cow::Borrowed(whitespace))); + } + value(i, dispatch) + } else { + dispatch(Event::Value(Cow::Borrowed("".into()))); + Ok(()) + } +} + +/// Parse a config value and emit value-related events. +/// +/// Values run until newline, EOF, or an unquoted `;` or `#` comment marker. +/// Double quotes toggle quoted mode for comment handling. Supported escapes are +/// backslash followed by `n`, `t`, `\`, `b`, `"`, LF, or CRLF. Line continuations +/// emit [`Event::ValueNotDone`], the continuation newline, and finally [`Event::ValueDone`]. +/// Otherwise a single [`Event::Value`] is emitted with trailing ASCII whitespace +/// trimmed from the logical value. +/// On success, `i` is advanced to the first unconsumed delimiter or EOF. +fn value<'i>(i: &mut &'i [u8], dispatch: &mut dyn FnMut(Event<'i>)) -> ParseResult<()> { + let input = *i; + let mut cursor = 0usize; + let mut value_start = 0usize; + let mut value_end = None; + // While quoted, `;` and `#` remain part of the value instead of starting a comment. + let mut is_in_quotes = false; + // Set after a line continuation so the final chunk is emitted as `ValueDone`. + let mut partial_value_found = false; + + while cursor < input.len() { + match input[cursor] { + b'\n' => { + value_end = Some(cursor); + break; + } + b';' | b'#' if !is_in_quotes => { + value_end = Some(cursor); + break; + } + b'\\' => { + let escape_index = cursor; + cursor += 1; + let mut consumed = 1usize; + let Some(mut b) = input.get(cursor).copied() else { + return Err(()); + }; + if b == b'\r' { + cursor += 1; + b = *input.get(cursor).ok_or(())?; + if b != b'\n' { + return Err(()); + } + consumed += 1; + } + match b { + b'\n' => { + partial_value_found = true; + let value = input[value_start..escape_index].as_bstr(); + dispatch(Event::ValueNotDone(Cow::Borrowed(value))); + let nl_start = escape_index + 1; + let nl = input[nl_start..nl_start + consumed].as_bstr(); + dispatch(Event::Newline(Cow::Borrowed(nl))); + cursor += 1; + value_start = cursor; + value_end = None; + } + b'n' | b't' | b'\\' | b'b' | b'"' => cursor += 1, + _ => return Err(()), + } + } + b'"' => { + is_in_quotes = !is_in_quotes; + cursor += 1; + } + _ => cursor += 1, + } + } + if is_in_quotes { + return Err(()); + } + + let end = value_end.unwrap_or(cursor); + if end == value_start { + dispatch(Event::Value(Cow::Borrowed("".into()))); + *i = &input[cursor..]; + return Ok(()); + } + + let value_end_no_trailing_whitespace = input[value_start..end] + .iter() + .enumerate() + .rev() + .find_map(|(idx, b)| (!b.is_ascii_whitespace()).then_some(value_start + idx + 1)) + .unwrap_or(value_start); + let value = input[value_start..value_end_no_trailing_whitespace].as_bstr(); + if partial_value_found { + dispatch(Event::ValueDone(Cow::Borrowed(value))); + } else { + dispatch(Event::Value(Cow::Borrowed(value))); + } + *i = &input[value_end_no_trailing_whitespace..]; + Ok(()) +} + +/// Parse one or more spaces or horizontal tabs. +/// +/// At least one space or horizontal tab must be present at the current cursor. +/// On success, `i` is advanced past the whitespace run and the returned +/// [`BStr`] borrows the consumed bytes. +fn take_spaces1<'i>(i: &mut &'i [u8]) -> ParseResult<&'i BStr> { + let len = i.iter().take_while(|c| **c == b' ' || **c == b'\t').count(); + if len == 0 { + return Err(()); + } + let (spaces, rest) = i.split_at(len); + *i = rest; + Ok(spaces.as_bstr()) +} + +/// Parse one or more line endings. +/// +/// Both `\n` and `\r\n` are accepted. At least one line ending must be present +/// at the current cursor. On success, `i` is advanced past the newline run and +/// the returned [`BStr`] borrows the consumed bytes. +fn take_newlines1<'i>(i: &mut &'i [u8]) -> ParseResult<&'i BStr> { + let mut c = *i; + let input = c; + let mut cursor = 0usize; + while cursor < input.len() { + if input[cursor..].starts_with(b"\r\n") { + cursor += 2; + } else if input[cursor] == b'\n' { + cursor += 1; + } else { + break; + } + } + if cursor == 0 { + return Err(()); + } + c = &input[cursor..]; + *i = c; + Ok(input[..cursor].as_bstr()) +} + +#[cfg(test)] +mod tests; diff --git a/gix-config/src/parse/nom/tests.rs b/gix-config/src/parse/from_bytes/tests.rs similarity index 72% rename from gix-config/src/parse/nom/tests.rs rename to gix-config/src/parse/from_bytes/tests.rs index fbf735a18fc..e4c7b76c42b 100644 --- a/gix-config/src/parse/nom/tests.rs +++ b/gix-config/src/parse/from_bytes/tests.rs @@ -1,10 +1,49 @@ use super::*; +trait ParsePeekExt<'a, T> { + fn parse_peek(self, input: &'a [u8]) -> Result<(&'a [u8], T), ()>; + fn parse(self, input: &'a [u8]) -> Result; +} + +impl<'a, T, F> ParsePeekExt<'a, T> for F +where + F: FnOnce(&mut &'a [u8]) -> Result, +{ + fn parse_peek(self, mut input: &'a [u8]) -> Result<(&'a [u8], T), ()> { + let value = self(&mut input)?; + Ok((input, value)) + } + + fn parse(self, input: &'a [u8]) -> Result { + let (remaining, value) = self.parse_peek(input)?; + if remaining.is_empty() { + Ok(value) + } else { + Err(()) + } + } +} + +mod config { + use super::from_bytes; + + #[test] + fn key_value_before_first_section_is_rejected() { + assert!( + from_bytes(b"a = b\n", &mut |_| {}).is_err(), + "Git accepts this and reports `a=b`, as git_parse_source() parses alphabetic keys even before any section" + ); + } +} + mod section_headers { - use winnow::prelude::*; + use std::borrow::Cow; - use super::section_header; - use crate::parse::tests::util::{fully_consumed, section_header as parsed_section_header}; + use super::{section_header, ParsePeekExt}; + use crate::parse::{ + section, + tests::util::{fully_consumed, section_header as parsed_section_header}, + }; #[test] fn no_subsection() { @@ -14,6 +53,11 @@ mod section_headers { ); } + #[test] + fn empty_section_name_without_quoted_subsection_is_rejected() { + assert!(section_header.parse_peek(b"[]").is_err()); + } + #[test] fn modern_subsection() { assert_eq!( @@ -22,6 +66,27 @@ mod section_headers { ); } + #[test] + fn empty_section_name_with_quoted_subsection_is_accepted() { + assert_eq!( + section_header.parse_peek(br#"[ "core"]"#).unwrap(), + fully_consumed(section::Header { + name: section::Name(Cow::Borrowed("".into())), + separator: Some(Cow::Borrowed(" ".into())), + subsection_name: Some(Cow::Borrowed("core".into())), + }), + "Git accepts this as an empty section name with `core` as subsection, yielding keys like `.core.bare`; gix does this too for compatibility" + ); + } + + #[test] + fn quoted_section_name_without_leading_space_is_rejected() { + assert!( + section_header.parse_peek(br#"["core"]"#).is_err(), + "Git rejects this as a bad config line" + ); + } + #[test] fn escaped_subsection() { assert_eq!( @@ -78,7 +143,10 @@ mod section_headers { #[test] fn null_byt_in_sub_section() { - assert!(section_header.parse_peek(b"[hello \"hello\0\"]").is_err()); + assert!( + section_header.parse_peek(b"[hello \"hello\0\"]").is_err(), + "Git accepts this because get_extended_base_var() only rejects newline in quoted subsections" + ); } #[test] @@ -91,6 +159,19 @@ mod section_headers { assert!(section_header.parse_peek(br#"[hello "hello\"#).is_err()); } + #[test] + fn missing_closing_bracket_after_quoted_subsection() { + assert!(section_header.parse_peek(br#"[hello "world""#).is_err()); + } + + #[test] + fn whitespace_before_closing_bracket_after_quoted_subsection() { + assert!( + section_header.parse_peek(br#"[hello "world" ]"#).is_err(), + "yes, Git fails here, too!" + ); + } + #[test] fn null_byte_in_header() { assert!(section_header.parse_peek(b"[hello\0]").is_err()); @@ -118,9 +199,7 @@ mod section_headers { mod sub_section { use std::borrow::Cow; - use winnow::prelude::*; - - use super::sub_section; + use super::{sub_section, ParsePeekExt}; #[test] fn zero_copy_simple() { @@ -138,9 +217,7 @@ mod sub_section { } mod config_name { - use winnow::prelude::*; - - use super::config_name; + use super::{config_name, ParsePeekExt}; use crate::parse::tests::util::fully_consumed; #[test] @@ -167,8 +244,6 @@ mod config_name { } mod section { - use winnow::error::InputError; - use crate::parse::{ error::ParseNode, tests::util::{ @@ -179,10 +254,7 @@ mod section { Event, Section, }; - fn section<'a>( - mut i: &'a [u8], - node: &mut ParseNode, - ) -> winnow::ModalResult<(&'a [u8], Section<'a>), InputError<&'a [u8]>> { + fn section<'a>(mut i: &'a [u8], node: &mut ParseNode) -> Result<(&'a [u8], Section<'a>), ()> { let mut header = None; let mut events = Vec::new(); super::section(&mut i, node, &mut |e| match &header { @@ -512,24 +584,20 @@ mod section { mod value_continuation { use bstr::ByteSlice; - use winnow::error::InputError; use crate::parse::{ tests::util::{newline_custom_event, newline_event, value_done_event, value_not_done_event}, Event, }; - pub fn value_impl<'a>( - mut i: &'a [u8], - events: &mut Vec>, - ) -> winnow::ModalResult<(&'a [u8], ()), InputError<&'a [u8]>> { - super::value_impl(&mut i, &mut |e| events.push(e)).map(|_| (i, ())) + pub fn value<'a>(mut i: &'a [u8], events: &mut Vec>) -> Result<(&'a [u8], ()), ()> { + super::value(&mut i, &mut |e| events.push(e)).map(|_| (i, ())) } #[test] fn simple_continuation() { let mut events = Vec::new(); - assert_eq!(value_impl(b"hello\\\nworld", &mut events).unwrap().0, b""); + assert_eq!(value(b"hello\\\nworld", &mut events).unwrap().0, b""); assert_eq!( events, vec![ @@ -543,7 +611,7 @@ mod value_continuation { #[test] fn continuation_with_whitespace() { let mut events = Vec::new(); - assert_eq!(value_impl(b"hello\\\n world", &mut events).unwrap().0, b""); + assert_eq!(value(b"hello\\\n world", &mut events).unwrap().0, b""); assert_eq!( events, vec![ @@ -554,7 +622,7 @@ mod value_continuation { ); let mut events = Vec::new(); - assert_eq!(value_impl(b"hello\\\r\n world", &mut events).unwrap().0, b""); + assert_eq!(value(b"hello\\\r\n world", &mut events).unwrap().0, b""); assert_eq!( events, vec![ @@ -566,7 +634,7 @@ mod value_continuation { let mut events = Vec::new(); assert!( - value_impl(b"hello\\\r\r\n world", &mut events).is_err(), + value(b"hello\\\r\r\n world", &mut events).is_err(), r"\r must be followed by \n" ); } @@ -575,7 +643,7 @@ mod value_continuation { fn complex_continuation_with_leftover_comment() { let mut events = Vec::new(); assert_eq!( - value_impl(b"1 \"\\\"\\\na ; e \"\\\"\\\nd # \"b\t ; c", &mut events) + value(b"1 \"\\\"\\\na ; e \"\\\"\\\nd # \"b\t ; c", &mut events) .unwrap() .0, b" # \"b\t ; c" @@ -595,14 +663,14 @@ mod value_continuation { #[test] fn quote_split_over_two_lines_with_leftover_comment() { let mut events = Vec::new(); - assert_eq!(value_impl(b"\"\\\n;\";a", &mut events).unwrap().0, b";a"); + assert_eq!(value(b"\"\\\n;\";a", &mut events).unwrap().0, b";a"); assert_eq!( events, vec![value_not_done_event("\""), newline_event(), value_done_event(";\"")] ); let mut events = Vec::new(); - assert_eq!(value_impl(b"\"a\\\r\nb;\";c", &mut events).unwrap().0, b";c"); + assert_eq!(value(b"\"a\\\r\nb;\";c", &mut events).unwrap().0, b";c"); assert_eq!( events, vec![ @@ -617,7 +685,7 @@ mod value_continuation { fn quote_split_over_multiple_lines_without_surrounding_quotes_but_inner_quotes() { let mut events = Vec::new(); assert_eq!( - value_impl( + value( br#"1\ "2" a\ \"3 b\"\ @@ -647,7 +715,7 @@ mod value_continuation { fn quote_split_over_multiple_lines_with_surrounding_quotes() { let mut events = Vec::new(); assert_eq!( - value_impl( + value( br#""1\ "2" a\ \"3 b\"\ @@ -675,45 +743,45 @@ mod value_continuation { } mod value_no_continuation { - use super::value_continuation::value_impl; + use super::value_continuation::value; use crate::parse::tests::util::value_event; #[test] fn no_comment() { let mut events = Vec::new(); - assert_eq!(value_impl(b"hello", &mut events).unwrap().0, b""); + assert_eq!(value(b"hello", &mut events).unwrap().0, b""); assert_eq!(events, vec![value_event("hello")]); } #[test] fn windows_newline() { let mut events = Vec::new(); - assert_eq!(value_impl(b"hi\r\nrest", &mut events).unwrap().0, b"\r\nrest"); + assert_eq!(value(b"hi\r\nrest", &mut events).unwrap().0, b"\r\nrest"); assert_eq!(events, vec![value_event("hi")]); events.clear(); - assert_eq!(value_impl(b"hi\r\r\r\nrest", &mut events).unwrap().0, b"\r\r\r\nrest"); + assert_eq!(value(b"hi\r\r\r\nrest", &mut events).unwrap().0, b"\r\r\r\nrest"); assert_eq!(events, vec![value_event("hi")]); } #[test] fn no_comment_newline() { let mut events = Vec::new(); - assert_eq!(value_impl(b"hello\na", &mut events).unwrap().0, b"\na"); + assert_eq!(value(b"hello\na", &mut events).unwrap().0, b"\na"); assert_eq!(events, vec![value_event("hello")]); } #[test] fn semicolon_comment_not_consumed() { let mut events = Vec::new(); - assert_eq!(value_impl(b"hello;world", &mut events).unwrap().0, b";world"); + assert_eq!(value(b"hello;world", &mut events).unwrap().0, b";world"); assert_eq!(events, vec![value_event("hello")]); } #[test] fn octothorpe_comment_not_consumed() { let mut events = Vec::new(); - assert_eq!(value_impl(b"hello#world", &mut events).unwrap().0, b"#world"); + assert_eq!(value(b"hello#world", &mut events).unwrap().0, b"#world"); assert_eq!(events, vec![value_event("hello")]); } @@ -721,7 +789,7 @@ mod value_no_continuation { fn values_with_extraneous_whitespace_without_comment() { let mut events = Vec::new(); assert_eq!( - value_impl(b"hello ", &mut events).unwrap().0, + value(b"hello ", &mut events).unwrap().0, b" " ); assert_eq!(events, vec![value_event("hello")]); @@ -731,14 +799,14 @@ mod value_no_continuation { fn values_with_extraneous_whitespace_before_comment() { let mut events = Vec::new(); assert_eq!( - value_impl(b"hello #world", &mut events).unwrap().0, + value(b"hello #world", &mut events).unwrap().0, b" #world" ); assert_eq!(events, vec![value_event("hello")]); let mut events = Vec::new(); assert_eq!( - value_impl(b"hello ;world", &mut events).unwrap().0, + value(b"hello ;world", &mut events).unwrap().0, b" ;world" ); assert_eq!(events, vec![value_event("hello")]); @@ -748,52 +816,49 @@ mod value_no_continuation { #[allow(clippy::needless_raw_string_hashes)] fn trans_escaped_comment_marker_not_consumed() { let mut events = Vec::new(); - assert_eq!(value_impl(br##"hello"#"world; a"##, &mut events).unwrap().0, b"; a"); + assert_eq!(value(br##"hello"#"world; a"##, &mut events).unwrap().0, b"; a"); assert_eq!(events, vec![value_event(r##"hello"#"world"##)]); } #[test] fn complex_test() { let mut events = Vec::new(); - assert_eq!(value_impl(br#"value";";ahhhh"#, &mut events).unwrap().0, b";ahhhh"); + assert_eq!(value(br#"value";";ahhhh"#, &mut events).unwrap().0, b";ahhhh"); assert_eq!(events, vec![value_event(r#"value";""#)]); } #[test] fn garbage_after_continuation_is_err() { - assert!(value_impl(br"hello \afwjdls", &mut Default::default()).is_err()); + assert!(value(br"hello \afwjdls", &mut Default::default()).is_err()); } #[test] fn invalid_escape() { - assert!(value_impl(br"\x", &mut Default::default()).is_err()); + assert!(value(br"\x", &mut Default::default()).is_err()); } #[test] fn incomplete_quote() { - assert!(value_impl(br#"hello "world"#, &mut Default::default()).is_err()); + assert!(value(br#"hello "world"#, &mut Default::default()).is_err()); } #[test] fn incomplete_escape() { - assert!(value_impl(br"hello world\", &mut Default::default()).is_err()); + assert!( + value(br"hello world\", &mut Default::default()).is_err(), + "Git accepts this because EOF is normalized to newline and the trailing backslash becomes a continuation" + ); } } mod key_value_pair { - use winnow::error::InputError; - use crate::parse::{ error::ParseNode, tests::util::{name_event, value_event, whitespace_event}, Event, }; - fn key_value<'a>( - mut i: &'a [u8], - node: &mut ParseNode, - events: &mut Vec>, - ) -> winnow::ModalResult<(&'a [u8], ()), InputError<&'a [u8]>> { + fn key_value<'a>(mut i: &'a [u8], node: &mut ParseNode, events: &mut Vec>) -> Result<(&'a [u8], ()), ()> { super::key_value_pair(&mut i, node, &mut |e| events.push(e)).map(|_| (i, ())) } @@ -851,10 +916,140 @@ mod key_value_pair { } } -mod comment { - use winnow::prelude::*; +mod value { + use super::value; + use crate::parse::{ + tests::util::{newline_custom_event, newline_event, value_done_event, value_event, value_not_done_event}, + Event, + }; + + fn parse(mut input: &[u8]) -> Result<(&[u8], Vec>), ()> { + let mut events = Vec::new(); + value(&mut input, &mut |event| events.push(event))?; + Ok((input, events)) + } + + #[test] + fn empty_value() { + let (remaining, events) = parse(b"").unwrap(); + assert_eq!(remaining, b""); + assert_eq!(events, vec![value_event("")]); + } + + #[test] + fn plain_value_runs_until_eof_and_trims_trailing_whitespace() { + let (remaining, events) = parse(b"hello \t").unwrap(); + assert_eq!(remaining, b" \t"); + assert_eq!(events, vec![value_event("hello")]); + } - use super::comment; + #[test] + fn newline_without_backslash_is_not_a_continuation() { + let (remaining, events) = parse(b"config\n value").unwrap(); + assert_eq!(remaining, b"\n value"); + assert_eq!(events, vec![value_event("config")]); + } + + #[test] + fn unquoted_comment_markers_end_the_value() { + let (remaining, events) = parse(b"hello ;comment").unwrap(); + assert_eq!(remaining, b" ;comment"); + assert_eq!(events, vec![value_event("hello")]); + + let (remaining, events) = parse(b"hello #comment").unwrap(); + assert_eq!(remaining, b" #comment"); + assert_eq!(events, vec![value_event("hello")]); + } + + #[test] + fn quoted_comment_markers_remain_part_of_the_value() { + let (remaining, events) = parse(br#""a;b#c";comment"#).unwrap(); + assert_eq!(remaining, b";comment"); + assert_eq!(events, vec![value_event(r#""a;b#c""#)]); + } + + #[test] + fn allowed_escapes_remain_part_of_the_value() { + let (remaining, events) = parse(br#"\n\t\\\b\""#).unwrap(); + assert_eq!(remaining, b""); + assert_eq!(events, vec![value_event(r#"\n\t\\\b\""#)]); + } + + #[test] + fn backslash_lf_continuation_is_allowed() { + let (remaining, events) = parse(b"hello\\\n world").unwrap(); + assert_eq!(remaining, b""); + assert_eq!( + events, + vec![ + value_not_done_event("hello"), + newline_event(), + value_done_event(" world") + ] + ); + } + + #[test] + fn backslash_crlf_continuation_is_allowed() { + let (remaining, events) = parse(b"hello\\\r\n world").unwrap(); + assert_eq!(remaining, b""); + assert_eq!( + events, + vec![ + value_not_done_event("hello"), + newline_custom_event("\r\n"), + value_done_event(" world") + ] + ); + } + + #[test] + fn continuations_keep_quote_state() { + let (remaining, events) = parse( + br#""a\ +;b";comment"#, + ) + .unwrap(); + assert_eq!(remaining, b";comment"); + assert_eq!( + events, + vec![value_not_done_event("\"a"), newline_event(), value_done_event(";b\"")] + ); + } + + #[test] + fn backslash_cr_without_lf_is_rejected() { + assert!(parse(b"hello\\\r world").is_err()); + } + + #[test] + fn backslash_cr_crlf_is_rejected() { + assert!(parse(b"hello\\\r\r\n world").is_err()); + } + + #[test] + fn trailing_backslash_is_rejected() { + assert!( + parse(b"hello\\").is_err(), + "Git accepts this because get_next_char() maps EOF to newline, which parse_value() treats as a continuation" + ); + } + + #[test] + fn unsupported_escapes_are_rejected() { + assert!(parse(br"\a").is_err()); + assert!(parse(br"\x").is_err()); + assert!(parse(b"\\\0").is_err()); + } + + #[test] + fn unterminated_quote_is_rejected() { + assert!(parse(br#""hello"#).is_err()); + } +} + +mod comment { + use super::{comment, ParsePeekExt}; use crate::parse::tests::util::{comment as parsed_comment, fully_consumed}; #[test] diff --git a/gix-config/src/parse/mod.rs b/gix-config/src/parse/mod.rs index 1f7713ece6b..e2a72a0c690 100644 --- a/gix-config/src/parse/mod.rs +++ b/gix-config/src/parse/mod.rs @@ -14,8 +14,9 @@ use std::{borrow::Cow, hash::Hash}; use bstr::BStr; -mod nom; -pub use self::nom::from_bytes; +mod from_bytes; +pub use self::from_bytes::from_bytes; + mod event; #[path = "events.rs"] mod events_type; diff --git a/gix-config/src/parse/nom/mod.rs b/gix-config/src/parse/nom/mod.rs deleted file mode 100644 index c5b3c27ca9a..00000000000 --- a/gix-config/src/parse/nom/mod.rs +++ /dev/null @@ -1,377 +0,0 @@ -use std::borrow::Cow; - -use bstr::{BStr, ByteSlice}; -use winnow::{ - combinator::{alt, delimited, opt, preceded, repeat}, - error::{ErrMode, InputError as NomError, ParserError as _}, - prelude::*, - stream::Offset as _, - token::{one_of, take_till, take_while}, -}; - -use crate::parse::{error::ParseNode, section, Comment, Error, Event}; - -/// Attempt to zero-copy parse the provided bytes, passing results to `dispatch`. -pub fn from_bytes<'i>(mut input: &'i [u8], dispatch: &mut dyn FnMut(Event<'i>)) -> Result<(), Error> { - let start = input.checkpoint(); - - let bom = unicode_bom::Bom::from(input); - input.next_slice(bom.len()); - - repeat( - 0.., - alt(( - comment.map(Event::Comment), - take_spaces1.map(|whitespace| Event::Whitespace(Cow::Borrowed(whitespace))), - |i: &mut &'i [u8]| { - let newline = take_newlines1.parse_next(i)?; - let o = Event::Newline(Cow::Borrowed(newline)); - Ok(o) - }, - )), - ) - .fold(|| (), |_acc, event| dispatch(event)) - .parse_next(&mut input) - // I don't think this can panic. many0 errors if the child parser returns - // a success where the input was not consumed, but alt will only return Ok - // if one of its children succeed. However, all of it's children are - // guaranteed to consume something if they succeed, so the Ok(i) == i case - // can never occur. - .expect("many0(alt(...)) panicked. Likely a bug in one of the children parsers."); - - if input.is_empty() { - return Ok(()); - } - - let mut node = ParseNode::SectionHeader; - - let res = repeat(1.., |i: &mut &'i [u8]| section(i, &mut node, dispatch)) - .map(|()| ()) - .parse_next(&mut input); - res.map_err(|_| { - let newlines = newlines_from(input, start); - Error { - line_number: newlines, - last_attempted_parser: node, - parsed_until: input.as_bstr().into(), - } - })?; - - // This needs to happen after we collect sections, otherwise the line number - // will be off. - if !input.is_empty() { - let newlines = newlines_from(input, start); - return Err(Error { - line_number: newlines, - last_attempted_parser: node, - parsed_until: input.as_bstr().into(), - }); - } - - Ok(()) -} - -fn newlines_from(input: &[u8], start: winnow::stream::Checkpoint<&[u8], &[u8]>) -> usize { - let offset = input.offset_from(&start); - let mut start_input = input; - start_input.reset(&start); - start_input.next_slice(offset).iter().filter(|c| **c == b'\n').count() -} - -fn comment<'i>(i: &mut &'i [u8]) -> ModalResult, NomError<&'i [u8]>> { - ( - one_of([';', '#']), - take_till(0.., |c| c == b'\n').map(|text: &[u8]| Cow::Borrowed(text.as_bstr())), - ) - .map(|(tag, text)| Comment { tag, text }) - .parse_next(i) -} - -#[cfg(test)] -mod tests; - -fn section<'i>( - i: &mut &'i [u8], - node: &mut ParseNode, - dispatch: &mut dyn FnMut(Event<'i>), -) -> ModalResult<(), NomError<&'i [u8]>> { - let start = i.checkpoint(); - let header = section_header(i).inspect_err(|_err| { - i.reset(&start); - })?; - dispatch(Event::SectionHeader(header)); - - // This would usually be a many0(alt(...)), the manual loop allows us to - // optimize vec insertions - loop { - let start = i.checkpoint(); - - if let Some(v) = opt(take_spaces1).parse_next(i)? { - dispatch(Event::Whitespace(Cow::Borrowed(v.as_bstr()))); - } - - if let Some(v) = opt(take_newlines1).parse_next(i)? { - dispatch(Event::Newline(Cow::Borrowed(v.as_bstr()))); - } - - key_value_pair(i, node, dispatch)?; - - if let Some(comment) = opt(comment).parse_next(i)? { - dispatch(Event::Comment(comment)); - } - - if i.offset_from(&start) == 0 { - break; - } - } - - Ok(()) -} - -fn section_header<'i>(i: &mut &'i [u8]) -> ModalResult, NomError<&'i [u8]>> { - // No spaces must be between section name and section start - let name = preceded('[', take_while(1.., is_section_char).map(bstr::ByteSlice::as_bstr)).parse_next(i)?; - - if opt(one_of::<_, _, ErrMode>>(']')) - .parse_next(i)? - .is_some() - { - // Either section does not have a subsection or using deprecated - // subsection syntax at this point. - let header = match memchr::memrchr(b'.', name.as_bytes()) { - Some(index) => section::Header { - name: section::Name(Cow::Borrowed(name[..index].as_bstr())), - separator: name.get(index..=index).map(|s| Cow::Borrowed(s.as_bstr())), - subsection_name: name.get(index + 1..).map(|s| Cow::Borrowed(s.as_bstr())), - }, - None => section::Header { - name: section::Name(Cow::Borrowed(name.as_bstr())), - separator: None, - subsection_name: None, - }, - }; - - if header.name.is_empty() { - return Err(winnow::error::ErrMode::from_input(i)); - } - return Ok(header); - } - - // Section header must be using modern subsection syntax at this point. - (take_spaces1, delimited('"', opt(sub_section), "\"]")) - .map(|(whitespace, subsection_name)| section::Header { - name: section::Name(Cow::Borrowed(name)), - separator: Some(Cow::Borrowed(whitespace)), - subsection_name, - }) - .parse_next(i) -} - -fn is_section_char(c: u8) -> bool { - c.is_ascii_alphanumeric() || c == b'-' || c == b'.' -} - -fn sub_section<'i>(i: &mut &'i [u8]) -> ModalResult, NomError<&'i [u8]>> { - let mut output = Cow::Borrowed(Default::default()); - if let Some(sub) = opt(subsection_subset).parse_next(i)? { - output = Cow::Borrowed(sub.as_bstr()); - } - while let Some(sub) = opt(subsection_subset).parse_next(i)? { - output.to_mut().extend(sub); - } - - Ok(output) -} - -fn subsection_subset<'i>(i: &mut &'i [u8]) -> ModalResult<&'i [u8], NomError<&'i [u8]>> { - alt((subsection_unescaped, subsection_escaped_char)).parse_next(i) -} - -fn subsection_unescaped<'i>(i: &mut &'i [u8]) -> ModalResult<&'i [u8], NomError<&'i [u8]>> { - take_while(1.., is_subsection_unescaped_char).parse_next(i) -} - -fn subsection_escaped_char<'i>(i: &mut &'i [u8]) -> ModalResult<&'i [u8], NomError<&'i [u8]>> { - preceded('\\', one_of(is_subsection_escapable_char).take()).parse_next(i) -} - -fn is_subsection_escapable_char(c: u8) -> bool { - c != b'\n' -} - -fn is_subsection_unescaped_char(c: u8) -> bool { - c != b'"' && c != b'\\' && c != b'\n' && c != 0 -} - -fn key_value_pair<'i>( - i: &mut &'i [u8], - node: &mut ParseNode, - dispatch: &mut dyn FnMut(Event<'i>), -) -> ModalResult<(), NomError<&'i [u8]>> { - *node = ParseNode::Name; - if let Some(name) = opt(config_name).parse_next(i)? { - dispatch(Event::SectionValueName(section::ValueName(Cow::Borrowed(name)))); - - if let Some(whitespace) = opt(take_spaces1).parse_next(i)? { - dispatch(Event::Whitespace(Cow::Borrowed(whitespace))); - } - - *node = ParseNode::Value; - config_value(i, dispatch) - } else { - Ok(()) - } -} - -/// Parses the config name of a config pair. Assumes the input has already been -/// trimmed of any leading whitespace. -fn config_name<'i>(i: &mut &'i [u8]) -> ModalResult<&'i BStr, NomError<&'i [u8]>> { - ( - one_of(|c: u8| c.is_ascii_alphabetic()), - take_while(0.., |c: u8| c.is_ascii_alphanumeric() || c == b'-'), - ) - .take() - .map(bstr::ByteSlice::as_bstr) - .parse_next(i) -} - -fn config_value<'i>(i: &mut &'i [u8], dispatch: &mut dyn FnMut(Event<'i>)) -> ModalResult<(), NomError<&'i [u8]>> { - if opt('=').parse_next(i)?.is_some() { - dispatch(Event::KeyValueSeparator); - if let Some(whitespace) = opt(take_spaces1).parse_next(i)? { - dispatch(Event::Whitespace(Cow::Borrowed(whitespace))); - } - value_impl(i, dispatch) - } else { - // This is a special way of denoting 'empty' values which a lot of code depends on. - // Hence, rather to fix this everywhere else, leave it here and fix it where it matters, namely - // when it's about differentiating between a missing key-value separator, and one followed by emptiness. - dispatch(Event::Value(Cow::Borrowed("".into()))); - Ok(()) - } -} - -/// Handles parsing of known-to-be values. This function handles both single -/// line values as well as values that are continuations. -fn value_impl<'i>(i: &mut &'i [u8], dispatch: &mut dyn FnMut(Event<'i>)) -> ModalResult<(), NomError<&'i [u8]>> { - let start_checkpoint = i.checkpoint(); - let mut value_start_checkpoint = i.checkpoint(); - let mut value_end = None; - - // This is required to ignore comment markers if they're in a quote. - let mut is_in_quotes = false; - // Used to determine if we return a Value or Value{Not,}Done - let mut partial_value_found = false; - - loop { - let _ = take_while(0.., |c| !matches!(c, b'\n' | b'\\' | b'"' | b';' | b'#')).parse_next(i)?; - if let Some(c) = i.next_token() { - match c { - b'\n' => { - value_end = Some(i.offset_from(&value_start_checkpoint) - 1); - break; - } - b';' | b'#' if !is_in_quotes => { - value_end = Some(i.offset_from(&value_start_checkpoint) - 1); - break; - } - b'\\' => { - let escaped_index = i.offset_from(&value_start_checkpoint); - let escape_index = escaped_index - 1; - let Some(mut c) = i.next_token() else { - i.reset(&start_checkpoint); - return Err(winnow::error::ErrMode::from_input(i)); - }; - let mut consumed = 1; - if c == b'\r' { - c = i.next_token().ok_or_else(|| { - i.reset(&start_checkpoint); - winnow::error::ErrMode::from_input(i) - })?; - if c != b'\n' { - i.reset(&start_checkpoint); - return Err(winnow::error::ErrMode::from_input(i)); - } - consumed += 1; - } - - match c { - b'\n' => { - partial_value_found = true; - - i.reset(&value_start_checkpoint); - - let value = i.next_slice(escape_index).as_bstr(); - dispatch(Event::ValueNotDone(Cow::Borrowed(value))); - - i.next_token(); - - let nl = i.next_slice(consumed).as_bstr(); - dispatch(Event::Newline(Cow::Borrowed(nl))); - - value_start_checkpoint = i.checkpoint(); - value_end = None; - } - b'n' | b't' | b'\\' | b'b' | b'"' => {} - _ => { - i.reset(&start_checkpoint); - return Err(winnow::error::ErrMode::from_input(i)); - } - } - } - b'"' => is_in_quotes = !is_in_quotes, - _ => {} - } - } else { - break; - } - } - if is_in_quotes { - i.reset(&start_checkpoint); - return Err(winnow::error::ErrMode::from_input(i)); - } - - let value_end = match value_end { - None => { - let last_value_index = i.offset_from(&value_start_checkpoint); - if last_value_index == 0 { - dispatch(Event::Value(Cow::Borrowed("".into()))); - return Ok(()); - } else { - last_value_index - } - } - Some(idx) => idx, - }; - - i.reset(&value_start_checkpoint); - let value_end_no_trailing_whitespace = i[..value_end] - .iter() - .enumerate() - .rev() - .find_map(|(idx, b)| (!b.is_ascii_whitespace()).then_some(idx + 1)) - .unwrap_or(0); - let remainder_value = i.next_slice(value_end_no_trailing_whitespace); - - if partial_value_found { - dispatch(Event::ValueDone(Cow::Borrowed(remainder_value.as_bstr()))); - } else { - dispatch(Event::Value(Cow::Borrowed(remainder_value.as_bstr()))); - } - - Ok(()) -} - -fn take_spaces1<'i>(i: &mut &'i [u8]) -> ModalResult<&'i BStr, NomError<&'i [u8]>> { - take_while(1.., winnow::stream::AsChar::is_space) - .map(bstr::ByteSlice::as_bstr) - .parse_next(i) -} - -fn take_newlines1<'i>(i: &mut &'i [u8]) -> ModalResult<&'i BStr, NomError<&'i [u8]>> { - repeat(1..1024, alt(("\r\n", "\n"))) - .map(|()| ()) - .take() - .map(bstr::ByteSlice::as_bstr) - .parse_next(i) -} diff --git a/gix-mailmap/fuzz/fuzz_targets/mailmap.rs b/gix-mailmap/fuzz/fuzz_targets/mailmap.rs index 1450f55435b..11cdc524c81 100644 --- a/gix-mailmap/fuzz/fuzz_targets/mailmap.rs +++ b/gix-mailmap/fuzz/fuzz_targets/mailmap.rs @@ -27,7 +27,7 @@ fn resolve(snapshot: &Snapshot, input: &[u8]) { b"Jane 1 +0000".as_slice(), b"Unknown 1 +0000".as_slice(), ] { - let Ok(signature) = SignatureRef::from_bytes::<()>(candidate) else { + let Ok(signature) = SignatureRef::from_bytes(candidate) else { continue; }; _ = black_box(snapshot.try_resolve_ref(signature)); diff --git a/gix-mailmap/src/lib.rs b/gix-mailmap/src/lib.rs index 11501001499..260dd3775e9 100644 --- a/gix-mailmap/src/lib.rs +++ b/gix-mailmap/src/lib.rs @@ -18,7 +18,7 @@ //! //! let snapshot = gix_mailmap::Snapshot::new(parsed); //! let resolved = snapshot.resolve( -//! SignatureRef::from_bytes::<()>(b"Jane 1711398853 +0800").unwrap(), +//! SignatureRef::from_bytes(b"Jane 1711398853 +0800").unwrap(), //! ); //! //! assert_eq!(resolved.name, "Jane Doe"); diff --git a/gix-object/Cargo.toml b/gix-object/Cargo.toml index 66401014432..018e392f145 100644 --- a/gix-object/Cargo.toml +++ b/gix-object/Cargo.toml @@ -36,12 +36,6 @@ serde = [ "gix-hash/serde", "gix-actor/serde", ] -## When parsing objects by default errors will only be available on the granularity of success or failure, and with the above flag enabled -## details information about the error location will be collected. -## Use it in applications which expect broken or invalid objects or for debugging purposes. Incorrectly formatted objects aren't at all -## common otherwise. -verbose-object-parsing-errors = ["winnow/std"] - [dependencies] gix-features = { version = "^0.47.0", path = "../gix-features", features = [ "progress", @@ -51,6 +45,7 @@ gix-hashtable = { version = "^0.14.0", path = "../gix-hashtable" } gix-validate = { version = "^0.11.1", path = "../gix-validate" } gix-actor = { version = "^0.40.1", path = "../gix-actor" } gix-date = { version = "^0.15.2", path = "../gix-date" } +gix-error = { version = "^0.2.2", path = "../gix-error" } gix-utils = { version = "^0.3.2", path = "../gix-utils" } itoa = "1.0.17" @@ -59,7 +54,6 @@ bstr = { version = "1.12.0", default-features = false, features = [ "std", "unicode", ] } -winnow = { version = "1.0.0", features = ["simd"] } smallvec = { version = "1.15.1", features = ["write"] } serde = { version = "1.0.114", optional = true, default-features = false, features = [ "derive", diff --git a/gix-object/src/commit/decode.rs b/gix-object/src/commit/decode.rs index f68b82b6aba..5882b4e5c84 100644 --- a/gix-object/src/commit/decode.rs +++ b/gix-object/src/commit/decode.rs @@ -1,74 +1,98 @@ use std::borrow::Cow; use smallvec::SmallVec; -use winnow::{ - combinator::{alt, eof, opt, preceded, repeat, terminated}, - error::{AddContext, ParserError, StrContext}, - prelude::*, - token::{rest, take_till}, -}; -use crate::{parse, parse::NL, BStr, ByteSlice, CommitRef}; +use crate::{parse, parse::ParseResult, BStr, ByteSlice, CommitRef}; -pub fn message<'a, E: ParserError<&'a [u8]> + AddContext<&'a [u8], StrContext>>( - i: &mut &'a [u8], -) -> ModalResult<&'a BStr, E> { - if i.is_empty() { - // newline + [message] - let start = i.checkpoint(); - return Err(winnow::error::ErrMode::from_input(i).add_context( - i, - &start, - StrContext::Expected("newline + ".into()), - )); +/// Parse the commit message after the header/message separator. +/// +/// Typical input starts with the blank-line separator before the message, for +/// example `\nsubject\n\nbody\n`. The returned message excludes that first +/// separator newline and borrows all remaining bytes from `i`. +/// +/// On success, `i` is advanced to the empty suffix as commits end with a message. +pub fn message<'a>(i: &mut &'a [u8]) -> ParseResult<&'a BStr> { + if let Some(rest) = i.strip_prefix(parse::NL) { + *i = &[]; + Ok(rest.as_bstr()) + } else { + Err(crate::decode::Error) } - preceded(NL, rest.map(ByteSlice::as_bstr)) - .context(StrContext::Expected( - "a newline separates headers from the message".into(), - )) - .parse_next(i) } -pub fn commit<'a, E: ParserError<&'a [u8]> + AddContext<&'a [u8], StrContext>>( - i: &mut &'a [u8], -) -> ModalResult, E> { - ( - (|i: &mut _| parse::header_field(i, b"tree", parse::hex_hash)) - .context(StrContext::Expected("tree <40 lowercase hex char>".into())), - repeat(0.., |i: &mut _| parse::header_field(i, b"parent", parse::hex_hash)) - .map(|p: Vec<_>| p) - .context(StrContext::Expected( - "zero or more 'parent <40 lowercase hex char>'".into(), - )), - (|i: &mut _| parse::header_field(i, b"author", parse::signature_and_consumed).map(|(_signature, raw)| raw)) - .context(StrContext::Expected("author ".into())), - (|i: &mut _| parse::header_field(i, b"committer", parse::signature_and_consumed).map(|(_signature, raw)| raw)) - .context(StrContext::Expected("committer ".into())), - opt(|i: &mut _| parse::header_field(i, b"encoding", take_till(0.., NL))) - .context(StrContext::Expected("encoding ".into())), - repeat( - 0.., - alt(( - parse::any_header_field_multi_line.map(|(k, o)| (k.as_bstr(), Cow::Owned(o))), - |i: &mut _| { - parse::any_header_field(i, take_till(0.., NL)) - .map(|(k, o)| (k.as_bstr(), Cow::Borrowed(o.as_bstr()))) - }, - )), - ) - .context(StrContext::Expected(" ".into())), - terminated(message, eof), - ) - .map( - |(tree, parents, author, committer, encoding, extra_headers, message)| CommitRef { - tree, - parents: SmallVec::from(parents), - author, - committer, - encoding: encoding.map(ByteSlice::as_bstr), - message, - extra_headers, - }, - ) - .parse_next(i) +/// Parse a complete commit object body. +/// +/// Typical input starts with `tree \n`, followed by zero or more +/// `parent \n` headers, then `author \n` and +/// `committer \n`. An optional `encoding \n` header and any +/// number of extra single-line or multi-line headers may follow. The headers +/// are terminated by a blank line, after which all remaining bytes are the +/// commit message. +/// +/// On success, the returned [`CommitRef`] borrows fields from `i` where +/// possible, and `i` is advanced to the empty suffix. Extra single-line header +/// values are borrowed, while multi-line header values are unfolded into owned +/// buffers. +/// +/// This parser is not transactional as a whole: if a later required field or +/// the final message parse fails, `i` may already have been advanced past +/// earlier successfully parsed fields. +pub fn commit<'a>(i: &mut &'a [u8]) -> ParseResult> { + let tree = parse::header_field(i, b"tree", parse::hex_hash)?; + + let mut parents = SmallVec::new(); + loop { + let before = *i; + match parse::header_field(i, b"parent", parse::hex_hash) { + Ok(parent) => parents.push(parent), + Err(_) => { + *i = before; + break; + } + } + } + + let author = parse::header_field(i, b"author", parse::signature_raw)?; + let committer = parse::header_field(i, b"committer", parse::signature_raw)?; + + let before = *i; + let encoding = match parse::header_field(i, b"encoding", Ok) { + Ok(encoding) => Some(encoding.as_bstr()), + Err(_) => { + *i = before; + None + } + }; + + let mut extra_headers = Vec::new(); + loop { + let before = *i; + match parse::any_header_field_multi_line(i) + .map(|(k, v)| (k.as_bstr(), Cow::Owned(v))) + .or_else(|_| { + *i = before; + parse::any_header_field(i).map(|(k, v)| (k.as_bstr(), Cow::Borrowed(v.as_bstr()))) + }) { + Ok(header) => extra_headers.push(header), + Err(_) => { + *i = before; + break; + } + } + } + + let message = message(i)?; + if !i.is_empty() { + return Err(crate::decode::Error); + } + + Ok(CommitRef { + tree, + parents, + author, + committer, + encoding, + message, + extra_headers, + }) } diff --git a/gix-object/src/commit/message/decode.rs b/gix-object/src/commit/message/decode.rs index fddb3d4d6d8..3ef600a6112 100644 --- a/gix-object/src/commit/message/decode.rs +++ b/gix-object/src/commit/message/decode.rs @@ -1,49 +1,26 @@ -use winnow::{ - combinator::{alt, eof, preceded, terminated}, - error::ParserError, - prelude::*, - stream::{Offset, Stream}, - token::{rest, take_till}, -}; - use crate::bstr::{BStr, ByteSlice}; -pub(crate) fn newline<'a, E: ParserError<&'a [u8]>>(i: &mut &'a [u8]) -> ModalResult<&'a [u8], E> { - alt((b"\n", b"\r\n")).parse_next(i) -} - -fn subject_and_body<'a, E: ParserError<&'a [u8]>>(i: &mut &'a [u8]) -> ModalResult<(&'a BStr, Option<&'a BStr>), E> { - let start_i = *i; - let start = i.checkpoint(); - while !i.is_empty() { - match take_till::<_, _, E>(1.., |c| c == b'\n' || c == b'\r').parse_next(i) { - Ok(_) => { - let consumed_bytes = i.offset_from(&start); - match preceded((newline::, newline::), rest).parse_next(i) { - Ok(body) => { - let body = (!body.is_empty()).then(|| body.as_bstr()); - return Ok((start_i[0usize..consumed_bytes].as_bstr(), body)); - } - Err(_) => match i.next_token() { - Some(_) => {} - None => break, - }, - } +/// Returns title and body, without separator +pub fn message_title_and_body(input: &[u8]) -> (&BStr, Option<&BStr>) { + let mut pos = 0; + while pos < input.len() { + if let Some(first_len) = newline_len(&input[pos..]) { + if let Some(second_len) = newline_len(&input[pos + first_len..]) { + let body = &input[pos + first_len + second_len..]; + return (input[..pos].as_bstr(), (!body.is_empty()).then(|| body.as_bstr())); } - Err(_) => match i.next_token() { - Some(_) => {} - None => break, - }, } + pos += 1; } - - i.reset(&start); - rest.map(|r: &[u8]| (r.as_bstr(), None)).parse_next(i) + (input.as_bstr(), None) } -/// Returns title and body, without separator -pub fn message(mut input: &[u8]) -> (&BStr, Option<&BStr>) { - terminated(subject_and_body::<()>, eof) - .parse_next(&mut input) - .expect("cannot fail") +fn newline_len(input: &[u8]) -> Option { + if input.starts_with(b"\r\n") { + Some(2) + } else if input.starts_with(b"\n") { + Some(1) + } else { + None + } } diff --git a/gix-object/src/commit/message/mod.rs b/gix-object/src/commit/message/mod.rs index d79c3772923..986e1a2cb5e 100644 --- a/gix-object/src/commit/message/mod.rs +++ b/gix-object/src/commit/message/mod.rs @@ -60,7 +60,7 @@ impl<'a> MessageRef<'a> { /// /// Note that this cannot fail as everything will be interpreted as title if there is no body separator. pub fn from_bytes(input: &'a [u8]) -> Self { - let (title, body) = decode::message(input); + let (title, body) = decode::message_title_and_body(input); MessageRef { title, body } } diff --git a/gix-object/src/commit/mod.rs b/gix-object/src/commit/mod.rs index 6d0219d4250..a33d70bf71b 100644 --- a/gix-object/src/commit/mod.rs +++ b/gix-object/src/commit/mod.rs @@ -1,7 +1,6 @@ use std::ops::Range; use bstr::{BStr, BString, ByteSlice}; -use winnow::prelude::*; use crate::parse::parse_signature; use crate::{Commit, CommitRef, TagRef}; @@ -66,9 +65,9 @@ impl<'a> CommitRef<'a> { /// Deserialize a commit from the given `data` bytes while avoiding most allocations. pub fn from_bytes(mut data: &'a [u8]) -> Result, crate::decode::Error> { let input = &mut data; - match decode::commit.parse_next(input) { + match decode::commit(input) { Ok(tag) => Ok(tag), - Err(err) => Err(crate::decode::Error::with_err(err, input)), + Err(err) => Err(err), } } } diff --git a/gix-object/src/commit/ref_iter.rs b/gix-object/src/commit/ref_iter.rs index 6a7eb2c778a..c400b495cbb 100644 --- a/gix-object/src/commit/ref_iter.rs +++ b/gix-object/src/commit/ref_iter.rs @@ -2,18 +2,11 @@ use std::{borrow::Cow, ops::Range}; use bstr::BStr; use gix_hash::{oid, ObjectId}; -use winnow::{ - combinator::{alt, eof, opt, terminated}, - error::StrContext, - prelude::*, - token::take_till, -}; use crate::{ bstr::ByteSlice, commit::{decode, SignedData, SIGNATURE_FIELD_NAME}, - parse::{self, NL}, - CommitRefIter, + parse, CommitRefIter, }; #[derive(Copy, Clone)] @@ -157,91 +150,79 @@ impl<'a> CommitRefIter<'a> { let input = &mut i; match Self::next_inner_(input, state) { Ok(token) => Ok((*input, token)), - Err(err) => Err(crate::decode::Error::with_err(err, input)), + Err(err) => Err(err), } } - fn next_inner_( - input: &mut &'a [u8], - state: &mut State, - ) -> Result, winnow::error::ErrMode> { + fn next_inner_(input: &mut &'a [u8], state: &mut State) -> Result, crate::decode::Error> { use State::*; Ok(match state { Tree => { - let tree = (|i: &mut _| parse::header_field(i, b"tree", parse::hex_hash)) - .context(StrContext::Expected("tree <40 lowercase hex char>".into())) - .parse_next(input)?; + let tree = parse::header_field(input, b"tree", parse::hex_hash)?; *state = State::Parents; Token::Tree { id: ObjectId::from_hex(tree).expect("parsing validation"), } } Parents => { - let parent = opt(|i: &mut _| parse::header_field(i, b"parent", parse::hex_hash)) - .context(StrContext::Expected("commit <40 lowercase hex char>".into())) - .parse_next(input)?; - match parent { - Some(parent) => Token::Parent { + if input.starts_with(b"parent ") { + let parent = parse::header_field(input, b"parent", parse::hex_hash)?; + Token::Parent { id: ObjectId::from_hex(parent).expect("parsing validation"), - }, - None => { - *state = State::Signature { - of: SignatureKind::Author, - }; - Self::next_inner_(input, state)? } + } else { + *state = State::Signature { + of: SignatureKind::Author, + }; + Self::next_inner_(input, state)? } } Signature { ref mut of } => { let who = *of; - let (field_name, err_msg) = match of { + let field_name = match of { SignatureKind::Author => { *of = SignatureKind::Committer; - (&b"author"[..], "author ") + &b"author"[..] } SignatureKind::Committer => { *state = State::Encoding; - (&b"committer"[..], "committer ") + &b"committer"[..] } }; - let signature = (|i: &mut _| parse::header_field(i, field_name, parse::signature)) - .context(StrContext::Expected(err_msg.into())) - .parse_next(input)?; + let signature = parse::header_field(input, field_name, parse::signature)?; match who { SignatureKind::Author => Token::Author { signature }, SignatureKind::Committer => Token::Committer { signature }, } } Encoding => { - let encoding = opt(|i: &mut _| parse::header_field(i, b"encoding", take_till(0.., NL))) - .context(StrContext::Expected("encoding ".into())) - .parse_next(input)?; *state = State::ExtraHeaders; - match encoding { - Some(encoding) => Token::Encoding(encoding.as_bstr()), - None => Self::next_inner_(input, state)?, + if input.starts_with(b"encoding ") { + let encoding = parse::header_field(input, b"encoding", Ok)?; + Token::Encoding(encoding.as_bstr()) + } else { + Self::next_inner_(input, state)? } } ExtraHeaders => { - let extra_header = opt(alt(( - |i: &mut _| parse::any_header_field_multi_line(i).map(|(k, o)| (k.as_bstr(), Cow::Owned(o))), - |i: &mut _| { - parse::any_header_field(i, take_till(0.., NL)) - .map(|(k, o)| (k.as_bstr(), Cow::Borrowed(o.as_bstr()))) - }, - ))) - .context(StrContext::Expected(" ".into())) - .parse_next(input)?; - match extra_header { - Some(extra_header) => Token::ExtraHeader(extra_header), - None => { - *state = State::Message; - Self::next_inner_(input, state)? + if input.starts_with(b"\n") { + *state = State::Message; + Self::next_inner_(input, state)? + } else { + let before = *input; + match parse::any_header_field_multi_line(input) + .map(|(k, o)| (k.as_bstr(), Cow::Owned(o))) + .or_else(|_| { + *input = before; + parse::any_header_field(input).map(|(k, o)| (k.as_bstr(), Cow::Borrowed(o.as_bstr()))) + }) { + Ok(extra_header) => Token::ExtraHeader(extra_header), + Err(err) => return Err(err), } } } Message => { - let message = terminated(decode::message, eof).parse_next(input)?; + let message = decode::message(input)?; debug_assert!( input.is_empty(), "we should have consumed all data - otherwise iter may go forever" diff --git a/gix-object/src/lib.rs b/gix-object/src/lib.rs index bdfcc422769..6d577ab95a4 100644 --- a/gix-object/src/lib.rs +++ b/gix-object/src/lib.rs @@ -308,78 +308,14 @@ pub struct Header { /// pub mod decode { - #[cfg(feature = "verbose-object-parsing-errors")] - mod _decode { - /// The type to be used for parse errors. - pub type ParseError = winnow::error::ContextError; - + mod error { pub(crate) fn empty_error() -> Error { - Error { - inner: winnow::error::ContextError::new(), - remaining: Default::default(), - } - } - - /// A type to indicate errors during parsing and to abstract away details related to `nom`. - #[derive(Debug, Clone)] - pub struct Error { - /// The actual error - pub inner: ParseError, - /// Where the error occurred - pub remaining: Vec, - } - - impl Error { - pub(crate) fn with_err(err: winnow::error::ErrMode, remaining: &[u8]) -> Self { - Self { - inner: err.into_inner().expect("we don't have streaming parsers"), - remaining: remaining.to_owned(), - } - } + Error } - impl std::fmt::Display for Error { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "object parsing failed at `{}`", bstr::BStr::new(&self.remaining))?; - if self.inner.context().next().is_some() { - writeln!(f)?; - self.inner.fmt(f)?; - } - Ok(()) - } - } - - impl std::error::Error for Error { - fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { - self.inner.cause().map(|v| v as &(dyn std::error::Error + 'static)) - } - } - } - - /// - #[cfg(not(feature = "verbose-object-parsing-errors"))] - mod _decode { - /// The type to be used for parse errors, discards everything and is zero size - pub type ParseError = (); - - pub(crate) fn empty_error() -> Error { - Error { inner: () } - } - - /// A type to indicate errors during parsing and to abstract away details related to `nom`. - #[derive(Debug, Clone)] - pub struct Error { - /// The actual error - pub inner: ParseError, - } - - impl Error { - pub(crate) fn with_err(err: winnow::error::ErrMode, _remaining: &[u8]) -> Self { - Self { - inner: err.into_inner().expect("we don't have streaming parsers"), - } - } - } + /// A type to indicate any error occurred during parsing. + #[derive(Debug, Clone, Copy, Default)] + pub struct Error; impl std::fmt::Display for Error { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -389,8 +325,8 @@ pub mod decode { impl std::error::Error for Error {} } - pub(crate) use _decode::empty_error; - pub use _decode::{Error, ParseError}; + pub(crate) use error::empty_error; + pub use error::Error; /// Returned by [`loose_header()`] #[derive(Debug, thiserror::Error)] diff --git a/gix-object/src/parse.rs b/gix-object/src/parse.rs index 41e24ac6ee3..c519a679fe8 100644 --- a/gix-object/src/parse.rs +++ b/gix-object/src/parse.rs @@ -1,89 +1,154 @@ -use bstr::{BStr, BString, ByteVec}; -use winnow::{ - combinator::{preceded, repeat, terminated}, - error::{AddContext, ParserError, StrContext}, - prelude::*, - token::{take_till, take_until, take_while}, -}; - -use crate::ByteSlice; +use bstr::{BStr, BString, ByteSlice, ByteVec}; pub(crate) const NL: &[u8] = b"\n"; pub(crate) const SPACE: &[u8] = b" "; const SPACE_OR_NL: &[u8] = b" \n"; -pub(crate) fn any_header_field_multi_line<'a, E: ParserError<&'a [u8]> + AddContext<&'a [u8], StrContext>>( - i: &mut &'a [u8], -) -> ModalResult<(&'a [u8], BString), E> { - ( - terminated(take_till(1.., SPACE_OR_NL), SPACE), - ( - take_till(0.., NL), - NL, - repeat(1.., terminated((SPACE, take_until(0.., NL)), NL)).map(|()| ()), - ) - .take() - .map(|o: &[u8]| { - let bytes = o.as_bstr(); - let mut out = BString::from(Vec::with_capacity(bytes.len())); - let mut lines = bytes.lines_with_terminator(); - out.push_str(lines.next().expect("first line")); - for line in lines { - out.push_str(&line[1..]); // cut leading space - } - out - }), - ) - .context(StrContext::Expected("name ".into())) - .parse_next(i) -} +/// The result type shared by object parsers. +pub(crate) type ParseResult = Result; -pub(crate) fn header_field<'a, T, E: ParserError<&'a [u8]>>( - i: &mut &'a [u8], - name: &'static [u8], - parse_value: impl ModalParser<&'a [u8], T, E>, -) -> ModalResult { - terminated(preceded(terminated(name, SPACE), parse_value), NL).parse_next(i) +/// Parse any multi-line object header field. +/// +/// Typical input is `gpgsig -----BEGIN...\n \nnext ...`, where the +/// field name is followed by a space, an initial value line, and at least one +/// continuation line starting with a space. +/// +/// The returned tuple contains the field name and the unfolded value, +/// with the leading space removed from each continuation line. +/// +/// On success, `i` is advanced to the first byte after the final continuation +/// line. +pub(crate) fn any_header_field_multi_line<'a>(i: &mut &'a [u8]) -> ParseResult<(&'a [u8], BString)> { + let mut c = *i; + let input = c; + let name_end = c + .find_byteset(SPACE_OR_NL) + .filter(|pos| *pos > 0) + .ok_or(crate::decode::Error)?; + if c.get(name_end) != Some(&b' ') { + return Err(crate::decode::Error); + } + + c = &c[name_end + 1..]; + let first_line_end = c.find_byte(b'\n').ok_or(crate::decode::Error)?; + c = &c[first_line_end + 1..]; + + let mut continuation_end = name_end + 1 + first_line_end + 1; + let mut continuation_count = 0usize; + while c.first() == Some(&b' ') { + let line_end = c.find_byte(b'\n').ok_or(crate::decode::Error)?; + continuation_end += line_end + 1; + c = &c[line_end + 1..]; + continuation_count += 1; + } + if continuation_count == 0 { + return Err(crate::decode::Error); + } + + let bytes = input[name_end + 1..continuation_end].as_bstr(); + let mut out = BString::from(Vec::with_capacity(bytes.len())); + let mut lines = bytes.lines_with_terminator(); + out.push_str(lines.next().expect("first line")); + for line in lines { + out.push_str(&line[1..]); + } + *i = &input[continuation_end..]; + Ok((input[..name_end].as_bstr(), out)) } -pub(crate) fn any_header_field<'a, T, E: ParserError<&'a [u8]>>( +/// Parse a specific single-line object header field. +/// +/// `name` is the header name without its trailing space, for example `b"tree"` +/// or `b"author"`. Typical input is ` \n...`. The value bytes, +/// excluding the header name, separator, and trailing newline, are passed to +/// `parse_value`. +/// +/// On success, `i` is advanced past the entire header line and the parsed value +/// is returned. +pub(crate) fn header_field<'a, T>( i: &mut &'a [u8], - parse_value: impl ModalParser<&'a [u8], T, E>, -) -> ModalResult<(&'a [u8], T), E> { - terminated((terminated(take_till(1.., SPACE_OR_NL), SPACE), parse_value), NL).parse_next(i) + name: &'static [u8], + parse_value: impl FnOnce(&'a [u8]) -> ParseResult, +) -> ParseResult { + let c = *i; + let Some(rest) = c.strip_prefix(name).and_then(|rest| rest.strip_prefix(SPACE)) else { + return Err(crate::decode::Error); + }; + let Some(nl) = rest.find_byte(b'\n') else { + return Err(crate::decode::Error); + }; + let value = parse_value(&rest[..nl])?; + *i = &rest[nl + 1..]; + Ok(value) } -fn is_hex_digit_lc(b: u8) -> bool { - matches!(b, b'0'..=b'9' | b'a'..=b'f') +/// Parse any single-line object header field and return its raw value. +/// +/// Typical input is ` \n...`. The returned tuple contains the +/// field name and the value bytes without the trailing newline. +/// +/// On success, `i` is advanced past the newline. +pub(crate) fn any_header_field<'a>(i: &mut &'a [u8]) -> ParseResult<(&'a [u8], &'a [u8])> { + let mut c = *i; + let input = c; + let name_end = c + .find_byteset(SPACE_OR_NL) + .filter(|pos| *pos > 0) + .ok_or(crate::decode::Error)?; + if c.get(name_end) != Some(&b' ') { + return Err(crate::decode::Error); + } + c = &c[name_end + 1..]; + if let Some(value_end) = c.find_byte(b'\n') { + let value = &c[..value_end]; + let rest = &c[value_end + 1..]; + *i = rest; + Ok((&input[..name_end], value)) + } else { + Err(crate::decode::Error) + } } -pub fn hex_hash<'a, E: ParserError<&'a [u8]>>(i: &mut &'a [u8]) -> ModalResult<&'a BStr, E> { - take_while( - gix_hash::Kind::shortest().len_in_hex()..=gix_hash::Kind::longest().len_in_hex(), - is_hex_digit_lc, - ) - .verify(|hex: &&[u8]| gix_hash::Kind::all().iter().any(|hk| hk.len_in_hex() == hex.len())) - .map(ByteSlice::as_bstr) - .parse_next(i) +/// Parse a complete hexadecimal object id. +/// +/// Typical input is a 40-byte SHA-1 hex id or a 64-byte SHA-256 hex id. The +/// entire input slice must be ASCII hex and must match one of the supported +/// object hash lengths. +pub fn hex_hash(i: &[u8]) -> ParseResult<&BStr> { + let max = gix_hash::Kind::longest().len_in_hex(); + let len = i.iter().take(max).take_while(|b| b.is_ascii_hexdigit()).count(); + if len != i.len() || !gix_hash::Kind::all().iter().any(|hk| hk.len_in_hex() == len) { + return Err(crate::decode::Error); + } + Ok(i.as_bstr()) } -pub(crate) fn signature<'a, E: ParserError<&'a [u8]> + AddContext<&'a [u8], StrContext>>( - i: &mut &'a [u8], -) -> ModalResult, E> { - gix_actor::signature::decode(i) +/// Parse a complete actor signature. +/// +/// Typical input is `Name 1700000000 +0000`. +/// The entire input slice must be consumed by +/// `gix_actor`'s signature parser; trailing bytes cause an error. +pub(crate) fn signature(mut i: &[u8]) -> ParseResult> { + let signature = gix_actor::SignatureRef::from_bytes_consuming(&mut i).map_err(|_| crate::decode::Error)?; + if i.is_empty() { + Ok(signature) + } else { + Err(crate::decode::Error) + } } -pub(crate) fn signature_and_consumed<'a, E: ParserError<&'a [u8]> + AddContext<&'a [u8], StrContext>>( - i: &mut &'a [u8], -) -> ModalResult<(gix_actor::SignatureRef<'a>, &'a BStr), E> { - let original = *i; - gix_actor::signature::decode(i).map(|signature| { - let consumed = original.len() - i.len(); - (signature, original[..consumed].as_bstr()) - }) +/// Validate a complete actor signature and return its raw bytes. +/// +/// Typical input is `Name 1700000000 +0000`. On success, the +/// returned [`BStr`] borrows all of `i`. +pub(crate) fn signature_raw(i: &[u8]) -> ParseResult<&BStr> { + signature(i).map(|_| i.as_bstr()) } +/// Parse a complete actor signature from a [`BStr`]. +/// +/// This is a convenience wrapper around [`signature`] for callers that already +/// hold byte-string data. pub(crate) fn parse_signature(raw: &BStr) -> Result, crate::decode::Error> { - gix_actor::SignatureRef::from_bytes::(raw.as_ref()) - .map_err(|err| crate::decode::Error::with_err(err, raw.as_ref())) + signature(raw.as_ref()) } diff --git a/gix-object/src/tag/decode.rs b/gix-object/src/tag/decode.rs index ad7e6ea3a46..c3ce1515dce 100644 --- a/gix-object/src/tag/decode.rs +++ b/gix-object/src/tag/decode.rs @@ -1,73 +1,172 @@ -use winnow::{ - combinator::{alt, delimited, eof, opt, preceded, terminated}, - error::{AddContext, ParserError, StrContext}, - prelude::*, - stream::AsChar, - token::{rest, take_until, take_while}, -}; - -use crate::{parse, parse::NL, BStr, ByteSlice, TagRef}; - -pub fn git_tag<'a, E: ParserError<&'a [u8]> + AddContext<&'a [u8], StrContext>>( - i: &mut &'a [u8], -) -> ModalResult, E> { - ( - (|i: &mut _| parse::header_field(i, b"object", parse::hex_hash)) - .context(StrContext::Expected("object <40 lowercase hex char>".into())), - (|i: &mut _| parse::header_field(i, b"type", take_while(1.., AsChar::is_alpha))) - .verify_map(|kind| crate::Kind::from_bytes(kind).ok()) - .context(StrContext::Expected("type ".into())), - (|i: &mut _| parse::header_field(i, b"tag", take_while(1.., |b| b != NL[0]))) - .context(StrContext::Expected("tag ".into())), - opt(|i: &mut _| parse::header_field(i, b"tagger", parse::signature_and_consumed).map(|(_signature, raw)| raw)) - .context(StrContext::Expected("tagger ".into())), - terminated(message, eof), - ) - .map(|(target, kind, tag_version, tagger, (message, pgp_signature))| TagRef { - target, - name: tag_version.as_bstr(), - target_kind: kind, - message, - tagger, - pgp_signature, - }) - .parse_next(i) +use bstr::ByteSlice; + +use crate::{parse, parse::ParseResult, BStr, Kind, TagRef}; + +/// Parse a complete annotated tag object body. +/// +/// Typical input starts with `object \n`, followed by `type \n`, +/// `tag \n`, an optional `tagger \n`, and a message separated +/// from the headers by a blank line. On success, the returned [`TagRef`] borrows +/// all fields from `i` and `i` is advanced to the empty suffix, and it expects +/// to see an entire, fully consumable tag in `i` without any unconsumed content +/// after parsing. +/// +/// This parser is not transactional as a whole: if a later field fails, `i` may +/// already have been advanced past earlier successfully parsed fields. Individual +/// field parsers document their own cursor behaviour. +pub fn git_tag<'a>(i: &mut &'a [u8]) -> ParseResult> { + let target = target(i)?; + let kind = kind(i)?; + let tag_version = name(i)?; + let tagger = tagger_raw(i)?; + + let (message, pgp_signature) = message(i)?; + if !i.is_empty() { + return Err(crate::decode::Error); + } + + Ok(TagRef { + target, + name: tag_version.as_bstr(), + target_kind: kind, + message, + tagger, + pgp_signature, + }) +} + +/// Parse the `object \n` header and return the object id as bytes. +/// +/// Typical input is `object 0123456789012345678901234567890123456789\n`. +/// Both SHA-1 and SHA-256 hex lengths are accepted, and uppercase ASCII hex is +/// valid. On success, `i` is advanced past the entire header line. +pub(crate) fn target<'a>(i: &mut &'a [u8]) -> ParseResult<&'a BStr> { + fn is_valid_hex_hash(value: &[u8]) -> bool { + matches!(value.len(), 40 | 64) && value.iter().all(u8::is_ascii_hexdigit) + } + parse::header_field(i, b"object", |value| { + is_valid_hex_hash(value) + .then(|| value.as_bstr()) + .ok_or(crate::decode::Error) + }) +} + +/// Parse the `type \n` header and return the object kind. +/// +/// Typical inputs are `type commit\n`, `type tree\n`, `type blob\n`, and +/// `type tag\n`. On success, `i` is advanced past the entire header line. +pub(crate) fn kind(i: &mut &[u8]) -> ParseResult { + parse::header_field(i, b"type", |value| { + Kind::from_bytes(value).map_err(|_| crate::decode::Error) + }) } -pub fn message<'a, E: ParserError<&'a [u8]>>(i: &mut &'a [u8]) -> ModalResult<(&'a BStr, Option<&'a BStr>), E> { - const PGP_SIGNATURE_BEGIN: &[u8] = b"\n-----BEGIN PGP SIGNATURE-----"; - const PGP_SIGNATURE_END: &[u8] = b"-----END PGP SIGNATURE-----"; +/// Parse the `tag \n` header and return the tag name. +/// +/// A typical input is `tag v1.0.0\n`. The returned name excludes both the +/// `tag ` prefix and the trailing newline, and must be non-empty. On success, +/// `i` is advanced past the entire header line. +pub(crate) fn name<'a>(i: &mut &'a [u8]) -> ParseResult<&'a BStr> { + parse::header_field(i, b"tag", |value| { + (!value.is_empty()).then(|| value.as_bstr()).ok_or(crate::decode::Error) + }) +} + +/// Parse an optional `tagger \n` header and return its raw signature. +/// +/// A typical input is `tagger Name 1700000000 +0000\n`. If +/// the `tagger ` prefix is absent, this returns `Ok(None)`. On success, it +/// returns the signature bytes without the prefix or newline and advances `i` +/// past the entire header line. +pub(crate) fn tagger_raw<'a>(i: &mut &'a [u8]) -> ParseResult> { + if !i.starts_with(b"tagger ") { + return Ok(None); + } + parse::header_field(i, b"tagger", |raw| { + let mut sig = raw; + gix_actor::SignatureRef::from_bytes_consuming(&mut sig).map_err(|_| crate::decode::Error)?; + Ok(raw.as_bstr()) + }) + .map(Some) +} + +/// Parse an optional `tagger \n` header and return the decoded signature. +/// +/// A typical input is `tagger Name 1700000000 +0000\n`. If +/// the `tagger ` prefix is absent, this returns `Ok(None)`. On success, it +/// returns the parsed [`gix_actor::SignatureRef`] and advances `i` past the +/// entire header line. +pub(crate) fn tagger<'a>(i: &mut &'a [u8]) -> ParseResult>> { + if !i.starts_with(b"tagger ") { + return Ok(None); + } + parse::header_field(i, b"tagger", |i| { + let mut sig = i; + let signature = gix_actor::SignatureRef::from_bytes_consuming(&mut sig).map_err(|_| crate::decode::Error)?; + Ok(signature) + }) + .map(Some) +} + +/// Parse the tag message and its optional PGP signature block. +/// +/// Typical input starts with the blank-line separator before the message, for +/// example `\nrelease notes`. A signed input looks like +/// `\nrelease notes\n-----BEGIN PGP SIGNATURE-----\n...\n-----END PGP SIGNATURE-----`. +/// On success, `i` is always advanced to the empty suffix. The returned tuple +/// contains the message and, if a PGP signature marker is found at the +/// beginning of a line, all bytes from that marker to the end of the input, +/// and notably the end-of-signature marker isn't required. +/// +/// An input consisting only of newlines is accepted as an empty-header message +/// and consumed entirely. In that case, the newlines are returned as part of +/// the message to preserve roundtrips for tags whose body is only the +/// header/message separator. +pub fn message<'a>(i: &mut &'a [u8]) -> ParseResult<(&'a BStr, Option<&'a BStr>)> { + const PGP_SIGNATURE_BEGIN: &[u8] = b"-----BEGIN PGP SIGNATURE-----"; if i.iter().all(|b| *b == b'\n') { - return i.map(|message: &[u8]| (message.as_bstr(), None)).parse_next(i); + let message = i.as_bstr(); + *i = &[]; + return Ok((message, None)); + } + + let Some(rest) = i.strip_prefix(parse::NL) else { + return Err(crate::decode::Error); + }; + + *i = &[]; + if let Some(sig_start) = find_pgp_signature(rest, PGP_SIGNATURE_BEGIN) { + // Truncate newline off the message end. + let message_end = if sig_start > 0 && rest[sig_start - 1] == b'\n' { + sig_start - 1 + } else { + sig_start + }; + let message = rest[..message_end].as_bstr(); + let signature = &rest[sig_start..]; + return Ok((message, (!signature.is_empty()).then(|| signature.as_bstr()))); + } + + Ok((rest.as_bstr(), None)) +} + +/// Find a PGP signature marker that starts at a line boundary. +/// +/// `haystack` is usually the tag message body and `needle` is the marker to +/// search for. On success, the returned index is the marker itself. +fn find_pgp_signature(haystack: &[u8], needle: &[u8]) -> Option { + if haystack.starts_with(needle) { + return Some(0); + } + + let mut offset = 0; + while let Some(pos) = haystack.get(offset..)?.find_byte(b'\n') { + let found = offset + pos + 1; + if haystack[found..].starts_with(needle) { + return Some(found); + } + offset = found; } - delimited( - NL, - alt(( - ( - take_until(0.., PGP_SIGNATURE_BEGIN), - preceded( - NL, - ( - &PGP_SIGNATURE_BEGIN[1..], - take_until(0.., PGP_SIGNATURE_END), - PGP_SIGNATURE_END, - rest, - ) - .take() - .map(|signature: &[u8]| { - if signature.is_empty() { - None - } else { - Some(signature.as_bstr()) - } - }), - ), - ), - rest.map(|rest: &[u8]| (rest, None)), - )), - opt(NL), - ) - .map(|(message, signature)| (message.as_bstr(), signature)) - .parse_next(i) + None } diff --git a/gix-object/src/tag/mod.rs b/gix-object/src/tag/mod.rs index 3ae20f2deaa..6e502ff5323 100644 --- a/gix-object/src/tag/mod.rs +++ b/gix-object/src/tag/mod.rs @@ -1,6 +1,5 @@ use crate::parse::parse_signature; use crate::TagRef; -use winnow::prelude::*; mod decode; @@ -14,9 +13,9 @@ impl<'a> TagRef<'a> { /// Deserialize a tag from `data`. pub fn from_bytes(mut data: &'a [u8]) -> Result, crate::decode::Error> { let input = &mut data; - match decode::git_tag.parse_next(input) { + match decode::git_tag(input) { Ok(tag) => Ok(tag), - Err(err) => Err(crate::decode::Error::with_err(err, input)), + Err(err) => Err(err), } } /// The object this tag points to as `Id`. diff --git a/gix-object/src/tag/ref_iter.rs b/gix-object/src/tag/ref_iter.rs index 11a882ce358..6b7f0018539 100644 --- a/gix-object/src/tag/ref_iter.rs +++ b/gix-object/src/tag/ref_iter.rs @@ -1,14 +1,7 @@ use bstr::BStr; use gix_hash::{oid, ObjectId}; -use winnow::{ - combinator::{eof, opt, terminated}, - error::{ParserError, StrContext}, - prelude::*, - stream::AsChar, - token::take_while, -}; -use crate::{bstr::ByteSlice, parse, parse::NL, tag::decode, Kind, TagRefIter}; +use crate::{bstr::ByteSlice, tag::decode, Kind, TagRefIter}; #[derive(Default, Copy, Clone)] pub(crate) enum State { @@ -63,49 +56,37 @@ impl<'a> TagRefIter<'a> { let input = &mut i; match Self::next_inner_(input, state) { Ok(token) => Ok((*input, token)), - Err(err) => Err(crate::decode::Error::with_err(err, input)), + Err(err) => Err(err), } } - fn next_inner_( - input: &mut &'a [u8], - state: &mut State, - ) -> Result, winnow::error::ErrMode> { + fn next_inner_(input: &mut &'a [u8], state: &mut State) -> Result, crate::decode::Error> { use State::*; Ok(match state { Target => { - let target = (|i: &mut _| parse::header_field(i, b"object", parse::hex_hash)) - .context(StrContext::Expected("object <40 lowercase hex char>".into())) - .parse_next(input)?; + let target = decode::target(input)?; *state = TargetKind; Token::Target { id: ObjectId::from_hex(target).expect("parsing validation"), } } TargetKind => { - let kind = (|i: &mut _| parse::header_field(i, b"type", take_while(1.., AsChar::is_alpha))) - .context(StrContext::Expected("type ".into())) - .parse_next(input)?; - let kind = Kind::from_bytes(kind).map_err(|_| winnow::error::ErrMode::from_input(input))?; + let kind = decode::kind(input)?; *state = Name; Token::TargetKind(kind) } Name => { - let tag_version = (|i: &mut _| parse::header_field(i, b"tag", take_while(1.., |b| b != NL[0]))) - .context(StrContext::Expected("tag ".into())) - .parse_next(input)?; + let tag_version = decode::name(input)?; *state = Tagger; Token::Name(tag_version.as_bstr()) } Tagger => { - let signature = opt(|i: &mut _| parse::header_field(i, b"tagger", parse::signature)) - .context(StrContext::Expected("tagger ".into())) - .parse_next(input)?; *state = Message; + let signature = decode::tagger(input)?; Token::Tagger(signature) } Message => { - let (message, pgp_signature) = terminated(decode::message, eof).parse_next(input)?; + let (message, pgp_signature) = decode::message(input)?; debug_assert!( input.is_empty(), "we should have consumed all data - otherwise iter may go forever" diff --git a/gix-object/src/tree/ref_iter.rs b/gix-object/src/tree/ref_iter.rs index 8d6050614b2..14128ae110a 100644 --- a/gix-object/src/tree/ref_iter.rs +++ b/gix-object/src/tree/ref_iter.rs @@ -1,7 +1,6 @@ use std::ops::ControlFlow; use bstr::BStr; -use winnow::error::ParserError; use crate::{tree, tree::EntryRef, TreeRef, TreeRefIter}; @@ -192,13 +191,8 @@ impl<'a> Iterator for TreeRefIter<'a> { Some(Ok(entry)) } None => { - let failing = self.data; self.data = &[]; - #[allow(clippy::unit_arg)] - Some(Err(crate::decode::Error::with_err( - winnow::error::ErrMode::from_input(&failing), - failing, - ))) + Some(Err(crate::decode::Error)) } } } @@ -214,7 +208,6 @@ impl<'a> TryFrom<&'a [u8]> for tree::EntryMode { mod decode { use bstr::ByteSlice; - use winnow::error::ParserError; use crate::{tree, tree::EntryRef, TreeRef}; @@ -253,11 +246,7 @@ mod decode { while !i.is_empty() { let Some((rest, entry)) = fast_entry(i, hash_len) else { - #[allow(clippy::unit_arg)] - return Err(crate::decode::Error::with_err( - winnow::error::ErrMode::from_input(&i), - i, - )); + return Err(crate::decode::Error); }; i = rest; out.push(entry); diff --git a/gix-object/tests/object/commit/from_bytes.rs b/gix-object/tests/object/commit/from_bytes.rs index 40f6cc478af..29251c572fb 100644 --- a/gix-object/tests/object/commit/from_bytes.rs +++ b/gix-object/tests/object/commit/from_bytes.rs @@ -25,6 +25,19 @@ fn invalid_timestsamp() { ); } +#[test] +fn uppercase_tree_id() -> crate::Result { + let input = b"tree 7989DFB2EC2F41914611A22FB30BBC2B3849DF9A +author Name 1312735823 +0518 +committer Name 1312735823 +0518 + +message"; + let commit = CommitRef::from_bytes(input)?; + assert_eq!(commit.tree, b"7989DFB2EC2F41914611A22FB30BBC2B3849DF9A".as_bstr()); + assert_eq!(commit.tree(), hex_to_id("7989dfb2ec2f41914611a22fb30bbc2b3849df9a")); + Ok(()) +} + #[test] fn invalid_email_of_committer() -> crate::Result { let actor = gix_actor::SignatureRef { diff --git a/gix-object/tests/object/commit/mod.rs b/gix-object/tests/object/commit/mod.rs index 022123aa93d..4d0914ad2f4 100644 --- a/gix-object/tests/object/commit/mod.rs +++ b/gix-object/tests/object/commit/mod.rs @@ -178,14 +178,7 @@ mod method { fn invalid() { let fixture = fixture_name("commit", "unsigned.txt"); let partial_commit = &fixture[..fixture.len() / 2]; - assert_eq!( - CommitRef::from_bytes(partial_commit).unwrap_err().to_string(), - if cfg!(feature = "verbose-object-parsing-errors") { - "object parsing failed at ``\nexpected `author `" - } else { - "object parsing failed" - } - ); + assert!(CommitRef::from_bytes(partial_commit).is_err()); assert_eq!( CommitRefIter::from_bytes(partial_commit) .take_while(Result::is_ok) diff --git a/gix-object/tests/object/tag.rs b/gix-object/tests/object/tag.rs index 33b48441a90..cb9d5b0db4a 100644 --- a/gix-object/tests/object/tag.rs +++ b/gix-object/tests/object/tag.rs @@ -2,6 +2,49 @@ use gix_object::{bstr::ByteSlice, Kind, TagRef, TagRefIter}; use crate::fixture_name; +const PGP_BEGIN_NOT_AT_LINE_START: &[u8] = b"object ffa700b4aca13b80cb6b98a078e7c96804f8e0ec +type commit +tag pgp-marker-in-message + +message text +not-a-signature -----BEGIN PGP SIGNATURE----- +body +-----END PGP SIGNATURE-----"; +const PGP_BEGIN_NOT_AT_LINE_START_MESSAGE: &[u8] = b"message text +not-a-signature -----BEGIN PGP SIGNATURE----- +body +-----END PGP SIGNATURE-----"; +const PGP_SIGNATURE_WITH_TRAILING_TEXT: &[u8] = b"object ffa700b4aca13b80cb6b98a078e7c96804f8e0ec +type commit +tag pgp-signature-with-trailing-text + +message text +-----BEGIN PGP SIGNATURE----- +body +-----END PGP SIGNATURE----- +trailing text"; +const PGP_SIGNATURE_WITH_TRAILING_TEXT_SIGNATURE: &[u8] = b"-----BEGIN PGP SIGNATURE----- +body +-----END PGP SIGNATURE----- +trailing text"; +const PGP_SIGNATURE_WITHOUT_END_MARKER: &[u8] = b"object ffa700b4aca13b80cb6b98a078e7c96804f8e0ec +type commit +tag pgp-signature-without-end-marker + +message text +-----BEGIN PGP SIGNATURE----- +body"; +const PGP_SIGNATURE_WITHOUT_END_MARKER_SIGNATURE: &[u8] = b"-----BEGIN PGP SIGNATURE----- +body"; +const PGP_SIGNATURE_AT_BODY_START: &[u8] = b"object ffa700b4aca13b80cb6b98a078e7c96804f8e0ec +type commit +tag pgp-signature-at-body-start + +-----BEGIN PGP SIGNATURE----- +body"; +const PGP_SIGNATURE_AT_BODY_START_SIGNATURE: &[u8] = b"-----BEGIN PGP SIGNATURE----- +body"; + mod method { use bstr::ByteSlice; use gix_object::TagRef; @@ -128,6 +171,26 @@ KLMHist5yj0sw1E4hDTyQa0= Ok(()) } + #[test] + fn pgp_begin_marker_not_at_line_start_is_message() -> crate::Result { + assert_eq!( + TagRefIter::from_bytes(super::PGP_BEGIN_NOT_AT_LINE_START).collect::, _>>()?, + vec![ + Token::Target { + id: hex_to_id("ffa700b4aca13b80cb6b98a078e7c96804f8e0ec") + }, + Token::TargetKind(Kind::Commit), + Token::Name(b"pgp-marker-in-message".as_bstr()), + Token::Tagger(None), + Token::Body { + message: super::PGP_BEGIN_NOT_AT_LINE_START_MESSAGE.as_bstr(), + pgp_signature: None + } + ] + ); + Ok(()) + } + #[test] fn error_handling() -> crate::Result { let data = fixture_name("tag", "empty.txt"); @@ -145,14 +208,7 @@ KLMHist5yj0sw1E4hDTyQa0= fn invalid() { let fixture = fixture_name("tag", "whitespace.txt"); let partial_tag = &fixture[..fixture.len() / 2]; - assert_eq!( - TagRef::from_bytes(partial_tag).unwrap_err().to_string(), - if cfg!(feature = "verbose-object-parsing-errors") { - "object parsing failed at `Sebasti`\ninvalid Closing '>' not found\nexpected ` <> <+|->`, `tagger `" - } else { - "object parsing failed" - } - ); + assert!(TagRef::from_bytes(partial_tag).is_err()); assert_eq!( TagRefIter::from_bytes(partial_tag).take_while(Result::is_ok).count(), 3, @@ -160,6 +216,22 @@ fn invalid() { ); } +#[test] +fn uppercase_target_id() -> crate::Result { + let input = b"object FFA700B4ACA13B80CB6B98A078E7C96804F8E0EC +type commit +tag uppercase-target + +message"; + let tag = TagRef::from_bytes(input)?; + assert_eq!(tag.target, b"FFA700B4ACA13B80CB6B98A078E7C96804F8E0EC".as_bstr()); + assert_eq!( + tag.target(), + crate::hex_to_id("ffa700b4aca13b80cb6b98a078e7c96804f8e0ec") + ); + Ok(()) +} + #[test] fn invalid_target_id_length() { let input = b"object 00000066666666666684666666666666666299297\ntype commit\ntag bad\n"; @@ -176,6 +248,14 @@ mod from_bytes { use crate::{fixture_name, tag::tag_fixture}; + fn assert_roundtrip(input: &[u8]) -> crate::Result { + let tag = TagRef::from_bytes(input)?; + let mut out = Vec::new(); + tag.write_to(&mut out)?; + assert_eq!(out, input); + Ok(()) + } + #[test] fn signed() -> crate::Result { assert_eq!(TagRef::from_bytes(&fixture_name("tag", "signed.txt"))?, tag_fixture()); @@ -268,6 +348,51 @@ KLMHist5yj0sw1E4hDTyQa0= Ok(()) } + #[test] + fn pgp_begin_marker_not_at_line_start_is_message() -> crate::Result { + let tag = TagRef::from_bytes(super::PGP_BEGIN_NOT_AT_LINE_START)?; + assert_eq!(tag.message, super::PGP_BEGIN_NOT_AT_LINE_START_MESSAGE.as_bstr()); + assert_eq!(tag.pgp_signature, None, "it doesn't parse this as PGP signature"); + assert_roundtrip(super::PGP_BEGIN_NOT_AT_LINE_START)?; + Ok(()) + } + + #[test] + fn trailing_text_after_pgp_end_marker_is_signature() -> crate::Result { + let tag = TagRef::from_bytes(super::PGP_SIGNATURE_WITH_TRAILING_TEXT)?; + assert_eq!(tag.message, b"message text".as_bstr()); + assert_eq!( + tag.pgp_signature, + Some(super::PGP_SIGNATURE_WITH_TRAILING_TEXT_SIGNATURE.as_bstr()) + ); + assert_roundtrip(super::PGP_SIGNATURE_WITH_TRAILING_TEXT)?; + Ok(()) + } + + #[test] + fn pgp_begin_marker_without_end_marker_starts_signature() -> crate::Result { + let tag = TagRef::from_bytes(super::PGP_SIGNATURE_WITHOUT_END_MARKER)?; + assert_eq!(tag.message, b"message text".as_bstr()); + assert_eq!( + tag.pgp_signature, + Some(super::PGP_SIGNATURE_WITHOUT_END_MARKER_SIGNATURE.as_bstr()) + ); + assert_roundtrip(super::PGP_SIGNATURE_WITHOUT_END_MARKER)?; + Ok(()) + } + + #[test] + fn pgp_begin_marker_at_body_start_is_signature() -> crate::Result { + let tag = TagRef::from_bytes(super::PGP_SIGNATURE_AT_BODY_START)?; + assert_eq!(tag.message, b"".as_bstr()); + assert_eq!( + tag.pgp_signature, + Some(super::PGP_SIGNATURE_AT_BODY_START_SIGNATURE.as_bstr()) + ); + assert_roundtrip(super::PGP_SIGNATURE_AT_BODY_START)?; + Ok(()) + } + #[test] fn whitespace() -> crate::Result { assert_eq!( diff --git a/gix-object/tests/object/tree/from_bytes.rs b/gix-object/tests/object/tree/from_bytes.rs index a360e4523da..917b3bc55e5 100644 --- a/gix-object/tests/object/tree/from_bytes.rs +++ b/gix-object/tests/object/tree/from_bytes.rs @@ -66,12 +66,7 @@ fn invalid() { let fixture = tree_fixture("definitely-special.tree").expect("fixture is valid"); let partial_tree = &fixture[..fixture.len() / 2]; let hash_kind = crate::fixture_hash_kind(); - let err = TreeRef::from_bytes(partial_tree, hash_kind).unwrap_err().to_string(); - if cfg!(feature = "verbose-object-parsing-errors") { - assert!(err.starts_with("object parsing failed at `"), "{err}"); - } else { - assert_eq!(err, "object parsing failed"); - } + assert!(TreeRef::from_bytes(partial_tree, hash_kind).is_err()); assert!( TreeRefIter::from_bytes(partial_tree, hash_kind) .take_while(Result::is_ok) diff --git a/gix-path/tests/path/realpath.rs b/gix-path/tests/path/realpath.rs index 22a13845362..44d6dd11483 100644 --- a/gix-path/tests/path/realpath.rs +++ b/gix-path/tests/path/realpath.rs @@ -19,7 +19,7 @@ fn fuzzed_timeout() -> crate::Result { } )); assert!( - start.elapsed() < Duration::from_millis(if cfg!(windows) { 1000 } else { 500 }), + start.elapsed() < Duration::from_millis(if cfg!(windows) { 2000 } else { 500 }), "took too long: {:.02} , we can't take too much time for this, and should keep the amount of work reasonable\ as paths can be part of URls which sometimes are canonicalized", start.elapsed().as_secs_f32() diff --git a/gix-protocol/Cargo.toml b/gix-protocol/Cargo.toml index 9bf39420a94..a3c2e6c7814 100644 --- a/gix-protocol/Cargo.toml +++ b/gix-protocol/Cargo.toml @@ -97,7 +97,6 @@ bstr = { version = "1.12.0", default-features = false, features = [ "std", "unicode", ] } -winnow = { version = "1.0.0", features = ["simd"] } # for async-client async-trait = { version = "0.1.51", optional = true } diff --git a/gix-protocol/src/remote_progress.rs b/gix-protocol/src/remote_progress.rs index ab27f7d2799..26c6cc5d2c1 100644 --- a/gix-protocol/src/remote_progress.rs +++ b/gix-protocol/src/remote_progress.rs @@ -1,9 +1,4 @@ use bstr::ByteSlice; -use winnow::{ - combinator::{opt, preceded, terminated}, - prelude::*, - token::take_till, -}; /// The information usually found in remote progress messages as sent by a git server during /// fetch, clone and push operations. @@ -71,32 +66,89 @@ impl RemoteProgress<'_> { } } -fn parse_number(i: &mut &[u8]) -> ModalResult { - take_till(0.., |c: u8| !c.is_ascii_digit()) - .try_map(gix_utils::btoi::to_signed) - .parse_next(i) +/// Parse a non-empty prefix of ASCII decimal digits as an unsigned number. +/// +/// On success, `i` is advanced past the parsed digits and the parsed value is +/// returned. If there are no digits at the current position, `None` is +/// returned. If the digit prefix cannot be represented as `usize`, `i` is +/// advanced anyway to avoid retrying the same input and `None` is returned. +fn parse_number(i: &mut &[u8]) -> Option { + let len = i.iter().take_while(|b| b.is_ascii_digit()).count(); + if len == 0 { + return None; + } + let (number, rest) = i.split_at(len); + *i = rest; + gix_utils::btoi::to_signed(number).ok() } -fn next_optional_percentage(i: &mut &[u8]) -> ModalResult, ()> { - opt(terminated( - preceded( - take_till(0.., |c: u8| c.is_ascii_digit()), - parse_number.try_map(u32::try_from), - ), - b"%", - )) - .parse_next(i) +/// Advance `i` to the first ASCII digit in the remaining input. +/// +/// If no digit is present, `i` is advanced to the end of the input. +/// If `i` already starts with a digit, it is left unchanged. +fn skip_until_digit_or_to_end(i: &mut &[u8]) { + let pos = i.iter().position(u8::is_ascii_digit).unwrap_or(i.len()); + *i = &i[pos..]; } -fn next_optional_number(i: &mut &[u8]) -> ModalResult, ()> { - opt(preceded(take_till(0.., |c: u8| c.is_ascii_digit()), parse_number)).parse_next(i) +/// Find and parse the next ASCII decimal number only if it is followed by `%`. +/// +/// For example, `b" 42% (21/50)"` yields `Some(42)` and advances `i` to +/// `b" (21/50)"`, while `b" (21/50)"` yields `None` because the next number is +/// not a percentage. `b" done"` yields `None` with `i` fully consumed, as there +/// are no digits left to parse. +/// +/// If the digit prefix cannot be represented as `u32`, it is treated as +/// absent and `None` is returned with `i` advanced past all consumed bytes. +fn next_optional_percentage(i: &mut &[u8]) -> Option { + let before = *i; + skip_until_digit_or_to_end(i); + let number = parse_number(i)?; + if let Some(rest) = i.strip_prefix(b"%") { + *i = rest; + u32::try_from(number).ok() + } else { + *i = before; + None + } } -fn parse_progress<'i>(line: &mut &'i [u8]) -> ModalResult, ()> { - let action = take_till(1.., |c| c == b':').parse_next(line)?; - let percent = next_optional_percentage.parse_next(line)?; - let step = next_optional_number.parse_next(line)?; - let max = next_optional_number.parse_next(line)?; +/// Find and parse the next ASCII decimal number, if one is present. +/// +/// For example, `b" (21/50)"` yields `Some(21)` and advances `i` to `b"/50)"`. +/// Calling it again on that remainder yields `Some(50)` and advances `i` to +/// `b")"`. If no digit is present, it yields `None` and advances `i` to the +/// empty suffix. +/// +/// If the next digit prefix cannot be represented as `usize`, it is treated as +/// absent and `None` is returned. In that case, `i` is advanced past the digit +/// prefix because [`parse_number`] consumes it before conversion. +fn next_optional_number(i: &mut &[u8]) -> Option { + skip_until_digit_or_to_end(i); + parse_number(i) +} + +/// Parse a remote progress line with a non-empty action followed by `:`. +/// +/// The remainder is scanned leniently for the common progress fields emitted by +/// git servers: an optional percentage, then up to two optional numbers for the +/// current step and maximum. For example, inputs like +/// `b"Receiving objects: 42% (21/50)"` and `b"Resolving deltas: 21/50"` can +/// produce an action plus `percent`, `step`, and `max` values. +/// +/// `line` is advanced as the fields are found. If parsing succeeds, it points at +/// the unconsumed suffix after the parsed progress fields. Inputs without a +/// colon, or with an empty action before the colon, return an error. +fn parse_progress<'i>(line: &mut &'i [u8]) -> Result, ()> { + let action_end = line.iter().position(|b| *b == b':').ok_or(())?; + if action_end == 0 { + return Err(()); + } + let action = &line[..action_end]; + *line = &line[action_end..]; + let percent = next_optional_percentage(line); + let step = next_optional_number(line); + let max = next_optional_number(line); Ok(RemoteProgress { action: action.into(), percent, diff --git a/gix-ref/Cargo.toml b/gix-ref/Cargo.toml index 09a151e7695..5527c7fc50d 100644 --- a/gix-ref/Cargo.toml +++ b/gix-ref/Cargo.toml @@ -35,7 +35,6 @@ gix-lock = { version = "^22.0.0", path = "../gix-lock" } gix-tempfile = { version = "^22.0.0", default-features = false, path = "../gix-tempfile" } thiserror = "2.0.18" -winnow = { version = "1.0.0", features = ["simd"] } serde = { version = "1.0.114", optional = true, default-features = false, features = ["derive"] } # packed refs diff --git a/gix-ref/src/parse.rs b/gix-ref/src/parse.rs index 0ac9060297c..3b6133db221 100644 --- a/gix-ref/src/parse.rs +++ b/gix-ref/src/parse.rs @@ -1,22 +1,34 @@ use gix_object::bstr::{BStr, ByteSlice}; -use winnow::{combinator::alt, error::ParserError, prelude::*, token::take_while}; -fn is_hex_digit_lc(b: u8) -> bool { - matches!(b, b'0'..=b'9' | b'a'..=b'f') +type ParseResult = Result; + +fn is_hex_digit(b: u8) -> bool { + b.is_ascii_hexdigit() } -/// Copy from https://github.com/GitoxideLabs/gitoxide/blob/64872690e60efdd9267d517f4d9971eecd3b875c/gix-object/src/parse.rs#L60-L67 -pub fn hex_hash<'a, E: ParserError<&'a [u8]>>(i: &mut &'a [u8]) -> ModalResult<&'a BStr, E> { - // NOTE: It's important to be able to read all hashes, do not parameterize it. Hashes can be rejected at a later stage - // if needed. - take_while( - gix_hash::Kind::shortest().len_in_hex()..=gix_hash::Kind::longest().len_in_hex(), - is_hex_digit_lc, - ) - .map(ByteSlice::as_bstr) - .parse_next(i) +/// Copy from `gix-object`, intentionally accepting all supported hash lengths. +pub fn hex_hash<'a>(i: &mut &'a [u8]) -> ParseResult<&'a BStr> { + let max = gix_hash::Kind::longest().len_in_hex(); + let len = i.iter().take(max).take_while(|b| is_hex_digit(**b)).count(); + if len < gix_hash::Kind::shortest().len_in_hex() { + return Err(()); + } + let (hex, rest) = i.split_at(len); + *i = rest; + Ok(hex.as_bstr()) } -pub fn newline<'a, E: ParserError<&'a [u8]>>(i: &mut &'a [u8]) -> ModalResult<&'a [u8], E> { - alt((b"\r\n", b"\n")).parse_next(i) +/// Parse CRLF or LF, independently of the platform. +pub fn newline<'a>(i: &mut &'a [u8]) -> ParseResult<&'a [u8]> { + if let Some(rest) = i.strip_prefix(b"\r\n") { + let out = &i[..2]; + *i = rest; + Ok(out) + } else if let Some(rest) = i.strip_prefix(b"\n") { + let out = &i[..1]; + *i = rest; + Ok(out) + } else { + Err(()) + } } diff --git a/gix-ref/src/store/file/log/line.rs b/gix-ref/src/store/file/log/line.rs index c0b7a435da7..90a320d64e2 100644 --- a/gix-ref/src/store/file/log/line.rs +++ b/gix-ref/src/store/file/log/line.rs @@ -74,12 +74,6 @@ impl<'a> From> for Line { /// pub mod decode { use gix_object::bstr::{BStr, ByteSlice}; - use winnow::{ - combinator::{alt, eof, fail, opt, preceded, terminated}, - error::{AddContext, ParserError, StrContext}, - prelude::*, - token::{rest, take_while}, - }; use crate::{file::log::LineRef, parse::hex_hash}; @@ -116,80 +110,57 @@ pub mod decode { pub use error::Error; impl<'a> LineRef<'a> { - /// Decode a line from the given bytes which are expected to start at a hex sha. - pub fn from_bytes(mut input: &'a [u8]) -> Result, Error> { - one::<()>(&mut input).map_err(|_| Error::new(input)) + /// Decode a reflog line from the given bytes. + /// + /// Valid input starts with the previous object id, the new object id, a + /// signature, and an optional tab-separated message, for example: + /// + /// `0123456789012345678901234567890123456789 89abcdef89abcdef89abcdef89abcdef89abcdef Name 1700000000 +0000\tmessage` + pub fn from_bytes(input: &'a [u8]) -> Result, Error> { + decode(input).map_err(|_| Error::new(first_line(input))) } } - fn message<'a, E: ParserError<&'a [u8]>>(i: &mut &'a [u8]) -> ModalResult<&'a BStr, E> { - if i.is_empty() { - rest.map(ByteSlice::as_bstr).parse_next(i) - } else { - terminated(take_while(0.., |c| c != b'\n'), opt(b'\n')) - .map(ByteSlice::as_bstr) - .parse_next(i) - } + /// Return the first line from `input`, without its trailing newline. + /// + /// If `input` contains no newline, all of `input` is returned. + fn first_line(input: &[u8]) -> &[u8] { + let line_end = input.iter().position(|b| *b == b'\n').unwrap_or(input.len()); + &input[..line_end] } - fn one<'a, E: ParserError<&'a [u8]> + AddContext<&'a [u8], StrContext>>( - bytes: &mut &'a [u8], - ) -> ModalResult, E> { - let mut tokens = bytes.splitn(2, |b| *b == b'\t'); - if let (Some(mut first), Some(mut second)) = (tokens.next(), tokens.next()) { - let (old, new, signature) = ( - terminated(hex_hash, b" ").context(StrContext::Expected("".into())), - terminated(hex_hash, b" ").context(StrContext::Expected("".into())), - gix_actor::signature::decode.context(StrContext::Expected(" <> ".into())), - ) - .context(StrContext::Expected( - r" <> \t".into(), - )) - .parse_next(&mut first)?; - - // forward the buffer🤦‍♂️ - message.parse_next(bytes)?; - let message = message(&mut second)?; - Ok(LineRef { - previous_oid: old, - new_oid: new, - signature, - message, - }) - } else { - ( - ( - terminated(hex_hash, b" ").context(StrContext::Expected("".into())), - terminated(hex_hash, b" ").context(StrContext::Expected("".into())), - gix_actor::signature::decode.context(StrContext::Expected(" <> ".into())), - ) - .context(StrContext::Expected( - r" <> \t".into(), - )), - alt(( - preceded( - b'\t', - message.context(StrContext::Expected("".into())), - ), - b'\n'.value(Default::default()), - eof.value(Default::default()), - fail.context(StrContext::Expected( - "log message must be separated from signature with whitespace".into(), - )), - )), - ) - .map(|((old, new, signature), message)| LineRef { - previous_oid: old, - new_oid: new, - signature, - message, - }) - .parse_next(bytes) - } + /// Parse one reflog line from `bytes`. + /// + /// Only one line is parsed; any bytes after the first newline are + /// ignored. If the line has no tab separator, the message is empty. + /// + /// Return an error if the first line does not match the reflog line + /// format. + fn decode(bytes: &[u8]) -> Result, ()> { + let line = first_line(bytes); + let (mut head, message) = match line.find_byte(b'\t') { + Some(tab) => (&line[..tab], line[tab + 1..].as_bstr()), + None => (line, BStr::new(b"")), + }; + + let old = hex_hash(&mut head)?; + head = head.strip_prefix(b" ").ok_or(())?; + let new = hex_hash(&mut head)?; + head = head.strip_prefix(b" ").ok_or(())?; + let signature = gix_actor::signature::decode(&mut head).map_err(|_| ())?; + if !head.is_empty() { + return Err(()); + } + Ok(LineRef { + previous_oid: old, + new_oid: new, + signature, + message, + }) } #[cfg(test)] - mod test { + mod test_decode { use super::*; /// Convert a hexadecimal hash into its corresponding `ObjectId` or _panic_. @@ -203,32 +174,18 @@ pub mod decode { } mod invalid { - use gix_testtools::to_bstr_err; - use winnow::{error::TreeError, prelude::*}; - - use super::one; + use super::decode; #[test] fn completely_bogus_shows_error_with_context() { - let err = one::> - .parse_peek(b"definitely not a log entry") - .map_err(to_bstr_err) - .expect_err("this should fail"); - assert!(err.to_string().contains(" ")); + let input = b"definitely not a log entry".as_slice(); + decode(input).expect_err("this should fail"); } #[test] fn missing_whitespace_between_signature_and_message() { let line = "0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 one 1234567890 -0000message"; - let err = one::> - .parse_peek(line.as_bytes()) - .map_err(to_bstr_err) - .expect_err("this should fail"); - assert!( - err.to_string() - .contains("log message must be separated from signature with whitespace"), - "expected\n `log message must be separated from signature with whitespace`\nin\n```\n{err}\n```" - ); + decode(line.as_bytes()).expect_err("this should fail"); } } @@ -240,10 +197,7 @@ pub mod decode { let line_with_nl = with_newline(line_without_nl.clone()); for input in &[line_without_nl, line_with_nl] { assert_eq!( - one::> - .parse_peek(input) - .expect("successful parsing") - .1, + decode(input.as_slice()).expect("successful parsing"), LineRef { previous_oid: NULL_SHA1.as_bstr(), new_oid: NULL_SHA1.as_bstr(), @@ -264,10 +218,7 @@ pub mod decode { let line_with_nl = with_newline(line_without_nl.clone()); for input in &[line_without_nl, line_with_nl] { - let (remaining, res) = one::> - .parse_peek(input) - .expect("successful parsing"); - assert!(remaining.is_empty(), "all consuming even without trailing newline"); + let res = decode(input.as_slice()).expect("successful parsing"); let actual = LineRef { previous_oid: b"a5828ae6b52137b913b978e16cd2334482eb4c1f".as_bstr(), new_oid: b"89b43f80a514aee58b662ad606e6352e03eaeee4".as_bstr(), @@ -290,20 +241,8 @@ pub mod decode { #[test] fn two_lines_in_a_row_with_and_without_newline() { let lines = b"0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 one 1234567890 -0000\t\n0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 two 1234567890 -0000\thello"; - let (remainder, parsed) = one::> - .parse_peek(lines) - .expect("parse single line"); + let parsed = decode(lines.as_slice()).expect("parse single line"); assert_eq!(parsed.message, b"".as_bstr(), "first message is empty"); - - let (remainder, parsed) = one::> - .parse_peek(remainder) - .expect("parse single line"); - assert_eq!( - parsed.message, - b"hello".as_bstr(), - "second message is not and contains no newline" - ); - assert!(remainder.is_empty()); } } } diff --git a/gix-ref/src/store/file/loose/reference/decode.rs b/gix-ref/src/store/file/loose/reference/decode.rs index c18e0afb204..e892f1e0a6b 100644 --- a/gix-ref/src/store/file/loose/reference/decode.rs +++ b/gix-ref/src/store/file/loose/reference/decode.rs @@ -1,16 +1,7 @@ use gix_hash::ObjectId; use gix_object::bstr::BString; -use winnow::{ - combinator::{opt, terminated}, - prelude::*, - token::take_while, -}; -use crate::{ - parse::{hex_hash, newline}, - store_impl::file::loose::Reference, - FullName, Target, -}; +use crate::{parse::hex_hash, store_impl::file::loose::Reference, FullName, Target}; enum MaybeUnsafeState { Id(ObjectId), @@ -54,10 +45,10 @@ impl TryFrom for Target { impl Reference { /// Create a new reference of the given `parent` store with `relative_path` service as unique identifier /// at which the `path_contents` was read to obtain the refs value. - pub fn try_from_path(name: FullName, mut path_contents: &[u8]) -> Result { + pub fn try_from_path(name: FullName, path_contents: &[u8]) -> Result { Ok(Reference { name, - target: parse(&mut path_contents) + target: parse(path_contents) .map_err(|_| Error::Parse { content: path_contents.into(), })? @@ -66,14 +57,28 @@ impl Reference { } } -fn parse(i: &mut &[u8]) -> ModalResult { - if let Some(_ref_prefix) = opt(terminated("ref: ", take_while(0.., b' '))).parse_next(i)? { - terminated(take_while(0.., |b| b != b'\r' && b != b'\n'), opt(newline)) - .map(|path| MaybeUnsafeState::UnvalidatedPath(path.into())) - .parse_next(i) +/// Parse the contents of a loose reference file. +/// +/// A *symbolic* reference starts with `ref: `, may have additional spaces before +/// the path, and returns [`MaybeUnsafeState::UnvalidatedPath`] with the path +/// bytes up to the next line ending or the end of input. The path is validated +/// later when it is converted into a [`Target`]. +/// +/// A *direct* reference starts with a hexadecimal object id and returns +/// [`MaybeUnsafeState::Id`]. +/// +/// If neither reference form can be parsed, an error is returned. +fn parse(mut i: &[u8]) -> Result { + if let Some(rest) = i.strip_prefix(b"ref: ") { + i = rest; + while i.first() == Some(&b' ') { + i = &i[1..]; + } + let path_end = i.iter().position(|b| *b == b'\r' || *b == b'\n').unwrap_or(i.len()); + let path = i[..path_end].into(); + Ok(MaybeUnsafeState::UnvalidatedPath(path)) } else { - terminated(hex_hash, opt(newline)) - .map(|hex| MaybeUnsafeState::Id(ObjectId::from_hex(hex).expect("prior validation"))) - .parse_next(i) + let hex = hex_hash(&mut i)?; + Ok(MaybeUnsafeState::Id(ObjectId::from_hex(hex).expect("prior validation"))) } } diff --git a/gix-ref/src/store/packed/buffer.rs b/gix-ref/src/store/packed/buffer.rs index 2283cf9873b..962ce0caae9 100644 --- a/gix-ref/src/store/packed/buffer.rs +++ b/gix-ref/src/store/packed/buffer.rs @@ -19,8 +19,6 @@ impl AsRef<[u8]> for packed::Backing { pub mod open { use std::path::PathBuf; - use winnow::{prelude::*, stream::Offset}; - use crate::store_impl::packed; /// Initialization @@ -30,10 +28,8 @@ pub mod open { let (offset, sorted) = { let mut input = backing.as_ref(); if *input.first().unwrap_or(&b' ') == b'#' { - let header = packed::decode::header::<()> - .parse_next(&mut input) - .map_err(|_| Error::HeaderParsing)?; - let offset = input.offset_from(&backing.as_ref()); + let header = packed::decode::header(&mut input).map_err(|_| Error::HeaderParsing)?; + let offset = backing.as_ref().len() - input.len(); (offset, header.sorted) } else { (0, false) diff --git a/gix-ref/src/store/packed/decode.rs b/gix-ref/src/store/packed/decode.rs index 09da3ce86d4..567520d3b10 100644 --- a/gix-ref/src/store/packed/decode.rs +++ b/gix-ref/src/store/packed/decode.rs @@ -1,15 +1,6 @@ use gix_object::bstr::{BStr, ByteSlice}; -use winnow::{ - combinator::{delimited, opt, preceded, terminated}, - error::{FromExternalError, ParserError}, - prelude::*, - token::take_while, -}; -use crate::{ - parse::{hex_hash, newline}, - store_impl::packed, -}; +use crate::{parse, store_impl::packed}; #[derive(Debug, PartialEq, Eq)] enum Peeled { @@ -34,47 +25,74 @@ impl Default for Header { } } -fn until_newline<'a, E>(input: &mut &'a [u8]) -> ModalResult<&'a BStr, E> -where - E: ParserError<&'a [u8]>, -{ - terminated(take_while(0.., |b: u8| b != b'\r' && b != b'\n'), newline) - .map(ByteSlice::as_bstr) - .parse_next(input) +/// Return the bytes before the next line ending as a [`BStr`]. +/// +/// On success, `input` is advanced past the line ending. The returned slice +/// does not include the line ending. +fn until_line_end_without_separator<'a>(input: &mut &'a [u8]) -> Result<&'a BStr, ()> { + let line_end = input.iter().position(|b| *b == b'\r' || *b == b'\n').ok_or(())?; + let out = input[..line_end].as_bstr(); + let mut maybe_start_of_newline = &input[line_end..]; + parse::newline(&mut maybe_start_of_newline)?; + *input = maybe_start_of_newline; + Ok(out) } -pub fn header<'a, E>(input: &mut &'a [u8]) -> ModalResult -where - E: ParserError<&'a [u8]>, -{ - preceded(b"# pack-refs with: ", until_newline) - .map(|traits| { - let mut peeled = Peeled::Unspecified; - let mut sorted = false; - for token in traits.as_bstr().split_str(b" ") { - if token == b"fully-peeled" { - peeled = Peeled::Fully; - } else if token == b"peeled" { - peeled = Peeled::Partial; - } else if token == b"sorted" { - sorted = true; - } - } - Header { peeled, sorted } - }) - .parse_next(input) +/// Parse a `packed-refs` header line. +/// +/// A valid header starts with `# pack-refs with: ` and ends with a line ending. +/// Known space-separated traits after the prefix populate the returned +/// [`Header`]: `peeled`, `fully-peeled`, and `sorted`. Unknown traits are +/// ignored. +/// +/// On success, `input` is advanced past the entire header line, including its +/// line ending. +pub fn header(input: &mut &[u8]) -> Result { + let Some(rest) = input.strip_prefix(b"# pack-refs with: ") else { + return Err(()); + }; + *input = rest; + let traits = until_line_end_without_separator(input)?; + let mut peeled = Peeled::Unspecified; + let mut sorted = false; + for token in traits.split_str(b" ") { + if token == b"fully-peeled" { + peeled = Peeled::Fully; + } else if token == b"peeled" { + peeled = Peeled::Partial; + } else if token == b"sorted" { + sorted = true; + } + } + Ok(Header { peeled, sorted }) } -pub fn reference<'a, E: ParserError<&'a [u8]> + FromExternalError<&'a [u8], crate::name::Error>>( - input: &mut &'a [u8], -) -> ModalResult, E> { - ( - terminated(hex_hash, b" "), - until_newline.try_map(TryInto::try_into), - opt(delimited(b"^", hex_hash, newline)), - ) - .map(|(target, name, object)| packed::Reference { name, target, object }) - .parse_next(input) +/// Parse one packed reference entry and its optional peeled object line. +/// +/// The reference line has the form ` ` followed by a +/// line ending. If the following line starts with `^`, it is parsed as the +/// peeled object id for the returned [`packed::Reference`]. +/// +/// On success, `input` is advanced past the reference line and, if present, the +/// peeled object line. +pub fn reference<'a>(input: &mut &'a [u8]) -> Result, ()> { + let target = parse::hex_hash(input)?; + let Some(rest) = input.strip_prefix(b" ") else { + return Err(()); + }; + *input = rest; + let name = until_line_end_without_separator(input)?.try_into().map_err(|_| ())?; + + let object = if let Some(rest) = input.strip_prefix(b"^") { + *input = rest; + let object = parse::hex_hash(input)?; + parse::newline(input)?; + Some(object) + } else { + None + }; + + Ok(packed::Reference { name, target, object }) } #[cfg(test)] diff --git a/gix-ref/src/store/packed/decode/tests.rs b/gix-ref/src/store/packed/decode/tests.rs index d3378469055..5549370aaba 100644 --- a/gix-ref/src/store/packed/decode/tests.rs +++ b/gix-ref/src/store/packed/decode/tests.rs @@ -1,8 +1,6 @@ type Result = std::result::Result<(), Box>; mod reference { - use winnow::{error::TreeError, prelude::*}; - use super::Result; use crate::{ store_impl::{packed, packed::decode}, @@ -16,22 +14,30 @@ mod reference { #[test] fn invalid() { - assert!(decode::reference::<()> - .parse_peek(b"# what looks like a comment") - .is_err()); - assert!( - decode::reference::<()> - .parse_peek(b"^e9cdc958e7ce2290e2d7958cdb5aa9323ef35d37\n") - .is_err(), - "lonely peel" - ); + let mut input = b"# what looks like a comment".as_slice(); + assert!(decode::reference(&mut input).is_err()); + let mut input = b"^e9cdc958e7ce2290e2d7958cdb5aa9323ef35d37\n".as_slice(); + assert!(decode::reference(&mut input).is_err(), "lonely peel"); + } + + #[test] + fn uppercase_hex() -> Result { + let mut input: &[u8] = b"D53C4B0F91F1B29769C9430F2D1C0BCAB1170C75 refs/heads/uppercase +^E9CDC958E7CE2290E2D7958CDB5AA9323EF35D37\n"; + let parsed = decode::reference(&mut input).unwrap(); + + assert!(input.is_empty(), "exhausted"); + assert_eq!(parsed.name, FullNameRef::new_unchecked("refs/heads/uppercase".into())); + assert_eq!(parsed.target(), hex_to_id("d53c4b0f91f1b29769c9430f2d1c0bcab1170c75")); + assert_eq!(parsed.object(), hex_to_id("e9cdc958e7ce2290e2d7958cdb5aa9323ef35d37")); + Ok(()) } #[test] fn two_refs_in_a_row() -> Result { - let input: &[u8] = b"d53c4b0f91f1b29769c9430f2d1c0bcab1170c75 refs/heads/alternates-after-packs-and-loose + let mut input: &[u8] = b"d53c4b0f91f1b29769c9430f2d1c0bcab1170c75 refs/heads/alternates-after-packs-and-loose ^e9cdc958e7ce2290e2d7958cdb5aa9323ef35d37\neaae9c1bc723209d793eb93f5587fa2604d5cd92 refs/heads/avoid-double-lookup\n"; - let (input, parsed) = decode::reference::>.parse_peek(input).unwrap(); + let parsed = decode::reference(&mut input).unwrap(); assert_eq!( parsed, @@ -44,7 +50,7 @@ mod reference { assert_eq!(parsed.target(), hex_to_id("d53c4b0f91f1b29769c9430f2d1c0bcab1170c75")); assert_eq!(parsed.object(), hex_to_id("e9cdc958e7ce2290e2d7958cdb5aa9323ef35d37")); - let (input, parsed) = decode::reference::>.parse_peek(input).unwrap(); + let parsed = decode::reference(&mut input).unwrap(); assert!(input.is_empty(), "exhausted"); assert_eq!( parsed.name, @@ -58,8 +64,6 @@ mod reference { mod header { use gix_object::bstr::ByteSlice; - use gix_testtools::to_bstr_err; - use winnow::prelude::*; use super::Result; use crate::store_impl::packed::{ @@ -69,28 +73,21 @@ mod header { #[test] fn invalid() { - assert!( - decode::header::<()>.parse_peek(b"# some user comment").is_err(), - "something the user put there" - ); - assert!( - decode::header::<()>.parse_peek(b"# pack-refs: ").is_err(), - "looks right but isn't" - ); - assert!( - decode::header::<()>.parse_peek(b" # pack-refs with: ").is_err(), - "does not start with #" - ); + let mut input = b"# some user comment".as_slice(); + assert!(decode::header(&mut input).is_err(), "something the user put there"); + assert_eq!(input[0], b'#', "it consumed nothing"); + let mut input = b"# pack-refs: ".as_slice(); + assert!(decode::header(&mut input).is_err(), "looks right but isn't"); + let mut input = b" # pack-refs with: ".as_slice(); + assert!(decode::header(&mut input).is_err(), "does not start with #"); } #[test] fn valid_fully_peeled_stored() -> Result { - let input: &[u8] = b"# pack-refs with: peeled fully-peeled sorted \nsomething else"; - let (rest, header) = decode::header::> - .parse_peek(input) - .map_err(to_bstr_err)?; + let mut input: &[u8] = b"# pack-refs with: peeled fully-peeled sorted \nsomething else"; + let header = decode::header(&mut input).expect("valid input"); - assert_eq!(rest.as_bstr(), "something else", "remainder starts after newline"); + assert_eq!(input.as_bstr(), "something else", "remainder starts after newline"); assert_eq!( header, Header { @@ -103,10 +100,10 @@ mod header { #[test] fn valid_peeled_unsorted() -> Result { - let input: &[u8] = b"# pack-refs with: peeled\n"; - let (rest, header) = decode::header::<()>.parse_peek(input).unwrap(); + let mut input: &[u8] = b"# pack-refs with: peeled\n"; + let header = decode::header(&mut input).unwrap(); - assert!(rest.is_empty()); + assert!(input.is_empty()); assert_eq!( header, Header { @@ -119,10 +116,10 @@ mod header { #[test] fn valid_empty() -> Result { - let input: &[u8] = b"# pack-refs with: \n"; - let (rest, header) = decode::header::<()>.parse_peek(input).unwrap(); + let mut input: &[u8] = b"# pack-refs with: \n"; + let header = decode::header(&mut input).unwrap(); - assert!(rest.is_empty()); + assert!(input.is_empty()); assert_eq!( header, Header { diff --git a/gix-ref/src/store/packed/find.rs b/gix-ref/src/store/packed/find.rs index 28c41a7eb8d..4de28e7731b 100644 --- a/gix-ref/src/store/packed/find.rs +++ b/gix-ref/src/store/packed/find.rs @@ -1,5 +1,4 @@ use gix_object::bstr::{BStr, BString, ByteSlice}; -use winnow::prelude::*; use crate::{store_impl::packed, FullNameRef, PartialNameRef}; @@ -41,11 +40,7 @@ impl packed::Buffer { match self.binary_search_by(name.as_bstr()) { Ok(line_start) => { let mut input = &self.as_ref()[line_start..]; - Ok(Some( - packed::decode::reference::<()> - .parse_next(&mut input) - .map_err(|_| Error::Parse)?, - )) + Ok(Some(packed::decode::reference(&mut input).map_err(|_| Error::Parse)?)) } Err((parse_failure, _)) => { if parse_failure { @@ -93,8 +88,7 @@ impl packed::Buffer { a.binary_search_by_key(&full_name.as_ref(), |b: &u8| { let ofs = std::ptr::from_ref::(b) as usize - a.as_ptr() as usize; let mut line = &a[search_start_of_record(ofs)..]; - packed::decode::reference::<()> - .parse_next(&mut line) + packed::decode::reference(&mut line) .map(|r| r.name.as_bstr().as_bytes()) .inspect_err(|_err| { encountered_parse_failure = true; diff --git a/gix-ref/src/store/packed/iter.rs b/gix-ref/src/store/packed/iter.rs index 19c8b995e59..dc5966fd13c 100644 --- a/gix-ref/src/store/packed/iter.rs +++ b/gix-ref/src/store/packed/iter.rs @@ -1,5 +1,4 @@ use gix_object::bstr::{BString, ByteSlice}; -use winnow::{combinator::preceded, prelude::*, token::rest}; use crate::store_impl::{packed, packed::decode}; @@ -29,8 +28,8 @@ impl<'a> Iterator for packed::Iter<'a> { return None; } - let start = self.cursor.checkpoint(); - match decode::reference::<()>.parse_next(&mut self.cursor) { + let start = self.cursor; + match decode::reference(&mut self.cursor) { Ok(reference) => { self.current_line += 1; if let Some(ref prefix) = self.prefix { @@ -42,7 +41,7 @@ impl<'a> Iterator for packed::Iter<'a> { Some(Ok(reference)) } Err(_) => { - self.cursor.reset(&start); + self.cursor = start; let (failed_line, next_cursor) = self .cursor .find_byte(b'\n') @@ -84,11 +83,10 @@ impl<'a> packed::Iter<'a> { }) } else if packed[0] == b'#' { let mut input = packed; - let refs = preceded(decode::header::<()>, rest) - .parse_next(&mut input) - .map_err(|_| Error::Header { - invalid_first_line: packed.lines().next().unwrap_or(packed).into(), - })?; + decode::header(&mut input).map_err(|_| Error::Header { + invalid_first_line: packed.lines().next().unwrap_or(packed).into(), + })?; + let refs = input; Ok(packed::Iter { cursor: refs, prefix, diff --git a/gix-ref/tests/refs/file/reference.rs b/gix-ref/tests/refs/file/reference.rs index 33a83bd57ec..62f5b138ced 100644 --- a/gix-ref/tests/refs/file/reference.rs +++ b/gix-ref/tests/refs/file/reference.rs @@ -256,6 +256,14 @@ mod parse { None ); + mktest!( + peeled_uppercase, + b"C5241B835B93AF497CDA80CE0DCEB8F49800DF1C\n", + gix_ref::Kind::Object, + Some(hex_to_id("c5241b835b93af497cda80ce0dceb8f49800df1c").as_ref()), + None + ); + mktest!( symbolic, b"ref: refs/heads/main\n", diff --git a/gix/Cargo.toml b/gix/Cargo.toml index f26d560b52a..7fb6c2130e0 100644 --- a/gix/Cargo.toml +++ b/gix/Cargo.toml @@ -330,12 +330,6 @@ tracing = ["gix-features/tracing"] ## Enable tracing using the `tracing` crate for detailed tracing. Also enables coarse tracing. tracing-detail = ["gix-features/tracing-detail", "tracing"] -## When parsing objects by default errors will only be available on the granularity of success or failure, and with the above flag enabled -## details information about the error location will be collected. -## Use it in applications which expect broken or invalid objects or for debugging purposes. -## Incorrectly formatted objects aren't very common otherwise. -verbose-object-parsing-errors = ["gix-object/verbose-object-parsing-errors"] - ## Data structures implement `serde::Serialize` and `serde::Deserialize`. serde = [ "dep:serde", diff --git a/justfile b/justfile index 0c247e8a4d9..61301c97dad 100755 --- a/justfile +++ b/justfile @@ -75,8 +75,8 @@ check: cargo check -p gix-hashtable 2>&1 >/dev/null | grep 'Please set either the `sha1` or the `sha256` feature flag' cargo check -p gix-hashtable --features sha1 cargo check -p gix-object --all-features - cargo check -p gix-object --features verbose-object-parsing-errors 2>&1 >/dev/null | grep 'Please set either the `sha1` or the `sha256` feature flag' - cargo check -p gix-object --features sha1,verbose-object-parsing-errors + cargo check -p gix-object 2>&1 >/dev/null | grep 'Please set either the `sha1` or the `sha256` feature flag' + cargo check -p gix-object --features sha1 cargo check -p gix-archive 2>&1 >/dev/null | grep 'Please set either the `sha1` or the `sha256` feature flag' cargo check -p gix-archive --features sha1 cargo check -p gix-attributes --features serde @@ -215,8 +215,8 @@ unit-tests: env GIX_TEST_FIXTURE_HASH=sha256 cargo nextest run -p gix-commitgraph --no-fail-fast env GIX_TEST_FIXTURE_HASH=sha1 cargo nextest run -p gix-object --no-fail-fast env GIX_TEST_FIXTURE_HASH=sha256 cargo nextest run -p gix-object --no-fail-fast - env GIX_TEST_FIXTURE_HASH=sha1 cargo nextest run -p gix-object --features verbose-object-parsing-errors --no-fail-fast - env GIX_TEST_FIXTURE_HASH=sha256 cargo nextest run -p gix-object --features verbose-object-parsing-errors --no-fail-fast + env GIX_TEST_FIXTURE_HASH=sha1 cargo nextest run -p gix-object --no-fail-fast + env GIX_TEST_FIXTURE_HASH=sha256 cargo nextest run -p gix-object --no-fail-fast cargo nextest run -p gix-tempfile --features signals --no-fail-fast cargo nextest run -p gix-features --all-features --no-fail-fast cargo nextest run -p gix-ref-tests --all-features --no-fail-fast diff --git a/tests/tools/Cargo.toml b/tests/tools/Cargo.toml index bb5ef4e3f23..a9719b8b817 100644 --- a/tests/tools/Cargo.toml +++ b/tests/tools/Cargo.toml @@ -32,7 +32,6 @@ gix-worktree = { version = "^0.51.0", path = "../../gix-worktree" } gix-fs = { version = "^0.20.0", path = "../../gix-fs" } gix-tempfile = { version = "^22.0.0", path = "../../gix-tempfile", default-features = false, features = ["signals"] } -winnow = { version = "1.0.0", features = ["simd"] } fastrand = "2.0.0" bstr = { version = "1.12.0", default-features = false } crc = "3.4.0" diff --git a/tests/tools/src/lib.rs b/tests/tools/src/lib.rs index 2efdd5f0648..ffbf65873bc 100644 --- a/tests/tools/src/lib.rs +++ b/tests/tools/src/lib.rs @@ -1607,14 +1607,6 @@ fn extract_archive( Ok((archive_identity, platform)) } -/// Transform a verbose parser errors from raw bytes into a `BStr` to make printing/debugging human-readable. -pub fn to_bstr_err( - err: winnow::error::ErrMode>, -) -> winnow::error::TreeError<&winnow::stream::BStr, winnow::error::StrContext> { - let err = err.into_inner().expect("not a streaming parser"); - err.map_input(winnow::stream::BStr::new) -} - fn family_name() -> &'static str { if cfg!(windows) { "windows" From 51279734f848600ccd76b8256e77bf06f429dd60 Mon Sep 17 00:00:00 2001 From: "GPT 5.5" Date: Mon, 27 Apr 2026 11:45:22 +0800 Subject: [PATCH 4/8] fix: Allow more pathological cases during parsing just like Git This improves Git conformity, which is also pretty lenient. Co-authored-by: Sebastian Thiel --- gix-config/src/file/mutable/mod.rs | 2 +- gix-config/src/parse/events.rs | 4 +- gix-config/src/parse/from_bytes/mod.rs | 31 +++++++--- gix-config/src/parse/from_bytes/tests.rs | 47 ++++++++++----- gix-config/src/parse/mod.rs | 6 +- gix-config/src/parse/tests.rs | 59 +++++++++++++++++++ gix-config/src/types.rs | 7 ++- .../tests/config/file/access/raw/raw_value.rs | 11 ++++ .../file/access/raw/set_existing_raw_value.rs | 8 +++ 9 files changed, 145 insertions(+), 30 deletions(-) diff --git a/gix-config/src/file/mutable/mod.rs b/gix-config/src/file/mutable/mod.rs index 0ff284cb2f8..29357bfc7f2 100644 --- a/gix-config/src/file/mutable/mod.rs +++ b/gix-config/src/file/mutable/mod.rs @@ -8,7 +8,7 @@ pub(crate) mod multi_value; pub(crate) mod section; pub(crate) mod value; -fn escape_value(value: &BStr) -> BString { +pub(crate) fn escape_value(value: &BStr) -> BString { let starts_with_whitespace = value.first().is_some_and(u8::is_ascii_whitespace); let ends_with_whitespace = value .get(value.len().saturating_sub(1)) diff --git a/gix-config/src/parse/events.rs b/gix-config/src/parse/events.rs index ae95b61c64c..1353987b759 100644 --- a/gix-config/src/parse/events.rs +++ b/gix-config/src/parse/events.rs @@ -35,8 +35,8 @@ pub type FrontMatterEvents<'a> = SmallVec<[Event<'a>; 8]>; /// - Comment markers are not strictly defined either. This parser will always /// and only handle a semicolon or octothorpe (also known as a hash or number /// sign). -/// - Global properties may be allowed in `.ini` parsers, but is strictly -/// disallowed by this parser. +/// - Global properties before the first section are accepted for compatibility +/// with Git, even though they are uncommon in `.gitconfig` files. /// - Only `\t`, `\n`, `\b` `\\` are valid escape characters. /// - Quoted and semi-quoted values will be parsed (but quotes will be included /// in event outputs). An example of a semi-quoted value is `5"hello world"`, diff --git a/gix-config/src/parse/from_bytes/mod.rs b/gix-config/src/parse/from_bytes/mod.rs index 80145b5591a..55b2ed6bd43 100644 --- a/gix-config/src/parse/from_bytes/mod.rs +++ b/gix-config/src/parse/from_bytes/mod.rs @@ -9,8 +9,9 @@ type ParseResult = Result; /// Attempt to zero-copy parse the provided `input`, passing results to `dispatch`. /// /// The `input` is a complete Git config file. A UTF BOM is skipped, leading -/// comments, whitespace, and newlines are emitted first via `dispatch`, -/// and then one or more sections are parsed until EOF. +/// comments, whitespace, newlines, and Git-compatible key/value pairs before +/// the first section are emitted first via `dispatch`, and then one or more +/// sections are parsed until EOF. /// /// On success, all input is consumed. /// On failure, the returned [`Error`] reports the line number, the parser node @@ -29,6 +30,13 @@ pub fn from_bytes<'i>(mut input: &'i [u8], dispatch: &mut dyn FnMut(Event<'i>)) dispatch(Event::Whitespace(Cow::Borrowed(whitespace))); } else if let Ok(newline) = take_newlines1(&mut input) { dispatch(Event::Newline(Cow::Borrowed(newline))); + } else if !input.starts_with(b"[") { + let mut node = ParseNode::SectionHeader; + key_value_pair(&mut input, &mut node, dispatch).map_err(|_| Error { + line_number: newlines_from(original, input), + last_attempted_parser: node, + parsed_until: input.as_bstr().into(), + })?; } if input.len() == before.len() { break; @@ -155,7 +163,7 @@ fn section_header<'i>(i: &mut &'i [u8]) -> ParseResult> { return Err(()); }; c = rest; - let subsection_name = sub_section(&mut c)?; + let subsection_name = quoted_sub_section(&mut c)?; let Some(rest) = c.strip_prefix(b"\"]") else { return Err(()); }; @@ -179,9 +187,10 @@ fn is_section_char(c: u8) -> bool { /// Input starts immediately after the opening quote in `[section "sub"]`. /// Parsing stops before the closing quote. Backslash escapes copy the escaped /// byte into an owned buffer; otherwise the returned value borrows from the -/// input. Newlines and NUL bytes are rejected. On success, `i` is advanced to -/// the closing quote. -fn sub_section<'i>(i: &mut &'i [u8]) -> ParseResult> { +/// input. Newlines are rejected. On success, `i` is advanced to the closing +/// quote. +/// NUL byte are explicitly allowed. +fn quoted_sub_section<'i>(i: &mut &'i [u8]) -> ParseResult> { let mut c = *i; let input = c; let mut out: Option> = None; @@ -189,7 +198,7 @@ fn sub_section<'i>(i: &mut &'i [u8]) -> ParseResult> { while let Some(&b) = c.first() { match b { b'"' => break, - b'\n' | 0 => return Err(()), + b'\n' => return Err(()), b'\\' => { let escaped = *c.get(1).ok_or(())?; if escaped == b'\n' { @@ -279,6 +288,8 @@ fn config_value<'i>(i: &mut &'i [u8], dispatch: &mut dyn FnMut(Event<'i>)) -> Pa /// Double quotes toggle quoted mode for comment handling. Supported escapes are /// backslash followed by `n`, `t`, `\`, `b`, `"`, LF, or CRLF. Line continuations /// emit [`Event::ValueNotDone`], the continuation newline, and finally [`Event::ValueDone`]. +/// If the value ends with a trailing backslash at EOF, it is emitted as +/// [`Event::ValueNotDone`] followed directly by an empty [`Event::ValueDone`]. /// Otherwise a single [`Event::Value`] is emitted with trailing ASCII whitespace /// trimmed from the logical value. /// On success, `i` is advanced to the first unconsumed delimiter or EOF. @@ -307,7 +318,11 @@ fn value<'i>(i: &mut &'i [u8], dispatch: &mut dyn FnMut(Event<'i>)) -> ParseResu cursor += 1; let mut consumed = 1usize; let Some(mut b) = input.get(cursor).copied() else { - return Err(()); + let value = input[value_start..escape_index].as_bstr(); + dispatch(Event::ValueNotDone(Cow::Borrowed(value))); + dispatch(Event::ValueDone(Cow::Borrowed("".into()))); + *i = &[]; + return Ok(()); }; if b == b'\r' { cursor += 1; diff --git a/gix-config/src/parse/from_bytes/tests.rs b/gix-config/src/parse/from_bytes/tests.rs index e4c7b76c42b..77fbcd42312 100644 --- a/gix-config/src/parse/from_bytes/tests.rs +++ b/gix-config/src/parse/from_bytes/tests.rs @@ -26,11 +26,23 @@ where mod config { use super::from_bytes; + use crate::parse::tests::util::{name_event, newline_event, value_event, whitespace_event}; + use crate::parse::Event; #[test] - fn key_value_before_first_section_is_rejected() { - assert!( - from_bytes(b"a = b\n", &mut |_| {}).is_err(), + fn key_value_before_first_section_is_accepted() { + let mut events = Vec::new(); + from_bytes(b"a = b\n", &mut |event| events.push(event)).unwrap(); + assert_eq!( + events, + vec![ + name_event("a"), + whitespace_event(" "), + Event::KeyValueSeparator, + whitespace_event(" "), + value_event("b"), + newline_event(), + ], "Git accepts this and reports `a=b`, as git_parse_source() parses alphabetic keys even before any section" ); } @@ -143,8 +155,9 @@ mod section_headers { #[test] fn null_byt_in_sub_section() { - assert!( - section_header.parse_peek(b"[hello \"hello\0\"]").is_err(), + assert_eq!( + section_header.parse_peek(b"[hello \"hello\0\"]").unwrap(), + fully_consumed(parsed_section_header("hello", (" ", "hello\0"))), "Git accepts this because get_extended_base_var() only rejects newline in quoted subsections" ); } @@ -199,18 +212,18 @@ mod section_headers { mod sub_section { use std::borrow::Cow; - use super::{sub_section, ParsePeekExt}; + use super::{quoted_sub_section, ParsePeekExt}; #[test] fn zero_copy_simple() { - let actual = sub_section.parse_peek(br#"name""#).unwrap().1; + let actual = quoted_sub_section.parse_peek(br#"name""#).unwrap().1; assert_eq!(actual.as_ref(), "name"); assert!(matches!(actual, Cow::Borrowed(_))); } #[test] fn escapes_need_allocation() { - let actual = sub_section.parse_peek(br#"\x\t\n\0\\\"""#).unwrap().1; + let actual = quoted_sub_section.parse_peek(br#"\x\t\n\0\\\"""#).unwrap().1; assert_eq!(actual.as_ref(), r#"xtn0\""#); assert!(matches!(actual, Cow::Owned(_))); } @@ -744,7 +757,7 @@ mod value_continuation { mod value_no_continuation { use super::value_continuation::value; - use crate::parse::tests::util::value_event; + use crate::parse::tests::util::{value_done_event, value_event, value_not_done_event}; #[test] fn no_comment() { @@ -844,8 +857,11 @@ mod value_no_continuation { #[test] fn incomplete_escape() { - assert!( - value(br"hello world\", &mut Default::default()).is_err(), + let mut events = Vec::new(); + assert_eq!(value(br"hello world\", &mut events).unwrap().0, b""); + assert_eq!( + events, + vec![value_not_done_event("hello world"), value_done_event("")], "Git accepts this because EOF is normalized to newline and the trailing backslash becomes a continuation" ); } @@ -1028,9 +1044,12 @@ mod value { } #[test] - fn trailing_backslash_is_rejected() { - assert!( - parse(b"hello\\").is_err(), + fn trailing_backslash_is_accepted_as_continuation_to_eof() { + let (remaining, events) = parse(b"hello\\").unwrap(); + assert_eq!(remaining, b"", "it consumes everything, as the continuation backslash is no value"); + assert_eq!( + events, + vec![value_not_done_event("hello"), value_done_event("")], "Git accepts this because get_next_char() maps EOF to newline, which parse_value() treats as a continuation" ); } diff --git a/gix-config/src/parse/mod.rs b/gix-config/src/parse/mod.rs index e2a72a0c690..50b1389c486 100644 --- a/gix-config/src/parse/mod.rs +++ b/gix-config/src/parse/mod.rs @@ -64,8 +64,10 @@ pub enum Event<'a> { Newline(Cow<'a, BStr>), /// Any value that isn't completed. This occurs when the value is continued /// onto the next line by ending it with a backslash. - /// A [`Newline`][Self::Newline] event is guaranteed after, followed by - /// either a ValueDone, a Whitespace, or another ValueNotDone. + /// A [`Newline`][Self::Newline] event usually follows, followed by either + /// `ValueDone`, `Whitespace`, or another `ValueNotDone`. The exception is a + /// trailing backslash at EOF, which Git accepts as a continuation and which + /// is represented by `ValueNotDone` followed directly by `ValueDone`. ValueNotDone(Cow<'a, BStr>), /// The last line of a value which was continued onto another line. /// With this it's possible to obtain the complete value by concatenating diff --git a/gix-config/src/parse/tests.rs b/gix-config/src/parse/tests.rs index 703f8a2167a..f566c46c9e4 100644 --- a/gix-config/src/parse/tests.rs +++ b/gix-config/src/parse/tests.rs @@ -103,6 +103,65 @@ mod section { ); assert!(!invalid.is_legacy()); } + + #[test] + fn empty_section_name_with_quoted_subsection() { + let header = header("", Some((" ", "core"))); + let mut out = Vec::new(); + header.write_to(&mut out).unwrap(); + assert_eq!( + out, br#"[ "core"]"#, + "Git accepts this as an empty section name with `core` as subsection, and we keep it" + ); + assert!(!header.is_legacy()); + } + + #[test] + fn nul_byte_in_quoted_subsection() { + let header = header("hello", Some((" ", "hello\0"))); + let mut out = Vec::new(); + header.write_to(&mut out).unwrap(); + assert_eq!( + out, b"[hello \"hello\0\"]", + "Git accepts NUL bytes in quoted subsection names, and we preserve them" + ); + assert!(!header.is_legacy()); + } + } + } +} + +mod event { + mod write_to { + use crate::parse::Events; + + fn write_events(input: &str) -> Vec { + let events = Events::from_str(input).unwrap().into_vec(); + let mut out = Vec::new(); + for event in &events { + event.write_to(&mut out).unwrap(); + } + out + } + + #[test] + fn key_value_before_first_section() { + let input = "a = b\n"; + assert_eq!( + write_events(input), + input.as_bytes(), + "Git accepts key/value pairs before the first section, and we preserve them" + ); + } + + #[test] + fn value_with_trailing_backslash_at_eof() { + let input = "[core]\na=hello\\"; + assert_eq!( + write_events(input), + input.as_bytes(), + "Git accepts EOF as a line continuation terminator, and we preserve the original trailing backslash" + ); } } } diff --git a/gix-config/src/types.rs b/gix-config/src/types.rs index 8aa1566aa47..f41e9006b12 100644 --- a/gix-config/src/types.rs +++ b/gix-config/src/types.rs @@ -103,9 +103,10 @@ pub enum Source { /// [`raw_value()`]: Self::raw_value #[derive(Eq, Clone, Debug, Default)] pub struct File<'event> { - /// The list of events that occur before any section. Since a - /// `git-config` file prohibits global values, this vec is limited to only - /// comment, newline, and whitespace events. + /// The list of events that occur before any section. + /// + /// Git accepts global properties before the first section, so this may also + /// contain key/value events. pub(crate) frontmatter_events: crate::parse::FrontMatterEvents<'event>, /// Frontmatter events to be placed after the given section. pub(crate) frontmatter_post_section: HashMap>, diff --git a/gix-config/tests/config/file/access/raw/raw_value.rs b/gix-config/tests/config/file/access/raw/raw_value.rs index 55b923ff69b..a0ed095507b 100644 --- a/gix-config/tests/config/file/access/raw/raw_value.rs +++ b/gix-config/tests/config/file/access/raw/raw_value.rs @@ -8,6 +8,17 @@ fn single_section() -> crate::Result { Ok(()) } +#[test] +fn global_property_uses_empty_section_name() -> crate::Result { + let config = File::try_from("a=b\n[core]\na=c")?; + assert_eq!( + config.raw_value_by("", None, "a").unwrap_err().to_string(), + "The requested section does not exist", + "these are not readable because the supporting this adds a lot of complexity" + ); + Ok(()) +} + #[test] fn last_one_wins_respected_in_section() -> crate::Result { let config = File::try_from("[core]\na=b\na=d")?; diff --git a/gix-config/tests/config/file/access/raw/set_existing_raw_value.rs b/gix-config/tests/config/file/access/raw/set_existing_raw_value.rs index d369f8b6f89..cbdabd9873a 100644 --- a/gix-config/tests/config/file/access/raw/set_existing_raw_value.rs +++ b/gix-config/tests/config/file/access/raw/set_existing_raw_value.rs @@ -22,6 +22,14 @@ fn single_line() { assert_set_value("hello world"); } +#[test] +fn global_property_uses_empty_section_name() -> crate::Result { + let mut file = file("a=b\n[core]\na=c"); + let err = file.set_existing_raw_value_by("", None, "a", "d").unwrap_err(); + assert_eq!(err.to_string(), "The requested section does not exist", "cannot set global values"); + Ok(()) +} + #[test] fn starts_with_whitespace() { assert_set_value("\ta"); From d4439cd5b5aa82c126198aa57de6a9ebbc15d371 Mon Sep 17 00:00:00 2001 From: "GPT 5.5" Date: Mon, 27 Apr 2026 12:27:51 +0800 Subject: [PATCH 5/8] fix!: Limit Commit and Tag parsing to a given `gix_hash::Kind` Doing so adds conformity with Git, but also simplifies the parser which now only parse hex-hashes of a single valid length. Co-authored-by: Sebastian Thiel --- Cargo.lock | 1 - gix-config/src/parse/from_bytes/tests.rs | 5 +- .../file/access/raw/set_existing_raw_value.rs | 6 +- gix-object/Cargo.toml | 1 - gix-object/benches/decode_objects.rs | 18 +- gix-object/fuzz/fuzz_targets/fuzz_commit.rs | 6 +- gix-object/fuzz/fuzz_targets/fuzz_tag.rs | 6 +- gix-object/src/commit/decode.rs | 6 +- gix-object/src/commit/mod.rs | 25 +- gix-object/src/commit/ref_iter.rs | 43 ++-- gix-object/src/data.rs | 8 +- gix-object/src/lib.rs | 4 +- gix-object/src/object/mod.rs | 4 +- gix-object/src/parse.rs | 14 +- gix-object/src/tag/decode.rs | 19 +- gix-object/src/tag/mod.rs | 4 +- gix-object/src/tag/ref_iter.rs | 23 +- gix-object/tests/object/commit/from_bytes.rs | 194 +++++++++++----- gix-object/tests/object/commit/iter.rs | 26 ++- gix-object/tests/object/commit/mod.rs | 16 +- gix-object/tests/object/encode.rs | 147 ++++++------ gix-object/tests/object/main.rs | 65 +++++- gix-object/tests/object/tag.rs | 219 ++++++++++++------ gix-ref/src/store/file/raw_ext.rs | 25 +- gix-ref/src/store/packed/transaction.rs | 22 +- 25 files changed, 588 insertions(+), 319 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3dbaaea9cb5..49e54c58380 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2067,7 +2067,6 @@ dependencies = [ "document-features", "gix-actor", "gix-date", - "gix-error", "gix-features", "gix-hash", "gix-hashtable", diff --git a/gix-config/src/parse/from_bytes/tests.rs b/gix-config/src/parse/from_bytes/tests.rs index 77fbcd42312..3f802097378 100644 --- a/gix-config/src/parse/from_bytes/tests.rs +++ b/gix-config/src/parse/from_bytes/tests.rs @@ -1046,7 +1046,10 @@ mod value { #[test] fn trailing_backslash_is_accepted_as_continuation_to_eof() { let (remaining, events) = parse(b"hello\\").unwrap(); - assert_eq!(remaining, b"", "it consumes everything, as the continuation backslash is no value"); + assert_eq!( + remaining, b"", + "it consumes everything, as the continuation backslash is no value" + ); assert_eq!( events, vec![value_not_done_event("hello"), value_done_event("")], diff --git a/gix-config/tests/config/file/access/raw/set_existing_raw_value.rs b/gix-config/tests/config/file/access/raw/set_existing_raw_value.rs index cbdabd9873a..66d045fe6cd 100644 --- a/gix-config/tests/config/file/access/raw/set_existing_raw_value.rs +++ b/gix-config/tests/config/file/access/raw/set_existing_raw_value.rs @@ -26,7 +26,11 @@ fn single_line() { fn global_property_uses_empty_section_name() -> crate::Result { let mut file = file("a=b\n[core]\na=c"); let err = file.set_existing_raw_value_by("", None, "a", "d").unwrap_err(); - assert_eq!(err.to_string(), "The requested section does not exist", "cannot set global values"); + assert_eq!( + err.to_string(), + "The requested section does not exist", + "cannot set global values" + ); Ok(()) } diff --git a/gix-object/Cargo.toml b/gix-object/Cargo.toml index 018e392f145..8840c02fb4c 100644 --- a/gix-object/Cargo.toml +++ b/gix-object/Cargo.toml @@ -45,7 +45,6 @@ gix-hashtable = { version = "^0.14.0", path = "../gix-hashtable" } gix-validate = { version = "^0.11.1", path = "../gix-validate" } gix-actor = { version = "^0.40.1", path = "../gix-actor" } gix-date = { version = "^0.15.2", path = "../gix-date" } -gix-error = { version = "^0.2.2", path = "../gix-error" } gix-utils = { version = "^0.3.2", path = "../gix-utils" } itoa = "1.0.17" diff --git a/gix-object/benches/decode_objects.rs b/gix-object/benches/decode_objects.rs index 6a340b00933..8bd51bcd901 100644 --- a/gix-object/benches/decode_objects.rs +++ b/gix-object/benches/decode_objects.rs @@ -3,19 +3,29 @@ use std::hint::black_box; fn parse_commit(c: &mut Criterion) { c.bench_function("CommitRef(sig)", |b| { - b.iter(|| black_box(gix_object::CommitRef::from_bytes(COMMIT_WITH_MULTI_LINE_HEADERS)).unwrap()); + b.iter(|| { + black_box(gix_object::CommitRef::from_bytes( + COMMIT_WITH_MULTI_LINE_HEADERS, + gix_hash::Kind::Sha1, + )) + .unwrap() + }); }); c.bench_function("CommitRefIter(sig)", |b| { - b.iter(|| black_box(gix_object::CommitRefIter::from_bytes(COMMIT_WITH_MULTI_LINE_HEADERS).count())); + b.iter(|| { + black_box( + gix_object::CommitRefIter::from_bytes(COMMIT_WITH_MULTI_LINE_HEADERS, gix_hash::Kind::Sha1).count(), + ) + }); }); } fn parse_tag(c: &mut Criterion) { c.bench_function("TagRef(sig)", |b| { - b.iter(|| black_box(gix_object::TagRef::from_bytes(TAG_WITH_SIGNATURE)).unwrap()); + b.iter(|| black_box(gix_object::TagRef::from_bytes(TAG_WITH_SIGNATURE, gix_hash::Kind::Sha1)).unwrap()); }); c.bench_function("TagRefIter(sig)", |b| { - b.iter(|| black_box(gix_object::TagRefIter::from_bytes(TAG_WITH_SIGNATURE).count())); + b.iter(|| black_box(gix_object::TagRefIter::from_bytes(TAG_WITH_SIGNATURE, gix_hash::Kind::Sha1).count())); }); } diff --git a/gix-object/fuzz/fuzz_targets/fuzz_commit.rs b/gix-object/fuzz/fuzz_targets/fuzz_commit.rs index b8f3fe1ff37..821e93c8749 100644 --- a/gix-object/fuzz/fuzz_targets/fuzz_commit.rs +++ b/gix-object/fuzz/fuzz_targets/fuzz_commit.rs @@ -3,6 +3,8 @@ use libfuzzer_sys::fuzz_target; use std::hint::black_box; fuzz_target!(|commit: &[u8]| { - _ = black_box(gix_object::CommitRef::from_bytes(commit)); - _ = black_box(gix_object::CommitRefIter::from_bytes(commit)).count(); + _ = black_box(gix_object::CommitRef::from_bytes(commit, gix_hash::Kind::Sha1)); + _ = black_box(gix_object::CommitRefIter::from_bytes(commit, gix_hash::Kind::Sha1)).count(); + _ = black_box(gix_object::CommitRef::from_bytes(commit, gix_hash::Kind::Sha256)); + _ = black_box(gix_object::CommitRefIter::from_bytes(commit, gix_hash::Kind::Sha256)).count(); }); diff --git a/gix-object/fuzz/fuzz_targets/fuzz_tag.rs b/gix-object/fuzz/fuzz_targets/fuzz_tag.rs index 34135d4097b..c3bb319218e 100644 --- a/gix-object/fuzz/fuzz_targets/fuzz_tag.rs +++ b/gix-object/fuzz/fuzz_targets/fuzz_tag.rs @@ -4,6 +4,8 @@ use libfuzzer_sys::fuzz_target; use std::hint::black_box; fuzz_target!(|tag: &[u8]| { - _ = black_box(gix_object::TagRef::from_bytes(tag)); - _ = black_box(gix_object::TagRefIter::from_bytes(tag).count()); + _ = black_box(gix_object::TagRef::from_bytes(tag, gix_hash::Kind::Sha1)); + _ = black_box(gix_object::TagRefIter::from_bytes(tag, gix_hash::Kind::Sha1).count()); + _ = black_box(gix_object::TagRef::from_bytes(tag, gix_hash::Kind::Sha256)); + _ = black_box(gix_object::TagRefIter::from_bytes(tag, gix_hash::Kind::Sha256).count()); }); diff --git a/gix-object/src/commit/decode.rs b/gix-object/src/commit/decode.rs index 5882b4e5c84..dfd4798d9d9 100644 --- a/gix-object/src/commit/decode.rs +++ b/gix-object/src/commit/decode.rs @@ -37,13 +37,13 @@ pub fn message<'a>(i: &mut &'a [u8]) -> ParseResult<&'a BStr> { /// This parser is not transactional as a whole: if a later required field or /// the final message parse fails, `i` may already have been advanced past /// earlier successfully parsed fields. -pub fn commit<'a>(i: &mut &'a [u8]) -> ParseResult> { - let tree = parse::header_field(i, b"tree", parse::hex_hash)?; +pub fn commit<'a>(i: &mut &'a [u8], hash_kind: gix_hash::Kind) -> ParseResult> { + let tree = parse::header_field(i, b"tree", |value| parse::hex_hash(value, hash_kind))?; let mut parents = SmallVec::new(); loop { let before = *i; - match parse::header_field(i, b"parent", parse::hex_hash) { + match parse::header_field(i, b"parent", |value| parse::hex_hash(value, hash_kind)) { Ok(parent) => parents.push(parent), Err(_) => { *i = before; diff --git a/gix-object/src/commit/mod.rs b/gix-object/src/commit/mod.rs index a33d70bf71b..6db9331acab 100644 --- a/gix-object/src/commit/mod.rs +++ b/gix-object/src/commit/mod.rs @@ -62,10 +62,11 @@ mod write; /// Lifecycle impl<'a> CommitRef<'a> { - /// Deserialize a commit from the given `data` bytes while avoiding most allocations. - pub fn from_bytes(mut data: &'a [u8]) -> Result, crate::decode::Error> { + /// Deserialize a commit from the given `data` bytes while avoiding most allocations, using `hash_kind` to know + /// what kind of hash to expect for validation. + pub fn from_bytes(mut data: &'a [u8], hash_kind: gix_hash::Kind) -> Result, crate::decode::Error> { let input = &mut data; - match decode::commit(input) { + match decode::commit(input, hash_kind) { Ok(tag) => Ok(tag), Err(err) => Err(err), } @@ -88,7 +89,10 @@ impl<'a> CommitRef<'a> { /// Returns a convenient iterator over all extra headers. pub fn extra_headers(&self) -> ExtraHeaders> { - ExtraHeaders::new(self.extra_headers.iter().map(|(k, v)| (*k, v.as_ref()))) + ExtraHeaders::new( + self.extra_headers.iter().map(|(k, v)| (*k, v.as_ref())), + self.tree().kind(), + ) } /// Return the author, with whitespace trimmed. @@ -132,13 +136,17 @@ impl CommitRef<'_> { impl Commit { /// Returns a convenient iterator over all extra headers. pub fn extra_headers(&self) -> ExtraHeaders> { - ExtraHeaders::new(self.extra_headers.iter().map(|(k, v)| (k.as_bstr(), v.as_bstr()))) + ExtraHeaders::new( + self.extra_headers.iter().map(|(k, v)| (k.as_bstr(), v.as_bstr())), + self.tree.kind(), + ) } } /// An iterator over extra headers in [owned][crate::Commit] and [borrowed][crate::CommitRef] commits. pub struct ExtraHeaders { inner: I, + hash_kind: gix_hash::Kind, } /// Instantiation and convenience. @@ -147,8 +155,8 @@ where I: Iterator, { /// Create a new instance from an iterator over tuples of (name, value) pairs. - pub fn new(iter: I) -> Self { - ExtraHeaders { inner: iter } + pub fn new(iter: I, hash_kind: gix_hash::Kind) -> Self { + ExtraHeaders { inner: iter, hash_kind } } /// Find the _value_ of the _first_ header with the given `name`. @@ -175,7 +183,8 @@ where /// A merge tag is a tag object embedded within the respective header field of a commit, making /// it a child object of sorts. pub fn mergetags(self) -> impl Iterator, crate::decode::Error>> { - self.find_all("mergetag").map(|b| TagRef::from_bytes(b)) + let hash_kind = self.hash_kind; + self.find_all("mergetag").map(move |b| TagRef::from_bytes(b, hash_kind)) } /// Return the cryptographic signature provided by gpg/pgp verbatim. diff --git a/gix-object/src/commit/ref_iter.rs b/gix-object/src/commit/ref_iter.rs index c400b495cbb..3b49f3f1c6b 100644 --- a/gix-object/src/commit/ref_iter.rs +++ b/gix-object/src/commit/ref_iter.rs @@ -30,11 +30,13 @@ pub(crate) enum State { /// Lifecycle impl<'a> CommitRefIter<'a> { - /// Create a commit iterator from data. - pub fn from_bytes(data: &'a [u8]) -> CommitRefIter<'a> { + /// Create a commit iterator from the given `data`, using `hash_kind` to know + /// what kind of hash to expect for validation. + pub fn from_bytes(data: &'a [u8], hash_kind: gix_hash::Kind) -> CommitRefIter<'a> { CommitRefIter { data, state: State::default(), + hash_kind, } } } @@ -42,17 +44,21 @@ impl<'a> CommitRefIter<'a> { /// Access impl<'a> CommitRefIter<'a> { /// Parse `data` as commit and return its PGP signature, along with *all non-signature* data as [`SignedData`], or `None` - /// if the commit isn't signed. + /// if the commit isn't signed. All hashes in `data` are parsed as `hash_kind`. /// /// This allows the caller to validate the signature by passing the signed data along with the signature back to the program /// that created it. - pub fn signature(data: &'a [u8]) -> Result, SignedData<'a>)>, crate::decode::Error> { + pub fn signature( + data: &'a [u8], + hash_kind: gix_hash::Kind, + ) -> Result, SignedData<'a>)>, crate::decode::Error> { let mut signature_and_range = None; let raw_tokens = CommitRefIterRaw { data, state: State::default(), offset: 0, + hash_kind, }; for token in raw_tokens { let token = token?; @@ -146,19 +152,27 @@ fn missing_field() -> crate::decode::Error { impl<'a> CommitRefIter<'a> { #[inline] - fn next_inner(mut i: &'a [u8], state: &mut State) -> Result<(&'a [u8], Token<'a>), crate::decode::Error> { + fn next_inner( + mut i: &'a [u8], + state: &mut State, + hash_kind: gix_hash::Kind, + ) -> Result<(&'a [u8], Token<'a>), crate::decode::Error> { let input = &mut i; - match Self::next_inner_(input, state) { + match Self::next_inner_(input, state, hash_kind) { Ok(token) => Ok((*input, token)), Err(err) => Err(err), } } - fn next_inner_(input: &mut &'a [u8], state: &mut State) -> Result, crate::decode::Error> { + fn next_inner_( + input: &mut &'a [u8], + state: &mut State, + hash_kind: gix_hash::Kind, + ) -> Result, crate::decode::Error> { use State::*; Ok(match state { Tree => { - let tree = parse::header_field(input, b"tree", parse::hex_hash)?; + let tree = parse::header_field(input, b"tree", |value| parse::hex_hash(value, hash_kind))?; *state = State::Parents; Token::Tree { id: ObjectId::from_hex(tree).expect("parsing validation"), @@ -166,7 +180,7 @@ impl<'a> CommitRefIter<'a> { } Parents => { if input.starts_with(b"parent ") { - let parent = parse::header_field(input, b"parent", parse::hex_hash)?; + let parent = parse::header_field(input, b"parent", |value| parse::hex_hash(value, hash_kind))?; Token::Parent { id: ObjectId::from_hex(parent).expect("parsing validation"), } @@ -174,7 +188,7 @@ impl<'a> CommitRefIter<'a> { *state = State::Signature { of: SignatureKind::Author, }; - Self::next_inner_(input, state)? + Self::next_inner_(input, state, hash_kind)? } } Signature { ref mut of } => { @@ -201,13 +215,13 @@ impl<'a> CommitRefIter<'a> { let encoding = parse::header_field(input, b"encoding", Ok)?; Token::Encoding(encoding.as_bstr()) } else { - Self::next_inner_(input, state)? + Self::next_inner_(input, state, hash_kind)? } } ExtraHeaders => { if input.starts_with(b"\n") { *state = State::Message; - Self::next_inner_(input, state)? + Self::next_inner_(input, state, hash_kind)? } else { let before = *input; match parse::any_header_field_multi_line(input) @@ -240,7 +254,7 @@ impl<'a> Iterator for CommitRefIter<'a> { if self.data.is_empty() { return None; } - match Self::next_inner(self.data, &mut self.state) { + match Self::next_inner(self.data, &mut self.state, self.hash_kind) { Ok((data, token)) => { self.data = data; Some(Ok(token)) @@ -258,6 +272,7 @@ struct CommitRefIterRaw<'a> { data: &'a [u8], state: State, offset: usize, + hash_kind: gix_hash::Kind, } impl<'a> Iterator for CommitRefIterRaw<'a> { @@ -267,7 +282,7 @@ impl<'a> Iterator for CommitRefIterRaw<'a> { if self.data.is_empty() { return None; } - match CommitRefIter::next_inner(self.data, &mut self.state) { + match CommitRefIter::next_inner(self.data, &mut self.state, self.hash_kind) { Ok((remaining, token)) => { let consumed = self.data.len() - remaining.len(); let start = self.offset; diff --git a/gix-object/src/data.rs b/gix-object/src/data.rs index 1ced8a7f4de..1d16eb581ae 100644 --- a/gix-object/src/data.rs +++ b/gix-object/src/data.rs @@ -16,8 +16,8 @@ impl<'a> Data<'a> { Ok(match self.kind { Kind::Tree => ObjectRef::Tree(TreeRef::from_bytes(self.data, self.hash_kind)?), Kind::Blob => ObjectRef::Blob(BlobRef { data: self.data }), - Kind::Commit => ObjectRef::Commit(CommitRef::from_bytes(self.data)?), - Kind::Tag => ObjectRef::Tag(TagRef::from_bytes(self.data)?), + Kind::Commit => ObjectRef::Commit(CommitRef::from_bytes(self.data, self.hash_kind)?), + Kind::Tag => ObjectRef::Tag(TagRef::from_bytes(self.data, self.hash_kind)?), }) } @@ -34,7 +34,7 @@ impl<'a> Data<'a> { /// `None` if this is not a commit object. pub fn try_into_commit_iter(self) -> Option> { match self.kind { - Kind::Commit => Some(CommitRefIter::from_bytes(self.data)), + Kind::Commit => Some(CommitRefIter::from_bytes(self.data, self.hash_kind)), _ => None, } } @@ -43,7 +43,7 @@ impl<'a> Data<'a> { /// `None` if this is not a tag object. pub fn try_into_tag_iter(self) -> Option> { match self.kind { - Kind::Tag => Some(TagRefIter::from_bytes(self.data)), + Kind::Tag => Some(TagRefIter::from_bytes(self.data, self.hash_kind)), _ => None, } } diff --git a/gix-object/src/lib.rs b/gix-object/src/lib.rs index 6d577ab95a4..5e153f67530 100644 --- a/gix-object/src/lib.rs +++ b/gix-object/src/lib.rs @@ -109,7 +109,7 @@ pub struct Blob { #[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct CommitRef<'a> { - /// HEX hash of tree object we point to. Usually 40 bytes long. + /// HEX hash of tree object we point to. /// /// Use [`tree()`](CommitRef::tree()) to obtain a decoded version of it. #[cfg_attr(feature = "serde", serde(borrow))] @@ -140,6 +140,7 @@ pub struct CommitRef<'a> { pub struct CommitRefIter<'a> { data: &'a [u8], state: commit::ref_iter::State, + hash_kind: gix_hash::Kind, } /// A mutable git commit, representing an annotated state of a working tree along with a reference to its historical commits. @@ -194,6 +195,7 @@ pub struct TagRef<'a> { pub struct TagRefIter<'a> { data: &'a [u8], state: tag::ref_iter::State, + hash_kind: gix_hash::Kind, } /// A mutable git tag. diff --git a/gix-object/src/object/mod.rs b/gix-object/src/object/mod.rs index 82751195743..2a15b08ef36 100644 --- a/gix-object/src/object/mod.rs +++ b/gix-object/src/object/mod.rs @@ -212,8 +212,8 @@ impl<'a> ObjectRef<'a> { Ok(match kind { Kind::Tree => ObjectRef::Tree(TreeRef::from_bytes(data, hash_kind)?), Kind::Blob => ObjectRef::Blob(BlobRef { data }), - Kind::Commit => ObjectRef::Commit(CommitRef::from_bytes(data)?), - Kind::Tag => ObjectRef::Tag(TagRef::from_bytes(data)?), + Kind::Commit => ObjectRef::Commit(CommitRef::from_bytes(data, hash_kind)?), + Kind::Tag => ObjectRef::Tag(TagRef::from_bytes(data, hash_kind)?), }) } diff --git a/gix-object/src/parse.rs b/gix-object/src/parse.rs index c519a679fe8..3e426bd8685 100644 --- a/gix-object/src/parse.rs +++ b/gix-object/src/parse.rs @@ -109,15 +109,13 @@ pub(crate) fn any_header_field<'a>(i: &mut &'a [u8]) -> ParseResult<(&'a [u8], & } } -/// Parse a complete hexadecimal object id. +/// Parse a complete hexadecimal object id of the given `hash_kind`. /// -/// Typical input is a 40-byte SHA-1 hex id or a 64-byte SHA-256 hex id. The -/// entire input slice must be ASCII hex and must match one of the supported -/// object hash lengths. -pub fn hex_hash(i: &[u8]) -> ParseResult<&BStr> { - let max = gix_hash::Kind::longest().len_in_hex(); - let len = i.iter().take(max).take_while(|b| b.is_ascii_hexdigit()).count(); - if len != i.len() || !gix_hash::Kind::all().iter().any(|hk| hk.len_in_hex() == len) { +/// Typical input is a 40-byte SHA-1 hex id or a 64-byte SHA-256 hex id, +/// depending on `hash_kind`. The entire input slice must be ASCII hex and +/// match the expected object hash length. +pub fn hex_hash(i: &[u8], hash_kind: gix_hash::Kind) -> ParseResult<&BStr> { + if i.len() != hash_kind.len_in_hex() || !i.iter().all(u8::is_ascii_hexdigit) { return Err(crate::decode::Error); } Ok(i.as_bstr()) diff --git a/gix-object/src/tag/decode.rs b/gix-object/src/tag/decode.rs index c3ce1515dce..2bf67424a26 100644 --- a/gix-object/src/tag/decode.rs +++ b/gix-object/src/tag/decode.rs @@ -14,8 +14,8 @@ use crate::{parse, parse::ParseResult, BStr, Kind, TagRef}; /// This parser is not transactional as a whole: if a later field fails, `i` may /// already have been advanced past earlier successfully parsed fields. Individual /// field parsers document their own cursor behaviour. -pub fn git_tag<'a>(i: &mut &'a [u8]) -> ParseResult> { - let target = target(i)?; +pub fn git_tag<'a>(i: &mut &'a [u8], hash_kind: gix_hash::Kind) -> ParseResult> { + let target = target(i, hash_kind)?; let kind = kind(i)?; let tag_version = name(i)?; let tagger = tagger_raw(i)?; @@ -38,17 +38,10 @@ pub fn git_tag<'a>(i: &mut &'a [u8]) -> ParseResult> { /// Parse the `object \n` header and return the object id as bytes. /// /// Typical input is `object 0123456789012345678901234567890123456789\n`. -/// Both SHA-1 and SHA-256 hex lengths are accepted, and uppercase ASCII hex is -/// valid. On success, `i` is advanced past the entire header line. -pub(crate) fn target<'a>(i: &mut &'a [u8]) -> ParseResult<&'a BStr> { - fn is_valid_hex_hash(value: &[u8]) -> bool { - matches!(value.len(), 40 | 64) && value.iter().all(u8::is_ascii_hexdigit) - } - parse::header_field(i, b"object", |value| { - is_valid_hex_hash(value) - .then(|| value.as_bstr()) - .ok_or(crate::decode::Error) - }) +/// The hash must match `hash_kind`. Uppercase ASCII hex is also valid. +/// On success, `i` is advanced past the entire header line. +pub(crate) fn target<'a>(i: &mut &'a [u8], hash_kind: gix_hash::Kind) -> ParseResult<&'a BStr> { + parse::header_field(i, b"object", |value| parse::hex_hash(value, hash_kind)) } /// Parse the `type \n` header and return the object kind. diff --git a/gix-object/src/tag/mod.rs b/gix-object/src/tag/mod.rs index 6e502ff5323..62242210aa2 100644 --- a/gix-object/src/tag/mod.rs +++ b/gix-object/src/tag/mod.rs @@ -11,9 +11,9 @@ pub mod ref_iter; impl<'a> TagRef<'a> { /// Deserialize a tag from `data`. - pub fn from_bytes(mut data: &'a [u8]) -> Result, crate::decode::Error> { + pub fn from_bytes(mut data: &'a [u8], hash_kind: gix_hash::Kind) -> Result, crate::decode::Error> { let input = &mut data; - match decode::git_tag(input) { + match decode::git_tag(input, hash_kind) { Ok(tag) => Ok(tag), Err(err) => Err(err), } diff --git a/gix-object/src/tag/ref_iter.rs b/gix-object/src/tag/ref_iter.rs index 6b7f0018539..199f4cc8225 100644 --- a/gix-object/src/tag/ref_iter.rs +++ b/gix-object/src/tag/ref_iter.rs @@ -14,11 +14,12 @@ pub(crate) enum State { } impl<'a> TagRefIter<'a> { - /// Create a tag iterator from data. - pub fn from_bytes(data: &'a [u8]) -> TagRefIter<'a> { + /// Create a tag iterator from `data`, parsing hashes as `hash_kind`. + pub fn from_bytes(data: &'a [u8], hash_kind: gix_hash::Kind) -> TagRefIter<'a> { TagRefIter { data, state: State::default(), + hash_kind, } } @@ -52,19 +53,27 @@ fn missing_field() -> crate::decode::Error { impl<'a> TagRefIter<'a> { #[inline] - fn next_inner(mut i: &'a [u8], state: &mut State) -> Result<(&'a [u8], Token<'a>), crate::decode::Error> { + fn next_inner( + mut i: &'a [u8], + state: &mut State, + hash_kind: gix_hash::Kind, + ) -> Result<(&'a [u8], Token<'a>), crate::decode::Error> { let input = &mut i; - match Self::next_inner_(input, state) { + match Self::next_inner_(input, state, hash_kind) { Ok(token) => Ok((*input, token)), Err(err) => Err(err), } } - fn next_inner_(input: &mut &'a [u8], state: &mut State) -> Result, crate::decode::Error> { + fn next_inner_( + input: &mut &'a [u8], + state: &mut State, + hash_kind: gix_hash::Kind, + ) -> Result, crate::decode::Error> { use State::*; Ok(match state { Target => { - let target = decode::target(input)?; + let target = decode::target(input, hash_kind)?; *state = TargetKind; Token::Target { id: ObjectId::from_hex(target).expect("parsing validation"), @@ -104,7 +113,7 @@ impl<'a> Iterator for TagRefIter<'a> { if self.data.is_empty() { return None; } - match Self::next_inner(self.data, &mut self.state) { + match Self::next_inner(self.data, &mut self.state, self.hash_kind) { Ok((data, token)) => { self.data = data; Some(Ok(token)) diff --git a/gix-object/tests/object/commit/from_bytes.rs b/gix-object/tests/object/commit/from_bytes.rs index 29251c572fb..42e1a170792 100644 --- a/gix-object/tests/object/commit/from_bytes.rs +++ b/gix-object/tests/object/commit/from_bytes.rs @@ -1,16 +1,18 @@ use gix_actor::SignatureRef; -use gix_object::{bstr::ByteSlice, commit::message::body::TrailerRef, CommitRef, WriteTo}; +use gix_object::{ + bstr::ByteSlice, commit::message::body::TrailerRef, commit::ref_iter::Token, CommitRef, CommitRefIter, WriteTo, +}; use smallvec::SmallVec; use crate::{ commit::{LONG_MESSAGE, MERGE_TAG, SIGNATURE}, - fixture_name, hex_to_id, linus_signature, + fixture_name, fixture_oid, hex_to_id, linus_signature, }; #[test] fn invalid_timestsamp() { assert_eq!( - CommitRef::from_bytes(&fixture_name("commit", "invalid-timestamp.txt")) + CommitRef::from_bytes(&fixture_name("commit", "invalid-timestamp.txt"), gix_hash::Kind::Sha1) .expect("auto-correct invalid timestamp by discarding it (time is still valid UTC)"), CommitRef { tree: b"7989dfb2ec2f41914611a22fb30bbc2b3849df9a".as_bstr(), @@ -25,6 +27,69 @@ fn invalid_timestsamp() { ); } +#[test] +fn sha256_with_all_fields_and_signature() -> crate::Result { + let input = b"tree 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef +parent 1111111111111111111111111111111111111111111111111111111111111111 +parent 2222222222222222222222222222222222222222222222222222222222222222 +author Ada Lovelace 1710000000 +0000 +committer Grace Hopper 1710003600 -0230 +encoding ISO-8859-1 +gpgsig -----BEGIN SSH SIGNATURE----- + U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgZXhhbXBsZS1zaGEyNTY= + -----END SSH SIGNATURE----- +mergetag object 3333333333333333333333333333333333333333333333333333333333333333 + type commit + tag nested-sha256 + tagger Release Bot 1710007200 +0530 +\x20 +nested release notes + -----BEGIN PGP SIGNATURE----- + nested-signature + -----END PGP SIGNATURE----- + +sha256 subject + +sha256 body +"; + let commit = CommitRef::from_bytes(input, gix_hash::Kind::Sha256)?; + assert_eq!( + commit.tree, + b"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef".as_bstr() + ); + assert_eq!(commit.parents.len(), 2); + assert_eq!(commit.encoding, Some(b"ISO-8859-1".as_bstr())); + assert_eq!(commit.author()?.name, b"Ada Lovelace".as_bstr()); + assert_eq!(commit.committer()?.email, b"grace@example.com".as_bstr()); + assert_eq!( + commit.extra_headers().pgp_signature(), + Some( + b"-----BEGIN SSH SIGNATURE----- +U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgZXhhbXBsZS1zaGEyNTY= +-----END SSH SIGNATURE----- +" + .as_bstr() + ) + ); + assert_eq!(commit.extra_headers().mergetags().count(), 1); + assert_eq!(commit.message, b"sha256 subject\n\nsha256 body\n".as_bstr()); + + let tokens = CommitRefIter::from_bytes(input, gix_hash::Kind::Sha256).collect::, _>>()?; + assert!(matches!(tokens[0], Token::Tree { ref id } if id.kind() == gix_hash::Kind::Sha256)); + assert_eq!( + tokens + .iter() + .filter(|token| matches!(token, Token::Parent { .. })) + .count(), + 2 + ); + assert_eq!( + tokens.last(), + Some(&Token::Message(b"sha256 subject\n\nsha256 body\n".as_bstr())) + ); + Ok(()) +} + #[test] fn uppercase_tree_id() -> crate::Result { let input = b"tree 7989DFB2EC2F41914611A22FB30BBC2B3849DF9A @@ -32,7 +97,7 @@ author Name 1312735823 +0518 committer Name 1312735823 +0518 message"; - let commit = CommitRef::from_bytes(input)?; + let commit = CommitRef::from_bytes(input, gix_hash::Kind::Sha1)?; assert_eq!(commit.tree, b"7989DFB2EC2F41914611A22FB30BBC2B3849DF9A".as_bstr()); assert_eq!(commit.tree(), hex_to_id("7989dfb2ec2f41914611a22fb30bbc2b3849df9a")); Ok(()) @@ -48,7 +113,7 @@ fn invalid_email_of_committer() -> crate::Result { let mut buf = vec![]; let backing = fixture_name("commit", "invalid-actor.txt"); - let commit = CommitRef::from_bytes(&backing).expect("ignore strangely formed actor format"); + let commit = CommitRef::from_bytes(&backing, gix_hash::Kind::Sha1).expect("ignore strangely formed actor format"); assert_eq!( commit, CommitRef { @@ -66,7 +131,7 @@ fn invalid_email_of_committer() -> crate::Result { commit.write_to(&mut buf).expect("we can write invalid actors back"); assert_eq!( - CommitRef::from_bytes(&buf).expect("this is the same commit and it can be parsed"), + CommitRef::from_bytes(&buf, gix_hash::Kind::Sha1).expect("this is the same commit and it can be parsed"), commit, "round-tripping works" ); @@ -76,10 +141,11 @@ fn invalid_email_of_committer() -> crate::Result { #[test] fn unsigned() -> crate::Result { + let tree = fixture_oid_hex("1b2dfb4ac5e42080b682fc676e9738c94ce6d54d"); assert_eq!( - CommitRef::from_bytes(&fixture_name("commit", "unsigned.txt"))?, + CommitRef::from_bytes(&commit_fixture("unsigned.txt")?, crate::fixture_hash_kind())?, CommitRef { - tree: b"1b2dfb4ac5e42080b682fc676e9738c94ce6d54d".as_bstr(), + tree: tree.as_bytes().as_bstr(), parents: SmallVec::default(), author: b"Sebastian Thiel 1592437401 +0800".as_bstr(), committer: b"Sebastian Thiel 1592437401 +0800".as_bstr(), @@ -93,11 +159,13 @@ fn unsigned() -> crate::Result { #[test] fn whitespace() -> crate::Result { + let tree = fixture_oid_hex("9bed6275068a0575243ba8409253e61af81ab2ff"); + let parent = fixture_oid_hex("26b4df046d1776c123ac69d918f5aec247b58cc6"); assert_eq!( - CommitRef::from_bytes(&fixture_name("commit", "whitespace.txt"))?, + CommitRef::from_bytes(&commit_fixture("whitespace.txt")?, crate::fixture_hash_kind())?, CommitRef { - tree: b"9bed6275068a0575243ba8409253e61af81ab2ff".as_bstr(), - parents: SmallVec::from(vec![b"26b4df046d1776c123ac69d918f5aec247b58cc6".as_bstr()]), + tree: tree.as_bytes().as_bstr(), + parents: SmallVec::from(vec![parent.as_bytes().as_bstr()]), author: b"Sebastian Thiel 1592448450 +0800".as_bstr(), committer: b"Sebastian Thiel 1592448450 +0800".as_bstr(), encoding: None, @@ -110,11 +178,13 @@ fn whitespace() -> crate::Result { #[test] fn signed_singleline() -> crate::Result { + let tree = fixture_oid_hex("00fc39317701176e326974ce44f5bd545a32ec0b"); + let parent = fixture_oid_hex("09d8d3a12e161a7f6afb522dbe8900a9c09bce06"); assert_eq!( - CommitRef::from_bytes(&fixture_name("commit", "signed-singleline.txt"))?, + CommitRef::from_bytes(&commit_fixture("signed-singleline.txt")?, crate::fixture_hash_kind())?, CommitRef { - tree: b"00fc39317701176e326974ce44f5bd545a32ec0b".as_bstr(), - parents: SmallVec::from(vec![b"09d8d3a12e161a7f6afb522dbe8900a9c09bce06".as_bstr()]), + tree: tree.as_bytes().as_bstr(), + parents: SmallVec::from(vec![parent.as_bytes().as_bstr()]), author: b"Sebastian Thiel 1592391367 +0800".as_bstr(), committer: b"Sebastian Thiel 1592391367 +0800".as_bstr(), encoding: None, @@ -127,13 +197,13 @@ fn signed_singleline() -> crate::Result { #[test] fn mergetag() -> crate::Result { - let fixture = fixture_name("commit", "mergetag.txt"); + let fixture = commit_fixture("mergetag.txt")?; + let tree = fixture_oid_hex("1c61918031bf2c7fab9e17dde3c52a6a9884fcb5"); + let parent_a = fixture_oid_hex("44ebe016df3aad96e3be8f95ec52397728dd7701"); + let parent_b = fixture_oid_hex("8d485da0ddee79d0e6713405694253d401e41b93"); let expected = CommitRef { - tree: b"1c61918031bf2c7fab9e17dde3c52a6a9884fcb5".as_bstr(), - parents: SmallVec::from(vec![ - b"44ebe016df3aad96e3be8f95ec52397728dd7701".as_bstr(), - b"8d485da0ddee79d0e6713405694253d401e41b93".as_bstr(), - ]), + tree: tree.as_bytes().as_bstr(), + parents: SmallVec::from(vec![parent_a.as_bytes().as_bstr(), parent_b.as_bytes().as_bstr()]), author: b"Linus Torvalds 1591996221 -0700".as_bstr(), committer: b"Linus Torvalds 1591996221 -0700".as_bstr(), encoding: None, @@ -143,7 +213,7 @@ fn mergetag() -> crate::Result { std::borrow::Cow::Owned(MERGE_TAG.as_bytes().into()), )], }; - let commit = CommitRef::from_bytes(&fixture)?; + let commit = CommitRef::from_bytes(&fixture, crate::fixture_hash_kind())?; assert_eq!(commit, expected); assert_eq!(commit.extra_headers().find_all("mergetag").count(), 1); assert_eq!(commit.extra_headers().mergetags().count(), 1); @@ -154,11 +224,13 @@ fn mergetag() -> crate::Result { #[test] fn signed() -> crate::Result { + let tree = fixture_oid_hex("00fc39317701176e326974ce44f5bd545a32ec0b"); + let parent = fixture_oid_hex("09d8d3a12e161a7f6afb522dbe8900a9c09bce06"); assert_eq!( - CommitRef::from_bytes(&fixture_name("commit", "signed.txt"))?, + CommitRef::from_bytes(&commit_fixture("signed.txt")?, crate::fixture_hash_kind())?, CommitRef { - tree: b"00fc39317701176e326974ce44f5bd545a32ec0b".as_bstr(), - parents: SmallVec::from(vec![b"09d8d3a12e161a7f6afb522dbe8900a9c09bce06".as_bstr()]), + tree: tree.as_bytes().as_bstr(), + parents: SmallVec::from(vec![parent.as_bytes().as_bstr()]), author: b"Sebastian Thiel 1592391367 +0800".as_bstr(), committer: b"Sebastian Thiel 1592391367 +0800".as_bstr(), encoding: None, @@ -171,11 +243,13 @@ fn signed() -> crate::Result { #[test] fn signed_with_encoding() -> crate::Result { + let tree = fixture_oid_hex("1973afa74d87b2bb73fa884aaaa8752aec43ea88"); + let parent = fixture_oid_hex("79c51cc86923e2b8ca0ee5c4eb75e48027133f9a"); assert_eq!( - CommitRef::from_bytes(&fixture_name("commit", "signed-with-encoding.txt"))?, + CommitRef::from_bytes(&commit_fixture("signed-with-encoding.txt")?, crate::fixture_hash_kind())?, CommitRef { - tree: b"1973afa74d87b2bb73fa884aaaa8752aec43ea88".as_bstr(), - parents: SmallVec::from(vec![b"79c51cc86923e2b8ca0ee5c4eb75e48027133f9a".as_bstr()]), + tree: tree.as_bytes().as_bstr(), + parents: SmallVec::from(vec![parent.as_bytes().as_bstr()]), author: b"Sebastian Thiel 1592448995 +0800".as_bstr(), committer: b"Sebastian Thiel 1592449083 +0800".as_bstr(), encoding: Some(b"ISO-8859-1".as_bstr()), @@ -188,11 +262,13 @@ fn signed_with_encoding() -> crate::Result { #[test] fn with_encoding() -> crate::Result { + let tree = fixture_oid_hex("4a1c03029e7407c0afe9fc0320b3258e188b115e"); + let parent = fixture_oid_hex("7ca98aad461a5c302cb4c9e3acaaa6053cc67a62"); assert_eq!( - CommitRef::from_bytes(&fixture_name("commit", "with-encoding.txt"))?, + CommitRef::from_bytes(&commit_fixture("with-encoding.txt")?, crate::fixture_hash_kind())?, CommitRef { - tree: b"4a1c03029e7407c0afe9fc0320b3258e188b115e".as_bstr(), - parents: SmallVec::from(vec![b"7ca98aad461a5c302cb4c9e3acaaa6053cc67a62".as_bstr()]), + tree: tree.as_bytes().as_bstr(), + parents: SmallVec::from(vec![parent.as_bytes().as_bstr()]), author: b"Sebastian Thiel 1592438199 +0800".as_bstr(), committer: b"Sebastian Thiel 1592438199 +0800".as_bstr(), encoding: Some("ISO-8859-1".into()), @@ -205,10 +281,11 @@ fn with_encoding() -> crate::Result { #[test] fn pre_epoch() -> crate::Result { + let tree = fixture_oid_hex("71cdd4015386b764b178005cad4c88966bc9d61a"); assert_eq!( - CommitRef::from_bytes(&fixture_name("commit", "pre-epoch.txt"))?, + CommitRef::from_bytes(&commit_fixture("pre-epoch.txt")?, crate::fixture_hash_kind())?, CommitRef { - tree: b"71cdd4015386b764b178005cad4c88966bc9d61a".as_bstr(), + tree: tree.as_bytes().as_bstr(), parents: SmallVec::default(), author: "Législateur <> -5263834140 +0009".as_bytes().as_bstr(), committer: "Législateur <> -5263834140 +0009".as_bytes().as_bstr(), @@ -223,7 +300,10 @@ fn pre_epoch() -> crate::Result { #[test] fn double_dash_special_time_offset() -> crate::Result { assert_eq!( - CommitRef::from_bytes(&fixture_name("commit", "double-dash-date-offset.txt"))?, + CommitRef::from_bytes( + &fixture_name("commit", "double-dash-date-offset.txt"), + gix_hash::Kind::Sha1 + )?, CommitRef { tree: b"0a851d7a2a66084ab10516c406a405d147e974ad".as_bstr(), parents: SmallVec::from(vec![b"31350f4f0f459485eff2131517e3450cf251f6fa".as_bstr()]), @@ -244,13 +324,15 @@ fn with_trailer() -> crate::Result { email: "kim@eagain.st".into(), time: "1631514803 +0200", }; - let backing = fixture_name("commit", "message-with-footer.txt"); - let commit = CommitRef::from_bytes(&backing)?; + let backing = commit_fixture("message-with-footer.txt")?; + let tree = fixture_oid_hex("25a19c29c5e36884c1ad85d8faf23f1246b7961b"); + let parent = fixture_oid_hex("699ae71105dddfcbb9711ed3a92df09e91a04e90"); + let commit = CommitRef::from_bytes(&backing, crate::fixture_hash_kind())?; assert_eq!( commit, CommitRef { - tree: b"25a19c29c5e36884c1ad85d8faf23f1246b7961b".as_bstr(), - parents: SmallVec::from(vec![b"699ae71105dddfcbb9711ed3a92df09e91a04e90".as_bstr()]), + tree: tree.as_bytes().as_bstr(), + parents: SmallVec::from(vec![parent.as_bytes().as_bstr()]), author: "Kim Altintop 1631514803 +0200".as_bytes().as_bstr(), committer: "Kim Altintop 1631514803 +0200".as_bytes().as_bstr(), encoding: None, @@ -325,14 +407,14 @@ instead of depending directly on the lower-level crates. #[test] fn merge() -> crate::Result { + let tree = fixture_oid_hex("0cf16ce8e229b59a761198975f0c0263229faf82"); + let parent_a = fixture_oid_hex("6a6054db4ce3c1e4e6a37f8c4d7acb63a4d6ad71"); + let parent_b = fixture_oid_hex("c91d592913d47ac4e4a76daf16fd649b276e211e"); assert_eq!( - CommitRef::from_bytes(&fixture_name("commit", "merge.txt"))?, + CommitRef::from_bytes(&commit_fixture("merge.txt")?, crate::fixture_hash_kind())?, CommitRef { - tree: b"0cf16ce8e229b59a761198975f0c0263229faf82".as_bstr(), - parents: SmallVec::from(vec![ - b"6a6054db4ce3c1e4e6a37f8c4d7acb63a4d6ad71".as_bstr(), - b"c91d592913d47ac4e4a76daf16fd649b276e211e".as_bstr() - ]), + tree: tree.as_bytes().as_bstr(), + parents: SmallVec::from(vec![parent_a.as_bytes().as_bstr(), parent_b.as_bytes().as_bstr()]), author: b"Sebastian Thiel 1592454703 +0800".as_bstr(), committer: b"Sebastian Thiel 1592454738 +0800".as_bstr(), encoding: Some("ISO-8859-1".into()), @@ -345,8 +427,8 @@ fn merge() -> crate::Result { #[test] fn newline_right_after_signature_multiline_header() -> crate::Result { - let fixture = fixture_name("commit", "signed-whitespace.txt"); - let commit = CommitRef::from_bytes(&fixture)?; + let fixture = commit_fixture("signed-whitespace.txt")?; + let commit = CommitRef::from_bytes(&fixture, crate::fixture_hash_kind())?; let pgp_sig = crate::commit::OTHER_SIGNATURE.as_bstr(); assert_eq!(commit.extra_headers[0].1.as_ref(), pgp_sig); assert_eq!(commit.extra_headers().pgp_signature(), Some(pgp_sig)); @@ -362,8 +444,8 @@ fn newline_right_after_signature_multiline_header() -> crate::Result { #[test] fn bogus_multi_gpgsig_header() -> crate::Result { - let fixture = fixture_name("commit", "bogus-gpgsig-lines-in-git.git.txt"); - let commit = CommitRef::from_bytes(&fixture)?; + let fixture = commit_fixture("bogus-gpgsig-lines-in-git.git.txt")?; + let commit = CommitRef::from_bytes(&fixture, crate::fixture_hash_kind())?; let pgp_sig = b"-----BEGIN PGP SIGNATURE-----".as_bstr(); assert_eq!(commit.extra_headers().pgp_signature(), Some(pgp_sig)); assert_eq!( @@ -375,11 +457,17 @@ fn bogus_multi_gpgsig_header() -> crate::Result { let mut buf = Vec::::new(); commit.write_to(&mut buf)?; - let actual = gix_object::compute_hash(gix_hash::Kind::Sha1, gix_object::Kind::Commit, &buf)?; - assert_eq!( - actual, - hex_to_id("5f549aa2f78314ac37bbd436c8f80aea4c752e07"), - "round-tripping works despite the strangeness" - ); + let hash_kind = crate::fixture_hash_kind(); + let expected = gix_object::compute_hash(hash_kind, gix_object::Kind::Commit, &fixture)?; + let actual = gix_object::compute_hash(hash_kind, gix_object::Kind::Commit, &buf)?; + assert_eq!(actual, expected, "round-tripping works despite the strangeness"); Ok(()) } + +fn commit_fixture(path: &str) -> crate::Result> { + crate::object_fixture(&format!("commit/{path}")) +} + +fn fixture_oid_hex(hex: &str) -> String { + fixture_oid(hex).to_hex().to_string() +} diff --git a/gix-object/tests/object/commit/iter.rs b/gix-object/tests/object/commit/iter.rs index 6991ba14472..7ce34bc13a9 100644 --- a/gix-object/tests/object/commit/iter.rs +++ b/gix-object/tests/object/commit/iter.rs @@ -8,7 +8,7 @@ use crate::{ #[test] fn newline_right_after_signature_multiline_header() -> crate::Result { let data = fixture_name("commit", "signed-whitespace.txt"); - let tokens = CommitRefIter::from_bytes(&data).collect::, _>>()?; + let tokens = CommitRefIter::from_bytes(&data, gix_hash::Kind::Sha1).collect::, _>>()?; assert_eq!(tokens.len(), 7, "mainly a parsing exercise"); match tokens.last().expect("there are tokens") { Token::Message(msg) => { @@ -22,7 +22,7 @@ fn newline_right_after_signature_multiline_header() -> crate::Result { #[test] fn signed_with_encoding() -> crate::Result { let input = fixture_name("commit", "signed-with-encoding.txt"); - let iter = CommitRefIter::from_bytes(&input); + let iter = CommitRefIter::from_bytes(&input, gix_hash::Kind::Sha1); assert_eq!( iter.collect::, _>>()?, vec![ @@ -52,7 +52,8 @@ fn signed_with_encoding() -> crate::Result { #[test] fn whitespace() -> crate::Result { assert_eq!( - CommitRefIter::from_bytes(&fixture_name("commit", "whitespace.txt")).collect::, _>>()?, + CommitRefIter::from_bytes(&fixture_name("commit", "whitespace.txt"), gix_hash::Kind::Sha1) + .collect::, _>>()?, vec![ Token::Tree { id: hex_to_id("9bed6275068a0575243ba8409253e61af81ab2ff") @@ -75,7 +76,8 @@ fn whitespace() -> crate::Result { #[test] fn unsigned() -> crate::Result { assert_eq!( - CommitRefIter::from_bytes(&fixture_name("commit", "unsigned.txt")).collect::, _>>()?, + CommitRefIter::from_bytes(&fixture_name("commit", "unsigned.txt"), gix_hash::Kind::Sha1) + .collect::, _>>()?, vec![ Token::Tree { id: hex_to_id("1b2dfb4ac5e42080b682fc676e9738c94ce6d54d") @@ -95,7 +97,8 @@ fn unsigned() -> crate::Result { #[test] fn signed_singleline() -> crate::Result { assert_eq!( - CommitRefIter::from_bytes(&fixture_name("commit", "signed-singleline.txt")).collect::, _>>()?, + CommitRefIter::from_bytes(&fixture_name("commit", "signed-singleline.txt"), gix_hash::Kind::Sha1) + .collect::, _>>()?, vec![ Token::Tree { id: hex_to_id("00fc39317701176e326974ce44f5bd545a32ec0b") @@ -114,7 +117,7 @@ fn signed_singleline() -> crate::Result { ] ); assert_eq!( - CommitRefIter::from_bytes(&fixture_name("commit", "signed-singleline.txt")) + CommitRefIter::from_bytes(&fixture_name("commit", "signed-singleline.txt"), gix_hash::Kind::Sha1) .parent_ids() .collect::>(), vec![hex_to_id("09d8d3a12e161a7f6afb522dbe8900a9c09bce06")] @@ -125,7 +128,7 @@ fn signed_singleline() -> crate::Result { #[test] fn error_handling() -> crate::Result { let data = fixture_name("commit", "unsigned.txt"); - let iter = CommitRefIter::from_bytes(&data[..data.len() / 2]); + let iter = CommitRefIter::from_bytes(&data[..data.len() / 2], gix_hash::Kind::Sha1); let tokens = iter.collect::>(); assert!( tokens.last().expect("at least the errored token").is_err(), @@ -137,7 +140,7 @@ fn error_handling() -> crate::Result { #[test] fn mergetag() -> crate::Result { let input = fixture_name("commit", "mergetag.txt"); - let iter = CommitRefIter::from_bytes(&input); + let iter = CommitRefIter::from_bytes(&input, gix_hash::Kind::Sha1); assert_eq!( iter.collect::, _>>()?, vec![ @@ -179,7 +182,7 @@ mod method { #[test] fn tree_id() -> crate::Result { let input = fixture_name("commit", "unsigned.txt"); - let iter = CommitRefIter::from_bytes(&input); + let iter = CommitRefIter::from_bytes(&input, gix_hash::Kind::Sha1); assert_eq!( iter.clone().tree_id().ok(), Some(hex_to_id("1b2dfb4ac5e42080b682fc676e9738c94ce6d54d")) @@ -195,7 +198,7 @@ mod method { #[test] fn signatures() -> crate::Result { let input = fixture_name("commit", "unsigned.txt"); - let iter = CommitRefIter::from_bytes(&input); + let iter = CommitRefIter::from_bytes(&input, gix_hash::Kind::Sha1); assert_eq!( iter.signatures().collect::>(), vec![signature("1592437401 +0800"), signature("1592437401 +0800")] @@ -227,7 +230,8 @@ mod method { let expected_signature = expected_signature.into(); let fixture_data = fixture_name("commit", fixture); - let (actual_signature, actual_signed_data) = CommitRefIter::signature(&fixture_data)?.expect("sig present"); + let (actual_signature, actual_signed_data) = + CommitRefIter::signature(&fixture_data, gix_hash::Kind::Sha1)?.expect("sig present"); let expected_signed_data: BString = fixture_data .lines_with_terminator() .enumerate() diff --git a/gix-object/tests/object/commit/mod.rs b/gix-object/tests/object/commit/mod.rs index 4d0914ad2f4..382cbf6fc42 100644 --- a/gix-object/tests/object/commit/mod.rs +++ b/gix-object/tests/object/commit/mod.rs @@ -158,7 +158,7 @@ mod method { #[test] fn tree() -> crate::Result { let fixture = fixture_name("commit", "unsigned.txt"); - let commit = CommitRef::from_bytes(&fixture)?; + let commit = CommitRef::from_bytes(&fixture, gix_hash::Kind::Sha1)?; assert_eq!(commit.tree(), hex_to_id("1b2dfb4ac5e42080b682fc676e9738c94ce6d54d")); assert_eq!(commit.tree, "1b2dfb4ac5e42080b682fc676e9738c94ce6d54d"); Ok(()) @@ -167,7 +167,7 @@ mod method { #[test] fn author_and_committer_trims_signature() -> crate::Result { let backing = fixture_name("commit", "email-with-space.txt"); - let commit = CommitRef::from_bytes(&backing)?; + let commit = CommitRef::from_bytes(&backing, gix_hash::Kind::Sha1)?; std::assert_eq!(commit.author()?, signature("1592437401 +0800")); std::assert_eq!(commit.committer()?, signature("1592437401 +0800")); Ok(()) @@ -178,9 +178,9 @@ mod method { fn invalid() { let fixture = fixture_name("commit", "unsigned.txt"); let partial_commit = &fixture[..fixture.len() / 2]; - assert!(CommitRef::from_bytes(partial_commit).is_err()); + assert!(CommitRef::from_bytes(partial_commit, gix_hash::Kind::Sha1).is_err()); assert_eq!( - CommitRefIter::from_bytes(partial_commit) + CommitRefIter::from_bytes(partial_commit, gix_hash::Kind::Sha1) .take_while(Result::is_ok) .count(), 1, @@ -192,8 +192,8 @@ fn invalid() { fn invalid_object_id_length() { let input = b"tree 00000066666666666684666666666666666299297\npare6"; - assert!(CommitRef::from_bytes(input).is_err()); - assert!(CommitRefIter::from_bytes(input) + assert!(CommitRef::from_bytes(input, gix_hash::Kind::Sha1).is_err()); + assert!(CommitRefIter::from_bytes(input, gix_hash::Kind::Sha1) .next() .expect("a decoding error is returned for the first token") .is_err()); @@ -203,8 +203,8 @@ fn invalid_object_id_length() { fn fuzz_artifact_inputs_can_be_parsed_without_panicking() { for path in crate::fuzz_artifact_paths("fuzz_commit") { let input = std::fs::read(path).expect("artifact is readable"); - _ = CommitRef::from_bytes(&input); - _ = CommitRefIter::from_bytes(&input).count(); + _ = CommitRef::from_bytes(&input, gix_hash::Kind::Sha1); + _ = CommitRefIter::from_bytes(&input, gix_hash::Kind::Sha1).count(); } } diff --git a/gix-object/tests/object/encode.rs b/gix-object/tests/object/encode.rs index 1fe1eeecd21..ee9b15c54f5 100644 --- a/gix-object/tests/object/encode.rs +++ b/gix-object/tests/object/encode.rs @@ -6,71 +6,6 @@ enum Error { TryFromError, } -macro_rules! round_trip { - ($owned:ty, $borrowed:ty, $( $files:literal ), +) => { - #[test] - fn round_trip() -> Result<(), Box> { - use std::convert::TryFrom; - use std::io::Write; - use crate::fixture_bytes; - use gix_object::{ObjectRef, Object, WriteTo}; - use bstr::ByteSlice; - - for input_name in &[ - $( $files ),* - ] { - let input = fixture_bytes(input_name); - // Test the parse->borrowed->owned->write chain for an object kind - let mut output = Vec::new(); - let item = <$borrowed>::from_bytes(&input)?; - item.write_to(&mut output)?; - assert_eq!(output.as_bstr(), input.as_bstr(), "borrowed: {input_name}"); - - let item: $owned = item.try_into()?; - output.clear(); - item.write_to(&mut output)?; - assert_eq!(output.as_bstr(), input.as_bstr()); - - // Test the parse->borrowed->owned->write chain for the top-level objects - let item = ObjectRef::from(<$borrowed>::from_bytes(&input)?); - output.clear(); - item.write_to(&mut output)?; - assert_eq!(output.as_bstr(), input.as_bstr(), "object-ref"); - - let item: Object = Object::try_from(item)?; - output.clear(); - item.write_to(&mut output)?; - assert_eq!(output.as_bstr(), input.as_bstr(), "owned"); - - // Test the loose serialisation -> parse chain for an object kind - let item = <$borrowed>::from_bytes(&input)?; - // serialise a borowed item to a tagged loose object - output.clear(); - { - let w = &mut output; - w.write_all(&item.loose_header())?; - item.write_to(w)?; - let parsed = ObjectRef::from_loose(&output, gix_testtools::hash_kind_from_env().unwrap_or_default())?; - let item2 = <$borrowed>::try_from(parsed).or(Err(super::Error::TryFromError))?; - assert_eq!(item2, item, "object-ref loose: {input_name} {:?}\n{:?}", output.as_bstr(), input.as_bstr()); - } - - let item: $owned = item.try_into()?; - // serialise an owned to a tagged loose object - output.clear(); - let w = &mut output; - w.write_all(&item.loose_header())?; - item.write_to(w)?; - let parsed = ObjectRef::from_loose(&output, gix_testtools::hash_kind_from_env().unwrap_or_default())?; - let parsed_borrowed = <$borrowed>::try_from(parsed).or(Err(super::Error::TryFromError))?; - let item2: $owned = parsed_borrowed.try_into().or(Err(super::Error::TryFromError))?; - assert_eq!(item2, item, "object-ref loose owned: {input_name} {:?}\n{:?}", output.as_bstr(), input.as_bstr()); - } - Ok(()) - } - }; -} - /// Needed for roundtripping object types that take a `hash_kind` parameter. /// This is the same as `round_trip`, but for types that have `from_bytes()` with `hash_kind`. macro_rules! round_trip_with_hash_kind { @@ -79,7 +14,7 @@ macro_rules! round_trip_with_hash_kind { fn round_trip() -> Result<(), Box> { use std::convert::TryFrom; use std::io::Write; - use crate::fixture_bytes; + use crate::object_fixture; use gix_object::{ObjectRef, Object, WriteTo}; use bstr::ByteSlice; let hash_kind = crate::fixture_hash_kind(); @@ -87,11 +22,7 @@ macro_rules! round_trip_with_hash_kind { for input_name in &[ $( $files ),* ] { - let input = if let Some(path) = input_name.strip_prefix("tree/") { - crate::tree_fixture(path)? - } else { - fixture_bytes(input_name) - }; + let input = object_fixture(input_name)?; // Test the parse->borrowed->owned->write chain for an object kind let mut output = Vec::new(); let item = <$borrowed>::from_bytes(&input, hash_kind)?; @@ -144,7 +75,7 @@ macro_rules! round_trip_with_hash_kind { } mod tag { - round_trip!( + round_trip_with_hash_kind!( gix_object::Tag, gix_object::TagRef, "tag/empty_missing_nl.txt", @@ -157,7 +88,7 @@ mod tag { } mod commit { - round_trip!( + round_trip_with_hash_kind!( gix_object::Commit, gix_object::CommitRef, "commit/email-with-space.txt", @@ -216,8 +147,74 @@ mod tree { } mod blob { - // It doesn't matter which data we use - it's not interpreted. - round_trip!(gix_object::Blob, gix_object::BlobRef, "tree/everything.tree"); + use std::{convert::TryFrom, io::Write}; + + use bstr::ByteSlice; + use gix_object::{Blob, BlobRef, Object, ObjectRef, WriteTo}; + + use crate::fixture_bytes; + + #[test] + fn round_trip() -> Result<(), Box> { + let input_name = "tree/everything.tree"; + let input = fixture_bytes(input_name); + // It doesn't matter which data we use - it's not interpreted. + + let mut output = Vec::new(); + let item = BlobRef::from_bytes(&input)?; + item.write_to(&mut output)?; + assert_eq!(output.as_bstr(), input.as_bstr(), "borrowed: {input_name}"); + + let item: Blob = item.into(); + output.clear(); + item.write_to(&mut output)?; + assert_eq!(output.as_bstr(), input.as_bstr()); + + let item = ObjectRef::from(BlobRef::from_bytes(&input)?); + output.clear(); + item.write_to(&mut output)?; + assert_eq!(output.as_bstr(), input.as_bstr(), "object-ref"); + + let item: Object = Object::try_from(item)?; + output.clear(); + item.write_to(&mut output)?; + assert_eq!(output.as_bstr(), input.as_bstr(), "owned"); + + let item = BlobRef::from_bytes(&input)?; + output.clear(); + { + let w = &mut output; + w.write_all(&item.loose_header())?; + item.write_to(w)?; + let parsed = ObjectRef::from_loose(&output, gix_testtools::hash_kind_from_env().unwrap_or_default())?; + let item2 = BlobRef::try_from(parsed).or(Err(super::Error::TryFromError))?; + assert_eq!( + item2, + item, + "object-ref loose: {input_name} {:?}\n{:?}", + output.as_bstr(), + input.as_bstr() + ); + } + + let item: Blob = item.into(); + output.clear(); + let w = &mut output; + w.write_all(&item.loose_header())?; + item.write_to(w)?; + let parsed = ObjectRef::from_loose(&output, gix_testtools::hash_kind_from_env().unwrap_or_default())?; + let parsed_borrowed = BlobRef::try_from(parsed).or(Err(super::Error::TryFromError))?; + let item2: Blob = parsed_borrowed.into(); + assert_eq!( + item2, + item, + "object-ref loose owned: {input_name} {:?}\n{:?}", + output.as_bstr(), + input.as_bstr() + ); + + Ok(()) + } } mod loose_header { diff --git a/gix-object/tests/object/main.rs b/gix-object/tests/object/main.rs index fdcc90fd71e..113569e942b 100644 --- a/gix-object/tests/object/main.rs +++ b/gix-object/tests/object/main.rs @@ -99,12 +99,16 @@ fn fixture_name(kind: &str, path: &str) -> Vec { /// Return the object id expected in fixture assertions for the active fixture hash kind. /// -/// Tree fixtures in this test module are authored as SHA-1 data and are rewritten on demand for -/// SHA-256 runs. This helper mirrors that rewrite on the expectation side so tree parsing tests can -/// use one set of source ids for both hash kinds. +/// Object fixtures in this test module are authored as SHA-1 data and are rewritten on demand for +/// SHA-256 runs. This helper mirrors that rewrite on the expectation side so parsing tests can use +/// one set of source ids for both hash kinds. pub fn fixture_oid(hex: &str) -> ObjectId { let oid = hex_to_id(hex); - match fixture_hash_kind() { + translate_fixture_oid(oid, fixture_hash_kind()) +} + +fn translate_fixture_oid(oid: ObjectId, kind: gix_hash::Kind) -> ObjectId { + match kind { gix_hash::Kind::Sha1 => oid, kind => { let mut hasher = gix_hash::hasher(kind); @@ -114,6 +118,19 @@ pub fn fixture_oid(hex: &str) -> ObjectId { } } +/// Load an object fixture and, if needed, rewrite its SHA-1 object ids for the active fixture hash kind. +pub fn object_fixture(path: &str) -> Result> { + if let Some(path) = path.strip_prefix("tree/") { + tree_fixture(path) + } else if let Some(path) = path.strip_prefix("commit/") { + commit_fixture(path) + } else if let Some(path) = path.strip_prefix("tag/") { + tag_fixture(path) + } else { + Ok(fixture_bytes(path)) + } +} + /// Load a tree fixture and, if needed, rewrite its embedded entry ids for the active fixture hash kind. /// /// The on-disk `tree/*.tree` fixtures contain SHA-1-sized ids. For SHA-256 test runs we parse the @@ -126,9 +143,7 @@ pub fn tree_fixture(path: &str) -> Result> { kind => { let mut tree: gix_object::Tree = gix_object::TreeRef::from_bytes(&fixture, gix_hash::Kind::Sha1)?.into(); for entry in &mut tree.entries { - let mut hasher = gix_hash::hasher(kind); - hasher.update(entry.oid.as_bytes()); - entry.oid = hasher.try_finalize()?; + entry.oid = translate_fixture_oid(entry.oid, kind); } let mut out = Vec::with_capacity( fixture.len() + tree.entries.len() * (kind.len_in_bytes() - gix_hash::Kind::Sha1.len_in_bytes()), @@ -139,6 +154,42 @@ pub fn tree_fixture(path: &str) -> Result> { } } +fn commit_fixture(path: &str) -> Result> { + let fixture = fixture_name("commit", path); + match fixture_hash_kind() { + gix_hash::Kind::Sha1 => Ok(fixture), + kind => { + let mut commit = gix_object::CommitRef::from_bytes(&fixture, gix_hash::Kind::Sha1)?.into_owned()?; + commit.tree = translate_fixture_oid(commit.tree, kind); + for parent in &mut commit.parents { + *parent = translate_fixture_oid(*parent, kind); + } + + let mut out = Vec::with_capacity( + fixture.len() + + (1 + commit.parents.len()) * (kind.len_in_bytes() - gix_hash::Kind::Sha1.len_in_bytes()), + ); + commit.write_to(&mut out)?; + Ok(out) + } + } +} + +fn tag_fixture(path: &str) -> Result> { + let fixture = fixture_name("tag", path); + match fixture_hash_kind() { + gix_hash::Kind::Sha1 => Ok(fixture), + kind => { + let mut tag = gix_object::TagRef::from_bytes(&fixture, gix_hash::Kind::Sha1)?.into_owned()?; + tag.target = translate_fixture_oid(tag.target, kind); + + let mut out = Vec::with_capacity(fixture.len() + kind.len_in_bytes() - gix_hash::Kind::Sha1.len_in_bytes()); + tag.write_to(&mut out)?; + Ok(out) + } + } +} + pub fn generated_tree_root_id() -> Result { let root = gix_testtools::scripted_fixture_read_only("make_trees.sh")?; let tree = std::fs::read(root.join("tree.baseline"))?; diff --git a/gix-object/tests/object/tag.rs b/gix-object/tests/object/tag.rs index cb9d5b0db4a..1c5b71a31a0 100644 --- a/gix-object/tests/object/tag.rs +++ b/gix-object/tests/object/tag.rs @@ -45,6 +45,64 @@ body"; const PGP_SIGNATURE_AT_BODY_START_SIGNATURE: &[u8] = b"-----BEGIN PGP SIGNATURE----- body"; +#[test] +fn sha256_with_all_fields_and_signature() -> crate::Result { + let input = b"object abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789 +type commit +tag v2.0.0-sha256 +tagger Release Bot 1710007200 +0530 + +Release v2.0.0 + +- ship sha256 object support +- include annotated tag signatures +-----BEGIN PGP SIGNATURE----- +sha256-tag-signature +-----END PGP SIGNATURE----- +"; + let tag = TagRef::from_bytes(input, gix_hash::Kind::Sha256)?; + assert_eq!( + tag.target, + b"abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789".as_bstr() + ); + assert_eq!(tag.target().kind(), gix_hash::Kind::Sha256); + assert_eq!(tag.target_kind, Kind::Commit); + assert_eq!(tag.name, b"v2.0.0-sha256".as_bstr()); + assert_eq!(tag.tagger()?.expect("tagger").name, b"Release Bot".as_bstr()); + assert_eq!( + tag.message, + b"Release v2.0.0 + +- ship sha256 object support +- include annotated tag signatures" + .as_bstr() + ); + assert_eq!( + tag.pgp_signature, + Some( + b"-----BEGIN PGP SIGNATURE----- +sha256-tag-signature +-----END PGP SIGNATURE----- +" + .as_bstr() + ) + ); + + let tokens = TagRefIter::from_bytes(input, gix_hash::Kind::Sha256).collect::, _>>()?; + assert!(matches!( + tokens.first(), + Some(gix_object::tag::ref_iter::Token::Target { id }) if id.kind() == gix_hash::Kind::Sha256 + )); + assert!(matches!( + tokens.last(), + Some(gix_object::tag::ref_iter::Token::Body { + pgp_signature: Some(_), + .. + }) + )); + Ok(()) +} + mod method { use bstr::ByteSlice; use gix_object::TagRef; @@ -55,7 +113,7 @@ mod method { #[test] fn target() -> crate::Result { let fixture = fixture_name("tag", "signed.txt"); - let tag_ref = TagRef::from_bytes(&fixture)?; + let tag_ref = TagRef::from_bytes(&fixture, gix_hash::Kind::Sha1)?; assert_eq!(tag_ref.target(), hex_to_id("ffa700b4aca13b80cb6b98a078e7c96804f8e0ec")); assert_eq!(tag_ref.target, "ffa700b4aca13b80cb6b98a078e7c96804f8e0ec".as_bytes()); @@ -80,7 +138,7 @@ mod method { #[test] fn tagger_trims_signature() -> crate::Result { let fixture = fixture_name("tag", "tagger-with-whitespace.txt"); - let tag = TagRef::from_bytes(&fixture)?; + let tag = TagRef::from_bytes(&fixture, gix_hash::Kind::Sha1)?; std::assert_eq!(tag.tagger()?, Some(signature("1592381636 +0800"))); Ok(()) } @@ -94,7 +152,7 @@ mod iter { #[test] fn empty() -> crate::Result { let tag = fixture_name("tag", "empty.txt"); - let tag_iter = TagRefIter::from_bytes(&tag); + let tag_iter = TagRefIter::from_bytes(&tag, gix_hash::Kind::Sha1); let target_id = hex_to_id("01dd4e2a978a9f5bd773dae6da7aa4a5ac1cdbbc"); let tagger = Some(signature("1592381636 +0800")); assert_eq!( @@ -118,7 +176,8 @@ mod iter { #[test] fn no_tagger() -> crate::Result { assert_eq!( - TagRefIter::from_bytes(&fixture_name("tag", "no-tagger.txt")).collect::, _>>()?, + TagRefIter::from_bytes(&fixture_name("tag", "no-tagger.txt"), gix_hash::Kind::Sha1) + .collect::, _>>()?, vec![ Token::Target { id: hex_to_id("c39ae07f393806ccf406ef966e9a15afc43cc36a") @@ -154,7 +213,8 @@ KLMHist5yj0sw1E4hDTyQa0= #[test] fn whitespace() -> crate::Result { assert_eq!( - TagRefIter::from_bytes(&fixture_name("tag", "whitespace.txt")).collect::, _>>()?, + TagRefIter::from_bytes(&fixture_name("tag", "whitespace.txt"), gix_hash::Kind::Sha1) + .collect::, _>>()?, vec![ Token::Target { id: hex_to_id("01dd4e2a978a9f5bd773dae6da7aa4a5ac1cdbbc") @@ -174,7 +234,8 @@ KLMHist5yj0sw1E4hDTyQa0= #[test] fn pgp_begin_marker_not_at_line_start_is_message() -> crate::Result { assert_eq!( - TagRefIter::from_bytes(super::PGP_BEGIN_NOT_AT_LINE_START).collect::, _>>()?, + TagRefIter::from_bytes(super::PGP_BEGIN_NOT_AT_LINE_START, gix_hash::Kind::Sha1) + .collect::, _>>()?, vec![ Token::Target { id: hex_to_id("ffa700b4aca13b80cb6b98a078e7c96804f8e0ec") @@ -194,7 +255,7 @@ KLMHist5yj0sw1E4hDTyQa0= #[test] fn error_handling() -> crate::Result { let data = fixture_name("tag", "empty.txt"); - let iter = TagRefIter::from_bytes(&data[..data.len() / 3]); + let iter = TagRefIter::from_bytes(&data[..data.len() / 3], gix_hash::Kind::Sha1); let tokens = iter.collect::>(); assert!( tokens.last().expect("at least the errored token").is_err(), @@ -208,9 +269,11 @@ KLMHist5yj0sw1E4hDTyQa0= fn invalid() { let fixture = fixture_name("tag", "whitespace.txt"); let partial_tag = &fixture[..fixture.len() / 2]; - assert!(TagRef::from_bytes(partial_tag).is_err()); + assert!(TagRef::from_bytes(partial_tag, gix_hash::Kind::Sha1).is_err()); assert_eq!( - TagRefIter::from_bytes(partial_tag).take_while(Result::is_ok).count(), + TagRefIter::from_bytes(partial_tag, gix_hash::Kind::Sha1) + .take_while(Result::is_ok) + .count(), 3, "we can decode some fields before failing" ); @@ -223,7 +286,7 @@ type commit tag uppercase-target message"; - let tag = TagRef::from_bytes(input)?; + let tag = TagRef::from_bytes(input, gix_hash::Kind::Sha1)?; assert_eq!(tag.target, b"FFA700B4ACA13B80CB6B98A078E7C96804F8E0EC".as_bstr()); assert_eq!( tag.target(), @@ -236,8 +299,8 @@ message"; fn invalid_target_id_length() { let input = b"object 00000066666666666684666666666666666299297\ntype commit\ntag bad\n"; - assert!(TagRef::from_bytes(input).is_err()); - assert!(TagRefIter::from_bytes(input) + assert!(TagRef::from_bytes(input, gix_hash::Kind::Sha1).is_err()); + assert!(TagRefIter::from_bytes(input, gix_hash::Kind::Sha1) .next() .expect("a decoding error is returned for the first token") .is_err()); @@ -246,30 +309,54 @@ fn invalid_target_id_length() { mod from_bytes { use gix_object::{bstr::ByteSlice, Kind, TagRef, WriteTo}; - use crate::{fixture_name, tag::tag_fixture}; - - fn assert_roundtrip(input: &[u8]) -> crate::Result { - let tag = TagRef::from_bytes(input)?; - let mut out = Vec::new(); - tag.write_to(&mut out)?; - assert_eq!(out, input); - Ok(()) - } + use crate::{fixture_oid, object_fixture}; #[test] fn signed() -> crate::Result { - assert_eq!(TagRef::from_bytes(&fixture_name("tag", "signed.txt"))?, tag_fixture()); + let fixture = tag_fixture("signed.txt")?; + let target = fixture_oid_hex("ffa700b4aca13b80cb6b98a078e7c96804f8e0ec"); + assert_eq!( + TagRef::from_bytes(&fixture, crate::fixture_hash_kind())?, + TagRef { + target: target.as_bytes().as_bstr(), + name: b"1.0.0".as_bstr(), + target_kind: Kind::Commit, + message: b"for the signature".as_bstr(), + pgp_signature: Some( + b"-----BEGIN PGP SIGNATURE----- +Comment: GPGTools - https://gpgtools.org + +iQIzBAABCgAdFiEEw7xSvXbiwjusbsBqZl+Z+p2ZlmwFAlsapyYACgkQZl+Z+p2Z +lmy6Ug/+KzvzqiNpzz1bMVVAzp8NCbiEO3QGYPyeQc521lBwpaTrRYR+oHJY15r3 +OdL5WDysTpjN8N5FNyfmvzkuPdTkK3JlYmO7VRjdA2xu/B6vIZLaOfAowFrhMvKo +8eoqwGcAP3rC5TuWEgzq2qhbjS4JXFLd4NLjWEFqT2Y2UKm+g8TeGOsa/0pF4Nq5 +xeW4qCYR0WcQLFedbpkKHxag2GfaXKvzNNJdqYhVQssNa6BeSmsfDvlWYNe617wV +NvsR/zJT0wHb5SSH+h6QmwA7LQIQF//83Vc3aF7kv9D54r3ibXW5TjZ3WoeTUZO7 +kefkzJ12EYDCFLPhHvXPog518nO8Ot46dX+okrF0/B4N3RFTvjKr7VAGTzv2D/Dg +DrD531S2F71b+JIRh641eeP7bjWFQi3tWLtrEOtjjsKPJfYRMKpYFnAO4UUJ6Rck +Z5fFXEUCO8d5WT56jzKDjmVoY01lA87O1YsP/J+zQAlc9v1k6jqeQ53LZNgTN+ue +5fJuSPT3T43pSOD1VQSr3aZ2Anc4Qu7K8uX9lkpxF9Sc0tDbeCosFLZMWNVp6m+e +cjHJZXWmV4CcRfmLsXzU8s2cR9A0DBvOxhPD1TlKC2JhBFXigjuL9U4Rbq9tdegB +2n8f2douw6624Tn/6Lm4a7AoxmU+CMiYagDxDL3RuZ8CAfh3bn0= +=aIns +-----END PGP SIGNATURE-----" + .as_bstr(), + ), + tagger: Some(b"Sebastian Thiel 1528473343 +0230".as_bstr()), + } + ); Ok(()) } #[test] fn empty() -> crate::Result { - let fixture = fixture_name("tag", "empty.txt"); - let tag_ref = TagRef::from_bytes(&fixture)?; + let fixture = tag_fixture("empty.txt")?; + let target = fixture_oid_hex("01dd4e2a978a9f5bd773dae6da7aa4a5ac1cdbbc"); + let tag_ref = TagRef::from_bytes(&fixture, crate::fixture_hash_kind())?; assert_eq!( tag_ref, TagRef { - target: b"01dd4e2a978a9f5bd773dae6da7aa4a5ac1cdbbc".as_bstr(), + target: target.as_bytes().as_bstr(), name: b"empty".as_bstr(), target_kind: Kind::Commit, message: b"\n".as_bstr(), @@ -277,18 +364,19 @@ mod from_bytes { pgp_signature: None } ); - assert_eq!(tag_ref.size(), 140); + assert_eq!(tag_ref.size(), fixture.len() as u64); Ok(()) } #[test] fn empty_missing_nl() -> crate::Result { - let fixture = fixture_name("tag", "empty_missing_nl.txt"); - let tag_ref = TagRef::from_bytes(&fixture)?; + let fixture = tag_fixture("empty_missing_nl.txt")?; + let target = fixture_oid_hex("01dd4e2a978a9f5bd773dae6da7aa4a5ac1cdbbc"); + let tag_ref = TagRef::from_bytes(&fixture, crate::fixture_hash_kind())?; assert_eq!( tag_ref, TagRef { - target: b"01dd4e2a978a9f5bd773dae6da7aa4a5ac1cdbbc".as_bstr(), + target: target.as_bytes().as_bstr(), name: b"empty".as_bstr(), target_kind: Kind::Commit, message: b"".as_bstr(), @@ -296,16 +384,17 @@ mod from_bytes { pgp_signature: None } ); - assert_eq!(tag_ref.size(), 139); + assert_eq!(tag_ref.size(), fixture.len() as u64); Ok(()) } #[test] fn with_newlines() -> crate::Result { + let target = fixture_oid_hex("ebdf205038b66108c0331aa590388431427493b7"); assert_eq!( - TagRef::from_bytes(&fixture_name("tag", "with-newlines.txt"))?, + TagRef::from_bytes(&tag_fixture("with-newlines.txt")?, crate::fixture_hash_kind())?, TagRef { - target: b"ebdf205038b66108c0331aa590388431427493b7".as_bstr(), + target: target.as_bytes().as_bstr(), name: b"baz".as_bstr(), target_kind: Kind::Commit, message: b"hello\n\nworld".as_bstr(), @@ -318,10 +407,11 @@ mod from_bytes { #[test] fn no_tagger() -> crate::Result { + let target = fixture_oid_hex("c39ae07f393806ccf406ef966e9a15afc43cc36a"); assert_eq!( - TagRef::from_bytes(&fixture_name("tag", "no-tagger.txt"))?, + TagRef::from_bytes(&tag_fixture("no-tagger.txt")?, crate::fixture_hash_kind())?, TagRef { - target: b"c39ae07f393806ccf406ef966e9a15afc43cc36a".as_bstr(), + target: target.as_bytes().as_bstr(), name: b"v2.6.11-tree".as_bstr(), target_kind: Kind::Tree, message: b"This is the 2.6.11 tree object. @@ -350,7 +440,7 @@ KLMHist5yj0sw1E4hDTyQa0= #[test] fn pgp_begin_marker_not_at_line_start_is_message() -> crate::Result { - let tag = TagRef::from_bytes(super::PGP_BEGIN_NOT_AT_LINE_START)?; + let tag = TagRef::from_bytes(super::PGP_BEGIN_NOT_AT_LINE_START, gix_hash::Kind::Sha1)?; assert_eq!(tag.message, super::PGP_BEGIN_NOT_AT_LINE_START_MESSAGE.as_bstr()); assert_eq!(tag.pgp_signature, None, "it doesn't parse this as PGP signature"); assert_roundtrip(super::PGP_BEGIN_NOT_AT_LINE_START)?; @@ -359,7 +449,7 @@ KLMHist5yj0sw1E4hDTyQa0= #[test] fn trailing_text_after_pgp_end_marker_is_signature() -> crate::Result { - let tag = TagRef::from_bytes(super::PGP_SIGNATURE_WITH_TRAILING_TEXT)?; + let tag = TagRef::from_bytes(super::PGP_SIGNATURE_WITH_TRAILING_TEXT, gix_hash::Kind::Sha1)?; assert_eq!(tag.message, b"message text".as_bstr()); assert_eq!( tag.pgp_signature, @@ -371,7 +461,7 @@ KLMHist5yj0sw1E4hDTyQa0= #[test] fn pgp_begin_marker_without_end_marker_starts_signature() -> crate::Result { - let tag = TagRef::from_bytes(super::PGP_SIGNATURE_WITHOUT_END_MARKER)?; + let tag = TagRef::from_bytes(super::PGP_SIGNATURE_WITHOUT_END_MARKER, gix_hash::Kind::Sha1)?; assert_eq!(tag.message, b"message text".as_bstr()); assert_eq!( tag.pgp_signature, @@ -383,7 +473,7 @@ KLMHist5yj0sw1E4hDTyQa0= #[test] fn pgp_begin_marker_at_body_start_is_signature() -> crate::Result { - let tag = TagRef::from_bytes(super::PGP_SIGNATURE_AT_BODY_START)?; + let tag = TagRef::from_bytes(super::PGP_SIGNATURE_AT_BODY_START, gix_hash::Kind::Sha1)?; assert_eq!(tag.message, b"".as_bstr()); assert_eq!( tag.pgp_signature, @@ -395,10 +485,11 @@ KLMHist5yj0sw1E4hDTyQa0= #[test] fn whitespace() -> crate::Result { + let target = fixture_oid_hex("01dd4e2a978a9f5bd773dae6da7aa4a5ac1cdbbc"); assert_eq!( - TagRef::from_bytes(&fixture_name("tag", "whitespace.txt"))?, + TagRef::from_bytes(&tag_fixture("whitespace.txt")?, crate::fixture_hash_kind())?, TagRef { - target: b"01dd4e2a978a9f5bd773dae6da7aa4a5ac1cdbbc".as_bstr(), + target: target.as_bytes().as_bstr(), name: b"whitespace".as_bstr(), target_kind: Kind::Commit, message: b" \ttab\nnewline\n\nlast-with-trailer\n".as_bstr(), @@ -411,10 +502,14 @@ KLMHist5yj0sw1E4hDTyQa0= #[test] fn tagger_without_timestamp() -> crate::Result { + let target = fixture_oid_hex("4fcd840c4935e4c7a5ea3552710a0f26b9178c24"); assert_eq!( - TagRef::from_bytes(&fixture_name("tag", "tagger-without-timestamp.txt"))?, + TagRef::from_bytes( + &tag_fixture("tagger-without-timestamp.txt")?, + crate::fixture_hash_kind() + )?, TagRef { - target: b"4fcd840c4935e4c7a5ea3552710a0f26b9178c24".as_bstr(), + target: target.as_bytes().as_bstr(), name: b"ChangeLog".as_bstr(), target_kind: Kind::Commit, message: b"".as_bstr(), @@ -424,34 +519,20 @@ KLMHist5yj0sw1E4hDTyQa0= ); Ok(()) } -} -fn tag_fixture() -> TagRef<'static> { - TagRef { - target: b"ffa700b4aca13b80cb6b98a078e7c96804f8e0ec".as_bstr(), - name: b"1.0.0".as_bstr(), - target_kind: Kind::Commit, - message: b"for the signature".as_bstr(), - pgp_signature: Some( - b"-----BEGIN PGP SIGNATURE----- -Comment: GPGTools - https://gpgtools.org + fn assert_roundtrip(input: &[u8]) -> crate::Result { + let tag = TagRef::from_bytes(input, gix_hash::Kind::Sha1)?; + let mut out = Vec::new(); + tag.write_to(&mut out)?; + assert_eq!(out, input); + Ok(()) + } -iQIzBAABCgAdFiEEw7xSvXbiwjusbsBqZl+Z+p2ZlmwFAlsapyYACgkQZl+Z+p2Z -lmy6Ug/+KzvzqiNpzz1bMVVAzp8NCbiEO3QGYPyeQc521lBwpaTrRYR+oHJY15r3 -OdL5WDysTpjN8N5FNyfmvzkuPdTkK3JlYmO7VRjdA2xu/B6vIZLaOfAowFrhMvKo -8eoqwGcAP3rC5TuWEgzq2qhbjS4JXFLd4NLjWEFqT2Y2UKm+g8TeGOsa/0pF4Nq5 -xeW4qCYR0WcQLFedbpkKHxag2GfaXKvzNNJdqYhVQssNa6BeSmsfDvlWYNe617wV -NvsR/zJT0wHb5SSH+h6QmwA7LQIQF//83Vc3aF7kv9D54r3ibXW5TjZ3WoeTUZO7 -kefkzJ12EYDCFLPhHvXPog518nO8Ot46dX+okrF0/B4N3RFTvjKr7VAGTzv2D/Dg -DrD531S2F71b+JIRh641eeP7bjWFQi3tWLtrEOtjjsKPJfYRMKpYFnAO4UUJ6Rck -Z5fFXEUCO8d5WT56jzKDjmVoY01lA87O1YsP/J+zQAlc9v1k6jqeQ53LZNgTN+ue -5fJuSPT3T43pSOD1VQSr3aZ2Anc4Qu7K8uX9lkpxF9Sc0tDbeCosFLZMWNVp6m+e -cjHJZXWmV4CcRfmLsXzU8s2cR9A0DBvOxhPD1TlKC2JhBFXigjuL9U4Rbq9tdegB -2n8f2douw6624Tn/6Lm4a7AoxmU+CMiYagDxDL3RuZ8CAfh3bn0= -=aIns ------END PGP SIGNATURE-----" - .as_bstr(), - ), - tagger: Some(b"Sebastian Thiel 1528473343 +0230".as_bstr()), + fn tag_fixture(path: &str) -> crate::Result> { + object_fixture(&format!("tag/{path}")) + } + + fn fixture_oid_hex(hex: &str) -> String { + fixture_oid(hex).to_hex().to_string() } } diff --git a/gix-ref/src/store/file/raw_ext.rs b/gix-ref/src/store/file/raw_ext.rs index 760cceb9ecb..320690c146e 100644 --- a/gix-ref/src/store/file/raw_ext.rs +++ b/gix-ref/src/store/file/raw_ext.rs @@ -160,24 +160,21 @@ impl ReferenceExt for Reference { let mut oid = self.follow_to_object_packed(store, packed)?; let mut buf = Vec::new(); let peeled_id = loop { - let gix_object::Data { - kind, - data, - hash_kind: _, - } = objects - .try_find(&oid, &mut buf)? - .ok_or_else(|| peel::to_id::Error::NotFound { - oid, - name: self.name.0.clone(), - })?; + let gix_object::Data { kind, data, hash_kind } = + objects + .try_find(&oid, &mut buf)? + .ok_or_else(|| peel::to_id::Error::NotFound { + oid, + name: self.name.0.clone(), + })?; match kind { gix_object::Kind::Tag => { - oid = gix_object::TagRefIter::from_bytes(data).target_id().map_err(|_err| { - peel::to_id::Error::NotFound { + oid = gix_object::TagRefIter::from_bytes(data, hash_kind) + .target_id() + .map_err(|_err| peel::to_id::Error::NotFound { oid, name: self.name.0.clone(), - } - })?; + })?; } _ => break oid, } diff --git a/gix-ref/src/store/packed/transaction.rs b/gix-ref/src/store/packed/transaction.rs index e9990ce90f1..4c220780538 100644 --- a/gix-ref/src/store/packed/transaction.rs +++ b/gix-ref/src/store/packed/transaction.rs @@ -107,14 +107,20 @@ impl packed::Transaction { { let mut next_id = new; edit.peeled = loop { - let kind = objects.try_find(&next_id, &mut buf)?.map(|d| d.kind); - match kind { - Some(gix_object::Kind::Tag) => { - next_id = gix_object::TagRefIter::from_bytes(&buf).target_id().map_err(|_| { - prepare::Error::Resolve( - format!("Couldn't get target object id from tag {next_id}").into(), - ) - })?; + let data = objects.try_find(&next_id, &mut buf)?; + match data { + Some(gix_object::Data { + kind: gix_object::Kind::Tag, + data, + hash_kind, + }) => { + next_id = gix_object::TagRefIter::from_bytes(data, hash_kind) + .target_id() + .map_err(|_| { + prepare::Error::Resolve( + format!("Couldn't get target object id from tag {next_id}").into(), + ) + })?; } Some(_) => { break if next_id == new { None } else { Some(next_id) }; From 91bfab0694673b3234b52f30fa9c8ec4322ddb9d Mon Sep 17 00:00:00 2001 From: "GPT 5.5" Date: Mon, 27 Apr 2026 13:00:43 +0800 Subject: [PATCH 6/8] Adapt to changes in `gix-object` Co-authored-by: Sebastian Thiel --- gitoxide-core/src/hours/mod.rs | 9 +++++---- gitoxide-core/src/query/engine/update.rs | 2 +- gix-object/tests/object/tag.rs | 9 ++++----- gix-pack/src/data/output/count/objects/mod.rs | 17 ++++++++++------- gix-revwalk/src/graph/commit.rs | 15 +++++++++++---- gix-revwalk/src/graph/mod.rs | 3 +++ gix-traverse/src/commit/simple.rs | 11 ++++++++++- gix/src/object/commit.rs | 16 ++++++++-------- gix/src/object/tag.rs | 6 +++--- 9 files changed, 55 insertions(+), 33 deletions(-) diff --git a/gitoxide-core/src/hours/mod.rs b/gitoxide-core/src/hours/mod.rs index 0aa7ad60a11..d07e5c6e367 100644 --- a/gitoxide-core/src/hours/mod.rs +++ b/gitoxide-core/src/hours/mod.rs @@ -83,8 +83,9 @@ fn parse_trailer_identity(trailer: gix::objs::commit::message::body::TrailerRef< /// Return `(commit_author, [commit_author, co_authors...])`. Use the `commit_author` for easy access to the commit author itself. fn commit_author_identities( commit_data: &[u8], + hash_kind: gix::hash::Kind, ) -> Result<(gix::actor::SignatureRef<'_>, SmallVec<[ParsedIdentity<'_>; 2]>), gix::objs::decode::Error> { - let commit = gix::objs::CommitRef::from_bytes(commit_data)?; + let commit = gix::objs::CommitRef::from_bytes(commit_data, hash_kind)?; let author = commit.author()?.trim(); let mut authors = smallvec![ParsedIdentity::Borrowed(gix::actor::IdentityRef::from(author))]; authors.extend(commit.co_authored_by_trailers().filter_map(parse_trailer_identity)); @@ -130,7 +131,7 @@ where let extract_signatures = scope.spawn(move || -> anyhow::Result> { let mut out = Vec::new(); for (commit_idx, commit_data) in rx { - if let Ok((commit_author, authors)) = commit_author_identities(&commit_data) { + if let Ok((commit_author, authors)) = commit_author_identities(&commit_data, commit_id.kind()) { let mut string_ref = |s: &[u8]| -> &'static BStr { match string_heap.get(s) { Some(n) => n.as_bstr(), @@ -445,7 +446,7 @@ body\n\ \n\ Co-authored-by: Second Author \n\ Co-authored-by: Third Author \n"; - let (author, authors) = commit_author_identities(commit).expect("valid commit"); + let (author, authors) = commit_author_identities(commit, gix::hash::Kind::Sha1).expect("valid commit"); assert_eq!(author.time, "1710000000 +0000"); assert_eq!( authors @@ -478,7 +479,7 @@ committer Main Author 1710000000 +0000\n\ subject\n\ \n\ Co-authored-by: not a signature\n"; - let (_, authors) = commit_author_identities(commit).expect("valid commit"); + let (_, authors) = commit_author_identities(commit, gix::hash::Kind::Sha1).expect("valid commit"); assert_eq!(authors.len(), 1); assert_eq!(authors[0].name(), "Main Author".as_bytes().as_bstr()); assert_eq!(authors[0].email(), "main@example.com".as_bytes().as_bstr()); diff --git a/gitoxide-core/src/query/engine/update.rs b/gitoxide-core/src/query/engine/update.rs index 818dfff3ec7..f9d76d8633c 100644 --- a/gitoxide-core/src/query/engine/update.rs +++ b/gitoxide-core/src/query/engine/update.rs @@ -395,7 +395,7 @@ pub fn update( self.progress.inc(); if self.known_commits.binary_search(&id.to_owned()).is_err() { let res = { - let mut parents = gix::objs::CommitRefIter::from_bytes(obj.data).parent_ids(); + let mut parents = gix::objs::CommitRefIter::from_bytes(obj.data, obj.hash_kind).parent_ids(); let res = parents.next().map(|first_parent| (Some(first_parent), id.to_owned())); match parents.next() { Some(_) => None, diff --git a/gix-object/tests/object/tag.rs b/gix-object/tests/object/tag.rs index 1c5b71a31a0..60df56d4c02 100644 --- a/gix-object/tests/object/tag.rs +++ b/gix-object/tests/object/tag.rs @@ -309,7 +309,7 @@ fn invalid_target_id_length() { mod from_bytes { use gix_object::{bstr::ByteSlice, Kind, TagRef, WriteTo}; - use crate::{fixture_oid, object_fixture}; + use crate::{fixture_name, fixture_oid, object_fixture}; #[test] fn signed() -> crate::Result { @@ -502,14 +502,13 @@ KLMHist5yj0sw1E4hDTyQa0= #[test] fn tagger_without_timestamp() -> crate::Result { - let target = fixture_oid_hex("4fcd840c4935e4c7a5ea3552710a0f26b9178c24"); assert_eq!( TagRef::from_bytes( - &tag_fixture("tagger-without-timestamp.txt")?, - crate::fixture_hash_kind() + &fixture_name("tag", "tagger-without-timestamp.txt"), + gix_hash::Kind::Sha1 )?, TagRef { - target: target.as_bytes().as_bstr(), + target: b"4fcd840c4935e4c7a5ea3552710a0f26b9178c24".as_bstr(), name: b"ChangeLog".as_bstr(), target_kind: Kind::Commit, message: b"".as_bstr(), diff --git a/gix-pack/src/data/output/count/objects/mod.rs b/gix-pack/src/data/output/count/objects/mod.rs index 05f06f58663..1f0997f25cd 100644 --- a/gix-pack/src/data/output/count/objects/mod.rs +++ b/gix-pack/src/data/output/count/objects/mod.rs @@ -175,7 +175,7 @@ mod expand { match obj.kind { Tree | Blob => break, Tag => { - id = TagRefIter::from_bytes(obj.data) + id = TagRefIter::from_bytes(obj.data, obj.hash_kind) .target_id() .expect("every tag has a target"); let tmp = db.find(&id, buf1)?; @@ -188,7 +188,7 @@ mod expand { } Commit => { let current_tree_iter = { - let mut commit_iter = CommitRefIter::from_bytes(obj.data); + let mut commit_iter = CommitRefIter::from_bytes(obj.data, obj.hash_kind); let tree_id = commit_iter.tree_id().expect("every commit has a tree"); parent_commit_ids.clear(); for token in commit_iter { @@ -227,9 +227,12 @@ mod expand { push_obj_count_unique( &mut out, seen_objs, commit_id, location, objects, stats, true, ); - CommitRefIter::from_bytes(parent_commit_obj.data) - .tree_id() - .expect("every commit has a tree") + CommitRefIter::from_bytes( + parent_commit_obj.data, + parent_commit_obj.hash_kind, + ) + .tree_id() + .expect("every commit has a tree") }; let parent_tree = { let (parent_tree_obj, location) = db.find(&parent_tree_id, buf2)?; @@ -296,7 +299,7 @@ mod expand { break; } Commit => { - id = CommitRefIter::from_bytes(obj.0.data) + id = CommitRefIter::from_bytes(obj.0.data, obj.0.hash_kind) .tree_id() .expect("every commit has a tree"); stats.expanded_objects += 1; @@ -305,7 +308,7 @@ mod expand { } Blob => break, Tag => { - id = TagRefIter::from_bytes(obj.0.data) + id = TagRefIter::from_bytes(obj.0.data, obj.0.hash_kind) .target_id() .expect("every tag has a target"); stats.expanded_objects += 1; diff --git a/gix-revwalk/src/graph/commit.rs b/gix-revwalk/src/graph/commit.rs index 390dfa84d63..4d8c5b0494e 100644 --- a/gix-revwalk/src/graph/commit.rs +++ b/gix-revwalk/src/graph/commit.rs @@ -8,7 +8,7 @@ impl<'graph, 'cache> LazyCommit<'graph, 'cache> { /// Return an iterator over the parents of this commit. pub fn iter_parents(&self) -> Parents<'graph, 'cache> { let backing = match &self.backing { - Either::Left(buf) => Either::Left(gix_object::CommitRefIter::from_bytes(buf)), + Either::Left(buf) => Either::Left(gix_object::CommitRefIter::from_bytes(buf, self.hash_kind)), Either::Right((cache, pos)) => Either::Right((*cache, cache.commit_at(*pos).iter_parents())), }; Parents { backing } @@ -20,7 +20,9 @@ impl<'graph, 'cache> LazyCommit<'graph, 'cache> { /// Note that this can only fail if the commit is backed by the object database *and* parsing fails. pub fn committer_timestamp(&self) -> Result { Ok(match &self.backing { - Either::Left(buf) => gix_object::CommitRefIter::from_bytes(buf).committer()?.seconds(), + Either::Left(buf) => gix_object::CommitRefIter::from_bytes(buf, self.hash_kind) + .committer()? + .seconds(), Either::Right((cache, pos)) => cache.commit_at(*pos).committer_timestamp() as SecondsSinceUnixEpoch, // a cast as we cannot represent the error and trying seems overkill }) } @@ -38,7 +40,12 @@ impl<'graph, 'cache> LazyCommit<'graph, 'cache> { &self, ) -> Result<(Option, SecondsSinceUnixEpoch), gix_object::decode::Error> { Ok(match &self.backing { - Either::Left(buf) => (None, gix_object::CommitRefIter::from_bytes(buf).committer()?.seconds()), + Either::Left(buf) => ( + None, + gix_object::CommitRefIter::from_bytes(buf, self.hash_kind) + .committer()? + .seconds(), + ), Either::Right((cache, pos)) => { let commit = cache.commit_at(*pos); ( @@ -57,7 +64,7 @@ impl<'graph, 'cache> LazyCommit<'graph, 'cache> { Ok(match &self.backing { Either::Left(buf) => { use gix_object::commit::ref_iter::Token; - let iter = gix_object::CommitRefIter::from_bytes(buf); + let iter = gix_object::CommitRefIter::from_bytes(buf, self.hash_kind); let mut parents = SmallVec::default(); let mut timestamp = None; for token in iter { diff --git a/gix-revwalk/src/graph/mod.rs b/gix-revwalk/src/graph/mod.rs index a896034c467..691d2ad7cfb 100644 --- a/gix-revwalk/src/graph/mod.rs +++ b/gix-revwalk/src/graph/mod.rs @@ -369,6 +369,7 @@ fn try_lookup<'graph, 'cache>( if let Some(cache) = cache { if let Some(pos) = cache.lookup(id) { return Ok(Some(LazyCommit { + hash_kind: id.kind(), backing: Either::Right((cache, pos)), })); } @@ -380,6 +381,7 @@ fn try_lookup<'graph, 'cache>( .map_err(gix_object::find::existing_iter::Error::Find)? { Some(data) => data.kind.is_commit().then_some(LazyCommit { + hash_kind: data.hash_kind, backing: Either::Left(buf), }), None => None, @@ -439,6 +441,7 @@ where /// /// The owned version of this type is called [`Commit`] and can be obtained by calling [`LazyCommit::to_owned()`]. pub struct LazyCommit<'graph, 'cache> { + hash_kind: gix_hash::Kind, backing: Either<&'graph [u8], (&'cache gix_commitgraph::Graph, gix_commitgraph::Position)>, } diff --git a/gix-traverse/src/commit/simple.rs b/gix-traverse/src/commit/simple.rs index 404d947e2e6..d237ce225b6 100644 --- a/gix-traverse/src/commit/simple.rs +++ b/gix-traverse/src/commit/simple.rs @@ -138,6 +138,10 @@ pub(super) struct State { queue: CommitDateQueue, /// Backing storage for the currently yielded commit. buf: Vec, + /// The object hash kind of the currently yielded commit data in `buf`. + /// It's used to know the kind of hash to expect when a new iterator is returned from `buf` + /// via `Simple::commit_iter()`. + object_hash: gix_hash::Kind, /// Set of commits that were already enqueued for the visible traversal, for cycle-checking. seen: gix_hashtable::HashSet, /// Hidden frontier commits that must not be yielded or crossed during traversal. @@ -247,6 +251,7 @@ mod init { next: Default::default(), queue: gix_revwalk::PriorityQueue::new(), buf: vec![], + object_hash: gix_hash::Kind::Sha1, seen: Default::default(), hidden: Default::default(), hidden_tips: Vec::new(), @@ -262,6 +267,7 @@ mod init { next, queue, buf, + object_hash, seen, hidden, hidden_tips, @@ -271,6 +277,7 @@ mod init { next.clear(); queue.clear(); buf.clear(); + *object_hash = gix_hash::Kind::Sha1; seen.clear(); hidden.clear(); hidden_tips.clear(); @@ -464,7 +471,7 @@ mod init { impl Simple { /// Return an iterator for accessing data of the current commit, parsed lazily. pub fn commit_iter(&self) -> CommitRefIter<'_> { - CommitRefIter::from_bytes(self.commit_data()) + CommitRefIter::from_bytes(self.commit_data(), self.state.object_hash) } /// Return the current commits' raw data, which can be parsed using [`gix_object::CommitRef::from_bytes()`]. @@ -519,6 +526,7 @@ mod init { let (commit_time, oid) = match next.pop()? { (Ok(t) | Err(Reverse(t)), o) => (t, o), }; + state.object_hash = oid.kind(); if state.hidden.contains_key(&oid) { continue; } @@ -592,6 +600,7 @@ mod init { loop { let oid = next.pop_front()?; + state.object_hash = oid.kind(); if state.hidden.contains_key(&oid) { continue; } diff --git a/gix/src/object/commit.rs b/gix/src/object/commit.rs index c0e6272fec2..8588b828c6d 100644 --- a/gix/src/object/commit.rs +++ b/gix/src/object/commit.rs @@ -86,7 +86,7 @@ impl<'repo> Commit<'repo> { /// # Ok(()) } /// ``` pub fn message_raw(&self) -> Result<&'_ BStr, gix_object::decode::Error> { - gix_object::CommitRefIter::from_bytes(&self.data).message() + gix_object::CommitRefIter::from_bytes(&self.data, self.id.kind()).message() } /// Obtain the message by using intricate knowledge about the encoding, which is fastest and /// can't fail at the expense of error handling. @@ -114,24 +114,24 @@ impl<'repo> Commit<'repo> { /// used for successive calls to string-ish information to avoid decoding the object /// more than once. pub fn decode(&self) -> Result, gix_object::decode::Error> { - gix_object::CommitRef::from_bytes(&self.data) + gix_object::CommitRef::from_bytes(&self.data, self.id.kind()) } /// Return an iterator over tokens, representing this commit piece by piece. pub fn iter(&self) -> gix_object::CommitRefIter<'_> { - gix_object::CommitRefIter::from_bytes(&self.data) + gix_object::CommitRefIter::from_bytes(&self.data, self.id.kind()) } /// Return the commits author, with surrounding whitespace trimmed. pub fn author(&self) -> Result, gix_object::decode::Error> { - gix_object::CommitRefIter::from_bytes(&self.data) + gix_object::CommitRefIter::from_bytes(&self.data, self.id.kind()) .author() .map(|s| s.trim()) } /// Return the commits committer. with surrounding whitespace trimmed. pub fn committer(&self) -> Result, gix_object::decode::Error> { - gix_object::CommitRefIter::from_bytes(&self.data) + gix_object::CommitRefIter::from_bytes(&self.data, self.id.kind()) .committer() .map(|s| s.trim()) } @@ -153,7 +153,7 @@ impl<'repo> Commit<'repo> { pub fn parent_ids(&self) -> impl Iterator> + '_ { use crate::ext::ObjectIdExt; let repo = self.repo; - gix_object::CommitRefIter::from_bytes(&self.data) + gix_object::CommitRefIter::from_bytes(&self.data, self.id.kind()) .parent_ids() .map(move |id| id.attach(repo)) } @@ -181,7 +181,7 @@ impl<'repo> Commit<'repo> { /// Parse the commit and return the tree id it points to. pub fn tree_id(&self) -> Result, gix_object::decode::Error> { - gix_object::CommitRefIter::from_bytes(&self.data) + gix_object::CommitRefIter::from_bytes(&self.data, self.id.kind()) .tree_id() .map(|id| crate::Id::from_id(id, self.repo)) } @@ -217,7 +217,7 @@ impl<'repo> Commit<'repo> { &self, ) -> Result, gix_object::commit::SignedData<'_>)>, gix_object::decode::Error> { - gix_object::CommitRefIter::signature(&self.data) + gix_object::CommitRefIter::signature(&self.data, self.id.kind()) } } diff --git a/gix/src/object/tag.rs b/gix/src/object/tag.rs index 1a7a3de86c0..6ae6363a3a6 100644 --- a/gix/src/object/tag.rs +++ b/gix/src/object/tag.rs @@ -9,19 +9,19 @@ impl<'repo> Tag<'repo> { /// used for successive calls to string-ish information to avoid decoding the object /// more than once. pub fn decode(&self) -> Result, gix_object::decode::Error> { - gix_object::TagRef::from_bytes(&self.data) + gix_object::TagRef::from_bytes(&self.data, self.id.kind()) } /// Decode this tag partially and return the id of its target. pub fn target_id(&self) -> Result, gix_object::decode::Error> { - gix_object::TagRefIter::from_bytes(&self.data) + gix_object::TagRefIter::from_bytes(&self.data, self.id.kind()) .target_id() .map(|id| id.attach(self.repo)) } /// Decode this tag partially and return the tagger, if the field exists. pub fn tagger(&self) -> Result>, gix_object::decode::Error> { - gix_object::TagRefIter::from_bytes(&self.data).tagger() + gix_object::TagRefIter::from_bytes(&self.data, self.id.kind()).tagger() } } From 731248f18ff5bc655143e9808fe717ac6d24edf6 Mon Sep 17 00:00:00 2001 From: "GPT 5.5" Date: Mon, 27 Apr 2026 16:01:32 +0800 Subject: [PATCH 7/8] feat!: add `sha-256` support to `gix-ref`. This predominantly restricts parsing so it won't allow any hash but the one that was passed. Co-authored-by: Sebastian Thiel --- gix-ref/Cargo.toml | 2 + .../fuzz/fuzz_targets/fuzz_packed_buffer.rs | 2 +- gix-ref/src/parse.rs | 19 ++- gix-ref/src/store/file/find.rs | 2 +- gix-ref/src/store/file/log/line.rs | 6 +- .../src/store/file/loose/reference/decode.rs | 15 ++- gix-ref/src/store/file/overlay_iter.rs | 4 +- gix-ref/src/store/file/packed.rs | 6 +- gix-ref/src/store/file/transaction/prepare.rs | 2 +- gix-ref/src/store/packed/buffer.rs | 28 +++-- gix-ref/src/store/packed/decode.rs | 7 +- gix-ref/src/store/packed/decode/tests.rs | 34 ++++- gix-ref/src/store/packed/find.rs | 6 +- gix-ref/src/store/packed/iter.rs | 21 ++-- gix-ref/src/store/packed/mod.rs | 4 + gix-ref/tests/Cargo.toml | 2 +- .../fixtures/generated-archives/.gitignore | 2 + ...amespaced_packed_ref_repository_sha256.tar | Bin 0 -> 71680 bytes ...cked_ref_repository_for_overlay_sha256.tar | Bin 0 -> 68608 bytes .../make_packed_ref_repository_sha256.tar | Bin 0 -> 73216 bytes ...ke_packed_refs_for_lookup_rules_sha256.tar | Bin 0 -> 64000 bytes .../generated-archives/make_pristine.tar | Bin 174592 -> 186880 bytes .../make_pristine_sha256.tar | Bin 0 -> 186880 bytes .../make_pseudo_ref_repository.tar | Bin 58880 -> 61952 bytes .../make_pseudo_ref_repository_sha256.tar | Bin 0 -> 61952 bytes .../make_ref_repository.tar | Bin 86528 -> 86016 bytes .../make_ref_repository_sha256.tar | Bin 0 -> 86016 bytes .../make_repo_for_1850_repro.tar | Bin 50176 -> 53248 bytes .../make_repo_for_1850_repro_sha256.tar | Bin 0 -> 53248 bytes .../make_repo_for_1928_repro.tar | Bin 53760 -> 53760 bytes .../make_repo_for_1928_repro_sha256.tar | Bin 0 -> 53760 bytes .../make_repo_for_reflog_sha256.tar | Bin 0 -> 183808 bytes ...sitory_with_lots_of_packed_refs_sha256.tar | Bin 0 -> 12700672 bytes gix-ref/tests/fixtures/make_pristine.sh | 6 +- .../fixtures/make_pseudo_ref_repository.sh | 7 +- gix-ref/tests/fixtures/make_ref_repository.sh | 21 ++-- .../fixtures/make_repo_for_1850_repro.sh | 26 ++-- .../fixtures/make_repo_for_1928_repro.sh | 19 ++- gix-ref/tests/fixtures/make_worktree_repo.sh | 4 + gix-ref/tests/refs/file/log.rs | 20 +-- gix-ref/tests/refs/file/mod.rs | 24 +++- gix-ref/tests/refs/file/reference.rs | 48 +++++-- gix-ref/tests/refs/file/store/find.rs | 2 +- gix-ref/tests/refs/file/store/iter.rs | 118 +++++++++++++----- gix-ref/tests/refs/file/store/mod.rs | 2 + gix-ref/tests/refs/file/store/reflog.rs | 1 + gix-ref/tests/refs/file/transaction/mod.rs | 2 +- .../create_or_update/collisions.rs | 5 +- .../create_or_update/mod.rs | 20 +-- .../transaction/prepare_and_commit/delete.rs | 8 +- gix-ref/tests/refs/file/worktree.rs | 108 +++++++++------- gix-ref/tests/refs/main.rs | 53 ++++++++ gix-ref/tests/refs/packed/find.rs | 14 ++- gix-ref/tests/refs/packed/iter.rs | 10 +- gix-ref/tests/refs/packed/open.rs | 7 +- gix-ref/tests/refs/store.rs | 2 +- justfile | 3 +- 57 files changed, 492 insertions(+), 200 deletions(-) create mode 100644 gix-ref/tests/fixtures/generated-archives/make_namespaced_packed_ref_repository_sha256.tar create mode 100644 gix-ref/tests/fixtures/generated-archives/make_packed_ref_repository_for_overlay_sha256.tar create mode 100644 gix-ref/tests/fixtures/generated-archives/make_packed_ref_repository_sha256.tar create mode 100644 gix-ref/tests/fixtures/generated-archives/make_packed_refs_for_lookup_rules_sha256.tar create mode 100644 gix-ref/tests/fixtures/generated-archives/make_pristine_sha256.tar create mode 100644 gix-ref/tests/fixtures/generated-archives/make_pseudo_ref_repository_sha256.tar create mode 100644 gix-ref/tests/fixtures/generated-archives/make_ref_repository_sha256.tar create mode 100644 gix-ref/tests/fixtures/generated-archives/make_repo_for_1850_repro_sha256.tar create mode 100644 gix-ref/tests/fixtures/generated-archives/make_repo_for_1928_repro_sha256.tar create mode 100644 gix-ref/tests/fixtures/generated-archives/make_repo_for_reflog_sha256.tar create mode 100644 gix-ref/tests/fixtures/generated-archives/make_repository_with_lots_of_packed_refs_sha256.tar diff --git a/gix-ref/Cargo.toml b/gix-ref/Cargo.toml index 5527c7fc50d..fad4f25ff8c 100644 --- a/gix-ref/Cargo.toml +++ b/gix-ref/Cargo.toml @@ -19,6 +19,8 @@ test = true [features] ## Enable support for the SHA-1 hash by enabling the respective feature in the `gix-hash` crate. sha1 = ["gix-hash/sha1"] +## Enable support for the SHA-256 hash by enabling the respective feature in the `gix-hash` crate. +sha256 = ["gix-hash/sha256"] ## Data structures implement `serde::Serialize` and `serde::Deserialize`. serde = ["dep:serde", "gix-hash/serde", "gix-actor/serde", "gix-object/serde"] diff --git a/gix-ref/fuzz/fuzz_targets/fuzz_packed_buffer.rs b/gix-ref/fuzz/fuzz_targets/fuzz_packed_buffer.rs index a60f340cb7d..e6bfb639dcf 100644 --- a/gix-ref/fuzz/fuzz_targets/fuzz_packed_buffer.rs +++ b/gix-ref/fuzz/fuzz_targets/fuzz_packed_buffer.rs @@ -14,7 +14,7 @@ struct Ctx<'a> { } fn fuzz(ctx: Ctx) -> Result<()> { - let buffer = Buffer::from_bytes(ctx.packed_file_contents)?; + let buffer = Buffer::from_bytes(ctx.packed_file_contents, "sha1".parse().unwrap())?; _ = black_box(buffer.iter()?.count()); let full_name_ref: &FullNameRef = BStr::new(ctx.name).try_into()?; diff --git a/gix-ref/src/parse.rs b/gix-ref/src/parse.rs index 3b6133db221..144ab94f092 100644 --- a/gix-ref/src/parse.rs +++ b/gix-ref/src/parse.rs @@ -6,11 +6,24 @@ fn is_hex_digit(b: u8) -> bool { b.is_ascii_hexdigit() } -/// Copy from `gix-object`, intentionally accepting all supported hash lengths. -pub fn hex_hash<'a>(i: &mut &'a [u8]) -> ParseResult<&'a BStr> { +/// Copy from `gix-object`, validating the hash against `hash_kind`. +pub fn hex_hash<'a>(i: &mut &'a [u8], hash_kind: gix_hash::Kind) -> ParseResult<&'a BStr> { + let len = hash_kind.len_in_hex(); + let Some(hex) = i.get(..len) else { + return Err(()); + }; + if !hex.iter().all(|b| is_hex_digit(*b)) { + return Err(()); + } + *i = &i[len..]; + Ok(hex.as_bstr()) +} + +/// All all supported hash lengths, if they match perfectly. +pub fn hex_hash_any<'a>(i: &mut &'a [u8]) -> ParseResult<&'a BStr> { let max = gix_hash::Kind::longest().len_in_hex(); let len = i.iter().take(max).take_while(|b| is_hex_digit(**b)).count(); - if len < gix_hash::Kind::shortest().len_in_hex() { + if !gix_hash::Kind::all().iter().any(|kind| kind.len_in_hex() == len) { return Err(()); } let (hex, rest) = i.split_at(len); diff --git a/gix-ref/src/store/file/find.rs b/gix-ref/src/store/file/find.rs index 6e49da77e4e..ae347df2042 100644 --- a/gix-ref/src/store/file/find.rs +++ b/gix-ref/src/store/file/find.rs @@ -194,7 +194,7 @@ impl file::Store { Ok(None) } Some(content) => Ok(Some( - loose::Reference::try_from_path(full_name.to_owned(), &content) + loose::Reference::try_from_path(full_name.to_owned(), &content, self.object_hash) .map(Into::into) .map(|mut r: Reference| { if let Some(namespace) = &self.namespace { diff --git a/gix-ref/src/store/file/log/line.rs b/gix-ref/src/store/file/log/line.rs index 90a320d64e2..3d660b53aa7 100644 --- a/gix-ref/src/store/file/log/line.rs +++ b/gix-ref/src/store/file/log/line.rs @@ -75,7 +75,7 @@ impl<'a> From> for Line { pub mod decode { use gix_object::bstr::{BStr, ByteSlice}; - use crate::{file::log::LineRef, parse::hex_hash}; + use crate::{file::log::LineRef, parse::hex_hash_any}; /// mod error { @@ -143,9 +143,9 @@ pub mod decode { None => (line, BStr::new(b"")), }; - let old = hex_hash(&mut head)?; + let old = hex_hash_any(&mut head)?; head = head.strip_prefix(b" ").ok_or(())?; - let new = hex_hash(&mut head)?; + let new = hex_hash_any(&mut head)?; head = head.strip_prefix(b" ").ok_or(())?; let signature = gix_actor::signature::decode(&mut head).map_err(|_| ())?; if !head.is_empty() { diff --git a/gix-ref/src/store/file/loose/reference/decode.rs b/gix-ref/src/store/file/loose/reference/decode.rs index e892f1e0a6b..c47b10beb71 100644 --- a/gix-ref/src/store/file/loose/reference/decode.rs +++ b/gix-ref/src/store/file/loose/reference/decode.rs @@ -43,12 +43,12 @@ impl TryFrom for Target { } impl Reference { - /// Create a new reference of the given `parent` store with `relative_path` service as unique identifier - /// at which the `path_contents` was read to obtain the refs value. - pub fn try_from_path(name: FullName, path_contents: &[u8]) -> Result { + /// Create a new reference named `name` from the loose reference file contents in `path_contents`, + /// parsing object ids as `hash_kind`. + pub fn try_from_path(name: FullName, path_contents: &[u8], hash_kind: gix_hash::Kind) -> Result { Ok(Reference { name, - target: parse(path_contents) + target: parse(path_contents, hash_kind) .map_err(|_| Error::Parse { content: path_contents.into(), })? @@ -68,7 +68,7 @@ impl Reference { /// [`MaybeUnsafeState::Id`]. /// /// If neither reference form can be parsed, an error is returned. -fn parse(mut i: &[u8]) -> Result { +fn parse(mut i: &[u8], hash_kind: gix_hash::Kind) -> Result { if let Some(rest) = i.strip_prefix(b"ref: ") { i = rest; while i.first() == Some(&b' ') { @@ -78,7 +78,10 @@ fn parse(mut i: &[u8]) -> Result { let path = i[..path_end].into(); Ok(MaybeUnsafeState::UnvalidatedPath(path)) } else { - let hex = hex_hash(&mut i)?; + let hex = hex_hash(&mut i, hash_kind)?; + if i.first().is_some_and(u8::is_ascii_hexdigit) { + return Err(()); + } Ok(MaybeUnsafeState::Id(ObjectId::from_hex(hex).expect("prior validation"))) } } diff --git a/gix-ref/src/store/file/overlay_iter.rs b/gix-ref/src/store/file/overlay_iter.rs index 7a2368cebab..e7886ce46cc 100644 --- a/gix-ref/src/store/file/overlay_iter.rs +++ b/gix-ref/src/store/file/overlay_iter.rs @@ -21,6 +21,7 @@ use crate::{ pub struct LooseThenPacked<'p, 's> { git_dir: &'s Path, common_dir: Option<&'s Path>, + hash_kind: gix_hash::Kind, namespace: Option<&'s Namespace>, iter_packed: Option>>, iter_git_dir: Peekable, @@ -97,7 +98,7 @@ impl<'p> LooseThenPacked<'p, '_> { source: err, path: refpath.to_owned(), })?; - loose::Reference::try_from_path(name, buf) + loose::Reference::try_from_path(name, buf, self.hash_kind) .map_err(|err| { let relative_path = refpath .strip_prefix(git_dir) @@ -432,6 +433,7 @@ impl file::Store { Ok(LooseThenPacked { git_dir: self.git_dir(), common_dir: self.common_dir(), + hash_kind: self.object_hash, iter_packed: match packed { Some(packed) => Some( match git_dir_info.prefix() { diff --git a/gix-ref/src/store/file/packed.rs b/gix-ref/src/store/file/packed.rs index cfbe62922d4..30d7f015fc0 100644 --- a/gix-ref/src/store/file/packed.rs +++ b/gix-ref/src/store/file/packed.rs @@ -26,7 +26,11 @@ impl file::Store { /// Note that it will automatically be memory mapped if it exceeds the default threshold of 32KB. /// Change the threshold with [file::Store::set_packed_buffer_mmap_threshold()]. pub fn open_packed_buffer(&self) -> Result, packed::buffer::open::Error> { - match packed::Buffer::open(self.packed_refs_path(), self.packed_buffer_mmap_threshold) { + match packed::Buffer::open( + self.packed_refs_path(), + self.packed_buffer_mmap_threshold, + self.object_hash, + ) { Ok(buf) => Ok(Some(buf)), Err(packed::buffer::open::Error::Io(err)) if err.kind() == std::io::ErrorKind::NotFound => Ok(None), Err(err) => Err(err), diff --git a/gix-ref/src/store/file/transaction/prepare.rs b/gix-ref/src/store/file/transaction/prepare.rs index 8b3e7cf9f23..5052bdd8047 100644 --- a/gix-ref/src/store/file/transaction/prepare.rs +++ b/gix-ref/src/store/file/transaction/prepare.rs @@ -34,7 +34,7 @@ impl Transaction<'_, '_> { .and_then(|maybe_loose| { maybe_loose .map(|buf| { - loose::Reference::try_from_path(change.update.name.clone(), &buf) + loose::Reference::try_from_path(change.update.name.clone(), &buf, store.object_hash) .map(Reference::from) .map_err(Error::from) }) diff --git a/gix-ref/src/store/packed/buffer.rs b/gix-ref/src/store/packed/buffer.rs index 962ce0caae9..b1433d1d82d 100644 --- a/gix-ref/src/store/packed/buffer.rs +++ b/gix-ref/src/store/packed/buffer.rs @@ -23,7 +23,11 @@ pub mod open { /// Initialization impl packed::Buffer { - fn open_with_backing(backing: packed::Backing, path: PathBuf) -> Result { + fn open_with_backing( + backing: packed::Backing, + path: PathBuf, + hash_kind: gix_hash::Kind, + ) -> Result { let (backing, offset) = { let (offset, sorted) = { let mut input = backing.as_ref(); @@ -38,7 +42,8 @@ pub mod open { if !sorted { // this implementation is likely slower than what git does, but it's less code, too. - let mut entries = packed::Iter::new(&backing.as_ref()[offset..])?.collect::, _>>()?; + let mut entries = + packed::Iter::new(&backing.as_ref()[offset..], hash_kind)?.collect::, _>>()?; entries.sort_by_key(|e| e.name.as_bstr()); let mut serialized = Vec::::new(); for entry in entries { @@ -61,14 +66,20 @@ pub mod open { offset, data: backing, path, + hash_kind, }) } - /// Open the file at `path` and map it into memory if the file size is larger than `use_memory_map_if_larger_than_bytes`. + /// Open the file at `path`, parsing object ids as `hash_kind`, and map it into memory if the file size is larger + /// than `use_memory_map_if_larger_than_bytes`. /// /// In order to allow fast lookups and optimizations, the contents of the packed refs must be sorted. /// If that's not the case, they will be sorted on the fly with the data being written into a memory buffer. - pub fn open(path: PathBuf, use_memory_map_if_larger_than_bytes: u64) -> Result { + pub fn open( + path: PathBuf, + use_memory_map_if_larger_than_bytes: u64, + hash_kind: gix_hash::Kind, + ) -> Result { let backing = if std::fs::metadata(&path)?.len() <= use_memory_map_if_larger_than_bytes { packed::Backing::InMemory(std::fs::read(&path)?) } else { @@ -80,16 +91,17 @@ pub mod open { }, ) }; - Self::open_with_backing(backing, path) + Self::open_with_backing(backing, path, hash_kind) } - /// Open a buffer from `bytes`, which is the content of a typical `packed-refs` file. + /// Open a buffer from `bytes`, which is the content of a typical `packed-refs` file, parsing object ids as + /// `hash_kind`. /// /// In order to allow fast lookups and optimizations, the contents of the packed refs must be sorted. /// If that's not the case, they will be sorted on the fly. - pub fn from_bytes(bytes: &[u8]) -> Result { + pub fn from_bytes(bytes: &[u8], hash_kind: gix_hash::Kind) -> Result { let backing = packed::Backing::InMemory(bytes.into()); - Self::open_with_backing(backing, PathBuf::from("")) + Self::open_with_backing(backing, PathBuf::from(""), hash_kind) } } diff --git a/gix-ref/src/store/packed/decode.rs b/gix-ref/src/store/packed/decode.rs index 567520d3b10..c53c670b122 100644 --- a/gix-ref/src/store/packed/decode.rs +++ b/gix-ref/src/store/packed/decode.rs @@ -72,11 +72,12 @@ pub fn header(input: &mut &[u8]) -> Result { /// The reference line has the form ` ` followed by a /// line ending. If the following line starts with `^`, it is parsed as the /// peeled object id for the returned [`packed::Reference`]. +/// Object ids are parsed according to `hash_kind`. /// /// On success, `input` is advanced past the reference line and, if present, the /// peeled object line. -pub fn reference<'a>(input: &mut &'a [u8]) -> Result, ()> { - let target = parse::hex_hash(input)?; +pub fn reference<'a>(input: &mut &'a [u8], hash_kind: gix_hash::Kind) -> Result, ()> { + let target = parse::hex_hash(input, hash_kind)?; let Some(rest) = input.strip_prefix(b" ") else { return Err(()); }; @@ -85,7 +86,7 @@ pub fn reference<'a>(input: &mut &'a [u8]) -> Result, ()> let object = if let Some(rest) = input.strip_prefix(b"^") { *input = rest; - let object = parse::hex_hash(input)?; + let object = parse::hex_hash(input, hash_kind)?; parse::newline(input)?; Some(object) } else { diff --git a/gix-ref/src/store/packed/decode/tests.rs b/gix-ref/src/store/packed/decode/tests.rs index 5549370aaba..7b383c551f0 100644 --- a/gix-ref/src/store/packed/decode/tests.rs +++ b/gix-ref/src/store/packed/decode/tests.rs @@ -7,6 +7,8 @@ mod reference { FullNameRef, }; + const HASH_KIND: gix_hash::Kind = gix_hash::Kind::Sha1; + /// Convert a hexadecimal hash into its corresponding `ObjectId` or _panic_. fn hex_to_id(hex: &str) -> gix_hash::ObjectId { gix_hash::ObjectId::from_hex(hex.as_bytes()).expect("40 bytes hex") @@ -15,16 +17,27 @@ mod reference { #[test] fn invalid() { let mut input = b"# what looks like a comment".as_slice(); - assert!(decode::reference(&mut input).is_err()); + assert!(decode::reference(&mut input, HASH_KIND).is_err()); let mut input = b"^e9cdc958e7ce2290e2d7958cdb5aa9323ef35d37\n".as_slice(); - assert!(decode::reference(&mut input).is_err(), "lonely peel"); + assert!(decode::reference(&mut input, HASH_KIND).is_err(), "lonely peel"); + let mut input = + b"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa refs/heads/main\n".as_slice(); + assert!( + decode::reference(&mut input, gix_hash::Kind::Sha1).is_err(), + "sha1 refs reject sha256-sized ids" + ); + let mut input = b"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa refs/heads/main\n".as_slice(); + assert!( + decode::reference(&mut input, gix_hash::Kind::Sha256).is_err(), + "sha256 refs reject sha1-sized ids" + ); } #[test] fn uppercase_hex() -> Result { let mut input: &[u8] = b"D53C4B0F91F1B29769C9430F2D1C0BCAB1170C75 refs/heads/uppercase ^E9CDC958E7CE2290E2D7958CDB5AA9323EF35D37\n"; - let parsed = decode::reference(&mut input).unwrap(); + let parsed = decode::reference(&mut input, HASH_KIND).unwrap(); assert!(input.is_empty(), "exhausted"); assert_eq!(parsed.name, FullNameRef::new_unchecked("refs/heads/uppercase".into())); @@ -33,11 +46,22 @@ mod reference { Ok(()) } + #[test] + fn sha256_hex() -> Result { + let mut input: &[u8] = b"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa refs/heads/main\n"; + let parsed = decode::reference(&mut input, gix_hash::Kind::Sha256).unwrap(); + + assert!(input.is_empty(), "exhausted"); + assert_eq!(parsed.name, FullNameRef::new_unchecked("refs/heads/main".into())); + assert_eq!(parsed.target().kind(), gix_hash::Kind::Sha256); + Ok(()) + } + #[test] fn two_refs_in_a_row() -> Result { let mut input: &[u8] = b"d53c4b0f91f1b29769c9430f2d1c0bcab1170c75 refs/heads/alternates-after-packs-and-loose ^e9cdc958e7ce2290e2d7958cdb5aa9323ef35d37\neaae9c1bc723209d793eb93f5587fa2604d5cd92 refs/heads/avoid-double-lookup\n"; - let parsed = decode::reference(&mut input).unwrap(); + let parsed = decode::reference(&mut input, HASH_KIND).unwrap(); assert_eq!( parsed, @@ -50,7 +74,7 @@ mod reference { assert_eq!(parsed.target(), hex_to_id("d53c4b0f91f1b29769c9430f2d1c0bcab1170c75")); assert_eq!(parsed.object(), hex_to_id("e9cdc958e7ce2290e2d7958cdb5aa9323ef35d37")); - let parsed = decode::reference(&mut input).unwrap(); + let parsed = decode::reference(&mut input, HASH_KIND).unwrap(); assert!(input.is_empty(), "exhausted"); assert_eq!( parsed.name, diff --git a/gix-ref/src/store/packed/find.rs b/gix-ref/src/store/packed/find.rs index 4de28e7731b..015a1aa1625 100644 --- a/gix-ref/src/store/packed/find.rs +++ b/gix-ref/src/store/packed/find.rs @@ -40,7 +40,9 @@ impl packed::Buffer { match self.binary_search_by(name.as_bstr()) { Ok(line_start) => { let mut input = &self.as_ref()[line_start..]; - Ok(Some(packed::decode::reference(&mut input).map_err(|_| Error::Parse)?)) + Ok(Some( + packed::decode::reference(&mut input, self.hash_kind).map_err(|_| Error::Parse)?, + )) } Err((parse_failure, _)) => { if parse_failure { @@ -88,7 +90,7 @@ impl packed::Buffer { a.binary_search_by_key(&full_name.as_ref(), |b: &u8| { let ofs = std::ptr::from_ref::(b) as usize - a.as_ptr() as usize; let mut line = &a[search_start_of_record(ofs)..]; - packed::decode::reference(&mut line) + packed::decode::reference(&mut line, self.hash_kind) .map(|r| r.name.as_bstr().as_bytes()) .inspect_err(|_err| { encountered_parse_failure = true; diff --git a/gix-ref/src/store/packed/iter.rs b/gix-ref/src/store/packed/iter.rs index dc5966fd13c..d72c24cefc5 100644 --- a/gix-ref/src/store/packed/iter.rs +++ b/gix-ref/src/store/packed/iter.rs @@ -10,13 +10,13 @@ impl packed::Buffer { /// /// There is no namespace support in packed iterators. It can be emulated using `iter_prefixed(…)`. pub fn iter(&self) -> Result, packed::iter::Error> { - packed::Iter::new(self.as_ref()) + packed::Iter::new(self.as_ref(), self.hash_kind) } /// Return an iterator yielding only references matching the given prefix, ordered by reference name. pub fn iter_prefixed(&self, prefix: BString) -> Result, packed::iter::Error> { let first_record_with_prefix = self.binary_search_by(prefix.as_bstr()).unwrap_or_else(|(_, pos)| pos); - packed::Iter::new_with_prefix(&self.as_ref()[first_record_with_prefix..], Some(prefix)) + packed::Iter::new_with_prefix(&self.as_ref()[first_record_with_prefix..], self.hash_kind, Some(prefix)) } } @@ -29,7 +29,7 @@ impl<'a> Iterator for packed::Iter<'a> { } let start = self.cursor; - match decode::reference(&mut self.cursor) { + match decode::reference(&mut self.cursor, self.hash_kind) { Ok(reference) => { self.current_line += 1; if let Some(ref prefix) = self.prefix { @@ -63,21 +63,24 @@ impl<'a> Iterator for packed::Iter<'a> { } impl<'a> packed::Iter<'a> { - /// Return a new iterator after successfully parsing the possibly existing first line of the given `packed` refs buffer. - pub fn new(packed: &'a [u8]) -> Result { - Self::new_with_prefix(packed, None) + /// Return a new iterator after successfully parsing the possibly existing first line of the given `packed` refs buffer, + /// parsing object ids as `hash_kind`. + pub fn new(packed: &'a [u8], hash_kind: gix_hash::Kind) -> Result { + Self::new_with_prefix(packed, hash_kind, None) } - /// Returns an iterators whose references will only match the given prefix. + /// Returns an iterator whose references will only match `prefix`. /// - /// It assumes that the underlying `packed` buffer is indeed sorted + /// It assumes that the underlying `packed` buffer is indeed sorted and parses object ids as `hash_kind`. pub(in crate::store_impl::packed) fn new_with_prefix( packed: &'a [u8], + hash_kind: gix_hash::Kind, prefix: Option, ) -> Result { if packed.is_empty() { Ok(packed::Iter { cursor: packed, + hash_kind, prefix, current_line: 1, }) @@ -89,12 +92,14 @@ impl<'a> packed::Iter<'a> { let refs = input; Ok(packed::Iter { cursor: refs, + hash_kind, prefix, current_line: 2, }) } else { Ok(packed::Iter { cursor: packed, + hash_kind, prefix, current_line: 1, }) diff --git a/gix-ref/src/store/packed/mod.rs b/gix-ref/src/store/packed/mod.rs index f6f71ac7982..228fd093fa9 100644 --- a/gix-ref/src/store/packed/mod.rs +++ b/gix-ref/src/store/packed/mod.rs @@ -20,6 +20,8 @@ enum Backing { #[derive(Debug)] pub struct Buffer { data: Backing, + /// The hash kind to expect when parsing packed references. + hash_kind: gix_hash::Kind, /// The offset to the first record, how many bytes to skip past the header offset: usize, /// The path from which we were loaded @@ -75,6 +77,8 @@ impl Reference<'_> { pub struct Iter<'a> { /// The position at which to parse the next reference cursor: &'a [u8], + /// The hash kind to expect when parsing packed references. + hash_kind: gix_hash::Kind, /// The next line, starting at 1 current_line: usize, /// If set, references returned will match the prefix, the first failed match will stop all iteration. diff --git a/gix-ref/tests/Cargo.toml b/gix-ref/tests/Cargo.toml index 85f0beb520a..863af5572f6 100644 --- a/gix-ref/tests/Cargo.toml +++ b/gix-ref/tests/Cargo.toml @@ -28,7 +28,7 @@ gix-discover = { path = "../../gix-discover" } gix-odb = { path = "../../gix-odb" } gix-actor = { path = "../../gix-actor" } gix-date = { path = "../../gix-date" } -gix-hash = { path = "../../gix-hash" } +gix-hash = { path = "../../gix-hash", features = ["sha1", "sha256"] } gix-validate = { path = "../../gix-validate" } gix-lock = { path = "../../gix-lock" } gix-object = { path = "../../gix-object" } diff --git a/gix-ref/tests/fixtures/generated-archives/.gitignore b/gix-ref/tests/fixtures/generated-archives/.gitignore index 1350be16f54..baa08f41ebe 100644 --- a/gix-ref/tests/fixtures/generated-archives/.gitignore +++ b/gix-ref/tests/fixtures/generated-archives/.gitignore @@ -1,3 +1,5 @@ make_worktree_repo.tar +make_worktree_repo_sha256.tar make_worktree_repo_packed.tar +make_worktree_repo_packed_sha256.tar make_multi_hop_ref*.tar diff --git a/gix-ref/tests/fixtures/generated-archives/make_namespaced_packed_ref_repository_sha256.tar b/gix-ref/tests/fixtures/generated-archives/make_namespaced_packed_ref_repository_sha256.tar new file mode 100644 index 0000000000000000000000000000000000000000..6e64745b56c4dac85ab739b608e3dd3f727f7386 GIT binary patch literal 71680 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 literal 0 HcmV?d00001 diff --git a/gix-ref/tests/fixtures/generated-archives/make_packed_ref_repository_sha256.tar b/gix-ref/tests/fixtures/generated-archives/make_packed_ref_repository_sha256.tar new file mode 100644 index 0000000000000000000000000000000000000000..ee37a55b17a9dc29e806915e779d5bbf5794dc12 GIT binary patch literal 73216 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 literal 0 HcmV?d00001 diff --git a/gix-ref/tests/fixtures/generated-archives/make_packed_refs_for_lookup_rules_sha256.tar b/gix-ref/tests/fixtures/generated-archives/make_packed_refs_for_lookup_rules_sha256.tar new file mode 100644 index 0000000000000000000000000000000000000000..3b4e923097e6565f81476b51296b20b68664cfed GIT binary patch literal 64000 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 LY*)O(be|Ofg|1B& diff --git a/gix-ref/tests/fixtures/generated-archives/make_pristine_sha256.tar b/gix-ref/tests/fixtures/generated-archives/make_pristine_sha256.tar new file mode 100644 index 0000000000000000000000000000000000000000..d24bc426a370cb1f5c8433f6ad1b4e0ef9ca45d3 GIT binary patch literal 186880 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 IHzDx<0Scyk>i_@% literal 0 HcmV?d00001 diff --git a/gix-ref/tests/fixtures/generated-archives/make_pseudo_ref_repository.tar b/gix-ref/tests/fixtures/generated-archives/make_pseudo_ref_repository.tar index 68efa91bb9c1692a30f40a20e40e8d9e9491ffb4..a03442143f116361bdbf3d1b7b375d38896b9915 100644 GIT binary patch delta 2353 zcmb_d!EWPJ6m6#rYK>+DVl#pfy0}rBNVV&J#aUT(rW~hQtF7Ldat3V1yO{ps;QEUe4?R4) z`1q^uX3k45-As@!dyEIx2@Ck(#>)Nk$1i--ef_ms&8c0*TCY}XL#+DZ^gTM^F^Rw+ zX436KnT6hRB#Ns91;?ZUhv-KFjd@U9JnR6MaKagA+QISXcW(lVV-dxI6PPhS_+jr> zDHeEwp#<5*{J}CI`6B8OoWdY1Id~&;vdIFJ9Md-DiS6A!c<8ewPbumf&l=KM*BUvF%%^0vm7G}~f z3Q;+_r0*4&nKD+_M#?=5P@+!@=Iys9pWXE4+Bhw#U@BDMC1tzJ2+9M zz+R+!8+yc0TnJRc$T%ht(u7RP=&&-Zug_{P37mBp4->he8v(lUy4!Y9H#T$da^dL) zRn9v+tPs_+A8!)-<%##}TiX>QQ>|`d956SR-`d~a2YuO%0uM!^+cTc9JOCupbt9nz zNj3DNRP`l9^b*@JhC17Bbb_Kywo>1qT!BxGIiCl(X_l&{F*gsH;@cQ0P*HdqR~hY& z4M~g?LY+VANyRqiq)5^DY>clMq$i2$VUm*Rld%Ps>9FQSPGpe4I~040skI7bNr^V$ z;X~@AOhu@q|2yS0yF|*9JcsIBUW=|GW*N=B9S2XXC68<2+JECiIHmSsk@!p2mO`2 zcH8eYcI)kX`ycJK>P-_ip=!|HAg}Z3*({Y+M~X?btl>V%qfY`mG>fBkc4bs5u&|(j z{3|Hg2u97rb3kZ-a-88pBCy_(#9mAXWiR%)0L#17px+5GiCqJ#K7$RiAJP$0N z{w&=A6+*K#ylsL>nv><+fn>Rq|D(QrQr2! zJ9m<&KR~jBsq0eiVO0EuslYXJvKWN<)5j m@yaiMPG9`>>&w?(U32Uzl(%RtBJ6N!RoB)o-u(Ty>wg0-ECEgc delta 193 zcmWN?v1$TA5CBm1P_9sj*jQe=Ym}MYnenDfl|Gf7th*x!Ay`DPG)2+}!CJ{5WPc<7 zkS0wakUt3VHE;h_>_3WASt|%x@VE*_DY6EZWlBDPL`W&Bf|)dGhq~k%mrYWWK+qU9 z5DXQaDQfhy;KVqRh}ZP?T<*r~TL>fw4xEP;020yVLnu;iKh3*&@p3L+tKR#ub2pf= oGLWOm_F=ut!~SnO|9xL|MqZ~})i;~Xy;ZmC#|bj!>z~i=KkkP(D*ylh diff --git a/gix-ref/tests/fixtures/generated-archives/make_pseudo_ref_repository_sha256.tar b/gix-ref/tests/fixtures/generated-archives/make_pseudo_ref_repository_sha256.tar new file mode 100644 index 0000000000000000000000000000000000000000..c133fcf47288cc194f461a23e391aa9d24e618b6 GIT binary patch literal 61952 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 GJogVk@4J%# delta 902 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 tuU)S%*K1Z1@CW%D(%i|tpTBFH{u)(EeFE06R delta 276 zcmZozz}(QmykR4ohLK^CskxD{frYVgqM^C5ahjQ#g=wmxNorzJs->}6qJgEEg=L~) z(&n3NYuUvO84L|f%nS{T41ih~3=9m7jg5fxoKeV4|066dn_ApF9!H^08~%HWY#T_G&ddp&GqJd{AWEdfY0%- z4gB`Ipi>zJ$MGzh7_%ih7EKE+f z%peH5LB|}Ay4~}N{SimQB{q`x^?nOyZYJTCT06gp` zNf0Nc)i3-Mzz&9M^=6~A_JyBus5QSE`f(7K*1zym0NW0a{jggqvV8ux%>P+UeB02? z<$t5T*=Wq=e}155^gSK_TH>F~MEZXta{gxPf1|OnwmBdF8I5@!Y&QNPmh-Rf?E5X| ze`9lVuK(ZJ09*p7F#cSYb&0#A&P`ukrT;ZxHWl>0)z!x8T>rZ%p>I)s^9w(>XmVcV zpNImJ^Z)LVyM_F3u5PZ)*Z;d8iV295<6j#LCrW+UgIkRMYP~UE|G$jt*Q-5k{73O= zrSJEG>p{4>)GgNkwdO{1zW!fL+Al7#@r9o+Mqm!$A4&n4|EE#(Zbr60J9i8D4+qd( z{(lX|$i}}mpxjTQO8Ycuzl%mmHTHXh?j5WGSB(Gq>gs0E{###%{x|pk&z=MBeOo&U z`?dJARJvz&`zH7(gKj7iOxzxZgTy3}84Wsq5*XhIb6~Fs{9%$|5SXZsr`SX?WS?s3 z9>5%)hOq*`-?0B7!se1WI%g?3``bbIA*gWIVX3if&Q62ALG5ASx09Gnp%h>cn(_M` z+j30Lb}$V3?O-Wh22j-Dvq2PxNi;lPk+K3TISr&XfF#2(5SSKyzS2zxlbrgA0ebDx z5Kxoux$Bu>&)6^u1BAu5+6nsSds_BK*|sq4sDB)ujD~&^f(9S_Vdx)q1Hz00(hQZg z+5LW;V9P^k^W(Yc1jqiUo2;04)J7k*tEh$^j$%+MJZ9VGEE>KG`zK0eix4{A2|faH zq-AvLBu58x>c_wyjfBURUgmfh^#o$tR{*f%D7|e*ycrp@RS2mIsWfCp9Db|Uw z!*tKY(F!MA4;!DTZaZ}@<%PQp`b>25{I^^!b;7_bEt^lJg`j;JnVmm1jaR_7UAoJi`XupC>o^1P)KqbfPdvB1}+YV z;0AUVC{lP_gS0vig@;%gOqjAOCsv-IIb!Mv{{(Vap(xC)!_6+nWU6yB9Q8&1L4tKE zA`&YjQ|Xys9_>B^i5i~t2vqHmF(VW7MqMILnRy&wBB2K=iwFsljVKPu#xWQby=_y# z0Ei5^le7?c%4^A4q^*Kid*m;cDB==w;4utf;?T#wuC#&W9YX}hLxmW?feHG`Urqy1 z%=De`j&du;5L^ve_bvzqc7#kfYWv-EjBPjaJfy%nl#66LOs`-_5vBcNr*ksvC`ir% zJGidVDmm;B<#bYG%J`U(!=MrkD_wMs!_?-gN& z%Hm8A$Q#gLF%~J6*N1fEAv(f7r8I|xAUMfdN!02DgKl(=DRMmO%aCy_k49k^@}!nu z_Nr~=tS8v@R-zD$EVySOaD~JRJ_hX(cHA@Boh@~iC%EWYQl6I<3kg`V+uqFR=?c_M`Q52SbKx&3A)53 z-tX|4@!B0zt$O6AQOpO!fFlA>13x*9F_OUSTj4dGn-!h&mG`Dn2~YYQ)p&FSc{{?$ z;u(b6Fo2Q*O7%+%lttc)0S8Ca65&_Fz3!mnm5#$4c=A-`7%vFr{V2rJJiUcH=$Cfs z)!7G1%d$GcI_{rfP^=)+maMuX+&GLzCz#GT28@okL?tqY+iNYX&MhcM)L6hMKNycf z!ZTau(XUSr|F?Dc?9rpv^IvuwtzRDfl_ZkM=qJ(vQwdb2Grox-yuaz#j0$TN}OPr%=amrb91hGn8o^i>kl0*Z@4j`u@(0`hFjaH`Es>Q-~MQ^$A)!eQ(mk#3Wk^p490uw36MN}w0i3S@H z5Vt`>Oq%nnk?`3%wEA}hXw?h$!L?9PbDO>b=`n_60w+KW5h+RDN>%xbSOYo()duoqAnpNF1J9a0n9{UM zx==Jrc8+X|C4o5t%K+b-UJ27gzpr{!j9Kxy4}-#bGN?YhGL^r<1o?UYu=Q~NnP=WS zAfcc@i3#UD6uzX@A=Alvds1zZi?2fix*RM%SJ5m1xKk`w%Y=tdwv5N&)8ipF<_X z%%wjE+LpL_;VOkgJ$wEG%c>?vR)3*ebTlxwAphR=qcbRWSfA+pw7wDuCCs;M(s3J! zCG7fP#kpvDnW!o(d_RT#klQyUk!AI{i)D7ciLU@T=l>bN=}KqzoqK?&2VHXhqq)Ai zQS|?;HCE^G-(O+)zq#iAKX#+Aj>0*jJ5~OX?ElMNrEccJ?J@59fl|yjp7jx^D_V^J zXy{nlA&GeI&+c5VV5@{a5-3tRF$awp&tS1CFj&dP>~rfI649EgltS>@Oy3U0Vku(O zc?>MBlTixTyQ14lz!10Nh*mizFw_*-6mWCI>d7xRVDgzKbX$#Y!b7%Zd%bLk3&Bx9 z7@Y`){5?}{vg(UxkEtA9UKXX%PeNgRqD6x1UJ7=7t(7D6!z-*2zVoW3-jU$_$nUC4 zY`@QKAKenOLx(=9mM(jFj6(q36WE*)_JcLAGOC!|k?548?$3J|Q;0frVO zoZMOj2s?8czzn-;bsRd~J~SQG#HMM5@v|WCLPy@(%(NuB(Ed%OZ#XkCumiLB78U3| z5aen7r&K|)Y+I>dVn|HGPtgdjx2!=jj71NFxFSZQotFrH04ef{D=?S2{;#7O71n>B z{yXf^w(n94xMKaUZ>&$8|5{&d%;W#Q?)rcE{?8=}fX+we2hb3Jl!bJ62pcOwrH8$F zC!BRnI)ucQmL6iI z*km8bvY_bMMz6i4L}fUe4A@#KRq45?U^gAE!O;L-%fJdEPn~C(PXkg2B^l|U9$}oQ z2`XB68GG53@0E`bLn#Q4ei6oej6W=YYJBIF|KfcvZOzQeD$M_0Fg$U%-kBY6<@{fp zoc{<4p2z=w1p$!h|6e};F~E$cGV$Spb(>EXj$ zhz$$Xs`D$>1qVrkSTfeng#b9un^r+xTL~NOF(Q=PK~BBEv%zSH5F9z0LqA0a!X)cP zR$GDqoP*ICCyXh+$h*k!>kJP4W$>*rPuh(o-o(VC;2S$f)o*u4AOPCqnJar9A?9fr z_$tF8EDE?7#jo^1N|B)6J@XWCZRofJ=;d*>^g@h+hrs0Sz!A`54xllt8~8!OtYOIa zQ9@rI#!zDW7+MXF3&$0~3Ud6UGSt%!ATueGj^*z>Y+{|ed?EF<4uZr5ED6sOSwNh_ zN|Z75LEGobf)V5C6-H;YBkWg+omi=$W#9<^ko=C}@RW@y$4hSML4$Au!&hnP#wc}$ zWIRWtIghd-LL59s2PYkkV~ESq3>@|VR&nBj^T9yki9Vzo8vhNkFe2&+$Kav}BNwxxcJmTr|$}gCDIk5Qp$2_Ds8W_~=<{|KX!2hltXUsG`1EjB9US zFIDgFyk4%}FW1HxV9UI2)CLHtxhEkCay|uGPlD4mJXkQ~0fMk!0a@AszS^gtG1~X0 zky@gH)FNOM-Wa_(O~7d6tILR+qbUgWtx~8(PW|q?X%qrDxFBz`Y>cn}?s(=ME&LXd zE7pIcewwiV*VZ@Y_Ww=B@wR2JyZ+00K2h>@TgpTOhWt{*$|B@Mt34FQummhb+)L06 z8!Zi<$C?kpKeQ(p7g_KK(Hz?pB#bs41`Gzwssc)S%+J%8ULGa|Fz~v~qU*Swt1YIN zPF3y?&>(;M;`uMFgQti42Txji2QQu+x>G3OcD=Nq8$43OD~AX{?Q+lNf_e+w*;xoa z;C!5ie@4Of>xrTOf-+V#OCb%blK>APkc5WVcn^vCNCS20UUY%>8varKBp~kH-~OD2 zu`xsj(PpGBH$<|H3z4JPA%PHG3e9(>v5fb!jd4R+a$6pp*Zap&ASeHi<6hL~Y5K|; zH-HfPeMif{#zN% zds|xvgP`AhKnvyK^FmagPH@OHFfT1Lq4?5ik__UlTJ0D*6e8x|k^4?ZN7XQ@Ii9N_ zCj=gf4hC&JMh0pofq?m!Kym>Sz~PQE*9r+TWqg7h@XU-C*;m54Fz|8Y8PN-dhpBlU zcqvVRV4BMUqU*ylNu%T5iAJWu60|>HoH8eX97AV=YO2`%r4BIY-M-mJDeejD;pib0c3J3O+WDVmY4=FgR_Ko}IPE$uL3)s5PX=4nGpZm~J|d zUCd_S4uT;};K_@}mO9sV!@VB`!}C-UAdE+VGc|`qK-<#~I0PJ2Q^8?!(qz0oR`*ix z+$@#tNFW}Yly7OzaeNw-Uq2axh77AbHy~?C;;>sNWjAJHhb;Y8b$Jh|r%9zS{qKe(+>#>#xtT@RwaFo)B=) zL7D|X`AiGC6HV59`gD5Dr%zGyGn()EIO=}da#L4O#IbEtcuvT~JVN8HY)dG~8Vt=q zglpD!g%@;|%F(in!h%ja#LL9Un}WxcolkAVqrCgPV*c_;e#%Vy{F&fBGZh7~7^`J* zSSm}!u!EXXN0_dKzA%<$I?JUvTZk+QCj_JkJ9T`zV!Ry>{|NKD{xLxgoF!HK@rV^> za@dEwLaeRS*cv6r{|PeUh4M2VgPARMultIf@CSSBJJ5arbw5Dm_a9SXO~k;|-Z=AmHMAyE z=O;OmPo@Vq+ro%{f+SuXuaeG~g)63uoV59YM?mVN1t!C2hyWeO-jyAQeShzl#}8XVVEcXl$%HCV1EjdV% zbGQu_IE$E=fV|OU9ti0?4xW8$rNI?lQzqQk1R#o7@Dbo+S-Ldo#aXb(O_*4s-x(Q2 zp9-=#9Ou>=@|311z;YmK%%rT9XiFX?NR0?`FMY1qKCJ=*fgEDP7HJ;f2|~a(7OF5_ zF^Yf&B8n$ZTJSKwedd$^Mi^}B5O_%#v`hN!b2t)_xJaZQ4y7O$0c2n&l;jP4j1iVu zEHB=17<4Q%^8UFx-ONA<#C!I`!BuD6K zxhh4gobOhyX5v#RfNmEArk0TTy#K_~38hr1+Q;~isNfkAeFc z3GDRrp-h0F1Dod)rj52ysi4UsGv?P^sWdU4x#kuZU2)o_lT7PfxbR*>R~=h?fv=Uz zAlh};UsSq;&_zbmvQC-4mTDl-$u^fv(Uc;Jzm&aN@Mz&wp(_d*{C;WYAq-d;e}4DO zKj(o`(NHpTkZGwP`*hb%Wp+&eAlFJMDsO3)dQ1Xl4}5`PAZn9y&m4Dg2ofB|^_u(# zIfWVmAVomI%B~wrLia*prq5H`8b`yJ9qJ4cSW*BC{Bx<#mfHxwV9YbYqi&aZAYpzZ zJtGb@V9ovzc5tph7GkWJ!lz?;y=a7@*Izc&s96vyUo_S_Hd76RC9mc!Qv)AgU&Z2- z>7E)B!Zm6`6)hNOa})$l-Gu6iMR!6jj(6b-ZBOP>%B^p8?vLIJfcQ4cQ`@(2Mgo^EZmEl5(x_A6hEUHlrJt$7>Qp+L@KlZ89q zVeAiaxZMAXvw@T6|JGNVjd}dfbq4SY%UpN=PqTOE0>MPD`RE^{LxB4ZaXNH+{&PnE z=faI8#01MRlkRYZE5rl2pcT8q-7I!7>piE?lmKCkSi(D;sFM7Amz)~VvII1CY9IxX zKQ)khc(YRjx%tm+M1^xl`#z2}ubBUT@Jpd3M0|AJpyF3G=owE@F)QR&G))Ix;CQX)#R)K?3OUFoD40{HVBN#T_?oEcv$PrBcFrknV44{N}*&=}T9Pup(&>e8E17MD6 z!&;vyT($_Flzm1)4W^(3!zhc8pHpGuGD#Mv^txcV1! zNLZ&s3XZdmIFJ$ZBk`Nep`gCIg0d2U}IuK)($aV&ht zr9(}IAe2WLFc&E9cRqx1<`Uw3Q=Wqx8+G=zA*O24)C!!i9D3_%$-wAk7w<6wLOzu0< z1Fz8k*4FBi=RX?r^WV1^&6`)r^gl?2i^F*wM?jWJb^x;k5m4h&L!T$2PI%MGvJLSE zB=Qnv1_Z;0(1%7N!a|HG$P|g1xbeB~{Gm@YVGkEjTBDUz=d%idh*@ct_r=IAr>X_K z1L3BzFq1O_3L!g_W%`vnHN@{LE1WZzt=1q^S|Wug&k@r@Ly>_?bOz&`dPL2Y($-x} zG8$l`G4OjX@f-DLC{dz(brGAzdv!1tdP;+rYjBaG9#}QI%*hLIcE}{`2{+B~7LMZ) zZbD%G&1BgH5OGJ*4k9*@36UeIH(fZG0Ok_tXuc5_Yzu_5L^)P3bV?*vD($MMmyz9( z9_yrL0HF$n7VHluN)cs@3lrmdWf7-SL8=NNxm~P!waYb=4p7xG>N8C)v}6gog?@*K zAJXFt7Zrbo#ro!KJ;T)wRQotWhX)T2xbU}wQ`szcr-O1C31skrqq`!3UBFt- zLFpr!joN}kv(=_ozJ)xER3_nOhL4r&tR|#^UdHCOQUt_|0`H{B4{TFQyn%tSa?sG^ z5#}DU+bmFvr$;$$&Q9LRb{-+f2^4pFuw@BlQ|;my`vEo=eK2Tc6`C$l_UL?8e=ilv z>mg2Um4OA?9_wjWq!WT{b!3$N^e9*xiu3a~gi zM@c0!a^xiKY91R%Ax05srtv%Yx0J@AYcTn9?4m#Vb$9=BwNZyC|Gw``aYWdxQkIb-eG z98W-uX^b04Fpf4|fc$-V@a(_k+K>`%T**@h1}1q)(jnni74NM$86-1_;b|pYO9W{K z4@E&V$Qw=Xl)f30QBnZCvki#VcNMcveSdgxxck^)k+Whd73t;9qedD<%#Aph={gyi&p`hSPP5e|&rk>2mL(aZIJX!>gt_kXOd zHRk(2j()TJo9X{lboQdbIrOB{1d;N~rdh9VtnlCeH2*c~hmqMs+BqBxK@LEaJ%lpk zWjup}#0(X{QqBtn@&|tHMIdA>&w10t!2ux5-S~TSq}Ml6Va%)V^u3CwffpD8DubqZ z8k~7z_?6lab*k|@@T_tV>>NTjP3}lFFIB+#!|EDmI1T`Xg|}JKprE^3Q#!JYX1#-M zPt0^0b<7gf8};VO88&&$_pIP9PSlFfDwL=o;AQC#VJ(Dh+ZgoVR8_XAuz`}Ks1db! zu^)U)79D0{17X<`(pdzNb<>`(7GEV%liN4XBqbMOm=JGGOCv?xW!xT&ju;dQN4 zI+n|we#7c&U0QYX0QL!eW;ASoEi~!j2;RRGX&fEVyQ`?k$W2%FoSn2F=j=q6Py~MX zp~jDY}k3WhDU1ff#mzR)4h z!^6r;%)x(CH_!pY?;q&Cd&t9;WFiF#OOcoQ0oNGsgsmvn#h<-vHYO~nzzD!OMh<5XmN`~b28fK=xrn?kbu^= zS}aBBw^ZMii%P~|In_WED8W||q==c0%mWZr>?o@Qgh@5MpVBgkUQ;5>4q9r`SQb+JN z2|kh;ogX=6v@}iWw4rkn1Tke`Yl#4t>7j6W2v(+C<7NZqGLq_ar48*axls1x2o$mS^5t<97LUwsy*nsuqPH4YHyd^B_Q7|8;Sc|SVCIj?Hz=mv-W3r z0eE*LWkZXm2yl8A13xoL_Mu3osd?T2{aduM~2*DgB!YyZOeR(~*F* zZ$%8n$SI$Z{*yFV*#VV4Ye3q92Cp%=L3_1e53AU7U1hvsU+}>u7^HsofOmrwN_*NP zG|+fsNyw;p{?9ZC%9i+&Ly1O^{h6|!a-Ph7Y$!cE*lS4?yX+I$MOj^!xM%4Edu7=6 zQzlRe>el1*te;yFt-_GXd@Qeh_|UKc#R$ydyJG~S;7~`5d(p6#kwu5d07YJTE6zNp_~VaA2kQA;_gfWEwiwSf>k^$39r$UEmLdf)sk)stc z1CD)UnYLOjj@Rn+z=1Sg`-hdtrY5qa0zK6rK~HexgmfL!NbxPX{i&KkPYtAp_bV!54)c0GUlv-Sr}W@v(@T^wgK$KQ22p znEqB*#K|xYCWQwloMosbEcS?eaA6&IF1KZK^5ERK+(n!oos;_Za(9OW2I6tRi@zj( zUUq@dq)n0n-e2I+;0PY$EC08%RBF_SDL(G+#CMkBOCON=|B=~cnehrJ#4>pxQ_AoW zKCWaN(9-|SkNT4D^^kK`a2)LGiGmIw{~ig7ds4=gv;gzPrh%*p)lvUS0=hEk5?Lyh zc302^u3vi+05L8^Fm@2-yONrYS=ElikM7bMFH}8d;1MXoR&iDn8&$YLq4c9Im^FOJ1-ger&A5@Mu}mhWrI{Lg&YpRz z)a2T7K?%zfQbO&B(*P*of{Hc{Q)_iD0l5xBZ((spVQKgB$TTOBQNmWM0t}ea5aKoy zCn2NjoDjHJ6qcO&H%sr^KOT0@|Eo629moE&hnM?*>y3^2Wd5(UdH&z8!W`rN-`!M; zv@sfTNhc+NY{AI_sce#u|EDALvbbLgQJ48!BMT%D&ZaQo-Z21(CzG?Di?D6OrK!wC z?_U@-0uVL{W%0g%eB1~Grd|*OfgsYna9aSNXxk9pP=rz!vItMrM(*;wKsMzVVVply zOe*M+e-NKLq1Q-P$#Hlnk%KDh7$M?(;J88%m(egcCH=X2TECn6zueYiF842Bxw<_n zez<*sS!I9?)lB-TC-W}uzBv5l;MPeOvHNK%?_=y$x|E7YNC}^%?x5SI|M-(|BL873y4!eXA#^DJH`Z{Ui++lK z>&O6BJpa*bZr11LKV~r)1(=gpCO>c|qAB=&>iqoQ3`SxSq$a!W#ubWsrnuHEZG5r(P+{D__5_J>RkVu)qv#S=EuJ_BRk+0;}89BV?O@5ahlcFvGK>*_IERA=vL#8{6BO1 zZw7-=04d|IksO6LclVRyf0_N)T%XYY8qMbX{+GKOfr}x%!meu2XNKVzNn2GBKr96I zVi9r}pZd-9jnXS-dB@w#-KQlGWhSYKc^XYlElPgtZOu8ba6~I`n^_}bWSHniC)h*b zX7hkCpE2IZ;lu@`kpOfF$aar#1^~7luWWp(f_-)x<1eUb$26h zF{I||pEv)!w!XHCQg?OzJ! y-+cdvA$(4cYgX6m)rMKxMY@f^{0u&5tgkQ6y@8kV&-~?_0&@z?Dex~!f&T+es!8Ag literal 0 HcmV?d00001 diff --git a/gix-ref/tests/fixtures/generated-archives/make_repo_for_1928_repro.tar b/gix-ref/tests/fixtures/generated-archives/make_repo_for_1928_repro.tar index 5b7540170fabaea1608430d297efe451df691ee7..9af9034dbee4d909afecba19965bda7f5ab89985 100644 GIT binary patch delta 459 zcmZoz!rZWgc>&WV9#*E!tlJv7#0(e=4NS}o4U7zoj13qJ3=EBo%*+`k3!Vy|s35eN z@t`{6X2V1087C@mPCC_wO|`iZLiK5c>P<)5n6M}}F*ZghKaQkaf}3eEw+-K7ZYiO~ z+$9{Fx#zL4Z00Zc%ewJI1lF$pnE7UC!oGebAr#Ml%bWRn>g|MQucnweOd8X1}E z0?ny_2B7jJmR4~SV+_sa<|c?BVdZ5MF*VRLRM2oND9A}waL+8!H8eHV1iD~9<7S6L K2Oz{G@%aEFO@cW9 delta 376 zcmZoz!rZWgc>&X=BSK7*g-#WV8yPbg8km?F8Wy(Crp4Sk zLW{Xucs6sFF|ustk^9fPn7fK=GxvmF(wkYm*nvWJ|JfIFCx~t4_G95$%tfb5EQ?vUacyR0Y2@16wx)`4l7Pl$N1OdX!zDL~wK0hqqPxY&1n53^5J;*s!jw-E aYQv)1$lMsAS{SN&Gcd3i!2~eaW&!~DEoJ-w diff --git a/gix-ref/tests/fixtures/generated-archives/make_repo_for_1928_repro_sha256.tar b/gix-ref/tests/fixtures/generated-archives/make_repo_for_1928_repro_sha256.tar new file mode 100644 index 0000000000000000000000000000000000000000..083f4631f06bae6c5249de0776fffb2a5fe51215 GIT binary patch literal 53760 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%0Dwgf0M3f^hK59(Ll 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 ASpWb4 literal 0 HcmV?d00001 diff --git a/gix-ref/tests/fixtures/generated-archives/make_repository_with_lots_of_packed_refs_sha256.tar b/gix-ref/tests/fixtures/generated-archives/make_repository_with_lots_of_packed_refs_sha256.tar new file mode 100644 index 0000000000000000000000000000000000000000..53d1d9ef25b1c4ba75f3bd9624c06cc426a21695 GIT binary patch literal 12700672 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

An73$U%ot&^pJ{Onun4eQn5?( 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.git/HEAD + if test "$(git rev-parse --show-object-format)" = "sha256"; then + printf "%0.sa" $(seq 1 64) >.git/HEAD + else + echo "abcdefabcdefabcdefabcdefabcdefabcdefabcd" >.git/HEAD + fi ) git init invalid-loose-ref diff --git a/gix-ref/tests/fixtures/make_pseudo_ref_repository.sh b/gix-ref/tests/fixtures/make_pseudo_ref_repository.sh index ef4b3476dae..e981a8985f3 100755 --- a/gix-ref/tests/fixtures/make_pseudo_ref_repository.sh +++ b/gix-ref/tests/fixtures/make_pseudo_ref_repository.sh @@ -8,7 +8,8 @@ git rev-parse HEAD > .git/JIRI_HEAD touch .git/SOME_ALL_CAPS_FILE touch .git/refs/SHOULD_BE_EXCLUDED_HEAD +head_id=$(git rev-parse HEAD) cat <> .git/FETCH_HEAD -9064ea31fae4dc59a56bdd3a06c0ddc990ee689e branch 'main' of https://github.com/Byron/gitoxide -1b8d9e6a408e480ae1912e919c37a26e5c46639d not-for-merge branch 'faster-discovery' of https://github.com/Byron/gitoxide -EOF \ No newline at end of file +$head_id branch 'main' of https://github.com/Byron/gitoxide +$head_id not-for-merge branch 'faster-discovery' of https://github.com/Byron/gitoxide +EOF diff --git a/gix-ref/tests/fixtures/make_ref_repository.sh b/gix-ref/tests/fixtures/make_ref_repository.sh index d89948193fa..c473b7ad6c3 100755 --- a/gix-ref/tests/fixtures/make_ref_repository.sh +++ b/gix-ref/tests/fixtures/make_ref_repository.sh @@ -28,17 +28,18 @@ git rev-parse HEAD > .git/refs/remotes/origin/multi-link-target3 echo "ref: refs/loop-b" > .git/refs/loop-a echo "ref: refs/loop-a" > .git/refs/loop-b +head_id=$(git rev-parse HEAD) cat <> .git/FETCH_HEAD -9064ea31fae4dc59a56bdd3a06c0ddc990ee689e branch 'main' of https://github.com/Byron/gitoxide -1b8d9e6a408e480ae1912e919c37a26e5c46639d not-for-merge branch 'faster-discovery' of https://github.com/Byron/gitoxide -43f695a9607f1f85f859f2ef944b785b5b6dd238 not-for-merge branch 'fix-823' of https://github.com/Byron/gitoxide -96267708958ead2646aae8766a50fa060739003c not-for-merge branch 'fix-bare-with-index' of https://github.com/Byron/gitoxide -1397e19375bb98522f951b8a452b08c1b35ffbac not-for-merge branch 'gix-archive' of https://github.com/Byron/gitoxide -db71ec8b7c7f2730c47dde3bb662ab56ae89ae7d not-for-merge branch 'index-from-files' of https://github.com/Byron/gitoxide -9f0c71917e57653d2e7121eae65d9385a188a8df not-for-merge branch 'moonwalk' of https://github.com/Byron/gitoxide -44d2b67de5639d4ea3d08ab030ecfe4bdfc8cbfb not-for-merge branch 'release-gix' of https://github.com/Byron/gitoxide -37c3d073b15dafcb52b2040e4b92a413c69a726d not-for-merge branch 'smart-release-without-git2' of https://github.com/Byron/gitoxide -af3608ad397784795c3758a1ac99ec6a367de9be not-for-merge branch 'walk-with-commitgraph' of https://github.com/Byron/gitoxide +$head_id branch 'main' of https://github.com/Byron/gitoxide +$head_id not-for-merge branch 'faster-discovery' of https://github.com/Byron/gitoxide +$head_id not-for-merge branch 'fix-823' of https://github.com/Byron/gitoxide +$head_id not-for-merge branch 'fix-bare-with-index' of https://github.com/Byron/gitoxide +$head_id not-for-merge branch 'gix-archive' of https://github.com/Byron/gitoxide +$head_id not-for-merge branch 'index-from-files' of https://github.com/Byron/gitoxide +$head_id not-for-merge branch 'moonwalk' of https://github.com/Byron/gitoxide +$head_id not-for-merge branch 'release-gix' of https://github.com/Byron/gitoxide +$head_id not-for-merge branch 'smart-release-without-git2' of https://github.com/Byron/gitoxide +$head_id not-for-merge branch 'walk-with-commitgraph' of https://github.com/Byron/gitoxide EOF git tag t1 diff --git a/gix-ref/tests/fixtures/make_repo_for_1850_repro.sh b/gix-ref/tests/fixtures/make_repo_for_1850_repro.sh index fee6ec02e81..0778f153eb1 100755 --- a/gix-ref/tests/fixtures/make_repo_for_1850_repro.sh +++ b/gix-ref/tests/fixtures/make_repo_for_1850_repro.sh @@ -2,16 +2,28 @@ set -eu -o pipefail git init -q +hex_len=40 +hash_kind=$(git rev-parse --show-object-format) +if test "$hash_kind" = "sha256"; then + hex_len=64 +fi +oid () { + if test "$hash_kind" = "sha1"; then + printf "%s" "$2" + else + printf "%0.s$1" $(seq 1 "$hex_len") + fi +} cat <.git/packed-refs # pack-refs with: peeled fully-peeled sorted -17dad46c0ce3be4d4b6d45def031437ab2e40666 refs/heads/ig-branch-remote -83a70366fcc1255d35a00102138293bac673b331 refs/heads/ig-inttest -21b57230833a1733f6685e14eabe936a09689a1b refs/heads/ig-pr4021 -d773228d0ee0012fcca53fffe581b0fce0b1dc56 refs/heads/ig/aliases -ba37abe04f91fec76a6b9a817d40ee2daec47207 refs/heads/ig/cifail +$(oid 1 17dad46c0ce3be4d4b6d45def031437ab2e40666) refs/heads/ig-branch-remote +$(oid 2 83a70366fcc1255d35a00102138293bac673b331) refs/heads/ig-inttest +$(oid 3 3333333333333333333333333333333333333333) refs/heads/ig-pr4021 +$(oid 4 d773228d0ee0012fcca53fffe581b0fce0b1dc56) refs/heads/ig/aliases +$(oid 5 ba37abe04f91fec76a6b9a817d40ee2daec47207) refs/heads/ig/cifail EOF mkdir -p .git/refs/heads/ig/pr -echo d22f46f3d7d2504d56c573b5fe54919bd16be48a >.git/refs/heads/ig/push-name -echo 4dec145966c546402c5a9e28b932e7c8c939e01e >.git/refs/heads/ig-pr4021 +oid 6 d22f46f3d7d2504d56c573b5fe54919bd16be48a >.git/refs/heads/ig/push-name +oid 7 4dec145966c546402c5a9e28b932e7c8c939e01e >.git/refs/heads/ig-pr4021 diff --git a/gix-ref/tests/fixtures/make_repo_for_1928_repro.sh b/gix-ref/tests/fixtures/make_repo_for_1928_repro.sh index 445f4107f99..896ded235bf 100755 --- a/gix-ref/tests/fixtures/make_repo_for_1928_repro.sh +++ b/gix-ref/tests/fixtures/make_repo_for_1928_repro.sh @@ -2,16 +2,23 @@ set -eu -o pipefail git init -q +hex_len=40 +if test "$(git rev-parse --show-object-format)" = "sha256"; then + hex_len=64 +fi +oid () { + printf "%0.s$1" $(seq 1 "$hex_len") +} mkdir -p .git/refs/heads/a cat <.git/packed-refs # pack-refs with: peeled fully-peeled sorted -1111111111111111111111111111111111111111 refs/heads/a- -2222222222222222222222222222222222222222 refs/heads/a/b -3333333333333333333333333333333333333333 refs/heads/a0 +$(oid 1) refs/heads/a- +$(oid 2) refs/heads/a/b +$(oid 3) refs/heads/a0 EOF mkdir -p .git/refs/heads/a -echo aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >.git/refs/heads/a- -echo bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb >.git/refs/heads/a/b -echo cccccccccccccccccccccccccccccccccccccccc >.git/refs/heads/a0 +oid a >.git/refs/heads/a- +oid b >.git/refs/heads/a/b +oid c >.git/refs/heads/a0 diff --git a/gix-ref/tests/fixtures/make_worktree_repo.sh b/gix-ref/tests/fixtures/make_worktree_repo.sh index 960869ebb40..24ee285c6f8 100755 --- a/gix-ref/tests/fixtures/make_worktree_repo.sh +++ b/gix-ref/tests/fixtures/make_worktree_repo.sh @@ -19,6 +19,8 @@ git update-ref refs/stacks/common :/c1 git worktree add ../w-detached HEAD~1 +printf "gitdir: ../repo/.git/worktrees/w-detached\n" >../w-detached/.git +printf "../../../../w-detached/.git\n" >.git/worktrees/w-detached/gitdir ( cd ../w-detached git bisect start @@ -28,6 +30,8 @@ git worktree add ../w-detached HEAD~1 ) git worktree add ../w1 +printf "gitdir: ../repo/.git/worktrees/w1\n" >../w1/.git +printf "../../../../w1/.git\n" >.git/worktrees/w1/gitdir ( cd ../w1 git reset --hard HEAD~2 diff --git a/gix-ref/tests/refs/file/log.rs b/gix-ref/tests/refs/file/log.rs index 697d18e2210..2ce20dbf535 100644 --- a/gix-ref/tests/refs/file/log.rs +++ b/gix-ref/tests/refs/file/log.rs @@ -109,7 +109,7 @@ mod iter { mod with_buffer_big_enough_for_largest_line { use gix_ref::log::Line; - use crate::{file::log::iter::reflog, hex_to_id}; + use crate::{file::log::iter::reflog, sha1_hex_to_id}; #[test] fn single_line() -> crate::Result { @@ -129,8 +129,8 @@ mod iter { signature: _, message, } = iter.next().expect("a single line")?; - assert_eq!(previous_oid, hex_to_id("0000000000000000000000000000000000000000")); - assert_eq!(new_oid, hex_to_id("134385f6d781b7e97062102c6a483440bfda2a03")); + assert_eq!(previous_oid, sha1_hex_to_id("0000000000000000000000000000000000000000")); + assert_eq!(new_oid, sha1_hex_to_id("134385f6d781b7e97062102c6a483440bfda2a03")); assert_eq!(message, "commit (initial): c1"); assert!(iter.next().is_none(), "iterator depleted"); } @@ -157,8 +157,8 @@ mod iter { signature: _, message, } = iter.next().expect("a single line")?; - assert_eq!(previous_oid, hex_to_id("0000000000000000000000000000000000000000")); - assert_eq!(new_oid, hex_to_id("134385f6d781b7e97062102c6a483440bfda2a03")); + assert_eq!(previous_oid, sha1_hex_to_id("0000000000000000000000000000000000000000")); + assert_eq!(new_oid, sha1_hex_to_id("134385f6d781b7e97062102c6a483440bfda2a03")); assert_eq!(message, "commit (initial): c1"); let Line { previous_oid, @@ -167,8 +167,8 @@ mod iter { message, } = iter.next().expect("a single line")?; assert_eq!(message, "commit (initial): c2"); - assert_eq!(previous_oid, hex_to_id("1000000000000000000000000000000000000000")); - assert_eq!(new_oid, hex_to_id("234385f6d781b7e97062102c6a483440bfda2a03")); + assert_eq!(previous_oid, sha1_hex_to_id("1000000000000000000000000000000000000000")); + assert_eq!(new_oid, sha1_hex_to_id("234385f6d781b7e97062102c6a483440bfda2a03")); assert!(iter.next().is_none(), "iterator depleted"); } } @@ -197,7 +197,7 @@ mod iter { mod forward { use gix_object::bstr::B; - use crate::file::log::iter::reflog; + use crate::{file::log::iter::reflog, hex_to_id}; #[test] fn all_success() -> crate::Result { @@ -207,8 +207,8 @@ mod iter { let mut iter = gix_ref::file::log::iter::forward(&log); let line = iter.next().unwrap()?; - assert_eq!(line.previous_oid(), gix_hash::Kind::Sha1.null()); - assert_eq!(line.new_oid, B("134385f6d781b7e97062102c6a483440bfda2a03")); + assert_eq!(line.previous_oid(), crate::fixture_hash_kind().null()); + assert_eq!(line.new_oid(), hex_to_id("134385f6d781b7e97062102c6a483440bfda2a03")); assert_eq!(line.message, B("commit (initial): c1")); assert!(iter.all(|l| l.is_ok()), "all lines parse fine"); Ok(()) diff --git a/gix-ref/tests/refs/file/mod.rs b/gix-ref/tests/refs/file/mod.rs index f9087dd3a6b..4dc5a95b275 100644 --- a/gix-ref/tests/refs/file/mod.rs +++ b/gix-ref/tests/refs/file/mod.rs @@ -19,18 +19,36 @@ pub fn store_at(name: &str) -> crate::Result { pub fn named_store_at(script_name: &str, name: &str) -> crate::Result { let path = gix_testtools::scripted_fixture_read_only_standalone(script_name)?; - Ok(Store::at(path.join(name).join(".git"), Default::default())) + Ok(Store::at(path.join(name).join(".git"), store_options())) } pub fn store_at_with_args(name: &str, args: impl IntoIterator>) -> crate::Result { let path = gix_testtools::scripted_fixture_read_only_with_args_standalone(name, args)?; - Ok(Store::at(path.join(".git"), Default::default())) + Ok(Store::at(path.join(".git"), store_options())) } fn store_writable(name: &str) -> crate::Result<(gix_testtools::tempfile::TempDir, Store)> { let dir = gix_testtools::scripted_fixture_writable_standalone(name)?; let git_dir = dir.path().join(".git"); - Ok((dir, Store::at(git_dir, Default::default()))) + Ok((dir, Store::at(git_dir, store_options()))) +} + +pub fn store_options() -> gix_ref::store::init::Options { + gix_ref::store::init::Options { + object_hash: crate::fixture_hash_kind(), + ..Default::default() + } +} + +pub fn odb_at(objects_dir: impl Into) -> std::io::Result { + gix_odb::at_opts( + objects_dir, + Vec::new(), + gix_odb::store::init::Options { + object_hash: crate::fixture_hash_kind(), + ..Default::default() + }, + ) } struct EmptyCommit; diff --git a/gix-ref/tests/refs/file/reference.rs b/gix-ref/tests/refs/file/reference.rs index 62f5b138ced..81f4f08557c 100644 --- a/gix-ref/tests/refs/file/reference.rs +++ b/gix-ref/tests/refs/file/reference.rs @@ -145,7 +145,7 @@ mod peel { "points to a tag object without actual object lookup" ); - let odb = gix_odb::at(store.git_dir().join("objects"))?; + let odb = crate::file::odb_at(store.git_dir().join("objects"))?; let mut r: Reference = store.find_loose("dt1")?.into(); assert_eq!(r.peel_to_id(&store, &odb)?, commit, "points to the commit with lookup"); @@ -156,7 +156,7 @@ mod peel { fn to_id_long_jump() -> crate::Result { for packed in [None, Some("packed")] { let store = file::store_at_with_args("make_multi_hop_ref.sh", packed)?; - let odb = gix_odb::at(store.git_dir().join("objects"))?; + let odb = crate::file::odb_at(store.git_dir().join("objects"))?; let mut r: Reference = store.find("multi-hop")?; r.peel_to_id(&store, &odb)?; @@ -215,8 +215,12 @@ mod parse { #[test] fn $name() { use std::convert::TryInto; - let err = - Reference::try_from_path("HEAD".try_into().expect("this is a valid name"), $input).unwrap_err(); + let err = Reference::try_from_path( + "HEAD".try_into().expect("this is a valid name"), + $input, + gix_hash::Kind::Sha1, + ) + .unwrap_err(); assert_eq!(err.to_string(), $err); } }; @@ -224,20 +228,29 @@ mod parse { mktest!(hex_id, b"foobar", "\"foobar\" could not be parsed"); mktest!(ref_tag, b"reff: hello", "\"reff: hello\" could not be parsed"); + mktest!( + sha256_sized_id_for_sha1, + b"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n", + "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\n\" could not be parsed" + ); } mod valid { use gix_object::bstr::ByteSlice; use gix_ref::file::loose::Reference; - use crate::hex_to_id; + use crate::sha1_hex_to_id; macro_rules! mktest { ($name:ident, $input:literal, $kind:path, $id:expr, $ref:expr) => { #[test] fn $name() { use std::convert::TryInto; - let reference = - Reference::try_from_path("HEAD".try_into().expect("valid static name"), $input).unwrap(); + let reference = Reference::try_from_path( + "HEAD".try_into().expect("valid static name"), + $input, + gix_hash::Kind::Sha1, + ) + .unwrap(); assert_eq!(reference.kind(), $kind); assert_eq!(reference.target.to_ref().try_id(), $id); assert_eq!( @@ -252,7 +265,7 @@ mod parse { peeled, b"c5241b835b93af497cda80ce0dceb8f49800df1c\n", gix_ref::Kind::Object, - Some(hex_to_id("c5241b835b93af497cda80ce0dceb8f49800df1c").as_ref()), + Some(sha1_hex_to_id("c5241b835b93af497cda80ce0dceb8f49800df1c").as_ref()), None ); @@ -260,7 +273,7 @@ mod parse { peeled_uppercase, b"C5241B835B93AF497CDA80CE0DCEB8F49800DF1C\n", gix_ref::Kind::Object, - Some(hex_to_id("c5241b835b93af497cda80ce0dceb8f49800df1c").as_ref()), + Some(sha1_hex_to_id("c5241b835b93af497cda80ce0dceb8f49800df1c").as_ref()), None ); @@ -279,5 +292,22 @@ mod parse { None, Some(b"refs/foobar".as_bstr()) ); + + #[test] + fn peeled_sha256() { + use std::convert::TryInto; + + let input = &b"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"[..]; + let reference = Reference::try_from_path( + "HEAD".try_into().expect("valid static name"), + input, + gix_hash::Kind::Sha256, + ) + .unwrap(); + assert_eq!(reference.kind(), gix_ref::Kind::Object); + let target_id = reference.target.to_ref().try_id().expect("non-symbolic").to_owned(); + assert_eq!(target_id.kind(), gix_hash::Kind::Sha256); + assert_eq!(target_id, gix_hash::ObjectId::from_hex(input).unwrap()); + } } } diff --git a/gix-ref/tests/refs/file/store/find.rs b/gix-ref/tests/refs/file/store/find.rs index 2ecd52cddd9..51ea5472ab4 100644 --- a/gix-ref/tests/refs/file/store/find.rs +++ b/gix-ref/tests/refs/file/store/find.rs @@ -145,7 +145,7 @@ mod loose { let store = store()?; assert_eq!( store.find_loose("FETCH_HEAD")?.target.id(), - hex_to_id("9064ea31fae4dc59a56bdd3a06c0ddc990ee689e"), + hex_to_id("134385f6d781b7e97062102c6a483440bfda2a03"), "despite being special, we are able to read the first commit out of a typical FETCH_HEAD" ); Ok(()) diff --git a/gix-ref/tests/refs/file/store/iter.rs b/gix-ref/tests/refs/file/store/iter.rs index 91639672e6e..7067fb48699 100644 --- a/gix-ref/tests/refs/file/store/iter.rs +++ b/gix-ref/tests/refs/file/store/iter.rs @@ -448,46 +448,89 @@ fn overlay_iter_reproduce_1850() -> crate::Result { .all()? .map(|r| r.map(|r| (r.name.as_bstr().to_owned(), r.target))) .collect::, _>>()?; - insta::assert_debug_snapshot!(ref_names, @r#" - [ - ( - "refs/heads/ig-branch-remote", - Object( - Sha1(17dad46c0ce3be4d4b6d45def031437ab2e40666), + if crate::fixture_hash_kind() != gix_hash::Kind::Sha1 { + insta::assert_debug_snapshot!(ref_names, @r#" + [ + ( + "refs/heads/ig-branch-remote", + Object( + Sha256(1111111111111111111111111111111111111111111111111111111111111111), + ), ), - ), - ( - "refs/heads/ig-inttest", - Object( - Sha1(83a70366fcc1255d35a00102138293bac673b331), + ( + "refs/heads/ig-inttest", + Object( + Sha256(2222222222222222222222222222222222222222222222222222222222222222), + ), ), - ), - ( - "refs/heads/ig-pr4021", - Object( - Sha1(4dec145966c546402c5a9e28b932e7c8c939e01e), + ( + "refs/heads/ig-pr4021", + Object( + Sha256(7777777777777777777777777777777777777777777777777777777777777777), + ), ), - ), - ( - "refs/heads/ig/aliases", - Object( - Sha1(d773228d0ee0012fcca53fffe581b0fce0b1dc56), + ( + "refs/heads/ig/aliases", + Object( + Sha256(4444444444444444444444444444444444444444444444444444444444444444), + ), ), - ), - ( - "refs/heads/ig/cifail", - Object( - Sha1(ba37abe04f91fec76a6b9a817d40ee2daec47207), + ( + "refs/heads/ig/cifail", + Object( + Sha256(5555555555555555555555555555555555555555555555555555555555555555), + ), ), - ), - ( - "refs/heads/ig/push-name", - Object( - Sha1(d22f46f3d7d2504d56c573b5fe54919bd16be48a), + ( + "refs/heads/ig/push-name", + Object( + Sha256(6666666666666666666666666666666666666666666666666666666666666666), + ), ), - ), - ] - "#); + ] + "#); + } else { + insta::assert_debug_snapshot!(ref_names, @r#" + [ + ( + "refs/heads/ig-branch-remote", + Object( + Sha1(17dad46c0ce3be4d4b6d45def031437ab2e40666), + ), + ), + ( + "refs/heads/ig-inttest", + Object( + Sha1(83a70366fcc1255d35a00102138293bac673b331), + ), + ), + ( + "refs/heads/ig-pr4021", + Object( + Sha1(4dec145966c546402c5a9e28b932e7c8c939e01e), + ), + ), + ( + "refs/heads/ig/aliases", + Object( + Sha1(d773228d0ee0012fcca53fffe581b0fce0b1dc56), + ), + ), + ( + "refs/heads/ig/cifail", + Object( + Sha1(ba37abe04f91fec76a6b9a817d40ee2daec47207), + ), + ), + ( + "refs/heads/ig/push-name", + Object( + Sha1(d22f46f3d7d2504d56c573b5fe54919bd16be48a), + ), + ), + ] + "#); + } Ok(()) } @@ -499,6 +542,13 @@ fn overlay_iter_reproduce_1928() -> crate::Result { .all()? .map(|r| r.map(|r| (r.name.as_bstr().to_owned(), r.target))) .collect::, _>>()?; + if crate::fixture_hash_kind() != gix_hash::Kind::Sha1 { + assert_eq!( + ref_names.iter().map(|(name, _)| name.to_string()).collect::>(), + vec!["refs/heads/a-", "refs/heads/a/b", "refs/heads/a0"] + ); + return Ok(()); + } insta::assert_debug_snapshot!(ref_names, @r#" [ ( diff --git a/gix-ref/tests/refs/file/store/mod.rs b/gix-ref/tests/refs/file/store/mod.rs index 7262038e7ae..549d1d2ff22 100644 --- a/gix-ref/tests/refs/file/store/mod.rs +++ b/gix-ref/tests/refs/file/store/mod.rs @@ -29,6 +29,7 @@ fn precompose_unicode_journey() -> crate::Result { root, gix_ref::store::init::Options { write_reflog: WriteReflog::Always, + object_hash: crate::fixture_hash_kind(), precompose_unicode: false, ..Default::default() }, @@ -57,6 +58,7 @@ fn precompose_unicode_journey() -> crate::Result { tmp.path().join(precomposed_a), // it's important that root paths are also precomposed then. gix_ref::store::init::Options { write_reflog: WriteReflog::Always, + object_hash: crate::fixture_hash_kind(), precompose_unicode: true, ..Default::default() }, diff --git a/gix-ref/tests/refs/file/store/reflog.rs b/gix-ref/tests/refs/file/store/reflog.rs index a0a2ad3b124..e47808522f5 100644 --- a/gix-ref/tests/refs/file/store/reflog.rs +++ b/gix-ref/tests/refs/file/store/reflog.rs @@ -3,6 +3,7 @@ fn store() -> crate::Result { gix_testtools::scripted_fixture_read_only_standalone("make_repo_for_reflog.sh")?.join(".git"), gix_ref::store::init::Options { write_reflog: gix_ref::store::WriteReflog::Disable, + object_hash: crate::fixture_hash_kind(), ..Default::default() }, )) diff --git a/gix-ref/tests/refs/file/transaction/mod.rs b/gix-ref/tests/refs/file/transaction/mod.rs index efb719f6534..85f3fd362fa 100644 --- a/gix-ref/tests/refs/file/transaction/mod.rs +++ b/gix-ref/tests/refs/file/transaction/mod.rs @@ -21,7 +21,7 @@ pub(crate) mod prepare_and_commit { pub(crate) fn empty_store() -> crate::Result<(gix_testtools::tempfile::TempDir, file::Store)> { let dir = gix_testtools::tempfile::TempDir::new().unwrap(); - let store = file::Store::at(dir.path().into(), Default::default()); + let store = file::Store::at(dir.path().into(), crate::file::store_options()); Ok((dir, store)) } diff --git a/gix-ref/tests/refs/file/transaction/prepare_and_commit/create_or_update/collisions.rs b/gix-ref/tests/refs/file/transaction/prepare_and_commit/create_or_update/collisions.rs index 4bfd3ca9d60..bdb1a8cc1e2 100644 --- a/gix-ref/tests/refs/file/transaction/prepare_and_commit/create_or_update/collisions.rs +++ b/gix-ref/tests/refs/file/transaction/prepare_and_commit/create_or_update/collisions.rs @@ -119,6 +119,7 @@ fn conflicting_creation_into_packed_refs() -> crate::Result { // The following works because locks aren't actually obtained if there would be no change. // Otherwise there would be a conflict on case-insensitive filesystems + let null = crate::fixture_hash_kind().null(); store .transaction() .packed_refs(PackedRefs::DeletionsAndNonSymbolicUpdatesRemoveLooseSourceReference( @@ -130,7 +131,7 @@ fn conflicting_creation_into_packed_refs() -> crate::Result { change: Change::Update { log: LogChange::default(), expected: PreviousValue::Any, - new: Target::Object(gix_hash::Kind::Sha1.null()), + new: Target::Object(null), }, name: "refs/a".try_into().expect("valid"), deref: false, @@ -141,7 +142,7 @@ fn conflicting_creation_into_packed_refs() -> crate::Result { expected: PreviousValue::MustExistAndMatch(Target::Object(hex_to_id( "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", ))), - new: Target::Object(gix_hash::Kind::Sha1.null()), + new: Target::Object(null), }, name: "refs/A".try_into().expect("valid"), deref: false, diff --git a/gix-ref/tests/refs/file/transaction/prepare_and_commit/create_or_update/mod.rs b/gix-ref/tests/refs/file/transaction/prepare_and_commit/create_or_update/mod.rs index a803c481eab..c1faa0b8f1d 100644 --- a/gix-ref/tests/refs/file/transaction/prepare_and_commit/create_or_update/mod.rs +++ b/gix-ref/tests/refs/file/transaction/prepare_and_commit/create_or_update/mod.rs @@ -109,7 +109,7 @@ fn reference_with_equally_named_empty_or_non_empty_directory_already_in_place_ca fn reference_with_old_value_must_exist_when_creating_it() -> crate::Result { let (_keep, store) = empty_store()?; - let new_target = Target::Object(gix_hash::Kind::Sha1.null()); + let new_target = Target::Object(crate::fixture_hash_kind().null()); let res = store.transaction().prepare( Some(RefEdit { change: Change::Update { @@ -144,7 +144,7 @@ fn reference_with_explicit_value_must_match_the_value_on_update() -> crate::Resu Some(RefEdit { change: Change::Update { log: LogChange::default(), - new: Target::Object(gix_hash::Kind::Sha1.null()), + new: Target::Object(crate::fixture_hash_kind().null()), expected: PreviousValue::MustExistAndMatch(Target::Object(hex_to_id( "28ce6a8b26aa170e1de65536fe8abe1832bd3242", ))), @@ -168,7 +168,7 @@ fn reference_with_explicit_value_must_match_the_value_on_update() -> crate::Resu #[test] fn the_existing_must_match_constraint_allow_non_existing_references_to_be_created() -> crate::Result { let (_keep, store) = store_writable("make_repo_for_reflog.sh")?; - let expected = PreviousValue::ExistingMustMatch(Target::Object(ObjectId::empty_tree(gix_hash::Kind::Sha1))); + let expected = PreviousValue::ExistingMustMatch(Target::Object(ObjectId::empty_tree(crate::fixture_hash_kind()))); let mut buf = TimeBuf::default(); let edits = store .transaction() @@ -176,7 +176,7 @@ fn the_existing_must_match_constraint_allow_non_existing_references_to_be_create Some(RefEdit { change: Change::Update { log: LogChange::default(), - new: Target::Object(gix_hash::Kind::Sha1.null()), + new: Target::Object(crate::fixture_hash_kind().null()), expected: expected.clone(), }, name: "refs/heads/new".try_into()?, @@ -192,7 +192,7 @@ fn the_existing_must_match_constraint_allow_non_existing_references_to_be_create vec![RefEdit { change: Change::Update { log: LogChange::default(), - new: Target::Object(gix_hash::Kind::Sha1.null()), + new: Target::Object(crate::fixture_hash_kind().null()), expected, }, name: "refs/heads/new".try_into()?, @@ -213,7 +213,7 @@ fn the_existing_must_match_constraint_requires_existing_references_to_have_the_g Some(RefEdit { change: Change::Update { log: LogChange::default(), - new: Target::Object(gix_hash::Kind::Sha1.null()), + new: Target::Object(crate::fixture_hash_kind().null()), expected: PreviousValue::ExistingMustMatch(Target::Object(hex_to_id( "28ce6a8b26aa170e1de65536fe8abe1832bd3242", ))), @@ -277,7 +277,7 @@ fn reference_with_must_exist_constraint_must_exist_already_with_any_value() -> c let target = head.target; let previous_reflog_count = reflog_lines(&store, "HEAD")?.len(); - let new_target = Target::Object(ObjectId::empty_tree(gix_hash::Kind::Sha1)); + let new_target = Target::Object(ObjectId::empty_tree(crate::fixture_hash_kind())); let edits = store .transaction() .prepare( @@ -630,7 +630,7 @@ fn symbolic_head_missing_referent_then_update_referent() -> crate::Result { for ref_name in &["HEAD", referent] { match reflog_writemode { WriteReflog::Normal | WriteReflog::Always => { - let expected_line = log_line(gix_hash::Kind::Sha1.null(), new_oid, "an actual change"); + let expected_line = log_line(crate::fixture_hash_kind().null(), new_oid, "an actual change"); assert_eq!(reflog_lines(&store, ref_name)?, vec![expected_line]); } WriteReflog::Disable => { @@ -775,7 +775,7 @@ fn packed_refs_creation_with_packed_refs_mode_prune_removes_original_loose_refs( store.open_packed_buffer()?.is_none(), "there should be no packed refs to start out with" ); - let odb = gix_odb::at(store.git_dir().join("objects"))?; + let odb = crate::file::odb_at(store.git_dir().join("objects"))?; let edits = store .transaction() .packed_refs(PackedRefs::DeletionsAndNonSymbolicUpdatesRemoveLooseSourceReference( @@ -889,7 +889,7 @@ fn packed_refs_deletion_in_deletions_and_updates_mode() -> crate::Result { store.try_find_loose("refs/heads/d1")?.is_none(), "no loose d1 available, it's packed" ); - let odb = gix_odb::at(store.git_dir().join("objects"))?; + let odb = crate::file::odb_at(store.git_dir().join("objects"))?; let old_id = hex_to_id("134385f6d781b7e97062102c6a483440bfda2a03"); let edits = store .transaction() diff --git a/gix-ref/tests/refs/file/transaction/prepare_and_commit/delete.rs b/gix-ref/tests/refs/file/transaction/prepare_and_commit/delete.rs index bb9f1c801da..ffcd6a93bc5 100644 --- a/gix-ref/tests/refs/file/transaction/prepare_and_commit/delete.rs +++ b/gix-ref/tests/refs/file/transaction/prepare_and_commit/delete.rs @@ -127,7 +127,13 @@ fn delete_ref_with_incorrect_previous_value_fails() -> crate::Result { match res { Err(err) => { - assert_eq!(err.to_string(), "The reference \"refs/heads/main\" should have content ref: refs/heads/main, actual content was 02a7a22d90d7c02fb494ed25551850b868e634f0"); + assert_eq!( + err.to_string(), + format!( + "The reference \"refs/heads/main\" should have content ref: refs/heads/main, actual content was {}", + hex_to_id("02a7a22d90d7c02fb494ed25551850b868e634f0") + ) + ); } Ok(_) => unreachable!("must be err"), } diff --git a/gix-ref/tests/refs/file/worktree.rs b/gix-ref/tests/refs/file/worktree.rs index 468fcbfebb9..f90550281f1 100644 --- a/gix-ref/tests/refs/file/worktree.rs +++ b/gix-ref/tests/refs/file/worktree.rs @@ -29,8 +29,8 @@ fn main_store( let (dir, tmp) = dir(packed, writable)?; let git_dir = dir.join("repo").join(".git"); Ok(( - gix_ref::file::Store::at(git_dir.clone(), Default::default()), - gix_odb::at(git_dir.join("objects"))?, + gix_ref::file::Store::at(git_dir.clone(), crate::file::store_options()), + crate::file::odb_at(git_dir.join("objects"))?, tmp, )) } @@ -50,8 +50,8 @@ fn worktree_store( .into_repository_and_work_tree_directories(); let common_dir = git_dir.join("../.."); Ok(( - gix_ref::file::Store::for_linked_worktree(git_dir, common_dir.clone(), Default::default()), - gix_odb::at(common_dir.join("objects"))?, + gix_ref::file::Store::for_linked_worktree(git_dir, common_dir.clone(), crate::file::store_options()), + crate::file::odb_at(common_dir.join("objects"))?, tmp, )) } @@ -68,6 +68,10 @@ enum Mode { Write, } +fn oid(hex: &str) -> String { + crate::hex_to_id(hex).to_string() +} + impl From for bool { fn from(v: Mode) -> Self { match v { @@ -202,7 +206,7 @@ mod writable { use crate::{ file::{ transaction::prepare_and_commit::committer, - worktree::{main_store, worktree_store, Mode}, + worktree::{main_store, oid, worktree_store, Mode}, EmptyCommit, }, hex_to_id, @@ -218,10 +222,10 @@ mod writable { #[test] fn main() -> crate::Result { - let new_id_main_str = "11111111111111111162102c6a483440bfda2a03"; - let new_id_main = hex_to_id(new_id_main_str); - let new_id_linked_str = "22222222222222222262102c6a483440bfda2a03"; - let new_id_linked = hex_to_id(new_id_linked_str); + let new_id_main = hex_to_id("11111111111111111162102c6a483440bfda2a03"); + let new_id_main_str = new_id_main.to_string(); + let new_id_linked = hex_to_id("22222222222222222262102c6a483440bfda2a03"); + let new_id_linked_str = new_id_linked.to_string(); for packed in [false, true] { let (store, _odb, _tmp) = main_store(packed, Mode::Write)?; @@ -273,20 +277,23 @@ mod writable { .map(|r| (r.name.to_string(), r.target.to_string())) .collect::>(), [ - ("refs/bisect/bad", "9556057aee5abb06912922e9f26c46386a816822"), - ("refs/bisect/good", new_id_main_str), - ("refs/heads/main", "9556057aee5abb06912922e9f26c46386a816822"), - ("refs/heads/new", new_id_main_str), - ("refs/heads/shared", new_id_linked_str), - ("refs/heads/w1", "9902e3c3e8f0c569b4ab295ddf473e6de763e1e7"), - ("refs/stacks/common", "134385f6d781b7e97062102c6a483440bfda2a03"), - ("refs/stacks/w1", "17d78c64cef6c33a10a604573fd2c429e477fd63"), - ("refs/stacks/wtdetached", "9902e3c3e8f0c569b4ab295ddf473e6de763e1e7"), - ("refs/tags/dt1", "d3ba65e5e3be5cdd7210da9998307a4762999cc5"), - ("refs/tags/t1", "9556057aee5abb06912922e9f26c46386a816822") + ("refs/bisect/bad", oid("9556057aee5abb06912922e9f26c46386a816822")), + ("refs/bisect/good", new_id_main_str.clone()), + ("refs/heads/main", oid("9556057aee5abb06912922e9f26c46386a816822")), + ("refs/heads/new", new_id_main_str.clone()), + ("refs/heads/shared", new_id_linked_str.clone()), + ("refs/heads/w1", oid("9902e3c3e8f0c569b4ab295ddf473e6de763e1e7")), + ("refs/stacks/common", oid("134385f6d781b7e97062102c6a483440bfda2a03")), + ("refs/stacks/w1", oid("17d78c64cef6c33a10a604573fd2c429e477fd63")), + ( + "refs/stacks/wtdetached", + oid("9902e3c3e8f0c569b4ab295ddf473e6de763e1e7") + ), + ("refs/tags/dt1", oid("d3ba65e5e3be5cdd7210da9998307a4762999cc5")), + ("refs/tags/t1", oid("9556057aee5abb06912922e9f26c46386a816822")) ] .iter() - .map(|(a, b)| (a.to_string(), b.to_string())) + .map(|(a, b)| (a.to_string(), b.clone())) .collect::>(), "we traverse only refs of the main worktree" ); @@ -298,12 +305,15 @@ mod writable { .map(|r| (r.name.to_string(), r.target.to_string())) .collect::>(), [ - ("refs/stacks/common", "134385f6d781b7e97062102c6a483440bfda2a03"), - ("refs/stacks/w1", "17d78c64cef6c33a10a604573fd2c429e477fd63"), - ("refs/stacks/wtdetached", "9902e3c3e8f0c569b4ab295ddf473e6de763e1e7"), + ("refs/stacks/common", oid("134385f6d781b7e97062102c6a483440bfda2a03")), + ("refs/stacks/w1", oid("17d78c64cef6c33a10a604573fd2c429e477fd63")), + ( + "refs/stacks/wtdetached", + oid("9902e3c3e8f0c569b4ab295ddf473e6de763e1e7") + ), ] .iter() - .map(|(a, b)| (a.to_string(), b.to_string())) + .map(|(a, b)| (a.to_string(), b.clone())) .collect::>(), ); @@ -476,10 +486,10 @@ mod writable { #[test] fn linked() -> crate::Result { - let new_id_str = "134385f6d781b7e97062102c6a483440bfda2a03"; - let new_id = hex_to_id(new_id_str); - let new_id_main_str = "22222222222222227062102c6a483440bfda2a03"; - let new_id_main = hex_to_id(new_id_main_str); + let new_id = hex_to_id("134385f6d781b7e97062102c6a483440bfda2a03"); + let new_id_str = new_id.to_string(); + let new_id_main = hex_to_id("22222222222222227062102c6a483440bfda2a03"); + let new_id_main_str = new_id_main.to_string(); for packed in [false, true] { let (store, _odb, _tmp) = worktree_store(packed, "w1", Mode::Write)?; @@ -553,21 +563,24 @@ mod writable { .map(|r| (r.name.to_string(), r.target.to_string())) .collect::>(), [ - ("refs/bisect/bad", "9902e3c3e8f0c569b4ab295ddf473e6de763e1e7"), - ("refs/bisect/good", new_id_str), - ("refs/heads/main", "9556057aee5abb06912922e9f26c46386a816822"), - ("refs/heads/new", new_id_main_str), - ("refs/heads/shared", new_id_str), - ("refs/heads/w1", "9902e3c3e8f0c569b4ab295ddf473e6de763e1e7"), - ("refs/stacks/common", "134385f6d781b7e97062102c6a483440bfda2a03"), - ("refs/stacks/w1", "17d78c64cef6c33a10a604573fd2c429e477fd63"), - ("refs/stacks/wtdetached", "9902e3c3e8f0c569b4ab295ddf473e6de763e1e7"), - ("refs/tags/dt1", "d3ba65e5e3be5cdd7210da9998307a4762999cc5"), - ("refs/tags/t1", "9556057aee5abb06912922e9f26c46386a816822"), - ("refs/worktree/private", new_id_str) + ("refs/bisect/bad", oid("9902e3c3e8f0c569b4ab295ddf473e6de763e1e7")), + ("refs/bisect/good", new_id_str.clone()), + ("refs/heads/main", oid("9556057aee5abb06912922e9f26c46386a816822")), + ("refs/heads/new", new_id_main_str.clone()), + ("refs/heads/shared", new_id_str.clone()), + ("refs/heads/w1", oid("9902e3c3e8f0c569b4ab295ddf473e6de763e1e7")), + ("refs/stacks/common", oid("134385f6d781b7e97062102c6a483440bfda2a03")), + ("refs/stacks/w1", oid("17d78c64cef6c33a10a604573fd2c429e477fd63")), + ( + "refs/stacks/wtdetached", + oid("9902e3c3e8f0c569b4ab295ddf473e6de763e1e7") + ), + ("refs/tags/dt1", oid("d3ba65e5e3be5cdd7210da9998307a4762999cc5")), + ("refs/tags/t1", oid("9556057aee5abb06912922e9f26c46386a816822")), + ("refs/worktree/private", new_id_str.clone()) ] .iter() - .map(|(a, b)| (a.to_string(), b.to_string())) + .map(|(a, b)| (a.to_string(), b.clone())) .collect::>(), "we traverse only refs of the main worktree" ); @@ -579,12 +592,15 @@ mod writable { .map(|r| (r.name.to_string(), r.target.to_string())) .collect::>(), [ - ("refs/stacks/common", "134385f6d781b7e97062102c6a483440bfda2a03"), - ("refs/stacks/w1", "17d78c64cef6c33a10a604573fd2c429e477fd63"), - ("refs/stacks/wtdetached", "9902e3c3e8f0c569b4ab295ddf473e6de763e1e7"), + ("refs/stacks/common", oid("134385f6d781b7e97062102c6a483440bfda2a03")), + ("refs/stacks/w1", oid("17d78c64cef6c33a10a604573fd2c429e477fd63")), + ( + "refs/stacks/wtdetached", + oid("9902e3c3e8f0c569b4ab295ddf473e6de763e1e7") + ), ] .iter() - .map(|(a, b)| (a.to_string(), b.to_string())) + .map(|(a, b)| (a.to_string(), b.clone())) .collect::>(), ); diff --git a/gix-ref/tests/refs/main.rs b/gix-ref/tests/refs/main.rs index 7ec1b16c266..f97bf0c2ff2 100644 --- a/gix-ref/tests/refs/main.rs +++ b/gix-ref/tests/refs/main.rs @@ -1,9 +1,62 @@ use gix_hash::ObjectId; pub fn hex_to_id(hex: &str) -> ObjectId { + match fixture_hash_kind() { + gix_hash::Kind::Sha1 => ObjectId::from_hex(hex.as_bytes()).expect("40 bytes hex"), + gix_hash::Kind::Sha256 => { + ObjectId::from_hex(translate_sha1_to_fixture_sha256(hex).as_bytes()).expect("64 bytes hex") + } + _ => unreachable!("tests only support known hash kinds"), + } +} + +pub fn sha1_hex_to_id(hex: &str) -> ObjectId { ObjectId::from_hex(hex.as_bytes()).expect("40 bytes hex") } +pub fn fixture_hash_kind() -> gix_hash::Kind { + gix_testtools::hash_kind_from_env().unwrap_or_default() +} + +fn translate_sha1_to_fixture_sha256(hex: &str) -> String { + match hex { + "0000000000000000000000000000000000000000" => { + "0000000000000000000000000000000000000000000000000000000000000000".into() + } + "134385f6d781b7e97062102c6a483440bfda2a03" => { + "5c4c31e0551f0d1fb410b7b9366604b050ea3388b96885063f10ba4c3e2dedd0".into() + } + "4c3f4cce493d7beb45012e478021b5f65295e5a3" => { + "2c309d047b92197ef711ba55ab652c42d36750d6571a3e024a7325e324be3033".into() + } + "9902e3c3e8f0c569b4ab295ddf473e6de763e1e7" => { + "bbaf9640a7404a15394dae2606c5090cb44a722be2167d9d78485779aaf4e065".into() + } + "17d78c64cef6c33a10a604573fd2c429e477fd63" => { + "e47e1df5636110feefb5b858c346dbd1c0feebfc37651a238ec5a6300ed2f666".into() + } + "9556057aee5abb06912922e9f26c46386a816822" => { + "9a3e230fc8479e41397b78b9295510e38be525ec05a08c1ceb797547dc93ed4c".into() + } + "d3ba65e5e3be5cdd7210da9998307a4762999cc5" => { + "8aa62135237b610c0e58159f0a0d7a763371ed72dc046dfda6baf1a30ab8511a".into() + } + "b3109a7e51fc593f85b145a76c70ddd1d133fafd" => { + "1ce70f5e127ba939d70e3b1643213b1dbb0dfedc3079f57a73b2d18cd6cc8a02".into() + } + "02a7a22d90d7c02fb494ed25551850b868e634f0" => { + "c87659e8e5d86a499a88a3869342d1367b918aab9675577571fbc2d2ea2a24b8".into() + } + "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391" => gix_hash::Kind::Sha256.empty_blob().to_string(), + other => { + let oid = ObjectId::from_hex(other.as_bytes()).expect("40 bytes hex"); + let mut hasher = gix_hash::hasher(gix_hash::Kind::Sha256); + hasher.update(oid.as_bytes()); + hasher.try_finalize().expect("sha256 hashing works").to_string() + } + } +} + pub use gix_testtools::Result; mod file; diff --git a/gix-ref/tests/refs/packed/find.rs b/gix-ref/tests/refs/packed/find.rs index 1502b58f06c..31b4aabb132 100644 --- a/gix-ref/tests/refs/packed/find.rs +++ b/gix-ref/tests/refs/packed/find.rs @@ -3,9 +3,12 @@ use gix_testtools::fixture_path_standalone; use crate::{ file::{store_at, store_with_packed_refs}, + hex_to_id, packed::write_packed_refs_with, }; +const HASH_KIND: gix_hash::Kind = gix_hash::Kind::Sha1; + #[test] fn a_lock_file_would_not_be_a_valid_partial_name() { // doesn't really belong here but want to make sure refname validation works as expected. @@ -47,6 +50,7 @@ fn binary_search_a_name_past_the_end_of_the_packed_refs_file() -> crate::Result let packed_refs = packed::Buffer::open( fixture_path_standalone("packed-refs").join("triggers-out-of-bounds"), 32, + HASH_KIND, )?; assert!(packed_refs.try_find("v0.0.1")?.is_none()); Ok(()) @@ -61,7 +65,7 @@ c4cebba92af964f2d126be90b8a6298c4cf84d45 refs/tags/gix-actor-v0.1.0 0b92c8a256ae06c189e3b9c30b646d62ac8f7d10 refs/tags/gix-actor-v0.1.1\n"; let (_keep, path) = write_packed_refs_with(packed_refs)?; - let buf = packed::Buffer::open(path, 1024)?; + let buf = packed::Buffer::open(path, 1024, HASH_KIND)?; let name = "refs/tags/TEST-0.0.1"; assert_eq!( buf.try_find(name)?.expect("reference exists"), @@ -140,12 +144,14 @@ fn partial_name_to_full_name_conversion_rules_are_applied() -> crate::Result { "refs/remotes/origin/main", "more specification is possible, too" ); + let target = hex_to_id("b3109a7e51fc593f85b145a76c70ddd1d133fafd").to_string(); + let object = hex_to_id("134385f6d781b7e97062102c6a483440bfda2a03").to_string(); assert_eq!( packed.try_find("tag-object")?.expect("present"), packed::Reference { name: "refs/tags/tag-object".try_into()?, - target: "b3109a7e51fc593f85b145a76c70ddd1d133fafd".into(), - object: Some("134385f6d781b7e97062102c6a483440bfda2a03".into()) + target: target.as_str().into(), + object: Some(object.as_str().into()) }, "tag objects aren't special, but lets test a little more" ); @@ -161,7 +167,7 @@ bogus refs/tags/gix-actor-v0.1.0 0b92c8a256ae06c189e3b9c30b646d62ac8f7d10 refs/tags/gix-actor-v0.1.1\n"; let (_keep, path) = write_packed_refs_with(broken_packed_refs)?; - let buf = packed::Buffer::open(path, 1024)?; + let buf = packed::Buffer::open(path, 1024, HASH_KIND)?; let name = "refs/tags/gix-actor-v0.1.1"; assert_eq!( diff --git a/gix-ref/tests/refs/packed/iter.rs b/gix-ref/tests/refs/packed/iter.rs index 78db809721a..aaa5db53b06 100644 --- a/gix-ref/tests/refs/packed/iter.rs +++ b/gix-ref/tests/refs/packed/iter.rs @@ -3,10 +3,12 @@ use gix_ref::packed; use crate::file::{store_at, store_with_packed_refs}; +const HASH_KIND: gix_hash::Kind = gix_hash::Kind::Sha1; + #[test] fn empty() -> crate::Result { assert_eq!( - packed::Iter::new(&[])?.count(), + packed::Iter::new(&[], HASH_KIND)?.count(), 0, "empty buffers are fine and lead to no line returned" ); @@ -17,7 +19,7 @@ fn empty() -> crate::Result { fn packed_refs_with_header() -> crate::Result { let dir = gix_testtools::scripted_fixture_read_only_standalone("make_packed_ref_repository.sh")?; let buf = std::fs::read(dir.join(".git").join("packed-refs"))?; - let iter = packed::Iter::new(&buf)?; + let iter = packed::Iter::new(&buf, crate::fixture_hash_kind())?; assert_eq!(iter.count(), 11, "it finds the right amount of items"); Ok(()) } @@ -86,7 +88,7 @@ c4cebba92af964f2d126be90b8a6298c4cf84d45 refs/tags/gix-actor-v0.1.0 ^13da90b54699a6b500ec5cd7d175f2cd5a1bed06 0b92c8a256ae06c189e3b9c30b646d62ac8f7d10 refs/tags/gix-actor-v0.1.1\n"; assert_eq!( - packed::Iter::new(packed_refs)?.collect::, _>>()?, + packed::Iter::new(packed_refs, HASH_KIND)?.collect::, _>>()?, vec![ packed::Reference { name: "refs/tags/TEST-0.0.1".try_into()?, @@ -114,7 +116,7 @@ fn broken_ref_doesnt_end_the_iteration() -> crate::Result { buggy-hash refs/wrong ^buggy-hash-too 0b92c8a256ae06c189e3b9c30b646d62ac8f7d10 refs/tags/gix-actor-v0.1.1\n"; - let mut iter = packed::Iter::new(packed_refs)?; + let mut iter = packed::Iter::new(packed_refs, HASH_KIND)?; assert!(iter.next().expect("first ref").is_ok(), "first line is valid"); assert_eq!( diff --git a/gix-ref/tests/refs/packed/open.rs b/gix-ref/tests/refs/packed/open.rs index 6371294f96d..f1dc4846301 100644 --- a/gix-ref/tests/refs/packed/open.rs +++ b/gix-ref/tests/refs/packed/open.rs @@ -4,6 +4,8 @@ use gix_testtools::fixture_path_standalone; use crate::{file::store_with_packed_refs, packed::write_packed_refs_with}; +const HASH_KIND: gix_hash::Kind = gix_hash::Kind::Sha1; + #[test] fn sorted_buffer_works() { let store = store_with_packed_refs().unwrap(); @@ -13,7 +15,7 @@ fn sorted_buffer_works() { #[test] fn empty_buffers_should_not_exist_but_are_fine_to_open() -> crate::Result { let (_keep, path) = write_packed_refs_with(&[])?; - assert_eq!(gix_ref::packed::Buffer::open(path, 512)?.iter()?.count(), 0); + assert_eq!(gix_ref::packed::Buffer::open(path, 512, HASH_KIND)?.iter()?.count(), 0); Ok(()) } @@ -23,6 +25,7 @@ fn unsorted_buffers_or_those_without_a_header_can_be_opened_and_searched() { let buffer = gix_ref::packed::Buffer::open( fixture_path_standalone(Path::new("packed-refs").join(fixture).to_str().expect("utf8")), cutoff, + HASH_KIND, ) .unwrap(); for packed_ref in buffer.iter().unwrap().map(Result::unwrap) { @@ -42,7 +45,7 @@ fn bogus_content_triggers_an_error() -> crate::Result { let packed_refs_data = b"starts with a bogus record, not a header anyway"; let (_keep, path) = write_packed_refs_with(packed_refs_data)?; - match gix_ref::packed::Buffer::open(path, 32) { + match gix_ref::packed::Buffer::open(path, 32, HASH_KIND) { Ok(_) => unreachable!("unsorted buffers can't be opened"), Err(err) => assert_eq!( err.to_string(), diff --git a/gix-ref/tests/refs/store.rs b/gix-ref/tests/refs/store.rs index 9f6ae14b7d9..62da472f92a 100644 --- a/gix-ref/tests/refs/store.rs +++ b/gix-ref/tests/refs/store.rs @@ -7,7 +7,7 @@ fn is_send_and_sync() { path.join(".git"), gix_ref::store::init::Options { write_reflog: gix_ref::store::WriteReflog::Normal, - object_hash: gix_hash::Kind::Sha1, + object_hash: crate::fixture_hash_kind(), ..Default::default() }, )) diff --git a/justfile b/justfile index 61301c97dad..e4acd89388d 100755 --- a/justfile +++ b/justfile @@ -219,7 +219,8 @@ unit-tests: env GIX_TEST_FIXTURE_HASH=sha256 cargo nextest run -p gix-object --no-fail-fast cargo nextest run -p gix-tempfile --features signals --no-fail-fast cargo nextest run -p gix-features --all-features --no-fail-fast - cargo nextest run -p gix-ref-tests --all-features --no-fail-fast + env GIX_TEST_FIXTURE_HASH=sha1 cargo nextest run -p gix-ref-tests --all-features --no-fail-fast + env GIX_TEST_FIXTURE_HASH=sha256 cargo nextest run -p gix-ref-tests --all-features --no-fail-fast cargo nextest run -p gix-odb --all-features --no-fail-fast cargo nextest run -p gix-odb-tests --features gix-features-parallel --no-fail-fast env GIX_TEST_FIXTURE_HASH=sha1 cargo nextest run -p gix-pack --all-features --no-fail-fast From 87b2da8b66dfaa8a0b4e11ac947b1ec4164c163f Mon Sep 17 00:00:00 2001 From: "GPT 5.5" Date: Mon, 27 Apr 2026 23:28:37 +0800 Subject: [PATCH 8/8] address auto-review Co-authored-by: Sebastian Thiel --- gix-ref/fuzz/Cargo.toml | 1 + gix-ref/fuzz/fuzz_targets/fuzz_packed_buffer.rs | 2 +- gix-ref/src/parse.rs | 2 +- gix-ref/tests/refs/file/reference.rs | 5 +++++ 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/gix-ref/fuzz/Cargo.toml b/gix-ref/fuzz/Cargo.toml index a2105413c10..a1c1fb82f7f 100644 --- a/gix-ref/fuzz/Cargo.toml +++ b/gix-ref/fuzz/Cargo.toml @@ -11,6 +11,7 @@ cargo-fuzz = true anyhow = "1.0.75" arbitrary = { version = "1.3.2", features = ["derive"] } bstr = "1.8.0" +gix-hash = { path = "../../gix-hash", features = ["sha1"] } libfuzzer-sys = "0.4" [dependencies.gix-ref] diff --git a/gix-ref/fuzz/fuzz_targets/fuzz_packed_buffer.rs b/gix-ref/fuzz/fuzz_targets/fuzz_packed_buffer.rs index e6bfb639dcf..241c8cc1628 100644 --- a/gix-ref/fuzz/fuzz_targets/fuzz_packed_buffer.rs +++ b/gix-ref/fuzz/fuzz_targets/fuzz_packed_buffer.rs @@ -14,7 +14,7 @@ struct Ctx<'a> { } fn fuzz(ctx: Ctx) -> Result<()> { - let buffer = Buffer::from_bytes(ctx.packed_file_contents, "sha1".parse().unwrap())?; + let buffer = Buffer::from_bytes(ctx.packed_file_contents, gix_hash::Kind::Sha1)?; _ = black_box(buffer.iter()?.count()); let full_name_ref: &FullNameRef = BStr::new(ctx.name).try_into()?; diff --git a/gix-ref/src/parse.rs b/gix-ref/src/parse.rs index 144ab94f092..5a754b18ba9 100644 --- a/gix-ref/src/parse.rs +++ b/gix-ref/src/parse.rs @@ -19,7 +19,7 @@ pub fn hex_hash<'a>(i: &mut &'a [u8], hash_kind: gix_hash::Kind) -> ParseResult< Ok(hex.as_bstr()) } -/// All all supported hash lengths, if they match perfectly. +/// All supported hash lengths, if they match perfectly. pub fn hex_hash_any<'a>(i: &mut &'a [u8]) -> ParseResult<&'a BStr> { let max = gix_hash::Kind::longest().len_in_hex(); let len = i.iter().take(max).take_while(|b| is_hex_digit(**b)).count(); diff --git a/gix-ref/tests/refs/file/reference.rs b/gix-ref/tests/refs/file/reference.rs index 81f4f08557c..b41e4e623fc 100644 --- a/gix-ref/tests/refs/file/reference.rs +++ b/gix-ref/tests/refs/file/reference.rs @@ -233,6 +233,11 @@ mod parse { b"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n", "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\n\" could not be parsed" ); + mktest!( + trailing_garbage_after_id, + b"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaextra", + "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaextra\" could not be parsed" + ); } mod valid { use gix_object::bstr::ByteSlice;