Skip to content

Commit d248a72

Browse files
committed
split into files
1 parent 6ceb579 commit d248a72

File tree

3 files changed

+164
-152
lines changed

3 files changed

+164
-152
lines changed

cmd/devcontainer/completion.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package main
2+
3+
import (
4+
"os"
5+
6+
"github.com/spf13/cobra"
7+
)
8+
9+
func createCompleteCommand(rootCmd *cobra.Command) *cobra.Command {
10+
return &cobra.Command{
11+
Use: "completion",
12+
Short: "Generates bash completion scripts",
13+
Long: `To load completion run
14+
15+
. <(devcontainer completion)
16+
17+
To configure your bash shell to load completions for each session add to your bashrc
18+
19+
# ~/.bashrc or ~/.profile
20+
. <(devcontainer completion)
21+
`,
22+
Run: func(cmd *cobra.Command, args []string) {
23+
rootCmd.GenBashCompletion(os.Stdout)
24+
},
25+
}
26+
}

cmd/devcontainer/devcontainer.go

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"os/exec"
7+
"sort"
8+
"text/tabwriter"
9+
10+
"github.com/spf13/cobra"
11+
"github.com/stuartleeks/devcontainer-cli/internal/pkg/devcontainers"
12+
)
13+
14+
func createListCommand() *cobra.Command {
15+
var listIncludeContainerNames bool
16+
var listVerbose bool
17+
cmdList := &cobra.Command{
18+
Use: "list",
19+
Short: "List devcontainers",
20+
Long: "Lists running devcontainers",
21+
Run: func(cmd *cobra.Command, args []string) {
22+
if listIncludeContainerNames && listVerbose {
23+
fmt.Println("Can't use both verbose and include-container-names")
24+
os.Exit(1)
25+
}
26+
devcontainers, err := devcontainers.ListDevcontainers()
27+
if err != nil {
28+
fmt.Printf("Error: %v", err)
29+
os.Exit(1)
30+
}
31+
if listVerbose {
32+
sort.Slice(devcontainers, func(i, j int) bool { return devcontainers[i].DevcontainerName < devcontainers[j].DevcontainerName })
33+
34+
w := new(tabwriter.Writer)
35+
// minwidth, tabwidth, padding, padchar, flags
36+
w.Init(os.Stdout, 8, 8, 0, '\t', 0)
37+
defer w.Flush()
38+
39+
fmt.Fprintf(w, "%s\t%s\n", "DEVCONTAINER NAME", "CONTAINER NAME")
40+
fmt.Fprintf(w, "%s\t%s\n", "-----------------", "--------------")
41+
42+
for _, devcontainer := range devcontainers {
43+
fmt.Fprintf(w, "%s\t%s\n", devcontainer.DevcontainerName, devcontainer.ContainerName)
44+
}
45+
return
46+
}
47+
names := []string{}
48+
for _, devcontainer := range devcontainers {
49+
names = append(names, devcontainer.DevcontainerName)
50+
if listIncludeContainerNames {
51+
names = append(names, devcontainer.ContainerName)
52+
}
53+
}
54+
sort.Strings(names)
55+
for _, name := range names {
56+
fmt.Println(name)
57+
}
58+
},
59+
}
60+
cmdList.Flags().BoolVar(&listIncludeContainerNames, "include-container-names", false, "Also include container names in the list")
61+
cmdList.Flags().BoolVarP(&listVerbose, "verbose", "v", false, "Verbose output")
62+
return cmdList
63+
}
64+
65+
func createExecCommand() *cobra.Command {
66+
cmd := &cobra.Command{
67+
Use: "exec DEVCONTAINER_NAME COMMAND [args...]",
68+
Short: "Execute a command in a devcontainer",
69+
Long: "Execute a command in a devcontainer, similar to `docker exec`.",
70+
Run: func(cmd *cobra.Command, args []string) {
71+
72+
if len(args) < 2 {
73+
cmd.Usage()
74+
os.Exit(1)
75+
}
76+
77+
devcontainerName := args[0]
78+
devcontainers, err := devcontainers.ListDevcontainers()
79+
if err != nil {
80+
fmt.Printf("Error: %v", err)
81+
os.Exit(1)
82+
}
83+
84+
containerID := ""
85+
for _, devcontainer := range devcontainers {
86+
if devcontainer.ContainerName == devcontainerName || devcontainer.DevcontainerName == devcontainerName {
87+
containerID = devcontainer.ContainerID
88+
break
89+
}
90+
}
91+
if containerID == "" {
92+
cmd.Usage()
93+
if err != nil {
94+
fmt.Printf("Error: %v", err)
95+
}
96+
os.Exit(1)
97+
}
98+
99+
dockerArgs := []string{"exec", "-it", containerID}
100+
dockerArgs = append(dockerArgs, args[1:]...)
101+
102+
dockerCmd := exec.Command("docker", dockerArgs...)
103+
dockerCmd.Stdin = os.Stdin
104+
dockerCmd.Stdout = os.Stdout
105+
106+
err = dockerCmd.Start()
107+
if err != nil {
108+
fmt.Printf("Exec: start error: %s\n", err)
109+
}
110+
err = dockerCmd.Wait()
111+
if err != nil {
112+
fmt.Printf("Exec: wait error: %s\n", err)
113+
}
114+
},
115+
Args: cobra.ArbitraryArgs,
116+
DisableFlagParsing: true,
117+
DisableFlagsInUseLine: true,
118+
ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
119+
// only completing the first arg (devcontainer name)
120+
if len(args) != 0 {
121+
return nil, cobra.ShellCompDirectiveNoFileComp
122+
}
123+
devcontainers, err := devcontainers.ListDevcontainers()
124+
if err != nil {
125+
fmt.Printf("Error: %v", err)
126+
os.Exit(1)
127+
}
128+
names := []string{}
129+
for _, devcontainer := range devcontainers {
130+
names = append(names, devcontainer.DevcontainerName)
131+
names = append(names, devcontainer.ContainerName)
132+
}
133+
sort.Strings(names)
134+
return names, cobra.ShellCompDirectiveNoFileComp
135+
},
136+
}
137+
return cmd
138+
}

cmd/devcontainer/main.go

Lines changed: 0 additions & 152 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,7 @@
11
package main
22

33
import (
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

147
func 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

Comments
 (0)