From 4318133123f6d18e763b9bfb7c46a10ad5b8a65d Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Wed, 11 May 2022 13:05:32 +0000 Subject: [PATCH 1/3] feat: Unify cli behavior for templates create and update Fixes #565 --- cli/templatecreate.go | 40 ++++++++++++++---------- cli/templatecreate_test.go | 2 +- cli/templateupdate.go | 52 +++++++++++++++++++++++--------- cli/templateupdate_test.go | 62 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 125 insertions(+), 31 deletions(-) create mode 100644 cli/templateupdate_test.go diff --git a/cli/templatecreate.go b/cli/templatecreate.go index 69c1b1af327b9..0471ed249fe86 100644 --- a/cli/templatecreate.go +++ b/cli/templatecreate.go @@ -27,7 +27,8 @@ func templateCreate() *cobra.Command { ) cmd := &cobra.Command{ Use: "create [name]", - Short: "Create a template from the current directory", + Short: "Create a template from the current directory or as specified by flag", + Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { client, err := createClient(cmd) if err != nil { @@ -51,19 +52,10 @@ func templateCreate() *cobra.Command { return xerrors.Errorf("A template already exists named %q!", templateName) } - // Confirm upload of the users current directory. - // Truncate if in the home directory, because a shorter path looks nicer. - displayDirectory := directory - userHomeDir, err := os.UserHomeDir() - if err != nil { - return xerrors.Errorf("get home dir: %w", err) - } - if strings.HasPrefix(displayDirectory, userHomeDir) { - displayDirectory = strings.TrimPrefix(displayDirectory, userHomeDir) - displayDirectory = "~" + displayDirectory - } + // Confirm upload of the directory. + prettyDir := prettyDirectoryPath(directory) _, err = cliui.Prompt(cmd, cliui.PromptOptions{ - Text: fmt.Sprintf("Create and upload %q?", displayDirectory), + Text: fmt.Sprintf("Create and upload %q?", prettyDir), IsConfirm: true, Default: "yes", }) @@ -73,7 +65,7 @@ func templateCreate() *cobra.Command { spin := spinner.New(spinner.CharSets[5], 100*time.Millisecond) spin.Writer = cmd.OutOrStdout() - spin.Suffix = cliui.Styles.Keyword.Render(" Uploading current directory...") + spin.Suffix = cliui.Styles.Keyword.Render(" Uploading directory...") spin.Start() defer spin.Stop() archive, err := provisionersdk.Tar(directory, provisionersdk.TemplateArchiveLimit) @@ -123,9 +115,9 @@ func templateCreate() *cobra.Command { } currentDirectory, _ := os.Getwd() cmd.Flags().StringVarP(&directory, "directory", "d", currentDirectory, "Specify the directory to create from") - cmd.Flags().StringVarP(&provisioner, "provisioner", "p", "terraform", "Customize the provisioner backend") + cmd.Flags().StringVarP(&provisioner, "test.provisioner", "", "terraform", "Customize the provisioner backend") // This is for testing! - err := cmd.Flags().MarkHidden("provisioner") + err := cmd.Flags().MarkHidden("test.provisioner") if err != nil { panic(err) } @@ -228,3 +220,19 @@ func createValidTemplateVersion(cmd *cobra.Command, client *codersdk.Client, org return &version, parameters, nil } + +// prettyDirectoryPath returns a prettified path when inside the users +// home directory. Falls back to dir if the users home directory cannot +// discerned. +func prettyDirectoryPath(dir string) string { + homeDir, err := os.UserHomeDir() + if err != nil { + return dir + } + pretty := dir + if strings.HasPrefix(pretty, homeDir) { + pretty = strings.TrimPrefix(pretty, homeDir) + pretty = "~" + pretty + } + return pretty +} diff --git a/cli/templatecreate_test.go b/cli/templatecreate_test.go index ce4ce48624eca..d8fd4d4df0737 100644 --- a/cli/templatecreate_test.go +++ b/cli/templatecreate_test.go @@ -22,7 +22,7 @@ func TestTemplateCreate(t *testing.T) { Parse: echo.ParseComplete, Provision: echo.ProvisionComplete, }) - cmd, root := clitest.New(t, "templates", "create", "my-template", "--directory", source, "--provisioner", string(database.ProvisionerTypeEcho)) + cmd, root := clitest.New(t, "templates", "create", "my-template", "--directory", source, "--test.provisioner", string(database.ProvisionerTypeEcho)) clitest.SetupConfig(t, client, root) _ = coderdtest.NewProvisionerDaemon(t, client) doneChan := make(chan struct{}) diff --git a/cli/templateupdate.go b/cli/templateupdate.go index 333003ecf3ed7..892e99feb6160 100644 --- a/cli/templateupdate.go +++ b/cli/templateupdate.go @@ -3,22 +3,28 @@ package cli import ( "fmt" "os" - "path/filepath" "time" + "github.com/briandowns/spinner" "github.com/spf13/cobra" "golang.org/x/xerrors" + "github.com/coder/coder/cli/cliui" "github.com/coder/coder/coderd/database" "github.com/coder/coder/codersdk" "github.com/coder/coder/provisionersdk" ) func templateUpdate() *cobra.Command { - return &cobra.Command{ - Use: "update