forked from toolshed/abra
		
	Compare commits
	
		
			8 Commits
		
	
	
		
			recipe-ini
			...
			upgrade-cl
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| b81f5651d3 | |||
| 7d80f4d56b | |||
| 114bdc5ce9 | |||
| 40c0fb4bac | |||
| 8a7d17f37b | |||
| deb4293fba | |||
| ac39d6ab97 | |||
| 428426b6b7 | 
@ -1,7 +1,7 @@
 | 
				
			|||||||
package app
 | 
					package app
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var AppCommand = cli.Command{
 | 
					var AppCommand = cli.Command{
 | 
				
			||||||
@ -10,28 +10,28 @@ var AppCommand = cli.Command{
 | 
				
			|||||||
	Usage:       "Manage apps",
 | 
						Usage:       "Manage apps",
 | 
				
			||||||
	ArgsUsage:   "<domain>",
 | 
						ArgsUsage:   "<domain>",
 | 
				
			||||||
	Description: "Functionality for managing the life cycle of your apps",
 | 
						Description: "Functionality for managing the life cycle of your apps",
 | 
				
			||||||
	Subcommands: []cli.Command{
 | 
						Subcommands: []*cli.Command{
 | 
				
			||||||
		appBackupCommand,
 | 
							&appBackupCommand,
 | 
				
			||||||
		appCheckCommand,
 | 
							&appCheckCommand,
 | 
				
			||||||
		appCmdCommand,
 | 
							&appCmdCommand,
 | 
				
			||||||
		appConfigCommand,
 | 
							&appConfigCommand,
 | 
				
			||||||
		appCpCommand,
 | 
							&appCpCommand,
 | 
				
			||||||
		appDeployCommand,
 | 
							&appDeployCommand,
 | 
				
			||||||
		appErrorsCommand,
 | 
							&appErrorsCommand,
 | 
				
			||||||
		appListCommand,
 | 
							&appListCommand,
 | 
				
			||||||
		appLogsCommand,
 | 
							&appLogsCommand,
 | 
				
			||||||
		appNewCommand,
 | 
							&appNewCommand,
 | 
				
			||||||
		appPsCommand,
 | 
							&appPsCommand,
 | 
				
			||||||
		appRemoveCommand,
 | 
							&appRemoveCommand,
 | 
				
			||||||
		appRestartCommand,
 | 
							&appRestartCommand,
 | 
				
			||||||
		appRestoreCommand,
 | 
							&appRestoreCommand,
 | 
				
			||||||
		appRollbackCommand,
 | 
							&appRollbackCommand,
 | 
				
			||||||
		appRunCommand,
 | 
							&appRunCommand,
 | 
				
			||||||
		appSecretCommand,
 | 
							&appSecretCommand,
 | 
				
			||||||
		appServicesCommand,
 | 
							&appServicesCommand,
 | 
				
			||||||
		appUndeployCommand,
 | 
							&appUndeployCommand,
 | 
				
			||||||
		appUpgradeCommand,
 | 
							&appUpgradeCommand,
 | 
				
			||||||
		appVersionCommand,
 | 
							&appVersionCommand,
 | 
				
			||||||
		appVolumeCommand,
 | 
							&appVolumeCommand,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -8,7 +8,7 @@ import (
 | 
				
			|||||||
	"coopcloud.tech/abra/pkg/client"
 | 
						"coopcloud.tech/abra/pkg/client"
 | 
				
			||||||
	"coopcloud.tech/abra/pkg/recipe"
 | 
						"coopcloud.tech/abra/pkg/recipe"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var snapshot string
 | 
					var snapshot string
 | 
				
			||||||
@ -287,10 +287,10 @@ var appBackupCommand = cli.Command{
 | 
				
			|||||||
	Aliases:   []string{"b"},
 | 
						Aliases:   []string{"b"},
 | 
				
			||||||
	Usage:     "Manage app backups",
 | 
						Usage:     "Manage app backups",
 | 
				
			||||||
	ArgsUsage: "<domain>",
 | 
						ArgsUsage: "<domain>",
 | 
				
			||||||
	Subcommands: []cli.Command{
 | 
						Subcommands: []*cli.Command{
 | 
				
			||||||
		appBackupListCommand,
 | 
							&appBackupListCommand,
 | 
				
			||||||
		appBackupSnapshotsCommand,
 | 
							&appBackupSnapshotsCommand,
 | 
				
			||||||
		appBackupDownloadCommand,
 | 
							&appBackupDownloadCommand,
 | 
				
			||||||
		appBackupCreateCommand,
 | 
							&appBackupCreateCommand,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -8,7 +8,7 @@ import (
 | 
				
			|||||||
	"coopcloud.tech/abra/pkg/recipe"
 | 
						"coopcloud.tech/abra/pkg/recipe"
 | 
				
			||||||
	recipePkg "coopcloud.tech/abra/pkg/recipe"
 | 
						recipePkg "coopcloud.tech/abra/pkg/recipe"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var appCheckCommand = cli.Command{
 | 
					var appCheckCommand = cli.Command{
 | 
				
			||||||
 | 
				
			|||||||
@ -17,7 +17,7 @@ import (
 | 
				
			|||||||
	"coopcloud.tech/abra/pkg/recipe"
 | 
						"coopcloud.tech/abra/pkg/recipe"
 | 
				
			||||||
	recipePkg "coopcloud.tech/abra/pkg/recipe"
 | 
						recipePkg "coopcloud.tech/abra/pkg/recipe"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var appCmdCommand = cli.Command{
 | 
					var appCmdCommand = cli.Command{
 | 
				
			||||||
@ -45,10 +45,10 @@ Example:
 | 
				
			|||||||
		internal.ChaosFlag,
 | 
							internal.ChaosFlag,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	Before:      internal.SubCommandBefore,
 | 
						Before:      internal.SubCommandBefore,
 | 
				
			||||||
	Subcommands: []cli.Command{appCmdListCommand},
 | 
						Subcommands: []*cli.Command{&appCmdListCommand},
 | 
				
			||||||
	BashComplete: func(ctx *cli.Context) {
 | 
						BashComplete: func(ctx *cli.Context) {
 | 
				
			||||||
		args := ctx.Args()
 | 
							args := ctx.Args()
 | 
				
			||||||
		switch len(args) {
 | 
							switch args.Len() {
 | 
				
			||||||
		case 0:
 | 
							case 0:
 | 
				
			||||||
			autocomplete.AppNameComplete(ctx)
 | 
								autocomplete.AppNameComplete(ctx)
 | 
				
			||||||
		case 1:
 | 
							case 1:
 | 
				
			||||||
@ -84,7 +84,7 @@ Example:
 | 
				
			|||||||
			internal.ShowSubcommandHelpAndError(c, errors.New("cannot use --local & --user together"))
 | 
								internal.ShowSubcommandHelpAndError(c, errors.New("cannot use --local & --user together"))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		hasCmdArgs, parsedCmdArgs := parseCmdArgs(c.Args(), internal.LocalCmd)
 | 
							hasCmdArgs, parsedCmdArgs := parseCmdArgs(c.Args().Slice())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		abraSh := path.Join(config.RECIPES_DIR, app.Recipe, "abra.sh")
 | 
							abraSh := path.Join(config.RECIPES_DIR, app.Recipe, "abra.sh")
 | 
				
			||||||
		if _, err := os.Stat(abraSh); err != nil {
 | 
							if _, err := os.Stat(abraSh); err != nil {
 | 
				
			||||||
@ -95,7 +95,7 @@ Example:
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if internal.LocalCmd {
 | 
							if internal.LocalCmd {
 | 
				
			||||||
			if !(len(c.Args()) >= 2) {
 | 
								if !(c.Args().Len() >= 2) {
 | 
				
			||||||
				internal.ShowSubcommandHelpAndError(c, errors.New("missing arguments"))
 | 
									internal.ShowSubcommandHelpAndError(c, errors.New("missing arguments"))
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -131,7 +131,7 @@ Example:
 | 
				
			|||||||
				logrus.Fatal(err)
 | 
									logrus.Fatal(err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			if !(len(c.Args()) >= 3) {
 | 
								if !(c.Args().Len() >= 3) {
 | 
				
			||||||
				internal.ShowSubcommandHelpAndError(c, errors.New("missing arguments"))
 | 
									internal.ShowSubcommandHelpAndError(c, errors.New("missing arguments"))
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -180,23 +180,16 @@ Example:
 | 
				
			|||||||
	},
 | 
						},
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func parseCmdArgs(args []string, isLocal bool) (bool, string) {
 | 
					// Parse the command arguments from the cli args.
 | 
				
			||||||
	var (
 | 
					// Arguments should look like this:
 | 
				
			||||||
		parsedCmdArgs string
 | 
					//
 | 
				
			||||||
		hasCmdArgs    bool
 | 
					//	DOMAIN COMMAND -- ARGUMENT1 ARGUMENT2 ...
 | 
				
			||||||
	)
 | 
					func parseCmdArgs(args []string) (bool, string) {
 | 
				
			||||||
 | 
						if len(args) < 4 {
 | 
				
			||||||
	if isLocal {
 | 
							return false, ""
 | 
				
			||||||
		if len(args) > 2 {
 | 
					 | 
				
			||||||
			return true, fmt.Sprintf("%s ", strings.Join(args[2:], " "))
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	} else {
 | 
					
 | 
				
			||||||
		if len(args) > 3 {
 | 
					 | 
				
			||||||
	return true, fmt.Sprintf("%s ", strings.Join(args[3:], " "))
 | 
						return true, fmt.Sprintf("%s ", strings.Join(args[3:], " "))
 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return hasCmdArgs, parsedCmdArgs
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func cmdNameComplete(appName string) {
 | 
					func cmdNameComplete(appName string) {
 | 
				
			||||||
 | 
				
			|||||||
@ -20,7 +20,7 @@ func TestParseCmdArgs(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, test := range tests {
 | 
						for _, test := range tests {
 | 
				
			||||||
		ok, parsed := parseCmdArgs(test.input, false)
 | 
							ok, parsed := parseCmdArgs(test.input)
 | 
				
			||||||
		if ok != test.shouldParse {
 | 
							if ok != test.shouldParse {
 | 
				
			||||||
			t.Fatalf("[%s] should not parse", strings.Join(test.input, " "))
 | 
								t.Fatalf("[%s] should not parse", strings.Join(test.input, " "))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
				
			|||||||
@ -10,7 +10,7 @@ import (
 | 
				
			|||||||
	"coopcloud.tech/abra/pkg/config"
 | 
						"coopcloud.tech/abra/pkg/config"
 | 
				
			||||||
	"github.com/AlecAivazis/survey/v2"
 | 
						"github.com/AlecAivazis/survey/v2"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var appConfigCommand = cli.Command{
 | 
					var appConfigCommand = cli.Command{
 | 
				
			||||||
 | 
				
			|||||||
@ -22,7 +22,7 @@ import (
 | 
				
			|||||||
	"github.com/docker/docker/errdefs"
 | 
						"github.com/docker/docker/errdefs"
 | 
				
			||||||
	"github.com/docker/docker/pkg/archive"
 | 
						"github.com/docker/docker/pkg/archive"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var appCpCommand = cli.Command{
 | 
					var appCpCommand = cli.Command{
 | 
				
			||||||
 | 
				
			|||||||
@ -17,7 +17,7 @@ import (
 | 
				
			|||||||
	"coopcloud.tech/abra/pkg/recipe"
 | 
						"coopcloud.tech/abra/pkg/recipe"
 | 
				
			||||||
	"coopcloud.tech/abra/pkg/upstream/stack"
 | 
						"coopcloud.tech/abra/pkg/upstream/stack"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var appDeployCommand = cli.Command{
 | 
					var appDeployCommand = cli.Command{
 | 
				
			||||||
 | 
				
			|||||||
@ -17,7 +17,7 @@ import (
 | 
				
			|||||||
	"github.com/docker/docker/api/types/filters"
 | 
						"github.com/docker/docker/api/types/filters"
 | 
				
			||||||
	dockerClient "github.com/docker/docker/client"
 | 
						dockerClient "github.com/docker/docker/client"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var appErrorsCommand = cli.Command{
 | 
					var appErrorsCommand = cli.Command{
 | 
				
			||||||
 | 
				
			|||||||
@ -13,19 +13,21 @@ import (
 | 
				
			|||||||
	"coopcloud.tech/abra/pkg/recipe"
 | 
						"coopcloud.tech/abra/pkg/recipe"
 | 
				
			||||||
	"coopcloud.tech/tagcmp"
 | 
						"coopcloud.tech/tagcmp"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var status bool
 | 
					var status bool
 | 
				
			||||||
var statusFlag = &cli.BoolFlag{
 | 
					var statusFlag = &cli.BoolFlag{
 | 
				
			||||||
	Name:        "status, S",
 | 
						Name:        "status",
 | 
				
			||||||
 | 
						Aliases:     []string{"S"},
 | 
				
			||||||
	Usage:       "Show app deployment status",
 | 
						Usage:       "Show app deployment status",
 | 
				
			||||||
	Destination: &status,
 | 
						Destination: &status,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var recipeFilter string
 | 
					var recipeFilter string
 | 
				
			||||||
var recipeFlag = &cli.StringFlag{
 | 
					var recipeFlag = &cli.StringFlag{
 | 
				
			||||||
	Name:        "recipe, r",
 | 
						Name:        "recipe",
 | 
				
			||||||
 | 
						Aliases:     []string{"r"},
 | 
				
			||||||
	Value:       "",
 | 
						Value:       "",
 | 
				
			||||||
	Usage:       "Show apps of a specific recipe",
 | 
						Usage:       "Show apps of a specific recipe",
 | 
				
			||||||
	Destination: &recipeFilter,
 | 
						Destination: &recipeFilter,
 | 
				
			||||||
@ -33,7 +35,8 @@ var recipeFlag = &cli.StringFlag{
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
var listAppServer string
 | 
					var listAppServer string
 | 
				
			||||||
var listAppServerFlag = &cli.StringFlag{
 | 
					var listAppServerFlag = &cli.StringFlag{
 | 
				
			||||||
	Name:        "server, s",
 | 
						Name:        "server",
 | 
				
			||||||
 | 
						Aliases:     []string{"s"},
 | 
				
			||||||
	Value:       "",
 | 
						Value:       "",
 | 
				
			||||||
	Usage:       "Show apps of a specific server",
 | 
						Usage:       "Show apps of a specific server",
 | 
				
			||||||
	Destination: &listAppServer,
 | 
						Destination: &listAppServer,
 | 
				
			||||||
 | 
				
			|||||||
@ -19,7 +19,7 @@ import (
 | 
				
			|||||||
	"github.com/docker/docker/api/types/swarm"
 | 
						"github.com/docker/docker/api/types/swarm"
 | 
				
			||||||
	dockerClient "github.com/docker/docker/client"
 | 
						dockerClient "github.com/docker/docker/client"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var appLogsCommand = cli.Command{
 | 
					var appLogsCommand = cli.Command{
 | 
				
			||||||
 | 
				
			|||||||
@ -16,7 +16,7 @@ import (
 | 
				
			|||||||
	"github.com/AlecAivazis/survey/v2"
 | 
						"github.com/AlecAivazis/survey/v2"
 | 
				
			||||||
	dockerClient "github.com/docker/docker/client"
 | 
						dockerClient "github.com/docker/docker/client"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var appNewDescription = `
 | 
					var appNewDescription = `
 | 
				
			||||||
@ -58,7 +58,7 @@ var appNewCommand = cli.Command{
 | 
				
			|||||||
	ArgsUsage: "[<recipe>] [<version>]",
 | 
						ArgsUsage: "[<recipe>] [<version>]",
 | 
				
			||||||
	BashComplete: func(ctx *cli.Context) {
 | 
						BashComplete: func(ctx *cli.Context) {
 | 
				
			||||||
		args := ctx.Args()
 | 
							args := ctx.Args()
 | 
				
			||||||
		switch len(args) {
 | 
							switch args.Len() {
 | 
				
			||||||
		case 0:
 | 
							case 0:
 | 
				
			||||||
			autocomplete.RecipeNameComplete(ctx)
 | 
								autocomplete.RecipeNameComplete(ctx)
 | 
				
			||||||
		case 1:
 | 
							case 1:
 | 
				
			||||||
 | 
				
			|||||||
@ -17,7 +17,7 @@ import (
 | 
				
			|||||||
	"github.com/docker/docker/api/types"
 | 
						"github.com/docker/docker/api/types"
 | 
				
			||||||
	dockerClient "github.com/docker/docker/client"
 | 
						dockerClient "github.com/docker/docker/client"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var appPsCommand = cli.Command{
 | 
					var appPsCommand = cli.Command{
 | 
				
			||||||
 | 
				
			|||||||
@ -15,7 +15,7 @@ import (
 | 
				
			|||||||
	"github.com/docker/docker/api/types"
 | 
						"github.com/docker/docker/api/types"
 | 
				
			||||||
	"github.com/docker/docker/api/types/volume"
 | 
						"github.com/docker/docker/api/types/volume"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var appRemoveCommand = cli.Command{
 | 
					var appRemoveCommand = cli.Command{
 | 
				
			||||||
 | 
				
			|||||||
@ -11,7 +11,7 @@ import (
 | 
				
			|||||||
	upstream "coopcloud.tech/abra/pkg/upstream/service"
 | 
						upstream "coopcloud.tech/abra/pkg/upstream/service"
 | 
				
			||||||
	stack "coopcloud.tech/abra/pkg/upstream/stack"
 | 
						stack "coopcloud.tech/abra/pkg/upstream/stack"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var appRestartCommand = cli.Command{
 | 
					var appRestartCommand = cli.Command{
 | 
				
			||||||
 | 
				
			|||||||
@ -8,7 +8,7 @@ import (
 | 
				
			|||||||
	"coopcloud.tech/abra/pkg/client"
 | 
						"coopcloud.tech/abra/pkg/client"
 | 
				
			||||||
	"coopcloud.tech/abra/pkg/recipe"
 | 
						"coopcloud.tech/abra/pkg/recipe"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var targetPath string
 | 
					var targetPath string
 | 
				
			||||||
 | 
				
			|||||||
@ -15,7 +15,7 @@ import (
 | 
				
			|||||||
	"coopcloud.tech/abra/pkg/client"
 | 
						"coopcloud.tech/abra/pkg/client"
 | 
				
			||||||
	"github.com/AlecAivazis/survey/v2"
 | 
						"github.com/AlecAivazis/survey/v2"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var appRollbackCommand = cli.Command{
 | 
					var appRollbackCommand = cli.Command{
 | 
				
			||||||
 | 
				
			|||||||
@ -14,7 +14,7 @@ import (
 | 
				
			|||||||
	"github.com/docker/docker/api/types"
 | 
						"github.com/docker/docker/api/types"
 | 
				
			||||||
	"github.com/docker/docker/api/types/filters"
 | 
						"github.com/docker/docker/api/types/filters"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var user string
 | 
					var user string
 | 
				
			||||||
@ -45,11 +45,11 @@ var appRunCommand = cli.Command{
 | 
				
			|||||||
	Action: func(c *cli.Context) error {
 | 
						Action: func(c *cli.Context) error {
 | 
				
			||||||
		app := internal.ValidateApp(c)
 | 
							app := internal.ValidateApp(c)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if len(c.Args()) < 2 {
 | 
							if c.Args().Len() < 2 {
 | 
				
			||||||
			internal.ShowSubcommandHelpAndError(c, errors.New("no <service> provided?"))
 | 
								internal.ShowSubcommandHelpAndError(c, errors.New("no <service> provided?"))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if len(c.Args()) < 3 {
 | 
							if c.Args().Len() < 3 {
 | 
				
			||||||
			internal.ShowSubcommandHelpAndError(c, errors.New("no <args> provided?"))
 | 
								internal.ShowSubcommandHelpAndError(c, errors.New("no <args> provided?"))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -68,7 +68,7 @@ var appRunCommand = cli.Command{
 | 
				
			|||||||
			logrus.Fatal(err)
 | 
								logrus.Fatal(err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		cmd := c.Args()[2:]
 | 
							cmd := c.Args().Slice()[2:]
 | 
				
			||||||
		execCreateOpts := types.ExecConfig{
 | 
							execCreateOpts := types.ExecConfig{
 | 
				
			||||||
			AttachStderr: true,
 | 
								AttachStderr: true,
 | 
				
			||||||
			AttachStdin:  true,
 | 
								AttachStdin:  true,
 | 
				
			||||||
 | 
				
			|||||||
@ -17,7 +17,7 @@ import (
 | 
				
			|||||||
	"github.com/docker/docker/api/types"
 | 
						"github.com/docker/docker/api/types"
 | 
				
			||||||
	dockerClient "github.com/docker/docker/client"
 | 
						dockerClient "github.com/docker/docker/client"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
@ -76,7 +76,7 @@ var appSecretGenerateCommand = cli.Command{
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if len(c.Args()) == 1 && !allSecrets {
 | 
							if c.Args().Len() == 1 && !allSecrets {
 | 
				
			||||||
			err := errors.New("missing arguments <secret>/<version> or '--all'")
 | 
								err := errors.New("missing arguments <secret>/<version> or '--all'")
 | 
				
			||||||
			internal.ShowSubcommandHelpAndError(c, err)
 | 
								internal.ShowSubcommandHelpAndError(c, err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@ -175,7 +175,7 @@ Example:
 | 
				
			|||||||
	Action: func(c *cli.Context) error {
 | 
						Action: func(c *cli.Context) error {
 | 
				
			||||||
		app := internal.ValidateApp(c)
 | 
							app := internal.ValidateApp(c)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if len(c.Args()) != 4 {
 | 
							if c.Args().Len() != 4 {
 | 
				
			||||||
			internal.ShowSubcommandHelpAndError(c, errors.New("missing arguments?"))
 | 
								internal.ShowSubcommandHelpAndError(c, errors.New("missing arguments?"))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -419,10 +419,10 @@ var appSecretCommand = cli.Command{
 | 
				
			|||||||
	Aliases:   []string{"s"},
 | 
						Aliases:   []string{"s"},
 | 
				
			||||||
	Usage:     "Manage app secrets",
 | 
						Usage:     "Manage app secrets",
 | 
				
			||||||
	ArgsUsage: "<domain>",
 | 
						ArgsUsage: "<domain>",
 | 
				
			||||||
	Subcommands: []cli.Command{
 | 
						Subcommands: []*cli.Command{
 | 
				
			||||||
		appSecretGenerateCommand,
 | 
							&appSecretGenerateCommand,
 | 
				
			||||||
		appSecretInsertCommand,
 | 
							&appSecretInsertCommand,
 | 
				
			||||||
		appSecretRmCommand,
 | 
							&appSecretRmCommand,
 | 
				
			||||||
		appSecretLsCommand,
 | 
							&appSecretLsCommand,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -13,7 +13,7 @@ import (
 | 
				
			|||||||
	stack "coopcloud.tech/abra/pkg/upstream/stack"
 | 
						stack "coopcloud.tech/abra/pkg/upstream/stack"
 | 
				
			||||||
	"github.com/docker/docker/api/types"
 | 
						"github.com/docker/docker/api/types"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var appServicesCommand = cli.Command{
 | 
					var appServicesCommand = cli.Command{
 | 
				
			||||||
 | 
				
			|||||||
@ -14,7 +14,7 @@ import (
 | 
				
			|||||||
	"github.com/docker/docker/api/types/filters"
 | 
						"github.com/docker/docker/api/types/filters"
 | 
				
			||||||
	dockerClient "github.com/docker/docker/client"
 | 
						dockerClient "github.com/docker/docker/client"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var prune bool
 | 
					var prune bool
 | 
				
			||||||
 | 
				
			|||||||
@ -15,7 +15,7 @@ import (
 | 
				
			|||||||
	"coopcloud.tech/tagcmp"
 | 
						"coopcloud.tech/tagcmp"
 | 
				
			||||||
	"github.com/AlecAivazis/survey/v2"
 | 
						"github.com/AlecAivazis/survey/v2"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var appUpgradeCommand = cli.Command{
 | 
					var appUpgradeCommand = cli.Command{
 | 
				
			||||||
 | 
				
			|||||||
@ -13,7 +13,7 @@ import (
 | 
				
			|||||||
	"github.com/docker/distribution/reference"
 | 
						"github.com/docker/distribution/reference"
 | 
				
			||||||
	"github.com/olekukonko/tablewriter"
 | 
						"github.com/olekukonko/tablewriter"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func sortServiceByName(versions [][]string) func(i, j int) bool {
 | 
					func sortServiceByName(versions [][]string) func(i, j int) bool {
 | 
				
			||||||
 | 
				
			|||||||
@ -10,7 +10,7 @@ import (
 | 
				
			|||||||
	"coopcloud.tech/abra/pkg/upstream/stack"
 | 
						"coopcloud.tech/abra/pkg/upstream/stack"
 | 
				
			||||||
	"github.com/AlecAivazis/survey/v2"
 | 
						"github.com/AlecAivazis/survey/v2"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var appVolumeListCommand = cli.Command{
 | 
					var appVolumeListCommand = cli.Command{
 | 
				
			||||||
@ -150,8 +150,8 @@ var appVolumeCommand = cli.Command{
 | 
				
			|||||||
	Aliases:   []string{"vl"},
 | 
						Aliases:   []string{"vl"},
 | 
				
			||||||
	Usage:     "Manage app volumes",
 | 
						Usage:     "Manage app volumes",
 | 
				
			||||||
	ArgsUsage: "<domain>",
 | 
						ArgsUsage: "<domain>",
 | 
				
			||||||
	Subcommands: []cli.Command{
 | 
						Subcommands: []*cli.Command{
 | 
				
			||||||
		appVolumeListCommand,
 | 
							&appVolumeListCommand,
 | 
				
			||||||
		appVolumeRemoveCommand,
 | 
							&appVolumeRemoveCommand,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -15,7 +15,7 @@ import (
 | 
				
			|||||||
	"coopcloud.tech/abra/pkg/recipe"
 | 
						"coopcloud.tech/abra/pkg/recipe"
 | 
				
			||||||
	"github.com/go-git/go-git/v5"
 | 
						"github.com/go-git/go-git/v5"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var catalogueGenerateCommand = cli.Command{
 | 
					var catalogueGenerateCommand = cli.Command{
 | 
				
			||||||
@ -217,7 +217,7 @@ var CatalogueCommand = cli.Command{
 | 
				
			|||||||
	Aliases:     []string{"c"},
 | 
						Aliases:     []string{"c"},
 | 
				
			||||||
	ArgsUsage:   "<recipe>",
 | 
						ArgsUsage:   "<recipe>",
 | 
				
			||||||
	Description: "This command helps recipe packagers interact with the recipe catalogue",
 | 
						Description: "This command helps recipe packagers interact with the recipe catalogue",
 | 
				
			||||||
	Subcommands: []cli.Command{
 | 
						Subcommands: []*cli.Command{
 | 
				
			||||||
		catalogueGenerateCommand,
 | 
							&catalogueGenerateCommand,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										16
									
								
								cli/cli.go
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								cli/cli.go
									
									
									
									
									
								
							@ -18,7 +18,7 @@ import (
 | 
				
			|||||||
	"coopcloud.tech/abra/pkg/config"
 | 
						"coopcloud.tech/abra/pkg/config"
 | 
				
			||||||
	"coopcloud.tech/abra/pkg/web"
 | 
						"coopcloud.tech/abra/pkg/web"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// AutoCompleteCommand helps people set up auto-complete in their shells
 | 
					// AutoCompleteCommand helps people set up auto-complete in their shells
 | 
				
			||||||
@ -153,13 +153,13 @@ func newAbraApp(version, commit string) *cli.App {
 | 
				
			|||||||
                         |_|
 | 
					                         |_|
 | 
				
			||||||
`,
 | 
					`,
 | 
				
			||||||
		Version: fmt.Sprintf("%s-%s", version, commit[:7]),
 | 
							Version: fmt.Sprintf("%s-%s", version, commit[:7]),
 | 
				
			||||||
		Commands: []cli.Command{
 | 
							Commands: []*cli.Command{
 | 
				
			||||||
			app.AppCommand,
 | 
								&app.AppCommand,
 | 
				
			||||||
			server.ServerCommand,
 | 
								&server.ServerCommand,
 | 
				
			||||||
			recipe.RecipeCommand,
 | 
								&recipe.RecipeCommand,
 | 
				
			||||||
			catalogue.CatalogueCommand,
 | 
								&catalogue.CatalogueCommand,
 | 
				
			||||||
			UpgradeCommand,
 | 
								&UpgradeCommand,
 | 
				
			||||||
			AutoCompleteCommand,
 | 
								&AutoCompleteCommand,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		BashComplete: autocomplete.SubcommandComplete,
 | 
							BashComplete: autocomplete.SubcommandComplete,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	logrusStack "github.com/Gurpartap/logrus-stack"
 | 
						logrusStack "github.com/Gurpartap/logrus-stack"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Secrets stores the variable from SecretsFlag
 | 
					// Secrets stores the variable from SecretsFlag
 | 
				
			||||||
@ -13,7 +13,8 @@ var Secrets bool
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// SecretsFlag turns on/off automatically generating secrets
 | 
					// SecretsFlag turns on/off automatically generating secrets
 | 
				
			||||||
var SecretsFlag = &cli.BoolFlag{
 | 
					var SecretsFlag = &cli.BoolFlag{
 | 
				
			||||||
	Name:        "secrets, S",
 | 
						Name:        "secrets",
 | 
				
			||||||
 | 
						Aliases:     []string{"S"},
 | 
				
			||||||
	Usage:       "Automatically generate secrets",
 | 
						Usage:       "Automatically generate secrets",
 | 
				
			||||||
	Destination: &Secrets,
 | 
						Destination: &Secrets,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -23,7 +24,8 @@ var Pass bool
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// PassFlag turns on/off storing generated secrets in pass
 | 
					// PassFlag turns on/off storing generated secrets in pass
 | 
				
			||||||
var PassFlag = &cli.BoolFlag{
 | 
					var PassFlag = &cli.BoolFlag{
 | 
				
			||||||
	Name:        "pass, p",
 | 
						Name:        "pass",
 | 
				
			||||||
 | 
						Aliases:     []string{"p"},
 | 
				
			||||||
	Usage:       "Store the generated secrets in a local pass store",
 | 
						Usage:       "Store the generated secrets in a local pass store",
 | 
				
			||||||
	Destination: &Pass,
 | 
						Destination: &Pass,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -33,7 +35,8 @@ var PassRemove bool
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// PassRemoveFlag turns on/off removing generated secrets from pass
 | 
					// PassRemoveFlag turns on/off removing generated secrets from pass
 | 
				
			||||||
var PassRemoveFlag = &cli.BoolFlag{
 | 
					var PassRemoveFlag = &cli.BoolFlag{
 | 
				
			||||||
	Name:        "pass, p",
 | 
						Name:        "pass",
 | 
				
			||||||
 | 
						Aliases:     []string{"p"},
 | 
				
			||||||
	Usage:       "Remove generated secrets from a local pass store",
 | 
						Usage:       "Remove generated secrets from a local pass store",
 | 
				
			||||||
	Destination: &PassRemove,
 | 
						Destination: &PassRemove,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -43,7 +46,8 @@ var Force bool
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// ForceFlag turns on/off force functionality.
 | 
					// ForceFlag turns on/off force functionality.
 | 
				
			||||||
var ForceFlag = &cli.BoolFlag{
 | 
					var ForceFlag = &cli.BoolFlag{
 | 
				
			||||||
	Name:        "force, f",
 | 
						Name:        "force",
 | 
				
			||||||
 | 
						Aliases:     []string{"f"},
 | 
				
			||||||
	Usage:       "Perform action without further prompt. Use with care!",
 | 
						Usage:       "Perform action without further prompt. Use with care!",
 | 
				
			||||||
	Destination: &Force,
 | 
						Destination: &Force,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -53,7 +57,8 @@ var Chaos bool
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// ChaosFlag turns on/off chaos functionality.
 | 
					// ChaosFlag turns on/off chaos functionality.
 | 
				
			||||||
var ChaosFlag = &cli.BoolFlag{
 | 
					var ChaosFlag = &cli.BoolFlag{
 | 
				
			||||||
	Name:        "chaos, C",
 | 
						Name:        "chaos",
 | 
				
			||||||
 | 
						Aliases:     []string{"C"},
 | 
				
			||||||
	Usage:       "Proceed with uncommitted recipes changes. Use with care!",
 | 
						Usage:       "Proceed with uncommitted recipes changes. Use with care!",
 | 
				
			||||||
	Destination: &Chaos,
 | 
						Destination: &Chaos,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -63,24 +68,29 @@ var Tty bool
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// TtyFlag turns on/off tty mode.
 | 
					// TtyFlag turns on/off tty mode.
 | 
				
			||||||
var TtyFlag = &cli.BoolFlag{
 | 
					var TtyFlag = &cli.BoolFlag{
 | 
				
			||||||
	Name:        "tty, T",
 | 
						Name:        "tty",
 | 
				
			||||||
 | 
						Aliases:     []string{"T"},
 | 
				
			||||||
	Usage:       "Disables TTY mode to run this command from a script.",
 | 
						Usage:       "Disables TTY mode to run this command from a script.",
 | 
				
			||||||
	Destination: &Tty,
 | 
						Destination: &Tty,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var NoInput bool
 | 
					var (
 | 
				
			||||||
var NoInputFlag = &cli.BoolFlag{
 | 
						NoInput     bool
 | 
				
			||||||
	Name:        "no-input, n",
 | 
						NoInputFlag = &cli.BoolFlag{
 | 
				
			||||||
 | 
							Name:        "no-input",
 | 
				
			||||||
 | 
							Aliases:     []string{"n"},
 | 
				
			||||||
		Usage:       "Toggle non-interactive mode",
 | 
							Usage:       "Toggle non-interactive mode",
 | 
				
			||||||
		Destination: &NoInput,
 | 
							Destination: &NoInput,
 | 
				
			||||||
}
 | 
						}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Debug stores the variable from DebugFlag.
 | 
					// Debug stores the variable from DebugFlag.
 | 
				
			||||||
var Debug bool
 | 
					var Debug bool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// DebugFlag turns on/off verbose logging down to the DEBUG level.
 | 
					// DebugFlag turns on/off verbose logging down to the DEBUG level.
 | 
				
			||||||
var DebugFlag = &cli.BoolFlag{
 | 
					var DebugFlag = &cli.BoolFlag{
 | 
				
			||||||
	Name:        "debug, d",
 | 
						Name:        "debug",
 | 
				
			||||||
 | 
						Aliases:     []string{"d"},
 | 
				
			||||||
	Destination: &Debug,
 | 
						Destination: &Debug,
 | 
				
			||||||
	Usage:       "Show DEBUG messages",
 | 
						Usage:       "Show DEBUG messages",
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -90,7 +100,8 @@ var Offline bool
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// DebugFlag turns on/off offline mode.
 | 
					// DebugFlag turns on/off offline mode.
 | 
				
			||||||
var OfflineFlag = &cli.BoolFlag{
 | 
					var OfflineFlag = &cli.BoolFlag{
 | 
				
			||||||
	Name:        "offline, o",
 | 
						Name:        "offline",
 | 
				
			||||||
 | 
						Aliases:     []string{"o"},
 | 
				
			||||||
	Destination: &Offline,
 | 
						Destination: &Offline,
 | 
				
			||||||
	Usage:       "Prefer offline & filesystem access when possible",
 | 
						Usage:       "Prefer offline & filesystem access when possible",
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -100,7 +111,8 @@ var MachineReadable bool
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// MachineReadableFlag turns on/off machine readable output where supported
 | 
					// MachineReadableFlag turns on/off machine readable output where supported
 | 
				
			||||||
var MachineReadableFlag = &cli.BoolFlag{
 | 
					var MachineReadableFlag = &cli.BoolFlag{
 | 
				
			||||||
	Name:        "machine, m",
 | 
						Name:        "machine",
 | 
				
			||||||
 | 
						Aliases:     []string{"m"},
 | 
				
			||||||
	Destination: &MachineReadable,
 | 
						Destination: &MachineReadable,
 | 
				
			||||||
	Usage:       "Output in a machine-readable format (where supported)",
 | 
						Usage:       "Output in a machine-readable format (where supported)",
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -110,149 +122,185 @@ var RC bool
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// RCFlag chooses the latest release candidate for install
 | 
					// RCFlag chooses the latest release candidate for install
 | 
				
			||||||
var RCFlag = &cli.BoolFlag{
 | 
					var RCFlag = &cli.BoolFlag{
 | 
				
			||||||
	Name:        "rc, r",
 | 
						Name:        "rc",
 | 
				
			||||||
 | 
						Aliases:     []string{"c"},
 | 
				
			||||||
	Destination: &RC,
 | 
						Destination: &RC,
 | 
				
			||||||
	Usage:       "Install the latest release candidate",
 | 
						Usage:       "Install the latest release candidate",
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var Major bool
 | 
					var (
 | 
				
			||||||
var MajorFlag = &cli.BoolFlag{
 | 
						Major     bool
 | 
				
			||||||
	Name:        "major, x",
 | 
						MajorFlag = &cli.BoolFlag{
 | 
				
			||||||
 | 
							Name:        "major",
 | 
				
			||||||
 | 
							Aliases:     []string{"x"},
 | 
				
			||||||
		Usage:       "Increase the major part of the version",
 | 
							Usage:       "Increase the major part of the version",
 | 
				
			||||||
		Destination: &Major,
 | 
							Destination: &Major,
 | 
				
			||||||
}
 | 
						}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var Minor bool
 | 
					var (
 | 
				
			||||||
var MinorFlag = &cli.BoolFlag{
 | 
						Minor     bool
 | 
				
			||||||
	Name:        "minor, y",
 | 
						MinorFlag = &cli.BoolFlag{
 | 
				
			||||||
 | 
							Name:        "minor",
 | 
				
			||||||
 | 
							Aliases:     []string{"y"},
 | 
				
			||||||
		Usage:       "Increase the minor part of the version",
 | 
							Usage:       "Increase the minor part of the version",
 | 
				
			||||||
		Destination: &Minor,
 | 
							Destination: &Minor,
 | 
				
			||||||
}
 | 
						}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var Patch bool
 | 
					var (
 | 
				
			||||||
var PatchFlag = &cli.BoolFlag{
 | 
						Patch     bool
 | 
				
			||||||
	Name:        "patch, z",
 | 
						PatchFlag = &cli.BoolFlag{
 | 
				
			||||||
 | 
							Name:        "patch",
 | 
				
			||||||
 | 
							Aliases:     []string{"z"},
 | 
				
			||||||
		Usage:       "Increase the patch part of the version",
 | 
							Usage:       "Increase the patch part of the version",
 | 
				
			||||||
		Destination: &Patch,
 | 
							Destination: &Patch,
 | 
				
			||||||
}
 | 
						}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var Dry bool
 | 
					var (
 | 
				
			||||||
var DryFlag = &cli.BoolFlag{
 | 
						Dry     bool
 | 
				
			||||||
	Name:        "dry-run, r",
 | 
						DryFlag = &cli.BoolFlag{
 | 
				
			||||||
 | 
							Name:        "dry-run",
 | 
				
			||||||
 | 
							Aliases:     []string{"r"},
 | 
				
			||||||
		Usage:       "Only reports changes that would be made",
 | 
							Usage:       "Only reports changes that would be made",
 | 
				
			||||||
		Destination: &Dry,
 | 
							Destination: &Dry,
 | 
				
			||||||
}
 | 
						}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var Publish bool
 | 
					var (
 | 
				
			||||||
var PublishFlag = &cli.BoolFlag{
 | 
						Publish     bool
 | 
				
			||||||
	Name:        "publish, p",
 | 
						PublishFlag = &cli.BoolFlag{
 | 
				
			||||||
 | 
							Name:        "publish",
 | 
				
			||||||
 | 
							Aliases:     []string{"p"},
 | 
				
			||||||
		Usage:       "Publish changes to git.coopcloud.tech",
 | 
							Usage:       "Publish changes to git.coopcloud.tech",
 | 
				
			||||||
		Destination: &Publish,
 | 
							Destination: &Publish,
 | 
				
			||||||
}
 | 
						}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var Domain string
 | 
					var (
 | 
				
			||||||
var DomainFlag = &cli.StringFlag{
 | 
						Domain     string
 | 
				
			||||||
	Name:        "domain, D",
 | 
						DomainFlag = &cli.StringFlag{
 | 
				
			||||||
 | 
							Name:        "domain",
 | 
				
			||||||
 | 
							Aliases:     []string{"D"},
 | 
				
			||||||
		Value:       "",
 | 
							Value:       "",
 | 
				
			||||||
		Usage:       "Choose a domain name",
 | 
							Usage:       "Choose a domain name",
 | 
				
			||||||
		Destination: &Domain,
 | 
							Destination: &Domain,
 | 
				
			||||||
}
 | 
						}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var NewAppServer string
 | 
					var (
 | 
				
			||||||
var NewAppServerFlag = &cli.StringFlag{
 | 
						NewAppServer     string
 | 
				
			||||||
	Name:        "server, s",
 | 
						NewAppServerFlag = &cli.StringFlag{
 | 
				
			||||||
 | 
							Name:        "server",
 | 
				
			||||||
 | 
							Aliases:     []string{"s"},
 | 
				
			||||||
		Value:       "",
 | 
							Value:       "",
 | 
				
			||||||
		Usage:       "Show apps of a specific server",
 | 
							Usage:       "Show apps of a specific server",
 | 
				
			||||||
		Destination: &NewAppServer,
 | 
							Destination: &NewAppServer,
 | 
				
			||||||
}
 | 
						}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var NoDomainChecks bool
 | 
					var (
 | 
				
			||||||
var NoDomainChecksFlag = &cli.BoolFlag{
 | 
						NoDomainChecks     bool
 | 
				
			||||||
	Name:        "no-domain-checks, D",
 | 
						NoDomainChecksFlag = &cli.BoolFlag{
 | 
				
			||||||
 | 
							Name:        "no-domain-checks",
 | 
				
			||||||
 | 
							Aliases:     []string{"D"},
 | 
				
			||||||
		Usage:       "Disable app domain sanity checks",
 | 
							Usage:       "Disable app domain sanity checks",
 | 
				
			||||||
		Destination: &NoDomainChecks,
 | 
							Destination: &NoDomainChecks,
 | 
				
			||||||
}
 | 
						}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var StdErrOnly bool
 | 
					var (
 | 
				
			||||||
var StdErrOnlyFlag = &cli.BoolFlag{
 | 
						StdErrOnly     bool
 | 
				
			||||||
	Name:        "stderr, s",
 | 
						StdErrOnlyFlag = &cli.BoolFlag{
 | 
				
			||||||
 | 
							Name:        "stderr",
 | 
				
			||||||
 | 
							Aliases:     []string{"s"},
 | 
				
			||||||
		Usage:       "Only tail stderr",
 | 
							Usage:       "Only tail stderr",
 | 
				
			||||||
		Destination: &StdErrOnly,
 | 
							Destination: &StdErrOnly,
 | 
				
			||||||
}
 | 
						}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SinceLogs string
 | 
					var (
 | 
				
			||||||
var SinceLogsFlag = &cli.StringFlag{
 | 
						SinceLogs     string
 | 
				
			||||||
	Name:        "since, S",
 | 
						SinceLogsFlag = &cli.StringFlag{
 | 
				
			||||||
 | 
							Name:        "since",
 | 
				
			||||||
 | 
							Aliases:     []string{"S"},
 | 
				
			||||||
		Value:       "",
 | 
							Value:       "",
 | 
				
			||||||
		Usage:       "tail logs since YYYY-MM-DDTHH:MM:SSZ",
 | 
							Usage:       "tail logs since YYYY-MM-DDTHH:MM:SSZ",
 | 
				
			||||||
		Destination: &SinceLogs,
 | 
							Destination: &SinceLogs,
 | 
				
			||||||
}
 | 
						}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var DontWaitConverge bool
 | 
					var (
 | 
				
			||||||
var DontWaitConvergeFlag = &cli.BoolFlag{
 | 
						DontWaitConverge     bool
 | 
				
			||||||
	Name:        "no-converge-checks, c",
 | 
						DontWaitConvergeFlag = &cli.BoolFlag{
 | 
				
			||||||
 | 
							Name:        "no-converge-checks",
 | 
				
			||||||
 | 
							Aliases:     []string{"c"},
 | 
				
			||||||
		Usage:       "Don't wait for converge logic checks",
 | 
							Usage:       "Don't wait for converge logic checks",
 | 
				
			||||||
		Destination: &DontWaitConverge,
 | 
							Destination: &DontWaitConverge,
 | 
				
			||||||
}
 | 
						}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var Watch bool
 | 
					var (
 | 
				
			||||||
var WatchFlag = &cli.BoolFlag{
 | 
						Watch     bool
 | 
				
			||||||
	Name:        "watch, w",
 | 
						WatchFlag = &cli.BoolFlag{
 | 
				
			||||||
 | 
							Name:        "watch",
 | 
				
			||||||
 | 
							Aliases:     []string{"w"},
 | 
				
			||||||
		Usage:       "Watch status by polling repeatedly",
 | 
							Usage:       "Watch status by polling repeatedly",
 | 
				
			||||||
		Destination: &Watch,
 | 
							Destination: &Watch,
 | 
				
			||||||
}
 | 
						}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var OnlyErrors bool
 | 
					var (
 | 
				
			||||||
var OnlyErrorFlag = &cli.BoolFlag{
 | 
						OnlyErrors    bool
 | 
				
			||||||
	Name:        "errors, e",
 | 
						OnlyErrorFlag = &cli.BoolFlag{
 | 
				
			||||||
 | 
							Name:        "errors",
 | 
				
			||||||
 | 
							Aliases:     []string{"e"},
 | 
				
			||||||
		Usage:       "Only show errors",
 | 
							Usage:       "Only show errors",
 | 
				
			||||||
		Destination: &OnlyErrors,
 | 
							Destination: &OnlyErrors,
 | 
				
			||||||
}
 | 
						}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var SkipUpdates bool
 | 
					var (
 | 
				
			||||||
var SkipUpdatesFlag = &cli.BoolFlag{
 | 
						SkipUpdates     bool
 | 
				
			||||||
	Name:        "skip-updates, s",
 | 
						SkipUpdatesFlag = &cli.BoolFlag{
 | 
				
			||||||
 | 
							Name:        "skip-updates",
 | 
				
			||||||
 | 
							Aliases:     []string{"s"},
 | 
				
			||||||
		Usage:       "Skip updating recipe repositories",
 | 
							Usage:       "Skip updating recipe repositories",
 | 
				
			||||||
		Destination: &SkipUpdates,
 | 
							Destination: &SkipUpdates,
 | 
				
			||||||
}
 | 
						}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var AllTags bool
 | 
					var (
 | 
				
			||||||
var AllTagsFlag = &cli.BoolFlag{
 | 
						AllTags     bool
 | 
				
			||||||
	Name:        "all-tags, a",
 | 
						AllTagsFlag = &cli.BoolFlag{
 | 
				
			||||||
 | 
							Name:        "all-tags",
 | 
				
			||||||
 | 
							Aliases:     []string{"a"},
 | 
				
			||||||
		Usage:       "List all tags, not just upgrades",
 | 
							Usage:       "List all tags, not just upgrades",
 | 
				
			||||||
		Destination: &AllTags,
 | 
							Destination: &AllTags,
 | 
				
			||||||
}
 | 
						}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var LocalCmd bool
 | 
					var (
 | 
				
			||||||
var LocalCmdFlag = &cli.BoolFlag{
 | 
						LocalCmd     bool
 | 
				
			||||||
	Name:        "local, l",
 | 
						LocalCmdFlag = &cli.BoolFlag{
 | 
				
			||||||
 | 
							Name:        "local",
 | 
				
			||||||
 | 
							Aliases:     []string{"l"},
 | 
				
			||||||
		Usage:       "Run command locally",
 | 
							Usage:       "Run command locally",
 | 
				
			||||||
		Destination: &LocalCmd,
 | 
							Destination: &LocalCmd,
 | 
				
			||||||
}
 | 
						}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var RemoteUser string
 | 
					var (
 | 
				
			||||||
var RemoteUserFlag = &cli.StringFlag{
 | 
						RemoteUser     string
 | 
				
			||||||
	Name:        "user, u",
 | 
						RemoteUserFlag = &cli.StringFlag{
 | 
				
			||||||
 | 
							Name:        "user",
 | 
				
			||||||
 | 
							Aliases:     []string{"u"},
 | 
				
			||||||
		Value:       "",
 | 
							Value:       "",
 | 
				
			||||||
		Usage:       "User to run command within a service context",
 | 
							Usage:       "User to run command within a service context",
 | 
				
			||||||
		Destination: &RemoteUser,
 | 
							Destination: &RemoteUser,
 | 
				
			||||||
}
 | 
						}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
var GitName string
 | 
					 | 
				
			||||||
var GitNameFlag = &cli.StringFlag{
 | 
					 | 
				
			||||||
	Name:        "git-name, gn",
 | 
					 | 
				
			||||||
	Value:       "",
 | 
					 | 
				
			||||||
	Usage:       "Git (user) name to do commits with",
 | 
					 | 
				
			||||||
	Destination: &GitName,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var GitEmail string
 | 
					 | 
				
			||||||
var GitEmailFlag = &cli.StringFlag{
 | 
					 | 
				
			||||||
	Name:        "git-email, ge",
 | 
					 | 
				
			||||||
	Value:       "",
 | 
					 | 
				
			||||||
	Usage:       "Git email name to do commits with",
 | 
					 | 
				
			||||||
	Destination: &GitEmail,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SubCommandBefore wires up pre-action machinery (e.g. --debug handling).
 | 
					// SubCommandBefore wires up pre-action machinery (e.g. --debug handling).
 | 
				
			||||||
func SubCommandBefore(c *cli.Context) error {
 | 
					func SubCommandBefore(c *cli.Context) error {
 | 
				
			||||||
 | 
				
			|||||||
@ -4,7 +4,7 @@ import (
 | 
				
			|||||||
	"os"
 | 
						"os"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ShowSubcommandHelpAndError exits the program on error, logs the error to the
 | 
					// ShowSubcommandHelpAndError exits the program on error, logs the error to the
 | 
				
			||||||
 | 
				
			|||||||
@ -9,7 +9,7 @@ import (
 | 
				
			|||||||
	"coopcloud.tech/abra/pkg/recipe"
 | 
						"coopcloud.tech/abra/pkg/recipe"
 | 
				
			||||||
	"github.com/AlecAivazis/survey/v2"
 | 
						"github.com/AlecAivazis/survey/v2"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ValidateRecipe ensures the recipe arg is valid.
 | 
					// ValidateRecipe ensures the recipe arg is valid.
 | 
				
			||||||
@ -120,9 +120,9 @@ func ValidateDomain(c *cli.Context) string {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// ValidateSubCmdFlags ensures flag order conforms to correct order
 | 
					// ValidateSubCmdFlags ensures flag order conforms to correct order
 | 
				
			||||||
func ValidateSubCmdFlags(c *cli.Context) bool {
 | 
					func ValidateSubCmdFlags(c *cli.Context) bool {
 | 
				
			||||||
	for argIdx, arg := range c.Args() {
 | 
						for argIdx, arg := range c.Args().Slice() {
 | 
				
			||||||
		if !strings.HasPrefix(arg, "--") {
 | 
							if !strings.HasPrefix(arg, "--") {
 | 
				
			||||||
			for _, flag := range c.Args()[argIdx:] {
 | 
								for _, flag := range c.Args().Slice()[argIdx:] {
 | 
				
			||||||
				if strings.HasPrefix(flag, "--") {
 | 
									if strings.HasPrefix(flag, "--") {
 | 
				
			||||||
					return false
 | 
										return false
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
				
			|||||||
@ -8,7 +8,7 @@ import (
 | 
				
			|||||||
	"coopcloud.tech/abra/pkg/config"
 | 
						"coopcloud.tech/abra/pkg/config"
 | 
				
			||||||
	gitPkg "coopcloud.tech/abra/pkg/git"
 | 
						gitPkg "coopcloud.tech/abra/pkg/git"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var recipeDiffCommand = cli.Command{
 | 
					var recipeDiffCommand = cli.Command{
 | 
				
			||||||
 | 
				
			|||||||
@ -6,7 +6,7 @@ import (
 | 
				
			|||||||
	"coopcloud.tech/abra/pkg/formatter"
 | 
						"coopcloud.tech/abra/pkg/formatter"
 | 
				
			||||||
	"coopcloud.tech/abra/pkg/recipe"
 | 
						"coopcloud.tech/abra/pkg/recipe"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var recipeFetchCommand = cli.Command{
 | 
					var recipeFetchCommand = cli.Command{
 | 
				
			||||||
 | 
				
			|||||||
@ -9,7 +9,7 @@ import (
 | 
				
			|||||||
	"coopcloud.tech/abra/pkg/lint"
 | 
						"coopcloud.tech/abra/pkg/lint"
 | 
				
			||||||
	recipePkg "coopcloud.tech/abra/pkg/recipe"
 | 
						recipePkg "coopcloud.tech/abra/pkg/recipe"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var recipeLintCommand = cli.Command{
 | 
					var recipeLintCommand = cli.Command{
 | 
				
			||||||
 | 
				
			|||||||
@ -10,7 +10,7 @@ import (
 | 
				
			|||||||
	"coopcloud.tech/abra/pkg/formatter"
 | 
						"coopcloud.tech/abra/pkg/formatter"
 | 
				
			||||||
	"coopcloud.tech/abra/pkg/recipe"
 | 
						"coopcloud.tech/abra/pkg/recipe"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var pattern string
 | 
					var pattern string
 | 
				
			||||||
 | 
				
			|||||||
@ -4,6 +4,7 @@ import (
 | 
				
			|||||||
	"bytes"
 | 
						"bytes"
 | 
				
			||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
						"io/ioutil"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"path"
 | 
						"path"
 | 
				
			||||||
	"text/template"
 | 
						"text/template"
 | 
				
			||||||
@ -12,7 +13,7 @@ import (
 | 
				
			|||||||
	"coopcloud.tech/abra/pkg/config"
 | 
						"coopcloud.tech/abra/pkg/config"
 | 
				
			||||||
	"coopcloud.tech/abra/pkg/git"
 | 
						"coopcloud.tech/abra/pkg/git"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// recipeMetadata is the recipe metadata for the README.md
 | 
					// recipeMetadata is the recipe metadata for the README.md
 | 
				
			||||||
@ -36,8 +37,6 @@ var recipeNewCommand = cli.Command{
 | 
				
			|||||||
		internal.DebugFlag,
 | 
							internal.DebugFlag,
 | 
				
			||||||
		internal.NoInputFlag,
 | 
							internal.NoInputFlag,
 | 
				
			||||||
		internal.OfflineFlag,
 | 
							internal.OfflineFlag,
 | 
				
			||||||
		internal.GitNameFlag,
 | 
					 | 
				
			||||||
		internal.GitEmailFlag,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	Before:    internal.SubCommandBefore,
 | 
						Before:    internal.SubCommandBefore,
 | 
				
			||||||
	Usage:     "Create a new recipe",
 | 
						Usage:     "Create a new recipe",
 | 
				
			||||||
@ -93,14 +92,14 @@ recipe and domain in the sample environment config).
 | 
				
			|||||||
				logrus.Fatal(err)
 | 
									logrus.Fatal(err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if err := os.WriteFile(path, templated.Bytes(), 0644); err != nil {
 | 
								if err := ioutil.WriteFile(path, templated.Bytes(), 0644); err != nil {
 | 
				
			||||||
				logrus.Fatal(err)
 | 
									logrus.Fatal(err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		newGitRepo := path.Join(config.RECIPES_DIR, recipeName)
 | 
							newGitRepo := path.Join(config.RECIPES_DIR, recipeName)
 | 
				
			||||||
		if err := git.Init(newGitRepo, true, internal.GitName, internal.GitEmail); err != nil {
 | 
							if err := git.Init(newGitRepo, true); err != nil {
 | 
				
			||||||
			logrus.Fatal(err)
 | 
								logrus.Fatal(err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
package recipe
 | 
					package recipe
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// RecipeCommand defines all recipe related sub-commands.
 | 
					// RecipeCommand defines all recipe related sub-commands.
 | 
				
			||||||
@ -21,16 +21,16 @@ sure the recipe is in good working order and the config upgraded in a timely
 | 
				
			|||||||
manner. Abra supports convenient automation for recipe maintainenace, see the
 | 
					manner. Abra supports convenient automation for recipe maintainenace, see the
 | 
				
			||||||
"abra recipe upgrade", "abra recipe sync" and "abra recipe release" commands.
 | 
					"abra recipe upgrade", "abra recipe sync" and "abra recipe release" commands.
 | 
				
			||||||
`,
 | 
					`,
 | 
				
			||||||
	Subcommands: []cli.Command{
 | 
						Subcommands: []*cli.Command{
 | 
				
			||||||
		recipeFetchCommand,
 | 
							&recipeFetchCommand,
 | 
				
			||||||
		recipeLintCommand,
 | 
							&recipeLintCommand,
 | 
				
			||||||
		recipeListCommand,
 | 
							&recipeListCommand,
 | 
				
			||||||
		recipeNewCommand,
 | 
							&recipeNewCommand,
 | 
				
			||||||
		recipeReleaseCommand,
 | 
							&recipeReleaseCommand,
 | 
				
			||||||
		recipeSyncCommand,
 | 
							&recipeSyncCommand,
 | 
				
			||||||
		recipeUpgradeCommand,
 | 
							&recipeUpgradeCommand,
 | 
				
			||||||
		recipeVersionCommand,
 | 
							&recipeVersionCommand,
 | 
				
			||||||
		recipeResetCommand,
 | 
							&recipeResetCommand,
 | 
				
			||||||
		recipeDiffCommand,
 | 
							&recipeDiffCommand,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -20,7 +20,7 @@ import (
 | 
				
			|||||||
	"github.com/docker/distribution/reference"
 | 
						"github.com/docker/distribution/reference"
 | 
				
			||||||
	"github.com/go-git/go-git/v5"
 | 
						"github.com/go-git/go-git/v5"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var recipeReleaseCommand = cli.Command{
 | 
					var recipeReleaseCommand = cli.Command{
 | 
				
			||||||
 | 
				
			|||||||
@ -8,7 +8,7 @@ import (
 | 
				
			|||||||
	"coopcloud.tech/abra/pkg/config"
 | 
						"coopcloud.tech/abra/pkg/config"
 | 
				
			||||||
	"github.com/go-git/go-git/v5"
 | 
						"github.com/go-git/go-git/v5"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var recipeResetCommand = cli.Command{
 | 
					var recipeResetCommand = cli.Command{
 | 
				
			||||||
 | 
				
			|||||||
@ -14,7 +14,7 @@ import (
 | 
				
			|||||||
	"github.com/go-git/go-git/v5"
 | 
						"github.com/go-git/go-git/v5"
 | 
				
			||||||
	"github.com/go-git/go-git/v5/plumbing"
 | 
						"github.com/go-git/go-git/v5/plumbing"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var recipeSyncCommand = cli.Command{
 | 
					var recipeSyncCommand = cli.Command{
 | 
				
			||||||
 | 
				
			|||||||
@ -20,7 +20,7 @@ import (
 | 
				
			|||||||
	"github.com/AlecAivazis/survey/v2"
 | 
						"github.com/AlecAivazis/survey/v2"
 | 
				
			||||||
	"github.com/docker/distribution/reference"
 | 
						"github.com/docker/distribution/reference"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type imgPin struct {
 | 
					type imgPin struct {
 | 
				
			||||||
 | 
				
			|||||||
@ -10,7 +10,7 @@ import (
 | 
				
			|||||||
	recipePkg "coopcloud.tech/abra/pkg/recipe"
 | 
						recipePkg "coopcloud.tech/abra/pkg/recipe"
 | 
				
			||||||
	"github.com/olekukonko/tablewriter"
 | 
						"github.com/olekukonko/tablewriter"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func sortServiceByName(versions [][]string) func(i, j int) bool {
 | 
					func sortServiceByName(versions [][]string) func(i, j int) bool {
 | 
				
			||||||
 | 
				
			|||||||
@ -13,12 +13,13 @@ import (
 | 
				
			|||||||
	"coopcloud.tech/abra/pkg/server"
 | 
						"coopcloud.tech/abra/pkg/server"
 | 
				
			||||||
	sshPkg "coopcloud.tech/abra/pkg/ssh"
 | 
						sshPkg "coopcloud.tech/abra/pkg/ssh"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var local bool
 | 
					var local bool
 | 
				
			||||||
var localFlag = &cli.BoolFlag{
 | 
					var localFlag = &cli.BoolFlag{
 | 
				
			||||||
	Name:        "local, l",
 | 
						Name:        "local",
 | 
				
			||||||
 | 
						Aliases:     []string{"l"},
 | 
				
			||||||
	Usage:       "Use local server",
 | 
						Usage:       "Use local server",
 | 
				
			||||||
	Destination: &local,
 | 
						Destination: &local,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -122,7 +123,7 @@ developer machine.
 | 
				
			|||||||
	Before:    internal.SubCommandBefore,
 | 
						Before:    internal.SubCommandBefore,
 | 
				
			||||||
	ArgsUsage: "<domain>",
 | 
						ArgsUsage: "<domain>",
 | 
				
			||||||
	Action: func(c *cli.Context) error {
 | 
						Action: func(c *cli.Context) error {
 | 
				
			||||||
		if len(c.Args()) > 0 && local || !internal.ValidateSubCmdFlags(c) {
 | 
							if c.Args().Len() > 0 && local || !internal.ValidateSubCmdFlags(c) {
 | 
				
			||||||
			err := errors.New("cannot use <domain> and --local together")
 | 
								err := errors.New("cannot use <domain> and --local together")
 | 
				
			||||||
			internal.ShowSubcommandHelpAndError(c, err)
 | 
								internal.ShowSubcommandHelpAndError(c, err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
				
			|||||||
@ -9,7 +9,7 @@ import (
 | 
				
			|||||||
	"coopcloud.tech/abra/pkg/formatter"
 | 
						"coopcloud.tech/abra/pkg/formatter"
 | 
				
			||||||
	"github.com/docker/cli/cli/connhelper/ssh"
 | 
						"github.com/docker/cli/cli/connhelper/ssh"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var problemsFilter bool
 | 
					var problemsFilter bool
 | 
				
			||||||
 | 
				
			|||||||
@ -9,7 +9,7 @@ import (
 | 
				
			|||||||
	"coopcloud.tech/abra/pkg/formatter"
 | 
						"coopcloud.tech/abra/pkg/formatter"
 | 
				
			||||||
	"github.com/docker/docker/api/types/filters"
 | 
						"github.com/docker/docker/api/types/filters"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var allFilter bool
 | 
					var allFilter bool
 | 
				
			||||||
 | 
				
			|||||||
@ -9,7 +9,7 @@ import (
 | 
				
			|||||||
	"coopcloud.tech/abra/pkg/client"
 | 
						"coopcloud.tech/abra/pkg/client"
 | 
				
			||||||
	"coopcloud.tech/abra/pkg/config"
 | 
						"coopcloud.tech/abra/pkg/config"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var serverRemoveCommand = cli.Command{
 | 
					var serverRemoveCommand = cli.Command{
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
package server
 | 
					package server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ServerCommand defines the `abra server` command and its subcommands
 | 
					// ServerCommand defines the `abra server` command and its subcommands
 | 
				
			||||||
@ -9,10 +9,10 @@ var ServerCommand = cli.Command{
 | 
				
			|||||||
	Name:    "server",
 | 
						Name:    "server",
 | 
				
			||||||
	Aliases: []string{"s"},
 | 
						Aliases: []string{"s"},
 | 
				
			||||||
	Usage:   "Manage servers",
 | 
						Usage:   "Manage servers",
 | 
				
			||||||
	Subcommands: []cli.Command{
 | 
						Subcommands: []*cli.Command{
 | 
				
			||||||
		serverAddCommand,
 | 
							&serverAddCommand,
 | 
				
			||||||
		serverListCommand,
 | 
							&serverListCommand,
 | 
				
			||||||
		serverRemoveCommand,
 | 
							&serverRemoveCommand,
 | 
				
			||||||
		serverPruneCommand,
 | 
							&serverPruneCommand,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -21,24 +21,28 @@ import (
 | 
				
			|||||||
	dockerclient "github.com/docker/docker/client"
 | 
						dockerclient "github.com/docker/docker/client"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const SERVER = "localhost"
 | 
					const SERVER = "localhost"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var majorUpdate bool
 | 
					var (
 | 
				
			||||||
var majorFlag = &cli.BoolFlag{
 | 
						majorUpdate bool
 | 
				
			||||||
	Name:        "major, m",
 | 
						majorFlag   = &cli.BoolFlag{
 | 
				
			||||||
 | 
							Name:        "major",
 | 
				
			||||||
 | 
							Aliases:     []string{"m"},
 | 
				
			||||||
		Usage:       "Also check for major updates",
 | 
							Usage:       "Also check for major updates",
 | 
				
			||||||
		Destination: &majorUpdate,
 | 
							Destination: &majorUpdate,
 | 
				
			||||||
}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var updateAll bool
 | 
						updateAll bool
 | 
				
			||||||
var allFlag = &cli.BoolFlag{
 | 
						allFlag   = &cli.BoolFlag{
 | 
				
			||||||
	Name:        "all, a",
 | 
							Name:        "all",
 | 
				
			||||||
 | 
							Aliases:     []string{"a"},
 | 
				
			||||||
		Usage:       "Update all deployed apps",
 | 
							Usage:       "Update all deployed apps",
 | 
				
			||||||
		Destination: &updateAll,
 | 
							Destination: &updateAll,
 | 
				
			||||||
}
 | 
						}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Notify checks for available upgrades
 | 
					// Notify checks for available upgrades
 | 
				
			||||||
var Notify = cli.Command{
 | 
					var Notify = cli.Command{
 | 
				
			||||||
@ -271,7 +275,8 @@ func getDeployedVersion(cl *dockerclient.Client, stackName string, recipeName st
 | 
				
			|||||||
// than the deployed version. It only includes major upgrades if the "--major"
 | 
					// than the deployed version. It only includes major upgrades if the "--major"
 | 
				
			||||||
// flag is set.
 | 
					// flag is set.
 | 
				
			||||||
func getAvailableUpgrades(cl *dockerclient.Client, stackName string, recipeName string,
 | 
					func getAvailableUpgrades(cl *dockerclient.Client, stackName string, recipeName string,
 | 
				
			||||||
	deployedVersion string) ([]string, error) {
 | 
						deployedVersion string,
 | 
				
			||||||
 | 
					) ([]string, error) {
 | 
				
			||||||
	catl, err := recipe.ReadRecipeCatalogue(internal.Offline)
 | 
						catl, err := recipe.ReadRecipeCatalogue(internal.Offline)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
@ -429,7 +434,8 @@ func tryUpgrade(cl *dockerclient.Client, stackName, recipeName string) error {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// upgrade performs all necessary steps to upgrade an app.
 | 
					// upgrade performs all necessary steps to upgrade an app.
 | 
				
			||||||
func upgrade(cl *dockerclient.Client, stackName, recipeName,
 | 
					func upgrade(cl *dockerclient.Client, stackName, recipeName,
 | 
				
			||||||
	upgradeVersion string) error {
 | 
						upgradeVersion string,
 | 
				
			||||||
 | 
					) error {
 | 
				
			||||||
	env, err := getEnv(cl, stackName)
 | 
						env, err := getEnv(cl, stackName)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
@ -474,9 +480,9 @@ func newAbraApp(version, commit string) *cli.App {
 | 
				
			|||||||
                         |_|
 | 
					                         |_|
 | 
				
			||||||
`,
 | 
					`,
 | 
				
			||||||
		Version: fmt.Sprintf("%s-%s", version, commit[:7]),
 | 
							Version: fmt.Sprintf("%s-%s", version, commit[:7]),
 | 
				
			||||||
		Commands: []cli.Command{
 | 
							Commands: []*cli.Command{
 | 
				
			||||||
			Notify,
 | 
								&Notify,
 | 
				
			||||||
			UpgradeApp,
 | 
								&UpgradeApp,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										6
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								go.mod
									
									
									
									
									
								
							@ -25,7 +25,7 @@ require (
 | 
				
			|||||||
require (
 | 
					require (
 | 
				
			||||||
	dario.cat/mergo v1.0.0 // indirect
 | 
						dario.cat/mergo v1.0.0 // indirect
 | 
				
			||||||
	github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
 | 
						github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
 | 
				
			||||||
	github.com/BurntSushi/toml v1.0.0 // indirect
 | 
						github.com/BurntSushi/toml v1.3.2 // indirect
 | 
				
			||||||
	github.com/Microsoft/go-winio v0.6.1 // indirect
 | 
						github.com/Microsoft/go-winio v0.6.1 // indirect
 | 
				
			||||||
	github.com/Microsoft/hcsshim v0.9.2 // indirect
 | 
						github.com/Microsoft/hcsshim v0.9.2 // indirect
 | 
				
			||||||
	github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect
 | 
						github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect
 | 
				
			||||||
@ -33,7 +33,7 @@ require (
 | 
				
			|||||||
	github.com/beorn7/perks v1.0.1 // indirect
 | 
						github.com/beorn7/perks v1.0.1 // indirect
 | 
				
			||||||
	github.com/cespare/xxhash/v2 v2.2.0 // indirect
 | 
						github.com/cespare/xxhash/v2 v2.2.0 // indirect
 | 
				
			||||||
	github.com/cloudflare/circl v1.3.3 // indirect
 | 
						github.com/cloudflare/circl v1.3.3 // indirect
 | 
				
			||||||
	github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect
 | 
						github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect
 | 
				
			||||||
	github.com/cyphar/filepath-securejoin v0.2.4 // indirect
 | 
						github.com/cyphar/filepath-securejoin v0.2.4 // indirect
 | 
				
			||||||
	github.com/davecgh/go-spew v1.1.1 // indirect
 | 
						github.com/davecgh/go-spew v1.1.1 // indirect
 | 
				
			||||||
	github.com/distribution/reference v0.5.0 // indirect
 | 
						github.com/distribution/reference v0.5.0 // indirect
 | 
				
			||||||
@ -75,9 +75,11 @@ require (
 | 
				
			|||||||
	github.com/russross/blackfriday/v2 v2.1.0 // indirect
 | 
						github.com/russross/blackfriday/v2 v2.1.0 // indirect
 | 
				
			||||||
	github.com/skeema/knownhosts v1.2.0 // indirect
 | 
						github.com/skeema/knownhosts v1.2.0 // indirect
 | 
				
			||||||
	github.com/spf13/pflag v1.0.5 // indirect
 | 
						github.com/spf13/pflag v1.0.5 // indirect
 | 
				
			||||||
 | 
						github.com/urfave/cli/v2 v2.27.1 // indirect
 | 
				
			||||||
	github.com/xanzy/ssh-agent v0.3.3 // indirect
 | 
						github.com/xanzy/ssh-agent v0.3.3 // indirect
 | 
				
			||||||
	github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
 | 
						github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
 | 
				
			||||||
	github.com/xeipuuv/gojsonschema v1.2.0 // indirect
 | 
						github.com/xeipuuv/gojsonschema v1.2.0 // indirect
 | 
				
			||||||
 | 
						github.com/xrash/smetrics v0.0.0-20231213231151-1d8dd44e695e // indirect
 | 
				
			||||||
	golang.org/x/crypto v0.14.0 // indirect
 | 
						golang.org/x/crypto v0.14.0 // indirect
 | 
				
			||||||
	golang.org/x/mod v0.12.0 // indirect
 | 
						golang.org/x/mod v0.12.0 // indirect
 | 
				
			||||||
	golang.org/x/net v0.17.0 // indirect
 | 
						golang.org/x/net v0.17.0 // indirect
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										9
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								go.sum
									
									
									
									
									
								
							@ -74,6 +74,8 @@ github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBp
 | 
				
			|||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 | 
					github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 | 
				
			||||||
github.com/BurntSushi/toml v1.0.0 h1:dtDWrepsVPfW9H/4y7dDgFc2MBUSeJhlaDtK13CxFlU=
 | 
					github.com/BurntSushi/toml v1.0.0 h1:dtDWrepsVPfW9H/4y7dDgFc2MBUSeJhlaDtK13CxFlU=
 | 
				
			||||||
github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
 | 
					github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
 | 
				
			||||||
 | 
					github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8=
 | 
				
			||||||
 | 
					github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
 | 
				
			||||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 | 
					github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 | 
				
			||||||
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
 | 
					github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
 | 
				
			||||||
github.com/Gurpartap/logrus-stack v0.0.0-20170710170904-89c00d8a28f4 h1:vdT7QwBhJJEVNFMBNhRSFDRCB6O16T28VhvqRgqFyn8=
 | 
					github.com/Gurpartap/logrus-stack v0.0.0-20170710170904-89c00d8a28f4 h1:vdT7QwBhJJEVNFMBNhRSFDRCB6O16T28VhvqRgqFyn8=
 | 
				
			||||||
@ -311,6 +313,8 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:ma
 | 
				
			|||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
 | 
					github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
 | 
				
			||||||
github.com/cpuguy83/go-md2man/v2 v2.0.1 h1:r/myEWzV9lfsM1tFLgDyu0atFtJ1fXn261LKYj/3DxU=
 | 
					github.com/cpuguy83/go-md2man/v2 v2.0.1 h1:r/myEWzV9lfsM1tFLgDyu0atFtJ1fXn261LKYj/3DxU=
 | 
				
			||||||
github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
 | 
					github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
 | 
				
			||||||
 | 
					github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM=
 | 
				
			||||||
 | 
					github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
 | 
				
			||||||
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
 | 
					github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
 | 
				
			||||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 | 
					github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 | 
				
			||||||
github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
 | 
					github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
 | 
				
			||||||
@ -893,6 +897,7 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L
 | 
				
			|||||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 | 
					github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 | 
				
			||||||
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
 | 
					github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
 | 
				
			||||||
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
 | 
					github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
 | 
				
			||||||
 | 
					github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww=
 | 
				
			||||||
github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY=
 | 
					github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY=
 | 
				
			||||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 | 
					github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 | 
				
			||||||
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
 | 
					github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
 | 
				
			||||||
@ -992,6 +997,8 @@ github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX
 | 
				
			|||||||
github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
 | 
					github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
 | 
				
			||||||
github.com/urfave/cli v1.22.9 h1:cv3/KhXGBGjEXLC4bH0sLuJ9BewaAbpk5oyMOveu4pw=
 | 
					github.com/urfave/cli v1.22.9 h1:cv3/KhXGBGjEXLC4bH0sLuJ9BewaAbpk5oyMOveu4pw=
 | 
				
			||||||
github.com/urfave/cli v1.22.9/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
 | 
					github.com/urfave/cli v1.22.9/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
 | 
				
			||||||
 | 
					github.com/urfave/cli/v2 v2.27.1 h1:8xSQ6szndafKVRmfyeUMxkNUJQMjL1F2zmsZ+qHpfho=
 | 
				
			||||||
 | 
					github.com/urfave/cli/v2 v2.27.1/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ=
 | 
				
			||||||
github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI=
 | 
					github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI=
 | 
				
			||||||
github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk=
 | 
					github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk=
 | 
				
			||||||
github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
 | 
					github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
 | 
				
			||||||
@ -1013,6 +1020,8 @@ github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17
 | 
				
			|||||||
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
 | 
					github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
 | 
				
			||||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
 | 
					github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
 | 
				
			||||||
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
 | 
					github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
 | 
				
			||||||
 | 
					github.com/xrash/smetrics v0.0.0-20231213231151-1d8dd44e695e h1:+SOyEddqYF09QP7vr7CgJ1eti3pY9Fn3LHO1M1r/0sI=
 | 
				
			||||||
 | 
					github.com/xrash/smetrics v0.0.0-20231213231151-1d8dd44e695e/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
 | 
				
			||||||
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
					github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
				
			||||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
					github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
				
			||||||
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
					github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
				
			||||||
 | 
				
			|||||||
@ -6,7 +6,7 @@ import (
 | 
				
			|||||||
	"coopcloud.tech/abra/pkg/config"
 | 
						"coopcloud.tech/abra/pkg/config"
 | 
				
			||||||
	"coopcloud.tech/abra/pkg/recipe"
 | 
						"coopcloud.tech/abra/pkg/recipe"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
	"github.com/urfave/cli"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// AppNameComplete copletes app names.
 | 
					// AppNameComplete copletes app names.
 | 
				
			||||||
 | 
				
			|||||||
@ -1,41 +1,35 @@
 | 
				
			|||||||
package git
 | 
					package git
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"github.com/go-git/go-git/v5"
 | 
						"github.com/go-git/go-git/v5"
 | 
				
			||||||
	"github.com/go-git/go-git/v5/plumbing/object"
 | 
						gitPkg "github.com/go-git/go-git/v5"
 | 
				
			||||||
	"github.com/sirupsen/logrus"
 | 
						"github.com/sirupsen/logrus"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Init inits a new repo and commits all the stuff if you want
 | 
					// Init inits a new repo and commits all the stuff if you want
 | 
				
			||||||
func Init(repoPath string, commit bool, gitName, gitEmail string) error {
 | 
					func Init(repoPath string, commit bool) error {
 | 
				
			||||||
	if _, err := git.PlainInit(repoPath, false); err != nil {
 | 
						if _, err := gitPkg.PlainInit(repoPath, false); err != nil {
 | 
				
			||||||
		return fmt.Errorf("git init: %s", err)
 | 
							logrus.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	logrus.Debugf("initialised new git repo in %s", repoPath)
 | 
						logrus.Debugf("initialised new git repo in %s", repoPath)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if commit {
 | 
						if commit {
 | 
				
			||||||
		commitRepo, err := git.PlainOpen(repoPath)
 | 
							commitRepo, err := git.PlainOpen(repoPath)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return fmt.Errorf("git open: %s", err)
 | 
								logrus.Fatal(err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		commitWorktree, err := commitRepo.Worktree()
 | 
							commitWorktree, err := commitRepo.Worktree()
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return fmt.Errorf("git worktree: %s", err)
 | 
								logrus.Fatal(err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if err := commitWorktree.AddWithOptions(&git.AddOptions{All: true}); err != nil {
 | 
							if err := commitWorktree.AddWithOptions(&git.AddOptions{All: true}); err != nil {
 | 
				
			||||||
			return fmt.Errorf("git add: %s", err)
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		var author *object.Signature
 | 
							if _, err = commitWorktree.Commit("init", &git.CommitOptions{}); err != nil {
 | 
				
			||||||
		if gitName != "" && gitEmail != "" {
 | 
								return err
 | 
				
			||||||
			author = &object.Signature{Name: gitName, Email: gitEmail}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if _, err = commitWorktree.Commit("init", &git.CommitOptions{Author: author}); err != nil {
 | 
					 | 
				
			||||||
			return fmt.Errorf("git commit: %s", err)
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		logrus.Debugf("init committed all files for new git repo in %s", repoPath)
 | 
							logrus.Debugf("init committed all files for new git repo in %s", repoPath)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
@ -2,7 +2,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
ABRA_VERSION="0.8.1-beta"
 | 
					ABRA_VERSION="0.8.1-beta"
 | 
				
			||||||
ABRA_RELEASE_URL="https://git.coopcloud.tech/api/v1/repos/coop-cloud/abra/releases/tags/$ABRA_VERSION"
 | 
					ABRA_RELEASE_URL="https://git.coopcloud.tech/api/v1/repos/coop-cloud/abra/releases/tags/$ABRA_VERSION"
 | 
				
			||||||
RC_VERSION="0.8.1-beta"
 | 
					RC_VERSION="0.8.0-rc1-beta"
 | 
				
			||||||
RC_VERSION_URL="https://git.coopcloud.tech/api/v1/repos/coop-cloud/abra/releases/tags/$RC_VERSION"
 | 
					RC_VERSION_URL="https://git.coopcloud.tech/api/v1/repos/coop-cloud/abra/releases/tags/$RC_VERSION"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
for arg in "$@"; do
 | 
					for arg in "$@"; do
 | 
				
			||||||
 | 
				
			|||||||
@ -70,13 +70,13 @@ setup(){
 | 
				
			|||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  assert_output --partial 'behind 3'
 | 
					  assert_output --regexp 'behind .* 3 commits'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA app check "$TEST_APP_DOMAIN"
 | 
					  run $ABRA app check "$TEST_APP_DOMAIN"
 | 
				
			||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  refute_output --partial 'behind 3'
 | 
					  assert_output --regexp 'behind .* 3 commits'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _reset_recipe
 | 
					  _reset_recipe
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -86,7 +86,7 @@ setup(){
 | 
				
			|||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  assert_output --partial 'behind 1'
 | 
					  assert_output --partial "Your branch is behind 'origin/main' by 1 commit"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # NOTE(d1): we can't quite tell if this will fail or not in the future, so,
 | 
					  # NOTE(d1): we can't quite tell if this will fail or not in the future, so,
 | 
				
			||||||
  # since it isn't an important part of what we're testing here, we don't check
 | 
					  # since it isn't an important part of what we're testing here, we don't check
 | 
				
			||||||
@ -94,7 +94,7 @@ setup(){
 | 
				
			|||||||
  run $ABRA app check "$TEST_APP_DOMAIN" --offline
 | 
					  run $ABRA app check "$TEST_APP_DOMAIN" --offline
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  assert_output --partial 'behind 1'
 | 
					  assert_output --partial "Your branch is behind 'origin/main' by 1 commit"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _reset_recipe
 | 
					  _reset_recipe
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -58,7 +58,7 @@ test_cmd_export"
 | 
				
			|||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
  assert_not_exists "$ABRA_DIR/recipes/$TEST_RECIPE"
 | 
					  assert_not_exists "$ABRA_DIR/recipes/$TEST_RECIPE"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA app cmd "$TEST_APP_DOMAIN" test_cmd --local
 | 
					  run $ABRA app cmd --local "$TEST_APP_DOMAIN" test_cmd
 | 
				
			||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
  assert_output --partial 'baz'
 | 
					  assert_output --partial 'baz'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -70,7 +70,7 @@ test_cmd_export"
 | 
				
			|||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
  assert_exists "$ABRA_DIR/recipes/$TEST_RECIPE/foo"
 | 
					  assert_exists "$ABRA_DIR/recipes/$TEST_RECIPE/foo"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA app cmd "$TEST_APP_DOMAIN" test_cmd --local
 | 
					  run $ABRA app cmd --local "$TEST_APP_DOMAIN" test_cmd
 | 
				
			||||||
  assert_failure
 | 
					  assert_failure
 | 
				
			||||||
  assert_output --partial 'locally unstaged changes'
 | 
					  assert_output --partial 'locally unstaged changes'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -83,7 +83,7 @@ test_cmd_export"
 | 
				
			|||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
  assert_exists "$ABRA_DIR/recipes/$TEST_RECIPE/foo"
 | 
					  assert_exists "$ABRA_DIR/recipes/$TEST_RECIPE/foo"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA app cmd "$TEST_APP_DOMAIN" test_cmd --local --chaos
 | 
					  run $ABRA app cmd --local --chaos "$TEST_APP_DOMAIN" test_cmd
 | 
				
			||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
  assert_output --partial 'baz'
 | 
					  assert_output --partial 'baz'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -96,14 +96,14 @@ test_cmd_export"
 | 
				
			|||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  assert_output --partial 'behind 3'
 | 
					  assert_output --regexp 'behind .* 3 commits'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA app cmd "$TEST_APP_DOMAIN" test_cmd --local
 | 
					  run $ABRA app cmd --local "$TEST_APP_DOMAIN" test_cmd
 | 
				
			||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
  assert_output --partial 'baz'
 | 
					  assert_output --partial 'baz'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  refute_output --partial 'behind 3'
 | 
					  assert_output --partial "up to date"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _reset_recipe "$TEST_RECIPE"
 | 
					  _reset_recipe "$TEST_RECIPE"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -113,14 +113,14 @@ test_cmd_export"
 | 
				
			|||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  assert_output --partial 'behind 3'
 | 
					  assert_output --regexp 'behind .* 3 commits'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA app cmd "$TEST_APP_DOMAIN" test_cmd --local --offline
 | 
					  run $ABRA app cmd --local --offline "$TEST_APP_DOMAIN" test_cmd
 | 
				
			||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
  assert_output --partial 'baz'
 | 
					  assert_output --partial 'baz'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  assert_output --partial 'behind 3'
 | 
					  assert_output --regexp 'behind .* 3 commits'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _reset_recipe "$TEST_RECIPE"
 | 
					  _reset_recipe "$TEST_RECIPE"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -132,13 +132,13 @@ test_cmd_export"
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@test "error if missing arguments when passing --local" {
 | 
					@test "error if missing arguments when passing --local" {
 | 
				
			||||||
  run $ABRA app cmd "$TEST_APP_DOMAIN" --local
 | 
					  run $ABRA app cmd --local "$TEST_APP_DOMAIN"
 | 
				
			||||||
  assert_failure
 | 
					  assert_failure
 | 
				
			||||||
  assert_output --partial 'missing arguments'
 | 
					  assert_output --partial 'missing arguments'
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@test "cannot use --local and --user at same time" {
 | 
					@test "cannot use --local and --user at same time" {
 | 
				
			||||||
  run $ABRA app cmd "$TEST_APP_DOMAIN" test_cmd --local --user root
 | 
					  run $ABRA app cmd --local --user root "$TEST_APP_DOMAIN" test_cmd
 | 
				
			||||||
  assert_failure
 | 
					  assert_failure
 | 
				
			||||||
  assert_output --partial 'cannot use --local & --user together'
 | 
					  assert_output --partial 'cannot use --local & --user together'
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -147,7 +147,7 @@ test_cmd_export"
 | 
				
			|||||||
  run rm -rf "$ABRA_DIR/recipes/$TEST_RECIPE/abra.sh"
 | 
					  run rm -rf "$ABRA_DIR/recipes/$TEST_RECIPE/abra.sh"
 | 
				
			||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA app cmd "$TEST_APP_DOMAIN" test_cmd --local --chaos
 | 
					  run $ABRA app cmd --local --chaos "$TEST_APP_DOMAIN" test_cmd
 | 
				
			||||||
  assert_failure
 | 
					  assert_failure
 | 
				
			||||||
  assert_output --partial "$ABRA_DIR/recipes/$TEST_RECIPE/abra.sh does not exist"
 | 
					  assert_output --partial "$ABRA_DIR/recipes/$TEST_RECIPE/abra.sh does not exist"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -155,25 +155,25 @@ test_cmd_export"
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@test "error if missing command" {
 | 
					@test "error if missing command" {
 | 
				
			||||||
  run $ABRA app cmd "$TEST_APP_DOMAIN" doesnt_exist --local
 | 
					  run $ABRA app cmd --local "$TEST_APP_DOMAIN" doesnt_exist
 | 
				
			||||||
  assert_failure
 | 
					  assert_failure
 | 
				
			||||||
  assert_output --partial "doesn't have a doesnt_exist function"
 | 
					  assert_output --partial "doesn't have a doesnt_exist function"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@test "run --local command" {
 | 
					@test "run --local command" {
 | 
				
			||||||
  run $ABRA app cmd "$TEST_APP_DOMAIN" test_cmd --local
 | 
					  run $ABRA app cmd --local "$TEST_APP_DOMAIN" test_cmd
 | 
				
			||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
  assert_output --partial 'baz'
 | 
					  assert_output --partial 'baz'
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@test "run command with single arg" {
 | 
					@test "run command with single arg" {
 | 
				
			||||||
  run $ABRA app cmd "$TEST_APP_DOMAIN" test_cmd_arg --local -- bing
 | 
					  run $ABRA app cmd --local "$TEST_APP_DOMAIN" test_cmd_arg -- bing
 | 
				
			||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
  assert_output --partial 'bing'
 | 
					  assert_output --partial 'bing'
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@test "run command with several args" {
 | 
					@test "run command with several args" {
 | 
				
			||||||
  run $ABRA app cmd "$TEST_APP_DOMAIN" test_cmd_args --local -- bong bang
 | 
					  run $ABRA app cmd --local "$TEST_APP_DOMAIN" test_cmd_args -- bong bang
 | 
				
			||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
  assert_output --partial 'bong bang'
 | 
					  assert_output --partial 'bong bang'
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -16,6 +16,7 @@ teardown_file(){
 | 
				
			|||||||
setup(){
 | 
					setup(){
 | 
				
			||||||
  load "$PWD/tests/integration/helpers/common"
 | 
					  load "$PWD/tests/integration/helpers/common"
 | 
				
			||||||
  _common_setup
 | 
					  _common_setup
 | 
				
			||||||
 | 
					  _reset_recipe
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
teardown(){
 | 
					teardown(){
 | 
				
			||||||
@ -82,13 +83,13 @@ teardown(){
 | 
				
			|||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  assert_output --partial 'behind 3'
 | 
					  assert_output --regexp 'behind .* 3 commits'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA app deploy "$TEST_APP_DOMAIN" --no-input --no-converge-checks
 | 
					  run $ABRA app deploy "$TEST_APP_DOMAIN" --no-input --no-converge-checks
 | 
				
			||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  refute_output --partial 'behind 3'
 | 
					  refute_output --regexp 'behind .* 3 commits'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _reset_recipe
 | 
					  _reset_recipe
 | 
				
			||||||
  _undeploy_app
 | 
					  _undeploy_app
 | 
				
			||||||
@ -100,7 +101,7 @@ teardown(){
 | 
				
			|||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  assert_output --partial 'behind 3'
 | 
					  assert_output --regexp 'behind .* 3 commits'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # NOTE(d1): need to use --chaos to force same commit
 | 
					  # NOTE(d1): need to use --chaos to force same commit
 | 
				
			||||||
  run $ABRA app deploy "$TEST_APP_DOMAIN" \
 | 
					  run $ABRA app deploy "$TEST_APP_DOMAIN" \
 | 
				
			||||||
@ -108,7 +109,7 @@ teardown(){
 | 
				
			|||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  assert_output --partial 'behind 3'
 | 
					  assert_output --regexp 'behind .* 3 commits'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _undeploy_app
 | 
					  _undeploy_app
 | 
				
			||||||
  _reset_recipe
 | 
					  _reset_recipe
 | 
				
			||||||
@ -116,6 +117,9 @@ teardown(){
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# bats test_tags=slow
 | 
					# bats test_tags=slow
 | 
				
			||||||
@test "deploy latest commit if no published versions and no --chaos" {
 | 
					@test "deploy latest commit if no published versions and no --chaos" {
 | 
				
			||||||
 | 
					  # TODO(d1): fix with a new test recipe which has no published versions?
 | 
				
			||||||
 | 
					  skip "known issue, abra-test-recipe has published versions now"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  latestCommit="$(git -C "$ABRA_DIR/recipes/$TEST_RECIPE" rev-parse --short HEAD)"
 | 
					  latestCommit="$(git -C "$ABRA_DIR/recipes/$TEST_RECIPE" rev-parse --short HEAD)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _remove_tags
 | 
					  _remove_tags
 | 
				
			||||||
@ -140,7 +144,7 @@ teardown(){
 | 
				
			|||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  assert_output --partial 'behind 3'
 | 
					  assert_output --regexp 'behind .* 3 commits'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  threeCommitsBack="$(git -C "$ABRA_DIR/recipes/$TEST_RECIPE" rev-parse --short HEAD)"
 | 
					  threeCommitsBack="$(git -C "$ABRA_DIR/recipes/$TEST_RECIPE" rev-parse --short HEAD)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -273,6 +277,10 @@ teardown(){
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@test "ensure domain is checked" {
 | 
					@test "ensure domain is checked" {
 | 
				
			||||||
 | 
					  if [[ "$TEST_SERVER" == "default" ]]; then
 | 
				
			||||||
 | 
					      skip "domain checks are disabled for local server"
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  appDomain="custom-html.DOESNTEXIST"
 | 
					  appDomain="custom-html.DOESNTEXIST"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA app new custom-html \
 | 
					  run $ABRA app new custom-html \
 | 
				
			||||||
 | 
				
			|||||||
@ -45,7 +45,7 @@ teardown(){
 | 
				
			|||||||
  assert_exists "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env"
 | 
					  assert_exists "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  assert_output --partial "Your branch is up to date with 'origin/main'."
 | 
					  assert_output --partial "up to date"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@test "create new app with version" {
 | 
					@test "create new app with version" {
 | 
				
			||||||
@ -121,7 +121,7 @@ teardown(){
 | 
				
			|||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  assert_output --partial "Your branch is behind 'origin/main' by 3 commits, and can be fast-forwarded."
 | 
					  assert_output --regexp 'behind .* 3 commits'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA app new "$TEST_RECIPE" \
 | 
					  run $ABRA app new "$TEST_RECIPE" \
 | 
				
			||||||
    --no-input \
 | 
					    --no-input \
 | 
				
			||||||
@ -131,7 +131,7 @@ teardown(){
 | 
				
			|||||||
  assert_exists "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env"
 | 
					  assert_exists "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  assert_output --partial "Your branch is up to date with 'origin/main'."
 | 
					  assert_output --partial "up to date"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _reset_recipe
 | 
					  _reset_recipe
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -141,7 +141,7 @@ teardown(){
 | 
				
			|||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  assert_output --partial "Your branch is behind 'origin/main' by 3 commits, and can be fast-forwarded."
 | 
					  assert_output --regexp 'behind .* 3 commits'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # NOTE(d1): need to use --chaos to force same commit
 | 
					  # NOTE(d1): need to use --chaos to force same commit
 | 
				
			||||||
  run $ABRA app new "$TEST_RECIPE" \
 | 
					  run $ABRA app new "$TEST_RECIPE" \
 | 
				
			||||||
@ -154,7 +154,7 @@ teardown(){
 | 
				
			|||||||
  assert_exists "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env"
 | 
					  assert_exists "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  assert_output --partial "Your branch is behind 'origin/main' by 3 commits, and can be fast-forwarded."
 | 
					  assert_output --regexp 'behind .* 3 commits'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _reset_recipe
 | 
					  _reset_recipe
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -104,7 +104,10 @@ teardown(){
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  _undeploy_app
 | 
					  _undeploy_app
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA app volume rm "$TEST_APP_DOMAIN"
 | 
					  # TODO: should wait as long as volume is no longer in use
 | 
				
			||||||
 | 
					  sleep 10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  run $ABRA app volume rm "$TEST_APP_DOMAIN" --no-input
 | 
				
			||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA app volume ls "$TEST_APP_DOMAIN"
 | 
					  run $ABRA app volume ls "$TEST_APP_DOMAIN"
 | 
				
			||||||
 | 
				
			|||||||
@ -109,13 +109,13 @@ teardown(){
 | 
				
			|||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  assert_output --partial 'behind 3'
 | 
					  assert_output --regexp 'behind .* 3 commits'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA app restore "$TEST_APP_DOMAIN" app DOESNTEXIST
 | 
					  run $ABRA app restore "$TEST_APP_DOMAIN" app
 | 
				
			||||||
  assert_failure
 | 
					  assert_failure
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  refute_output --partial 'behind 3'
 | 
					  assert_output --partial "up to date"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@test "ensure recipe not up to date if --offline" {
 | 
					@test "ensure recipe not up to date if --offline" {
 | 
				
			||||||
@ -126,19 +126,19 @@ teardown(){
 | 
				
			|||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  assert_output --partial 'behind 3'
 | 
					  assert_output --regexp 'behind .* 3 commits'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA app restore "$TEST_APP_DOMAIN" app DOESNTEXIST --offline
 | 
					  run $ABRA app restore "$TEST_APP_DOMAIN" app --offline
 | 
				
			||||||
  assert_failure
 | 
					  assert_failure
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  assert_output --partial 'behind 3'
 | 
					  assert_output --regexp 'behind .* 3 commits'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" checkout "$latestCommit"
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" checkout "$latestCommit"
 | 
				
			||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  refute_output --partial 'behind 3'
 | 
					  assert_output --partial "HEAD detached at $latestCommit"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@test "error if missing service" {
 | 
					@test "error if missing service" {
 | 
				
			||||||
 | 
				
			|||||||
@ -50,13 +50,13 @@ teardown(){
 | 
				
			|||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  assert_output --partial 'behind 3'
 | 
					  assert_output --regexp 'behind .* 3 commits'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA app rollback "$TEST_APP_DOMAIN" --no-input --no-converge-checks
 | 
					  run $ABRA app rollback "$TEST_APP_DOMAIN" --no-input --no-converge-checks
 | 
				
			||||||
  assert_failure
 | 
					  assert_failure
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  refute_output --partial 'behind 3'
 | 
					  assert_output --partial "up to date"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@test "ensure recipe not up to date if --offline" {
 | 
					@test "ensure recipe not up to date if --offline" {
 | 
				
			||||||
@ -67,14 +67,14 @@ teardown(){
 | 
				
			|||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  assert_output --partial 'behind 3'
 | 
					  assert_output --regexp 'behind .* 3 commits'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA app rollback "$TEST_APP_DOMAIN" \
 | 
					  run $ABRA app rollback "$TEST_APP_DOMAIN" \
 | 
				
			||||||
    --no-input --no-converge-checks --offline
 | 
					    --no-input --no-converge-checks --offline
 | 
				
			||||||
  assert_failure
 | 
					  assert_failure
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  assert_output --partial 'behind 3'
 | 
					  assert_output --regexp 'behind .* 3 commits'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" checkout "$latestCommit"
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" checkout "$latestCommit"
 | 
				
			||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
@ -131,7 +131,7 @@ teardown(){
 | 
				
			|||||||
  latestCommit="$(git -C "$ABRA_DIR/recipes/$TEST_RECIPE" rev-parse --short HEAD)"
 | 
					  latestCommit="$(git -C "$ABRA_DIR/recipes/$TEST_RECIPE" rev-parse --short HEAD)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA app deploy "$TEST_APP_DOMAIN" \
 | 
					  run $ABRA app deploy "$TEST_APP_DOMAIN" \
 | 
				
			||||||
    --no-input --no-converge-checks --chaos
 | 
					    --no-input --chaos
 | 
				
			||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
  assert_output --partial "$latestCommit"
 | 
					  assert_output --partial "$latestCommit"
 | 
				
			||||||
  assert_output --partial 'chaos'
 | 
					  assert_output --partial 'chaos'
 | 
				
			||||||
 | 
				
			|||||||
@ -8,7 +8,7 @@ setup_file(){
 | 
				
			|||||||
  run $ABRA app new "$TEST_RECIPE" \
 | 
					  run $ABRA app new "$TEST_RECIPE" \
 | 
				
			||||||
    --no-input \
 | 
					    --no-input \
 | 
				
			||||||
    --server "$TEST_SERVER" \
 | 
					    --server "$TEST_SERVER" \
 | 
				
			||||||
    --domain "$TEST_APP_DOMAIN" \
 | 
					    --domain "$TEST_APP_DOMAIN"
 | 
				
			||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
  assert_exists "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env"
 | 
					  assert_exists "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -19,13 +19,6 @@ teardown_file(){
 | 
				
			|||||||
  _reset_recipe
 | 
					  _reset_recipe
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
teardown(){
 | 
					 | 
				
			||||||
  # https://github.com/bats-core/bats-core/issues/383#issuecomment-738628888
 | 
					 | 
				
			||||||
  if [[ -z "${BATS_TEST_COMPLETED}" ]]; then
 | 
					 | 
				
			||||||
    _undeploy_app
 | 
					 | 
				
			||||||
  fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
setup(){
 | 
					setup(){
 | 
				
			||||||
  load "$PWD/tests/integration/helpers/common"
 | 
					  load "$PWD/tests/integration/helpers/common"
 | 
				
			||||||
  _common_setup
 | 
					  _common_setup
 | 
				
			||||||
 | 
				
			|||||||
@ -59,6 +59,8 @@ teardown(){
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# bats test_tags=slow
 | 
					# bats test_tags=slow
 | 
				
			||||||
@test "error if not in catalogue" {
 | 
					@test "error if not in catalogue" {
 | 
				
			||||||
 | 
					  skip "known issue, see https://git.coopcloud.tech/coop-cloud/recipes-catalogue-json/issues/6"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _deploy_app
 | 
					  _deploy_app
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA app version "$TEST_APP_DOMAIN"
 | 
					  run $ABRA app version "$TEST_APP_DOMAIN"
 | 
				
			||||||
@ -92,7 +94,7 @@ teardown(){
 | 
				
			|||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 # NOTE(d1): to let the stack come down before nuking volumes
 | 
					 # NOTE(d1): to let the stack come down before nuking volumes
 | 
				
			||||||
  sleep 3
 | 
					  sleep 5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA app volume remove "$appDomain" --no-input
 | 
					  run $ABRA app volume remove "$appDomain" --no-input
 | 
				
			||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
				
			|||||||
@ -79,7 +79,7 @@ teardown(){
 | 
				
			|||||||
  _undeploy_app
 | 
					  _undeploy_app
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # NOTE(d1): to let the stack come down before nuking volumes
 | 
					  # NOTE(d1): to let the stack come down before nuking volumes
 | 
				
			||||||
  sleep 5
 | 
					  sleep 10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA app volume rm "$TEST_APP_DOMAIN" --force
 | 
					  run $ABRA app volume rm "$TEST_APP_DOMAIN" --force
 | 
				
			||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
@ -93,7 +93,7 @@ teardown(){
 | 
				
			|||||||
  _undeploy_app
 | 
					  _undeploy_app
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # NOTE(d1): to let the stack come down before nuking volumes
 | 
					  # NOTE(d1): to let the stack come down before nuking volumes
 | 
				
			||||||
  sleep 5
 | 
					  sleep 10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA app volume rm "$TEST_APP_DOMAIN" --force
 | 
					  run $ABRA app volume rm "$TEST_APP_DOMAIN" --force
 | 
				
			||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
				
			|||||||
@ -1,17 +1,18 @@
 | 
				
			|||||||
#!/usr/bin/env bash
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_new_app() {
 | 
					_new_app() {
 | 
				
			||||||
  run $ABRA app new "$TEST_RECIPE" \
 | 
					  run $ABRA app new \
 | 
				
			||||||
    --no-input \
 | 
					    --no-input \
 | 
				
			||||||
    --server "$TEST_SERVER" \
 | 
					    --server "$TEST_SERVER" \
 | 
				
			||||||
    --domain "$TEST_APP_DOMAIN" \
 | 
					    --domain "$TEST_APP_DOMAIN" \
 | 
				
			||||||
    --secrets
 | 
					    --secrets \
 | 
				
			||||||
 | 
					    "$TEST_RECIPE"
 | 
				
			||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
  assert_exists "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env"
 | 
					  assert_exists "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_deploy_app() {
 | 
					_deploy_app() {
 | 
				
			||||||
  run $ABRA app deploy "$TEST_APP_DOMAIN" --no-input
 | 
					  run $ABRA app deploy --no-input "$TEST_APP_DOMAIN"
 | 
				
			||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA app ls --server "$TEST_SERVER" --status
 | 
					  run $ABRA app ls --server "$TEST_SERVER" --status
 | 
				
			||||||
@ -21,7 +22,7 @@ _deploy_app() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_undeploy_app() {
 | 
					_undeploy_app() {
 | 
				
			||||||
  run $ABRA app undeploy "$TEST_APP_DOMAIN" --no-input
 | 
					  run $ABRA app undeploy --no-input "$TEST_APP_DOMAIN"
 | 
				
			||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA app ls --server "$TEST_SERVER" --status
 | 
					  run $ABRA app ls --server "$TEST_SERVER" --status
 | 
				
			||||||
@ -34,10 +35,10 @@ _rm_app() {
 | 
				
			|||||||
  # NOTE(d1): not asserting outcomes on teardown here since some might fail
 | 
					  # NOTE(d1): not asserting outcomes on teardown here since some might fail
 | 
				
			||||||
  # depending on what the test created. all commands run through anyway
 | 
					  # depending on what the test created. all commands run through anyway
 | 
				
			||||||
  if [[ -f "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" ]]; then
 | 
					  if [[ -f "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" ]]; then
 | 
				
			||||||
    run $ABRA app undeploy "$TEST_APP_DOMAIN" --no-input
 | 
					    run $ABRA app undeploy --no-input "$TEST_APP_DOMAIN"
 | 
				
			||||||
    run $ABRA app secret remove "$TEST_APP_DOMAIN" --all --no-input
 | 
					    run $ABRA app secret remove --all --no-input "$TEST_APP_DOMAIN"
 | 
				
			||||||
    run $ABRA app volume remove "$TEST_APP_DOMAIN" --no-input
 | 
					    run $ABRA app volume remove --no-input "$TEST_APP_DOMAIN"
 | 
				
			||||||
    run $ABRA app remove "$TEST_APP_DOMAIN" --no-input
 | 
					    run $ABRA app remove --no-input "$TEST_APP_DOMAIN"
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -46,10 +47,11 @@ _reset_app(){
 | 
				
			|||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
  assert_not_exists "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env"
 | 
					  assert_not_exists "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA app new "$TEST_RECIPE" \
 | 
					  run $ABRA app new \
 | 
				
			||||||
    --no-input \
 | 
					    --no-input \
 | 
				
			||||||
    --server "$TEST_SERVER" \
 | 
					    --server "$TEST_SERVER" \
 | 
				
			||||||
    --domain "$TEST_APP_DOMAIN" \
 | 
					    --domain "$TEST_APP_DOMAIN" \
 | 
				
			||||||
 | 
					    "$TEST_RECIPE"
 | 
				
			||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
  assert_exists "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env"
 | 
					  assert_exists "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -11,7 +11,11 @@ _add_server() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_rm_server() {
 | 
					_rm_server() {
 | 
				
			||||||
 | 
					  if [[ "$TEST_SERVER" == "default" ]]; then
 | 
				
			||||||
 | 
					      run rm -rf "$ABRA_DIR/servers/default"
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
      run $ABRA server remove --no-input "$TEST_SERVER"
 | 
					      run $ABRA server remove --no-input "$TEST_SERVER"
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
  assert_not_exists "$ABRA_DIR/servers/$TEST_SERVER"
 | 
					  assert_not_exists "$ABRA_DIR/servers/$TEST_SERVER"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -66,13 +66,13 @@ setup() {
 | 
				
			|||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  assert_output --partial 'behind 3'
 | 
					  assert_output --regexp 'behind .* 3 commits'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA recipe lint "$TEST_RECIPE"
 | 
					  run $ABRA recipe lint "$TEST_RECIPE"
 | 
				
			||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  refute_output --partial 'behind 3'
 | 
					  assert_output --regexp 'behind .* 3 commits'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _reset_recipe
 | 
					  _reset_recipe
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -82,13 +82,13 @@ setup() {
 | 
				
			|||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  assert_output --partial 'behind 3'
 | 
					  assert_output --regexp 'behind .* 3 commits'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA recipe lint "$TEST_RECIPE" --offline
 | 
					  run $ABRA recipe lint "$TEST_RECIPE" --offline
 | 
				
			||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  assert_output --partial 'behind 3'
 | 
					  assert_output --regexp 'behind .* 3 commits'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _reset_recipe
 | 
					  _reset_recipe
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -23,14 +23,14 @@ teardown(){
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@test "create new recipe" {
 | 
					@test "create new recipe" {
 | 
				
			||||||
  run $ABRA recipe new foobar --git-name foo --git-email foo@example.com
 | 
					  run $ABRA recipe new foobar
 | 
				
			||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
  assert_output --partial 'Your new foobar recipe has been created'
 | 
					  assert_output --partial 'Your new foobar recipe has been created'
 | 
				
			||||||
  assert_exists "$ABRA_DIR/recipes/foobar"
 | 
					  assert_exists "$ABRA_DIR/recipes/foobar"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@test "create new app from new recipe" {
 | 
					@test "create new app from new recipe" {
 | 
				
			||||||
  run $ABRA recipe new foobar --git-name foo --git-email foo@example.com
 | 
					  run $ABRA recipe new foobar
 | 
				
			||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA app new foobar \
 | 
					  run $ABRA app new foobar \
 | 
				
			||||||
 | 
				
			|||||||
@ -61,14 +61,14 @@ setup(){
 | 
				
			|||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  assert_output --partial 'behind 3'
 | 
					  assert_output --regexp 'behind .* 3 commits'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA recipe upgrade "$TEST_RECIPE" --no-input
 | 
					  run $ABRA recipe upgrade "$TEST_RECIPE" --no-input
 | 
				
			||||||
  assert_success
 | 
					  assert_success
 | 
				
			||||||
  assert_output --partial 'can upgrade service: app'
 | 
					  assert_output --partial 'can upgrade service: app'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
					  run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" status
 | 
				
			||||||
  refute_output --partial 'behind 3'
 | 
					  assert_output --regexp 'behind .* 3 commits'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _reset_recipe
 | 
					  _reset_recipe
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -12,6 +12,8 @@ setup() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@test "error if not present in catalogue" {
 | 
					@test "error if not present in catalogue" {
 | 
				
			||||||
 | 
					  skip "known issue, see https://git.coopcloud.tech/coop-cloud/recipes-catalogue-json/issues/6"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  run $ABRA recipe versions "$TEST_RECIPE"
 | 
					  run $ABRA recipe versions "$TEST_RECIPE"
 | 
				
			||||||
  assert_failure
 | 
					  assert_failure
 | 
				
			||||||
  assert_output --partial "is not published on the catalogue"
 | 
					  assert_output --partial "is not published on the catalogue"
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user