summaryrefslogtreecommitdiff
path: root/parseArgv.go
diff options
context:
space:
mode:
Diffstat (limited to 'parseArgv.go')
-rw-r--r--parseArgv.go133
1 files changed, 133 insertions, 0 deletions
diff --git a/parseArgv.go b/parseArgv.go
new file mode 100644
index 0000000..1fdaf5f
--- /dev/null
+++ b/parseArgv.go
@@ -0,0 +1,133 @@
+package prep
+
+// initializes logging and command line options
+
+import (
+ "fmt"
+ "os"
+ "strings"
+
+ "go.wit.com/log"
+)
+
+func parseArgv(argname string) *Auto {
+ pb := new(Auto)
+ pb.Argname = argname
+ if len(os.Args) == 0 {
+ return pb
+ }
+
+ if len(os.Args) > 1 && os.Args[1] == "--bash" {
+ pb.SetupAuto = true
+ return pb
+ }
+
+ // HACK: set debug flag if --autodebug is passed
+ for _, s := range os.Args {
+ if s == "--autodebug" {
+ pb.Debug = true
+ }
+ }
+
+ // "complete -C /usr/bin/argv forge" bash ENV values:
+ // * `COMP_LINE`: A string containing the entire current command line (forge first second third forth ). This is what you are looking for.
+ // * `COMP_POINT`: A number indicating the cursor's position (index) within the COMP_LINE.
+ // * `COMP_WORDS`: An array in Bash (seen differently by Go) containing each individual word on the command line.
+ // * `COMP_CWORD`: A number indicating the index of the word the cursor is currently on within the COMP_WORDS array.
+ if len(os.Args) > 1 && os.Args[1] == pb.Argname {
+ pb.IsAuto = true
+ parts := strings.Split(os.Getenv("COMP_LINE"), " ")
+ pb.Debug = true
+ log.Fprintf(os.Stderr, "\n")
+ pb.Debugf("MATCH Partial os.Args=%v COMP_LINE=%v", os.Args, os.Getenv("COMP_LINE"))
+ // log.Fprintf(os.Stdout, "jcarr")
+ if len(parts) > 0 {
+ pb.Arg0 = parts[0]
+ }
+ pb.Arg1 = os.Args[1]
+ os.Exit(0)
+ }
+
+ if len(os.Args) > 1 && os.Args[1] == "--version" {
+ if myAuto.buildtime != nil {
+ // if binary defined buildtime() then process standard version output here
+ doVersion(pb)
+ os.Exit(0)
+ }
+ }
+ if len(os.Args) == 0 {
+ return pb
+ }
+
+ if len(os.Args) == 1 {
+ pb.Arg0 = os.Args[0]
+ return pb
+ }
+ if os.Args[1] != "--auto-complete" {
+ pb.Cmd = os.Args[1]
+ return pb
+ }
+
+ // should we do auto complete here?
+ if len(os.Args) > 1 && os.Args[1] == "--auto-complete" {
+ pb.IsAuto = true
+ pb.Arg0 = os.Args[0]
+ pb.Arg1 = os.Args[1]
+ pb.Partial = os.Args[2]
+ pb.Arg3 = os.Args[3]
+ if len(os.Args) < 5 {
+ // the user is doing autocomplete on the command itself
+ pb.Partial = ""
+ pb.Cmd = ""
+ pb.Argv = []string{""}
+ return pb
+ }
+ if pb.Partial == "''" {
+ pb.Partial = ""
+ }
+ // pb.Argv = os.Args[4:]
+ for _, s := range os.Args[4:] {
+ if s == "--autodebug" {
+ continue
+ }
+ tmp := strings.Trim(pb.Partial, "'")
+ if tmp == s {
+ // don't put pb.Partial into Argv
+ continue
+ }
+ pb.Argv = append(pb.Argv, s)
+ }
+ // set pb.Cmd to the first thing that doesn't have a '-' arg
+ for _, s := range pb.Argv {
+ if strings.HasPrefix(s, "-") {
+ continue
+ }
+ pb.Cmd = s
+ break
+ }
+ if pb.Partial == "'"+pb.Cmd+"'" {
+ // not really a command, it's just a partially inputed string from the user
+ pb.Cmd = ""
+ }
+ // try to figure out what the last argv is
+ for _, s := range pb.Argv {
+ p := fmt.Sprintf("'%s'", s)
+ if pb.Partial == p {
+ pb.Debugf("DEBUG: Last argv MATCHES Partial %s %s", s, p)
+ continue
+ } else {
+ pb.Debugf("DEBUG: Last argv DOES NOT MATCH Partial %s %s", s, p)
+ }
+ pb.Last = s
+ if strings.HasPrefix(s, "-") {
+ // skip args like -test --verbose when sending subcommands to go-args for help text
+ continue
+ }
+ pb.Goargs = append(pb.Goargs, s)
+ }
+ // if pb.Cmd == "" {
+ // pb.Cmd = strings.Join(pb.Argv, "BLAH")
+ // }
+ }
+ return pb
+}