pub enum StackModel {
None,
Graphite,
GhStack,
Mixed {
primary: StackProvider,
},
Git,
}Expand description
Which stacked-diff tool is managing stacks in this repository.
Variants§
None
No stack tool; today’s branch-flat behavior.
Graphite
Graphite (gt) manages stacks via refs/branch-metadata/*.
GhStack
gh stack (the github/gh-stack extension) manages stacks via a JSON file. See
stack/gh_stack.rs’s module docs for the shared-catalog model.
Mixed
Both Graphite and gh-stack have ref-backed tracked branches in this repository.
primary is consulted first by current_stack, enumerate_stacks, and
crate::assemble_changesets; the other provider answers only when primary has no
row for the branch in question. Only reachable via "auto" (or unset) config — an
explicit workon.stackModel = graphite/gh-stack stays strict, never falling back to
the other provider even when it also has live branches. See StackModel::detect.
Fields
primary: StackProviderGit
No stack-metadata tool; changesets are inferred purely from git, one per commit in
upstream..HEAD. Unlike StackModel::Graphite/StackModel::GhStack, this carries
no branch-level stack topology: enumerate_stacks and current_stack treat it as
flat (same as StackModel::None), since there is no metadata to enumerate stacks
from or to group branches into. Only crate::assemble_changesets (M1 changeset
assembly) gives this variant meaning, walking upstream..HEAD per-commit.
Not reachable via StackModel::detect — see the module docs’ Default-on-behavior
note on why auto-detection never resolves to Git.
Implementations§
Source§impl StackModel
impl StackModel
Sourcepub fn detect(repo: &Repository) -> Self
pub fn detect(repo: &Repository) -> Self
Auto-detect the active stack model from the repository environment.
Returns StackModel::Graphite when the repo has been initialized with gt init
(.graphite_repo_config or .graphite_metadata.db exists). Otherwise returns
StackModel::None.
Deliberately does NOT consult [graphite::detect_gt]: the repo’s own metadata is the
ground truth for “is this a Graphite stack,” and reading it is pure libgit2 (see the
module docs — no gt process is needed for detection or visualization). Gating on the
binary’s presence would report None for a genuine Graphite stack whenever gt happens
to be missing from PATH, silently emptying the review TUI’s stack. Whether gt can be
executed is a separate question, and belongs to the call sites that execute it.
Never returns StackModel::Git: auto-detection only distinguishes “a stack tool is
active” from “no stack tool,” since CLI routing treats any non-None model as
stack-active. Auto-resolving to Git for every repository with an upstream-tracking
branch would silently flip that routing for nearly every user. Git is reachable via
explicit workon.stackModel = git config, or a caller mapping None to Git before
calling crate::assemble_changesets (the review crate does this from M3 onward).
When both tools’ artifacts are present, detection tie-breaks on live metadata —
whether each provider has at least one ref-backed tracked branch (see
[graphite::has_live_branches]/[gh_stack::has_live_branches]) — rather than always
preferring one provider:
- Both live →
StackModel::Mixedwith gh-stack as primary: GitHub’s native stack support is the more deliberate signal now that it exists, so it answers first, but neither provider’s tracked branches are hidden. - Only one live → that provider, strict (not
Mixed): the other’s artifacts are stale (e.g. a lingering.graphite_repo_configfrom a repo that migrated to gh-stack), so there is nothing to fall back to. - Neither live →
GhStack: an ambiguous, doubly-stale state thatdoctor’sBothStackToolsDetectedcheck explains rather than detection resolving further.
A single artifact present (no ambiguity) skips the liveness read entirely and returns
that provider, matching today’s behavior. The escape hatch out of Mixed — or out of a
tie-break you disagree with — is an explicit workon.stackModel = graphite/gh-stack,
which is strict and never reachable via "auto".
Sourcepub fn providers(self) -> impl Iterator<Item = StackProvider>
pub fn providers(self) -> impl Iterator<Item = StackProvider>
Providers to consult, in fallback order. Graphite/GhStack consult only themselves
(strict, no fallback); Mixed consults primary first, then the other; None/Git
have no provider to consult.
Trait Implementations§
Source§impl Clone for StackModel
impl Clone for StackModel
impl Copy for StackModel
Source§impl Debug for StackModel
impl Debug for StackModel
impl Eq for StackModel
Source§impl PartialEq for StackModel
impl PartialEq for StackModel
impl StructuralPartialEq for StackModel
Auto Trait Implementations§
impl Freeze for StackModel
impl RefUnwindSafe for StackModel
impl Send for StackModel
impl Sync for StackModel
impl Unpin for StackModel
impl UnsafeUnpin for StackModel
impl UnwindSafe for StackModel
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<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
impl<T> ErasedDestructor for Twhere
T: 'static,
Source§impl<D> OwoColorize for D
impl<D> OwoColorize for D
Source§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
Source§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
Source§fn black(&self) -> FgColorDisplay<'_, Black, Self>
fn black(&self) -> FgColorDisplay<'_, Black, Self>
Source§fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
Source§fn red(&self) -> FgColorDisplay<'_, Red, Self>
fn red(&self) -> FgColorDisplay<'_, Red, Self>
Source§fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
Source§fn green(&self) -> FgColorDisplay<'_, Green, Self>
fn green(&self) -> FgColorDisplay<'_, Green, Self>
Source§fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
Source§fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
Source§fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
Source§fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
Source§fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
Source§fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
Source§fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
Source§fn white(&self) -> FgColorDisplay<'_, White, Self>
fn white(&self) -> FgColorDisplay<'_, White, Self>
Source§fn on_white(&self) -> BgColorDisplay<'_, White, Self>
fn on_white(&self) -> BgColorDisplay<'_, White, Self>
Source§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
Source§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
Source§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
Source§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
Source§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
Source§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
Source§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
Source§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
Source§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
Source§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
Source§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
Source§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
Source§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
Source§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
Source§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
Source§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
Source§fn bold(&self) -> BoldDisplay<'_, Self>
fn bold(&self) -> BoldDisplay<'_, Self>
Source§fn dimmed(&self) -> DimDisplay<'_, Self>
fn dimmed(&self) -> DimDisplay<'_, Self>
Source§fn italic(&self) -> ItalicDisplay<'_, Self>
fn italic(&self) -> ItalicDisplay<'_, Self>
Source§fn underline(&self) -> UnderlineDisplay<'_, Self>
fn underline(&self) -> UnderlineDisplay<'_, Self>
Source§fn blink(&self) -> BlinkDisplay<'_, Self>
fn blink(&self) -> BlinkDisplay<'_, Self>
Source§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
Source§fn reversed(&self) -> ReversedDisplay<'_, Self>
fn reversed(&self) -> ReversedDisplay<'_, Self>
Source§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
Source§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::fg or
a color-specific method, such as OwoColorize::green, Read moreSource§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::bg or
a color-specific method, such as OwoColorize::on_yellow, Read more