115 lines
2.2 KiB
Go
115 lines
2.2 KiB
Go
package cmd
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"os/exec"
|
|
|
|
"git.iwakura.rip/grng/mix/mix"
|
|
"github.com/urfave/cli/v3"
|
|
)
|
|
|
|
var SyncCommand = &cli.Command{
|
|
Name: "sync",
|
|
Action: func(context.Context, *cli.Command) error {
|
|
config := mix.Config
|
|
if len(config) == 0 {
|
|
return cli.Exit("No configuration files found", 1)
|
|
}
|
|
|
|
if mix.Lock == nil {
|
|
return cli.Exit("No lockfile found", 1)
|
|
}
|
|
|
|
var cfg mix.MixConfig
|
|
for _, c := range config {
|
|
cfg = c
|
|
break
|
|
}
|
|
|
|
desired := make(map[string]mix.MixPackage)
|
|
for _, group := range cfg {
|
|
for _, pkg := range group.Packages {
|
|
desired[pkg.Id] = pkg
|
|
}
|
|
}
|
|
|
|
var newLock mix.MixLock
|
|
for _, lockPkg := range mix.Lock {
|
|
if _, ok := desired[lockPkg.Id]; !ok {
|
|
rmPackage(lockPkg.Id)
|
|
} else {
|
|
newLock = append(newLock, lockPkg)
|
|
}
|
|
}
|
|
mix.Lock = newLock
|
|
|
|
for _, pkg := range desired {
|
|
found := false
|
|
for _, lockPkg := range mix.Lock {
|
|
if lockPkg.Id == pkg.Id {
|
|
found = true
|
|
break
|
|
}
|
|
}
|
|
if !found {
|
|
err := syncPackage(pkg)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to add package %s: %w", pkg.Id, err)
|
|
}
|
|
}
|
|
}
|
|
|
|
err := mix.SaveLockFile()
|
|
if err != nil {
|
|
return fmt.Errorf("failed to save lock file: %w", err)
|
|
}
|
|
|
|
return nil
|
|
},
|
|
}
|
|
|
|
func syncPackage(pkg mix.MixPackage) error {
|
|
isInstalled := false
|
|
for _, lockPkg := range mix.Lock {
|
|
if lockPkg.Id == pkg.Id {
|
|
isInstalled = true
|
|
break
|
|
}
|
|
}
|
|
|
|
if isInstalled {
|
|
return nil
|
|
}
|
|
|
|
fmt.Printf("Installing package %s...\n", pkg.Id)
|
|
cmd := exec.Command("winget", "install", "-h", "-e", "--id", pkg.Id, "-v", pkg.Version)
|
|
cmd.Stdout = nil
|
|
cmd.Stderr = nil
|
|
err := cmd.Run()
|
|
|
|
if err != nil {
|
|
return fmt.Errorf("failed to install package %s: %w", pkg.Id, err)
|
|
}
|
|
|
|
fmt.Printf("Package %s installed successfully!\n", pkg.Id)
|
|
mix.Lock = append(mix.Lock, mix.MixLockPackage{
|
|
Id: pkg.Id,
|
|
Version: pkg.Version,
|
|
})
|
|
|
|
return nil
|
|
}
|
|
|
|
func rmPackage(id string) {
|
|
fmt.Printf("Removing package %s...\n", id)
|
|
cmd := exec.Command("winget", "uninstall", "-h", "-e", "--id", id)
|
|
cmd.Stdout = nil
|
|
cmd.Stderr = nil
|
|
err := cmd.Run()
|
|
if err != nil {
|
|
fmt.Printf("Failed to uninstall package %s: %v\n", id, err)
|
|
} else {
|
|
fmt.Printf("Package %s removed successfully!\n", id)
|
|
}
|
|
}
|