Documentation
¶
Overview ¶
Package actions provides high-level business logic for CLI commands.
Each action corresponds to a stackit command (create, submit, sync, etc.) and orchestrates operations across the engine, git, and github packages.
Key patterns:
- Actions accept runtime.Context which provides Engine, Splog, and other dependencies
- Actions are stateless - all state is managed through the Engine interface
- Actions handle user interaction through the tui package
Dependencies:
- engine: Core branch state management
- git: Low-level git operations
- tui: User interface and prompts
Index ¶
- Constants
- func ConfigListAction(repoRoot string, writer io.Writer) error
- func ContinueAction(ctx *app.Context, opts ContinueOptions) error
- func DebugAction(ctx *app.Context, opts DebugOptions) error
- func EnterConflictWorkflow(ctx *app.Context, firstConflict string, allBranches engine.Branches) error
- func FormatRerereResolved(count int) string
- func FreezeAction(ctx *app.Context, branchName string) error
- func GetAction(ctx *app.Context, branchOrPR string, opts GetOptions, handler GetHandler) error
- func InfoAction(ctx *app.Context, opts InfoOptions) error
- func LogAction(ctx *app.Context, opts LogOptions) error
- func ModifyAction(ctx *app.Context, opts ModifyOptions) error
- func NewSnapshot(command string, options ...SnapshotOption) engine.SnapshotOptions
- func PluralIt(plural bool) string
- func PluralSuffix(word string, plural bool) string
- func Pluralize(word string, count int) string
- func PopAction(ctx *app.Context, _ PopOptions) error
- func PrintConflictStatus(ctx *app.Context, branchName string) error
- func PushMetadataAndSyncPRs(ctx *app.Context, branchNames []string) error
- func PushMetadataOnly(ctx *app.Context, eng MetadataPushEngine, branchNames []string) error
- func RenameAction(ctx *app.Context, opts RenameOptions) error
- func ReorderAction(ctx *app.Context) error
- func ResolveBranch(eng engine.BranchReader, branchName string) (engine.Branch, error)
- func ResolveBranchName(eng engine.BranchReader, branchName string) (string, error)
- func RestackAction(ctx *app.Context, plan *RestackPlan, handler handlers.RestackHandler) error
- func RestackBranches(ctx *app.Context, branches engine.Branches) error
- func RestackBranchesWithHandler(ctx *app.Context, branches engine.Branches, callback RestackProgressCallback, ...) error
- func SquashAction(ctx *app.Context, opts SquashOptions) error
- func StackInfoAction(ctx *app.Context, opts StackInfoOptions) error
- func TakeBestEffortSnapshot(ctx *app.Context, opts engine.SnapshotOptions)
- func UnfreezeAction(ctx *app.Context, branchName string) error
- func UpdateBranchPRMetadata(ctx *app.Context, name string, repoOwner, repoName string)
- func UpdateStackPRMetadata(ctx *app.Context, branches []string, repoOwner, repoName string)
- type BranchDeletionPlan
- type BranchInfo
- type BranchName
- type CheckoutHandler
- type CheckoutOptions
- type CheckoutResult
- type CleanBranchesOptions
- type CleanBranchesResult
- type CommandSnapshot
- type CommitSHA
- type ConflictMode
- type ContinuationStateInfo
- type ContinueOptions
- type DebugInfo
- type DebugOptions
- type DiffStats
- type GetEvent
- type GetEventType
- type GetHandler
- type GetNullHandler
- func (h *GetNullHandler) Complete(_ GetSummary)
- func (h *GetNullHandler) EmitEvent(_ GetEvent)
- func (h *GetNullHandler) OnRestackBranch(_ string, _ handlers.RestackResult, _ string, _ *int, _ engine.LockReason, ...)
- func (h *GetNullHandler) OnRestackComplete(_, _ int, _ []string)
- func (h *GetNullHandler) OnRestackStart(_ int)
- func (h *GetNullHandler) Start(_ string, _ *int)
- type GetOptions
- type GetPhase
- type GetSummary
- type InfoOptions
- type LogBranchInfo
- type LogJSONResult
- type LogOptions
- type LogPRInfo
- type LogSummary
- type MetadataDiffInfo
- type MetadataPushEngine
- type ModifyOptions
- type NullCheckoutHandler
- type PRNumber
- type PopOptions
- type RemoteMetadataStateInfo
- type RemoteRefInfo
- type RenameOptions
- type RepositoryInfo
- type RestackOptions
- type RestackPlan
- type RestackProgress
- type RestackProgressCallback
- type Restacker
- type SingleBranchInfo
- type SingleBranchPRInfo
- type SingleBranchStats
- type SnapshotOption
- type SquashOptions
- type StackBranchInfo
- type StackInfoOptions
- type StackInfoOutput
- type StackStateInfo
Constants ¶
const ( LogStyleNormal = "NORMAL" LogStyleFull = "FULL" LogStyleShort = "SHORT" )
LogStyle defines the output style for the log command
Variables ¶
This section is empty.
Functions ¶
func ConfigListAction ¶
ConfigListAction prints all configuration values in a formatted way
func ContinueAction ¶
func ContinueAction(ctx *app.Context, opts ContinueOptions) error
ContinueAction performs the continue operation
func DebugAction ¶
func DebugAction(ctx *app.Context, opts DebugOptions) error
DebugAction collects and outputs debugging information
func EnterConflictWorkflow ¶
func EnterConflictWorkflow(ctx *app.Context, firstConflict string, allBranches engine.Branches) error
EnterConflictWorkflow performs the rebase to enter conflict state and persists continuation state. This helper is shared between RestackBranchesWithHandler (standalone mode) and sync.RunSync (sync mode).
func FormatRerereResolved ¶
FormatRerereResolved renders the standard message describing how many rebase conflicts git rerere auto-resolved during an operation.
func FreezeAction ¶
FreezeAction freezes the specified branch and all branches downstack of it (recursive parents)
func GetAction ¶
func GetAction(ctx *app.Context, branchOrPR string, opts GetOptions, handler GetHandler) error
GetAction performs the get operation
func InfoAction ¶
func InfoAction(ctx *app.Context, opts InfoOptions) error
InfoAction displays information about a branch or the entire stack
func LogAction ¶
func LogAction(ctx *app.Context, opts LogOptions) error
LogAction displays the branch tree
func ModifyAction ¶
func ModifyAction(ctx *app.Context, opts ModifyOptions) error
ModifyAction performs the modify operation
func NewSnapshot ¶
func NewSnapshot(command string, options ...SnapshotOption) engine.SnapshotOptions
NewSnapshot creates a new SnapshotOptions with the given command and options
func PluralSuffix ¶
PluralSuffix returns the appropriate plural suffix for the given word if plural is true, otherwise empty string
func Pluralize ¶
Pluralize returns the plural form of word if count != 1, otherwise returns the singular form
func PopAction ¶
func PopAction(ctx *app.Context, _ PopOptions) error
PopAction deletes the current branch but retains the state of files in the working tree
func PrintConflictStatus ¶
PrintConflictStatus displays conflict information and instructions to the user. Assumes a rebase is in progress: HEAD-side markers reflect the parent/base and the ">>>>>>>" side reflects the branch being replayed. Both call sites (EnterConflictWorkflow and ContinueAction) operate during rebase.
func PushMetadataAndSyncPRs ¶
PushMetadataAndSyncPRs pushes metadata for the given branches to remote and updates their PRs on GitHub
func PushMetadataOnly ¶
func PushMetadataOnly(ctx *app.Context, eng MetadataPushEngine, branchNames []string) error
PushMetadataOnly pushes metadata refs without updating GitHub PRs. Use this when you want to push metadata changes but defer PR updates to sync.
func RenameAction ¶
func RenameAction(ctx *app.Context, opts RenameOptions) error
RenameAction renames the current branch and updates metadata
func ReorderAction ¶
ReorderAction performs the reorder operation
func ResolveBranch ¶
ResolveBranch resolves a branch name to a Branch, defaulting to current branch if empty. Returns errors.ErrNotOnBranchNoBranchSpecified if no branch specified and not on a branch.
func ResolveBranchName ¶
func ResolveBranchName(eng engine.BranchReader, branchName string) (string, error)
ResolveBranchName resolves a branch name, defaulting to current branch if empty. Returns errors.ErrNotOnBranchNoBranchSpecified if no branch specified and not on a branch.
func RestackAction ¶
func RestackAction(ctx *app.Context, plan *RestackPlan, handler handlers.RestackHandler) error
RestackAction performs the restack operation using a pre-computed plan. Build the plan via PlanRestack — callers are expected to use the plan to gate UX decisions (e.g. whether to start a TUI), so requiring it here keeps the two phases consistent.
func RestackBranches ¶
RestackBranches restacks a list of branches using the engine's batch restack method
func RestackBranchesWithHandler ¶
func RestackBranchesWithHandler(ctx *app.Context, branches engine.Branches, callback RestackProgressCallback, mode ConflictMode) error
RestackBranchesWithHandler restacks branches with optional progress callback. See ConflictMode for how mode controls conflict handling.
func SquashAction ¶
func SquashAction(ctx *app.Context, opts SquashOptions) error
SquashAction performs the squash operation
func StackInfoAction ¶
func StackInfoAction(ctx *app.Context, opts StackInfoOptions) error
StackInfoAction retrieves information about branches in the current stack
func TakeBestEffortSnapshot ¶
func TakeBestEffortSnapshot(ctx *app.Context, opts engine.SnapshotOptions)
TakeBestEffortSnapshot records an undo snapshot and logs failures without aborting the action.
func UnfreezeAction ¶
UnfreezeAction unfreezes the specified branch and all branches upstack of it (recursive children)
func UpdateBranchPRMetadata ¶
UpdateBranchPRMetadata updates PR title and body footer for a single branch
Types ¶
type BranchDeletionPlan ¶
type BranchDeletionPlan struct {
// BranchesToDelete maps branch name to deletion reason
BranchesToDelete map[string]string
// BranchesWithNewParents lists branches that will be reparented
BranchesWithNewParents []string
// SkippedInWorktree lists branches skipped due to being in a worktree
SkippedInWorktree []string
// UtilityBranches tracks which branches in BranchesToDelete are utility branches
// (e.g., consolidated merge branches). These can be auto-confirmed for deletion
// when their associated PR is closed/merged.
UtilityBranches map[string]bool
// UnpushedBranches tracks which branches in BranchesToDelete have unpushed local changes
// (local branch is ahead of or diverged from remote)
UnpushedBranches map[string]bool
// contains filtered or unexported fields
}
BranchDeletionPlan contains the planned branch deletions before execution
func PlanBranchDeletions ¶
func PlanBranchDeletions(ctx *app.Context, opts CleanBranchesOptions) (*BranchDeletionPlan, error)
PlanBranchDeletions identifies branches that should be deleted and builds a deletion plan. This does NOT execute any deletions - use ExecuteBranchDeletions to apply the plan.
type BranchInfo ¶
type BranchInfo struct {
Name string `json:"name"`
SHA string `json:"sha,omitempty"`
Parent string `json:"parent,omitempty"`
ParentRevision string `json:"parent_revision,omitempty"`
Children []string `json:"children,omitempty"`
IsTracked bool `json:"is_tracked"`
IsFixed bool `json:"is_fixed"`
IsTrunk bool `json:"is_trunk"`
PRInfo *engine.PrInfo `json:"pr_info,omitempty"`
MetadataRefSHA string `json:"metadata_ref_sha,omitempty"`
}
BranchInfo represents detailed information about a branch
type CheckoutHandler ¶
type CheckoutHandler interface {
// SelectBranch prompts the user to select a branch interactively.
// Returns the selected branch name, or an error if selection failed or was canceled.
SelectBranch(ctx *app.Context, opts CheckoutOptions) (string, error)
}
CheckoutHandler abstracts TTY vs non-TTY interactions for checkout operations
type CheckoutOptions ¶
type CheckoutOptions struct {
BranchName string // Optional: branch to checkout directly
ShowUntracked bool // Include untracked branches in selection
All bool // Show all branches across trunks
StackOnly bool // Only show current stack (ancestors + descendants)
CheckoutTrunk bool // Checkout trunk directly
SkipWorktreeSwitch bool // Skip worktree switch logic (for fallback checkout)
}
CheckoutOptions contains options for the checkout command
type CheckoutResult ¶
type CheckoutResult struct {
WorktreeSwitchPath string
RerunArgs []string
FallbackTips []string
TargetBranch string
}
CheckoutResult represents the outcome of a checkout operation.
func CheckoutAction ¶
func CheckoutAction(ctx *app.Context, opts CheckoutOptions, handler CheckoutHandler) (CheckoutResult, error)
CheckoutAction performs the checkout operation.
type CleanBranchesOptions ¶
type CleanBranchesOptions struct {
Force bool
InManagedWorktree bool // True if running from a stackit-managed worktree
CurrentBranch string // Name of the current branch (used to skip deletion in worktree)
}
CleanBranchesOptions contains options for cleaning branches
type CleanBranchesResult ¶
type CleanBranchesResult struct {
DeletedBranches map[string]string // name -> reason
BranchesWithNewParents []string
SkippedInWorktree []string // branches that couldn't be deleted from worktree
SkippedUnpushed []string // branches skipped due to unpushed local changes
}
CleanBranchesResult contains the result of cleaning branches
func CleanBranches ¶
func CleanBranches(ctx *app.Context, opts CleanBranchesOptions) (*CleanBranchesResult, error)
CleanBranches finds and deletes merged/closed branches. It follows a multi-phase approach: 1. Identify which branches SHOULD be deleted (parallel pre-calculation). 2. Build a deletion plan by traversing the stack (DFS). 3. Reparent branches that are NOT being deleted but whose parents ARE. 4. Execute the deletions in batches (greedy iterative approach).
func ExecuteBranchDeletions ¶
func ExecuteBranchDeletions(ctx *app.Context, plannedDeletion *BranchDeletionPlan, branchesToDelete map[string]bool) (*CleanBranchesResult, error)
ExecuteBranchDeletions executes a previously planned deletion. The branchesToDelete parameter allows filtering which branches from the plan to actually delete. If nil, all planned branches are deleted.
type CommandSnapshot ¶
type CommandSnapshot struct {
Timestamp time.Time `json:"timestamp"`
Command string `json:"command"`
Args []string `json:"args"`
CurrentBranch string `json:"current_branch"`
}
CommandSnapshot represents a single command from the undo history
type ConflictMode ¶
type ConflictMode int
ConflictMode controls how RestackBranchesWithHandler responds to rebase conflicts.
const ( // ConflictModeEnterWorkflow stops at the first conflict, writes rebase state // to the working tree, and expects the user to resolve it with stackit continue. // This is the standalone CLI default. ConflictModeEnterWorkflow ConflictMode = iota // ConflictModeContinue validates all branches first, restacks non-conflicting // ones, and reports conflicts through the progress callback without writing // rebase state. Use this in sync mode, parallel workers (rebase state would // be torn down with the worktree), and --continue-on-conflict flows. ConflictModeContinue )
type ContinuationStateInfo ¶
type ContinuationStateInfo struct {
BranchesToRestack []string `json:"branches_to_restack,omitempty"`
BranchesToSync []string `json:"branches_to_sync,omitempty"`
CurrentBranchOverride string `json:"current_branch_override,omitempty"`
RebasedBranchBase string `json:"rebased_branch_base,omitempty"`
}
ContinuationStateInfo represents continuation state
type ContinueOptions ¶
type ContinueOptions struct {
AddAll bool
}
ContinueOptions contains options for the continue command
type DebugInfo ¶
type DebugInfo struct {
Timestamp time.Time `json:"timestamp"`
RecentCommands []CommandSnapshot `json:"recent_commands"`
StackState StackStateInfo `json:"stack_state"`
ContinuationState *ContinuationStateInfo `json:"continuation_state,omitempty"`
RepositoryInfo RepositoryInfo `json:"repository_info"`
RemoteMetadataState *RemoteMetadataStateInfo `json:"remote_metadata_state,omitempty"`
}
DebugInfo represents the complete debugging information
type DebugOptions ¶
type DebugOptions struct {
Limit int // Limit number of recent commands to show (0 = all)
ShowRemote bool // Fetch and show remote metadata state
}
DebugOptions contains options for the debug command
type DiffStats ¶
type DiffStats struct {
FilesChanged int `json:"files_changed"`
Additions int `json:"additions"`
Deletions int `json:"deletions"`
}
DiffStats represents summary diff information
type GetEvent ¶
type GetEvent struct {
Phase GetPhase // Current phase
Type GetEventType // Event type
Branch string // Branch name (if applicable)
PRNumber *int // PR number (if applicable)
Message string // Human-readable description
NewRevision string // For position changes
IsNew bool // Is this a new branch?
Error error // If non-nil, this step had an error
}
GetEvent represents a progress update during get
type GetEventType ¶
type GetEventType string
GetEventType represents the type of get event
const ( GetEventStarted GetEventType = "started" GetEventProgress GetEventType = "progress" GetEventCompleted GetEventType = "completed" GetEventSkipped GetEventType = "skipped" )
Event types for get operations
type GetHandler ¶
type GetHandler interface {
// Start is called at the beginning of get with target info
Start(targetBranch string, prNumber *int)
// EmitEvent is called for each progress update
EmitEvent(event GetEvent)
// Complete is called when get finishes with the summary
Complete(summary GetSummary)
// RestackHandler methods are available for restack phase output
// This ensures consistent restack output between get, sync, and restack commands
handlers.RestackHandler
}
GetHandler abstracts TTY vs non-TTY output for get operations It embeds RestackHandler to provide consistent output for restack phase
type GetNullHandler ¶
type GetNullHandler struct{}
GetNullHandler is a no-op handler for testing or when output is not needed
func (*GetNullHandler) Complete ¶
func (h *GetNullHandler) Complete(_ GetSummary)
Complete implements GetHandler.
func (*GetNullHandler) EmitEvent ¶
func (h *GetNullHandler) EmitEvent(_ GetEvent)
EmitEvent implements GetHandler.
func (*GetNullHandler) OnRestackBranch ¶
func (h *GetNullHandler) OnRestackBranch(_ string, _ handlers.RestackResult, _ string, _ *int, _ engine.LockReason, _ bool, _ bool, _ string, _ bool, _, _ string, _ int)
OnRestackBranch implements RestackHandler.
func (*GetNullHandler) OnRestackComplete ¶
func (h *GetNullHandler) OnRestackComplete(_, _ int, _ []string)
OnRestackComplete implements RestackHandler.
func (*GetNullHandler) OnRestackStart ¶
func (h *GetNullHandler) OnRestackStart(_ int)
OnRestackStart implements RestackHandler.
func (*GetNullHandler) Start ¶
func (h *GetNullHandler) Start(_ string, _ *int)
Start implements GetHandler.
type GetOptions ¶
type GetOptions struct {
Downstack bool // Don't sync upstack branches if branch exists locally
Force bool // Overwrite all fetched branches with remote source of truth
Restack bool // Restack after syncing (default true)
Unfrozen bool // Checkout new branches as unfrozen
}
GetOptions contains options for the get command
type GetPhase ¶
type GetPhase string
GetPhase represents the current phase of the get operation
const ( GetPhaseFetch GetPhase = "fetch" // Fetching branches from remote GetPhaseSync GetPhase = "sync" // Syncing branches (create/update) GetPhaseMetadata GetPhase = "metadata" // Fetching and applying metadata GetPhaseCheckout GetPhase = "checkout" // Checking out target branch )
Phases of the get operation
type GetSummary ¶
type GetSummary struct {
TargetBranch string // The branch that was retrieved
BranchesCreated int // Number of branches created
BranchesUpdated int // Number of branches updated
Restacked int // Number of branches restacked
IsFrozen bool // Was the target branch frozen?
UpToDate bool // Everything was already current
}
GetSummary holds aggregate results from a get operation
type InfoOptions ¶
type InfoOptions struct {
BranchName string
Body bool
Diff bool
Patch bool
Stat bool
Stack bool
JSON bool
}
InfoOptions contains options for the info command
type LogBranchInfo ¶
type LogBranchInfo struct {
Name string `json:"name"`
Parent string `json:"parent,omitempty"`
IsCurrent bool `json:"is_current"`
IsTrunk bool `json:"is_trunk"`
IsLocked bool `json:"is_locked,omitempty"`
IsFrozen bool `json:"is_frozen,omitempty"`
NeedsRestack bool `json:"needs_restack,omitempty"`
Commits int `json:"commits"`
Additions int `json:"additions,omitempty"`
Deletions int `json:"deletions,omitempty"`
PR *LogPRInfo `json:"pr,omitempty"`
Scope string `json:"scope,omitempty"`
Children []string `json:"children,omitempty"`
}
LogBranchInfo represents a single branch in JSON output
type LogJSONResult ¶
type LogJSONResult struct {
Branches []LogBranchInfo `json:"branches"`
Summary LogSummary `json:"summary"`
GitHubAvailable bool `json:"github_available"`
}
LogJSONResult represents the JSON output for the log command
type LogOptions ¶
type LogOptions struct {
Style string // LogStyleNormal, LogStyleFull, or LogStyleShort
Steps *int
BranchName string
ShowUntracked bool
Interactive bool
ShowSHAs bool // Show commit SHAs next to branch names
JSON bool // Output in JSON format
}
LogOptions contains options for the log command
type LogPRInfo ¶
type LogPRInfo struct {
Number int `json:"number"`
URL string `json:"url,omitempty"`
Title string `json:"title,omitempty"`
State string `json:"state"`
IsDraft bool `json:"is_draft,omitempty"`
ReviewStatus string `json:"review_status,omitempty"`
CIStatus string `json:"ci_status,omitempty"`
}
LogPRInfo represents PR information in JSON output
type LogSummary ¶
type LogSummary struct {
TotalBranches int `json:"total_branches"`
ApprovedCount int `json:"approved_count"`
InReviewCount int `json:"in_review_count"`
}
LogSummary represents summary statistics in JSON output
type MetadataDiffInfo ¶
type MetadataDiffInfo struct {
Branch string `json:"branch"`
DiffFields []string `json:"diff_fields"`
LocalValue string `json:"local_value,omitempty"`
RemoteValue string `json:"remote_value,omitempty"`
}
MetadataDiffInfo represents a difference between local and remote metadata
type MetadataPushEngine ¶
type MetadataPushEngine interface {
BatchSetLastModifiedBy(branchNames []string) error
IsRemoteSyncEnabled() bool
SetRemoteSyncEnabled(enabled bool)
Git() git.Runner
}
MetadataPushEngine defines the engine capabilities needed for pushing metadata.
type ModifyOptions ¶
type ModifyOptions struct {
// Staging options
All bool // Stage all changes before committing (-a)
Update bool // Stage updates to tracked files only (-u)
Patch bool // Pick hunks to stage interactively (-p)
// Commit options
CreateCommit bool // Create a new commit instead of amending (-c)
Message string // Commit message (-m)
Edit bool // Open editor to edit commit message (-e)
NoEdit bool // Don't edit commit message (computed from flags)
ResetAuthor bool // Reset author to current user
Verbose int // Show diff in commit message template (-v)
// Interactive rebase
InteractiveRebase bool // Start interactive rebase on branch commits
}
ModifyOptions contains options for the modify command
type NullCheckoutHandler ¶
type NullCheckoutHandler struct{}
NullCheckoutHandler is a no-op handler that returns an error for interactive operations
func (*NullCheckoutHandler) SelectBranch ¶
func (h *NullCheckoutHandler) SelectBranch(_ *app.Context, _ CheckoutOptions) (string, error)
SelectBranch returns an error since interactive selection is not available
type RemoteMetadataStateInfo ¶
type RemoteMetadataStateInfo struct {
RemoteStateAvailable bool `json:"remote_state_available"`
RemoteRefs map[string]RemoteRefInfo `json:"remote_refs,omitempty"`
LocalVsRemoteDiffs []MetadataDiffInfo `json:"local_vs_remote_diffs,omitempty"`
}
RemoteMetadataStateInfo represents the state of metadata on the remote
type RemoteRefInfo ¶
type RemoteRefInfo struct {
SHA string `json:"sha"`
LastModified string `json:"last_modified,omitempty"`
ModifiedBy string `json:"modified_by,omitempty"`
Scope string `json:"scope,omitempty"`
}
RemoteRefInfo represents information about a single remote ref
type RenameOptions ¶
RenameOptions contains options for the rename command
type RepositoryInfo ¶
type RepositoryInfo struct {
RemoteURL string `json:"remote_url,omitempty"`
RepoRoot string `json:"repo_root,omitempty"`
}
RepositoryInfo represents basic repository information
type RestackOptions ¶
type RestackOptions struct {
BranchName string
Scope engine.StackRange
AllStacks bool
StackRoots []string
ContinueOnConflict bool
Parallel bool // Run independent stack groups in parallel worktrees
Jobs int // Number of parallel workers (0 = NumCPU)
}
RestackOptions contains options for the restack command
type RestackPlan ¶
type RestackPlan struct {
// contains filtered or unexported fields
}
RestackPlan is the precomputed work for a restack operation. Build it via PlanRestack, inspect via HasBranches/HasWork, then pass it to RestackAction.
Sharing the plan between the CLI's "is there work?" gate and the action itself avoids running engine.PlanRestack twice — that's ~3 git operations per branch, ~10ms/branch on a warm filesystem.
func PlanRestack ¶
func PlanRestack(ctx *app.Context, opts RestackOptions) (*RestackPlan, error)
PlanRestack resolves the branch groups for opts and pre-computes the engine restack plan for each group. Pass the result to RestackAction to skip recomputing those plans during execution.
The per-group engine plan is *not* reused in parallel mode — each worktree has its own engine and must compute its own plan against worktree-local state.
func (*RestackPlan) BranchCount ¶
func (p *RestackPlan) BranchCount() int
BranchCount returns the total number of branches across all groups.
func (*RestackPlan) HasBranches ¶
func (p *RestackPlan) HasBranches() bool
HasBranches reports whether any branch was resolved from the requested scope. False means the scope is empty (e.g. on trunk with no children).
func (*RestackPlan) HasWork ¶
func (p *RestackPlan) HasWork() bool
HasWork reports whether any resolved branch needs an actual rebase. Branches that are up-to-date, locked, or frozen do not count.
type RestackProgress ¶
type RestackProgress struct {
Branch string // the branch being processed
Result engine.RestackResult // Done, Unneeded, or Conflict
NewRev string // new revision if restacked (empty otherwise)
RerereResolvedCount int // number of rebase continuations handled by git rerere
Conflict bool // true if this is a conflict
LockReason engine.LockReason // why the branch is locked (empty if not locked)
Frozen bool // true if the branch is frozen
IsCurrent bool // true if this is the current branch
Reparented bool // true if the branch was reparented
OldParent string // the old parent name if reparented
NewParent string // the new parent name if reparented
StackRoot string // independent stack root (set by multi-stack callers; empty for single-stack)
}
RestackProgress describes the outcome of restacking a single branch. It is passed to RestackProgressCallback so callers can report progress without juggling a long positional parameter list.
type RestackProgressCallback ¶
type RestackProgressCallback func(RestackProgress)
RestackProgressCallback is called for each branch during restack with a RestackProgress describing the outcome.
type Restacker ¶
type Restacker interface {
engine.BranchReader
engine.SyncManager
}
Restacker is a minimal interface needed for restacking branches
type SingleBranchInfo ¶
type SingleBranchInfo struct {
Name string `json:"name"`
IsCurrent bool `json:"is_current"`
IsTrunk bool `json:"is_trunk"`
IsLocked bool `json:"is_locked"`
IsFrozen bool `json:"is_frozen"`
NeedsRestack bool `json:"needs_restack"`
Scope string `json:"scope"`
CommitDate string `json:"commit_date,omitempty"`
Parent string `json:"parent,omitempty"`
Children []string `json:"children,omitempty"`
PR *SingleBranchPRInfo `json:"pr,omitempty"`
CommitMessages []string `json:"commit_messages"`
DiffStats SingleBranchStats `json:"diff_stats"`
StackTitle string `json:"stack_title,omitempty"`
StackDescription string `json:"stack_description,omitempty"`
}
SingleBranchInfo represents JSON-serializable info for a single branch (used by info --json)
type SingleBranchPRInfo ¶
type SingleBranchPRInfo struct {
Number int `json:"number"`
Title string `json:"title"`
State string `json:"state"`
IsDraft bool `json:"is_draft"`
URL string `json:"url"`
}
SingleBranchPRInfo represents PR information for JSON output
type SingleBranchStats ¶
type SingleBranchStats struct {
FilesChanged int `json:"files_changed"`
Additions int `json:"additions"`
Deletions int `json:"deletions"`
}
SingleBranchStats represents diff statistics for a branch
type SnapshotOption ¶
type SnapshotOption func(*engine.SnapshotOptions)
SnapshotOption is a function that modifies SnapshotOptions
func WithArg ¶
func WithArg(arg string) SnapshotOption
WithArg appends a single argument if it's not empty
func WithFlag ¶
func WithFlag(condition bool, flag string) SnapshotOption
WithFlag appends a flag if condition is true
func WithFlagValue ¶
func WithFlagValue(flag string, value string) SnapshotOption
WithFlagValue appends a flag with a value if the value is not empty
type SquashOptions ¶
SquashOptions contains options for the squash command
type StackBranchInfo ¶
type StackBranchInfo struct {
Name string `json:"name"`
Parent string `json:"parent"`
IsLocked bool `json:"is_locked"`
IsFrozen bool `json:"is_frozen"`
Scope string `json:"scope"`
PRNumber *int `json:"pr_number,omitempty"`
PRURL string `json:"pr_url,omitempty"`
CommitMessages []string `json:"commit_messages"`
DiffStats DiffStats `json:"diff_stats"`
}
StackBranchInfo represents JSON-serializable info for a single branch in a stack
type StackInfoOptions ¶
type StackInfoOptions struct {
JSON bool
}
StackInfoOptions contains options for the stack info logic
type StackInfoOutput ¶
type StackInfoOutput struct {
StackTitle string `json:"stack_title,omitempty"`
StackDescription string `json:"stack_description,omitempty"`
Branches []StackBranchInfo `json:"branches"`
}
StackInfoOutput represents JSON-serializable output for the stack info command
type StackStateInfo ¶
type StackStateInfo struct {
Trunk string `json:"trunk"`
CurrentBranch string `json:"current_branch"`
Branches []BranchInfo `json:"branches"`
}
StackStateInfo represents the complete stack state
Source Files
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
Package abort implements the stackit abort command for canceling in-progress operations.
|
Package abort implements the stackit abort command for canceling in-progress operations. |
|
Package absorb provides functionality for absorbing staged changes into commits downstack.
|
Package absorb provides functionality for absorbing staged changes into commits downstack. |
|
Package create provides functionality for creating new stacked branches.
|
Package create provides functionality for creating new stacked branches. |
|
Package delete provides functionality for deleting branches and their metadata.
|
Package delete provides functionality for deleting branches and their metadata. |
|
Package describe implements the stackit describe command for managing stack descriptions.
|
Package describe implements the stackit describe command for managing stack descriptions. |
|
Package doctor provides diagnostic functionality for checking stackit environment and repository health.
|
Package doctor provides diagnostic functionality for checking stackit environment and repository health. |
|
Package flatten provides functionality for flattening stacked branches closer to trunk.
|
Package flatten provides functionality for flattening stacked branches closer to trunk. |
|
Package fold provides functionality for folding stacked branches.
|
Package fold provides functionality for folding stacked branches. |
|
Package foreach provides functionality for executing a command on each branch in a stack.
|
Package foreach provides functionality for executing a command on each branch in a stack. |
|
Package handler provides common handler types and base implementations for action handlers throughout the stackit codebase.
|
Package handler provides common handler types and base implementations for action handlers throughout the stackit codebase. |
|
Package init provides functionality for initializing Stackit in a Git repository.
|
Package init provides functionality for initializing Stackit in a Git repository. |
|
Package integrations provides functionality for integrating Stackit with external tools and hooks.
|
Package integrations provides functionality for integrating Stackit with external tools and hooks. |
|
Package lock provides functionality for locking and unlocking branches in a stack.
|
Package lock provides functionality for locking and unlocking branches in a stack. |
|
Package merge provides functionality for merging stacked pull requests.
|
Package merge provides functionality for merging stacked pull requests. |
|
Package move provides functionality for moving branches to different parents in the stack.
|
Package move provides functionality for moving branches to different parents in the stack. |
|
Package navigation implements the stackit top/bottom commands for navigating stacked branches.
|
Package navigation implements the stackit top/bottom commands for navigating stacked branches. |
|
Package pluck provides functionality for extracting a single branch from a stack.
|
Package pluck provides functionality for extracting a single branch from a stack. |
|
Package scope implements the stackit scope command for managing branch scopes.
|
Package scope implements the stackit scope command for managing branch scopes. |
|
Package split provides functionality for splitting stacked branches.
|
Package split provides functionality for splitting stacked branches. |
|
Package submit provides functionality for submitting stacked branches as pull requests.
|
Package submit provides functionality for submitting stacked branches as pull requests. |
|
Package sync provides functionality for synchronizing stacked branches with remote repositories.
|
Package sync provides functionality for synchronizing stacked branches with remote repositories. |
|
Package track implements the stackit track command for tracking branches in a stack.
|
Package track implements the stackit track command for tracking branches in a stack. |
|
Package undo provides functionality for undoing stackit operations using snapshots.
|
Package undo provides functionality for undoing stackit operations using snapshots. |
|
Package untrack implements the stackit untrack command for stopping branch tracking.
|
Package untrack implements the stackit untrack command for stopping branch tracking. |
|
Package validation provides reusable precondition validators for actions.
|
Package validation provides reusable precondition validators for actions. |
|
Package worktree provides actions for managing stackit-managed worktrees.
|
Package worktree provides actions for managing stackit-managed worktrees. |