This repository has been archived on 2024-02-15. You can view files and clone it, but cannot push or open issues or pull requests.
config-mapper/internal/pkgs.go

156 lines
3.5 KiB
Go
Raw Normal View History

2022-02-25 00:17:02 +01:00
package mapper
import (
"errors"
2022-02-27 18:13:27 +01:00
"fmt"
2022-02-25 00:17:02 +01:00
"log"
"os"
"os/exec"
2022-02-27 18:13:27 +01:00
"strings"
2022-02-25 00:17:02 +01:00
"github.com/pterm/pterm"
2022-02-27 18:13:27 +01:00
"github.com/spf13/viper"
"gopkg.in/yaml.v3"
2022-02-25 00:17:02 +01:00
)
var (
errLogger = log.New(os.Stderr, "", 0)
2022-02-27 18:13:27 +01:00
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")
2022-02-25 00:17:02 +01:00
)
func LoadPkgs(c PkgManagers) error {
2022-02-27 18:13:27 +01:00
pterm.DefaultSection.Println("Load folders into saved location")
for _, pkg := range c.InstallationOrder {
2022-02-25 00:17:02 +01:00
switch pkg {
case "homebrew":
if err := installBrewPkgs(c.Homebrew); err != nil {
2022-02-27 18:13:27 +01:00
errLogger.Println(pterm.Red(err))
2022-02-25 00:17:02 +01:00
return ErrFailedInstallation
}
case "apt":
if err := installAptPkgs(c.Aptitude); err != nil {
2022-02-27 18:13:27 +01:00
errLogger.Println(pterm.Red(err))
2022-02-25 00:17:02 +01:00
return ErrFailedInstallation
}
}
}
return nil
}
2022-02-27 18:13:27 +01:00
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 {
2022-02-25 00:17:02 +01:00
if _, err := exec.LookPath("brew"); err != nil {
2022-02-27 18:13:27 +01:00
return ErrBrewNotAvailable
2022-02-25 00:17:02 +01:00
}
if len(pkgs) == 0 {
pterm.Println(pterm.Blue("homebrew: nothing to do"))
return nil
}
cmd := exec.Command("brew", "install")
cmd.Args = append(cmd.Args, pkgs...)
introSpinner, _ := pterm.DefaultSpinner.WithShowTimer(true).WithRemoveWhenDone(false).Start("Installing homebrew packages")
2022-02-27 18:13:27 +01:00
if err := cmd.Run(); err != nil {
introSpinner.Stop()
introSpinner.SuccessPrinter.PrintOnErrorf("brew command failed", err)
2022-02-25 00:17:02 +01:00
return err
}
2022-02-27 18:13:27 +01:00
introSpinner.Stop()
introSpinner.Success("Packages intalled succesfully")
2022-02-25 00:17:02 +01:00
return nil
}
func installAptPkgs(pkgs []string) error {
2022-02-25 00:17:02 +01:00
if _, err := exec.LookPath("apt-get"); err != nil {
2022-02-27 18:13:27 +01:00
return ErrAptNotAvailable
2022-02-25 00:17:02 +01:00
}
if len(pkgs) == 0 {
pterm.Println(pterm.Blue("aptitude: nothing to do"))
return nil
}
cmd := exec.Command("sudo", "apt-get", "install")
cmd.Args = append(cmd.Args, pkgs...)
introSpinner, _ := pterm.DefaultSpinner.WithShowTimer(true).WithRemoveWhenDone(false).Start("Installing aptitude 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 {
return err
}
introSpinner.Success("Packages intalled succesfully")
2022-02-25 00:17:02 +01:00
return nil
}