History

implement @^{} syntax (#427)

Sebastian Thiel committed 4 years ago

Commit fbd5aab1 parent 90dccc35 files · +38 −8Browse files

Unified · Split

5 files
  1. git-repository/src/revision/spec/parse/delegate.rs +10 −4
  2. git-repository/tests/fixtures/generated-archives/make_rev_spec_parse_repos.tar.xz +2 −2
  3. git-repository/tests/fixtures/make_rev_spec_parse_repos.sh +4 −0
  4. git-repository/tests/revision/spec/from_bytes/mod.rs +21 −1
  5. git-repository/tests/revision/spec/from_bytes/reflog.rs +1 −1
git-repository/src/revision/spec/parse/delegate.rs+10−4
@@ -462,11 +462,12 @@ impl<'repo> delegate::Navigate for Delegate<'repo> { · 461 unmodified lines
462462 let mut replacements = Replacements::default();
463463 let mut errors = Vec::new();
464464 let objs = self.objs[self.idx].as_mut()?;
465+ let repo = self.repo;
465466
466467 match kind {
467468 PeelTo::ValidObject => {
468469 for obj in objs.iter() {
469− match self.repo.find_object(*obj) {
470+ match repo.find_object(*obj) {
470471 Ok(_) => {}
471472 Err(err) => {
472473 errors.push((*obj, err.into()));
@@ -475,7 +476,6 @@ impl<'repo> delegate::Navigate for Delegate<'repo> { · 2 unmodified lines
475476 }
476477 }
477478 PeelTo::ObjectKind(kind) => {
478− let repo = self.repo;
479479 let peel = |obj| peel(repo, obj, kind);
480480 for obj in objs.iter() {
481481 match peel(obj) {
@@ -485,7 +485,6 @@ impl<'repo> delegate::Navigate for Delegate<'repo> { · 3 unmodified lines
485485 }
486486 }
487487 PeelTo::Path(path) => {
488− let repo = self.repo;
489488 let lookup_path = |obj: &ObjectId| {
490489 let tree_id = peel(repo, obj, git_object::Kind::Tree)?;
491490 let tree = repo.find_object(tree_id)?.into_tree();
@@ -509,7 +508,14 @@ impl<'repo> delegate::Navigate for Delegate<'repo> { · 17 unmodified lines
509508 }
510509 }
511510 }
512− PeelTo::RecursiveTagObject => todo!("recursive tag object"),
511+ PeelTo::RecursiveTagObject => {
512+ for oid in objs.iter() {
513+ match oid.attach(repo).object().and_then(|obj| obj.peel_tags_to_end()) {
514+ Ok(obj) => replacements.push((*oid, obj.id)),
515+ Err(err) => errors.push((*oid, err.into())),
516+ }
517+ }
518+ }
513519 }
514520
515521 handle_errors_and_replacements(&mut self.err, objs, errors, &mut replacements)
git-repository/tests/fixtures/generated-archives/make_rev_spec_parse_repos.tar.xz+2−2
@@ -1,3 +1,3 @@
11 version https://git-lfs.github.com/spec/v1
2−oid sha256:41adc1d79626602c2ab31f92e33598b322e92e9c58d6f015dd6d81c39e9129d6
3−size 28104
2+oid sha256:59a25603e3f0bf76e32f3a947b4e275afdfc1e2a0b7ab0e159cc5cc0119f9556
3+size 28084
git-repository/tests/fixtures/make_rev_spec_parse_repos.sh+4−0
@@ -382,4 +382,8 @@ git init complex_graph · 381 unmodified lines
382382 baseline "@{3}"
383383 baseline "HEAD@{5}"
384384 baseline "main@{12345}"
385+
386+ baseline "@^{}"
387+ baseline "main^{}"
388+ baseline "b-tag^{}"
385389 )
git-repository/tests/revision/spec/from_bytes/mod.rs+21−1
@@ -11,6 +11,26 @@ mod regex; · 10 unmodified lines
1111 mod reflog;
1212 mod traverse;
1313
14+mod peel {
15+ use crate::revision::spec::from_bytes::{parse_spec, repo};
16+ use git_repository::prelude::ObjectIdExt;
17+ use git_repository::revision::Spec;
18+ use git_testtools::hex_to_id;
19+
20+ #[test]
21+ fn peel_to_object() {
22+ let repo = &repo("complex_graph").unwrap();
23+
24+ let expected = Spec::from_id(hex_to_id("55e825ebe8fd2ff78cad3826afb696b96b576a7e").attach(repo));
25+ assert_eq!(parse_spec("@^{}", repo).unwrap(), expected);
26+ assert_eq!(parse_spec("main^{}", repo).unwrap(), expected);
27+ assert_eq!(
28+ parse_spec("b-tag^{}", repo).unwrap(),
29+ Spec::from_id(hex_to_id("5b3f9e24965d0b28780b7ce5daf2b5b7f7e0459f").attach(repo))
30+ );
31+ }
32+}
33+
1434 mod sibling_branch {
1535 use crate::revision::spec::from_bytes::{parse_spec_no_baseline, repo};
1636 use git_repository::revision::spec::parse::Error;
@@ -37,7 +57,7 @@ mod index { · 20 unmodified lines
3757 use git_testtools::hex_to_id;
3858
3959 #[test]
40− fn at_stages() {
60+ fn at_stage() {
4161 let repo = repo("complex_graph").unwrap();
4262 assert_eq!(
4363 parse_spec(":file", &repo).unwrap(),
git-repository/tests/revision/spec/from_bytes/reflog.rs+1−1
@@ -64,7 +64,7 @@ fn by_index() { · 63 unmodified lines
6464 }
6565
6666 #[test]
67−fn by_date() {
67+fn by_date_is_planned_until_git_date_crate_is_implements_parsing() {
6868 let repo = repo("complex_graph").unwrap();
6969 assert!(matches!(
7070 parse_spec_no_baseline("main@{1979-02-26 18:30:00}", &repo).unwrap_err(),