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  }