summaryrefslogtreecommitdiffstats
path: root/vendor/gix-index/src/access/sparse.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/gix-index/src/access/sparse.rs')
-rw-r--r--vendor/gix-index/src/access/sparse.rs59
1 files changed, 59 insertions, 0 deletions
diff --git a/vendor/gix-index/src/access/sparse.rs b/vendor/gix-index/src/access/sparse.rs
new file mode 100644
index 000000000..27804f846
--- /dev/null
+++ b/vendor/gix-index/src/access/sparse.rs
@@ -0,0 +1,59 @@
+/// Configuration related to sparse indexes.
+#[derive(Debug, Default, Clone, Copy)]
+pub struct Options {
+ /// If true, certain entries in the index will be excluded / skipped for certain operations,
+ /// based on the ignore patterns in the `.git/info/sparse-checkout` file. These entries will
+ /// carry the [`SKIP_WORKTREE`][crate::entry::Flags::SKIP_WORKTREE] flag.
+ ///
+ /// This typically is the value of `core.sparseCheckout` in the git configuration.
+ pub sparse_checkout: bool,
+
+ /// Interpret the `.git/info/sparse-checkout` file using _cone mode_.
+ ///
+ /// If true, _cone mode_ is active and entire directories will be included in the checkout, as well as files in the root
+ /// of the repository.
+ /// If false, non-cone mode is active and entries to _include_ will be matched with patterns like those found in `.gitignore` files.
+ ///
+ /// This typically is the value of `core.sparseCheckoutCone` in the git configuration.
+ pub directory_patterns_only: bool,
+
+ /// If true, will attempt to write a sparse index file which only works in cone mode.
+ ///
+ /// A sparse index has [`DIR` entries][crate::entry::Mode::DIR] that represent entire directories to be skipped
+ /// during checkout and other operations due to the added presence of
+ /// the [`SKIP_WORKTREE`][crate::entry::Flags::SKIP_WORKTREE] flag.
+ ///
+ /// This is typically the value of `index.sparse` in the git configuration.
+ pub write_sparse_index: bool,
+}
+
+impl Options {
+ /// Derive a valid mode from all parameters that affect the 'sparseness' of the index.
+ ///
+ /// Some combinations of them degenerate to one particular mode.
+ pub fn sparse_mode(&self) -> Mode {
+ match (
+ self.sparse_checkout,
+ self.directory_patterns_only,
+ self.write_sparse_index,
+ ) {
+ (true, true, true) => Mode::IncludeDirectoriesStoreIncludedEntriesAndExcludedDirs,
+ (true, true, false) => Mode::IncludeDirectoriesStoreAllEntriesSkipUnmatched,
+ (true, false, _) => Mode::IncludeByIgnorePatternStoreAllEntriesSkipUnmatched,
+ (false, _, _) => Mode::Disabled,
+ }
+ }
+}
+
+/// Describes the configuration how a sparse index should be written, or if one should be written at all.
+#[derive(Debug)]
+pub enum Mode {
+ /// index with DIR entries for exclusion and included entries, directory-only include patterns in `.git/info/sparse-checkout` file.
+ IncludeDirectoriesStoreIncludedEntriesAndExcludedDirs,
+ /// index with all file entries and skip worktree flags for exclusion, directory-only include patterns in `.git/info/sparse-checkout` file.
+ IncludeDirectoriesStoreAllEntriesSkipUnmatched,
+ /// index with all file entries and skip-worktree flags for exclusion, `ignore` patterns to include entries in `.git/info/sparse-checkout` file.
+ IncludeByIgnorePatternStoreAllEntriesSkipUnmatched,
+ /// index with all entries, non is excluded, `.git/info/sparse-checkout` file is not considered, a regular index.
+ Disabled,
+}