diff --git a/config/bpm.conf b/config/bpm.conf index 8c64765..9d46e46 100644 --- a/config/bpm.conf +++ b/config/bpm.conf @@ -1,4 +1,5 @@ ignore_packages: [] +show_source_package_contents: always cleanup_make_dependencies: true databases: - name: example-database diff --git a/src/bpm/main.go b/src/bpm/main.go index f4e8286..33fbb40 100644 --- a/src/bpm/main.go +++ b/src/bpm/main.go @@ -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 err = operation.Execute(verbose, force) 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 err = operation.Execute(verbose, force) if err != nil { diff --git a/src/bpmlib/compilation.go b/src/bpmlib/compilation.go index 3f49168..0f9be64 100644 --- a/src/bpmlib/compilation.go +++ b/src/bpmlib/compilation.go @@ -515,3 +515,75 @@ func downloadPackageFiles(pkgInfo *PackageInfo, tempDirectory string) error { 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 +} diff --git a/src/bpmlib/config.go b/src/bpmlib/config.go index 48bacf7..33afda8 100644 --- a/src/bpmlib/config.go +++ b/src/bpmlib/config.go @@ -7,9 +7,10 @@ import ( ) type MainBPMConfigStruct struct { - IgnorePackages []string `yaml:"ignore_packages"` - CleanupMakeDependencies bool `yaml:"cleanup_make_dependencies"` - Databases []configDatabase `yaml:"databases"` + IgnorePackages []string `yaml:"ignore_packages"` + ShowSourcePackageContents string `yaml:"show_source_package_contents"` + CleanupMakeDependencies bool `yaml:"cleanup_make_dependencies"` + Databases []configDatabase `yaml:"databases"` } type configDatabase struct { @@ -31,7 +32,8 @@ func ReadConfig() (err error) { // Set default config options MainBPMConfig = MainBPMConfigStruct{ - CleanupMakeDependencies: true, + ShowSourcePackageContents: "always", + CleanupMakeDependencies: true, } // Read main BPM config diff --git a/src/bpmlib/operations.go b/src/bpmlib/operations.go index d090f54..aeb6be5 100644 --- a/src/bpmlib/operations.go +++ b/src/bpmlib/operations.go @@ -15,7 +15,9 @@ type BPMOperation struct { UnresolvedDepends []string Changes map[string]string RootDir string - compiledPackages map[string]string + + compiledPackages map[string]string + hasFetchedPackages 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 { // Return if hooks directory does not exist 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 } -func (operation *BPMOperation) Execute(verbose, force bool) (err error) { +func (operation *BPMOperation) FetchPackages() (err error) { // Fetch packages from databases if slices.ContainsFunc(operation.Actions, func(action OperationAction) bool { 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 words := make([]string, 0) if slices.ContainsFunc(operation.Actions, func(action OperationAction) bool {