From 08c5bd2446c514833f5d3fe62d342114c83f77d3 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Wed, 25 May 2022 19:16:53 +0800 Subject: [PATCH] support for range parsing with range in the middle (#427) --- git-revision/src/lib.rs | 4 ++-- git-revision/src/spec.rs | 1 + git-revision/tests/spec/mod.rs | 30 ++++++++++++++++++++++++------ 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/git-revision/src/lib.rs b/git-revision/src/lib.rs index 82c56a0795..95171b2c6a 100644 --- a/git-revision/src/lib.rs +++ b/git-revision/src/lib.rs @@ -1,8 +1,8 @@ //! Interact with git revisions by parsing them from rev-specs and turning them into rev-specs. //! //! One can also describe revisions using a different algorithm. -#![forbid(unsafe_code, rust_2018_idioms)] -#![deny(missing_docs)] +#![forbid(unsafe_code)] +#![deny(missing_docs, rust_2018_idioms)] /// Access to collections optimized for keys that are already a hash. pub use hash_hasher; diff --git a/git-revision/src/spec.rs b/git-revision/src/spec.rs index ce99c8a91a..3453464cc6 100644 --- a/git-revision/src/spec.rs +++ b/git-revision/src/spec.rs @@ -74,6 +74,7 @@ pub mod parse { delegate.kind(kind); input = rest.as_bstr(); } + input = revision(input, delegate)?; assert!( input.is_empty(), diff --git a/git-revision/tests/spec/mod.rs b/git-revision/tests/spec/mod.rs index f99fa1c1fb..73c343a580 100644 --- a/git-revision/tests/spec/mod.rs +++ b/git-revision/tests/spec/mod.rs @@ -5,17 +5,19 @@ mod parse { #[derive(Default, Debug)] struct Recorder { resolve_ref_input: Option, + resolve_ref_input2: Option, kind: Option, calls: usize, } impl spec::parse::Delegate for Recorder { fn resolve_ref(&mut self, input: &BStr) -> Option<()> { - assert!( - self.resolve_ref_input.is_none(), - "called resolve_ref twice with '{}'", - input - ); - self.resolve_ref_input = input.to_owned().into(); + if self.resolve_ref_input.is_none() { + self.resolve_ref_input = input.to_owned().into(); + } else if self.resolve_ref_input2.is_none() { + self.resolve_ref_input2 = input.to_owned().into(); + } else { + panic!("called resolve_ref more than twice with '{}'", input); + } self.calls += 1; Some(()) } @@ -85,6 +87,22 @@ mod parse { assert_eq!(rec.resolve_ref_input.unwrap(), "HEAD"); } + #[test] + fn middle_dot_dot_dot_is_merge_base() { + let rec = parse("HEAD...@"); + assert_eq!(rec.kind.unwrap(), spec::Kind::MergeBase); + assert_eq!(rec.resolve_ref_input.unwrap(), "HEAD"); + assert_eq!(rec.resolve_ref_input2.unwrap(), "HEAD"); + } + + #[test] + fn middle_dot_dot_is_range() { + let rec = parse("@..HEAD"); + assert_eq!(rec.kind.unwrap(), spec::Kind::Range); + assert_eq!(rec.resolve_ref_input.unwrap(), "HEAD"); + assert_eq!(rec.resolve_ref_input2.unwrap(), "HEAD"); + } + #[test] fn at_by_iteself_is_shortcut_for_head() { let rec = parse("@");