package main import ( "embed" "errors" "os" "path/filepath" "strings" "go.wit.com/lib/config" "go.wit.com/lib/gui/prep" "go.wit.com/lib/gui/shell" "go.wit.com/lib/protobuf/zoopb" "go.wit.com/log" "google.golang.org/protobuf/types/known/timestamppb" ) // sent via -ldflags var VERSION string var BUILDTIME string // used for shell auto completion var ARGNAME string = "mirrors" // todo: get this from $0 ? //go:embed resources/* var resources embed.FS func main() { me = new(mainType) me.sh = prep.Bash3(&argv) // add support for bash autocomplete with go-arg // read in protobuf file me.pb = zoopb.NewPackages() me.pb.Filename = "/home/mirrors/wit/mirrors.wit.com.pb" if err := me.pb.Load(); err != nil { if argv.Force { config.Save(me.pb) } else { me.sh.BadExit("no config found. use --force to create one", err) } } if me.pb.BaseDir != "/home/mirrors/wit" { me.pb.Filename = "/home/mirrors/wit/mirrors.wit.com.pb" me.pb.BaseDir = "/home/mirrors/wit" me.pb.Save() panic("missing /home/mirrors/wit as BaseDir") } if me.sh.Cmd == "" { // default behavior when no argv s := log.Sprintf("You have %d packages in %s", me.pb.Len(), me.pb.BaseDir) me.sh.GoodExit(s) } // default handling of argv subcommands var s string var err error if argv.Incoming != nil { s, err = doIncoming(me.pb) } if argv.Walk != nil { s, err = doWalk() } if argv.List != nil { s, err = doList() } if argv.Verify != nil { s, err = doVerify() } if argv.Update != nil { err = doDistro() } if argv.MakeDists != nil { s, err = doMakeDists() } if err != nil { me.sh.BadExit(s, err) } me.sh.GoodExit(s) } func doVerify() (string, error) { if err := os.Chdir(me.pb.BaseDir); err != nil { return "no '" + me.pb.BaseDir + "' directory", err } if !shell.IsDir("pool/") { return "no " + filepath.Join(me.pb.BaseDir, "pool") + " directory", errors.New("mount -a ? missing wit/pool/") } log.Info("Processing dir", filepath.Join(me.pb.BaseDir, "pool")) var counter int filemap := make(map[string]*zoopb.Package) for p := range me.pb.IterAll() { pdump := log.Sprintf("%v", p) if p.DebInfo == nil { log.Printf("debinfo == nil %-130.130s\n", pdump) counter += 1 continue } if p.Filename == "" { log.Printf("filename is blank %-130.130s\n", pdump) counter += 1 continue } fullname := filepath.Join(me.pb.BaseDir, p.Filename) if !shell.Exists(p.Filename) { log.Printf("no file Exists() %-130.130s\n", fullname) me.pb.Delete(p) counter += 1 continue } if dupname, ok := filemap[p.Filename]; ok { dupdump := log.Sprintf("%v", dupname) log.Printf("dup filename 1 %-130.130s\n", pdump) log.Printf("dup filename 2 %-130.130s\n", dupdump) counter += 1 continue } if strings.Contains(p.Filename, "dirty") { log.Printf("dirty .deb build %-130.130s\n", fullname) counter += 1 continue } if p.Ctime == nil { log.Printf("ctime is nil %-130.130s\n", fullname) stat, err := os.Stat(fullname) if err != nil { log.Printf("stat error %-130.130s %v\n", fullname, err) continue } p.Ctime = timestamppb.New(stat.ModTime()) counter += 1 continue } } log.Info("there were", counter, "errors") if counter != 0 { me.pb.Save() } return "verified ok", nil }