Show source package contents during package installation

This commit is contained in:
2025-10-06 13:33:18 +03:00
parent a7c03c272e
commit 5a78fd3002
5 changed files with 186 additions and 6 deletions
+1
View File
@@ -1,4 +1,5 @@
ignore_packages: [] ignore_packages: []
show_source_package_contents: always
cleanup_make_dependencies: true cleanup_make_dependencies: true
databases: databases:
- name: example-database - name: example-database
+62
View File
@@ -446,6 +446,37 @@ func installPackages() {
} }
} }
// Fetch packages
err = operation.FetchPackages()
if err != nil {
log.Printf("Error: could not fetch packages for operation: %s\n", err)
exitCode = 1
return
}
if bpmlib.MainBPMConfig.ShowSourcePackageContents == "always" || bpmlib.MainBPMConfig.ShowSourcePackageContents == "install-only" {
// Show source package contents
sourcePackagesShown, err := operation.ShowSourcePackageContent()
if err != nil {
log.Printf("Error: could not show source package content: %s\n", err)
exitCode = 1
return
}
// Confirmation Prompt
if sourcePackagesShown > 0 && !yesAll {
reader := bufio.NewReader(os.Stdin)
fmt.Printf("Are you sure you wish to continue? [y\\N] ")
text, _ := reader.ReadString('\n')
if strings.TrimSpace(strings.ToLower(text)) != "y" && strings.TrimSpace(strings.ToLower(text)) != "yes" {
fmt.Println("Cancelling package installation...")
exitCode = 1
return
}
}
}
// Execute operation // Execute operation
err = operation.Execute(verbose, force) err = operation.Execute(verbose, force)
if err != nil { if err != nil {
@@ -771,6 +802,37 @@ func updatePackages() {
} }
} }
// Fetch packages
err = operation.FetchPackages()
if err != nil {
log.Printf("Error: could not fetch packages for operation: %s\n", err)
exitCode = 1
return
}
if bpmlib.MainBPMConfig.ShowSourcePackageContents == "always" {
// Show source package contents
sourcePackagesShown, err := operation.ShowSourcePackageContent()
if err != nil {
log.Printf("Error: could not show source package content: %s\n", err)
exitCode = 1
return
}
// Confirmation Prompt
if sourcePackagesShown > 0 && !yesAll {
reader := bufio.NewReader(os.Stdin)
fmt.Printf("Are you sure you wish to continue? [y\\N] ")
text, _ := reader.ReadString('\n')
if strings.TrimSpace(strings.ToLower(text)) != "y" && strings.TrimSpace(strings.ToLower(text)) != "yes" {
fmt.Println("Cancelling package installation...")
exitCode = 1
return
}
}
}
// Execute operation // Execute operation
err = operation.Execute(verbose, force) err = operation.Execute(verbose, force)
if err != nil { if err != nil {
+72
View File
@@ -515,3 +515,75 @@ func downloadPackageFiles(pkgInfo *PackageInfo, tempDirectory string) error {
return nil return nil
} }
func showPackageFiles(archiveFilename string) error {
// Read BPM archive
bpmpkg, err := ReadPackage(archiveFilename)
if err != nil {
return err
}
// Ensure package type is 'source'
if bpmpkg.PkgInfo.Type != "source" {
return fmt.Errorf("cannot compile a non-source package")
}
printTarballContent := func(filename string) error {
// Get tarball reader for file
reader, err := readTarballFile(archiveFilename, filename)
if err != nil {
return err
}
// Read file content
data, err := io.ReadAll(reader.tarReader)
if err != nil {
return err
}
// Print file name and content
fmt.Println("==============================")
fmt.Printf("%s: %s\n", bpmpkg.PkgInfo.Name, filename)
fmt.Println("==============================")
fmt.Printf("%s\n", data)
// Close reader
err = reader.file.Close()
if err != nil {
return err
}
return nil
}
// Print pkg.info content
err = printTarballContent("pkg.info")
if err != nil {
return err
}
// Print source files contents
files, err := listTarballContent(archiveFilename)
if err != nil {
return err
}
for _, file := range files {
if !strings.HasPrefix(file, "source-files/") {
continue
}
// Print source file content
err = printTarballContent(file)
if err != nil {
return err
}
}
// Print source.sh content
err = printTarballContent("source.sh")
if err != nil {
return err
}
return nil
}
+2
View File
@@ -8,6 +8,7 @@ import (
type MainBPMConfigStruct struct { type MainBPMConfigStruct struct {
IgnorePackages []string `yaml:"ignore_packages"` IgnorePackages []string `yaml:"ignore_packages"`
ShowSourcePackageContents string `yaml:"show_source_package_contents"`
CleanupMakeDependencies bool `yaml:"cleanup_make_dependencies"` CleanupMakeDependencies bool `yaml:"cleanup_make_dependencies"`
Databases []configDatabase `yaml:"databases"` Databases []configDatabase `yaml:"databases"`
} }
@@ -31,6 +32,7 @@ func ReadConfig() (err error) {
// Set default config options // Set default config options
MainBPMConfig = MainBPMConfigStruct{ MainBPMConfig = MainBPMConfigStruct{
ShowSourcePackageContents: "always",
CleanupMakeDependencies: true, CleanupMakeDependencies: true,
} }
+44 -1
View File
@@ -15,7 +15,9 @@ type BPMOperation struct {
UnresolvedDepends []string UnresolvedDepends []string
Changes map[string]string Changes map[string]string
RootDir string RootDir string
compiledPackages map[string]string compiledPackages map[string]string
hasFetchedPackages bool
} }
func (operation *BPMOperation) ActionsContainPackage(pkg string) bool { func (operation *BPMOperation) ActionsContainPackage(pkg string) bool {
@@ -395,6 +397,34 @@ func (operation *BPMOperation) ShowOperationSummary() {
} }
} }
func (operation *BPMOperation) ShowSourcePackageContent() (sourcePackagesShown int, err error) {
// Fetch packages
if !operation.hasFetchedPackages {
err = operation.FetchPackages()
if err != nil {
return 0, err
}
}
for _, action := range operation.Actions {
if action.GetActionType() != "install" {
continue
}
if action.(*InstallPackageAction).BpmPackage.PkgInfo.Type != "source" {
continue
}
err = showPackageFiles(action.(*InstallPackageAction).File)
if err != nil {
return 0, err
}
sourcePackagesShown++
}
return sourcePackagesShown, nil
}
func (operation *BPMOperation) RunHooks(verbose bool) error { func (operation *BPMOperation) RunHooks(verbose bool) error {
// Return if hooks directory does not exist // Return if hooks directory does not exist
if stat, err := os.Stat(path.Join(operation.RootDir, "var/lib/bpm/hooks")); err != nil || !stat.IsDir() { if stat, err := os.Stat(path.Join(operation.RootDir, "var/lib/bpm/hooks")); err != nil || !stat.IsDir() {
@@ -426,7 +456,7 @@ func (operation *BPMOperation) RunHooks(verbose bool) error {
return nil return nil
} }
func (operation *BPMOperation) Execute(verbose, force bool) (err error) { func (operation *BPMOperation) FetchPackages() (err error) {
// Fetch packages from databases // Fetch packages from databases
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"
@@ -492,6 +522,19 @@ func (operation *BPMOperation) Execute(verbose, force bool) (err error) {
} }
} }
operation.hasFetchedPackages = true
return nil
}
func (operation *BPMOperation) Execute(verbose, force bool) (err error) {
// Fetch packages
if !operation.hasFetchedPackages {
err = operation.FetchPackages()
if err != nil {
return err
}
}
// Determine words to be used for the following message // Determine words to be used for the following message
words := make([]string, 0) words := make([]string, 0)
if slices.ContainsFunc(operation.Actions, func(action OperationAction) bool { if slices.ContainsFunc(operation.Actions, func(action OperationAction) bool {