Files
github__gh-stack/internal/tui/shared/styles.go
Sameen Karim 7a268fc380 modify command (#72)
* git primitives for modify cmd

* extract reusable TUI parts

* modify cmd

* recreate stack after modify

* add checks to prevent other modifications while modify is applying

* modify continue for resuming after resolving conflicts

* fix bug with duplicate stack entries after modifying

* reuse conflict resolution help msg from rebase

* additional confirmation before overwriting stack on remote

* fix recreate order of operations

Co-authored-by: Copilot <copilot@github.com>

* move base commit instead of cherry picking for fold up

* check to ensure we aren't left with zero branches

* unify and dedupe across view and modify tui

* more detailed help instructions

Co-authored-by: Copilot <copilot@github.com>

* only recommend submit if stack exists on remote

Co-authored-by: Copilot <copilot@github.com>

* tests for modify tui, apply modifications, submit modifications

* refactor submit for regular and pending modifications

* rename recover to abort

Co-authored-by: Copilot <copilot@github.com>

* docs for modify cmd

* tui styling updates

* updated tui screenshot

* addressing review comments

* Fix 4 bugs from code review

Bug 1: Move RevParseMap error check before using originalRefs.
The error from git.RevParseMap() was deferred past iteration of
originalRefs, which could panic on a nil map.

Bug 2: Differentiate cherry-pick vs rebase conflicts in modify.
Cherry-pick conflicts don't save state as 'conflict' phase, so
--continue won't work. Now prints --abort-only instructions for
cherry-pick conflicts.

Bug 3: Unwind now cleans up branches created by renames.
After restoring snapshot branches, Unwind deletes renamed branch
names that don't belong to the original snapshot.

Bug 4: Simplify push message in submit command.
Changed from 'Pushing N branches to remote...' to 'Pushing to
remote...' since individual branches may fail.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix 7 nit issues from code review

11: Add named constants for phase strings (PhaseApplying, PhaseConflict,
PhasePendingSubmit) in state.go; replace remaining raw literals in
state.go CheckStateGuard.

14: Fix bottomLines comment mismatch — listed 3 items but value is 2.

15: Extract magic number 88 to MinWidthForArt constant in header.go.

16: Remove unused stackview import anchor in model.go — the import
is used via types.go where BranchNode is embedded.

17: Simplify CheckStackLinearity parent resolution — ActiveBaseBranch
already handles skipping merged branches.

18: Fix rename undo matching any rename — add NewName check so only
the specific rename being undone is matched.

20: Add TestUndoRename and TestUndoRename_DoesNotAffectOtherRenames
to validate rename undo behavior.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Make cherry-pick conflicts recoverable via --continue

Previously, cherry-pick conflicts during fold-down operations could only
be resolved with --abort. Now they save full conflict state (phase,
conflict type, fold branch/target, remaining branches) to the state file,
enabling recovery via 'gh stack modify --continue'.

Changes:
- Add ConflictType field to StateFile (rebase or cherry_pick)
- Add FoldBranch/FoldTarget fields for cherry-pick context
- Add CherryPickContinue to git package (cherry-pick --continue)
- Save cherry-pick conflict state in ApplyPlan with remaining branches
- ContinueApply handles both rebase and cherry-pick conflicts
- Unified conflict messaging in cmd/modify.go (both types show --continue)
- Updated test to verify cherry-pick conflict state is saved correctly

* Apply suggestions from code review

Co-authored-by: Luke Ghenco <lukeghenco@github.com>
Co-authored-by: Sameen Karim <skarim@github.com>

---------

Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Luke Ghenco <lukeghenco@github.com>
2026-05-04 22:34:42 -04:00

58 lines
2.7 KiB
Go

package shared
import "github.com/charmbracelet/lipgloss"
var (
// Branch name styles
CurrentBranchStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("14")).Bold(true)
NormalBranchStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("15"))
MergedBranchStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("8"))
TrunkStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("8")).Italic(true)
// Status indicators
MergedIcon = lipgloss.NewStyle().Foreground(lipgloss.Color("5")).Render("✓")
WarningIcon = lipgloss.NewStyle().Foreground(lipgloss.Color("3")).Render("⚠")
OpenIcon = lipgloss.NewStyle().Foreground(lipgloss.Color("2")).Render("○")
QueuedIcon = lipgloss.NewStyle().Foreground(lipgloss.Color("130")).Render("◎")
// PR status styles
PRLinkStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("15")).Underline(true)
PROpenStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("2"))
PRMergedStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("5"))
PRClosedStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("1"))
PRDraftStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("8"))
PRQueuedStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("130"))
// Diff stats
AdditionsStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("2"))
DeletionsStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("1"))
// Commit lines
CommitSHAStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("3"))
CommitSubjectStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("15"))
CommitTimeStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("8"))
// Connector lines
ConnectorStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("8"))
ConnectorDashedStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("3"))
ConnectorFocusedStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("15"))
ConnectorCurrentStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("14"))
ConnectorMergedStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("5"))
ConnectorQueuedStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("130"))
// Dim text
DimStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("240"))
// Header styles
HeaderBorderStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("8"))
HeaderTitleStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("15")).Bold(true)
HeaderInfoStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("14"))
HeaderInfoLabelStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("8"))
HeaderShortcutKey = lipgloss.NewStyle().Foreground(lipgloss.Color("15"))
HeaderShortcutDesc = lipgloss.NewStyle().Foreground(lipgloss.Color("8"))
// Expand/collapse icons
ExpandedIcon = "▾"
CollapsedIcon = "▸"
)