@@ -118,7 +118,7 @@ enum TerminalRepoPromptResolution: Equatable {
118118enum TerminalRepoPrompt {
119119 static func classify( snapshot: TerminalRepoPromptSnapshot ) -> TerminalRepoPromptReadyState {
120120 let actionStates = actionStates ( for: snapshot)
121- let primaryAction = actionStates . first ( where : \ . isAvailable ) ? . action ?? . commit
121+ let primaryAction = primaryAction ( for : snapshot )
122122 let shortcutAction = shortcutAction ( for: snapshot, primaryAction: primaryAction)
123123
124124 return . init(
@@ -129,14 +129,32 @@ enum TerminalRepoPrompt {
129129 )
130130 }
131131
132+ private static func primaryAction( for snapshot: TerminalRepoPromptSnapshot ) -> TerminalRepoPromptAction {
133+ if snapshot. hasDirtyChanges {
134+ return . commit
135+ }
136+
137+ let trackingKnown = snapshot. gitTracking != nil
138+ let hasUpstream = snapshot. gitTracking? . hasUpstream ?? false
139+ let aheadCount = snapshot. gitTracking? . ahead ?? 0
140+ let needsPush = trackingKnown && ( !hasUpstream || aheadCount > 0 )
141+
142+ if snapshot. openPR != nil {
143+ return needsPush ? . push : . updatePR
144+ }
145+
146+ return needsPush ? . push : . openPR
147+ }
148+
132149 private static func shortcutAction(
133150 for snapshot: TerminalRepoPromptSnapshot ,
134151 primaryAction: TerminalRepoPromptAction
135152 ) -> TerminalRepoPromptShortcutState ? {
136153 let hasOpenPR = snapshot. openPR != nil
154+ let trackingKnown = snapshot. gitTracking != nil
137155 let hasUpstream = snapshot. gitTracking? . hasUpstream ?? false
138156 let aheadCount = snapshot. gitTracking? . ahead ?? 0
139- let needsPush = !hasUpstream || aheadCount > 0
157+ let needsPush = trackingKnown && ( !hasUpstream || aheadCount > 0 )
140158
141159 switch primaryAction {
142160 case . commit:
@@ -167,9 +185,10 @@ enum TerminalRepoPrompt {
167185 ) -> [ TerminalRepoPromptActionState ] {
168186 let hasDirtyChanges = snapshot. hasDirtyChanges
169187 let hasOpenPR = snapshot. openPR != nil
188+ let trackingKnown = snapshot. gitTracking != nil
170189 let hasUpstream = snapshot. gitTracking? . hasUpstream ?? false
171190 let aheadCount = snapshot. gitTracking? . ahead ?? 0
172- let needsPush = !hasUpstream || aheadCount > 0
191+ let needsPush = trackingKnown && ( !hasUpstream || aheadCount > 0 )
173192
174193 return TerminalRepoPromptAction . menuActions. map { action in
175194 switch action {
@@ -197,6 +216,20 @@ enum TerminalRepoPrompt {
197216 )
198217 }
199218
219+ if !trackingKnown {
220+ let description = if hasOpenPR {
221+ " Push the current branch to the existing PR branch if needed. "
222+ } else {
223+ " Push the current branch and set upstream if needed. "
224+ }
225+
226+ return . init(
227+ action: action,
228+ isAvailable: true ,
229+ description: description
230+ )
231+ }
232+
200233 if needsPush {
201234 let description = if hasOpenPR {
202235 " Push the current branch to the existing PR branch. "
0 commit comments