package main import ( "crypto/md5" "errors" "os" "path/filepath" "strings" "go.wit.com/lib/config" "go.wit.com/lib/gui/shell" "go.wit.com/lib/protobuf/zoopb" "go.wit.com/log" ) func moveOutOfIncoming(fullname string) error { if strings.HasPrefix(fullname, "pool/main/incoming") { log.Info("file is in incoming", fullname) } else { log.Info("file isn't in incoming", fullname) return nil } _, filename := filepath.Split(fullname) parts := strings.Split(filename, "_") if len(parts) != 3 { // todo: add more filename checking here (check for ".deb") return errors.New(log.Sprintf("bad filenae %s", filename)) } packageName := parts[0] letteredDir := log.Sprintf("%1.1s", filename) newfilename := filepath.Join("pool/main", letteredDir, packageName, filename) if newfilename == fullname { // the filename is correct return errors.New(log.Sprintf("should be impossible %s", filename)) } destDir := filepath.Dir(newfilename) if err := os.MkdirAll(destDir, 0755); err != nil { log.Printf("%s move incoming oldname %s newname: %s\n", packageName, fullname, newfilename) log.Fatal("Failed to create destination directory: %v", err) } if config.Exists(newfilename) { olddata, _ := os.ReadFile(fullname) newdata, _ := os.ReadFile(newfilename) oldmd5 := md5.Sum(olddata) newmd5 := md5.Sum(newdata) if oldmd5 == newmd5 { log.Info("OLD FILE", fullname) log.Info("NEW FILE", newfilename) log.Printf("files are the same %x %x\n", md5.Sum(olddata), md5.Sum(newdata)) } else { shell.RunVerbose([]string{"dpkg", "-I", fullname}) shell.RunVerbose([]string{"dpkg", "-I", newfilename}) log.Printf("different checksums: %s %s\n", fullname, newfilename) log.Printf("md5sum old %x vs new %x\n", md5.Sum(olddata), md5.Sum(newdata)) } if argv.Force { moveFileToBroken(newfilename) // os.Rename(path, newfilename) // log.Printf("%s moved incoming oldname %s newname: %s\n", packageName, path, newfilename) } // return "file already exists. use --force to replace", errors.New("duplicate .deb in incoming/") me.argv.GoodExit("file already exists. TODO: fix this to use --force to replace") } // file can be moved os.Rename(fullname, newfilename) log.Printf("%s moved incoming oldname %s newname: %s\n", packageName, fullname, newfilename) return nil } func doIncoming(pb *zoopb.Packages) (string, error) { os.Chdir(me.pb.BaseDir) var counter int var incount int var newcount int err := filepath.Walk("pool", func(path string, info os.FileInfo, err error) error { if err != nil { return err } counter += 1 if !info.IsDir() && strings.HasSuffix(info.Name(), ".deb") { if found := me.pb.FindByFilename(path); found != nil { // log.Printf("not new file %s\n", path) if strings.HasPrefix(path, "pool/main/incoming") { incount += 1 log.Info("file is in incomging", path) err := moveOutOfIncoming(path) if err != nil { log.Info("moveOut err:", err) } } } return nil } newcount += 1 return nil }) s := log.Sprintf("scanned %d files. (%d) in incoming. (%d) new files pb.Len(%d)", counter, incount, newcount, pb.Len()) return s, err }