Fix Reinstall, version-pinned, error propagation, and DryRun bugs in Install/Remove pre-filter

Co-authored-by: taigrr <8261498+taigrr@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]
2026-02-28 06:59:51 +00:00
parent 3d6baf3314
commit a3e4827e5e
10 changed files with 182 additions and 36 deletions

View File

@@ -55,17 +55,24 @@ func formatTargets(targets []snack.Target) []string {
}
func install(ctx context.Context, pkgs []snack.Target, opts ...snack.Option) (snack.InstallResult, error) {
o := snack.ApplyOptions(opts...)
var toInstall []snack.Target
var unchanged []string
for _, t := range pkgs {
ok, _ := isInstalled(ctx, t.Name)
if o.Reinstall || t.Version != "" || o.DryRun {
toInstall = append(toInstall, t)
continue
}
ok, err := isInstalled(ctx, t.Name)
if err != nil {
return snack.InstallResult{}, err
}
if ok {
unchanged = append(unchanged, t.Name)
} else {
toInstall = append(toInstall, t)
}
}
o := snack.ApplyOptions(opts...)
if len(toInstall) > 0 {
args := append([]string{"install", "-y"}, formatTargets(toInstall)...)
if _, err := run(ctx, args, o); err != nil {
@@ -81,17 +88,24 @@ func install(ctx context.Context, pkgs []snack.Target, opts ...snack.Option) (sn
}
func remove(ctx context.Context, pkgs []snack.Target, opts ...snack.Option) (snack.RemoveResult, error) {
o := snack.ApplyOptions(opts...)
var toRemove []snack.Target
var unchanged []string
for _, t := range pkgs {
ok, _ := isInstalled(ctx, t.Name)
if o.DryRun {
toRemove = append(toRemove, t)
continue
}
ok, err := isInstalled(ctx, t.Name)
if err != nil {
return snack.RemoveResult{}, err
}
if !ok {
unchanged = append(unchanged, t.Name)
} else {
toRemove = append(toRemove, t)
}
}
o := snack.ApplyOptions(opts...)
if len(toRemove) > 0 {
args := append([]string{"delete", "-y"}, snack.TargetNames(toRemove)...)
if _, err := run(ctx, args, o); err != nil {