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

158 lines
4.0 KiB
Go
Raw Normal View History

2022-02-25 00:17:02 +01:00
package mapper
import (
2022-02-27 18:13:27 +01:00
"fmt"
2022-02-25 00:17:02 +01:00
"os"
"os/exec"
"runtime"
"strings"
2022-02-25 00:17:02 +01:00
"gitea.antoine-langlois.net/datahearth/config-mapper/internal/configuration"
"github.com/charmbracelet/log"
"github.com/gernest/wow"
"github.com/gernest/wow/spin"
2022-02-27 18:13:27 +01:00
"github.com/spf13/viper"
2022-02-25 00:17:02 +01:00
)
2022-07-10 12:35:01 +02:00
// InstallPackages install all packages from the configuration file by installation order
func InstallPackages(c configuration.PkgManagers) error {
pkgManagers := map[string]bool{}
for _, pkgManager := range viper.GetStringSlice("exclude-pkg-managers") {
pkgManagers[pkgManager] = true
}
2022-02-27 18:13:27 +01:00
2022-07-10 12:35:01 +02:00
for _, pkgManager := range c.InstallationOrder {
log.Info("installing packages", "package-manager", pkgManager)
if _, ok := pkgManagers[pkgManager]; ok {
log.Info("skipping package manager", "package-manager", pkgManager)
continue
}
2022-07-10 12:35:01 +02:00
var pkgs []string
switch pkgManager {
case "brew":
pkgs = c.Brew
2022-02-25 00:17:02 +01:00
case "apt":
2022-07-10 12:35:01 +02:00
pkgs = c.Apt
case "cargo":
pkgs = c.Cargo
case "npm":
pkgs = c.Npm
case "pip":
pkgs = c.Pip
case "go":
pkgs = c.Go
case "nala":
pkgs = c.Nala
2022-07-10 12:35:01 +02:00
default:
log.Error("package manager not supported", "package-manager", pkgManager)
2022-07-10 12:35:01 +02:00
continue
2022-02-25 00:17:02 +01:00
}
2022-02-27 18:13:27 +01:00
2022-07-10 12:35:01 +02:00
if _, err := exec.LookPath(pkgManager); err != nil {
// * pip might not be available on the system but pip3 is
2022-07-10 12:35:01 +02:00
if pkgManager == "pip" {
if _, err := exec.LookPath("pip3"); err != nil {
log.Error("pip and pip3 are not available on your system", "package-manager", pkgManager)
continue
2022-07-10 12:35:01 +02:00
}
pkgManager = "pip3"
} else {
log.Error("package manager not available on your system", "package-manager", pkgManager)
continue
2022-02-27 18:13:27 +01:00
}
}
// * for some reason, apt binary is available on darwin. Exclude it to avoid errors
if pkgManager == "apt" && runtime.GOOS == "darwin" {
log.Error("package manager not available on your system", "package-manager", pkgManager)
continue
}
2022-02-27 18:13:27 +01:00
2022-07-10 12:35:01 +02:00
if len(pkgs) == 0 {
2022-07-20 18:03:31 +02:00
fmt.Printf("✔️ nothing to do\n\n")
continue
2022-07-10 12:35:01 +02:00
}
2022-02-25 00:17:02 +01:00
2022-07-20 18:03:31 +02:00
v := viper.GetBool("verbose")
commands := []*exec.Cmd{}
// * package managers requiring sudo permission
if pkgManager == "apt" || pkgManager == "nala" {
2022-07-20 18:03:31 +02:00
commands = append(commands, buildDefaultCommand([]string{"sudo", pkgManager, "install", "-y"}, pkgs, v))
} else if pkgManager == "cargo" {
commands = buildCargoCommand(pkgs, v)
} else {
2022-07-20 18:03:31 +02:00
commands = append(commands, buildDefaultCommand([]string{pkgManager, "install"}, pkgs, v))
}
2022-07-20 18:03:31 +02:00
for i, cmd := range commands {
spinner := wow.New(os.Stdout, spin.Get(spin.Dots3), " Installing...")
if !v {
spinner.Start()
}
if err := cmd.Run(); err != nil {
if v {
log.Error(err)
2022-07-20 18:03:31 +02:00
} else {
msg := fmt.Sprintf(" %s", cmd.Args)
if i == len(commands)-1 {
msg = fmt.Sprintf("%s\n", msg)
}
spinner.PersistWith(spin.Spinner{Frames: []string{"❌"}}, msg)
}
continue
}
if !v {
// msg := fmt.Sprintf(" %s %s", color.GreenString("Success\t"), cmd.Args)
msg := fmt.Sprintf(" %s", cmd.Args)
if i == len(commands)-1 {
msg = fmt.Sprintf("%s\n", msg)
}
spinner.PersistWith(spin.Spinner{Frames: []string{"✔️"}}, msg)
}
}
2022-07-20 18:03:31 +02:00
}
2022-02-25 00:17:02 +01:00
2022-07-20 18:03:31 +02:00
return nil
}
2022-02-25 00:17:02 +01:00
2022-07-20 18:03:31 +02:00
func buildCargoCommand(packages []string, verbose bool) []*exec.Cmd {
commands := []*exec.Cmd{}
cmd := exec.Command("cargo", "install")
for _, pkg := range packages {
if strings.Contains(pkg, " ") {
customCmd := exec.Command("cargo", "install")
customCmd.Args = append(cmd.Args, strings.Split(pkg, " ")...)
if verbose {
customCmd.Stderr = os.Stderr
customCmd.Stdout = os.Stdout
}
commands = append(commands, customCmd)
2022-07-10 12:35:01 +02:00
} else {
2022-07-20 18:03:31 +02:00
cmd.Args = append(cmd.Args, pkg)
2022-07-10 12:35:01 +02:00
}
2022-07-20 18:03:31 +02:00
}
2022-02-25 00:17:02 +01:00
2022-07-20 18:03:31 +02:00
if verbose {
cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout
}
if len(cmd.Args) > 2 {
commands = append(commands, cmd)
}
2022-02-25 00:17:02 +01:00
2022-07-20 18:03:31 +02:00
return commands
}
func buildDefaultCommand(command, packages []string, verbose bool) *exec.Cmd {
cmd := exec.Command(command[0], command[1:]...)
cmd.Args = append(cmd.Args, packages...)
if verbose {
cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout
2022-02-25 00:17:02 +01:00
}
2022-07-20 18:03:31 +02:00
return cmd
2022-02-25 00:17:02 +01:00
}