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
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)
git-repository/tests/fixtures/generated-archives/make_rev_spec_parse_repos.tar.xz+2−2
@@ -1,3 +1,3 @@
1version https://git-lfs.github.com/spec/v11version https://git-lfs.github.com/spec/v1
2oid sha256:41adc1d79626602c2ab31f92e33598b322e92e9c58d6f015dd6d81c39e9129d62oid sha256:59a25603e3f0bf76e32f3a947b4e275afdfc1e2a0b7ab0e159cc5cc0119f9556
3size 281043size 28084
git-repository/tests/fixtures/make_rev_spec_parse_repos.sh+4−0
@@ -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)
git-repository/tests/revision/spec/from_bytes/mod.rs+21−1
@@ -11,6 +11,26 @@ mod regex; · 10 unmodified lines
11mod reflog;11mod reflog;
12mod traverse;12mod traverse;
13 13
14mod 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
14mod sibling_branch {34mod 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(),
git-repository/tests/revision/spec/from_bytes/reflog.rs+1−1
@@ -64,7 +64,7 @@ fn by_index() { · 63 unmodified lines
64}64}
65 65
66#[test]66#[test]
67fn by_date() {67fn 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(),