package main import ( "crypto/md5" "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 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 } if !info.IsDir() && strings.HasSuffix(info.Name(), ".deb") { counter += 1 found := me.pb.FindByFilename(path) if found == nil { log.Printf("new file %s\n", path) newcount += 1 return nil } if strings.HasPrefix(path, "pool/main/incoming") { letteredDir := log.Sprintf("%1.1s", found.Package) _, filename := filepath.Split(path) newfilename := filepath.Join("pool/main", letteredDir, found.Package, filename) destDir := filepath.Dir(newfilename) if err := os.MkdirAll(destDir, 0755); err != nil { log.Printf("%s move incoming oldname %s newname: %s\n", found.Package, path, newfilename) log.Fatal("Failed to create destination directory: %v", err) } if !argv.Force { if config.Exists(newfilename) { olddata, _ := os.ReadFile(path) newdata, _ := os.ReadFile(newfilename) oldmd5 := md5.Sum(olddata) newmd5 := md5.Sum(newdata) if oldmd5 == newmd5 { log.Printf("files are the same %x %x\n", md5.Sum(olddata), md5.Sum(newdata)) } else { shell.RunVerbose([]string{"dpkg", "-I", path}) shell.RunVerbose([]string{"dpkg", "-I", newfilename}) log.Printf("different checksums: %s %s\n", path, newfilename) log.Printf("md5sum old %x vs new %x\n", md5.Sum(olddata), md5.Sum(newdata)) } // return "file already exists. use --force to replace", errors.New("duplicate .deb in incoming/") me.sh.GoodExit("file already exists. use --force to replace") } } os.Rename(path, newfilename) log.Printf("%s moved incoming oldname %s newname: %s\n", found.Package, path, newfilename) incount += 1 if incount > 100 { me.sh.GoodExit("file moved") } return nil } if argv.Verbose { log.Info("already processed", path) } // Get control info // cmd := exec.Command("dpkg-deb", "-I", path) // var out bytes.Buffer // cmd.Stdout = &out // if err := cmd.Run(); err != nil { // return fmt.Errorf("failed to run dpkg-deb on %s: %v", path, err) // } } 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 }