Skip to content

Commit efdbe21

Browse files
committed
feat(commit): add job cancellation support for AI generation #408
- Add ability to cancel ongoing commit message generation - Update UI to show cancel option when generation is active - Remove AnActionEvent parameter from generateAICommitMessage method - Improve job state management and error handling
1 parent 610f67a commit efdbe21

File tree

1 file changed

+27
-12
lines changed

1 file changed

+27
-12
lines changed

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

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -99,12 +99,29 @@ class CommitMessageSuggestionAction : ChatBaseAction() {
9999
e.presentation.description = "Generate commit message with AI"
100100
}
101101

102-
e.presentation.icon = AutoDevStatus.Ready.icon
102+
// Update icon based on current job status
103+
if (currentJob?.isActive == true) {
104+
e.presentation.icon = AutoDevStatus.InProgress.icon
105+
e.presentation.text = "Cancel Commit Message Generation"
106+
e.presentation.description = "Click to cancel current generation"
107+
} else {
108+
e.presentation.icon = AutoDevStatus.Ready.icon
109+
}
110+
103111
e.presentation.isEnabled = changes.isNotEmpty()
104112
}
105113

106114
override fun executeAction(event: AnActionEvent) {
107115
val project = event.project ?: return
116+
117+
// If there's an active job, cancel it
118+
if (currentJob?.isActive == true) {
119+
currentJob?.cancel()
120+
currentJob = null
121+
AutoDevNotifications.notify(project, "Commit message generation cancelled.")
122+
return
123+
}
124+
108125
val commitMessage = getCommitMessage(event) ?: return
109126

110127
val commitWorkflowUi = VcsUtil.getCommitWorkFlowUi(event)
@@ -129,7 +146,7 @@ class CommitMessageSuggestionAction : ChatBaseAction() {
129146
if (isGitHubRepository) {
130147
generateGitHubIssueCommitMessage(project, commitMessage, event)
131148
} else {
132-
generateAICommitMessage(project, commitMessage, changes, event)
149+
generateAICommitMessage(project, commitMessage, changes)
133150
}
134151
}
135152

@@ -149,7 +166,7 @@ class CommitMessageSuggestionAction : ChatBaseAction() {
149166
if (issues.isEmpty()) {
150167
// No issues found, fall back to AI generation
151168
val changes = currentChanges ?: return@invokeLater
152-
generateAICommitMessage(project, commitMessage, changes, event)
169+
generateAICommitMessage(project, commitMessage, changes)
153170
} else {
154171
createIssuesPopup(commitMessage, issues).showInBestPositionFor(event.dataContext)
155172
}
@@ -159,7 +176,7 @@ class CommitMessageSuggestionAction : ChatBaseAction() {
159176
logger.warn("Failed to fetch GitHub issues, falling back to AI generation", ex)
160177
// Fall back to AI generation when GitHub issues fetch fails
161178
val changes = currentChanges ?: return@invokeLater
162-
generateAICommitMessage(project, commitMessage, changes, event)
179+
generateAICommitMessage(project, commitMessage, changes)
163180
}
164181
}
165182
}
@@ -304,7 +321,7 @@ class CommitMessageSuggestionAction : ChatBaseAction() {
304321
val event = currentEvent ?: return
305322

306323
// Generate AI commit message with issue context
307-
generateAICommitMessage(project, commitMessage, changes, event)
324+
generateAICommitMessage(project, commitMessage, changes)
308325
}
309326

310327
private fun handleSkipIssueSelection(commitMessage: CommitMessage) {
@@ -316,10 +333,10 @@ class CommitMessageSuggestionAction : ChatBaseAction() {
316333
val event = currentEvent ?: return
317334

318335
// Generate AI commit message without issue context
319-
generateAICommitMessage(project, commitMessage, changes, event)
336+
generateAICommitMessage(project, commitMessage, changes)
320337
}
321338

322-
private fun generateAICommitMessage(project: Project, commitMessage: CommitMessage, changes: List<Change>, event: AnActionEvent) {
339+
private fun generateAICommitMessage(project: Project, commitMessage: CommitMessage, changes: List<Change>) {
323340
val diffContext = project.service<VcsPrompting>().prepareContext(changes)
324341
if (diffContext.isEmpty() || diffContext == "\n") {
325342
logger.warn("Diff context is empty or cannot get enough useful context.")
@@ -332,7 +349,6 @@ class CommitMessageSuggestionAction : ChatBaseAction() {
332349

333350
currentJob?.cancel()
334351
editorField.text = ""
335-
event.presentation.icon = AutoDevStatus.InProgress.icon
336352

337353
ApplicationManager.getApplication().executeOnPooledThread {
338354
val prompt = generateCommitMessage(diffContext, project, originText)
@@ -366,14 +382,13 @@ class CommitMessageSuggestionAction : ChatBaseAction() {
366382
AutoDevNotifications.notify(project, "Error generating commit message: ${e.message}")
367383
}
368384
} finally {
369-
invokeLater {
370-
event.presentation.icon = AutoDevStatus.Ready.icon
371-
}
385+
// Job completed, will be reflected in next update() call
386+
currentJob = null
372387
}
373388
}
374389
} catch (e: Exception) {
375390
logger.error("Failed to start commit message generation", e)
376-
event.presentation.icon = AutoDevStatus.Error.icon
391+
currentJob = null
377392
AutoDevNotifications.notify(project, "Failed to start commit message generation: ${e.message}")
378393
}
379394
}

0 commit comments

Comments
 (0)