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"
|
2022-07-20 11:35:19 +02:00
|
|
|
"runtime"
|
|
|
|
"strings"
|
2022-02-25 00:17:02 +01:00
|
|
|
|
2022-09-02 22:42:33 +02:00
|
|
|
"gitea.antoine-langlois.net/datahearth/config-mapper/internal/configuration"
|
2023-03-02 18:35:10 +01:00
|
|
|
"github.com/charmbracelet/log"
|
2022-06-06 15:32:01 +02:00
|
|
|
"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 {
|
2022-07-20 13:33:04 +02:00
|
|
|
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 {
|
2023-03-02 18:35:10 +01:00
|
|
|
log.Info("installing packages", "package-manager", pkgManager)
|
2022-07-20 13:33:04 +02:00
|
|
|
if _, ok := pkgManagers[pkgManager]; ok {
|
2023-03-02 18:35:10 +01:00
|
|
|
log.Info("skipping package manager", "package-manager", pkgManager)
|
2022-07-20 13:33:04 +02:00
|
|
|
continue
|
|
|
|
}
|
2022-07-20 11:35:19 +02:00
|
|
|
|
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
|
2022-07-20 13:33:04 +02:00
|
|
|
case "nala":
|
|
|
|
pkgs = c.Nala
|
2022-07-10 12:35:01 +02:00
|
|
|
default:
|
2023-03-02 18:35:10 +01:00
|
|
|
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 {
|
2022-07-20 11:35:19 +02:00
|
|
|
// * 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 {
|
2023-03-02 18:35:10 +01:00
|
|
|
log.Error("pip and pip3 are not available on your system", "package-manager", pkgManager)
|
2022-07-20 11:35:19 +02:00
|
|
|
continue
|
2022-07-10 12:35:01 +02:00
|
|
|
}
|
|
|
|
pkgManager = "pip3"
|
|
|
|
} else {
|
2023-03-02 18:35:10 +01:00
|
|
|
log.Error("package manager not available on your system", "package-manager", pkgManager)
|
2022-07-20 11:35:19 +02:00
|
|
|
continue
|
2022-02-27 18:13:27 +01:00
|
|
|
}
|
|
|
|
}
|
2022-07-20 11:35:19 +02:00
|
|
|
// * for some reason, apt binary is available on darwin. Exclude it to avoid errors
|
|
|
|
if pkgManager == "apt" && runtime.GOOS == "darwin" {
|
2023-03-02 18:35:10 +01:00
|
|
|
log.Error("package manager not available on your system", "package-manager", pkgManager)
|
2022-07-20 11:35:19 +02:00
|
|
|
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")
|
2022-07-20 11:35:19 +02:00
|
|
|
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{}
|
2022-07-20 13:33:04 +02:00
|
|
|
// * 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)
|
2022-07-20 13:33:04 +02:00
|
|
|
} else {
|
2022-07-20 18:03:31 +02:00
|
|
|
commands = append(commands, buildDefaultCommand([]string{pkgManager, "install"}, pkgs, v))
|
2022-07-20 13:33:04 +02:00
|
|
|
}
|
|
|
|
|
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 {
|
2023-03-02 18:35:10 +01:00
|
|
|
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 11:35:19 +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
|
|
|
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
|
|
|
}
|