Skip to content

Commit 610f67a

Browse files
committed
feat(commit): streamline GitHub issue integration workflow
Remove redundant user prompts and implement automatic fallback from GitHub issue selection to AI generation. When GitHub issues are unavailable or user cancels selection, the system now seamlessly falls back to AI-only commit message generation instead of showing error dialogs.
1 parent ccfcbcd commit 610f67a

File tree

1 file changed

+38
-36
lines changed

1 file changed

+38
-36
lines changed

exts/ext-git/src/main/kotlin/cc/unitmesh/git/actions/vcs/CommitMessageSuggestionAction.kt

Lines changed: 38 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ class CommitMessageSuggestionAction : ChatBaseAction() {
7070
private var selectedIssue: IssueDisplayItem? = null
7171
private var currentChanges: List<Change>? = null
7272
private var currentEvent: AnActionEvent? = null
73+
private var isGitHubRepository: Boolean = false
7374

7475
override fun getActionType(): ChatActionType = ChatActionType.GEN_COMMIT_MESSAGE
7576

@@ -86,8 +87,11 @@ class CommitMessageSuggestionAction : ChatBaseAction() {
8687
val prompting = project.service<VcsPrompting>()
8788
val changes: List<Change> = prompting.getChanges()
8889

90+
// Check if it's a GitHub repository (safe to call in BGT)
91+
isGitHubRepository = GitHubIssue.isGitHubRepository(project)
92+
8993
// Update presentation text based on whether it's a GitHub repository
90-
if (GitHubIssue.isGitHubRepository(project)) {
94+
if (isGitHubRepository) {
9195
e.presentation.text = "Smart Commit Message (GitHub Enhanced)"
9296
e.presentation.description = "Generate commit message with AI or GitHub issue integration"
9397
} else {
@@ -120,34 +124,17 @@ class CommitMessageSuggestionAction : ChatBaseAction() {
120124
currentEvent = event
121125
selectedIssue = null
122126

123-
// Check if it's a GitHub repository and show options
124-
if (GitHubIssue.isGitHubRepository(project)) {
125-
showGitHubOptions(project, commitMessage, changes, event)
127+
// For GitHub repositories, show issue selection popup directly
128+
// For non-GitHub repositories, generate AI commit message directly
129+
if (isGitHubRepository) {
130+
generateGitHubIssueCommitMessage(project, commitMessage, event)
126131
} else {
127132
generateAICommitMessage(project, commitMessage, changes, event)
128133
}
129134
}
130135

131136
private fun getCommitMessage(e: AnActionEvent) = e.getData(VcsDataKeys.COMMIT_MESSAGE_CONTROL) as? CommitMessage
132137

133-
private fun showGitHubOptions(project: Project, commitMessage: CommitMessage, changes: List<Change>, event: AnActionEvent) {
134-
val options = arrayOf("Use GitHub Issue", "Generate with AI", "Cancel")
135-
val choice = Messages.showDialog(
136-
project,
137-
"Choose how to generate commit message:",
138-
"Commit Message Generation",
139-
options,
140-
0,
141-
Messages.getQuestionIcon()
142-
)
143-
144-
when (choice) {
145-
0 -> generateGitHubIssueCommitMessage(project, commitMessage, event)
146-
1 -> generateAICommitMessage(project, commitMessage, changes, event)
147-
// 2 or -1 (Cancel or ESC) - do nothing
148-
}
149-
}
150-
151138
private fun generateGitHubIssueCommitMessage(project: Project, commitMessage: CommitMessage, event: AnActionEvent) {
152139
val task = object : Task.Backgroundable(project, "Loading GitHub issues", true) {
153140
override fun run(indicator: ProgressIndicator) {
@@ -160,22 +147,19 @@ class CommitMessageSuggestionAction : ChatBaseAction() {
160147
indicator.fraction = 0.9
161148
ApplicationManager.getApplication().invokeLater {
162149
if (issues.isEmpty()) {
163-
Messages.showInfoMessage(
164-
project,
165-
"No issues found in this GitHub repository.",
166-
"GitHub Issues"
167-
)
150+
// No issues found, fall back to AI generation
151+
val changes = currentChanges ?: return@invokeLater
152+
generateAICommitMessage(project, commitMessage, changes, event)
168153
} else {
169154
createIssuesPopup(commitMessage, issues).showInBestPositionFor(event.dataContext)
170155
}
171156
}
172157
} catch (ex: Exception) {
173158
ApplicationManager.getApplication().invokeLater {
174-
Messages.showErrorDialog(
175-
project,
176-
"Failed to fetch GitHub issues: ${ex.message}",
177-
"GitHub Issues Error"
178-
)
159+
logger.warn("Failed to fetch GitHub issues, falling back to AI generation", ex)
160+
// Fall back to AI generation when GitHub issues fetch fails
161+
val changes = currentChanges ?: return@invokeLater
162+
generateAICommitMessage(project, commitMessage, changes, event)
179163
}
180164
}
181165
}
@@ -243,9 +227,10 @@ class CommitMessageSuggestionAction : ChatBaseAction() {
243227

244228
private fun createIssuesPopup(commitMessage: CommitMessage, issues: List<IssueDisplayItem>): JBPopup {
245229
var chosenIssue: IssueDisplayItem? = null
230+
var selectedIndex: Int = -1
246231

247232
return JBPopupFactory.getInstance().createPopupChooserBuilder(issues)
248-
.setTitle("Select Issue")
233+
.setTitle("Select GitHub Issue (ESC to skip)")
249234
.setVisibleRowCount(10)
250235
.setSelectionMode(SINGLE_SELECTION)
251236
.setItemSelectedCallback { chosenIssue = it }
@@ -283,8 +268,12 @@ class CommitMessageSuggestionAction : ChatBaseAction() {
283268
override fun onClosed(event: LightweightWindowEvent) {
284269
// IDEA-195094 Regression: New CTRL-E in "commit changes" breaks keyboard shortcuts
285270
commitMessage.editorField.requestFocusInWindow()
286-
chosenIssue?.let { issue ->
287-
handleIssueSelection(issue, commitMessage)
271+
if (chosenIssue != null) {
272+
// User selected an issue
273+
handleIssueSelection(chosenIssue!!, commitMessage)
274+
} else {
275+
// User cancelled (ESC) - skip issue selection and generate with AI
276+
handleSkipIssueSelection(commitMessage)
288277
}
289278
}
290279
})
@@ -307,13 +296,26 @@ class CommitMessageSuggestionAction : ChatBaseAction() {
307296
}
308297

309298
private fun handleIssueSelection(issueItem: IssueDisplayItem, commitMessage: CommitMessage) {
299+
// Store the selected issue for AI generation
310300
selectedIssue = issueItem
311301

312-
// Now generate AI commit message with issue context
313302
val project = commitMessage.editorField.project ?: return
314303
val changes = currentChanges ?: return
315304
val event = currentEvent ?: return
316305

306+
// Generate AI commit message with issue context
307+
generateAICommitMessage(project, commitMessage, changes, event)
308+
}
309+
310+
private fun handleSkipIssueSelection(commitMessage: CommitMessage) {
311+
// Skip issue selection, generate with AI only
312+
selectedIssue = null
313+
314+
val project = commitMessage.editorField.project ?: return
315+
val changes = currentChanges ?: return
316+
val event = currentEvent ?: return
317+
318+
// Generate AI commit message without issue context
317319
generateAICommitMessage(project, commitMessage, changes, event)
318320
}
319321

0 commit comments

Comments
 (0)