@@ -2,12 +2,14 @@ package cli
2
2
3
3
import (
4
4
"fmt"
5
+ "io"
5
6
"os"
6
7
"path/filepath"
7
8
"time"
8
9
9
10
"github.com/briandowns/spinner"
10
11
"github.com/spf13/cobra"
12
+ "github.com/spf13/pflag"
11
13
"golang.org/x/xerrors"
12
14
13
15
"github.com/coder/coder/cli/cliui"
@@ -16,14 +18,81 @@ import (
16
18
"github.com/coder/coder/provisionersdk"
17
19
)
18
20
21
+ // templateUploadFlags is shared by `templates create` and `templates push`.
22
+ type templateUploadFlags struct {
23
+ directory string
24
+ }
25
+
26
+ func (pf * templateUploadFlags ) register (f * pflag.FlagSet ) {
27
+ currentDirectory , _ := os .Getwd ()
28
+ f .StringVarP (& pf .directory , "directory" , "d" , currentDirectory , "Specify the directory to create from, use '-' to read tar from stdin" )
29
+ }
30
+
31
+ func (pf * templateUploadFlags ) stdin () bool {
32
+ return pf .directory == "-"
33
+ }
34
+
35
+ func (pf * templateUploadFlags ) upload (cmd * cobra.Command , client * codersdk.Client ) (* codersdk.UploadResponse , error ) {
36
+ var (
37
+ content []byte
38
+ err error
39
+ )
40
+ if pf .stdin () {
41
+ content , err = io .ReadAll (cmd .InOrStdin ())
42
+ } else {
43
+ prettyDir := prettyDirectoryPath (pf .directory )
44
+ _ , err = cliui .Prompt (cmd , cliui.PromptOptions {
45
+ Text : fmt .Sprintf ("Upload %q?" , prettyDir ),
46
+ IsConfirm : true ,
47
+ Default : cliui .ConfirmYes ,
48
+ })
49
+ if err != nil {
50
+ return nil , err
51
+ }
52
+
53
+ content , err = provisionersdk .Tar (pf .directory , provisionersdk .TemplateArchiveLimit )
54
+ }
55
+ if err != nil {
56
+ return nil , xerrors .Errorf ("read tar: %w" , err )
57
+ }
58
+
59
+ spin := spinner .New (spinner .CharSets [5 ], 100 * time .Millisecond )
60
+ spin .Writer = cmd .OutOrStdout ()
61
+ spin .Suffix = cliui .Styles .Keyword .Render (" Uploading directory..." )
62
+ spin .Start ()
63
+ defer spin .Stop ()
64
+
65
+ resp , err := client .Upload (cmd .Context (), codersdk .ContentTypeTar , content )
66
+ if err != nil {
67
+ return nil , xerrors .Errorf ("upload: %w" , err )
68
+ }
69
+ return & resp , nil
70
+ }
71
+
72
+ func (pf * templateUploadFlags ) templateName (args []string ) (string , error ) {
73
+ if pf .stdin () {
74
+ // Can't infer name from directory if none provided.
75
+ if len (args ) == 0 {
76
+ return "" , xerrors .New ("template name argument must be provided" )
77
+ }
78
+ return args [0 ], nil
79
+ }
80
+
81
+ name := filepath .Base (pf .directory )
82
+ if len (args ) > 0 {
83
+ name = args [0 ]
84
+ }
85
+ return name , nil
86
+ }
87
+
19
88
func templatePush () * cobra.Command {
20
89
var (
21
- directory string
22
90
versionName string
23
91
provisioner string
24
92
parameterFile string
25
93
alwaysPrompt bool
26
94
provisionerTags []string
95
+ uploadFlags templateUploadFlags
27
96
)
28
97
29
98
cmd := & cobra.Command {
@@ -40,41 +109,20 @@ func templatePush() *cobra.Command {
40
109
return err
41
110
}
42
111
43
- name := filepath .Base (directory )
44
- if len (args ) > 0 {
45
- name = args [0 ]
46
- }
47
-
48
- template , err := client .TemplateByName (cmd .Context (), organization .ID , name )
112
+ name , err := uploadFlags .templateName (args )
49
113
if err != nil {
50
114
return err
51
115
}
52
116
53
- // Confirm upload of the directory.
54
- prettyDir := prettyDirectoryPath (directory )
55
- _ , err = cliui .Prompt (cmd , cliui.PromptOptions {
56
- Text : fmt .Sprintf ("Upload %q?" , prettyDir ),
57
- IsConfirm : true ,
58
- Default : cliui .ConfirmYes ,
59
- })
117
+ template , err := client .TemplateByName (cmd .Context (), organization .ID , name )
60
118
if err != nil {
61
119
return err
62
120
}
63
121
64
- spin := spinner .New (spinner .CharSets [5 ], 100 * time .Millisecond )
65
- spin .Writer = cmd .OutOrStdout ()
66
- spin .Suffix = cliui .Styles .Keyword .Render (" Uploading directory..." )
67
- spin .Start ()
68
- defer spin .Stop ()
69
- content , err := provisionersdk .Tar (directory , provisionersdk .TemplateArchiveLimit )
122
+ resp , err := uploadFlags .upload (cmd , client )
70
123
if err != nil {
71
124
return err
72
125
}
73
- resp , err := client .Upload (cmd .Context (), codersdk .ContentTypeTar , content )
74
- if err != nil {
75
- return err
76
- }
77
- spin .Stop ()
78
126
79
127
tags , err := ParseProvisionerTags (provisionerTags )
80
128
if err != nil {
@@ -112,13 +160,12 @@ func templatePush() *cobra.Command {
112
160
},
113
161
}
114
162
115
- currentDirectory , _ := os .Getwd ()
116
- cmd .Flags ().StringVarP (& directory , "directory" , "d" , currentDirectory , "Specify the directory to create from" )
117
163
cmd .Flags ().StringVarP (& provisioner , "test.provisioner" , "" , "terraform" , "Customize the provisioner backend" )
118
164
cmd .Flags ().StringVarP (& parameterFile , "parameter-file" , "" , "" , "Specify a file path with parameter values." )
119
165
cmd .Flags ().StringVarP (& versionName , "name" , "" , "" , "Specify a name for the new template version. It will be automatically generated if not provided." )
120
166
cmd .Flags ().StringArrayVarP (& provisionerTags , "provisioner-tag" , "" , []string {}, "Specify a set of tags to target provisioner daemons." )
121
167
cmd .Flags ().BoolVar (& alwaysPrompt , "always-prompt" , false , "Always prompt all parameters. Does not pull parameter values from active template version" )
168
+ uploadFlags .register (cmd .Flags ())
122
169
cliui .AllowSkipPrompt (cmd )
123
170
// This is for testing!
124
171
err := cmd .Flags ().MarkHidden ("test.provisioner" )
0 commit comments