aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbyunghwa.yun <combine@combineads.co.kr>2021-08-03 00:25:44 +0900
committerbyunghwa.yun <combine@combineads.co.kr>2021-08-03 02:56:52 +0900
commitbdc7730fdb160ea59efa72ff946cd329d5e1c59f (patch)
tree72c8cac450dc37b67a9155ffbcd3e2bd0af163c0
parent2ae9705442b513af60e26c786c612867ea36015d (diff)
downloadseaweedfs-bdc7730fdb160ea59efa72ff946cd329d5e1c59f.tar.xz
seaweedfs-bdc7730fdb160ea59efa72ff946cd329d5e1c59f.zip
Add autocomplete
-rw-r--r--go.mod1
-rw-r--r--go.sum4
-rw-r--r--weed/command/autocomplete.go109
-rw-r--r--weed/command/command.go2
-rw-r--r--weed/weed.go5
5 files changed, 121 insertions, 0 deletions
diff --git a/go.mod b/go.mod
index 53188faf2..8fdbf5f60 100644
--- a/go.mod
+++ b/go.mod
@@ -90,6 +90,7 @@ require (
gopkg.in/jcmturner/goidentity.v3 v3.0.0 // indirect
gopkg.in/jcmturner/gokrb5.v7 v7.3.0 // indirect
modernc.org/sqlite v1.10.7
+ github.com/posener/complete v1.2.3
)
// replace github.com/seaweedfs/fuse => /Users/chris/go/src/github.com/seaweedfs/fuse
diff --git a/go.sum b/go.sum
index c96845979..f23ca0020 100644
--- a/go.sum
+++ b/go.sum
@@ -364,10 +364,12 @@ github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4=
github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
+github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
+github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o=
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
@@ -571,6 +573,8 @@ github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZ
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
+github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo=
+github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc=
github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
diff --git a/weed/command/autocomplete.go b/weed/command/autocomplete.go
new file mode 100644
index 000000000..b98c16cf3
--- /dev/null
+++ b/weed/command/autocomplete.go
@@ -0,0 +1,109 @@
+package command
+
+import (
+ "fmt"
+ flag "github.com/chrislusf/seaweedfs/weed/util/fla9"
+ "github.com/posener/complete"
+ completeinstall "github.com/posener/complete/cmd/install"
+ "runtime"
+)
+
+func AutocompleteMain(commands []*Command) bool {
+ subCommands := make(map[string]complete.Command)
+ helpSubCommands := make(map[string]complete.Command)
+ for _, cmd := range commands {
+ flags := make(map[string]complete.Predictor)
+ cmd.Flag.VisitAll(func(flag *flag.Flag) {
+ flags["-"+flag.Name] = complete.PredictAnything
+ })
+
+ subCommands[cmd.Name()] = complete.Command{
+ Flags: flags,
+ }
+ helpSubCommands[cmd.Name()] = complete.Command{}
+ }
+ subCommands["help"] = complete.Command{Sub: helpSubCommands}
+
+ globalFlags := make(map[string]complete.Predictor)
+ flag.VisitAll(func(flag *flag.Flag) {
+ globalFlags["-"+flag.Name] = complete.PredictAnything
+ })
+
+ weedCmd := complete.Command{
+ Sub: subCommands,
+ Flags: globalFlags,
+ GlobalFlags: complete.Flags{"-h": complete.PredictNothing},
+ }
+ cmp := complete.New("weed", weedCmd)
+
+ return cmp.Complete()
+}
+
+func installAutoCompletion() bool {
+ if runtime.GOOS == "windows" {
+ fmt.Printf("windows is not supported")
+ return false
+ }
+
+ err := completeinstall.Install("weed")
+ if err != nil {
+ fmt.Printf("install failed! %s\n", err)
+ return false
+ }
+ fmt.Printf("autocompletion is enabled. Please restart your shell.\n")
+ return true
+}
+
+func uninstallAutoCompletion() bool {
+ if runtime.GOOS == "windows" {
+ fmt.Printf("windows is not supported")
+ return false
+ }
+
+ err := completeinstall.Uninstall("weed")
+ if err != nil {
+ fmt.Printf("uninstall failed! %s\n", err)
+ return false
+ }
+ fmt.Printf("autocompletion is disable. Please restart your shell.\n")
+ return true
+}
+
+var cmdAutocomplete = &Command{
+ Run: runAutocomplete,
+ UsageLine: "autocomplete",
+ Short: "install autocomplete",
+ Long: `weed autocomplete is installed in the shell.
+
+ Supported shells are bash, zsh, and fish.
+ Windows is not supported.
+
+`,
+}
+
+func runAutocomplete(cmd *Command, args []string) bool {
+ if len(args) != 0 {
+ cmd.Usage()
+ }
+
+ return installAutoCompletion()
+}
+
+var cmdUnautocomplete = &Command{
+ Run: runUnautocomplete,
+ UsageLine: "unautocomplete",
+ Short: "uninstall autocomplete",
+ Long: `weed autocomplete is uninstalled in the shell.
+
+ Windows is not supported.
+
+`,
+}
+
+func runUnautocomplete(cmd *Command, args []string) bool {
+ if len(args) != 0 {
+ cmd.Usage()
+ }
+
+ return uninstallAutoCompletion()
+}
diff --git a/weed/command/command.go b/weed/command/command.go
index 0bac56442..022aba194 100644
--- a/weed/command/command.go
+++ b/weed/command/command.go
@@ -36,6 +36,8 @@ var Commands = []*Command{
cmdVersion,
cmdVolume,
cmdWebDav,
+ cmdAutocomplete,
+ cmdUnautocomplete,
}
type Command struct {
diff --git a/weed/weed.go b/weed/weed.go
index 91c17d9ff..068d2077c 100644
--- a/weed/weed.go
+++ b/weed/weed.go
@@ -46,6 +46,11 @@ func main() {
glog.MaxSize = 1024 * 1024 * 32
rand.Seed(time.Now().UnixNano())
flag.Usage = usage
+
+ if command.AutocompleteMain(commands) {
+ return
+ }
+
flag.Parse()
args := flag.Args()