From fbd5aab63cce905ca0fb482bfbb990624d7df376 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Wed, 3 Aug 2022 10:52:15 +0800 Subject: [PATCH] implement @^{} syntax (#427) --- .../src/revision/spec/parse/delegate.rs | 14 ++++++++---- .../make_rev_spec_parse_repos.tar.xz | 4 ++-- .../fixtures/make_rev_spec_parse_repos.sh | 4 ++++ .../tests/revision/spec/from_bytes/mod.rs | 22 ++++++++++++++++++- .../tests/revision/spec/from_bytes/reflog.rs | 2 +- 5 files changed, 38 insertions(+), 8 deletions(-) diff --git a/git-repository/src/revision/spec/parse/delegate.rs b/git-repository/src/revision/spec/parse/delegate.rs index 9bcaeb7430..4b568b953e 100644 --- a/git-repository/src/revision/spec/parse/delegate.rs +++ b/git-repository/src/revision/spec/parse/delegate.rs @@ -462,11 +462,12 @@ impl<'repo> delegate::Navigate for Delegate<'repo> { let mut replacements = Replacements::default(); let mut errors = Vec::new(); let objs = self.objs[self.idx].as_mut()?; + let repo = self.repo; match kind { PeelTo::ValidObject => { for obj in objs.iter() { - match self.repo.find_object(*obj) { + match repo.find_object(*obj) { Ok(_) => {} Err(err) => { errors.push((*obj, err.into())); @@ -475,7 +476,6 @@ impl<'repo> delegate::Navigate for Delegate<'repo> { } } PeelTo::ObjectKind(kind) => { - let repo = self.repo; let peel = |obj| peel(repo, obj, kind); for obj in objs.iter() { match peel(obj) { @@ -485,7 +485,6 @@ impl<'repo> delegate::Navigate for Delegate<'repo> { } } PeelTo::Path(path) => { - let repo = self.repo; let lookup_path = |obj: &ObjectId| { let tree_id = peel(repo, obj, git_object::Kind::Tree)?; let tree = repo.find_object(tree_id)?.into_tree(); @@ -509,7 +508,14 @@ impl<'repo> delegate::Navigate for Delegate<'repo> { } } } - PeelTo::RecursiveTagObject => todo!("recursive tag object"), + PeelTo::RecursiveTagObject => { + for oid in objs.iter() { + match oid.attach(repo).object().and_then(|obj| obj.peel_tags_to_end()) { + Ok(obj) => replacements.push((*oid, obj.id)), + Err(err) => errors.push((*oid, err.into())), + } + } + } } handle_errors_and_replacements(&mut self.err, objs, errors, &mut replacements) diff --git a/git-repository/tests/fixtures/generated-archives/make_rev_spec_parse_repos.tar.xz b/git-repository/tests/fixtures/generated-archives/make_rev_spec_parse_repos.tar.xz index b297f0c0d7..334df4cb2c 100644 --- a/git-repository/tests/fixtures/generated-archives/make_rev_spec_parse_repos.tar.xz +++ b/git-repository/tests/fixtures/generated-archives/make_rev_spec_parse_repos.tar.xz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:41adc1d79626602c2ab31f92e33598b322e92e9c58d6f015dd6d81c39e9129d6 -size 28104 +oid sha256:59a25603e3f0bf76e32f3a947b4e275afdfc1e2a0b7ab0e159cc5cc0119f9556 +size 28084 diff --git a/git-repository/tests/fixtures/make_rev_spec_parse_repos.sh b/git-repository/tests/fixtures/make_rev_spec_parse_repos.sh index c14f11853a..472b225e8a 100644 --- a/git-repository/tests/fixtures/make_rev_spec_parse_repos.sh +++ b/git-repository/tests/fixtures/make_rev_spec_parse_repos.sh @@ -382,4 +382,8 @@ git init complex_graph baseline "@{3}" baseline "HEAD@{5}" baseline "main@{12345}" + + baseline "@^{}" + baseline "main^{}" + baseline "b-tag^{}" ) diff --git a/git-repository/tests/revision/spec/from_bytes/mod.rs b/git-repository/tests/revision/spec/from_bytes/mod.rs index 046b67b7d6..3529d064bc 100644 --- a/git-repository/tests/revision/spec/from_bytes/mod.rs +++ b/git-repository/tests/revision/spec/from_bytes/mod.rs @@ -11,6 +11,26 @@ mod regex; mod reflog; mod traverse; +mod peel { + use crate::revision::spec::from_bytes::{parse_spec, repo}; + use git_repository::prelude::ObjectIdExt; + use git_repository::revision::Spec; + use git_testtools::hex_to_id; + + #[test] + fn peel_to_object() { + let repo = &repo("complex_graph").unwrap(); + + let expected = Spec::from_id(hex_to_id("55e825ebe8fd2ff78cad3826afb696b96b576a7e").attach(repo)); + assert_eq!(parse_spec("@^{}", repo).unwrap(), expected); + assert_eq!(parse_spec("main^{}", repo).unwrap(), expected); + assert_eq!( + parse_spec("b-tag^{}", repo).unwrap(), + Spec::from_id(hex_to_id("5b3f9e24965d0b28780b7ce5daf2b5b7f7e0459f").attach(repo)) + ); + } +} + mod sibling_branch { use crate::revision::spec::from_bytes::{parse_spec_no_baseline, repo}; use git_repository::revision::spec::parse::Error; @@ -37,7 +57,7 @@ mod index { use git_testtools::hex_to_id; #[test] - fn at_stages() { + fn at_stage() { let repo = repo("complex_graph").unwrap(); assert_eq!( parse_spec(":file", &repo).unwrap(), diff --git a/git-repository/tests/revision/spec/from_bytes/reflog.rs b/git-repository/tests/revision/spec/from_bytes/reflog.rs index 60fabed12f..39c8aa3a5b 100644 --- a/git-repository/tests/revision/spec/from_bytes/reflog.rs +++ b/git-repository/tests/revision/spec/from_bytes/reflog.rs @@ -64,7 +64,7 @@ fn by_index() { } #[test] -fn by_date() { +fn by_date_is_planned_until_git_date_crate_is_implements_parsing() { let repo = repo("complex_graph").unwrap(); assert!(matches!( parse_spec_no_baseline("main@{1979-02-26 18:30:00}", &repo).unwrap_err(),