package argvpb // initializes logging and command line options import ( "fmt" "os" "strings" "go.wit.com/log" ) func (pb *Argv) parseArgv() { // this shouldn't really happen. OS/POSIX error? if len(os.Args) == 0 { // fmt.Fprintf(os.Stderr, "what OS is this?\n") return } // there is nothing on the command line. user just ran "forge" and hit enter if len(os.Args) == 1 { pb.Arg0 = os.Args[0] return } // try to setup bash autocomplete and exit if len(os.Args) > 1 && os.Args[1] == "--bash" { pb.SetupAuto = true return } // try to setup zsh autocomplete and exit if len(os.Args) > 1 && os.Args[1] == "--zsh" { pb.SetupAuto = true return } // set debug flag if --argvdebug is passed for _, s := range os.Args { if s == "--argvdebug" { pb.Debug = true } // deprecate if s == "--autodebug" { pb.Debug = true } } // wtf is this. I've forgotten. todo: figure this out 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) } // print the version and exit if len(os.Args) > 1 && os.Args[1] == "--version" { // if binary defined buildtime() then process standard version output here doVersion(pb) os.Exit(0) } if os.Args[1] != "--auto-complete" { // if the first arg is not --auto-complete, then don't go any farther for _, s := range os.Args[1:] { if strings.HasPrefix(s, "-") { // option is something like --verbose // skip these. they are not subcommands continue } // found the subcommand pb.Cmd = s break } // exit here. not autocomplete // todo: actually finish parsing the pb. is it safe to continue from here? return } // the shell is trying to get autocomplete information // initial PB setup 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 // no subcommand. user has done "forge " pb.Partial = "" pb.Cmd = "" pb.Real = []string{""} return } // figure out if there is a subcommand or a partial match 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.Real = append(pb.Real, s) } // set pb.Cmd to the first thing that doesn't have a '-' arg for _, s := range pb.Real { 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.Real { 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 }