package prep // initializes logging and command line options import ( "fmt" "os" "path/filepath" "strings" "time" "go.wit.com/lib/config" "go.wit.com/log" durationpb "google.golang.org/protobuf/types/known/durationpb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" ) // makes a bash autocomplete file for your command func (pb *Auto) doHandlePB() error { homeDir, err := os.UserHomeDir() if err != nil { return err } basedir := filepath.Join(homeDir, ".cache/autocomplete") os.MkdirAll(basedir, os.ModePerm) fullname := filepath.Join(basedir, pb.Argname+".pb") all := NewAutos() var last *Auto data, err := os.ReadFile(fullname) if err == nil { err = all.Unmarshal(data) if err == nil { for found := range all.IterAll() { dur := time.Since(found.Ctime.AsTime()) pb.Duration = durationpb.New(dur) // found.PrintDebug() cmd := fmt.Sprintf("cmd='%s'", found.Cmd) arglast := fmt.Sprintf("last='%s'", found.Last) partial := fmt.Sprintf("p='%s'", found.Partial) age := fmt.Sprintf("age='%-6.6s'", config.FormatDuration(dur)) pb.Debugf("AUTO HISTORY: %s %-18.18s %-18.18s %-12.12s argv='%v' goargs='%v'", age, cmd, arglast, partial, found.Argv, found.Goargs) last = found } } } if all.Len() > 15 { pb.Debugf("DEBUG: trim() history is over 100 len=%d vs new=%d", all.Len(), all.Len()-90) all.Autos = all.Autos[all.Len()-10:] // newall.Autos = all.Autos[0:10] // for _, found := range all.Autos[0:10] { // newall.Append(found) // } } // need this for the first time the user runs autocomplete if last == nil { last = new(Auto) } now := time.Now() pb.Ctime = timestamppb.New(now) duration := time.Since(last.Ctime.AsTime()) all.Append(pb) data, err = all.Marshal() if err != nil { return err } f, err := os.OpenFile(fullname, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) defer f.Close() if err != nil { return err } _, err = f.Write(data) pb.Debugf("WRITE DEBUG: write PB='%s' len(pb)=%d len(data)=%d dur=%v err=%v", fullname, all.Len(), len(data), duration, err) return err } func (pb *Auto) SubCommand(cmd ...string) { partial := strings.Trim(pb.Partial, "'") if pb.Debug { if myAuto.examples == nil { pb.Debugf("WRITE DEBUG: argv.Examples() not defined") // log.Fprintf(os.Stderr, "\n") // log.Fprintf(os.Stderr, "examples was nil\n") // log.Fprintf(os.Stderr, "\n") } else { log.Fprintf(os.Stderr, "\n") log.Fprintf(os.Stderr, "\n") log.Fprintf(os.Stderr, "Examples:\n") for _, line := range strings.Split(myAuto.examples(), "\n") { log.Fprintf(os.Stderr, " %s\n", line) } // log.Fprintf(os.Stderr, "\n") } myAuto.pp.WriteHelpForAutocomplete(os.Stderr, os.Stdout, partial, cmd...) // myAuto.pp.GetUsageForSubcommand(os.Stdout, os.Stderr, partial, cmd) // myAuto.pp.GetUsageForSubcommand(os.Stdout, nil, partial, cmd) } else { f, _ := os.OpenFile("/tmp/outlook", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) myAuto.pp.WriteHelpForAutocomplete(f, os.Stdout, partial, cmd...) // myAuto.pp.GetUsageForSubcommand(os.Stdout, nil, partial, cmd) } os.Exit(0) // SubCommand(cmd) } /* func (pb *Auto) SubCommandShow() { partial := strings.Trim(pb.Partial, "'") if pb.Debug { myAuto.pp.WriteHelpForAutocomplete(os.Stderr, os.Stdout, partial, "show", "repo") } else { f, _ := os.OpenFile("/tmp/outlook", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) myAuto.pp.WriteHelpForAutocomplete(f, os.Stdout, partial, "show", "repo") } os.Exit(0) } func (pb *Auto) SubCommand2(cmd string, addmatch []string) { partial := strings.Trim(pb.Partial, "'") if pb.Debug { // myAuto.pp.WriteHelpForAutocomplete(os.Stderr, os.Stdout, partial, pb.Cmd) myAuto.pp.WriteHelpForAutocomplete(os.Stderr, os.Stdout, "", "") // myAuto.pp.GetUsageForSubcommand(os.Stdout, os.Stderr, partial, cmd) // myAuto.pp.GetUsageForSubcommand(os.Stdout, nil, partial, cmd) } else { f, _ := os.OpenFile("/tmp/outlook", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) myAuto.pp.WriteHelpForAutocomplete(f, os.Stdout, partial, pb.Cmd) // myAuto.pp.GetUsageForSubcommand(os.Stdout, nil, partial, cmd) } os.Exit(0) // SubCommand(cmd) } */