@@ -31,6 +31,7 @@ func envsCmd() *cobra.Command {
31
31
watchBuildLogCommand (),
32
32
rebuildEnvCommand (),
33
33
createEnvCmd (),
34
+ createEnvFromRepoCmd (),
34
35
editEnvCmd (),
35
36
)
36
37
return cmd
@@ -183,7 +184,6 @@ coder envs create my-new-powerful-env --cpu 12 --disk 100 --memory 16 --image ub
183
184
if multiOrgMember && org == "" {
184
185
return xerrors .New ("org is required for multi-org members" )
185
186
}
186
-
187
187
importedImg ,err := findImg (ctx ,client ,findImgConf {
188
188
email :coder .Me ,
189
189
imgName :img ,
@@ -250,6 +250,85 @@ coder envs create my-new-powerful-env --cpu 12 --disk 100 --memory 16 --image ub
250
250
return cmd
251
251
}
252
252
253
+ func createEnvFromRepoCmd ()* cobra.Command {
254
+ var (
255
+ org string
256
+ branch string
257
+ name string
258
+ follow bool
259
+ )
260
+
261
+ cmd := & cobra.Command {
262
+ Use :"create-from-repo [environment_name]" ,
263
+ Short :"create a new environment from a git repository." ,
264
+ Args :cobra .ExactArgs (1 ),
265
+ Long :"Create a new Coder environment from a Git repository." ,
266
+ Hidden :true ,
267
+ Example :`# create a new environment from git repository template
268
+ coder envs create-from-repo github.com/cdr/m
269
+ coder envs create-from-repo github.com/cdr/m --branch envs-as-code` ,
270
+ RunE :func (cmd * cobra.Command ,args []string )error {
271
+ ctx := cmd .Context ()
272
+
273
+ client ,err := newClient (ctx )
274
+ if err != nil {
275
+ return err
276
+ }
277
+
278
+ multiOrgMember ,err := isMultiOrgMember (ctx ,client ,coder .Me )
279
+ if err != nil {
280
+ return err
281
+ }
282
+
283
+ if multiOrgMember && org == "" {
284
+ return xerrors .New ("org is required for multi-org members" )
285
+ }
286
+
287
+ if org == "" {
288
+ // Definitely janky... but since we aren't importing
289
+ // an image we need to get the org name somehow.
290
+ orgs ,err := client .Organizations (ctx )
291
+ if err != nil {
292
+ return err
293
+ }
294
+ org = orgs [0 ].Name
295
+ }
296
+
297
+ // ExactArgs(1) ensures our name value can't panic on an out of bounds.
298
+ createReq := & coder.CreateEnvironmentFromRepoRequest {
299
+ RepositoryURL :args [0 ],
300
+ Name :name ,
301
+ Branch :branch ,
302
+ }
303
+
304
+ env ,err := client .CreateEnvironmentFromRepo (ctx ,org ,* createReq )
305
+ if err != nil {
306
+ return xerrors .Errorf ("create environment: %w" ,err )
307
+ }
308
+
309
+ if follow {
310
+ clog .LogSuccess ("creating environment..." )
311
+ if err := trailBuildLogs (ctx ,client ,env .ID );err != nil {
312
+ return err
313
+ }
314
+ return nil
315
+ }
316
+
317
+ clog .LogSuccess ("creating environment..." ,
318
+ clog .BlankLine ,
319
+ clog .Tipf (`run "coder envs watch-build %s" to trail the build logs` ,env .Name ),
320
+ )
321
+ return nil
322
+ },
323
+ }
324
+ cmd .Flags ().StringVarP (& org ,"org" ,"o" ,"" ,"name of the organization the environment should be created under." )
325
+ cmd .Flags ().StringVarP (& name ,"name" ,"n" ,"" ,"name of the environment to create." )
326
+ cmd .Flags ().StringVarP (& branch ,"branch" ,"b" ,"" ,"name of the branch to create the environment from." )
327
+ cmd .Flags ().BoolVar (& follow ,"follow" ,false ,"follow buildlog after initiating rebuild" )
328
+ _ = cmd .MarkFlagRequired ("image" )
329
+ return cmd
330
+ }
331
+
253
332
func editEnvCmd ()* cobra.Command {
254
333
var (
255
334
org string