Allow direct split source package installation through repository entries
This commit is contained in:
parent
d8a42c780d
commit
2e416b9e6f
@ -83,10 +83,6 @@ func InstallPackages(rootDir string, installationReason InstallationReason, rein
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if entry.Info.IsSplitPackage() {
|
|
||||||
return nil, fmt.Errorf("direct split source package installation has not been implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
operation.AppendAction(&FetchPackageAction{
|
operation.AppendAction(&FetchPackageAction{
|
||||||
IsDependency: false,
|
IsDependency: false,
|
||||||
RepositoryEntry: entry,
|
RepositoryEntry: entry,
|
||||||
|
@ -413,30 +413,68 @@ func (operation *BPMOperation) RunHooks(verbose bool) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (operation *BPMOperation) Execute(verbose, force bool) error {
|
func (operation *BPMOperation) Execute(verbose, force bool) (err error) {
|
||||||
// Fetch packages from repositories
|
// Fetch packages from repositories
|
||||||
if slices.ContainsFunc(operation.Actions, func(action OperationAction) bool {
|
if slices.ContainsFunc(operation.Actions, func(action OperationAction) bool {
|
||||||
return action.GetActionType() == "fetch"
|
return action.GetActionType() == "fetch"
|
||||||
}) {
|
}) {
|
||||||
fmt.Println("Fetching packages from available repositories...")
|
fmt.Println("Fetching packages from available repositories...")
|
||||||
|
|
||||||
|
// Create map for fetched packages
|
||||||
|
fetchedPackages := make(map[string]string)
|
||||||
|
|
||||||
for i, action := range operation.Actions {
|
for i, action := range operation.Actions {
|
||||||
if action.GetActionType() != "fetch" {
|
if action.GetActionType() != "fetch" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get repository entry
|
||||||
entry := action.(*FetchPackageAction).RepositoryEntry
|
entry := action.(*FetchPackageAction).RepositoryEntry
|
||||||
|
|
||||||
|
// Create bpmpkg variable
|
||||||
|
var bpmpkg *BPMPackage
|
||||||
|
|
||||||
|
// Check if package has already been fetched from download link
|
||||||
|
if _, ok := fetchedPackages[entry.Download]; !ok {
|
||||||
|
// Fetch package from repository
|
||||||
fetchedPackage, err := entry.Repository.FetchPackage(entry.Info.Name)
|
fetchedPackage, err := entry.Repository.FetchPackage(entry.Info.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.New(fmt.Sprintf("could not fetch package (%s): %s\n", entry.Info.Name, err))
|
return errors.New(fmt.Sprintf("could not fetch package (%s): %s\n", entry.Info.Name, err))
|
||||||
}
|
}
|
||||||
bpmpkg, err := ReadPackage(fetchedPackage)
|
|
||||||
|
// Read fetched package
|
||||||
|
bpmpkg, err = ReadPackage(fetchedPackage)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.New(fmt.Sprintf("could not fetch package (%s): %s\n", entry.Info.Name, err))
|
return errors.New(fmt.Sprintf("could not fetch package (%s): %s\n", entry.Info.Name, err))
|
||||||
}
|
}
|
||||||
fmt.Printf("Package (%s) was successfully fetched!\n", bpmpkg.PkgInfo.Name)
|
|
||||||
|
// Add fetched package to map
|
||||||
|
fetchedPackages[entry.Download] = fetchedPackage
|
||||||
|
|
||||||
|
fmt.Printf("Package (%s) was successfully fetched!\n", entry.Info.Name)
|
||||||
|
} else {
|
||||||
|
// Read fetched package
|
||||||
|
bpmpkg, err = ReadPackage(fetchedPackages[entry.Download])
|
||||||
|
if err != nil {
|
||||||
|
return errors.New(fmt.Sprintf("could not read package (%s): %s\n", entry.Info.Name, err))
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("Package (%s) was successfully fetched!\n", entry.Info.Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
if bpmpkg.PkgInfo.IsSplitPackage() {
|
||||||
operation.Actions[i] = &InstallPackageAction{
|
operation.Actions[i] = &InstallPackageAction{
|
||||||
File: fetchedPackage,
|
File: fetchedPackages[entry.Download],
|
||||||
IsDependency: action.(*FetchPackageAction).IsDependency,
|
IsDependency: action.(*FetchPackageAction).IsDependency,
|
||||||
BpmPackage: bpmpkg,
|
BpmPackage: bpmpkg,
|
||||||
|
SplitPackageToInstall: entry.Info.Name,
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
operation.Actions[i] = &InstallPackageAction{
|
||||||
|
File: fetchedPackages[entry.Download],
|
||||||
|
IsDependency: action.(*FetchPackageAction).IsDependency,
|
||||||
|
BpmPackage: bpmpkg,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -73,10 +73,56 @@ func (repo *Repository) ReadLocalDatabase() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create repository entries
|
||||||
|
if entry.Info.IsSplitPackage() {
|
||||||
|
for _, splitPkg := range entry.Info.SplitPackages {
|
||||||
|
// Turn split package into json data
|
||||||
|
splitPkgJson, err := yaml.Marshal(splitPkg)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clone all main package fields onto split package
|
||||||
|
splitPkgClone := *entry.Info
|
||||||
|
|
||||||
|
// Set split package field of split package to nil
|
||||||
|
splitPkgClone.SplitPackages = nil
|
||||||
|
|
||||||
|
// Unmarshal json data back to struct
|
||||||
|
err = yaml.Unmarshal(splitPkgJson, &splitPkgClone)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Force set split package version, revision and URL
|
||||||
|
splitPkgClone.Version = entry.Info.Version
|
||||||
|
splitPkgClone.Revision = entry.Info.Revision
|
||||||
|
splitPkgClone.Url = entry.Info.Url
|
||||||
|
|
||||||
|
// Create entry for split package
|
||||||
|
repo.Entries[splitPkg.Name] = &RepositoryEntry{
|
||||||
|
Info: &splitPkgClone,
|
||||||
|
Download: entry.Download,
|
||||||
|
DownloadSize: entry.DownloadSize,
|
||||||
|
InstalledSize: 0,
|
||||||
|
Repository: repo,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add virtual packages to repository
|
||||||
|
for _, p := range splitPkg.Provides {
|
||||||
|
repo.VirtualPackages[p] = append(repo.VirtualPackages[p], splitPkg.Name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Create entry for package
|
||||||
|
repo.Entries[entry.Info.Name] = &entry
|
||||||
|
|
||||||
|
// Add virtual packages to repository
|
||||||
for _, p := range entry.Info.Provides {
|
for _, p := range entry.Info.Provides {
|
||||||
repo.VirtualPackages[p] = append(repo.VirtualPackages[p], entry.Info.Name)
|
repo.VirtualPackages[p] = append(repo.VirtualPackages[p], entry.Info.Name)
|
||||||
}
|
}
|
||||||
repo.Entries[entry.Info.Name] = &entry
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
Loading…
x
Reference in New Issue
Block a user