This pull request modernizes the codebase by adopting Go 1.21+ features, including built-in functions like min and max, standard library iterators such as strings.SplitSeq and strings.FieldsSeq, utility functions like maps.Copy and slices.Contains, and string manipulation helpers like strings.Cut and strings.CutPrefix. Feedback is provided on a test file where the usage of strings.Builder can be further optimized to avoid unnecessary string allocations during concatenation. `go fix -diff ./...`
279 lines
8.7 KiB
Go
279 lines
8.7 KiB
Go
package ops
|
|
|
|
import (
|
|
"context"
|
|
"os/exec"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/versenilvis/iris/commands/core"
|
|
)
|
|
|
|
func dockerContainerGenerator(tokens []string, _ string, _ string) []core.Suggestion {
|
|
cwd := core.GetCWD()
|
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
|
defer cancel()
|
|
|
|
cmd := exec.CommandContext(ctx, "docker", "ps", "-a", "--format={{.Names}}")
|
|
cmd.Dir = cwd
|
|
out, err := cmd.Output()
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
var results []core.Suggestion
|
|
for line := range strings.SplitSeq(string(out), "\n") {
|
|
line = strings.TrimSpace(line)
|
|
if line == "" {
|
|
continue
|
|
}
|
|
results = append(results, core.Suggestion{Cmd: line, Desc: "container"})
|
|
}
|
|
return results
|
|
}
|
|
|
|
func dockerRunningContainerGenerator(tokens []string, _ string, _ string) []core.Suggestion {
|
|
cwd := core.GetCWD()
|
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
|
defer cancel()
|
|
|
|
cmd := exec.CommandContext(ctx, "docker", "ps", "--format={{.Names}}")
|
|
cmd.Dir = cwd
|
|
out, err := cmd.Output()
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
var results []core.Suggestion
|
|
for line := range strings.SplitSeq(string(out), "\n") {
|
|
line = strings.TrimSpace(line)
|
|
if line == "" {
|
|
continue
|
|
}
|
|
results = append(results, core.Suggestion{Cmd: line, Desc: "running"})
|
|
}
|
|
return results
|
|
}
|
|
|
|
func dockerImageGenerator(tokens []string, _ string, _ string) []core.Suggestion {
|
|
cwd := core.GetCWD()
|
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
|
defer cancel()
|
|
|
|
cmd := exec.CommandContext(ctx, "docker", "images", "--format={{.Repository}}:{{.Tag}}")
|
|
cmd.Dir = cwd
|
|
out, err := cmd.Output()
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
seen := make(map[string]bool)
|
|
var results []core.Suggestion
|
|
for line := range strings.SplitSeq(string(out), "\n") {
|
|
line = strings.TrimSpace(line)
|
|
if line == "" || line == "<none>:<none>" || seen[line] {
|
|
continue
|
|
}
|
|
seen[line] = true
|
|
results = append(results, core.Suggestion{Cmd: line, Desc: "image"})
|
|
}
|
|
return results
|
|
}
|
|
|
|
func init() {
|
|
core.Register(&core.Spec{
|
|
Name: "docker",
|
|
Description: "container engine",
|
|
Subcommands: []core.Subcommand{
|
|
{
|
|
Name: "ps",
|
|
Description: "list containers",
|
|
Options: []core.Option{
|
|
{Name: "-a", Description: "show all"},
|
|
{Name: "-q", Description: "only show IDs"},
|
|
{Name: "--format", Description: "format output"},
|
|
{Name: "--filter", Description: "filter by condition"},
|
|
},
|
|
},
|
|
{
|
|
Name: "build",
|
|
Description: "build image",
|
|
Generator: core.FileGenerator(".dockerfile", ".Dockerfile"),
|
|
Options: []core.Option{
|
|
{Name: "-t", Description: "tag name"},
|
|
{Name: "-f", Description: "dockerfile path"},
|
|
{Name: "--no-cache", Description: "no build cache"},
|
|
{Name: "--platform", Description: "target platform"},
|
|
{Name: "--build-arg", Description: "build argument"},
|
|
},
|
|
},
|
|
{
|
|
Name: "run",
|
|
Description: "run container",
|
|
Generator: dockerImageGenerator,
|
|
Options: []core.Option{
|
|
{Name: "-d", Description: "detached mode"},
|
|
{Name: "-p", Description: "port mapping"},
|
|
{Name: "-v", Description: "volume mount"},
|
|
{Name: "--rm", Description: "auto remove"},
|
|
{Name: "--name", Description: "container name"},
|
|
{Name: "-it", Description: "interactive tty"},
|
|
{Name: "-e", Description: "set env variable"},
|
|
{Name: "--network", Description: "network mode"},
|
|
{Name: "--restart", Description: "restart policy"},
|
|
},
|
|
},
|
|
{
|
|
Name: "pull",
|
|
Description: "pull image",
|
|
},
|
|
{
|
|
Name: "push",
|
|
Description: "push image",
|
|
Generator: dockerImageGenerator,
|
|
},
|
|
{
|
|
Name: "exec",
|
|
Description: "exec in container",
|
|
Generator: dockerRunningContainerGenerator,
|
|
Options: []core.Option{
|
|
{Name: "-it", Description: "interactive tty"},
|
|
{Name: "-e", Description: "set env variable"},
|
|
{Name: "-u", Description: "run as user"},
|
|
},
|
|
},
|
|
{
|
|
Name: "stop",
|
|
Description: "stop container",
|
|
Generator: dockerRunningContainerGenerator,
|
|
},
|
|
{
|
|
Name: "start",
|
|
Description: "start container",
|
|
Generator: dockerContainerGenerator,
|
|
},
|
|
{
|
|
Name: "restart",
|
|
Description: "restart container",
|
|
Generator: dockerContainerGenerator,
|
|
},
|
|
{
|
|
Name: "rm",
|
|
Description: "remove container",
|
|
Generator: dockerContainerGenerator,
|
|
Options: []core.Option{
|
|
{Name: "-f", Description: "force remove"},
|
|
{Name: "-v", Description: "remove volumes"},
|
|
},
|
|
},
|
|
{
|
|
Name: "rmi",
|
|
Description: "remove image",
|
|
Generator: dockerImageGenerator,
|
|
Options: []core.Option{
|
|
{Name: "-f", Description: "force remove"},
|
|
},
|
|
},
|
|
{
|
|
Name: "images",
|
|
Description: "list images",
|
|
Options: []core.Option{
|
|
{Name: "-a", Description: "show all"},
|
|
{Name: "-q", Description: "only IDs"},
|
|
{Name: "--format", Description: "format output"},
|
|
},
|
|
},
|
|
{
|
|
Name: "logs",
|
|
Description: "view logs",
|
|
Generator: dockerContainerGenerator,
|
|
Options: []core.Option{
|
|
{Name: "-f", Description: "follow output"},
|
|
{Name: "--tail", Description: "last n lines"},
|
|
{Name: "--since", Description: "since timestamp"},
|
|
{Name: "-t", Description: "show timestamps"},
|
|
},
|
|
},
|
|
{
|
|
Name: "inspect",
|
|
Description: "show low-level info",
|
|
Generator: func(tokens []string, prefix string, partial string) []core.Suggestion {
|
|
containers := dockerContainerGenerator(tokens, prefix, partial)
|
|
images := dockerImageGenerator(tokens, prefix, partial)
|
|
return append(containers, images...)
|
|
},
|
|
},
|
|
{
|
|
Name: "compose",
|
|
Description: "multi-container",
|
|
Subcommands: []core.Subcommand{
|
|
{Name: "up", Description: "start services", Options: []core.Option{{Name: "-d", Description: "detached"}, {Name: "--build", Description: "rebuild images"}}},
|
|
{Name: "down", Description: "stop services", Options: []core.Option{{Name: "-v", Description: "remove volumes"}}},
|
|
{Name: "build", Description: "build services"},
|
|
{Name: "logs", Description: "view logs", Options: []core.Option{{Name: "-f", Description: "follow"}}},
|
|
{Name: "ps", Description: "list services"},
|
|
{Name: "exec", Description: "execute command"},
|
|
{Name: "restart", Description: "restart services"},
|
|
{Name: "pull", Description: "pull images"},
|
|
{Name: "stop", Description: "stop services"},
|
|
{Name: "start", Description: "start services"},
|
|
{Name: "config", Description: "validate config", Generator: core.FileGenerator(".yml", ".yaml")},
|
|
},
|
|
Options: []core.Option{
|
|
{Name: "-f", Description: "compose file"},
|
|
{Name: "--project-name", Description: "project name"},
|
|
},
|
|
},
|
|
{
|
|
Name: "network",
|
|
Description: "manage networks",
|
|
Subcommands: []core.Subcommand{
|
|
{Name: "ls", Description: "list networks"},
|
|
{Name: "create", Description: "create network"},
|
|
{Name: "rm", Description: "remove network"},
|
|
{Name: "inspect", Description: "show details"},
|
|
{Name: "prune", Description: "remove unused"},
|
|
},
|
|
},
|
|
{
|
|
Name: "volume",
|
|
Description: "manage volumes",
|
|
Subcommands: []core.Subcommand{
|
|
{Name: "ls", Description: "list volumes"},
|
|
{Name: "create", Description: "create volume"},
|
|
{Name: "rm", Description: "remove volume"},
|
|
{Name: "prune", Description: "remove unused"},
|
|
{Name: "inspect", Description: "show details"},
|
|
},
|
|
},
|
|
{
|
|
Name: "system",
|
|
Description: "manage docker system",
|
|
Subcommands: []core.Subcommand{
|
|
{Name: "prune", Description: "remove unused data", Options: []core.Option{{Name: "-a", Description: "remove all unused"}, {Name: "--volumes", Description: "include volumes"}}},
|
|
{Name: "df", Description: "show disk usage"},
|
|
{Name: "info", Description: "system info"},
|
|
},
|
|
},
|
|
},
|
|
})
|
|
|
|
core.Register(&core.Spec{
|
|
Name: "docker-compose",
|
|
Description: "multi-container (legacy)",
|
|
Subcommands: []core.Subcommand{
|
|
{Name: "up", Description: "start services", Options: []core.Option{{Name: "-d", Description: "detached"}, {Name: "--build", Description: "rebuild"}}},
|
|
{Name: "down", Description: "stop services", Options: []core.Option{{Name: "-v", Description: "remove volumes"}}},
|
|
{Name: "build", Description: "build services"},
|
|
{Name: "logs", Description: "view logs", Options: []core.Option{{Name: "-f", Description: "follow"}}},
|
|
{Name: "ps", Description: "list services"},
|
|
{Name: "exec", Description: "execute command"},
|
|
{Name: "restart", Description: "restart services"},
|
|
{Name: "pull", Description: "pull images"},
|
|
},
|
|
Options: []core.Option{
|
|
{Name: "-f", Description: "compose file"},
|
|
},
|
|
})
|
|
}
|