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