mirror of
https://github.com/gitpod-io/gitpod.git
synced 2025-12-08 17:36:30 +00:00
Add Gitpod-related actions to JetBrains IDEs
This commit is contained in:
parent
87ee97d7cd
commit
a794d7f2a1
@ -37,4 +37,16 @@ public interface GitpodServer {
|
|||||||
|
|
||||||
@JsonRequest
|
@JsonRequest
|
||||||
CompletableFuture<WorkspaceInstancePort> openPort(String workspaceId, WorkspaceInstancePort port);
|
CompletableFuture<WorkspaceInstancePort> openPort(String workspaceId, WorkspaceInstancePort port);
|
||||||
|
|
||||||
|
@JsonRequest
|
||||||
|
CompletableFuture<String> takeSnapshot(TakeSnapshotOptions options);
|
||||||
|
|
||||||
|
@JsonRequest
|
||||||
|
CompletableFuture<Void> waitForSnapshot(String snapshotId);
|
||||||
|
|
||||||
|
@JsonRequest
|
||||||
|
CompletableFuture<SetWorkspaceTimeoutResult> setWorkspaceTimeout(String workspaceId, String duration);
|
||||||
|
|
||||||
|
@JsonRequest
|
||||||
|
CompletableFuture<Void> stopWorkspace(String workspaceId);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,20 @@
|
|||||||
|
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
|
||||||
|
// Licensed under the GNU Affero General Public License (AGPL).
|
||||||
|
// See License-AGPL.txt in the project root for license information.
|
||||||
|
|
||||||
|
package io.gitpod.gitpodprotocol.api.entities;
|
||||||
|
|
||||||
|
public enum Error {
|
||||||
|
NOT_FOUND(404),
|
||||||
|
SNAPSHOT_ERROR(630);
|
||||||
|
|
||||||
|
private int errCode;
|
||||||
|
|
||||||
|
Error(int errCode) {
|
||||||
|
this.errCode = errCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getErrCode() {
|
||||||
|
return errCode;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
|
||||||
|
// Licensed under the GNU Affero General Public License (AGPL).
|
||||||
|
// See License-AGPL.txt in the project root for license information.
|
||||||
|
|
||||||
|
package io.gitpod.gitpodprotocol.api.entities;
|
||||||
|
|
||||||
|
public class SetWorkspaceTimeoutResult {
|
||||||
|
private String[] resetTimeoutOnWorkspaces;
|
||||||
|
|
||||||
|
public SetWorkspaceTimeoutResult(String[] resetTimeoutOnWorkspaces) {
|
||||||
|
this.resetTimeoutOnWorkspaces = resetTimeoutOnWorkspaces;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getResetTimeoutOnWorkspaces() {
|
||||||
|
return resetTimeoutOnWorkspaces;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,46 @@
|
|||||||
|
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
|
||||||
|
// Licensed under the GNU Affero General Public License (AGPL).
|
||||||
|
// See License-AGPL.txt in the project root for license information.
|
||||||
|
|
||||||
|
package io.gitpod.gitpodprotocol.api.entities;
|
||||||
|
|
||||||
|
public class TakeSnapshotOptions {
|
||||||
|
private String workspaceId;
|
||||||
|
private String layoutData;
|
||||||
|
private boolean dontWait;
|
||||||
|
|
||||||
|
public TakeSnapshotOptions(final String workspaceId, final String layoutData, final Boolean dontWait) {
|
||||||
|
this.workspaceId = workspaceId;
|
||||||
|
this.layoutData = layoutData;
|
||||||
|
this.dontWait = dontWait;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TakeSnapshotOptions(final String workspaceId, final Boolean dontWait) {
|
||||||
|
this.workspaceId = workspaceId;
|
||||||
|
this.dontWait = dontWait;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLayoutData() {
|
||||||
|
return layoutData;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLayoutData(String layoutData) {
|
||||||
|
this.layoutData = layoutData;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getWorkspaceId() {
|
||||||
|
return workspaceId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWorkspaceId(String workspaceId) {
|
||||||
|
this.workspaceId = workspaceId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isDontWait() {
|
||||||
|
return dontWait;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDontWait(boolean dontWait) {
|
||||||
|
this.dontWait = dontWait;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
|
||||||
|
// Licensed under the GNU Affero General Public License (AGPL).
|
||||||
|
// See License-AGPL.txt in the project root for license information.
|
||||||
|
|
||||||
|
package io.gitpod.gitpodprotocol.api.entities;
|
||||||
|
|
||||||
|
public enum WorkspaceTimeoutDuration {
|
||||||
|
DURATION_SHORT("short"),
|
||||||
|
DURATION_LONG("long"),
|
||||||
|
DURATION_EXTENDED("extended"),
|
||||||
|
DURATION_180M("180m"); // for backwards compatibility since the IDE uses this
|
||||||
|
|
||||||
|
private String value;
|
||||||
|
|
||||||
|
WorkspaceTimeoutDuration(String value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
package io.gitpod.jetbrains.remote
|
package io.gitpod.jetbrains.remote
|
||||||
|
|
||||||
|
import com.intellij.ide.BrowserUtil
|
||||||
import com.intellij.ide.plugins.PluginManagerCore
|
import com.intellij.ide.plugins.PluginManagerCore
|
||||||
import com.intellij.notification.NotificationAction
|
import com.intellij.notification.NotificationAction
|
||||||
import com.intellij.notification.NotificationGroupManager
|
import com.intellij.notification.NotificationGroupManager
|
||||||
@ -53,6 +54,7 @@ import java.util.concurrent.CancellationException
|
|||||||
import java.util.concurrent.CompletableFuture
|
import java.util.concurrent.CompletableFuture
|
||||||
import javax.websocket.DeploymentException
|
import javax.websocket.DeploymentException
|
||||||
|
|
||||||
|
@Suppress("UnstableApiUsage", "OPT_IN_USAGE")
|
||||||
@Service
|
@Service
|
||||||
class GitpodManager : Disposable {
|
class GitpodManager : Disposable {
|
||||||
|
|
||||||
@ -258,9 +260,12 @@ class GitpodManager : Disposable {
|
|||||||
val tokenResponse = retry(3) {
|
val tokenResponse = retry(3) {
|
||||||
val request = Token.GetTokenRequest.newBuilder()
|
val request = Token.GetTokenRequest.newBuilder()
|
||||||
.setHost(info.gitpodApi.host)
|
.setHost(info.gitpodApi.host)
|
||||||
.addScope("function:sendHeartBeat")
|
|
||||||
.addScope("function:trackEvent")
|
|
||||||
.addScope("function:openPort")
|
.addScope("function:openPort")
|
||||||
|
.addScope("function:sendHeartBeat")
|
||||||
|
.addScope("function:setWorkspaceTimeout")
|
||||||
|
.addScope("function:stopWorkspace")
|
||||||
|
.addScope("function:takeSnapshot")
|
||||||
|
.addScope("function:trackEvent")
|
||||||
.setKind("gitpod")
|
.setKind("gitpod")
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
@ -393,4 +398,10 @@ class GitpodManager : Disposable {
|
|||||||
metricsJob.cancel()
|
metricsJob.cancel()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Opens the give URL in the Browser and records an event indicating it was open from a custom IntelliJ Action. */
|
||||||
|
fun openUrlFromAction(url: String) {
|
||||||
|
trackEvent("jb_execute_command_gitpod_open_link", mapOf("url" to url))
|
||||||
|
BrowserUtil.browse(url)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,23 @@
|
|||||||
|
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
|
||||||
|
// Licensed under the GNU Affero General Public License (AGPL).
|
||||||
|
// See License-AGPL.txt in the project root for license information.
|
||||||
|
|
||||||
|
package io.gitpod.jetbrains.remote.actions
|
||||||
|
|
||||||
|
import com.intellij.openapi.actionSystem.AnAction
|
||||||
|
import com.intellij.openapi.actionSystem.AnActionEvent
|
||||||
|
import com.intellij.openapi.components.service
|
||||||
|
import io.gitpod.jetbrains.remote.GitpodManager
|
||||||
|
import org.apache.http.client.utils.URIBuilder
|
||||||
|
|
||||||
|
class AccessControlAction : AnAction() {
|
||||||
|
private val manager = service<GitpodManager>()
|
||||||
|
|
||||||
|
override fun actionPerformed(event: AnActionEvent) {
|
||||||
|
manager.pendingInfo.thenAccept { workspaceInfo ->
|
||||||
|
URIBuilder(workspaceInfo.gitpodHost).setPath("integrations").build().toString().let { url ->
|
||||||
|
manager.openUrlFromAction(url)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
|
||||||
|
// Licensed under the GNU Affero General Public License (AGPL).
|
||||||
|
// See License-AGPL.txt in the project root for license information.
|
||||||
|
|
||||||
|
package io.gitpod.jetbrains.remote.actions
|
||||||
|
|
||||||
|
import com.intellij.openapi.actionSystem.AnAction
|
||||||
|
import com.intellij.openapi.actionSystem.AnActionEvent
|
||||||
|
import com.intellij.openapi.components.service
|
||||||
|
import io.gitpod.jetbrains.remote.GitpodManager
|
||||||
|
|
||||||
|
class CommunityChatAction : AnAction() {
|
||||||
|
private val manager = service<GitpodManager>()
|
||||||
|
|
||||||
|
override fun actionPerformed(event: AnActionEvent) {
|
||||||
|
manager.openUrlFromAction("https://www.gitpod.io/chat")
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
|
||||||
|
// Licensed under the GNU Affero General Public License (AGPL).
|
||||||
|
// See License-AGPL.txt in the project root for license information.
|
||||||
|
|
||||||
|
package io.gitpod.jetbrains.remote.actions
|
||||||
|
|
||||||
|
import com.intellij.openapi.actionSystem.AnAction
|
||||||
|
import com.intellij.openapi.actionSystem.AnActionEvent
|
||||||
|
import com.intellij.openapi.components.service
|
||||||
|
import io.gitpod.jetbrains.remote.GitpodManager
|
||||||
|
|
||||||
|
class ContextAction : AnAction() {
|
||||||
|
private val manager = service<GitpodManager>()
|
||||||
|
|
||||||
|
override fun actionPerformed(event: AnActionEvent) {
|
||||||
|
manager.pendingInfo.thenAccept { workspaceInfo ->
|
||||||
|
manager.openUrlFromAction(workspaceInfo.workspaceContextUrl)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
|
||||||
|
// Licensed under the GNU Affero General Public License (AGPL).
|
||||||
|
// See License-AGPL.txt in the project root for license information.
|
||||||
|
|
||||||
|
package io.gitpod.jetbrains.remote.actions
|
||||||
|
|
||||||
|
import com.intellij.openapi.actionSystem.AnAction
|
||||||
|
import com.intellij.openapi.actionSystem.AnActionEvent
|
||||||
|
import com.intellij.openapi.components.service
|
||||||
|
import io.gitpod.jetbrains.remote.GitpodManager
|
||||||
|
|
||||||
|
class DashboardAction : AnAction() {
|
||||||
|
private val manager = service<GitpodManager>()
|
||||||
|
|
||||||
|
override fun actionPerformed(event: AnActionEvent) {
|
||||||
|
manager.pendingInfo.thenAccept { workspaceInfo ->
|
||||||
|
manager.openUrlFromAction(workspaceInfo.gitpodHost)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
|
||||||
|
// Licensed under the GNU Affero General Public License (AGPL).
|
||||||
|
// See License-AGPL.txt in the project root for license information.
|
||||||
|
|
||||||
|
package io.gitpod.jetbrains.remote.actions
|
||||||
|
|
||||||
|
import com.intellij.openapi.actionSystem.AnAction
|
||||||
|
import com.intellij.openapi.actionSystem.AnActionEvent
|
||||||
|
import com.intellij.openapi.components.service
|
||||||
|
import io.gitpod.jetbrains.remote.GitpodManager
|
||||||
|
|
||||||
|
class DocumentationAction : AnAction() {
|
||||||
|
private val manager = service<GitpodManager>()
|
||||||
|
|
||||||
|
override fun actionPerformed(event: AnActionEvent) {
|
||||||
|
manager.openUrlFromAction("https://www.gitpod.io/docs")
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,47 @@
|
|||||||
|
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
|
||||||
|
// Licensed under the GNU Affero General Public License (AGPL).
|
||||||
|
// See License-AGPL.txt in the project root for license information.
|
||||||
|
|
||||||
|
package io.gitpod.jetbrains.remote.actions
|
||||||
|
|
||||||
|
import com.intellij.openapi.actionSystem.AnAction
|
||||||
|
import com.intellij.openapi.actionSystem.AnActionEvent
|
||||||
|
import com.intellij.openapi.components.service
|
||||||
|
import com.intellij.openapi.diagnostic.thisLogger
|
||||||
|
import io.gitpod.gitpodprotocol.api.entities.WorkspaceTimeoutDuration
|
||||||
|
import io.gitpod.jetbrains.remote.GitpodManager
|
||||||
|
import com.intellij.notification.NotificationType
|
||||||
|
|
||||||
|
class ExtendWorkspaceTimeoutAction : AnAction() {
|
||||||
|
private val manager = service<GitpodManager>()
|
||||||
|
|
||||||
|
override fun actionPerformed(event: AnActionEvent) {
|
||||||
|
manager.pendingInfo.thenAccept { workspaceInfo ->
|
||||||
|
manager.trackEvent("jb_execute_command_gitpod_workspace", mapOf(
|
||||||
|
"action" to "extend-timeout"
|
||||||
|
))
|
||||||
|
|
||||||
|
manager.client.server.setWorkspaceTimeout(workspaceInfo.workspaceId, WorkspaceTimeoutDuration.DURATION_180M.toString()).whenComplete { result, e ->
|
||||||
|
var message: String
|
||||||
|
var notificationType: NotificationType
|
||||||
|
|
||||||
|
if (e != null) {
|
||||||
|
message = "Cannot extend workspace timeout: ${e.message}"
|
||||||
|
notificationType = NotificationType.ERROR
|
||||||
|
thisLogger().error("gitpod: failed to extend workspace timeout", e)
|
||||||
|
} else {
|
||||||
|
if (result.resetTimeoutOnWorkspaces.isNotEmpty()) {
|
||||||
|
message = "Workspace timeout has been extended to three hours. This reset the workspace timeout for other workspaces."
|
||||||
|
notificationType = NotificationType.WARNING
|
||||||
|
} else {
|
||||||
|
message = "Workspace timeout has been extended to three hours."
|
||||||
|
notificationType = NotificationType.INFORMATION
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val notification = manager.notificationGroup.createNotification(message, notificationType)
|
||||||
|
notification.notify(null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
|
||||||
|
// Licensed under the GNU Affero General Public License (AGPL).
|
||||||
|
// See License-AGPL.txt in the project root for license information.
|
||||||
|
|
||||||
|
package io.gitpod.jetbrains.remote.actions
|
||||||
|
|
||||||
|
import com.intellij.openapi.actionSystem.AnAction
|
||||||
|
import com.intellij.openapi.actionSystem.AnActionEvent
|
||||||
|
import com.intellij.openapi.components.service
|
||||||
|
import io.gitpod.jetbrains.remote.GitpodManager
|
||||||
|
|
||||||
|
class FollowUsOnTwitterAction : AnAction() {
|
||||||
|
private val manager = service<GitpodManager>()
|
||||||
|
|
||||||
|
override fun actionPerformed(event: AnActionEvent) {
|
||||||
|
manager.openUrlFromAction("https://twitter.com/gitpod")
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
|
||||||
|
// Licensed under the GNU Affero General Public License (AGPL).
|
||||||
|
// See License-AGPL.txt in the project root for license information.
|
||||||
|
|
||||||
|
package io.gitpod.jetbrains.remote.actions
|
||||||
|
|
||||||
|
import com.intellij.openapi.actionSystem.AnAction
|
||||||
|
import com.intellij.openapi.actionSystem.AnActionEvent
|
||||||
|
import com.intellij.openapi.components.service
|
||||||
|
import io.gitpod.jetbrains.remote.GitpodManager
|
||||||
|
|
||||||
|
class ReportIssueAction : AnAction() {
|
||||||
|
private val manager = service<GitpodManager>()
|
||||||
|
|
||||||
|
override fun actionPerformed(event: AnActionEvent) {
|
||||||
|
manager.openUrlFromAction("https://github.com/gitpod-io/gitpod/issues/new/choose")
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
|
||||||
|
// Licensed under the GNU Affero General Public License (AGPL).
|
||||||
|
// See License-AGPL.txt in the project root for license information.
|
||||||
|
|
||||||
|
package io.gitpod.jetbrains.remote.actions
|
||||||
|
|
||||||
|
import com.intellij.openapi.actionSystem.AnAction
|
||||||
|
import com.intellij.openapi.actionSystem.AnActionEvent
|
||||||
|
import com.intellij.openapi.components.service
|
||||||
|
import io.gitpod.jetbrains.remote.GitpodManager
|
||||||
|
import org.apache.http.client.utils.URIBuilder
|
||||||
|
|
||||||
|
class SettingsAction : AnAction() {
|
||||||
|
private val manager = service<GitpodManager>()
|
||||||
|
|
||||||
|
override fun actionPerformed(event: AnActionEvent) {
|
||||||
|
manager.pendingInfo.thenAccept { workspaceInfo ->
|
||||||
|
URIBuilder(workspaceInfo.gitpodHost).setPath("settings").build().toString().let { url ->
|
||||||
|
manager.openUrlFromAction(url)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,74 @@
|
|||||||
|
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
|
||||||
|
// Licensed under the GNU Affero General Public License (AGPL).
|
||||||
|
// See License-AGPL.txt in the project root for license information.
|
||||||
|
|
||||||
|
package io.gitpod.jetbrains.remote.actions
|
||||||
|
|
||||||
|
import com.intellij.notification.NotificationAction
|
||||||
|
import com.intellij.notification.NotificationType
|
||||||
|
import com.intellij.openapi.actionSystem.AnAction
|
||||||
|
import com.intellij.openapi.actionSystem.AnActionEvent
|
||||||
|
import com.intellij.openapi.components.service
|
||||||
|
import com.intellij.openapi.diagnostic.thisLogger
|
||||||
|
import com.intellij.util.ExceptionUtil
|
||||||
|
import io.gitpod.gitpodprotocol.api.entities.TakeSnapshotOptions
|
||||||
|
import io.gitpod.gitpodprotocol.api.entities.Error
|
||||||
|
import io.gitpod.jetbrains.remote.GitpodManager
|
||||||
|
import org.eclipse.lsp4j.jsonrpc.ResponseErrorException
|
||||||
|
import java.awt.Toolkit
|
||||||
|
import java.awt.datatransfer.StringSelection
|
||||||
|
|
||||||
|
class ShareWorkspaceSnapshotAction : AnAction() {
|
||||||
|
private val manager = service<GitpodManager>()
|
||||||
|
|
||||||
|
override fun actionPerformed(event: AnActionEvent) {
|
||||||
|
manager.pendingInfo.thenAccept { workspaceInfo ->
|
||||||
|
manager.trackEvent(
|
||||||
|
"jb_execute_command_gitpod_workspace", mapOf(
|
||||||
|
"action" to "snapshot"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
val takeSnapshotOptions = TakeSnapshotOptions(workspaceInfo.workspaceId, true)
|
||||||
|
|
||||||
|
manager.client.server.takeSnapshot(takeSnapshotOptions).whenComplete { snapshotId, t ->
|
||||||
|
if (t != null) {
|
||||||
|
val notification = manager.notificationGroup.createNotification(
|
||||||
|
"Cannot capture workspace snapshot: ${t.message}",
|
||||||
|
NotificationType.ERROR
|
||||||
|
)
|
||||||
|
notification.notify(null)
|
||||||
|
thisLogger().error("gitpod: failed to capture workspace snapshot", t)
|
||||||
|
} else {
|
||||||
|
thisLogger().warn("gitpod: snapshot started ($snapshotId)")
|
||||||
|
val notification = manager.notificationGroup.createNotification(
|
||||||
|
"Capturing workspace snapshot: this might take a moment, you will get a notification when the snapshot is ready",
|
||||||
|
NotificationType.INFORMATION
|
||||||
|
)
|
||||||
|
notification.notify(null)
|
||||||
|
|
||||||
|
manager.client.server.waitForSnapshot(snapshotId).whenComplete { _, t ->
|
||||||
|
if (t != null) {
|
||||||
|
val error = ExceptionUtil.findCause(t, ResponseErrorException::class.java)
|
||||||
|
if (error.responseError.code == Error.SNAPSHOT_ERROR.errCode || error.responseError.code == Error.NOT_FOUND.errCode) {
|
||||||
|
// this is indeed an error with snapshot creation itself, break here!
|
||||||
|
throw t
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val notification = manager.notificationGroup.createNotification(
|
||||||
|
"The current state is captured in a snapshot. Using this link anybody can create their own copy of this workspace.",
|
||||||
|
NotificationType.INFORMATION
|
||||||
|
)
|
||||||
|
val copyUrlAction = NotificationAction.createSimple("Copy URL to Clipboard") {
|
||||||
|
val uri = "${workspaceInfo.gitpodHost}#snapshot/$snapshotId";
|
||||||
|
val clipboard = Toolkit.getDefaultToolkit().systemClipboard
|
||||||
|
clipboard.setContents(StringSelection(uri), null)
|
||||||
|
}
|
||||||
|
notification.addAction(copyUrlAction)
|
||||||
|
notification.notify(null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
|
||||||
|
// Licensed under the GNU Affero General Public License (AGPL).
|
||||||
|
// See License-AGPL.txt in the project root for license information.
|
||||||
|
|
||||||
|
package io.gitpod.jetbrains.remote.actions
|
||||||
|
|
||||||
|
import com.intellij.openapi.actionSystem.AnAction
|
||||||
|
import com.intellij.openapi.actionSystem.AnActionEvent
|
||||||
|
import com.intellij.openapi.components.service
|
||||||
|
import io.gitpod.jetbrains.remote.GitpodManager
|
||||||
|
|
||||||
|
class StopWorkspaceAction : AnAction() {
|
||||||
|
private val manager = service<GitpodManager>()
|
||||||
|
|
||||||
|
override fun actionPerformed(event: AnActionEvent) {
|
||||||
|
manager.pendingInfo.thenAccept { workspaceInfo ->
|
||||||
|
manager.trackEvent("jb_execute_command_gitpod_workspace", mapOf(
|
||||||
|
"action" to "stop"
|
||||||
|
))
|
||||||
|
|
||||||
|
manager.client.server.stopWorkspace(workspaceInfo.workspaceId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
|
||||||
|
// Licensed under the GNU Affero General Public License (AGPL).
|
||||||
|
// See License-AGPL.txt in the project root for license information.
|
||||||
|
|
||||||
|
package io.gitpod.jetbrains.remote.actions
|
||||||
|
|
||||||
|
import com.intellij.openapi.actionSystem.AnAction
|
||||||
|
import com.intellij.openapi.actionSystem.AnActionEvent
|
||||||
|
import com.intellij.openapi.components.service
|
||||||
|
import io.gitpod.jetbrains.remote.GitpodManager
|
||||||
|
import org.apache.http.client.utils.URIBuilder
|
||||||
|
|
||||||
|
class UpgradeSubscriptionAction : AnAction() {
|
||||||
|
private val manager = service<GitpodManager>()
|
||||||
|
|
||||||
|
override fun actionPerformed(event: AnActionEvent) {
|
||||||
|
manager.pendingInfo.thenAccept { workspaceInfo ->
|
||||||
|
URIBuilder(workspaceInfo.gitpodHost).setPath("plans").build().toString().let { url ->
|
||||||
|
manager.openUrlFromAction(url)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -44,4 +44,78 @@
|
|||||||
restartRequired="true"/>
|
restartRequired="true"/>
|
||||||
</extensions>
|
</extensions>
|
||||||
|
|
||||||
|
<actions>
|
||||||
|
<action id="io.gitpod.jetbrains.remote.actions.StopWorkspaceAction"
|
||||||
|
class="io.gitpod.jetbrains.remote.actions.StopWorkspaceAction"
|
||||||
|
text="Gitpod: Stop Workspace"
|
||||||
|
icon="AllIcons.Actions.Pause">
|
||||||
|
<add-to-group group-id="UnattendedHostDropdownGroup" anchor="last"/>
|
||||||
|
</action>
|
||||||
|
<action id="io.gitpod.jetbrains.remote.actions.DashboardAction"
|
||||||
|
class="io.gitpod.jetbrains.remote.actions.DashboardAction"
|
||||||
|
text="Gitpod: Open Dashboard"
|
||||||
|
icon="AllIcons.General.ProjectTab">
|
||||||
|
<add-to-group group-id="UnattendedHostDropdownGroup" anchor="last"/>
|
||||||
|
</action>
|
||||||
|
<action id="io.gitpod.jetbrains.remote.actions.ExtendWorkspaceTimeoutAction"
|
||||||
|
class="io.gitpod.jetbrains.remote.actions.ExtendWorkspaceTimeoutAction"
|
||||||
|
text="Gitpod: Extend Workspace Timeout"
|
||||||
|
icon="AllIcons.Vcs.History">
|
||||||
|
<add-to-group group-id="UnattendedHostDropdownGroup" anchor="last"/>
|
||||||
|
</action>
|
||||||
|
<action id="io.gitpod.jetbrains.remote.actions.ContextAction"
|
||||||
|
class="io.gitpod.jetbrains.remote.actions.ContextAction"
|
||||||
|
text="Gitpod: Open Context"
|
||||||
|
icon="AllIcons.General.FitContent">
|
||||||
|
<add-to-group group-id="UnattendedHostDropdownGroup" anchor="last"/>
|
||||||
|
</action>
|
||||||
|
<action id="io.gitpod.jetbrains.remote.actions.SettingsAction"
|
||||||
|
class="io.gitpod.jetbrains.remote.actions.SettingsAction"
|
||||||
|
text="Gitpod: Open Settings"
|
||||||
|
icon="AllIcons.General.Settings">
|
||||||
|
<add-to-group group-id="UnattendedHostDropdownGroup" anchor="last"/>
|
||||||
|
</action>
|
||||||
|
<action id="io.gitpod.jetbrains.remote.actions.ShareWorkspaceSnapshotAction"
|
||||||
|
class="io.gitpod.jetbrains.remote.actions.ShareWorkspaceSnapshotAction"
|
||||||
|
text="Gitpod: Share Workspace Snapshot"
|
||||||
|
icon="AllIcons.Actions.Dump">
|
||||||
|
<add-to-group group-id="UnattendedHostDropdownGroup" anchor="last"/>
|
||||||
|
</action>
|
||||||
|
<action id="io.gitpod.jetbrains.remote.actions.AccessControlAction"
|
||||||
|
class="io.gitpod.jetbrains.remote.actions.AccessControlAction"
|
||||||
|
text="Gitpod: Open Access Control"
|
||||||
|
icon="AllIcons.Actions.Properties">
|
||||||
|
<add-to-group group-id="UnattendedHostDropdownGroup" anchor="last"/>
|
||||||
|
</action>
|
||||||
|
<action id="io.gitpod.jetbrains.remote.actions.DocumentationAction"
|
||||||
|
class="io.gitpod.jetbrains.remote.actions.DocumentationAction"
|
||||||
|
text="Gitpod: Documentation"
|
||||||
|
icon="AllIcons.General.ReaderMode">
|
||||||
|
<add-to-group group-id="UnattendedHostDropdownGroup" anchor="last"/>
|
||||||
|
</action>
|
||||||
|
<action id="io.gitpod.jetbrains.remote.actions.UpgradeSubscriptionAction"
|
||||||
|
class="io.gitpod.jetbrains.remote.actions.UpgradeSubscriptionAction"
|
||||||
|
text="Gitpod: Upgrade Subscription"
|
||||||
|
icon="AllIcons.Actions.PreviousOccurence">
|
||||||
|
<add-to-group group-id="UnattendedHostDropdownGroup" anchor="last"/>
|
||||||
|
</action>
|
||||||
|
<action id="io.gitpod.jetbrains.remote.actions.CommunityChatAction"
|
||||||
|
class="io.gitpod.jetbrains.remote.actions.CommunityChatAction"
|
||||||
|
text="Gitpod: Open Community Chat"
|
||||||
|
icon="AllIcons.General.Balloon">
|
||||||
|
<add-to-group group-id="UnattendedHostDropdownGroup" anchor="last"/>
|
||||||
|
</action>
|
||||||
|
<action id="io.gitpod.jetbrains.remote.actions.ReportIssueAction"
|
||||||
|
class="io.gitpod.jetbrains.remote.actions.ReportIssueAction"
|
||||||
|
text="Gitpod: Report Issue"
|
||||||
|
icon="AllIcons.General.ShowWarning">
|
||||||
|
<add-to-group group-id="UnattendedHostDropdownGroup" anchor="last"/>
|
||||||
|
</action>
|
||||||
|
<action id="io.gitpod.jetbrains.remote.actions.FollowUsOnTwitterAction"
|
||||||
|
class="io.gitpod.jetbrains.remote.actions.FollowUsOnTwitterAction"
|
||||||
|
text="Gitpod: Follow Us On Twitter"
|
||||||
|
icon="AllIcons.Gutter.ExtAnnotation">
|
||||||
|
<add-to-group group-id="UnattendedHostDropdownGroup" anchor="last"/>
|
||||||
|
</action>
|
||||||
|
</actions>
|
||||||
</idea-plugin>
|
</idea-plugin>
|
||||||
|
|||||||
@ -244,9 +244,9 @@ class GitpodConnectionProvider : GatewayConnectionProvider {
|
|||||||
if (thinClientJob == null && update.status.phase == "running") {
|
if (thinClientJob == null && update.status.phase == "running") {
|
||||||
thinClientJob = launch {
|
thinClientJob = launch {
|
||||||
try {
|
try {
|
||||||
val updatedIdeUrl = URL(update.ideUrl);
|
val updatedIdeUrl = URL(update.ideUrl)
|
||||||
val sshHostUrl =
|
val sshHostUrl =
|
||||||
URL(update.ideUrl.replace(update.workspaceId, "${update.workspaceId}.ssh"));
|
URL(update.ideUrl.replace(update.workspaceId, "${update.workspaceId}.ssh"))
|
||||||
val hostKeys = resolveHostKeys(updatedIdeUrl, connectParams)
|
val hostKeys = resolveHostKeys(updatedIdeUrl, connectParams)
|
||||||
if (hostKeys.isNullOrEmpty()) {
|
if (hostKeys.isNullOrEmpty()) {
|
||||||
setErrorMessage("${connectParams.gitpodHost} installation does not allow SSH access, public keys cannot be found")
|
setErrorMessage("${connectParams.gitpodHost} installation does not allow SSH access, public keys cannot be found")
|
||||||
|
|||||||
@ -76,7 +76,7 @@ class GitpodStartWorkspaceView(
|
|||||||
if (contextUrl.component.text.isNotBlank()) {
|
if (contextUrl.component.text.isNotBlank()) {
|
||||||
backendsModel.selectedItem?.let {
|
backendsModel.selectedItem?.let {
|
||||||
backendToId[it]?.let { backend ->
|
backendToId[it]?.let { backend ->
|
||||||
BrowserUtil.browse("https://${settings.gitpodHost}#referrer:jetbrains-gateway:${backend}/${contextUrl.component.text}")
|
BrowserUtil.browse("https://${settings.gitpodHost}#referrer:jetbrains-gateway:$backend/${contextUrl.component.text}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user