diff --git a/src/bpm-repo/main.go b/src/bpm-repo/main.go index 4b2861d..5669727 100644 --- a/src/bpm-repo/main.go +++ b/src/bpm-repo/main.go @@ -5,8 +5,11 @@ import ( "bufio" "fmt" "log" + "maps" "os" "path" + "slices" + "sort" "strings" flag "github.com/spf13/pflag" @@ -14,6 +17,7 @@ import ( var createRepo = flag.BoolP("create", "c", false, "Create a new BPM repository") var updateDatabases = flag.BoolP("update-databases", "u", false, "Update update source and binary databases in current repository") +var listPackages = flag.BoolP("list", "l", false, "List packages") func main() { // Setup flags and help @@ -48,6 +52,14 @@ func main() { } bpmutilsshared.UpdateDatabases(repo) + } else if *listPackages { + // Get current database + repo := bpmutilsshared.GetRepository() + if repo == "" { + log.Fatal("Error: this command may only be run inside a BPM repository") + } + + listPacakges(repo) } else { bpmutilsshared.ShowHelp() } @@ -67,3 +79,46 @@ func createRepository(name, description string) { fmt.Println("Repository created successfully!") } + +func listPacakges(repo string) { + // Read databases + sourceDatabase, err := bpmutilsshared.ReadDatabase(path.Join(repo, "source/database.bpmdb")) + if err != nil { + return + } + + binaryDatabase, err := bpmutilsshared.ReadDatabase(path.Join(repo, "binary/database.bpmdb")) + if err != nil { + binaryDatabase = &bpmutilsshared.BPMDatabase{} + } + + // Sort database entries + entriesSorted := slices.Collect(maps.Values(sourceDatabase.Entries)) + sort.Slice(entriesSorted, func(i, j int) bool { + return entriesSorted[i].PackageInfo.Name < entriesSorted[j].PackageInfo.Name + }) + + // Loop through each entry + for _, entry := range entriesSorted { + if len(entry.PackageInfo.SplitPackages) > 0 { + for _, splitPkg := range entry.PackageInfo.SplitPackages { + // Handle split packages + additionalText := "" + if binaryEntry, ok := binaryDatabase.Entries[splitPkg.Name]; !ok { + additionalText += "(Binary package missing) " + } else if fmt.Sprintf("%s-%d", binaryEntry.PackageInfo.Version, binaryEntry.PackageInfo.Revision) != fmt.Sprintf("%s-%d", entry.PackageInfo.Version, entry.PackageInfo.Revision) { + additionalText += "(Binary package version mismatch) " + } + fmt.Printf("%s %s-%d %s\n", splitPkg.Name, entry.PackageInfo.Version, entry.PackageInfo.Revision, additionalText) + } + } else { + additionalText := "" + if binaryEntry, ok := binaryDatabase.Entries[entry.PackageInfo.Name]; !ok { + additionalText += "(Binary package missing) " + } else if fmt.Sprintf("%s-%d", binaryEntry.PackageInfo.Version, binaryEntry.PackageInfo.Revision) != fmt.Sprintf("%s-%d", entry.PackageInfo.Version, entry.PackageInfo.Revision) { + additionalText += "(Binary package version mismatch) " + } + fmt.Printf("%s %s-%d %s\n", entry.PackageInfo.Name, entry.PackageInfo.Version, entry.PackageInfo.Revision, additionalText) + } + } +}