Pre-launch — Gluecron is in final validation. Public signups and git hosting for non-owner users open after launch review.
CodeIssuesPull RequestsActionsSecurityInsightsSettings
✨ AI
More
claude/adoring-hopper-5x74bqclaude/affectionate-feynman-ykrf1hclaude/architecture-audit-design-wxprenclaude/build-status-update-3MXsfclaude/charming-meitner-mllb5rclaude/compare-gate-gluecron-s4mFQclaude/confident-faraday-tikcwbclaude/continue-work-XMTlIclaude/crontech-gluecron-deploy-7MIECclaude/crontech-platform-setup-SeKfwclaude/design-2026claude/ecstatic-ptolemy-jMdigclaude/enhance-github-integration-QNHdGclaude/fix-aa-loop-issue-PonMQclaude/fix-actions-and-processclaude/fix-desktop-errors-XqoW8claude/fix-red-workflowsclaude/fix-website-access-6FKJNclaude/gatetest-integration-hardeningclaude/github-audit-improvements-bDFr9claude/gluecron-launch-status-FoMRlclaude/hopeful-lamport-olfCTclaude/issue-to-pr-and-protectionsclaude/jolly-heisenberg-2sg1Qclaude/launch-preparation-QmTb6claude/new-session-xk1l7claude/plan-platform-architecture-kkN4yclaude/platform-analysis-roadmap-1nUGLclaude/platform-launch-assessment-8dWV8claude/polish-platform-release-AeDrUclaude/resume-previous-work-KzyLwclaude/review-crontech-handoff-qYEVqclaude/review-project-completeness-lHhS2claude/review-readme-docs-ulqPKclaude/serene-edison-rj87weclaude/setup-multi-repo-dev-BCwNQclaude/ship-fixes-and-tests-Jvz1cclaude/site-audit-competitive-pctlwgclaude/site-migration-vercel-XstpKclaude/standalone-product-repos-XHFTDcopilot/feat-smart-empty-states-keyboard-first-enhancementcopilot/feat-smart-morning-digest-review-context-restorecopilot/fix-and-process-workflowscopilot/update-ai-powered-code-reviewfeat/debt-mapfeat/push-policy-codeowners-hardeningfeat/smart-digest-contextfeat/stage-impactfeat/t1-secret-migrationfeat/u-polishfeat/w-self-hostfeat/w2-claude-configfix/agent-journey-orphan-sweepgatetest/auto-fix-1776586424172gatetest/auto-fix-1776586534814gatetest/auto-fix-1776590685143gatetest/auto-fix-1776590808199mainops/redeploy-retriggerstyle/dxt-cta-themeworktree-agent-a3377aad30d55da26worktree-agent-a7ef607b7ee1d6c74
MergePrAction.kt4.2 KB · 116 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package com.gluecron.actions

import com.gluecron.GluecronUtil
import com.gluecron.settings.GluecronSettingsState
import com.intellij.notification.NotificationType
import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.progress.ProgressIndicator
import com.intellij.openapi.progress.ProgressManager
import com.intellij.openapi.progress.Task
import com.intellij.openapi.project.DumbAware
import com.intellij.openapi.ui.Messages

/**
 * Merges the open pull request for the currently checked-out branch.
 *
 * Flow:
 *   1. Detect owner/repo from the git remote URL.
 *   2. Detect the current branch name.
 *   3. Ask the user to confirm (the merge is irreversible).
 *   4. POST to {host}/api/repos/{owner}/{repo}/pulls/merge
 *      with body: { "head": "<branch>", "merge_method": "merge" }
 *   5. Show a success or error balloon notification.
 *
 * The API call runs on a background thread via ProgressManager so it
 * doesn't block the EDT.
 *
 * This is the JetBrains equivalent of the VS Code "gluecron.mergePr" command.
 */
class MergePrAction : AnAction(), DumbAware {

    override fun actionPerformed(e: AnActionEvent) {
        val project = e.project ?: return
        val settings = GluecronSettingsState.getInstance()

        if (settings.token.isBlank()) {
            GluecronUtil.notify(
                project,
                "Gluecron access token is not configured. " +
                    "Go to Settings → Tools → Gluecron to add your token.",
                NotificationType.ERROR
            )
            return
        }

        val (owner, repo) = GluecronUtil.detectOwnerRepo(project)
            ?: run {
                GluecronUtil.notify(
                    project,
                    "No Gluecron remote detected. Ensure the project has a git remote " +
                        "pointing to ${settings.host}.",
                    NotificationType.WARNING
                )
                return
            }

        val branch = GluecronUtil.currentBranch(project)
            ?: run {
                GluecronUtil.notify(
                    project,
                    "Could not determine the current branch.",
                    NotificationType.WARNING
                )
                return
            }

        // Confirm before merging — this is a destructive action
        val confirmed = Messages.showYesNoDialog(
            project,
            "Merge the open pull request for branch \"$branch\" into $owner/$repo?\n\n" +
                "This action cannot be undone.",
            "Merge PR — Gluecron",
            "Merge",
            "Cancel",
            Messages.getQuestionIcon()
        )
        if (confirmed != Messages.YES) return

        // Run the API call on a background thread
        ProgressManager.getInstance().run(object : Task.Backgroundable(
            project,
            "Gluecron: Merging PR for branch \"$branch\"…",
            false
        ) {
            override fun run(indicator: ProgressIndicator) {
                indicator.isIndeterminate = true
                try {
                    val path = "/api/repos/$owner/$repo/pulls/merge"
                    val body = """{"head":"$branch","merge_method":"merge"}"""
                    GluecronUtil.apiPost(path, body)

                    ApplicationManager.getApplication().invokeLater {
                        GluecronUtil.notify(
                            project,
                            "PR for branch \"$branch\" merged successfully into $owner/$repo.",
                            NotificationType.INFORMATION
                        )
                    }
                } catch (ex: Exception) {
                    ApplicationManager.getApplication().invokeLater {
                        GluecronUtil.notify(
                            project,
                            "Failed to merge PR: ${ex.message}",
                            NotificationType.ERROR
                        )
                    }
                }
            }
        })
    }

    override fun update(e: AnActionEvent) {
        e.presentation.isEnabledAndVisible = e.project != null
    }
}