From 0fe10af2c9772c1ee72b227a6cd61269382c2da3 Mon Sep 17 00:00:00 2001 From: Elara Musayelyan Date: Thu, 23 Feb 2023 16:38:08 -0800 Subject: [PATCH] Add interactive flag to turn off prompts --- build.go | 18 +++++++------- info.go | 2 +- install.go | 10 ++++---- internal/cliutils/prompt.go | 48 +++++++++++++++++++++++-------------- main.go | 7 ++++++ upgrade.go | 2 +- 6 files changed, 53 insertions(+), 34 deletions(-) diff --git a/build.go b/build.go index 9efde43..521606e 100644 --- a/build.go +++ b/build.go @@ -102,7 +102,7 @@ func buildCmd(c *cli.Context) error { log.Fatal("Unable to detect supported package manager on system").Send() } - pkgPaths, _, err := buildPackage(c.Context, script, mgr, c.Bool("clean")) + pkgPaths, _, err := buildPackage(c.Context, script, mgr, c.Bool("clean"), c.Bool("interactive")) if err != nil { log.Fatal("Error building package").Err(err).Send() } @@ -125,7 +125,7 @@ func buildCmd(c *cli.Context) error { // buildPackage builds the script at the given path. It returns two slices. One contains the paths // to the built package(s), the other contains the names of the built package(s). -func buildPackage(ctx context.Context, script string, mgr manager.Manager, clean bool) ([]string, []string, error) { +func buildPackage(ctx context.Context, script string, mgr manager.Manager, clean, interactive bool) ([]string, []string, error) { info, err := distro.ParseOSRelease(ctx) if err != nil { return nil, nil, err @@ -204,13 +204,13 @@ func buildPackage(ctx context.Context, script string, mgr manager.Manager, clean } } - err = cliutils.PromptViewScript(script, vars.Name, cfg.PagerStyle, translator) + err = cliutils.PromptViewScript(script, vars.Name, cfg.PagerStyle, interactive, translator) if err != nil { log.Fatal("Failed to prompt user to view build script").Err(err).Send() } if !archMatches(vars.Architectures) { - buildAnyway, err := cliutils.YesNoPrompt("Your system's CPU architecture doesn't match this package. Do you want to build anyway?", true, translator) + buildAnyway, err := cliutils.YesNoPrompt("Your system's CPU architecture doesn't match this package. Do you want to build anyway?", interactive, true, translator) if err != nil { return nil, nil, err } @@ -285,9 +285,9 @@ func buildPackage(ctx context.Context, script string, mgr manager.Manager, clean log.Info("Installing build dependencies").Send() - flattened := cliutils.FlattenPkgs(found, "install", translator) + flattened := cliutils.FlattenPkgs(found, "install", interactive, translator) buildDeps = packageNames(flattened) - installPkgs(ctx, flattened, notFound, mgr, clean) + installPkgs(ctx, flattened, notFound, mgr, clean, interactive) } var builtDeps, builtNames, repoDeps []string @@ -299,9 +299,9 @@ func buildPackage(ctx context.Context, script string, mgr manager.Manager, clean return nil, nil, err } - scripts := getScriptPaths(cliutils.FlattenPkgs(found, "install", translator)) + scripts := getScriptPaths(cliutils.FlattenPkgs(found, "install", interactive, translator)) for _, script := range scripts { - pkgPaths, pkgNames, err := buildPackage(ctx, script, mgr, clean) + pkgPaths, pkgNames, err := buildPackage(ctx, script, mgr, clean, interactive) if err != nil { return nil, nil, err } @@ -509,7 +509,7 @@ func buildPackage(ctx context.Context, script string, mgr manager.Manager, clean } if len(buildDeps) > 0 { - removeBuildDeps, err := cliutils.YesNoPrompt("Would you like to remove build dependencies?", false, translator) + removeBuildDeps, err := cliutils.YesNoPrompt("Would you like to remove build dependencies?", interactive, false, translator) if err != nil { return nil, nil, err } diff --git a/info.go b/info.go index 08902bf..b08047e 100644 --- a/info.go +++ b/info.go @@ -53,7 +53,7 @@ func infoCmd(c *cli.Context) error { os.Exit(1) } - pkgs := cliutils.FlattenPkgs(found, "show", translator) + pkgs := cliutils.FlattenPkgs(found, "show", c.Bool("interactive"), translator) var names []string all := c.Bool("all") diff --git a/install.go b/install.go index 68ee9aa..afd7967 100644 --- a/install.go +++ b/install.go @@ -53,13 +53,13 @@ func installCmd(c *cli.Context) error { log.Fatal("Error finding packages").Err(err).Send() } - installPkgs(c.Context, cliutils.FlattenPkgs(found, "install", translator), notFound, mgr, c.Bool("clean")) + installPkgs(c.Context, cliutils.FlattenPkgs(found, "install", c.Bool("interactive"), translator), notFound, mgr, c.Bool("clean"), c.Bool("interactive")) return nil } // installPkgs installs non-LURE packages via the package manager, then builds and installs LURE // packages -func installPkgs(ctx context.Context, pkgs []db.Package, notFound []string, mgr manager.Manager, clean bool) { +func installPkgs(ctx context.Context, pkgs []db.Package, notFound []string, mgr manager.Manager, clean, interactive bool) { if len(notFound) > 0 { err := mgr.Install(nil, notFound...) if err != nil { @@ -67,7 +67,7 @@ func installPkgs(ctx context.Context, pkgs []db.Package, notFound []string, mgr } } - installScripts(ctx, mgr, getScriptPaths(pkgs), clean) + installScripts(ctx, mgr, getScriptPaths(pkgs), clean, interactive) } // getScriptPaths generates a slice of script paths corresponding to the @@ -82,9 +82,9 @@ func getScriptPaths(pkgs []db.Package) []string { } // installScripts builds and installs LURE build scripts -func installScripts(ctx context.Context, mgr manager.Manager, scripts []string, clean bool) { +func installScripts(ctx context.Context, mgr manager.Manager, scripts []string, clean, interactive bool) { for _, script := range scripts { - builtPkgs, _, err := buildPackage(ctx, script, mgr, clean) + builtPkgs, _, err := buildPackage(ctx, script, mgr, clean, interactive) if err != nil { log.Fatal("Error building package").Err(err).Send() } diff --git a/internal/cliutils/prompt.go b/internal/cliutils/prompt.go index 154a594..c43c8e3 100644 --- a/internal/cliutils/prompt.go +++ b/internal/cliutils/prompt.go @@ -30,23 +30,31 @@ import ( ) // YesNoPrompt asks the user a yes or no question, using def as the default answer -func YesNoPrompt(msg string, def bool, t translate.Translator) (bool, error) { - var answer bool - err := survey.AskOne( - &survey.Confirm{ - Message: t.TranslateTo(msg, config.Language), - Default: def, - }, - &answer, - ) - return answer, err +func YesNoPrompt(msg string, interactive, def bool, t translate.Translator) (bool, error) { + if interactive { + var answer bool + err := survey.AskOne( + &survey.Confirm{ + Message: t.TranslateTo(msg, config.Language), + Default: def, + }, + &answer, + ) + return answer, err + } else { + return def, nil + } } // PromptViewScript asks the user if they'd like to see a script, // shows it if they answer yes, then asks if they'd still like to // continue, and exits if they answer no. -func PromptViewScript(script, name, style string, t translate.Translator) error { - view, err := YesNoPrompt(t.TranslateTo("Would you like to view the build script for", config.Language)+" "+name, false, t) +func PromptViewScript(script, name, style string, interactive bool, t translate.Translator) error { + if !interactive { + return nil + } + + view, err := YesNoPrompt(t.TranslateTo("Would you like to view the build script for", config.Language)+" "+name, interactive, false, t) if err != nil { return err } @@ -57,7 +65,7 @@ func PromptViewScript(script, name, style string, t translate.Translator) error return err } - cont, err := YesNoPrompt("Would you still like to continue?", false, t) + cont, err := YesNoPrompt("Would you still like to continue?", interactive, false, t) if err != nil { return err } @@ -90,16 +98,16 @@ func ShowScript(path, name, style string) error { // FlattenPkgs attempts to flatten the a map of slices of packages into a single slice // of packages by prompting the user if multiple packages match. -func FlattenPkgs(found map[string][]db.Package, verb string, t translate.Translator) []db.Package { +func FlattenPkgs(found map[string][]db.Package, verb string, interactive bool, t translate.Translator) []db.Package { var outPkgs []db.Package for _, pkgs := range found { - if len(pkgs) > 1 { - choices, err := PkgPrompt(pkgs, verb, t) + if len(pkgs) > 1 && interactive { + choices, err := PkgPrompt(pkgs, verb, interactive, t) if err != nil { log.Fatal("Error prompting for choice of package").Send() } outPkgs = append(outPkgs, choices...) - } else if len(pkgs) == 1 { + } else if len(pkgs) == 1 || !interactive { outPkgs = append(outPkgs, pkgs[0]) } } @@ -108,7 +116,11 @@ func FlattenPkgs(found map[string][]db.Package, verb string, t translate.Transla // PkgPrompt asks the user to choose between multiple packages. // The user may choose multiple packages. -func PkgPrompt(options []db.Package, verb string, t translate.Translator) ([]db.Package, error) { +func PkgPrompt(options []db.Package, verb string, interactive bool, t translate.Translator) ([]db.Package, error) { + if !interactive { + return []db.Package{options[0]}, nil + } + names := make([]string, len(options)) for i, option := range options { names[i] = option.Repository + "/" + option.Name + " " + option.Version diff --git a/main.go b/main.go index c3c321a..7668bfd 100644 --- a/main.go +++ b/main.go @@ -28,6 +28,7 @@ import ( "syscall" "time" + "github.com/mattn/go-isatty" "github.com/urfave/cli/v2" "go.arsenm.dev/logger" "go.arsenm.dev/logger/log" @@ -81,6 +82,12 @@ func main() { Aliases: []string{"P"}, Usage: "Arguments to be passed on to the package manager", }, + &cli.BoolFlag{ + Name: "interactive", + Aliases: []string{"i"}, + Value: isatty.IsTerminal(os.Stdin.Fd()), + Usage: "Enable interactive questions and prompts", + }, }, Commands: []*cli.Command{ { diff --git a/upgrade.go b/upgrade.go index eceea59..1b6c54f 100644 --- a/upgrade.go +++ b/upgrade.go @@ -55,7 +55,7 @@ func upgradeCmd(c *cli.Context) error { } if len(updates) > 0 { - installPkgs(c.Context, updates, nil, mgr, c.Bool("clean")) + installPkgs(c.Context, updates, nil, mgr, c.Bool("clean"), c.Bool("interactive")) } else { log.Info("There is nothing to do.").Send() }