github.com/Benchkram/bob@v0.0.0-20220321080157-7c8f3876e225/cli/cmd_build.go (about) 1 package cli 2 3 import ( 4 "context" 5 "errors" 6 "os" 7 "os/signal" 8 "strconv" 9 "syscall" 10 11 "github.com/Benchkram/bob/pkg/usererror" 12 13 "github.com/Benchkram/bob/bob" 14 "github.com/Benchkram/bob/bob/bobfile" 15 "github.com/Benchkram/bob/bob/global" 16 "github.com/Benchkram/bob/pkg/boblog" 17 "github.com/Benchkram/errz" 18 19 "github.com/spf13/cobra" 20 ) 21 22 var buildCmd = &cobra.Command{ 23 Use: "build", 24 Short: "Run tasks", 25 Args: cobra.MinimumNArgs(0), 26 Long: ``, 27 FParseErrWhitelist: cobra.FParseErrWhitelist{ 28 UnknownFlags: true, 29 }, 30 Run: func(cmd *cobra.Command, args []string) { 31 dummy, err := strconv.ParseBool(cmd.Flag("dummy").Value.String()) 32 errz.Fatal(err) 33 34 noCache, err := cmd.Flags().GetBool("no-cache") 35 errz.Fatal(err) 36 37 taskname := global.DefaultBuildTask 38 if len(args) > 0 { 39 taskname = args[0] 40 } 41 42 runBuild(dummy, taskname, noCache) 43 }, 44 ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { 45 tasks, err := getTasks() 46 if err != nil { 47 return nil, cobra.ShellCompDirectiveError 48 } 49 50 return tasks, cobra.ShellCompDirectiveDefault 51 }, 52 } 53 54 var buildListCmd = &cobra.Command{ 55 Use: "ls", 56 Short: "ls", 57 Long: ``, 58 Run: func(cmd *cobra.Command, args []string) { 59 runBuildList() 60 }, 61 } 62 63 func runBuild(dummy bool, taskname string, noCache bool) { 64 var exitCode int 65 defer func() { os.Exit(exitCode) }() 66 defer errz.Recover() 67 68 if dummy { 69 wd, err := os.Getwd() 70 errz.Fatal(err) 71 err = bobfile.CreateDummyBobfile(wd, false) 72 errz.Fatal(err) 73 return 74 } 75 76 b, err := bob.Bob( 77 bob.WithCachingEnabled(!noCache), 78 ) 79 if err != nil { 80 exitCode = 1 81 errz.Fatal(err) 82 } 83 84 ctx, cancel := context.WithCancel(context.Background()) 85 defer cancel() 86 87 go func() { 88 stop := make(chan os.Signal, 1) 89 signal.Notify(stop, os.Interrupt, syscall.SIGTERM) 90 91 <-stop 92 cancel() 93 }() 94 95 err = b.Build(ctx, taskname) 96 if err != nil { 97 exitCode = 1 98 if errors.As(err, &usererror.Err) { 99 boblog.Log.UserError(err) 100 } else { 101 errz.Fatal(err) 102 } 103 } 104 } 105 106 func runBuildList() { 107 b, err := bob.Bob() 108 boblog.Log.Error(err, "Unable to initialize bob") 109 110 err = b.List() 111 boblog.Log.Error(err, "Unable to aggregate bob file") 112 } 113 114 func getTasks() ([]string, error) { 115 b, err := bob.Bob() 116 if err != nil { 117 return nil, err 118 } 119 return b.GetList() 120 }