History

[ref #140] sketch ref tag peeling

Sebastian Thiel committed 5 years ago

Commit ef906521 parent 8e1a7305 files · +26 −15Browse files

Unified · Split

5 files
  1. git-ref/src/store/file/loose/reference/peel.rs +9 −3
  2. git-ref/src/store/file/reference.rs +3 −2
  3. git-ref/tests/file/reference.rs +5 −4
  4. gitoxide-core/src/hours.rs +4 −2
  5. gitoxide-core/src/pack/create.rs +5 −4
git-ref/src/store/file/loose/reference/peel.rs+9−3
@@ -1,7 +1,7 @@
11 use quick_error::quick_error;
22
33 use crate::{
4− file::{self},
4+ file,
55 mutable::Target,
66 store::{
77 file::{find, loose},
@@ -10,7 +10,7 @@ use crate::{ · 2 unmodified lines
1010 };
1111
1212 quick_error! {
13− /// The error returned by [`Reference::peel_one_level()`].
13+ /// The error returned by [`loose::Reference::follow_symbolic()`].
1414 #[derive(Debug)]
1515 #[allow(missing_docs)]
1616 pub enum Error {
@@ -18,13 +18,18 @@ quick_error! { · 1 unmodified line
1818 display("Could not resolve symbolic reference name that is expected to exist")
1919 source(err)
2020 }
21− Decode(err: file::loose::reference::decode::Error) {
21+ Decode(err: loose::reference::decode::Error) {
2222 display("The reference could not be decoded.")
2323 source(err)
2424 }
2525 }
2626 }
2727
28+/// A function for use in [`loose::Reference::peel_to_id_in_place()`] to indicate no peeling should happen.
29+pub fn none(_id: &git_hash::oid) -> Result<Option<(git_object::Kind, &'_ [u8])>, Box<dyn std::error::Error>> {
30+ Ok(Some((git_object::Kind::Commit, &[])))
31+}
32+
2833 impl loose::Reference {
2934 /// Follow this symbolic reference one level and return the ref it refers to, possibly providing access to `packed` references for lookup.
3035 ///
@@ -89,6 +94,7 @@ pub mod to_id { · 58 unmodified lines
8994 &mut self,
9095 store: &file::Store,
9196 packed: Option<&packed::Buffer>,
97+ _find: impl FnMut(&git_hash::oid) -> Result<Option<(git_object::Kind, &[u8])>, Box<dyn std::error::Error>>,
9298 ) -> Result<&oid, Error> {
9399 let mut seen = BTreeSet::new();
94100 let mut storage;
git-ref/src/store/file/reference.rs+3−2
@@ -56,9 +56,10 @@ impl<'p> Reference<'p> { · 55 unmodified lines
5656 &mut self,
5757 store: &file::Store,
5858 packed: Option<&packed::Buffer>,
59+ find: impl FnMut(&git_hash::oid) -> Result<Option<(git_object::Kind, &[u8])>, Box<dyn std::error::Error>>,
5960 ) -> Result<ObjectId, crate::store::file::loose::reference::peel::to_id::Error> {
6061 match self {
61− Reference::Loose(r) => r.peel_to_id_in_place(store, packed).map(ToOwned::to_owned),
62+ Reference::Loose(r) => r.peel_to_id_in_place(store, packed, find).map(ToOwned::to_owned),
6263 Reference::Packed(p) => {
6364 if let Some(object) = p.object {
6465 p.target = object;
@@ -69,7 +70,7 @@ impl<'p> Reference<'p> { · 4 unmodified lines
6970 }
7071 }
7172
72− /// For details, see [crate::file::loose::Reference::peel_one_level].
73+ /// For details, see [crate::file::loose::Reference::follow_symbolic()].
7374 pub fn peel_one_level<'p2>(
7475 &self,
7576 store: &file::Store,
git-ref/tests/file/reference.rs+5−4
@@ -50,6 +50,7 @@ mod reflog { · 49 unmodified lines
5050
5151 mod peel {
5252 use crate::{file, file::store_with_packed_refs};
53+ use git_ref::file::loose::reference::peel;
5354 use git_testtools::hex_to_id;
5455 use std::convert::TryFrom;
5556
@@ -82,11 +83,11 @@ mod peel { · 26 unmodified lines
8283 let mut head = store.loose_find_existing("HEAD")?;
8384 let packed = store.packed()?;
8485 let expected = hex_to_id("134385f6d781b7e97062102c6a483440bfda2a03");
85− assert_eq!(head.peel_to_id_in_place(&store, packed.as_ref())?, expected);
86+ assert_eq!(head.peel_to_id_in_place(&store, packed.as_ref(), peel::none)?, expected);
8687 assert_eq!(head.target.as_id().map(ToOwned::to_owned), Some(expected));
8788
8889 let mut head = store.find_existing("dt1", packed.as_ref())?;
89− assert_eq!(head.peel_to_id_in_place(&store, packed.as_ref())?, expected);
90+ assert_eq!(head.peel_to_id_in_place(&store, packed.as_ref(), peel::none)?, expected);
9091 assert_eq!(head.target().as_id().map(ToOwned::to_owned), Some(expected));
9192 Ok(())
9293 }
@@ -128,7 +129,7 @@ mod peel { · 35 unmodified lines
128129 assert_eq!(r.kind(), git_ref::Kind::Symbolic, "there is something to peel");
129130
130131 assert_eq!(
131− r.peel_to_id_in_place(&store, None)?,
132+ r.peel_to_id_in_place(&store, None, peel::none)?,
132133 hex_to_id("134385f6d781b7e97062102c6a483440bfda2a03")
133134 );
134135 assert_eq!(r.name.as_bstr(), "refs/remotes/origin/multi-link-target3");
@@ -144,7 +145,7 @@ mod peel { · 9 unmodified lines
144145 assert_eq!(r.name.as_bstr(), "refs/loop-a");
145146
146147 assert!(matches!(
147− r.peel_to_id_in_place(&store, None).unwrap_err(),
148+ r.peel_to_id_in_place(&store, None, peel::none).unwrap_err(),
148149 git_ref::file::loose::reference::peel::to_id::Error::Cycle { .. }
149150 ));
150151 assert_eq!(r.name.as_bstr(), "refs/loop-a", "the ref is not changed on error");
gitoxide-core/src/hours.rs+4−2
@@ -1,6 +1,8 @@
11 use anyhow::{anyhow, bail};
22 use bstr::BString;
3−use git_repository::{actor, interrupt, object, odb, prelude::*, progress, Progress};
3+use git_repository::{
4+ actor, interrupt, object, odb, prelude::*, progress, refs::file::loose::reference::peel, Progress,
5+};
46 use itertools::Itertools;
57 use rayon::prelude::*;
68 use std::{
@@ -49,7 +51,7 @@ where · 42 unmodified lines
4951 let commit_id = repo
5052 .refs
5153 .find_existing(refname.to_string_lossy().as_ref(), packed.as_ref())?
52− .peel_to_id_in_place(&repo.refs, packed.as_ref())?
54+ .peel_to_id_in_place(&repo.refs, packed.as_ref(), peel::none)?
5355 .to_owned();
5456
5557 let all_commits = {
gitoxide-core/src/pack/create.rs+5−4
@@ -1,14 +1,15 @@
11 use crate::OutputFormat;
22 use anyhow::anyhow;
3−use git_repository::odb::pack::cache::DecodeEntry;
43 use git_repository::{
54 hash,
65 hash::ObjectId,
76 interrupt,
87 object::bstr::ByteVec,
9− odb::pack,
8+ odb::{pack, pack::cache::DecodeEntry},
109 prelude::{Finalize, FindExt},
11− progress, traverse, Progress,
10+ progress,
11+ refs::file::loose::reference::peel,
12+ traverse, Progress,
1213 };
1314 use std::{ffi::OsStr, io, path::Path, str::FromStr, sync::Arc, time::Instant};
1415
@@ -113,7 +114,7 @@ where · 98 unmodified lines
113114 refs.find_existing(tip.as_ref().to_string_lossy().as_ref(), packed.as_ref())
114115 .map_err(anyhow::Error::from)
115116 .and_then(|mut r| {
116− r.peel_to_id_in_place(refs, packed.as_ref())
117+ r.peel_to_id_in_place(refs, packed.as_ref(), peel::none)
117118 .map(|oid| oid.to_owned())
118119 .map_err(anyhow::Error::from)
119120 })

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t