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
|
|
}
|