initial
This commit is contained in:
commit
8d15fa9731
9 changed files with 287 additions and 0 deletions
115
cmd/sync.go
Normal file
115
cmd/sync.go
Normal file
|
@ -0,0 +1,115 @@
|
|||
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)
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue