Skip to content

Commit 6ceb579

Browse files
committed
restructure command wiring up
1 parent 86b8208 commit 6ceb579

File tree

1 file changed

+97
-97
lines changed

1 file changed

+97
-97
lines changed

cmd/devcontainer/main.go

Lines changed: 97 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -12,29 +12,116 @@ import (
1212
)
1313

1414
func main() {
15-
var listIncludeContainerNames bool
16-
var listVerbose bool
1715

1816
rootCmd := &cobra.Command{Use: "devcontainer"}
1917

18+
rootCmd.AddCommand(createListCommand())
19+
rootCmd.AddCommand(createExecCommand())
20+
rootCmd.AddCommand(createCompleteCommand(rootCmd))
21+
22+
rootCmd.Execute()
23+
}
24+
25+
func createListCommand() *cobra.Command {
26+
var listIncludeContainerNames bool
27+
var listVerbose bool
2028
cmdList := &cobra.Command{
2129
Use: "list",
2230
Short: "List devcontainers",
2331
Long: "Lists devcontainers that are currently running",
2432
Run: func(cmd *cobra.Command, args []string) {
25-
runListCommand(cmd, args, listIncludeContainerNames, listVerbose)
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+
}
2669
},
2770
}
2871
cmdList.Flags().BoolVar(&listIncludeContainerNames, "include-container-names", false, "Also include container names in the list")
2972
cmdList.Flags().BoolVarP(&listVerbose, "verbose", "v", false, "Verbose output")
30-
rootCmd.AddCommand(cmdList)
73+
return cmdList
74+
}
3175

32-
cmdExec := &cobra.Command{
76+
func createExecCommand() *cobra.Command {
77+
cmd := &cobra.Command{
3378
Use: "exec DEVCONTAINER_NAME COMMAND [args...]",
3479
Short: "Execute a command in a devcontainer",
3580
Long: "Execute a command in a devcontainer, similar to `docker exec`.",
3681
Run: func(cmd *cobra.Command, args []string) {
37-
runExecCommand(cmd, args)
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+
}
38125
},
39126
Args: cobra.ArbitraryArgs,
40127
DisableFlagParsing: true,
@@ -58,9 +145,11 @@ func main() {
58145
return names, cobra.ShellCompDirectiveNoFileComp
59146
},
60147
}
61-
rootCmd.AddCommand(cmdExec)
148+
return cmd
149+
}
62150

63-
cmdCompletion := &cobra.Command{
151+
func createCompleteCommand(rootCmd *cobra.Command) *cobra.Command {
152+
return &cobra.Command{
64153
Use: "completion",
65154
Short: "Generates bash completion scripts",
66155
Long: `To load completion run
@@ -76,93 +165,4 @@ func main() {
76165
rootCmd.GenBashCompletion(os.Stdout)
77166
},
78167
}
79-
rootCmd.AddCommand(cmdCompletion)
80-
81-
rootCmd.Execute()
82-
}
83-
84-
func runListCommand(cmd *cobra.Command, args []string, listIncludeContainerNames bool, listVerbose bool) {
85-
if listIncludeContainerNames && listVerbose {
86-
fmt.Println("Can't use both verbose and include-container-names")
87-
os.Exit(1)
88-
}
89-
devcontainers, err := devcontainers.ListDevcontainers()
90-
if err != nil {
91-
fmt.Printf("Error: %v", err)
92-
os.Exit(1)
93-
}
94-
if listVerbose {
95-
sort.Slice(devcontainers, func(i, j int) bool { return devcontainers[i].DevcontainerName < devcontainers[j].DevcontainerName })
96-
97-
w := new(tabwriter.Writer)
98-
// minwidth, tabwidth, padding, padchar, flags
99-
w.Init(os.Stdout, 8, 8, 0, '\t', 0)
100-
defer w.Flush()
101-
102-
fmt.Fprintf(w, "%s\t%s\n", "DEVCONTAINER NAME", "CONTAINER NAME")
103-
fmt.Fprintf(w, "%s\t%s\n", "-----------------", "--------------")
104-
105-
for _, devcontainer := range devcontainers {
106-
fmt.Fprintf(w, "%s\t%s\n", devcontainer.DevcontainerName, devcontainer.ContainerName)
107-
}
108-
return
109-
}
110-
names := []string{}
111-
for _, devcontainer := range devcontainers {
112-
names = append(names, devcontainer.DevcontainerName)
113-
if listIncludeContainerNames {
114-
names = append(names, devcontainer.ContainerName)
115-
}
116-
}
117-
sort.Strings(names)
118-
for _, name := range names {
119-
fmt.Println(name)
120-
}
121-
}
122-
123-
func runExecCommand(cmd *cobra.Command, args []string) {
124-
// TODO argument validation!
125-
126-
if len(args) < 2 {
127-
cmd.Usage()
128-
os.Exit(1)
129-
}
130-
131-
devcontainerName := args[0]
132-
devcontainers, err := devcontainers.ListDevcontainers()
133-
if err != nil {
134-
fmt.Printf("Error: %v", err)
135-
os.Exit(1)
136-
}
137-
138-
containerID := ""
139-
for _, devcontainer := range devcontainers {
140-
if devcontainer.ContainerName == devcontainerName || devcontainer.DevcontainerName == devcontainerName {
141-
containerID = devcontainer.ContainerID
142-
break
143-
}
144-
}
145-
if containerID == "" {
146-
cmd.Usage()
147-
if err != nil {
148-
fmt.Printf("Error: %v", err)
149-
}
150-
os.Exit(1)
151-
}
152-
153-
dockerArgs := []string{"exec", "-it", containerID}
154-
dockerArgs = append(dockerArgs, args[1:]...)
155-
156-
dockerCmd := exec.Command("docker", dockerArgs...)
157-
dockerCmd.Stdin = os.Stdin
158-
dockerCmd.Stdout = os.Stdout
159-
160-
err = dockerCmd.Start()
161-
if err != nil {
162-
fmt.Printf("Exec: start error: %s\n", err)
163-
}
164-
err = dockerCmd.Wait()
165-
if err != nil {
166-
fmt.Printf("Exec: wait error: %s\n", err)
167-
}
168168
}

0 commit comments

Comments
 (0)