use crate::config::cache::util::ApplyLeniencyDefault;
use crate::util::OwnedOrStaticAtomicBool;
use crate::{config, Repository};
pub use gix_status as plumbing;
pub struct Platform<'repo, Progress>
where
Progress: gix_features::progress::Progress + 'static,
{
repo: &'repo Repository,
progress: Progress,
index: Option<crate::worktree::IndexPersistedOrInMemory>,
submodules: Submodule,
index_worktree_options: index_worktree::Options,
should_interrupt: Option<OwnedOrStaticAtomicBool>,
}
#[derive(Copy, Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Hash)]
pub enum Submodule {
AsConfigured {
check_dirty: bool,
},
Given {
ignore: crate::submodule::config::Ignore,
check_dirty: bool,
},
}
#[derive(Default, Copy, Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Hash)]
pub enum UntrackedFiles {
None,
#[default]
Collapsed,
Files,
}
impl Default for Submodule {
fn default() -> Self {
Submodule::AsConfigured { check_dirty: false }
}
}
#[derive(Debug, thiserror::Error)]
#[allow(missing_docs)]
pub enum Error {
#[error(transparent)]
DirwalkOptions(#[from] config::boolean::Error),
#[error(transparent)]
ConfigureUntrackedFiles(#[from] config::key::GenericErrorWithValue),
}
impl Repository {
pub fn status<P>(&self, progress: P) -> Result<Platform<'_, P>, Error>
where
P: gix_features::progress::Progress + 'static,
{
let platform = Platform {
repo: self,
progress,
index: None,
submodules: Submodule::default(),
should_interrupt: None,
index_worktree_options: index_worktree::Options {
sorting: None,
dirwalk_options: Some(self.dirwalk_options()?),
rewrites: None,
thread_limit: None,
},
};
let untracked = self
.config
.resolved
.string(config::tree::Status::SHOW_UNTRACKED_FILES)
.map(|value| {
config::tree::Status::SHOW_UNTRACKED_FILES
.try_into_show_untracked_files(value)
.with_lenient_default(self.config.lenient_config)
})
.transpose()?
.unwrap_or_default();
Ok(platform.untracked_files(untracked))
}
}
#[allow(clippy::empty_docs)]
pub mod is_dirty {
use crate::Repository;
#[derive(Debug, thiserror::Error)]
#[allow(missing_docs)]
pub enum Error {
#[error(transparent)]
StatusPlatform(#[from] crate::status::Error),
#[error(transparent)]
CreateStatusIterator(#[from] crate::status::index_worktree::iter::Error),
}
impl Repository {
pub fn is_dirty(&self) -> Result<bool, Error> {
let is_dirty = self
.status(gix_features::progress::Discard)?
.index_worktree_rewrites(None)
.index_worktree_submodules(crate::status::Submodule::AsConfigured { check_dirty: true })
.index_worktree_options_mut(|opts| {
opts.dirwalk_options = None;
})
.into_index_worktree_iter(Vec::new())?
.take_while(Result::is_ok)
.next()
.is_some();
Ok(is_dirty)
}
}
}
mod platform;
#[allow(clippy::empty_docs)]
pub mod index_worktree;