feat(cli): add save and load features
This commit is contained in:
parent
b0b70ce5d4
commit
eb6be5d23c
40
cmd/cli.go
40
cmd/cli.go
|
@ -59,15 +59,21 @@ var loadCmd = &cobra.Command{
|
|||
os.Exit(1)
|
||||
}
|
||||
|
||||
if !viper.GetBool("disable-files") {
|
||||
if !viper.GetBool("load-disable-files") {
|
||||
if err := mapper.LoadFiles(config.Files, config.Storage.Location); err != nil {
|
||||
errLogger.Printf(pterm.Red(fmt.Sprintf("error while loading files: %v\n", err)))
|
||||
errLogger.Printf(pterm.Red(err))
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
if !viper.GetBool("disable-pkgs") {
|
||||
if !viper.GetBool("load-disable-folders") {
|
||||
if err := mapper.LoadFolders(config.Folders, config.Storage.Location); err != nil {
|
||||
errLogger.Printf(pterm.Red(err))
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
if !viper.GetBool("load-disable-pkgs") {
|
||||
if err := mapper.LoadPkgs(config.PackageManagers); err != nil {
|
||||
errLogger.Printf(pterm.Red(fmt.Sprintf("error while installing packages: %v\n", err)))
|
||||
errLogger.Printf(pterm.Red(err))
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
@ -86,15 +92,21 @@ var saveCmd = &cobra.Command{
|
|||
os.Exit(1)
|
||||
}
|
||||
|
||||
if !viper.GetBool("disable-files") {
|
||||
if !viper.GetBool("save-disable-files") {
|
||||
if err := mapper.SaveFiles(config.Files, config.Storage.Location); err != nil {
|
||||
errLogger.Printf(pterm.Red(fmt.Sprintf("error while loading files: %v\n", err)))
|
||||
errLogger.Printf(pterm.Red(err))
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
if !viper.GetBool("disable-folders") {
|
||||
if !viper.GetBool("save-disable-folders") {
|
||||
if err := mapper.SaveFolders(config.Folders, config.Storage.Location); err != nil {
|
||||
errLogger.Printf(pterm.Red(fmt.Sprintf("error while loading files: %v\n", err)))
|
||||
errLogger.Printf(pterm.Red(err))
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
if !viper.GetBool("save-disable-pkgs") {
|
||||
if err := mapper.SavePkgs(config); err != nil {
|
||||
errLogger.Printf(pterm.Red(err))
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
@ -113,16 +125,16 @@ func init() {
|
|||
loadCmd.PersistentFlags().Bool("disable-files", false, "files will be ignored")
|
||||
loadCmd.PersistentFlags().Bool("disable-folders", false, "folders will be ignored")
|
||||
loadCmd.PersistentFlags().Bool("disable-pkgs", false, "package managers will be ignored")
|
||||
viper.BindPFlag("disable-files", loadCmd.PersistentFlags().Lookup("disable-files"))
|
||||
viper.BindPFlag("disable-folders", loadCmd.PersistentFlags().Lookup("disable-folders"))
|
||||
viper.BindPFlag("disable-pkgs", loadCmd.PersistentFlags().Lookup("disable-pkgs"))
|
||||
viper.BindPFlag("load-disable-files", loadCmd.PersistentFlags().Lookup("disable-files"))
|
||||
viper.BindPFlag("load-disable-folders", loadCmd.PersistentFlags().Lookup("disable-folders"))
|
||||
viper.BindPFlag("load-disable-pkgs", loadCmd.PersistentFlags().Lookup("disable-pkgs"))
|
||||
|
||||
saveCmd.PersistentFlags().Bool("disable-files", false, "files will be ignored")
|
||||
saveCmd.PersistentFlags().Bool("disable-folders", false, "folders will be ignored")
|
||||
saveCmd.PersistentFlags().Bool("disable-pkgs", false, "package managers will be ignored")
|
||||
viper.BindPFlag("disable-files", saveCmd.PersistentFlags().Lookup("disable-files"))
|
||||
viper.BindPFlag("disable-folders", saveCmd.PersistentFlags().Lookup("disable-folders"))
|
||||
viper.BindPFlag("disable-pkgs", saveCmd.PersistentFlags().Lookup("disable-pkgs"))
|
||||
viper.BindPFlag("save-disable-files", saveCmd.PersistentFlags().Lookup("disable-files"))
|
||||
viper.BindPFlag("save-disable-folders", saveCmd.PersistentFlags().Lookup("disable-folders"))
|
||||
viper.BindPFlag("save-disable-pkgs", saveCmd.PersistentFlags().Lookup("disable-pkgs"))
|
||||
}
|
||||
|
||||
func Execute() {
|
||||
|
|
|
@ -4,6 +4,7 @@ import (
|
|||
"fmt"
|
||||
"os"
|
||||
"path"
|
||||
"strings"
|
||||
|
||||
"github.com/pterm/pterm"
|
||||
"github.com/spf13/viper"
|
||||
|
@ -27,9 +28,9 @@ type Storage struct {
|
|||
}
|
||||
|
||||
type Git struct {
|
||||
SSH Ssh `mapstructure:"ssh" yaml:"ssh"`
|
||||
BasicAuth BasicAuth `mapstructure:"basic-auth" yaml:"basic-auth"`
|
||||
Repository string `mapstructure:"repository" yaml:"repository"`
|
||||
BasicAuth BasicAuth `mapstructure:"basic-auth" yaml:"basic-auth"`
|
||||
SSH Ssh `mapstructure:"ssh" yaml:"ssh"`
|
||||
}
|
||||
|
||||
type BasicAuth struct {
|
||||
|
@ -38,8 +39,8 @@ type BasicAuth struct {
|
|||
}
|
||||
|
||||
type Ssh struct {
|
||||
Passphrase string `mapstructure:"passphrase" yaml:"passphrase"`
|
||||
PrivateKey string `mapstructure:"private-key" yaml:"private-key"`
|
||||
Passphrase string `mapstructure:"passphrase" yaml:"passphrase"`
|
||||
}
|
||||
|
||||
type PkgManagers struct {
|
||||
|
@ -56,10 +57,18 @@ func InitConfig() {
|
|||
}
|
||||
|
||||
if c := viper.GetString("configuration-file"); c != "" {
|
||||
viper.AddConfigPath(path.Dir(c))
|
||||
if strings.Contains(c, ".yml") {
|
||||
viper.AddConfigPath(path.Dir(c))
|
||||
} else {
|
||||
viper.AddConfigPath(c)
|
||||
}
|
||||
}
|
||||
if c := os.Getenv("CONFIG_MAPPER_CFG"); c != "" {
|
||||
viper.AddConfigPath(c)
|
||||
if strings.Contains(c, ".yml") {
|
||||
viper.AddConfigPath(path.Dir(c))
|
||||
} else {
|
||||
viper.AddConfigPath(c)
|
||||
}
|
||||
}
|
||||
viper.AddConfigPath(h)
|
||||
|
||||
|
@ -78,4 +87,6 @@ func InitConfig() {
|
|||
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
viper.Set("configuration-file", viper.ConfigFileUsed())
|
||||
}
|
||||
|
|
|
@ -5,7 +5,6 @@ import (
|
|||
"fmt"
|
||||
"os"
|
||||
"path"
|
||||
"runtime"
|
||||
|
||||
"github.com/pterm/pterm"
|
||||
)
|
||||
|
@ -16,30 +15,19 @@ var (
|
|||
)
|
||||
|
||||
func LoadFiles(files []ItemLocation, location string) error {
|
||||
pterm.DefaultSection.Println("Save files into saved location")
|
||||
haveErr := false
|
||||
p, _ := pterm.DefaultProgressbar.WithTotal(len(files)).WithTitle("Loading files onto your system").Start()
|
||||
p, _ := pterm.DefaultProgressbar.WithTotal(len(files)).Start()
|
||||
|
||||
for _, f := range files {
|
||||
var src, dst string
|
||||
var err error
|
||||
|
||||
switch runtime.GOOS {
|
||||
case "linux":
|
||||
src, dst, err = getPaths(f.Linux, location)
|
||||
if err != nil {
|
||||
pterm.Error.Println(fmt.Sprintf("failed to destination resolve path \"%s\": %v", f.Linux, err))
|
||||
haveErr = true
|
||||
continue
|
||||
src, dst, err := configPaths(f, location)
|
||||
if err != nil {
|
||||
if err == ErrUnsupportedOS {
|
||||
return err
|
||||
}
|
||||
case "darwin":
|
||||
src, dst, err = getPaths(f.Darwin, location)
|
||||
if err != nil {
|
||||
pterm.Error.Println(fmt.Sprintf("failed to destination resolve path \"%s\": %v", f.Darwin, err))
|
||||
haveErr = true
|
||||
continue
|
||||
}
|
||||
default:
|
||||
return ErrUnsupportedOS
|
||||
pterm.Error.Println(fmt.Sprintf("failed to destination resolve path \"%s\": %v", f.Linux, err))
|
||||
haveErr = true
|
||||
continue
|
||||
}
|
||||
|
||||
if err := os.MkdirAll(path.Dir(dst), 0755); err != nil {
|
||||
|
@ -57,6 +45,7 @@ func LoadFiles(files []ItemLocation, location string) error {
|
|||
}
|
||||
|
||||
pterm.Success.Println(fmt.Sprintf("%s copied", src))
|
||||
p.Increment()
|
||||
}
|
||||
|
||||
p.Stop()
|
||||
|
@ -73,7 +62,7 @@ func SaveFiles(files []ItemLocation, location string) error {
|
|||
p, _ := pterm.DefaultProgressbar.WithTotal(len(files)).Start()
|
||||
|
||||
for _, f := range files {
|
||||
src, dst, err := configPaths(f, location)
|
||||
dst, src, err := configPaths(f, location)
|
||||
if err != nil {
|
||||
if err == ErrUnsupportedOS {
|
||||
return err
|
||||
|
|
|
@ -10,7 +10,57 @@ import (
|
|||
|
||||
var ErrFolderCopy = errors.New("failed to copy some folders")
|
||||
|
||||
func LoadFolders([]ItemLocation) error {
|
||||
func LoadFolders(folders []ItemLocation, location string) error {
|
||||
haveErr := false
|
||||
pterm.DefaultSection.Println("Load folders into saved location")
|
||||
p, _ := pterm.DefaultProgressbar.WithTotal(len(folders)).Start()
|
||||
|
||||
for _, f := range folders {
|
||||
src, dst, err := configPaths(f, location)
|
||||
if err != nil {
|
||||
if err == ErrUnsupportedOS {
|
||||
return err
|
||||
}
|
||||
pterm.Error.Println(fmt.Sprintf("failed to destination resolve path \"%s\": %v", f.Linux, err))
|
||||
haveErr = true
|
||||
continue
|
||||
}
|
||||
|
||||
s, err := os.Stat(src)
|
||||
if err != nil {
|
||||
pterm.Error.Println(fmt.Sprintf("failed to check if source path is a folder \"%s\": %v", src, err))
|
||||
haveErr = true
|
||||
continue
|
||||
}
|
||||
if !s.IsDir() {
|
||||
pterm.Error.Println(fmt.Sprintf("source path is a file \"%s\"", src))
|
||||
haveErr = true
|
||||
continue
|
||||
}
|
||||
|
||||
p.UpdateTitle(fmt.Sprintf("copying folder \"%s\"", src))
|
||||
|
||||
if err := os.MkdirAll(dst, 0755); err != nil {
|
||||
pterm.Error.Printfln(fmt.Sprintf("failed to create directory architecture for destination path \"%s\": %v", dst, err))
|
||||
haveErr = true
|
||||
continue
|
||||
}
|
||||
|
||||
if err := copyFolder(src, dst); err != nil {
|
||||
pterm.Error.Println(fmt.Sprintf("failed to load folder from \"%s\" to \"%s\": %v", src, dst, err))
|
||||
haveErr = true
|
||||
continue
|
||||
}
|
||||
|
||||
pterm.Success.Println(fmt.Sprintf("\"%s\" copied", src))
|
||||
p.Increment()
|
||||
}
|
||||
|
||||
p.Stop()
|
||||
if haveErr {
|
||||
return ErrCopy
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -20,7 +70,7 @@ func SaveFolders(folders []ItemLocation, location string) error {
|
|||
p, _ := pterm.DefaultProgressbar.WithTotal(len(folders)).Start()
|
||||
|
||||
for _, f := range folders {
|
||||
src, dst, err := configPaths(f, location)
|
||||
dst, src, err := configPaths(f, location)
|
||||
if err != nil {
|
||||
if err == ErrUnsupportedOS {
|
||||
return err
|
||||
|
|
|
@ -2,27 +2,38 @@ package mapper
|
|||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"os/exec"
|
||||
"strings"
|
||||
|
||||
"github.com/pterm/pterm"
|
||||
"github.com/spf13/viper"
|
||||
"gopkg.in/yaml.v3"
|
||||
)
|
||||
|
||||
var (
|
||||
errLogger = log.New(os.Stderr, "", 0)
|
||||
ErrFailedInstallation = errors.New("failed to installed some packages. Please, checkout STDERR for more information")
|
||||
ErrFailedInstallation = errors.New("failed to install some packages. Please, checkout STDERR for more information")
|
||||
ErrFailedSaving = errors.New("failed to save some packages. Please, checkout STDERR for more information")
|
||||
ErrBrewNotAvailable = errors.New("homebrew is not available on your system")
|
||||
ErrAptNotAvailable = errors.New("aptitude is not available on your system")
|
||||
)
|
||||
|
||||
func LoadPkgs(c PkgManagers) error {
|
||||
pterm.DefaultSection.Println("Load folders into saved location")
|
||||
|
||||
for _, pkg := range c.InstallationOrder {
|
||||
switch pkg {
|
||||
case "homebrew":
|
||||
if err := installBrewPkgs(c.Homebrew); err != nil {
|
||||
errLogger.Println(pterm.Red(err))
|
||||
return ErrFailedInstallation
|
||||
}
|
||||
case "apt":
|
||||
if err := installAptPkgs(c.Aptitude); err != nil {
|
||||
errLogger.Println(pterm.Red(err))
|
||||
return ErrFailedInstallation
|
||||
}
|
||||
}
|
||||
|
@ -31,10 +42,57 @@ func LoadPkgs(c PkgManagers) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func SavePkgs(cfg Configuration) error {
|
||||
pterm.DefaultSection.Println("Save user installed packages")
|
||||
|
||||
for _, pkg := range cfg.PackageManagers.InstallationOrder {
|
||||
switch pkg {
|
||||
case "homebrew":
|
||||
if err := SaveBrewPkgs(cfg); err != nil {
|
||||
errLogger.Println(pterm.Red(err))
|
||||
return ErrFailedSaving
|
||||
}
|
||||
case "apt":
|
||||
fmt.Println("implemented soon!")
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func SaveBrewPkgs(cfg Configuration) error {
|
||||
if _, err := exec.LookPath("brew"); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
introSpinner, _ := pterm.DefaultSpinner.WithShowTimer(true).WithRemoveWhenDone(false).Start("Installing homebrew packages")
|
||||
|
||||
o, err := exec.Command("brew", "leaves", "--installed-on-request").Output()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
pkgs := strings.Split(string(o), "\n")
|
||||
cfg.PackageManagers.Homebrew = append([]string{}, pkgs[:len(pkgs)-1]...)
|
||||
|
||||
b, err := yaml.Marshal(cfg)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := os.WriteFile(viper.GetString("configuration-file"), b, 0755); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
introSpinner.Stop()
|
||||
introSpinner.Success("Packages intalled succesfully")
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func installBrewPkgs(pkgs []string) error {
|
||||
if _, err := exec.LookPath("brew"); err != nil {
|
||||
errLogger.Println(pterm.Red("Homebrew is not installed on your system"))
|
||||
return nil
|
||||
return ErrBrewNotAvailable
|
||||
}
|
||||
|
||||
if len(pkgs) == 0 {
|
||||
|
@ -46,24 +104,13 @@ func installBrewPkgs(pkgs []string) error {
|
|||
cmd.Args = append(cmd.Args, pkgs...)
|
||||
introSpinner, _ := pterm.DefaultSpinner.WithShowTimer(true).WithRemoveWhenDone(false).Start("Installing homebrew packages")
|
||||
|
||||
chErr := make(chan error)
|
||||
defer close(chErr)
|
||||
|
||||
go func(chErr chan error) {
|
||||
if err := cmd.Run(); err != nil {
|
||||
chErr <- err
|
||||
return
|
||||
}
|
||||
|
||||
chErr <- nil
|
||||
}(chErr)
|
||||
|
||||
err := <-chErr
|
||||
introSpinner.Stop()
|
||||
if err != nil {
|
||||
if err := cmd.Run(); err != nil {
|
||||
introSpinner.Stop()
|
||||
introSpinner.SuccessPrinter.PrintOnErrorf("brew command failed", err)
|
||||
return err
|
||||
}
|
||||
|
||||
introSpinner.Stop()
|
||||
introSpinner.Success("Packages intalled succesfully")
|
||||
|
||||
return nil
|
||||
|
@ -71,8 +118,7 @@ func installBrewPkgs(pkgs []string) error {
|
|||
|
||||
func installAptPkgs(pkgs []string) error {
|
||||
if _, err := exec.LookPath("apt-get"); err != nil {
|
||||
errLogger.Println(pterm.Red("aptitude is not available on your system"))
|
||||
return nil
|
||||
return ErrAptNotAvailable
|
||||
}
|
||||
|
||||
if len(pkgs) == 0 {
|
||||
|
|
|
@ -89,12 +89,12 @@ func configPaths(f ItemLocation, location string) (string, string, error) {
|
|||
|
||||
switch runtime.GOOS {
|
||||
case "linux":
|
||||
dst, src, err = getPaths(f.Linux, location)
|
||||
src, dst, err = getPaths(f.Linux, location)
|
||||
if err != nil {
|
||||
return "", "", err
|
||||
}
|
||||
case "darwin":
|
||||
dst, src, err = getPaths(f.Darwin, location)
|
||||
src, dst, err = getPaths(f.Darwin, location)
|
||||
if err != nil {
|
||||
return "", "", err
|
||||
}
|
||||
|
|
Reference in New Issue