mix/cmd/sync.go
2025-06-18 19:19:39 +01:00

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)
}
}