github.com/Benchkram/bob@v0.0.0-20220321080157-7c8f3876e225/cli/cmd_run.go (about) 1 package cli 2 3 import ( 4 "context" 5 6 "github.com/Benchkram/bob/pkg/boblog" 7 "github.com/Benchkram/bob/pkg/usererror" 8 "github.com/Benchkram/bob/tui" 9 "github.com/pkg/errors" 10 11 "github.com/Benchkram/bob/bob" 12 "github.com/Benchkram/bob/bob/global" 13 "github.com/Benchkram/errz" 14 "github.com/spf13/cobra" 15 ) 16 17 var runCmd = &cobra.Command{ 18 Use: "run", 19 Short: "Run interactive tasks", 20 Args: cobra.MinimumNArgs(0), 21 Long: ``, 22 Run: func(cmd *cobra.Command, args []string) { 23 taskname := global.DefaultBuildTask 24 if len(args) > 0 { 25 taskname = args[0] 26 } 27 28 noCache, err := cmd.Flags().GetBool("no-cache") 29 errz.Fatal(err) 30 31 run(taskname, noCache) 32 }, 33 ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { 34 tasks, err := getRuns() 35 if err != nil { 36 return nil, cobra.ShellCompDirectiveError 37 } 38 return tasks, cobra.ShellCompDirectiveDefault 39 }, 40 } 41 42 func run(taskname string, noCache bool) { 43 var err error 44 defer errz.Recover(&err) 45 46 b, err := bob.Bob( 47 bob.WithCachingEnabled(!noCache), 48 ) 49 errz.Fatal(err) 50 51 ctx, cancel := context.WithCancel(context.Background()) 52 defer cancel() 53 54 t, err := tui.New() 55 if err != nil { 56 errz.Log(err) 57 58 return 59 } 60 defer t.Restore() 61 62 commander, err := b.Run(ctx, taskname) 63 if err != nil { 64 switch err { 65 case bob.ErrNoRebuildRequired: 66 default: 67 if errors.As(err, &usererror.Err) { 68 boblog.Log.UserError(err) 69 return 70 } else { 71 errz.Fatal(err) 72 } 73 } 74 } 75 76 if commander != nil { 77 t.Start(commander) 78 } 79 80 cancel() 81 82 if commander != nil { 83 <-commander.Done() 84 } 85 } 86 87 func getRuns() ([]string, error) { 88 b, err := bob.Bob() 89 if err != nil { 90 return nil, err 91 } 92 return b.GetRunList() 93 }