Change to yaml only database format

This commit is contained in:
2025-09-04 19:14:30 +03:00
parent bc3fe6fd7e
commit a4d1365e55
4 changed files with 60 additions and 74 deletions
+1 -1
View File
@@ -218,7 +218,7 @@ func resolveCommand() {
for i, term := range searchTerms { for i, term := range searchTerms {
nameResults := make([]*bpmlib.PackageInfo, 0) nameResults := make([]*bpmlib.PackageInfo, 0)
descResults := make([]*bpmlib.PackageInfo, 0) descResults := make([]*bpmlib.PackageInfo, 0)
for _, db := range bpmlib.MainBPMConfig.Databases { for _, db := range bpmlib.BPMDatabases {
for _, entry := range db.Entries { for _, entry := range db.Entries {
if strings.Contains(entry.Info.Name, term) { if strings.Contains(entry.Info.Name, term) {
nameResults = append(nameResults, entry.Info) nameResults = append(nameResults, entry.Info)
+9 -3
View File
@@ -7,9 +7,15 @@ import (
) )
type MainBPMConfigStruct struct { type MainBPMConfigStruct struct {
IgnorePackages []string `yaml:"ignore_packages"` IgnorePackages []string `yaml:"ignore_packages"`
CleanupMakeDependencies bool `yaml:"cleanup_make_dependencies"` CleanupMakeDependencies bool `yaml:"cleanup_make_dependencies"`
Databases []*BPMDatabase `yaml:"databases"` Databases []configDatabase `yaml:"databases"`
}
type configDatabase struct {
Name string `yaml:"name"`
Source string `yaml:"source"`
Disabled *bool `yaml:"disabled"`
} }
type CompilationBPMConfigStruct struct { type CompilationBPMConfigStruct struct {
+45 -65
View File
@@ -14,27 +14,28 @@ import (
) )
type BPMDatabase struct { type BPMDatabase struct {
Name string `yaml:"name"` DatabaseVersion int `yaml:"database_version"`
Source string `yaml:"source"` Entries map[string]*BPMDatabaseEntry `yaml:"entries"`
Disabled *bool `yaml:"disabled"`
Entries map[string]*BPMDatabaseEntry
VirtualPackages map[string][]string VirtualPackages map[string][]string
Source string
} }
type BPMDatabaseEntry struct { type BPMDatabaseEntry struct {
Info *PackageInfo `yaml:"info"` Info *PackageInfo `yaml:"info"`
Download string `yaml:"download"` Filepath string `yaml:"filepath"`
DownloadSize uint64 `yaml:"download_size"` DownloadSize uint64 `yaml:"download_size"`
InstalledSize uint64 `yaml:"installed_size"` InstalledSize uint64 `yaml:"installed_size"`
Database *BPMDatabase Database *BPMDatabase
} }
var BPMDatabases = make(map[string]*BPMDatabase)
func (db *BPMDatabase) ContainsPackage(pkg string) bool { func (db *BPMDatabase) ContainsPackage(pkg string) bool {
_, ok := db.Entries[pkg] _, ok := db.Entries[pkg]
return ok return ok
} }
func (db *BPMDatabase) ReadLocalDatabase() error { func (db *configDatabase) ReadLocalDatabase() error {
dbFile := "/var/lib/bpm/databases/" + db.Name + ".bpmdb" dbFile := "/var/lib/bpm/databases/" + db.Name + ".bpmdb"
if _, err := os.Stat(dbFile); err != nil { if _, err := os.Stat(dbFile); err != nil {
return nil return nil
@@ -45,37 +46,23 @@ func (db *BPMDatabase) ReadLocalDatabase() error {
return err return err
} }
data := string(bytes) // Unmarshal yaml
for _, b := range strings.Split(data, "---") { database := &BPMDatabase{}
entry := BPMDatabaseEntry{ err = yaml.Unmarshal(bytes, database)
Info: &PackageInfo{ if err != nil {
Name: "", return err
Description: "", }
Version: "",
Revision: 1, // Initialize struct values
Url: "", database.VirtualPackages = make(map[string][]string)
License: "", database.Source = db.Source
Arch: "",
Type: "", entriesToRemove := make([]string, 0)
Keep: make([]string, 0), for entryName, entry := range database.Entries {
Depends: make([]string, 0), entry.Database = database
MakeDepends: make([]string, 0),
OptionalDepends: make([]string, 0),
Conflicts: make([]string, 0),
Provides: make([]string, 0),
},
Download: "",
DownloadSize: 0,
InstalledSize: 0,
Database: db,
}
err := yaml.Unmarshal([]byte(b), &entry)
if err != nil {
return err
}
// Create database entries
if entry.Info.IsSplitPackage() { if entry.Info.IsSplitPackage() {
// Handle split packages
for _, splitPkg := range entry.Info.SplitPackages { for _, splitPkg := range entry.Info.SplitPackages {
// Turn split package into json data // Turn split package into json data
splitPkgJson, err := yaml.Marshal(splitPkg) splitPkgJson, err := yaml.Marshal(splitPkg)
@@ -101,35 +88,41 @@ func (db *BPMDatabase) ReadLocalDatabase() error {
splitPkgClone.Url = entry.Info.Url splitPkgClone.Url = entry.Info.Url
// Create entry for split package // Create entry for split package
db.Entries[splitPkg.Name] = &BPMDatabaseEntry{ database.Entries[splitPkg.Name] = &BPMDatabaseEntry{
Info: &splitPkgClone, Info: &splitPkgClone,
Download: entry.Download, Filepath: entry.Filepath,
DownloadSize: entry.DownloadSize, DownloadSize: entry.DownloadSize,
InstalledSize: 0, InstalledSize: 0,
Database: db, Database: database,
} }
// Add virtual packages to database // Add virtual packages to database
for _, p := range splitPkg.Provides { for _, p := range splitPkg.Provides {
db.VirtualPackages[p] = append(db.VirtualPackages[p], splitPkg.Name) database.VirtualPackages[p] = append(database.VirtualPackages[p], splitPkg.Name)
} }
// Add current entry to list for removal
entriesToRemove = append(entriesToRemove, entryName)
} }
} else { } else {
// Create entry for package
db.Entries[entry.Info.Name] = &entry
// Add virtual packages to database // Add virtual packages to database
for _, p := range entry.Info.Provides { for _, p := range entry.Info.Provides {
db.VirtualPackages[p] = append(db.VirtualPackages[p], entry.Info.Name) database.VirtualPackages[p] = append(database.VirtualPackages[p], entry.Info.Name)
} }
} }
} }
// Remove entries
for _, entryName := range entriesToRemove {
delete(database.Entries, entryName)
}
BPMDatabases[db.Name] = database
return nil return nil
} }
func (db *BPMDatabase) SyncLocalDatabaseFile() error { func (db *configDatabase) SyncLocalDatabaseFile() error {
dbFile := "/var/lib/bpm/databases/" + db.Name + ".bpmdb" dbFile := "/var/lib/bpm/databases/" + db.Name + ".bpmdb"
// Get URL to database // Get URL to database
@@ -174,10 +167,6 @@ func (db *BPMDatabase) SyncLocalDatabaseFile() error {
func ReadLocalDatabaseFiles() (err error) { func ReadLocalDatabaseFiles() (err error) {
for _, db := range MainBPMConfig.Databases { for _, db := range MainBPMConfig.Databases {
// Initialize struct values
db.Entries = make(map[string]*BPMDatabaseEntry)
db.VirtualPackages = make(map[string][]string)
// Read database // Read database
err = db.ReadLocalDatabase() err = db.ReadLocalDatabase()
if err != nil { if err != nil {
@@ -188,15 +177,6 @@ func ReadLocalDatabaseFiles() (err error) {
return nil return nil
} }
func GetDatabase(name string) *BPMDatabase {
for _, db := range MainBPMConfig.Databases {
if db.Name == name {
return db
}
}
return nil
}
func GetDatabaseEntry(str string) (*BPMDatabaseEntry, *BPMDatabase, error) { func GetDatabaseEntry(str string) (*BPMDatabaseEntry, *BPMDatabase, error) {
split := strings.Split(str, "/") split := strings.Split(str, "/")
if len(split) == 1 { if len(split) == 1 {
@@ -204,7 +184,7 @@ func GetDatabaseEntry(str string) (*BPMDatabaseEntry, *BPMDatabase, error) {
if pkgName == "" { if pkgName == "" {
return nil, nil, errors.New("could not find database entry for this package") return nil, nil, errors.New("could not find database entry for this package")
} }
for _, db := range MainBPMConfig.Databases { for _, db := range BPMDatabases {
if db.ContainsPackage(pkgName) { if db.ContainsPackage(pkgName) {
return db.Entries[pkgName], db, nil return db.Entries[pkgName], db, nil
} }
@@ -216,7 +196,7 @@ func GetDatabaseEntry(str string) (*BPMDatabaseEntry, *BPMDatabase, error) {
if dbName == "" || pkgName == "" { if dbName == "" || pkgName == "" {
return nil, nil, errors.New("could not find database entry for this package") return nil, nil, errors.New("could not find database entry for this package")
} }
db := GetDatabase(dbName) db := BPMDatabases[dbName]
if db == nil || !db.ContainsPackage(pkgName) { if db == nil || !db.ContainsPackage(pkgName) {
return nil, nil, errors.New("could not find database entry for this package") return nil, nil, errors.New("could not find database entry for this package")
} }
@@ -227,7 +207,7 @@ func GetDatabaseEntry(str string) (*BPMDatabaseEntry, *BPMDatabase, error) {
} }
func FindReplacement(pkg string) *BPMDatabaseEntry { func FindReplacement(pkg string) *BPMDatabaseEntry {
for _, db := range MainBPMConfig.Databases { for _, db := range BPMDatabases {
for _, entry := range db.Entries { for _, entry := range db.Entries {
for _, replaced := range entry.Info.Replaces { for _, replaced := range entry.Info.Replaces {
if replaced == pkg { if replaced == pkg {
@@ -241,7 +221,7 @@ func FindReplacement(pkg string) *BPMDatabaseEntry {
} }
func ResolveVirtualPackage(vpkg string) *BPMDatabaseEntry { func ResolveVirtualPackage(vpkg string) *BPMDatabaseEntry {
for _, db := range MainBPMConfig.Databases { for _, db := range BPMDatabases {
if v, ok := db.VirtualPackages[vpkg]; ok { if v, ok := db.VirtualPackages[vpkg]; ok {
for _, pkg := range v { for _, pkg := range v {
return db.Entries[pkg] return db.Entries[pkg]
@@ -257,7 +237,7 @@ func (db *BPMDatabase) FetchPackage(pkg string) (string, error) {
return "", errors.New("could not fetch package '" + pkg + "'") return "", errors.New("could not fetch package '" + pkg + "'")
} }
entry := db.Entries[pkg] entry := db.Entries[pkg]
URL, err := url.JoinPath(db.Source, entry.Download) URL, err := url.JoinPath(db.Source, entry.Filepath)
if err != nil { if err != nil {
return "", err return "", err
} }
@@ -271,12 +251,12 @@ func (db *BPMDatabase) FetchPackage(pkg string) (string, error) {
if err != nil { if err != nil {
return "", err return "", err
} }
out, err := os.Create("/var/cache/bpm/fetched/" + path.Base(entry.Download)) out, err := os.Create("/var/cache/bpm/fetched/" + path.Base(entry.Filepath))
if err != nil { if err != nil {
return "", err return "", err
} }
defer out.Close() defer out.Close()
_, err = io.Copy(out, resp.Body) _, err = io.Copy(out, resp.Body)
return "/var/cache/bpm/fetched/" + path.Base(entry.Download), nil return "/var/cache/bpm/fetched/" + path.Base(entry.Filepath), nil
} }
+5 -5
View File
@@ -448,7 +448,7 @@ func (operation *BPMOperation) Execute(verbose, force bool) (err error) {
var bpmpkg *BPMPackage var bpmpkg *BPMPackage
// Check if package has already been fetched from download link // Check if package has already been fetched from download link
if _, ok := fetchedPackages[entry.Download]; !ok { if _, ok := fetchedPackages[entry.Filepath]; !ok {
// Fetch package from database // Fetch package from database
fetchedPackage, err := entry.Database.FetchPackage(entry.Info.Name) fetchedPackage, err := entry.Database.FetchPackage(entry.Info.Name)
if err != nil { if err != nil {
@@ -462,12 +462,12 @@ func (operation *BPMOperation) Execute(verbose, force bool) (err error) {
} }
// Add fetched package to map // Add fetched package to map
fetchedPackages[entry.Download] = fetchedPackage fetchedPackages[entry.Filepath] = fetchedPackage
fmt.Printf("Package (%s) was successfully fetched!\n", entry.Info.Name) fmt.Printf("Package (%s) was successfully fetched!\n", entry.Info.Name)
} else { } else {
// Read fetched package // Read fetched package
bpmpkg, err = ReadPackage(fetchedPackages[entry.Download]) bpmpkg, err = ReadPackage(fetchedPackages[entry.Filepath])
if err != nil { if err != nil {
return fmt.Errorf("could not read package (%s): %s\n", entry.Info.Name, err) return fmt.Errorf("could not read package (%s): %s\n", entry.Info.Name, err)
} }
@@ -477,14 +477,14 @@ func (operation *BPMOperation) Execute(verbose, force bool) (err error) {
if bpmpkg.PkgInfo.IsSplitPackage() { if bpmpkg.PkgInfo.IsSplitPackage() {
operation.Actions[i] = &InstallPackageAction{ operation.Actions[i] = &InstallPackageAction{
File: fetchedPackages[entry.Download], File: fetchedPackages[entry.Filepath],
InstallationReason: action.(*FetchPackageAction).InstallationReason, InstallationReason: action.(*FetchPackageAction).InstallationReason,
BpmPackage: bpmpkg, BpmPackage: bpmpkg,
SplitPackageToInstall: entry.Info.Name, SplitPackageToInstall: entry.Info.Name,
} }
} else { } else {
operation.Actions[i] = &InstallPackageAction{ operation.Actions[i] = &InstallPackageAction{
File: fetchedPackages[entry.Download], File: fetchedPackages[entry.Filepath],
InstallationReason: action.(*FetchPackageAction).InstallationReason, InstallationReason: action.(*FetchPackageAction).InstallationReason,
BpmPackage: bpmpkg, BpmPackage: bpmpkg,
} }