Skip to content

Commit

Permalink
feat: add support for VS Code Insiders IDE
Browse files Browse the repository at this point in the history
Signed-off-by: hunnywar <[email protected]>
  • Loading branch information
hunnywar committed Jan 9, 2025
1 parent 179f59a commit ba36f41
Show file tree
Hide file tree
Showing 9 changed files with 83 additions and 8 deletions.
1 change: 1 addition & 0 deletions cmd/daytona/config/const.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ func GetBinaryUrls() map[os.OperatingSystem]string {
func GetIdeList() []Ide {
ides := []Ide{
{"vscode", "VS Code"},
{"code-insiders", "VS Code Insiders"},
{"browser", "VS Code - Browser"},
{"cursor", "Cursor"},
{"codium", "VSCodium"},
Expand Down
2 changes: 1 addition & 1 deletion docs/daytona_code.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ daytona code [WORKSPACE] [PROJECT] [flags]
### Options

```
-i, --ide string Specify the IDE (vscode, browser, cursor, codium, ssh, jupyter, fleet, zed, windsurf, clion, goland, intellij, phpstorm, pycharm, rider, rubymine, webstorm)
-i, --ide string Specify the IDE (vscode, code-insiders, browser, cursor, codium, ssh, jupyter, fleet, zed, windsurf, clion, goland, intellij, phpstorm, pycharm, rider, rubymine, webstorm)
-y, --yes Automatically confirm any prompts
```

Expand Down
2 changes: 1 addition & 1 deletion docs/daytona_create.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ daytona create [REPOSITORY_URL | PROJECT_CONFIG_NAME]... [flags]
--devcontainer-path string Automatically assign the devcontainer builder with the path passed as the flag value
--env stringArray Specify environment variables (e.g. --env 'KEY1=VALUE1' --env 'KEY2=VALUE2' ...')
--git-provider-config string Specify the Git provider configuration ID or alias
-i, --ide string Specify the IDE (vscode, browser, cursor, codium, ssh, jupyter, fleet, zed, windsurf, clion, goland, intellij, phpstorm, pycharm, rider, rubymine, webstorm)
-i, --ide string Specify the IDE (vscode, code-insiders, browser, cursor, codium, ssh, jupyter, fleet, zed, windsurf, clion, goland, intellij, phpstorm, pycharm, rider, rubymine, webstorm)
--manual Manually enter the Git repository
--multi-project Workspace with multiple projects/repos
--name string Specify the workspace name
Expand Down
2 changes: 1 addition & 1 deletion hack/docs/daytona_code.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ options:
- name: ide
shorthand: i
usage: |
Specify the IDE (vscode, browser, cursor, codium, ssh, jupyter, fleet, zed, windsurf, clion, goland, intellij, phpstorm, pycharm, rider, rubymine, webstorm)
Specify the IDE (vscode, code-insiders, browser, cursor, codium, ssh, jupyter, fleet, zed, windsurf, clion, goland, intellij, phpstorm, pycharm, rider, rubymine, webstorm)
- name: "yes"
shorthand: "y"
default_value: "false"
Expand Down
2 changes: 1 addition & 1 deletion hack/docs/daytona_create.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ options:
- name: ide
shorthand: i
usage: |
Specify the IDE (vscode, browser, cursor, codium, ssh, jupyter, fleet, zed, windsurf, clion, goland, intellij, phpstorm, pycharm, rider, rubymine, webstorm)
Specify the IDE (vscode, code-insiders, browser, cursor, codium, ssh, jupyter, fleet, zed, windsurf, clion, goland, intellij, phpstorm, pycharm, rider, rubymine, webstorm)
- name: manual
default_value: "false"
usage: Manually enter the Git repository
Expand Down
5 changes: 5 additions & 0 deletions pkg/cmd/ide.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,11 @@ var ideCmd = &cobra.Command{
if err != nil {
log.Error(err)
}
case "code-insiders":
_, err := ide_util.GetVSCodeInsidersBinaryPath()
if err != nil {
log.Error(err)
}
case "cursor":
_, err := ide_util.GetCursorBinaryPath()
if err != nil {
Expand Down
2 changes: 2 additions & 0 deletions pkg/cmd/workspace/code.go
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,8 @@ func openIDE(ideId string, activeProfile config.Profile, workspaceId string, pro
switch ideId {
case "vscode":
return ide.OpenVSCode(activeProfile, workspaceId, projectName, projectProviderMetadata, gpgKey)
case "code-insiders":
return ide.OpenVSCodeInsiders(activeProfile, workspaceId, projectName, projectProviderMetadata, gpgKey)
case "ssh":
return ide.OpenTerminalSsh(activeProfile, workspaceId, projectName, gpgKey, nil)
case "browser":
Expand Down
67 changes: 67 additions & 0 deletions pkg/ide/vscode-insiders.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
// Copyright 2024 Daytona Platforms Inc.
// SPDX-License-Identifier: Apache-2.0

package ide

import (
"errors"
"fmt"
"os/exec"

"github.com/daytonaio/daytona/cmd/daytona/config"
"github.com/daytonaio/daytona/internal/util"
"github.com/daytonaio/daytona/pkg/build/devcontainer"
)

func OpenVSCodeInsiders(activeProfile config.Profile, workspaceId string, projectName string, projectProviderMetadata string, gpgKey string) error {
path, err := GetVSCodeInsidersBinaryPath()
if err != nil {
return err
}
err = installRemoteSSHExtension(path)
if err != nil {
return err
}

projectHostname := config.GetProjectHostname(activeProfile.Id, workspaceId, projectName)

projectDir, err := util.GetProjectDir(activeProfile, workspaceId, projectName, gpgKey)
if err != nil {
return err
}

commandArgument := fmt.Sprintf("vscode-remote://ssh-remote+%s/%s", projectHostname, projectDir)

vscCommand := exec.Command(path, "--disable-extension", "ms-vscode-remote.remote-containers", "--folder-uri", commandArgument)

err = vscCommand.Run()
if err != nil {
return err
}

if projectProviderMetadata == "" {
return nil
}

return setupVSCodeCustomizations(projectHostname, projectProviderMetadata, devcontainer.Vscode, "*/.vscode-server-insiders/*/bin/code-server-insiders", "$HOME/.vscode-server-insiders/data/Machine/settings.json", ".daytona-customizations-lock-vscode-insiders")
}

func GetVSCodeInsidersBinaryPath() (string, error) {
path, err := exec.LookPath("code-insiders")
if err == nil {
return path, err
}

redBold := "\033[1;31m" // ANSI escape code for red and bold
reset := "\033[0m" // ANSI escape code to reset text formatting

errorMessage := "Please install Visual Studio Code Insiders from https://code.visualstudio.com/insiders/\n\n"
infoMessage := `
If you have already installed Visual Studio Code Insiders, please ensure it is added to your PATH environment variable.
You can verify this by running the following command in your terminal:
code-insiders
`

return "", errors.New(redBold + errorMessage + reset + infoMessage)
}
8 changes: 4 additions & 4 deletions pkg/ide/vscode.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import (

func OpenVSCode(activeProfile config.Profile, workspaceId string, projectName string, projectProviderMetadata string, gpgKey string) error {
CheckAndAlertVSCodeInstalled()
err := installRemoteSSHExtension()
err := installRemoteSSHExtension("code")
if err != nil {
return err
}
Expand Down Expand Up @@ -201,15 +201,15 @@ func isVSCodeInstalled() error {
return err
}

func installRemoteSSHExtension() error {
output, err := exec.Command("code", "--list-extensions").Output()
func installRemoteSSHExtension(binaryPath string) error {
output, err := exec.Command(binaryPath, "--list-extensions").Output()
if err != nil {
return err
}

if !strings.Contains(string(output), "ms-vscode-remote.remote-ssh") {
fmt.Println("Installing Remote SSH extension...")
err = exec.Command("code", "--install-extension", "ms-vscode-remote.remote-ssh").Run()
err = exec.Command(binaryPath, "--install-extension", "ms-vscode-remote.remote-ssh").Run()
if err != nil {
return err
}
Expand Down

0 comments on commit ba36f41

Please sign in to comment.