github.com/criteo/command-launcher@v0.0.0-20230407142452-fb616f546e98/cmd/update.go (about)

     1  package cmd
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/criteo/command-launcher/internal/config"
     7  	"github.com/criteo/command-launcher/internal/console"
     8  	"github.com/criteo/command-launcher/internal/context"
     9  	"github.com/criteo/command-launcher/internal/repository"
    10  	"github.com/criteo/command-launcher/internal/updater"
    11  	"github.com/criteo/command-launcher/internal/user"
    12  	log "github.com/sirupsen/logrus"
    13  	"github.com/spf13/cobra"
    14  	"github.com/spf13/viper"
    15  )
    16  
    17  type UpdateFlags struct {
    18  	Package bool
    19  	Self    bool
    20  }
    21  
    22  var (
    23  	updateFlags = UpdateFlags{}
    24  )
    25  
    26  func AddUpdateCmd(rootCmd *cobra.Command, appCtx context.LauncherContext, localRepo repository.PackageRepository) {
    27  	appName := appCtx.AppName()
    28  	updateCmd := &cobra.Command{
    29  		Use:   "update",
    30  		Short: fmt.Sprintf("Update %s, or its commands", appName),
    31  		Long: fmt.Sprintf(`
    32  Check the update of %s and its commands.
    33  `, appName),
    34  		Example: fmt.Sprintf(`
    35    %s update --package
    36    %s update --self
    37  `, appName, appName),
    38  		RunE: func(cmd *cobra.Command, args []string) error {
    39  			u, err := user.GetUser()
    40  			if err != nil {
    41  				log.Errorln(err)
    42  			}
    43  
    44  			if updateFlags.Self {
    45  				console.Highlight("checking available %s version ...", appCtx.AppName())
    46  				selfUpdater := updater.SelfUpdater{
    47  					BinaryName:        appCtx.AppName(),
    48  					LatestVersionUrl:  viper.GetString(config.SELF_UPDATE_LATEST_VERSION_URL_KEY),
    49  					SelfUpdateRootUrl: viper.GetString(config.SELF_UPDATE_BASE_URL_KEY),
    50  					User:              u,
    51  					CurrentVersion:    appCtx.AppVersion(),
    52  					Timeout:           viper.GetDuration(config.SELF_UPDATE_TIMEOUT_KEY),
    53  				}
    54  				selfUpdater.CheckUpdateAsync()
    55  				err := selfUpdater.Update()
    56  				if err != nil {
    57  					console.Error(err.Error())
    58  				} else {
    59  					console.Success("%s is up-to-date", appCtx.AppName())
    60  				}
    61  			}
    62  
    63  			if updateFlags.Package {
    64  				console.Highlight("checking available package updates ...")
    65  				enableCI := viper.GetBool(config.CI_ENABLED_KEY)
    66  				packageLockFile := viper.GetString(config.PACKAGE_LOCK_FILE_KEY)
    67  				if enableCI {
    68  					fmt.Printf("CI mode enabled, load package lock file: %s\n", packageLockFile)
    69  				}
    70  				cmdUpdater := updater.CmdUpdater{
    71  					LocalRepo:            localRepo,
    72  					CmdRepositoryBaseUrl: viper.GetString(config.COMMAND_REPOSITORY_BASE_URL_KEY),
    73  					User:                 u,
    74  					Timeout:              viper.GetDuration(config.SELF_UPDATE_TIMEOUT_KEY),
    75  					EnableCI:             enableCI,
    76  					PackageLockFile:      packageLockFile,
    77  				}
    78  				cmdUpdater.CheckUpdateAsync()
    79  				err := cmdUpdater.Update()
    80  				if err != nil {
    81  					console.Error(err.Error())
    82  				} else {
    83  					console.Success("packages are up-to-date")
    84  				}
    85  			}
    86  
    87  			if !updateFlags.Package && !updateFlags.Self {
    88  				cmd.Help()
    89  			}
    90  
    91  			return nil
    92  		},
    93  	}
    94  
    95  	updateCmd.Flags().BoolVarP(&updateFlags.Package, "package", "p", false, "Update packages and commands")
    96  	updateCmd.Flags().BoolVarP(&updateFlags.Self, "self", "s", false, "Self update")
    97  
    98  	rootCmd.AddCommand(updateCmd)
    99  }