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  }