49 lines · 1.9 KB · Rust
RawDownload
use bstr::BStr; use crate::IsActivePlatform; /// The error returned by [File::names_and_active_state](crate::File::names_and_active_state()).#[derive(Debug, thiserror::Error)]#[expect(missing_docs)]pub enum Error {    #[error(transparent)]    NormalizePattern(#[from] gix_pathspec::normalize::Error),    #[error(transparent)]    ParsePattern(#[from] gix_pathspec::parse::Error),} impl IsActivePlatform {    /// Returns `true` if the submodule named `name` is active or `false` otherwise.    /// `config` is the configuration that was passed to the originating [modules file](crate::File).    /// `attributes(relative_path, case, is_dir, outcome)` provides a way to resolve the attributes mentioned    /// in `submodule.active` pathspecs that are evaluated in the platforms git configuration.    ///    /// A submodule's active state is determined in the following order    ///    /// * it's `submodule.<name>.active` is set in `config`    /// * it matches a `submodule.active` pathspec either positively or negatively via `:!<spec>`    /// * it's active if it has any `url` set in `config`    pub fn is_active(        &mut self,        config: &gix_config::File,        name: &BStr,        attributes: &mut dyn FnMut(            &BStr,            gix_pathspec::attributes::glob::pattern::Case,            bool,            &mut gix_pathspec::attributes::search::Outcome,        ) -> bool,    ) -> Result<bool, gix_config::value::Error> {        if let Some(val) = config.boolean(&format!("submodule.{name}.active"))? {            return Ok(val);        }        if let Some(val) = self.search.as_mut().map(|search| {            search                .pattern_matching_relative_path(name, Some(true), attributes)                .is_some_and(|m| !m.is_excluded())        }) {            return Ok(val);        }        Ok(config.string(&format!("submodule.{name}.url")).is_some())    }}