Unified · Split
| @@ -462,11 +462,12 @@ impl<'repo> delegate::Navigate for Delegate<'repo> { · 461 unmodified lines | ||
| 462 | 462 | let mut replacements = Replacements::default(); |
| 463 | 463 | let mut errors = Vec::new(); |
| 464 | 464 | let objs = self.objs[self.idx].as_mut()?; |
| 465 | + let repo = self.repo; | |
| 465 | 466 | |
| 466 | 467 | match kind { |
| 467 | 468 | PeelTo::ValidObject => { |
| 468 | 469 | for obj in objs.iter() { |
| 469 | − match self.repo.find_object(*obj) { | |
| 470 | + match repo.find_object(*obj) { | |
| 470 | 471 | Ok(_) => {} |
| 471 | 472 | Err(err) => { |
| 472 | 473 | errors.push((*obj, err.into())); |
| @@ -475,7 +476,6 @@ impl<'repo> delegate::Navigate for Delegate<'repo> { · 2 unmodified lines | ||
| 475 | 476 | } |
| 476 | 477 | } |
| 477 | 478 | PeelTo::ObjectKind(kind) => { |
| 478 | − let repo = self.repo; | |
| 479 | 479 | let peel = |obj| peel(repo, obj, kind); |
| 480 | 480 | for obj in objs.iter() { |
| 481 | 481 | match peel(obj) { |
| @@ -485,7 +485,6 @@ impl<'repo> delegate::Navigate for Delegate<'repo> { · 3 unmodified lines | ||
| 485 | 485 | } |
| 486 | 486 | } |
| 487 | 487 | PeelTo::Path(path) => { |
| 488 | − let repo = self.repo; | |
| 489 | 488 | let lookup_path = |obj: &ObjectId| { |
| 490 | 489 | let tree_id = peel(repo, obj, git_object::Kind::Tree)?; |
| 491 | 490 | let tree = repo.find_object(tree_id)?.into_tree(); |
| @@ -509,7 +508,14 @@ impl<'repo> delegate::Navigate for Delegate<'repo> { · 17 unmodified lines | ||
| 509 | 508 | } |
| 510 | 509 | } |
| 511 | 510 | } |
| 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 | + } | |
| 513 | 519 | } |
| 514 | 520 | |
| 515 | 521 | handle_errors_and_replacements(&mut self.err, objs, errors, &mut replacements) |
| @@ -1,3 +1,3 @@ | ||
| 1 | 1 | version https://git-lfs.github.com/spec/v1 |
| 2 | −oid sha256:41adc1d79626602c2ab31f92e33598b322e92e9c58d6f015dd6d81c39e9129d6 | |
| 3 | −size 28104 | |
| 2 | +oid sha256:59a25603e3f0bf76e32f3a947b4e275afdfc1e2a0b7ab0e159cc5cc0119f9556 | |
| 3 | +size 28084 | |
| @@ -382,4 +382,8 @@ git init complex_graph · 381 unmodified lines | ||
| 382 | 382 | baseline "@{3}" |
| 383 | 383 | baseline "HEAD@{5}" |
| 384 | 384 | baseline "main@{12345}" |
| 385 | + | |
| 386 | + baseline "@^{}" | |
| 387 | + baseline "main^{}" | |
| 388 | + baseline "b-tag^{}" | |
| 385 | 389 | ) |
| @@ -11,6 +11,26 @@ mod regex; · 10 unmodified lines | ||
| 11 | 11 | mod reflog; |
| 12 | 12 | mod traverse; |
| 13 | 13 | |
| 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 | + | |
| 14 | 34 | mod sibling_branch { |
| 15 | 35 | use crate::revision::spec::from_bytes::{parse_spec_no_baseline, repo}; |
| 16 | 36 | use git_repository::revision::spec::parse::Error; |
| @@ -37,7 +57,7 @@ mod index { · 20 unmodified lines | ||
| 37 | 57 | use git_testtools::hex_to_id; |
| 38 | 58 | |
| 39 | 59 | #[test] |
| 40 | − fn at_stages() { | |
| 60 | + fn at_stage() { | |
| 41 | 61 | let repo = repo("complex_graph").unwrap(); |
| 42 | 62 | assert_eq!( |
| 43 | 63 | parse_spec(":file", &repo).unwrap(), |
| @@ -64,7 +64,7 @@ fn by_index() { · 63 unmodified lines | ||
| 64 | 64 | } |
| 65 | 65 | |
| 66 | 66 | #[test] |
| 67 | −fn by_date() { | |
| 67 | +fn by_date_is_planned_until_git_date_crate_is_implements_parsing() { | |
| 68 | 68 | let repo = repo("complex_graph").unwrap(); |
| 69 | 69 | assert!(matches!( |
| 70 | 70 | parse_spec_no_baseline("main@{1979-02-26 18:30:00}", &repo).unwrap_err(), |