pub struct RepoIdent {
pub workdir: Option<PathBuf>,
pub commondir: Option<PathBuf>,
pub remote: Option<String>,
}Expand description
Git’s own answer to “what repo is this”, discovered once per invocation.
commondir is git’s shared git-dir: for a linked worktree this is the
main checkout’s .git/, so every worktree of one clone reads the same
remote and hashes to the same slug — worktrees share history, so they
share a store. For a submodule it is the submodule’s own private dir
under .git/modules/, carrying the submodule’s own remote and therefore
its own, different slug — a submodule is a different repo with a
disjoint path namespace, so its file:* keys must never land in the
parent’s store.
workdir is None for a bare repository (no working tree to resolve
record paths against) or when no repo is discoverable at all.
Fields§
§workdir: Option<PathBuf>§commondir: Option<PathBuf>§remote: Option<String>Implementations§
Source§impl RepoIdent
impl RepoIdent
Sourcepub fn discover(path: &Path) -> Self
pub fn discover(path: &Path) -> Self
Discover the identity of the repo containing (or rooted at) path.
One git2::Repository::discover call.
A caller that needs more than one derived value (Self::slug,
Self::slug_root, a worktree tag, …) for the same invocation
should discover once and reuse the result rather than calling this
again — see cli::hook_decide::entry::run_inner.
Sourcepub fn discover_with_repo(path: &Path) -> (Self, Option<Repository>)
pub fn discover_with_repo(path: &Path) -> (Self, Option<Repository>)
Self::discover, plus the live git2::Repository handle for a
caller that also needs actual git operations (blob/commit lookups),
not just identity facts — e.g. crate::health::staleness::StalenessAnalyzer.
Still exactly one discover call.
Sourcepub fn slug(&self, fallback_path: &Path) -> String
pub fn slug(&self, fallback_path: &Path) -> String
The slug this identity hashes to: the first 8 hex characters of
SHA-256(remote URL); falling back to SHA-256(workdir) when the repo
has no remote; falling back further to SHA-256(canonicalized
fallback_path) when git found no working tree to key on at all —
no repo, or a bare one.
The no-remote fallback hashes workdir itself, never a git-internal
path like commondir: a .git that is itself a symlink must not
leak its target’s location into the project’s identity, and hashing
the same field Self::slug_root returns makes the two agree by
construction rather than by two independent computations that merely
happen to match.
Sourcepub fn slug_root(&self, fallback_path: &Path) -> PathBuf
pub fn slug_root(&self, fallback_path: &Path) -> PathBuf
The root record paths resolve against: Self::workdir, or the
canonicalized fallback_path when there is none (no repo, or a bare
one — a bare repo has no working tree to offer).
A bare repo’s fallback_path is its own location, never an
ancestor’s: discover recognizes a bare repository in its own right
and does not walk past it looking for an enclosing one, so a bare
clone nested under an unrelated working repo can never inherit that
repo’s root (or its store).
Trait Implementations§
impl Eq for RepoIdent
impl StructuralPartialEq for RepoIdent
Auto Trait Implementations§
impl Freeze for RepoIdent
impl RefUnwindSafe for RepoIdent
impl Send for RepoIdent
impl Sync for RepoIdent
impl Unpin for RepoIdent
impl UnsafeUnpin for RepoIdent
impl UnwindSafe for RepoIdent
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.impl<T> Fruit for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more