Skip to content

Commit

Permalink
feat: add code flag to daytona start cmd (daytonaio#1004)
Browse files Browse the repository at this point in the history
Signed-off-by: tarunrajput <[email protected]>
  • Loading branch information
tarunrajput authored Sep 3, 2024
1 parent 32beac3 commit 6dd429e
Show file tree
Hide file tree
Showing 6 changed files with 106 additions and 20 deletions.
1 change: 1 addition & 0 deletions docs/daytona_start.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ daytona start [WORKSPACE] [flags]

```
-a, --all Start all workspaces
-c, --code Open the workspace in the IDE after workspace start
-p, --project string Start a single project in the workspace (project name)
```

Expand Down
4 changes: 4 additions & 0 deletions hack/docs/daytona_start.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ options:
shorthand: a
default_value: "false"
usage: Start all workspaces
- name: code
shorthand: c
default_value: "false"
usage: Open the workspace in the IDE after workspace start
- name: project
shorthand: p
usage: Start a single project in the workspace (project name)
Expand Down
16 changes: 5 additions & 11 deletions pkg/cmd/workspace/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ package workspace

import (
"context"
"errors"
"fmt"
"net/http"
"net/url"
Expand Down Expand Up @@ -200,18 +199,13 @@ var CreateCmd = &cobra.Command{

views.RenderCreationInfoMessage(fmt.Sprintf("Opening the workspace in %s ...", chosenIde.Name))

providerMetadata := ""
for _, project := range wsInfo.Info.Projects {
if project.Name == wsInfo.Projects[0].Name {
if project.ProviderMetadata == nil {
log.Fatal(errors.New("project provider metadata is missing"))
}
providerMetadata = *project.ProviderMetadata
break
}
projectName := wsInfo.Projects[0].Name
providerMetadata, err := workspace_util.GetProjectProviderMetadata(wsInfo, projectName)
if err != nil {
log.Fatal(err)
}

err = openIDE(chosenIdeId, activeProfile, createdWorkspace.Id, wsInfo.Projects[0].Name, providerMetadata)
err = openIDE(chosenIdeId, activeProfile, createdWorkspace.Id, projectName, providerMetadata)
if err != nil {
log.Fatal(err)
}
Expand Down
68 changes: 59 additions & 9 deletions pkg/cmd/workspace/start.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,14 @@ import (
"context"
"fmt"

"github.com/daytonaio/daytona/cmd/daytona/config"
"github.com/daytonaio/daytona/internal/util"
"github.com/daytonaio/daytona/internal/util/apiclient"
workspace_util "github.com/daytonaio/daytona/pkg/cmd/workspace/util"
"github.com/daytonaio/daytona/pkg/views"
ide_views "github.com/daytonaio/daytona/pkg/views/ide"
"github.com/daytonaio/daytona/pkg/views/workspace/selection"

log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
Expand All @@ -31,8 +35,13 @@ var StartCmd = &cobra.Command{
Args: cobra.RangeArgs(0, 1),
GroupID: util.WORKSPACE_GROUP,
Run: func(cmd *cobra.Command, args []string) {
var workspaceId string
var workspaceIdOrName string
var message string
var activeProfile config.Profile
var ideId string
var workspaceId string
var ideList []config.Ide
projectProviderMetadata := ""

if allFlag {
err := startAllWorkspaces()
Expand Down Expand Up @@ -66,26 +75,66 @@ var StartCmd = &cobra.Command{
if workspace == nil {
return
}
workspaceId = workspace.Name
workspaceIdOrName = workspace.Name
} else {
workspaceId = args[0]
workspaceIdOrName = args[0]
}

if codeFlag {
c, err := config.GetConfig()
if err != nil {
log.Fatal(err)
}

ideList = config.GetIdeList()

activeProfile, err = c.GetActiveProfile()
if err != nil {
log.Fatal(err)
}
ideId = c.DefaultIdeId

wsInfo, res, err := apiClient.WorkspaceAPI.GetWorkspace(ctx, workspaceIdOrName).Execute()
if err != nil {
log.Fatal(apiclient.HandleErrorResponse(res, err))
}
workspaceId = wsInfo.Id
if startProjectFlag == "" {
startProjectFlag = wsInfo.Projects[0].Name
}
if ideId != "ssh" {
projectProviderMetadata, err = workspace_util.GetProjectProviderMetadata(wsInfo, wsInfo.Projects[0].Name)
if err != nil {
log.Fatal(err)
}
}
}

if startProjectFlag == "" {
message = fmt.Sprintf("Workspace '%s' is starting", workspaceId)
res, err := apiClient.WorkspaceAPI.StartWorkspace(ctx, workspaceId).Execute()
message = fmt.Sprintf("Workspace '%s' is starting", workspaceIdOrName)
res, err := apiClient.WorkspaceAPI.StartWorkspace(ctx, workspaceIdOrName).Execute()
if err != nil {
log.Fatal(apiclient.HandleErrorResponse(res, err))
}

views.RenderInfoMessage(message)
} else {
message = fmt.Sprintf("Project '%s' from workspace '%s' is starting", startProjectFlag, workspaceId)
res, err := apiClient.WorkspaceAPI.StartProject(ctx, workspaceId, startProjectFlag).Execute()
message = fmt.Sprintf("Project '%s' from workspace '%s' is starting", startProjectFlag, workspaceIdOrName)
res, err := apiClient.WorkspaceAPI.StartProject(ctx, workspaceIdOrName, startProjectFlag).Execute()
if err != nil {
log.Fatal(apiclient.HandleErrorResponse(res, err))
}
}

views.RenderInfoMessage(message)
views.RenderInfoMessage(message)

if codeFlag {
ide_views.RenderIdeOpeningMessage(workspaceIdOrName, startProjectFlag, ideId, ideList)
err = openIDE(ideId, activeProfile, workspaceId, startProjectFlag, projectProviderMetadata)
if err != nil {
log.Fatal(err)
}
}
}
},
ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
if len(args) != 0 {
Expand All @@ -99,6 +148,7 @@ var StartCmd = &cobra.Command{
func init() {
StartCmd.PersistentFlags().StringVarP(&startProjectFlag, "project", "p", "", "Start a single project in the workspace (project name)")
StartCmd.PersistentFlags().BoolVarP(&allFlag, "all", "a", false, "Start all workspaces")
StartCmd.PersistentFlags().BoolVarP(&codeFlag, "code", "c", false, "Open the workspace in the IDE after workspace start")

err := StartCmd.RegisterFlagCompletionFunc("project", getProjectNameCompletions)
if err != nil {
Expand Down
15 changes: 15 additions & 0 deletions pkg/cmd/workspace/util/workspace.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
package util

import (
"errors"
"fmt"

"github.com/daytonaio/daytona/pkg/apiclient"
Expand Down Expand Up @@ -57,3 +58,17 @@ func IsProjectRunning(workspace *apiclient.WorkspaceDTO, projectName string) boo
}
return false
}

func GetProjectProviderMetadata(workspace *apiclient.WorkspaceDTO, projectName string) (string, error) {
if workspace.Info != nil {
for _, project := range workspace.Info.Projects {
if project.Name == projectName {
if project.ProviderMetadata == nil {
return "", errors.New("project provider metadata is missing")
}
return *project.ProviderMetadata, nil
}
}
}
return "", nil
}
22 changes: 22 additions & 0 deletions pkg/views/ide/code.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// Copyright 2024 Daytona Platforms Inc.
// SPDX-License-Identifier: Apache-2.0

package ide

import (
"fmt"

"github.com/daytonaio/daytona/cmd/daytona/config"
"github.com/daytonaio/daytona/pkg/views"
)

func RenderIdeOpeningMessage(workspaceId, projectName, ideId string, ideList []config.Ide) {
ideName := ""
for _, ide := range ideList {
if ide.Id == ideId {
ideName = ide.Name
break
}
}
views.RenderInfoMessage(fmt.Sprintf("Opening the project '%s' from workspace '%s' in %s", projectName, workspaceId, ideName))
}

0 comments on commit 6dd429e

Please sign in to comment.