package argvpb // initializes logging and command line options import ( "fmt" "os" "strings" ) func GetCmd() string { return PB.GetCmd() } // todo: this is wrong func (pb *Argv) GetCmd() string { var curcmd string if pb == nil { return "pb=" } for _, s := range pb.Real { if strings.HasPrefix(s, "-") { // option is something like --verbose // skip these. they are not subcommands continue } // found the subcommand curcmd = s break } if pb.Partial == "'"+curcmd+"'" { // not really a command, it's just a partially inputed string from the user return "" } return curcmd } // todo: this is dumb func (pb *Argv) getSubSubCmd() string { var subcmd string 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) } subcmd = s } return subcmd } func (pb *Argv) parseOsArgs() { // this shouldn't really happen. OS/POSIX error? if len(os.Args) == 0 { // fmt.Fprintf(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" { me.setupAuto = true return } // try to setup zsh autocomplete and exit if len(os.Args) > 1 && os.Args[1] == "--zsh" { me.setupAuto = true return } // 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) saveAndExit() } 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 s == "--argvdebug" { me.debug = true continue } pb.Real = append(pb.Real, s) } // found the subcommand // pb.Cmd = pb.findCmd() // 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 me.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.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 == "--argvdebug" { me.debug = true continue } tmp := strings.Trim(pb.Partial, "'") if tmp == s { // don't put pb.Partial into Argv continue } pb.Real = append(pb.Real, s) } return }