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 } } 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 }