diff --git a/cli/app/logs.go b/cli/app/logs.go index 008be8f7..b1cd992c 100644 --- a/cli/app/logs.go +++ b/cli/app/logs.go @@ -84,7 +84,11 @@ var appLogsCommand = cli.Command{ Before: internal.SubCommandBefore, BashComplete: autocomplete.AppNameComplete, Action: func(c *cli.Context) error { - conf := runtime.New(runtime.WithOffline(internal.Offline)) + conf := runtime.New( + runtime.WithOffline(internal.Offline), + runtime.WithEnsureRecipeExists(false), + ) + app := internal.ValidateApp(c, conf) cl, err := client.New(app.Server) diff --git a/cli/app/new.go b/cli/app/new.go index 40927d1f..ac8e194c 100644 --- a/cli/app/new.go +++ b/cli/app/new.go @@ -58,7 +58,11 @@ var appNewCommand = cli.Command{ Before: internal.SubCommandBefore, ArgsUsage: "[]", Action: func(c *cli.Context) error { - conf := runtime.New(runtime.WithOffline(internal.Offline)) + conf := runtime.New( + runtime.WithOffline(internal.Offline), + runtime.WithEnsureRecipeUpToDate(false), + ) + recipe := internal.ValidateRecipeWithPrompt(c, conf) if err := recipePkg.EnsureUpToDate(recipe.Name, conf); err != nil { diff --git a/cli/recipe/release.go b/cli/recipe/release.go index 01c109f1..82d490f4 100644 --- a/cli/recipe/release.go +++ b/cli/recipe/release.go @@ -60,7 +60,11 @@ your SSH keys configured on your account. Before: internal.SubCommandBefore, BashComplete: autocomplete.RecipeNameComplete, Action: func(c *cli.Context) error { - conf := runtime.New(runtime.WithOffline(internal.Offline)) + conf := runtime.New( + runtime.WithOffline(internal.Offline), + runtime.WithEnsureRecipeUpToDate(false), + ) + recipe := internal.ValidateRecipeWithPrompt(c, conf) imagesTmp, err := getImageVersions(recipe) diff --git a/cli/recipe/sync.go b/cli/recipe/sync.go index b6576237..39f4189d 100644 --- a/cli/recipe/sync.go +++ b/cli/recipe/sync.go @@ -43,7 +43,11 @@ auto-generate it for you. The configuration will be updated on the local file system. `, Action: func(c *cli.Context) error { - conf := runtime.New(runtime.WithOffline(internal.Offline)) + conf := runtime.New( + runtime.WithOffline(internal.Offline), + runtime.WithEnsureRecipeUpToDate(false), + ) + recipe := internal.ValidateRecipeWithPrompt(c, conf) mainApp, err := internal.GetMainAppImage(recipe) diff --git a/cli/recipe/version.go b/cli/recipe/version.go index b42afb94..4852a93f 100644 --- a/cli/recipe/version.go +++ b/cli/recipe/version.go @@ -22,7 +22,11 @@ var recipeVersionCommand = cli.Command{ Before: internal.SubCommandBefore, BashComplete: autocomplete.RecipeNameComplete, Action: func(c *cli.Context) error { - conf := runtime.New(runtime.WithOffline(internal.Offline)) + conf := runtime.New( + runtime.WithOffline(internal.Offline), + runtime.WithEnsureRecipeUpToDate(false), + ) + recipe := internal.ValidateRecipe(c, conf) catalogue, err := recipePkg.ReadRecipeCatalogue(conf) diff --git a/pkg/recipe/recipe.go b/pkg/recipe/recipe.go index 64ce637b..2b0a9fde 100644 --- a/pkg/recipe/recipe.go +++ b/pkg/recipe/recipe.go @@ -252,6 +252,11 @@ func Get(recipeName string, conf *runtime.Config) (Recipe, error) { // EnsureExists ensures that a recipe is locally cloned func EnsureExists(recipeName string, conf *runtime.Config) error { + if !conf.RecipeExists { + logrus.Debug("skipping ensuring recipe locally exists") + return nil + } + recipeDir := path.Join(config.RECIPES_DIR, recipeName) if _, err := os.Stat(recipeDir); os.IsNotExist(err) { @@ -339,6 +344,11 @@ func EnsureVersion(recipeName, version string) error { // EnsureLatest makes sure the latest commit is checked out for a local recipe repository func EnsureLatest(recipeName string, conf *runtime.Config) error { + if !conf.RecipeLatest { + logrus.Debug("skipping ensuring recipe is synced with remote") + return nil + } + recipeDir := path.Join(config.RECIPES_DIR, recipeName) isClean, err := gitPkg.IsClean(recipeDir) @@ -584,6 +594,11 @@ func GetStringInBetween(recipeName, str, start, end string) (result string, err // EnsureUpToDate ensures that the local repo is synced to the remote func EnsureUpToDate(recipeName string, conf *runtime.Config) error { + if !conf.RecipeLatest { + logrus.Debug("skipping ensuring recipe is synced with remote") + return nil + } + recipeDir := path.Join(config.RECIPES_DIR, recipeName) isClean, err := gitPkg.IsClean(recipeDir) diff --git a/pkg/runtime/config.go b/pkg/runtime/config.go index d4518203..cd0fa2a9 100644 --- a/pkg/runtime/config.go +++ b/pkg/runtime/config.go @@ -2,14 +2,23 @@ package runtime import "github.com/sirupsen/logrus" +// Config is a runtime behaviour modifier. type Config struct { - Offline bool + Offline bool // Whether or not Abra should prefer local / offline access + RecipeExists bool // Whether or not Abra should ensure the recipe is locally cloned + RecipeLatest bool // Whether or not Abra should ensure the recipe has the latest commit } +// Option is a runtime configuration option. type Option func(c *Config) +// New creates a new runtime configuration. func New(opts ...Option) *Config { - conf := &Config{Offline: false} + conf := &Config{ + Offline: false, + RecipeExists: true, + RecipeLatest: true, + } for _, optFunc := range opts { optFunc(conf) @@ -18,6 +27,8 @@ func New(opts ...Option) *Config { return conf } +// WithOffline ensures Abra attempts to prefer local file system and offline +// access. func WithOffline(offline bool) Option { return func(c *Config) { if offline { @@ -26,3 +37,23 @@ func WithOffline(offline bool) Option { c.Offline = offline } } + +// WithEnsureRecipeExists ensures recipe exists locally. +func WithEnsureRecipeExists(exists bool) Option { + return func(c *Config) { + if exists { + logrus.Debugf("runtime config: ensuring recipe exists") + } + c.RecipeExists = exists + } +} + +// WithEnsureRecipeUpToDate ensures recipe is synced with the remote. +func WithEnsureRecipeUpToDate(upToDate bool) Option { + return func(c *Config) { + if upToDate { + logrus.Debugf("runtime config: ensuring recipe is synced with remote") + } + c.RecipeLatest = upToDate + } +}