2 Commits
Author SHA1 Message Date
EnumDev 472d21a618 - Switched to using the flag system from the flag go package
- Added the -R flag which lets you choose a destination root directory
2024-04-13 09:23:03 +03:00
EnumDev a9283037d8 - Added a -b flag to the install subcommand that turns a source package into a binary one after compilation
- Reformatted the help subcommand
- Updated bpm-utils to add the ability to create source packages
- Source temporary directories will now be removed after installation unless the user passes the -k flag
- BPM will now not remove the old version of a package before installing an update which could cause libraries or programs required for installation to be missing. Obsolete files will now be removed after installation
- The version, list, info and help subcommands can now be run by any user without root permissions. Root permissions are still required for package installation and removal
- Removed installed package info fixing for now. It will be replaced by a better system in the future
2024-03-30 22:22:31 +02:00
9 changed files with 295 additions and 78 deletions
+72 -3
View File
@@ -130,10 +130,16 @@ func ReadPackageInfo(contents string, defaultValues bool) (*PackageInfo, error)
split[1] = strings.Trim(split[1], " ") split[1] = strings.Trim(split[1], " ")
switch split[0] { switch split[0] {
case "name": case "name":
if strings.Contains(split[1], " ") {
return nil, errors.New("the " + split[0] + " field cannot contain spaces")
}
pkgInfo.Name = split[1] pkgInfo.Name = split[1]
case "description": case "description":
pkgInfo.Description = split[1] pkgInfo.Description = split[1]
case "version": case "version":
if strings.Contains(split[1], " ") {
return nil, errors.New("the " + split[0] + " field cannot contain spaces")
}
pkgInfo.Version = split[1] pkgInfo.Version = split[1]
case "url": case "url":
pkgInfo.Url = split[1] pkgInfo.Url = split[1]
@@ -192,7 +198,7 @@ func CreateInfoFile(pkgInfo PackageInfo) string {
return ret return ret
} }
func InstallPackage(filename, installDir string, force bool) error { func InstallPackage(filename, installDir string, force, binaryPkgFromSrc, keepTempDir bool) error {
if _, err := os.Stat(filename); os.IsNotExist(err) { if _, err := os.Stat(filename); os.IsNotExist(err) {
return err return err
} }
@@ -205,13 +211,17 @@ func InstallPackage(filename, installDir string, force bool) error {
return err return err
} }
tr := tar.NewReader(archive) tr := tar.NewReader(archive)
var oldFiles []string
var files []string var files []string
pkgInfo, err := ReadPackage(filename) pkgInfo, err := ReadPackage(filename)
if err != nil { if err != nil {
return err return err
} }
if IsPackageInstalled(pkgInfo.Name, installDir) {
oldFiles = GetPackageFiles(pkgInfo.Name, installDir)
}
if !force { if !force {
if pkgInfo.Arch != GetArch() { if pkgInfo.Arch != "any" && pkgInfo.Arch != GetArch() {
return errors.New("cannot install a package with a different architecture") return errors.New("cannot install a package with a different architecture")
} }
if unresolved := CheckDependencies(pkgInfo, installDir); len(unresolved) != 0 { if unresolved := CheckDependencies(pkgInfo, installDir); len(unresolved) != 0 {
@@ -307,7 +317,12 @@ func InstallPackage(filename, installDir string, force bool) error {
if err != nil { if err != nil {
return err return err
} }
temp, err := os.MkdirTemp("/var/tmp/", "bpm_source-") temp := "/var/tmp/bpm_source-" + pkgInfo.Name
err = os.RemoveAll(temp)
if err != nil {
return err
}
err = os.Mkdir(temp, 0755)
fmt.Println("Creating temp directory at: " + temp) fmt.Println("Creating temp directory at: " + temp)
if err != nil { if err != nil {
return err return err
@@ -352,6 +367,10 @@ func InstallPackage(filename, installDir string, force bool) error {
fmt.Println("Creating Directory: " + extractFilename) fmt.Println("Creating Directory: " + extractFilename)
} }
} else if d.Type().IsRegular() { } else if d.Type().IsRegular() {
err := os.Remove(extractFilename)
if err != nil && !os.IsNotExist(err) {
return err
}
outFile, err := os.Create(extractFilename) outFile, err := os.Create(extractFilename)
fmt.Println("Creating File: " + extractFilename) fmt.Println("Creating File: " + extractFilename)
files = append(files, relFilename) files = append(files, relFilename)
@@ -385,6 +404,10 @@ func InstallPackage(filename, installDir string, force bool) error {
if err != nil { if err != nil {
return err return err
} }
err = os.Remove(extractFilename)
if err != nil && !os.IsNotExist(err) {
return err
}
fmt.Println("Creating Symlink: "+extractFilename, " -> "+link) fmt.Println("Creating Symlink: "+extractFilename, " -> "+link)
files = append(files, relFilename) files = append(files, relFilename)
err = os.Symlink(link, extractFilename) err = os.Symlink(link, extractFilename)
@@ -397,6 +420,42 @@ func InstallPackage(filename, installDir string, force bool) error {
if err != nil { if err != nil {
return err return err
} }
if binaryPkgFromSrc {
compiledDir := path.Join(installDir, "var/lib/bpm/compiled/")
err = os.MkdirAll(compiledDir, 755)
compiledInfo := PackageInfo{}
compiledInfo = *pkgInfo
compiledInfo.Type = "binary"
compiledInfo.Arch = GetArch()
err = os.WriteFile(path.Join(compiledDir, "pkg.info"), []byte(CreateInfoFile(compiledInfo)), 0644)
if err != nil {
return err
}
sed := fmt.Sprintf("s/%s/files/", strings.Replace(strings.TrimPrefix(path.Join(temp, "/output/"), "/"), "/", `\/`, -1))
cmd := exec.Command("/usr/bin/tar", "-czvf", compiledInfo.Name+".bpm", "pkg.info", path.Join(temp, "/output/"), "--transform", sed)
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Dir = compiledDir
fmt.Printf("running command: %s %s\n", cmd.Path, strings.Join(cmd.Args, " "))
err := cmd.Run()
if err != nil {
return err
}
err = os.Remove(path.Join(compiledDir, "pkg.info"))
if err != nil {
return err
}
}
if !keepTempDir {
err := os.RemoveAll(temp)
if err != nil {
return err
}
}
if len(files) == 0 {
return errors.New("no output files for source package. Cancelling package installation")
}
} }
} }
} else { } else {
@@ -405,6 +464,10 @@ func InstallPackage(filename, installDir string, force bool) error {
slices.Sort(files) slices.Sort(files)
slices.Reverse(files) slices.Reverse(files)
filesDiff := slices.DeleteFunc(oldFiles, func(f string) bool {
return slices.Contains(files, f)
})
installedDir := path.Join(installDir, "var/lib/bpm/installed/") installedDir := path.Join(installDir, "var/lib/bpm/installed/")
err = os.MkdirAll(installedDir, 755) err = os.MkdirAll(installedDir, 755)
if err != nil { if err != nil {
@@ -460,6 +523,12 @@ func InstallPackage(filename, installDir string, force bool) error {
if err != nil { if err != nil {
return err return err
} }
if len(filesDiff) != 0 {
fmt.Println("Removing obsolete files")
for _, f := range filesDiff {
fmt.Println("Removing: " + path.Join(installedDir, f))
}
}
return nil return nil
} }
+135 -69
View File
@@ -3,12 +3,10 @@ package main
import ( import (
"bufio" "bufio"
"capcreepergr.me/bpm/bpm_utils" "capcreepergr.me/bpm/bpm_utils"
"flag"
"fmt" "fmt"
"log" "log"
"os" "os"
"path"
"slices"
"strconv"
"strings" "strings"
) )
@@ -17,33 +15,25 @@ import (
/* A simple-to-use package manager */ /* A simple-to-use package manager */
/* ---------------------------------- */ /* ---------------------------------- */
var bpmVer = "0.0.9" var bpmVer = "0.1.1"
var subcommand = "help"
var subcommandArgs []string
// Flags
var rootDir = "/" var rootDir = "/"
var yesAll = false
var buildSource = false
var keepTempDir = false
var forceInstall = false
var pkgListNumbers = false
var pkgListNames = false
func main() { func main() {
errs, fixed := bpm_utils.FixInstalledPackages(rootDir) resolveFlags()
if len(errs) != 0 {
for pkg, err := range errs {
fmt.Printf("Package (%s) could not be read properly\nError: %s\n", pkg, err.Error())
}
fmt.Println("The aforementioned packages require manual fixing. Make sure their info files are valid in " + path.Join(rootDir, "var/lib/bpm/installed"))
os.Exit(1)
} else {
if fixed != 0 {
fmt.Println("Fixed " + strconv.Itoa(fixed) + " outdated package info files")
}
}
if os.Getuid() != 0 {
fmt.Println("BPM needs to be run with superuser permissions")
os.Exit(0)
}
resolveCommand() resolveCommand()
} }
func getArgs() []string {
return os.Args[1:]
}
type commandType uint8 type commandType uint8
const ( const (
@@ -57,11 +47,7 @@ const (
) )
func getCommandType() commandType { func getCommandType() commandType {
if len(getArgs()) == 0 { switch subcommand {
return help
}
cmd := getArgs()[0]
switch cmd {
case "version": case "version":
return version return version
case "info": case "info":
@@ -83,12 +69,10 @@ func getCommandType() commandType {
func resolveCommand() { func resolveCommand() {
switch getCommandType() { switch getCommandType() {
case version: case version:
resolveFlags()
fmt.Println("Bubble Package Manager (BPM)") fmt.Println("Bubble Package Manager (BPM)")
fmt.Println("Version: " + bpmVer) fmt.Println("Version: " + bpmVer)
case info: case info:
_, i := resolveFlags() packages := subcommandArgs
packages := getArgs()[1+i:]
if len(packages) == 0 { if len(packages) == 0 {
fmt.Println("No packages were given") fmt.Println("No packages were given")
return return
@@ -105,7 +89,6 @@ func resolveCommand() {
} }
} }
case list: case list:
flags, _ := resolveFlags()
packages, err := bpm_utils.GetInstalledPackages(rootDir) packages, err := bpm_utils.GetInstalledPackages(rootDir)
if err != nil { if err != nil {
log.Fatalf("Could not get installed packages\nError: %s", err.Error()) log.Fatalf("Could not get installed packages\nError: %s", err.Error())
@@ -115,9 +98,9 @@ func resolveCommand() {
fmt.Println("No packages have been installed") fmt.Println("No packages have been installed")
return return
} }
if slices.Contains(flags, "n") { if pkgListNumbers {
fmt.Println(len(packages)) fmt.Println(len(packages))
} else if slices.Contains(flags, "l") { } else if pkgListNames {
for _, pkg := range packages { for _, pkg := range packages {
fmt.Println(pkg) fmt.Println(pkg)
} }
@@ -135,8 +118,11 @@ func resolveCommand() {
} }
} }
case install: case install:
flags, i := resolveFlags() if os.Getuid() != 0 {
files := getArgs()[1+i:] fmt.Println("This subcommand needs to be run with superuser permissions")
os.Exit(0)
}
files := subcommandArgs
if len(files) == 0 { if len(files) == 0 {
fmt.Println("No files were given to install") fmt.Println("No files were given to install")
return return
@@ -152,8 +138,8 @@ func resolveCommand() {
if pkgInfo.Type == "source" { if pkgInfo.Type == "source" {
verb = "build" verb = "build"
} }
if !slices.Contains(flags, "f") { if !forceInstall {
if pkgInfo.Arch != bpm_utils.GetArch() { if pkgInfo.Arch != "any" && pkgInfo.Arch != bpm_utils.GetArch() {
fmt.Printf("skipping... cannot %s a package with a different architecture\n", verb) fmt.Printf("skipping... cannot %s a package with a different architecture\n", verb)
continue continue
} }
@@ -168,7 +154,10 @@ func resolveCommand() {
} }
} }
} }
if !slices.Contains(flags, "y") { if rootDir != "/" {
fmt.Println("Warning: Installing to " + rootDir)
}
if !yesAll {
reader := bufio.NewReader(os.Stdin) reader := bufio.NewReader(os.Stdin)
if pkgInfo.Type == "source" { if pkgInfo.Type == "source" {
fmt.Print("Would you like to view the source.sh file of this package? [Y\\n] ") fmt.Print("Would you like to view the source.sh file of this package? [Y\\n] ")
@@ -184,7 +173,7 @@ func resolveCommand() {
} }
} }
if bpm_utils.IsPackageInstalled(pkgInfo.Name, rootDir) { if bpm_utils.IsPackageInstalled(pkgInfo.Name, rootDir) {
if !slices.Contains(flags, "y") { if !yesAll {
installedInfo := bpm_utils.GetPackageInfo(pkgInfo.Name, rootDir, false) installedInfo := bpm_utils.GetPackageInfo(pkgInfo.Name, rootDir, false)
if strings.Compare(pkgInfo.Version, installedInfo.Version) > 0 { if strings.Compare(pkgInfo.Version, installedInfo.Version) > 0 {
fmt.Println("This file contains a newer version of this package (" + installedInfo.Version + " -> " + pkgInfo.Version + ")") fmt.Println("This file contains a newer version of this package (" + installedInfo.Version + " -> " + pkgInfo.Version + ")")
@@ -203,11 +192,7 @@ func resolveCommand() {
continue continue
} }
} }
err := bpm_utils.RemovePackage(pkgInfo.Name, rootDir) } else if !yesAll {
if err != nil {
log.Fatalf("Could not remove current version of the package\nError: %s\n", err)
}
} else if !slices.Contains(flags, "y") {
reader := bufio.NewReader(os.Stdin) reader := bufio.NewReader(os.Stdin)
fmt.Printf("Do you wish to %s this package? [y\\N] ", verb) fmt.Printf("Do you wish to %s this package? [y\\N] ", verb)
text, _ := reader.ReadString('\n') text, _ := reader.ReadString('\n')
@@ -217,21 +202,24 @@ func resolveCommand() {
} }
} }
err = bpm_utils.InstallPackage(file, rootDir, slices.Contains(flags, "f")) err = bpm_utils.InstallPackage(file, rootDir, forceInstall, buildSource, keepTempDir)
if err != nil { if err != nil {
if pkgInfo.Type == "source" { if pkgInfo.Type == "source" && keepTempDir {
fmt.Println("** It is recommended you delete the temporary bpm folder in /var/tmp **") fmt.Println("BPM temp directory was created at /var/tmp/bpm_source-" + pkgInfo.Name)
} }
log.Fatalf("Could not install package\nError: %s\n", err) log.Fatalf("Could not install package\nError: %s\n", err)
} }
fmt.Printf("Package (%s) was successfully installed!\n", pkgInfo.Name) fmt.Printf("Package (%s) was successfully installed!\n", pkgInfo.Name)
if pkgInfo.Type == "source" { if pkgInfo.Type == "source" && keepTempDir {
fmt.Println("** It is recommended you delete the temporary bpm folder in /var/tmp **") fmt.Println("** It is recommended you delete the temporary bpm folder in /var/tmp **")
} }
} }
case remove: case remove:
flags, i := resolveFlags() if os.Getuid() != 0 {
packages := getArgs()[1+i:] fmt.Println("This subcommand needs to be run with superuser permissions")
os.Exit(0)
}
packages := subcommandArgs
if len(packages) == 0 { if len(packages) == 0 {
fmt.Println("No packages were given") fmt.Println("No packages were given")
return return
@@ -244,7 +232,10 @@ func resolveCommand() {
} }
fmt.Print("----------------\n" + bpm_utils.CreateInfoFile(*pkgInfo)) fmt.Print("----------------\n" + bpm_utils.CreateInfoFile(*pkgInfo))
fmt.Println("----------------") fmt.Println("----------------")
if !slices.Contains(flags, "y") { if rootDir != "/" {
fmt.Println("Warning: Installing to " + rootDir)
}
if !yesAll {
reader := bufio.NewReader(os.Stdin) reader := bufio.NewReader(os.Stdin)
fmt.Print("Do you wish to remove this package? [y\\N] ") fmt.Print("Do you wish to remove this package? [y\\N] ")
text, _ := reader.ReadString('\n') text, _ := reader.ReadString('\n')
@@ -261,22 +252,91 @@ func resolveCommand() {
fmt.Printf("Package (%s) was successfully removed!\n", pkgInfo.Name) fmt.Printf("Package (%s) was successfully removed!\n", pkgInfo.Name)
} }
default: default:
fmt.Println("\033[1m------Help------\033[0m") printHelp()
fmt.Println("\033[1m\\ Command Format /\033[0m")
fmt.Println("-> command format: bpm <subcommand> [-flags]...")
fmt.Println("-> flags will be read if passed right after the subcommand otherwise they will be read as subcommand arguments")
fmt.Println("\033[1m\\ Command List /\033[0m")
fmt.Println("-> bpm version | shows information on the installed version of bpm")
fmt.Println("-> bpm info | shows information on an installed package")
fmt.Println("-> bpm list [-n, -l] | lists all installed packages. -n shows the number of packages. -l lists package names only")
fmt.Println("-> bpm install [-y, -f] <files...> | installs the following files. -y skips the confirmation prompt. -f skips dependency and architecture checking")
fmt.Println("-> bpm remove [-y] <packages...> | removes the following packages. -y skips the confirmation prompt")
fmt.Println("-> bpm cleanup | removes all unneeded dependencies")
fmt.Println("\033[1m----------------\033[0m")
} }
} }
func resolveFlags() ([]string, int) { func printHelp() {
fmt.Println("\033[1m------Help------\033[0m")
fmt.Println("\033[1m\\ Command Format /\033[0m")
fmt.Println("-> command format: bpm <subcommand> [-flags]...")
fmt.Println("-> flags will be read if passed right after the subcommand otherwise they will be read as subcommand arguments")
fmt.Println("\033[1m\\ Command List /\033[0m")
fmt.Println("-> bpm version | shows information on the installed version of bpm")
fmt.Println("-> bpm info | shows information on an installed package")
fmt.Println("-> bpm list [-n, -l] | lists all installed packages")
fmt.Println(" -n shows the number of packages")
fmt.Println(" -l lists package names only")
fmt.Println("-> bpm install [-y, -f, -b] <files...> | installs the following files")
fmt.Println(" -y skips the confirmation prompt")
fmt.Println(" -f skips dependency and architecture checking")
fmt.Println(" -b creates a binary package for a source package after compilation and saves it in /var/lib/bpm/compiled")
fmt.Println(" -k keeps the temp directory created by BPM after source package installation")
fmt.Println("-> bpm remove [-y] <packages...> | removes the following packages")
fmt.Println(" -y skips the confirmation prompt")
//fmt.Println("-> bpm cleanup | removes all unneeded dependencies")
fmt.Println("\033[1m----------------\033[0m")
}
func resolveFlags() {
// List flags
listFlagSet := flag.NewFlagSet("List flags", flag.ExitOnError)
listFlagSet.Usage = printHelp
listFlagSet.StringVar(&rootDir, "R", "/", "Set the destination root")
listFlagSet.BoolVar(&yesAll, "y", false, "Skip confirmation prompts")
listFlagSet.BoolVar(&pkgListNumbers, "n", false, "List the number of all packages installed with BPM")
listFlagSet.BoolVar(&pkgListNames, "l", false, "List the names of all packages installed with BPM")
// Info flags
infoFlagSet := flag.NewFlagSet("Info flags", flag.ExitOnError)
infoFlagSet.StringVar(&rootDir, "R", "/", "Set the destination root")
infoFlagSet.Usage = printHelp
// Install flags
installFlagSet := flag.NewFlagSet("Install flags", flag.ExitOnError)
installFlagSet.StringVar(&rootDir, "R", "/", "Set the destination root")
installFlagSet.BoolVar(&yesAll, "y", false, "Skip confirmation prompts")
installFlagSet.BoolVar(&buildSource, "b", false, "Build binary package from source package")
installFlagSet.BoolVar(&keepTempDir, "k", false, "Keep temporary directory after source compilation")
installFlagSet.BoolVar(&forceInstall, "f", false, "Force installation by skipping architecture and dependency resolution")
installFlagSet.Usage = printHelp
// Remove flags
removeFlagSet := flag.NewFlagSet("Remove flags", flag.ExitOnError)
removeFlagSet.StringVar(&rootDir, "R", "/", "Set the destination root")
removeFlagSet.BoolVar(&yesAll, "y", false, "Skip confirmation prompts")
removeFlagSet.Usage = printHelp
if len(os.Args[1:]) <= 0 {
subcommand = "help"
} else {
subcommand = os.Args[1]
subcommandArgs = os.Args[2:]
if getCommandType() == list {
err := listFlagSet.Parse(subcommandArgs)
if err != nil {
return
}
subcommandArgs = listFlagSet.Args()
} else if getCommandType() == info {
err := infoFlagSet.Parse(subcommandArgs)
if err != nil {
return
}
subcommandArgs = infoFlagSet.Args()
} else if getCommandType() == install {
err := installFlagSet.Parse(subcommandArgs)
if err != nil {
return
}
subcommandArgs = installFlagSet.Args()
} else if getCommandType() == remove {
err := removeFlagSet.Parse(subcommandArgs)
if err != nil {
return
}
subcommandArgs = removeFlagSet.Args()
}
}
}
/*func resolveFlags() ([]string, int) {
flags := getArgs()[1:] flags := getArgs()[1:]
var ret []string var ret []string
for _, flag := range flags { for _, flag := range flags {
@@ -292,13 +352,19 @@ func resolveFlags() ([]string, int) {
} }
ret = append(ret, f) ret = append(ret, f)
case install: case install:
v := [...]string{"y", "f"} v := [...]string{"y", "f", "b", "k"}
if !slices.Contains(v[:], f) { if !slices.Contains(v[:], f) {
log.Fatalf("Invalid flag " + flag) log.Fatalf("Invalid flag " + flag)
} }
ret = append(ret, f) ret = append(ret, f)
case remove: case remove:
v := [...]string{"y"} v := [...]string{"y", "r"}
if !slices.Contains(v[:], f) {
log.Fatalf("Invalid flag " + flag)
}
ret = append(ret, f)
case info:
v := [...]string{"r"}
if !slices.Contains(v[:], f) { if !slices.Contains(v[:], f) {
log.Fatalf("Invalid flag " + flag) log.Fatalf("Invalid flag " + flag)
} }
@@ -309,4 +375,4 @@ func resolveFlags() ([]string, int) {
} }
} }
return ret, len(ret) return ret, len(ret)
} }*/
Binary file not shown.
@@ -7,13 +7,25 @@ fi
output=$1 output=$1
if [[ ! "$output" =~ ^[a-zA-Z0-9_-]{1,}$ ]]; then
echo "Invalid output name! The name must only contain letters, numbers, hyphens or underscores!"
exit 1
fi
type="binary"
echo "Creating package with the name $output..." echo "Creating package with the name $output..."
if [ -d files ]; then if [ -d files ]; then
echo "files/ directory found" echo "files/ directory found"
else else
echo "files/ directory not found in $PWD" if [ -f source.sh ]; then
exit 1 type="source"
echo "source.sh file found"
else
echo "files/ directory or source.sh file not found in $PWD"
exit 1
fi
fi fi
if [ -f pkg.info ]; then if [ -f pkg.info ]; then
@@ -23,6 +35,10 @@ else
exit 1 exit 1
fi fi
echo "Creating $output.bpm package..." echo "Creating $type package as $output.bpm"
tar -czf $output.bpm files/ pkg.info if [[ "$type" == "binary" ]]; then
tar -czf "$output".bpm files/ pkg.info
else
tar -czf "$output".bpm source.sh pkg.info
fi
+66
View File
@@ -0,0 +1,66 @@
#!/bin/bash
if [ $# -lt 2 ]; then
echo "Arguments missing! Try 'bpm-setup <directory> <binary/source>'"
exit 1
fi
output=$1
type=$2
if [[ ! "$output" =~ ^[a-zA-Z0-9_-]{1,}$ ]]; then
echo "Invalid output name! The name must only contain letters, numbers, hyphens or underscores!"
exit 1
fi
if [[ "$type" != "binary" ]] && [[ "$type" != "source" ]]; then
echo "Invalid package type! Package type must be either 'binary' or 'source'"
exit 1
fi
mkdir -pv $output
cd $output
if [[ "$type" == "binary" ]]; then
cat > pkg.info << EOF
name: package_name
description: Package Description
version: 1.0
url: your package's website/repository url. Optonal
license: your package's license. Optional
architecture: $(uname -m)
type: binary
EOF
mkdir -pv files
echo "Package directory created successfully!"
echo "Make sure to edit the pkg.info file with the appropriate information for your package"
echo "Add your binaries under the files/ directory. For example a binary called 'my_binary' should go under files/usr/bin/my_binary"
echo "You can turn your package into a .bpm file use the 'bpm-create <name>' command"
else
cat > pkg.info << EOF
name: package_name
description: Package Description
version: 1.0
url: your package's website/repository url. Optional
license: your package's license. Optional
architecture: any
type: source
EOF
cat > source.sh << 'EOF'
# This is the source.sh script. It is executed by BPM in a temporary directory when compiling a source package
# BPM expects there to be an 'output' directory under the root of the temporary directory after this script finishes executing, otherwise your program may not be correctly installed
# It is recommended you create the 'output' directory along with a 'source' directory in the root of the temporary directory like this
echo "Compiling my_program..."
# Creating 'source' and 'output' directory variables
source=$(pwd)/source
output=$(pwd)/output
# Creating the 'source' and 'output' directories
mkdir $source
mkdir $output
# Downloading files
git clone https://myrepo.com/repo.git source
EOF
echo "Package directory created successfully!"
echo "Make sure to edit the pkg.info file with the appropriate information for your package"
echo "Add your compilation code in the source.sh file. Follow the instructions on the template file on how to do properly compile your program"
echo "You can turn your package into a .bpm file use the 'bpm-create <name>' command"
fi
+1 -1
View File
@@ -1,6 +1,6 @@
name: bpm-utils name: bpm-utils
description: Utilities to create BPM packages description: Utilities to create BPM packages
version: 1.0.0 version: 1.2.0
url: https://gitlab.com/bubble-package-manager/bpm/ url: https://gitlab.com/bubble-package-manager/bpm/
license: GPL3 license: GPL3
architecture: x86_64 architecture: x86_64
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1,6 +1,6 @@
name: bpm name: bpm
description: The Bubble Package Manager description: The Bubble Package Manager
version: 0.0.9 version: 0.1.1
url: https://gitlab.com/bubble-package-manager/bpm/ url: https://gitlab.com/bubble-package-manager/bpm/
license: GPL3 license: GPL3
architecture: x86_64 architecture: x86_64