@@ -190,70 +190,24 @@ func (r *RootCmd) templatePush() *clibase.Cmd {
190
190
return err
191
191
}
192
192
193
- if utf8 .RuneCountInString (name ) > 31 {
194
- return xerrors .Errorf ("Template name must be less than 32 characters" )
195
- }
196
-
197
- var createTemplate bool
198
- template , err := client .TemplateByName (inv .Context (), organization .ID , name )
199
- if err != nil {
200
- var apiError * codersdk.Error
201
- if errors .As (err , & apiError ) && apiError .StatusCode () != http .StatusNotFound {
202
- return err
203
- }
204
- createTemplate = true
205
- }
206
-
207
- err = uploadFlags .checkForLockfile (inv )
208
- if err != nil {
209
- return xerrors .Errorf ("check for lockfile: %w" , err )
210
- }
211
-
212
- message := uploadFlags .templateMessage (inv )
213
-
214
- resp , err := uploadFlags .upload (inv , client )
215
- if err != nil {
216
- return err
217
- }
218
-
219
- tags , err := ParseProvisionerTags (provisionerTags )
220
- if err != nil {
221
- return err
222
- }
223
-
224
- userVariableValues , err := ParseUserVariableValues (
225
- variablesFile ,
226
- commandLineVariables )
227
- if err != nil {
228
- return err
229
- }
230
-
231
- args := createValidTemplateVersionArgs {
232
- Message : message ,
233
- Client : client ,
234
- Organization : organization ,
235
- Provisioner : codersdk .ProvisionerType (provisioner ),
236
- FileID : resp .ID ,
237
- ProvisionerTags : tags ,
238
- UserVariableValues : userVariableValues ,
239
- }
240
-
241
- if ! createTemplate {
242
- args .Name = versionName
243
- args .Template = & template
244
- args .ReuseParameters = ! alwaysPrompt
245
- }
246
-
247
- job , err := createValidTemplateVersion (inv , args )
193
+ job , template , err := createTemplateVersion (createTemplateVersionArgs {
194
+ inv : inv ,
195
+ client : client ,
196
+ name : name ,
197
+ org : organization ,
198
+ uploadFlags : uploadFlags ,
199
+ provisionerTags : provisionerTags ,
200
+ provisioner : provisioner ,
201
+ variablesFile : variablesFile ,
202
+ commandLineVariables : commandLineVariables ,
203
+ versionName : versionName ,
204
+ alwaysPrompt : alwaysPrompt ,
205
+ })
248
206
if err != nil {
249
207
return err
250
208
}
251
209
252
- if job .Job .Status != codersdk .ProvisionerJobSucceeded {
253
- return xerrors .Errorf ("job failed: %s" , job .Job .Status )
254
- }
255
-
256
- if createTemplate {
210
+ if template == nil {
257
211
_ , err = client .CreateTemplate (inv .Context (), organization .ID , codersdk.CreateTemplateRequest {
258
212
Name : name ,
259
213
VersionID : job .ID ,
@@ -323,6 +277,11 @@ func (r *RootCmd) templatePush() *clibase.Cmd {
323
277
Description : "Specify a name for the new template version. It will be automatically generated if not provided." ,
324
278
Value : clibase .StringOf (& versionName ),
325
279
},
280
+ {
281
+ Flag : "always-prompt" ,
282
+ Description : "Always prompt all parameters. Does not pull parameter values from active template version." ,
283
+ Value : clibase .BoolOf (& alwaysPrompt ),
284
+ },
326
285
cliui .SkipPromptOption (),
327
286
}
328
287
cmd .Options = append (cmd .Options , uploadFlags .options ()... )
@@ -345,3 +304,84 @@ func prettyDirectoryPath(dir string) string {
345
304
}
346
305
return prettyDir
347
306
}
307
+
308
+ type createTemplateVersionArgs struct {
309
+ inv * clibase.Invocation
310
+ client * codersdk.Client
311
+ name string
312
+ org codersdk.Organization
313
+ uploadFlags templateUploadFlags
314
+ provisionerTags []string
315
+ provisioner string
316
+ variablesFile string
317
+ commandLineVariables []string
318
+ versionName string
319
+ alwaysPrompt bool
320
+ }
321
+
322
+ func createTemplateVersion (args createTemplateVersionArgs ) (* codersdk.TemplateVersion , * codersdk.Template , error ) {
323
+ if utf8 .RuneCountInString (args .name ) >= 32 {
324
+ return nil , nil , xerrors .Errorf ("Template name must be less than 32 characters" )
325
+ }
326
+
327
+ var createTemplate bool
328
+ template , err := args .client .TemplateByName (args .inv .Context (), args .org .ID , args .name )
329
+ if err != nil {
330
+ var apiError * codersdk.Error
331
+ if errors .As (err , & apiError ) && apiError .StatusCode () != http .StatusNotFound {
332
+ return nil , nil , err
333
+ }
334
+ createTemplate = true
335
+ }
336
+
337
+ err = args .uploadFlags .checkForLockfile (args .inv )
338
+ if err != nil {
339
+ return nil , nil , xerrors .Errorf ("check for lockfile: %w" , err )
340
+ }
341
+
342
+ message := args .uploadFlags .templateMessage (args .inv )
343
+
344
+ resp , err := args .uploadFlags .upload (args .inv , args .client )
345
+ if err != nil {
346
+ return nil , nil , err
347
+ }
348
+
349
+ tags , err := ParseProvisionerTags (args .provisionerTags )
350
+ if err != nil {
351
+ return nil , nil , err
352
+ }
353
+
354
+ userVariableValues , err := ParseUserVariableValues (
355
+ args .variablesFile ,
356
+ args .commandLineVariables )
357
+ if err != nil {
358
+ return nil , nil , err
359
+ }
360
+
361
+ versionArgs := createValidTemplateVersionArgs {
362
+ Message : message ,
363
+ Client : args .client ,
364
+ Organization : args .org ,
365
+ Provisioner : codersdk .ProvisionerType (args .provisioner ),
366
+ FileID : resp .ID ,
367
+ ProvisionerTags : tags ,
368
+ UserVariableValues : userVariableValues ,
369
+ }
370
+
371
+ if ! createTemplate {
372
+ versionArgs .Name = args .versionName
373
+ versionArgs .Template = & template
374
+ versionArgs .ReuseParameters = ! args .alwaysPrompt
375
+ }
376
+
377
+ job , err := createValidTemplateVersion (args .inv , versionArgs )
378
+ if err != nil {
379
+ return nil , nil , err
380
+ }
381
+
382
+ if job .Job .Status != codersdk .ProvisionerJobSucceeded {
383
+ return nil , nil , xerrors .Errorf ("job failed: %s" , job .Job .Status )
384
+ }
385
+
386
+ return job , & template , nil
387
+ }
0 commit comments