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