diff --git a/src/bpm/main.go b/src/bpm/main.go index 474645d..eae31e6 100644 --- a/src/bpm/main.go +++ b/src/bpm/main.go @@ -218,7 +218,7 @@ func resolveCommand() { for i, term := range searchTerms { nameResults := 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 { if strings.Contains(entry.Info.Name, term) { nameResults = append(nameResults, entry.Info) diff --git a/src/bpmlib/config.go b/src/bpmlib/config.go index 34a4762..48bacf7 100644 --- a/src/bpmlib/config.go +++ b/src/bpmlib/config.go @@ -7,9 +7,15 @@ import ( ) type MainBPMConfigStruct struct { - IgnorePackages []string `yaml:"ignore_packages"` - CleanupMakeDependencies bool `yaml:"cleanup_make_dependencies"` - Databases []*BPMDatabase `yaml:"databases"` + IgnorePackages []string `yaml:"ignore_packages"` + CleanupMakeDependencies bool `yaml:"cleanup_make_dependencies"` + Databases []configDatabase `yaml:"databases"` +} + +type configDatabase struct { + Name string `yaml:"name"` + Source string `yaml:"source"` + Disabled *bool `yaml:"disabled"` } type CompilationBPMConfigStruct struct { diff --git a/src/bpmlib/databases.go b/src/bpmlib/databases.go index 4d574c6..7331e7d 100644 --- a/src/bpmlib/databases.go +++ b/src/bpmlib/databases.go @@ -14,27 +14,28 @@ import ( ) type BPMDatabase struct { - Name string `yaml:"name"` - Source string `yaml:"source"` - Disabled *bool `yaml:"disabled"` - Entries map[string]*BPMDatabaseEntry + DatabaseVersion int `yaml:"database_version"` + Entries map[string]*BPMDatabaseEntry `yaml:"entries"` VirtualPackages map[string][]string + Source string } type BPMDatabaseEntry struct { Info *PackageInfo `yaml:"info"` - Download string `yaml:"download"` + Filepath string `yaml:"filepath"` DownloadSize uint64 `yaml:"download_size"` InstalledSize uint64 `yaml:"installed_size"` Database *BPMDatabase } +var BPMDatabases = make(map[string]*BPMDatabase) + func (db *BPMDatabase) ContainsPackage(pkg string) bool { _, ok := db.Entries[pkg] return ok } -func (db *BPMDatabase) ReadLocalDatabase() error { +func (db *configDatabase) ReadLocalDatabase() error { dbFile := "/var/lib/bpm/databases/" + db.Name + ".bpmdb" if _, err := os.Stat(dbFile); err != nil { return nil @@ -45,37 +46,23 @@ func (db *BPMDatabase) ReadLocalDatabase() error { return err } - data := string(bytes) - for _, b := range strings.Split(data, "---") { - entry := BPMDatabaseEntry{ - Info: &PackageInfo{ - Name: "", - Description: "", - Version: "", - Revision: 1, - Url: "", - License: "", - Arch: "", - Type: "", - Keep: make([]string, 0), - Depends: make([]string, 0), - 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 - } + // Unmarshal yaml + database := &BPMDatabase{} + err = yaml.Unmarshal(bytes, database) + if err != nil { + return err + } + + // Initialize struct values + database.VirtualPackages = make(map[string][]string) + database.Source = db.Source + + entriesToRemove := make([]string, 0) + for entryName, entry := range database.Entries { + entry.Database = database - // Create database entries if entry.Info.IsSplitPackage() { + // Handle split packages for _, splitPkg := range entry.Info.SplitPackages { // Turn split package into json data splitPkgJson, err := yaml.Marshal(splitPkg) @@ -101,35 +88,41 @@ func (db *BPMDatabase) ReadLocalDatabase() error { splitPkgClone.Url = entry.Info.Url // Create entry for split package - db.Entries[splitPkg.Name] = &BPMDatabaseEntry{ + database.Entries[splitPkg.Name] = &BPMDatabaseEntry{ Info: &splitPkgClone, - Download: entry.Download, + Filepath: entry.Filepath, DownloadSize: entry.DownloadSize, InstalledSize: 0, - Database: db, + Database: database, } // Add virtual packages to database 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 { - // Create entry for package - db.Entries[entry.Info.Name] = &entry - // Add virtual packages to database 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 } -func (db *BPMDatabase) SyncLocalDatabaseFile() error { +func (db *configDatabase) SyncLocalDatabaseFile() error { dbFile := "/var/lib/bpm/databases/" + db.Name + ".bpmdb" // Get URL to database @@ -174,10 +167,6 @@ func (db *BPMDatabase) SyncLocalDatabaseFile() error { func ReadLocalDatabaseFiles() (err error) { for _, db := range MainBPMConfig.Databases { - // Initialize struct values - db.Entries = make(map[string]*BPMDatabaseEntry) - db.VirtualPackages = make(map[string][]string) - // Read database err = db.ReadLocalDatabase() if err != nil { @@ -188,15 +177,6 @@ func ReadLocalDatabaseFiles() (err error) { 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) { split := strings.Split(str, "/") if len(split) == 1 { @@ -204,7 +184,7 @@ func GetDatabaseEntry(str string) (*BPMDatabaseEntry, *BPMDatabase, error) { if pkgName == "" { 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) { return db.Entries[pkgName], db, nil } @@ -216,7 +196,7 @@ func GetDatabaseEntry(str string) (*BPMDatabaseEntry, *BPMDatabase, error) { if dbName == "" || pkgName == "" { 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) { 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 { - for _, db := range MainBPMConfig.Databases { + for _, db := range BPMDatabases { for _, entry := range db.Entries { for _, replaced := range entry.Info.Replaces { if replaced == pkg { @@ -241,7 +221,7 @@ func FindReplacement(pkg string) *BPMDatabaseEntry { } func ResolveVirtualPackage(vpkg string) *BPMDatabaseEntry { - for _, db := range MainBPMConfig.Databases { + for _, db := range BPMDatabases { if v, ok := db.VirtualPackages[vpkg]; ok { for _, pkg := range v { return db.Entries[pkg] @@ -257,7 +237,7 @@ func (db *BPMDatabase) FetchPackage(pkg string) (string, error) { return "", errors.New("could not fetch package '" + pkg + "'") } entry := db.Entries[pkg] - URL, err := url.JoinPath(db.Source, entry.Download) + URL, err := url.JoinPath(db.Source, entry.Filepath) if err != nil { return "", err } @@ -271,12 +251,12 @@ func (db *BPMDatabase) FetchPackage(pkg string) (string, error) { if err != nil { 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 { return "", err } defer out.Close() _, 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 } diff --git a/src/bpmlib/operations.go b/src/bpmlib/operations.go index 2e0b4a7..d090f54 100644 --- a/src/bpmlib/operations.go +++ b/src/bpmlib/operations.go @@ -448,7 +448,7 @@ func (operation *BPMOperation) Execute(verbose, force bool) (err error) { var bpmpkg *BPMPackage // 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 fetchedPackage, err := entry.Database.FetchPackage(entry.Info.Name) if err != nil { @@ -462,12 +462,12 @@ func (operation *BPMOperation) Execute(verbose, force bool) (err error) { } // Add fetched package to map - fetchedPackages[entry.Download] = fetchedPackage + fetchedPackages[entry.Filepath] = fetchedPackage fmt.Printf("Package (%s) was successfully fetched!\n", entry.Info.Name) } else { // Read fetched package - bpmpkg, err = ReadPackage(fetchedPackages[entry.Download]) + bpmpkg, err = ReadPackage(fetchedPackages[entry.Filepath]) if err != nil { 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() { operation.Actions[i] = &InstallPackageAction{ - File: fetchedPackages[entry.Download], + File: fetchedPackages[entry.Filepath], InstallationReason: action.(*FetchPackageAction).InstallationReason, BpmPackage: bpmpkg, SplitPackageToInstall: entry.Info.Name, } } else { operation.Actions[i] = &InstallPackageAction{ - File: fetchedPackages[entry.Download], + File: fetchedPackages[entry.Filepath], InstallationReason: action.(*FetchPackageAction).InstallationReason, BpmPackage: bpmpkg, }