History

provide a platform for multiple queries at a dir cache level (#301)

This allows to perform work only once while allowing subsequent queries to the cached information, like `is_excluded()` or `attributes()`.

Sebastian Thiel committed 4 years ago

Commit 48be3821 parent dc12f883 files · +29 −20Browse files

Showing the changes to git-worktree/src (2 of 3 files). Show all

Unified · Split

2 files
  1. git-worktree/src/fs/cache.rs +21 −4
  2. git-worktree/src/index/entry.rs +1 −1
git-worktree/src/fs/cache.rs+21−4
@@ -11,6 +11,23 @@ pub enum Mode { · 10 unmodified lines
1111 ProvideAttributesAndIgnore,
1212 }
1313
14+pub struct Platform<'a> {
15+ parent: &'a Cache,
16+}
17+
18+impl<'a> Platform<'a> {
19+ /// The full path to `relative` will be returned for use on the file system.
20+ pub fn leading_dir(&self) -> &'a Path {
21+ self.parent.stack.current()
22+ }
23+}
24+
25+impl<'a> std::fmt::Debug for Platform<'a> {
26+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
27+ std::fmt::Debug::fmt(&self.leading_dir(), f)
28+ }
29+}
30+
1431 impl Cache {
1532 /// Create a new instance with `root` being the base for all future paths we handle, assuming it to be valid which includes
1633 /// symbolic links to be included in it as well.
@@ -28,12 +45,12 @@ impl Cache { · 11 unmodified lines
2845 /// Append the `relative` path to the root directory the cache contains and efficiently create leading directories
2946 /// unless `mode` indicates `relative` points to a directory itself in which case the entire resulting path is created as directory.
3047 ///
31− /// The full path to `relative` will be returned for use on the file system.
32− pub fn append_relative_path_assure_leading_dir(
48+ /// Provide access to cached information for that `relative` entry via the platform returned.
49+ pub fn at_entry(
3350 &mut self,
3451 relative: impl AsRef<Path>,
3552 mode: git_index::entry::Mode,
36− ) -> std::io::Result<&Path> {
53+ ) -> std::io::Result<Platform<'_>> {
3754 #[cfg(debug_assertions)]
3855 let mkdir_calls = &mut self.test_mkdir_calls;
3956 let unlink_on_collision = self.unlink_on_collision;
@@ -51,7 +68,7 @@ impl Cache { · 11 unmodified lines
5168 },
5269 |_| {},
5370 )?;
54− Ok(self.stack.current())
71+ Ok(Platform { parent: self })
5572 }
5673 }
5774
git-worktree/src/index/entry.rs+1−1
@@ -37,7 +37,7 @@ where · 36 unmodified lines
3737 git_features::path::from_byte_slice(entry_path).map_err(|_| index::checkout::Error::IllformedUtf8 {
3838 path: entry_path.to_owned(),
3939 })?;
40− let dest = path_cache.append_relative_path_assure_leading_dir(dest_relative, entry.mode)?;
40+ let dest = path_cache.at_entry(dest_relative, entry.mode)?.leading_dir();
4141
4242 let object_size = match entry.mode {
4343 git_index::entry::Mode::FILE | git_index::entry::Mode::FILE_EXECUTABLE => {