History

change!: Reference log line access (#263)

`Reference::log_iter(…)` now is a platform instead of a forward iterator, which requires a call to `.all()` to return the forward iterator like previously. `Reference::log_iter_rev(…)` was removed in favor of `Reference::log_iter(…).rev()`.

Sebastian Thiel committed 4 years ago

Commit bfb32ae1 parent 1cd23625 files · +10 −44Browse files

Unified · Split

5 files
  1. git-ref/src/store/file/log/iter.rs +2 −1
  2. git-ref/src/store/file/overlay_iter.rs +1 −0
  3. git-ref/src/store/file/raw_ext.rs +3 −36
  4. git-ref/tests/file/reference.rs +2 −4
  5. git-ref/tests/file/transaction/prepare_and_commit/create_or_update.rs +2 −3
git-ref/src/store/file/log/iter.rs+2−1
@@ -75,6 +75,7 @@ impl<'a> Iterator for Forward<'a> { · 74 unmodified lines
7575 }
7676
7777 /// A platform to store a buffer to hold ref log lines for iteration.
78+#[must_use = "Iterators should be obtained from this platform"]
7879 pub struct Platform<'a, 's> {
7980 pub(crate) store: &'s file::Store,
8081 pub(crate) name: FullNameRef<'a>,
@@ -84,8 +85,8 @@ pub struct Platform<'a, 's> { · 3 unmodified lines
8485 impl<'a, 's> Platform<'a, 's> {
8586 /// Return a forward iterator over all log-lines, most recent to oldest.
8687 pub fn rev(&mut self) -> std::io::Result<Option<log::iter::Reverse<'_, std::fs::File>>> {
87− self.buf.resize(512, 0);
8888 self.buf.clear();
89+ self.buf.resize(512, 0);
8990 self.store
9091 .reflog_iter_rev(self.name, &mut self.buf)
9192 .map_err(must_be_io_err)
git-ref/src/store/file/overlay_iter.rs+1−0
@@ -24,6 +24,7 @@ pub struct LooseThenPacked<'p, 's> { · 23 unmodified lines
2424 }
2525
2626 /// An intermediate structure to hold shared state alive long enough for iteration to happen.
27+#[must_use = "Iterators should be obtained from this platform"]
2728 pub struct Platform<'s> {
2829 store: &'s file::Store,
2930 packed: Option<OwnShared<packed::Buffer>>,
git-ref/src/store/file/raw_ext.rs+3−36
@@ -5,10 +5,7 @@ use git_hash::ObjectId; · 4 unmodified lines
55 use crate::{
66 peel,
77 raw::Reference,
8− store_impl::{
9− file,
10− file::{log, loose::reference::logiter::must_be_io_err},
11− },
8+ store_impl::{file, file::log},
129 Target,
1310 };
1411
@@ -18,21 +15,7 @@ impl Sealed for crate::Reference {} · 3 unmodified lines
1815 /// A trait to extend [Reference][crate::Reference] with functionality requiring a [file::Store].
1916 pub trait ReferenceExt: Sealed {
2017 /// A step towards obtaining forward or reverse iterators on reference logs.
21− fn log_iter_platform<'a, 's>(&'a self, store: &'s file::Store) -> log::iter::Platform<'a, 's>;
22−
23− /// Obtain a reverse iterator over logs of this reference. See [crate::file::loose::Reference::log_iter_rev()] for details.
24− fn log_iter_rev<'b>(
25− &self,
26− store: &file::Store,
27− buf: &'b mut [u8],
28− ) -> std::io::Result<Option<log::iter::Reverse<'b, std::fs::File>>>;
29−
30− /// Obtain an iterator over logs of this reference. See [crate::file::loose::Reference::log_iter()] for details.
31− fn log_iter<'a, 'b: 'a>(
32− &'a self,
33− store: &file::Store,
34− buf: &'b mut Vec<u8>,
35− ) -> std::io::Result<Option<log::iter::Forward<'b>>>;
18+ fn log_iter<'a, 's>(&'a self, store: &'s file::Store) -> log::iter::Platform<'a, 's>;
3619
3720 /// For details, see [Reference::log_exists()].
3821 fn log_exists(&self, store: &file::Store) -> bool;
@@ -52,7 +35,7 @@ pub trait ReferenceExt: Sealed { · 13 unmodified lines
5235 }
5336
5437 impl ReferenceExt for Reference {
55− fn log_iter_platform<'a, 's>(&'a self, store: &'s file::Store) -> log::iter::Platform<'a, 's> {
38+ fn log_iter<'a, 's>(&'a self, store: &'s file::Store) -> log::iter::Platform<'a, 's> {
5639 log::iter::Platform {
5740 store,
5841 name: self.name.to_ref(),
@@ -60,22 +43,6 @@ impl ReferenceExt for Reference { · 1 unmodified line
6043 }
6144 }
6245
63− fn log_iter_rev<'b>(
64− &self,
65− store: &file::Store,
66− buf: &'b mut [u8],
67− ) -> std::io::Result<Option<log::iter::Reverse<'b, std::fs::File>>> {
68− store.reflog_iter_rev(self.name.to_ref(), buf).map_err(must_be_io_err)
69− }
70−
71− fn log_iter<'a, 'b: 'a>(
72− &'a self,
73− store: &file::Store,
74− buf: &'b mut Vec<u8>,
75− ) -> std::io::Result<Option<log::iter::Forward<'b>>> {
76− store.reflog_iter(self.name.to_ref(), buf).map_err(must_be_io_err)
77− }
78−
7946 fn log_exists(&self, store: &file::Store) -> bool {
8047 store
8148 .reflog_exists(self.name.to_ref())
git-ref/tests/file/reference.rs+2−4
@@ -8,8 +8,7 @@ mod reflog { · 7 unmodified lines
88 fn iter() -> crate::Result {
99 let store = file::store_with_packed_refs()?;
1010 let r = store.find("main")?;
11− let mut buf = Vec::new();
12− assert_eq!(r.log_iter(&store, &mut buf)?.expect("log exists").count(), 1);
11+ assert_eq!(r.log_iter(&store).all()?.expect("log exists").count(), 1);
1312 assert!(r.log_exists(&store), "it exists if its readable");
1413 Ok(())
1514 }
@@ -18,8 +17,7 @@ mod reflog { · 2 unmodified lines
1817 fn iter_rev() -> crate::Result {
1918 let store = file::store_with_packed_refs()?;
2019 let r = store.find("main")?;
21− let mut buf = [0u8; 256];
22− assert_eq!(r.log_iter_rev(&store, &mut buf)?.expect("log exists").count(), 1);
20+ assert_eq!(r.log_iter(&store).rev()?.expect("log exists").count(), 1);
2321 Ok(())
2422 }
2523 }
git-ref/tests/file/transaction/prepare_and_commit/create_or_update.rs+2−3
@@ -720,8 +720,7 @@ fn packed_refs_creation_with_packed_refs_mode_leave_keeps_original_loose_refs() · 719 unmodified lines
720720 branch.target.as_id().expect("peeled"),
721721 "the packed ref is outdated"
722722 );
723− let mut buf = Vec::new();
724− let previous_reflog_entries = branch.log_iter(&store, &mut buf)?.expect("log").count();
723+ let previous_reflog_entries = branch.log_iter(&store).all()?.expect("log").count();
725724 let previous_packed_refs = packed.iter()?.filter_map(Result::ok).count();
726725
727726 let edits = store.loose_iter()?.map(|r| r.expect("valid ref")).map(|r| RefEdit {
@@ -753,7 +752,7 @@ fn packed_refs_creation_with_packed_refs_mode_leave_keeps_original_loose_refs() · 25 unmodified lines
753752 "the amount of loose refs didn't change and having symbolic ones isn't a problem"
754753 );
755754 assert_eq!(
756− branch.log_iter(&store, &mut buf)?.expect("log").count(),
755+ branch.log_iter(&store).all()?.expect("log").count(),
757756 previous_reflog_entries,
758757 "reflog isn't adjusted as there is no change"
759758 );

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