PackageManager just because
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

154 lines
3.1 KiB

package Package
import (
"errors"
"fmt"
"io/ioutil"
"os"
"os/exec"
"path/filepath"
"strconv"
"strings"
bolt "go.etcd.io/bbolt"
"PackageManager/Archive"
"PackageManager/Client/Database"
"PackageManager/Client/Filesystem"
"PackageManager/Color"
"PackageManager/Helper"
"PackageManager/Variables"
)
func writeManifestFile(path, name, version string) error {
var (
cmd *exec.Cmd
manifest string
filePath string
e error
)
manifest = fmt.Sprintf(`name: "%s"
version: "%s"
dependancies:
- pkg1: v1.0.0
- pkg2: v1.0.0
`, name, version)
filePath = filepath.Join(path, "manifest.yml")
e = ioutil.WriteFile(filePath, []byte(manifest), 0644)
if e != nil {
return e
}
cmd = exec.Command(Variables.Editor, filePath)
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
return cmd.Run()
}
func CreatePackage() error {
var (
picksBucket *bolt.Bucket
pickedFiles []string
pkgFiles []string
choices string
choicesSplit []string
pkgName string
pkgVersion string
pkgNameVersion string
tmpDir string
index int
e error
)
fmt.Println("Initialising package creation...")
e = Database.FsDB.View(func(tx *bolt.Tx) error {
picksBucket = tx.Bucket(Variables.FsHashPicksBucket)
picksBucket.ForEach(func(k, v []byte) error {
pickedFiles = append(pickedFiles, string(k))
return nil
})
return nil
})
fmt.Println("Added files:")
Filesystem.PrintFiles(pickedFiles, Color.Green, true)
fmt.Println("Please select the files you would like to use to create the package. Leave empty for all.")
choices = Helper.Input()
if choices == "" {
pkgFiles = pickedFiles
} else {
choicesSplit = strings.Split(choices, ",")
for _, i := range choicesSplit {
index, e = strconv.Atoi(i)
if e != nil {
// TODO: Handle this error
panic(e)
}
if len(pickedFiles) < index {
return errors.New("Invalid choice")
}
pkgFiles = append(pkgFiles, pickedFiles[index])
}
}
fmt.Println("Please enter the package name:")
pkgName = Helper.Input()
if pkgName == "" {
return errors.New("Invalid package name")
}
fmt.Println("Please enter the package version:")
pkgVersion = Helper.Input()
if pkgVersion == "" {
return errors.New("Invalid package name")
}
fmt.Printf("Package Name: %s\n", pkgName)
fmt.Printf("Package Version: %s\n", pkgVersion)
fmt.Println("Files to be added")
Filesystem.PrintFiles(pkgFiles, Color.Green, false)
fmt.Println("Is this correct? [y/N]")
if strings.ToLower(Helper.Input()) != "y" {
return errors.New("User aborted")
}
pkgNameVersion = fmt.Sprintf("%s-%s", pkgName, pkgVersion)
tmpDir, e = ioutil.TempDir("/tmp", pkgNameVersion)
if e != nil {
return e
}
defer os.RemoveAll(tmpDir)
for _, file := range pkgFiles {
Filesystem.CopyFile(file, filepath.Join(tmpDir, file))
}
e = writeManifestFile(tmpDir, pkgName, pkgVersion)
if e != nil {
return e
}
e = Archive.TarGzip(tmpDir, pkgNameVersion+".tar.gz")
if e != nil {
return e
}
fmt.Printf(
Color.Green("\nSuccessfully created package %s\n"),
pkgNameVersion,
)
return nil
}