11package main
22
33import (
4- "fmt"
5- "os"
6- "os/exec"
7- "sort"
8- "text/tabwriter"
9-
104 "github.com/spf13/cobra"
11- "github.com/stuartleeks/devcontainer-cli/internal/pkg/devcontainers"
125)
136
147func main () {
@@ -21,148 +14,3 @@ func main() {
2114
2215 rootCmd .Execute ()
2316}
24-
25- func createListCommand () * cobra.Command {
26- var listIncludeContainerNames bool
27- var listVerbose bool
28- cmdList := & cobra.Command {
29- Use : "list" ,
30- Short : "List devcontainers" ,
31- Long : "Lists devcontainers that are currently running" ,
32- Run : func (cmd * cobra.Command , args []string ) {
33- if listIncludeContainerNames && listVerbose {
34- fmt .Println ("Can't use both verbose and include-container-names" )
35- os .Exit (1 )
36- }
37- devcontainers , err := devcontainers .ListDevcontainers ()
38- if err != nil {
39- fmt .Printf ("Error: %v" , err )
40- os .Exit (1 )
41- }
42- if listVerbose {
43- sort .Slice (devcontainers , func (i , j int ) bool { return devcontainers [i ].DevcontainerName < devcontainers [j ].DevcontainerName })
44-
45- w := new (tabwriter.Writer )
46- // minwidth, tabwidth, padding, padchar, flags
47- w .Init (os .Stdout , 8 , 8 , 0 , '\t' , 0 )
48- defer w .Flush ()
49-
50- fmt .Fprintf (w , "%s\t %s\n " , "DEVCONTAINER NAME" , "CONTAINER NAME" )
51- fmt .Fprintf (w , "%s\t %s\n " , "-----------------" , "--------------" )
52-
53- for _ , devcontainer := range devcontainers {
54- fmt .Fprintf (w , "%s\t %s\n " , devcontainer .DevcontainerName , devcontainer .ContainerName )
55- }
56- return
57- }
58- names := []string {}
59- for _ , devcontainer := range devcontainers {
60- names = append (names , devcontainer .DevcontainerName )
61- if listIncludeContainerNames {
62- names = append (names , devcontainer .ContainerName )
63- }
64- }
65- sort .Strings (names )
66- for _ , name := range names {
67- fmt .Println (name )
68- }
69- },
70- }
71- cmdList .Flags ().BoolVar (& listIncludeContainerNames , "include-container-names" , false , "Also include container names in the list" )
72- cmdList .Flags ().BoolVarP (& listVerbose , "verbose" , "v" , false , "Verbose output" )
73- return cmdList
74- }
75-
76- func createExecCommand () * cobra.Command {
77- cmd := & cobra.Command {
78- Use : "exec DEVCONTAINER_NAME COMMAND [args...]" ,
79- Short : "Execute a command in a devcontainer" ,
80- Long : "Execute a command in a devcontainer, similar to `docker exec`." ,
81- Run : func (cmd * cobra.Command , args []string ) {
82-
83- if len (args ) < 2 {
84- cmd .Usage ()
85- os .Exit (1 )
86- }
87-
88- devcontainerName := args [0 ]
89- devcontainers , err := devcontainers .ListDevcontainers ()
90- if err != nil {
91- fmt .Printf ("Error: %v" , err )
92- os .Exit (1 )
93- }
94-
95- containerID := ""
96- for _ , devcontainer := range devcontainers {
97- if devcontainer .ContainerName == devcontainerName || devcontainer .DevcontainerName == devcontainerName {
98- containerID = devcontainer .ContainerID
99- break
100- }
101- }
102- if containerID == "" {
103- cmd .Usage ()
104- if err != nil {
105- fmt .Printf ("Error: %v" , err )
106- }
107- os .Exit (1 )
108- }
109-
110- dockerArgs := []string {"exec" , "-it" , containerID }
111- dockerArgs = append (dockerArgs , args [1 :]... )
112-
113- dockerCmd := exec .Command ("docker" , dockerArgs ... )
114- dockerCmd .Stdin = os .Stdin
115- dockerCmd .Stdout = os .Stdout
116-
117- err = dockerCmd .Start ()
118- if err != nil {
119- fmt .Printf ("Exec: start error: %s\n " , err )
120- }
121- err = dockerCmd .Wait ()
122- if err != nil {
123- fmt .Printf ("Exec: wait error: %s\n " , err )
124- }
125- },
126- Args : cobra .ArbitraryArgs ,
127- DisableFlagParsing : true ,
128- DisableFlagsInUseLine : true ,
129- ValidArgsFunction : func (cmd * cobra.Command , args []string , toComplete string ) ([]string , cobra.ShellCompDirective ) {
130- // only completing the first arg (devcontainer name)
131- if len (args ) != 0 {
132- return nil , cobra .ShellCompDirectiveNoFileComp
133- }
134- devcontainers , err := devcontainers .ListDevcontainers ()
135- if err != nil {
136- fmt .Printf ("Error: %v" , err )
137- os .Exit (1 )
138- }
139- names := []string {}
140- for _ , devcontainer := range devcontainers {
141- names = append (names , devcontainer .DevcontainerName )
142- names = append (names , devcontainer .ContainerName )
143- }
144- sort .Strings (names )
145- return names , cobra .ShellCompDirectiveNoFileComp
146- },
147- }
148- return cmd
149- }
150-
151- func createCompleteCommand (rootCmd * cobra.Command ) * cobra.Command {
152- return & cobra.Command {
153- Use : "completion" ,
154- Short : "Generates bash completion scripts" ,
155- Long : `To load completion run
156-
157- . <(devcontainer completion)
158-
159- To configure your bash shell to load completions for each session add to your bashrc
160-
161- # ~/.bashrc or ~/.profile
162- . <(devcontainer completion)
163- ` ,
164- Run : func (cmd * cobra.Command , args []string ) {
165- rootCmd .GenBashCompletion (os .Stdout )
166- },
167- }
168- }
0 commit comments