docs: terse manually managed usage text
This commit is contained in:
parent
4580ea9dc8
commit
edb542c653
@ -8,7 +8,7 @@ var AppCommand = cli.Command{
|
||||
Name: "app",
|
||||
Aliases: []string{"a"},
|
||||
Usage: "Manage apps",
|
||||
ArgsUsage: "<domain>",
|
||||
UsageText: "abra app [command] [options] [arguments]",
|
||||
HideHelpCommand: true,
|
||||
Commands: []*cli.Command{
|
||||
&appBackupCommand,
|
||||
|
@ -46,6 +46,8 @@ var appBackupListCommand = cli.Command{
|
||||
Before: internal.SubCommandBefore,
|
||||
Usage: "List all backups",
|
||||
EnableShellCompletion: true,
|
||||
HideHelpCommand: true,
|
||||
UsageText: "abra app backup list [options] <domain>",
|
||||
ShellComplete: autocomplete.AppNameComplete,
|
||||
Action: func(ctx context.Context, cmd *cli.Command) error {
|
||||
app := internal.ValidateApp(cmd)
|
||||
@ -92,6 +94,8 @@ var appBackupDownloadCommand = cli.Command{
|
||||
},
|
||||
Before: internal.SubCommandBefore,
|
||||
Usage: "Download a backup",
|
||||
UsageText: "abra app backup download [options] <domain>",
|
||||
HideHelpCommand: true,
|
||||
EnableShellCompletion: true,
|
||||
ShellComplete: autocomplete.AppNameComplete,
|
||||
Action: func(ctx context.Context, cmd *cli.Command) error {
|
||||
@ -162,6 +166,8 @@ var appBackupCreateCommand = cli.Command{
|
||||
},
|
||||
Before: internal.SubCommandBefore,
|
||||
Usage: "Create a new backup",
|
||||
HideHelpCommand: true,
|
||||
UsageText: "abra app backup create [options] <domain>",
|
||||
EnableShellCompletion: true,
|
||||
ShellComplete: autocomplete.AppNameComplete,
|
||||
Action: func(ctx context.Context, cmd *cli.Command) error {
|
||||
@ -220,6 +226,8 @@ var appBackupSnapshotsCommand = cli.Command{
|
||||
},
|
||||
Before: internal.SubCommandBefore,
|
||||
Usage: "List backup snapshots",
|
||||
UsageText: "abra app backup snapshots [options] <domain>",
|
||||
HideHelpCommand: true,
|
||||
EnableShellCompletion: true,
|
||||
ShellComplete: autocomplete.AppNameComplete,
|
||||
Action: func(ctx context.Context, cmd *cli.Command) error {
|
||||
@ -270,10 +278,11 @@ var appBackupSnapshotsCommand = cli.Command{
|
||||
}
|
||||
|
||||
var appBackupCommand = cli.Command{
|
||||
Name: "backup",
|
||||
Aliases: []string{"b"},
|
||||
Usage: "Manage app backups",
|
||||
ArgsUsage: "<domain>",
|
||||
Name: "backup",
|
||||
Aliases: []string{"b"},
|
||||
Usage: "Manage app backups",
|
||||
UsageText: "abra app backup [command] [options] [arguments]",
|
||||
HideHelpCommand: true,
|
||||
Commands: []*cli.Command{
|
||||
&appBackupListCommand,
|
||||
&appBackupSnapshotsCommand,
|
||||
|
@ -15,9 +15,7 @@ var appCheckCommand = cli.Command{
|
||||
Name: "check",
|
||||
Aliases: []string{"chk"},
|
||||
Usage: "Ensure an app is well configured",
|
||||
Description: `
|
||||
This command compares env vars in both the app ".env" and recipe ".env.sample"
|
||||
file.
|
||||
Description: `Compare env vars in both the app ".env" and recipe ".env.sample" file.
|
||||
|
||||
The goal is to ensure that recipe ".env.sample" env vars are defined in your
|
||||
app ".env" file. Only env var definitions in the ".env.sample" which are
|
||||
@ -27,7 +25,8 @@ these env vars, then "check" will complain.
|
||||
Recipe maintainers may or may not provide defaults for env vars within their
|
||||
recipes regardless of commenting or not (e.g. through the use of
|
||||
${FOO:<default>} syntax). "check" does not confirm or deny this for you.`,
|
||||
ArgsUsage: "<domain>",
|
||||
UsageText: "abra app check [options] <domain>",
|
||||
HideHelpCommand: true,
|
||||
Flags: []cli.Flag{
|
||||
internal.ChaosFlag,
|
||||
internal.OfflineFlag,
|
||||
|
@ -28,14 +28,11 @@ var appCmdCommand = cli.Command{
|
||||
These commands are bash functions, defined in the abra.sh of the recipe itself.
|
||||
They can be run within the context of a service (e.g. app) or locally on your
|
||||
work station by passing "--local". Arguments can be passed into these functions
|
||||
using the "-- <args>" syntax.
|
||||
using the "-- <cmd-args>" syntax.
|
||||
|
||||
**WARNING**: options must be passed directly after the sub-command "cmd".
|
||||
|
||||
EXAMPLE:
|
||||
|
||||
abra app cmd --local example.com app create_user -- me@example.com`,
|
||||
ArgsUsage: "<domain> [<service>] <command> [-- <args>]",
|
||||
**WARNING**: [options] must be passed directly after the "cmd" sub-command.`,
|
||||
UsageText: "abra app cmd [options] <domain> [<service>] <cmd> [-- <cmd-args>]",
|
||||
HideHelpCommand: true,
|
||||
Flags: []cli.Flag{
|
||||
internal.LocalCmdFlag,
|
||||
internal.RemoteUserFlag,
|
||||
@ -199,10 +196,11 @@ func cmdNameComplete(appName string) {
|
||||
}
|
||||
|
||||
var appCmdListCommand = cli.Command{
|
||||
Name: "list",
|
||||
Aliases: []string{"ls"},
|
||||
Usage: "List all available commands",
|
||||
ArgsUsage: "<domain>",
|
||||
Name: "list",
|
||||
Aliases: []string{"ls"},
|
||||
Usage: "List all available commands",
|
||||
UsageText: "abra app cmd ls [options] <domain>",
|
||||
HideHelpCommand: true,
|
||||
Flags: []cli.Flag{
|
||||
internal.OfflineFlag,
|
||||
internal.ChaosFlag,
|
||||
|
@ -18,7 +18,8 @@ var appConfigCommand = cli.Command{
|
||||
Name: "config",
|
||||
Aliases: []string{"cfg"},
|
||||
Usage: "Edit app config",
|
||||
ArgsUsage: "<domain>",
|
||||
HideHelpCommand: true,
|
||||
UsageText: "abra app config [options] <domain>",
|
||||
Before: internal.SubCommandBefore,
|
||||
EnableShellCompletion: true,
|
||||
ShellComplete: autocomplete.AppNameComplete,
|
||||
|
@ -26,16 +26,16 @@ import (
|
||||
)
|
||||
|
||||
var appCpCommand = cli.Command{
|
||||
Name: "cp",
|
||||
Aliases: []string{"c"},
|
||||
ArgsUsage: "<domain> <src> <dst>",
|
||||
Name: "cp",
|
||||
Aliases: []string{"c"},
|
||||
HideHelpCommand: true,
|
||||
UsageText: "abra app cp [options] <domain> <src> <dst>",
|
||||
Flags: []cli.Flag{
|
||||
internal.NoInputFlag,
|
||||
},
|
||||
Before: internal.SubCommandBefore,
|
||||
Usage: "Copy files to/from a deployed app service",
|
||||
Description: `
|
||||
Copy files to and from any app service file system.
|
||||
Description: `Copy files to and from any app service file system.
|
||||
|
||||
If you want to copy a myfile.txt to the root of the app service:
|
||||
|
||||
|
@ -19,10 +19,12 @@ import (
|
||||
)
|
||||
|
||||
var appDeployCommand = cli.Command{
|
||||
Name: "deploy",
|
||||
Aliases: []string{"d"},
|
||||
Usage: "Deploy an app",
|
||||
ArgsUsage: "<domain> [<version>]",
|
||||
Name: "deploy",
|
||||
Aliases: []string{"d"},
|
||||
Usage: "Deploy an app",
|
||||
ArgsUsage: "<domain> [<version>]",
|
||||
HideHelpCommand: true,
|
||||
UsageText: "abra app deploy [options] <domain> [<version>]",
|
||||
Flags: []cli.Flag{
|
||||
internal.NoInputFlag,
|
||||
internal.ForceFlag,
|
||||
@ -37,13 +39,7 @@ var appDeployCommand = cli.Command{
|
||||
This command supports chaos operations. Use "--chaos" to deploy your recipe
|
||||
checkout as-is. Recipe commit hashes are also supported values for
|
||||
"[<version>]". Please note, "upgrade"/"rollback" do not support chaos
|
||||
operations.
|
||||
|
||||
EXAMPLE:
|
||||
|
||||
abra app deploy foo.example.com
|
||||
abra app deploy foo.example.com 1.2.3+3.2.1
|
||||
abra app deploy foo.example.com 1e83340e`,
|
||||
operations.`,
|
||||
EnableShellCompletion: true,
|
||||
ShellComplete: autocomplete.AppNameComplete,
|
||||
Action: func(ctx context.Context, cmd *cli.Command) error {
|
||||
|
@ -71,12 +71,12 @@ type serverStatus struct {
|
||||
}
|
||||
|
||||
var appListCommand = cli.Command{
|
||||
Name: "list",
|
||||
Aliases: []string{"ls"},
|
||||
Usage: "List all managed apps",
|
||||
Description: `
|
||||
Read the local file system listing of apps and servers (e.g. ~/.abra/) to
|
||||
generate a report of all your apps.
|
||||
Name: "list",
|
||||
Aliases: []string{"ls"},
|
||||
Usage: "List all managed apps",
|
||||
HideHelpCommand: true,
|
||||
UsageText: "abra app list [options]",
|
||||
Description: `Generate a report of all managed apps.
|
||||
|
||||
By passing the "--status/-S" flag, you can query all your servers for the
|
||||
actual live deployment status. Depending on how many servers you manage, this
|
||||
|
@ -23,10 +23,11 @@ import (
|
||||
)
|
||||
|
||||
var appLogsCommand = cli.Command{
|
||||
Name: "logs",
|
||||
Aliases: []string{"l"},
|
||||
ArgsUsage: "<domain> [<service>]",
|
||||
Usage: "Tail app logs",
|
||||
Name: "logs",
|
||||
Aliases: []string{"l"},
|
||||
Usage: "Tail app logs",
|
||||
HideHelpCommand: true,
|
||||
UsageText: "abra app logs [options] <domain> [<service>]",
|
||||
Flags: []cli.Flag{
|
||||
internal.StdErrOnlyFlag,
|
||||
internal.SinceLogsFlag,
|
||||
|
@ -19,9 +19,10 @@ import (
|
||||
"github.com/urfave/cli/v3"
|
||||
)
|
||||
|
||||
var appNewDescription = `
|
||||
Creates a new app from a default recipe. This new app configuration is stored
|
||||
in your $ABRA_DIR directory under the appropriate server.
|
||||
var appNewDescription = `Creates a new app from a default recipe.
|
||||
|
||||
This new app configuration is stored in your $ABRA_DIR directory under the
|
||||
appropriate server.
|
||||
|
||||
This command does not deploy your app for you. You will need to run "abra app
|
||||
deploy <domain>" to do so.
|
||||
@ -53,7 +54,8 @@ var appNewCommand = cli.Command{
|
||||
internal.ChaosFlag,
|
||||
},
|
||||
Before: internal.SubCommandBefore,
|
||||
ArgsUsage: "[<recipe>] [<version>]",
|
||||
HideHelpCommand: true,
|
||||
UsageText: "abra app new [options] [<recipe>] [<version>]",
|
||||
EnableShellCompletion: true,
|
||||
ShellComplete: func(ctx context.Context, cmd *cli.Command) {
|
||||
args := cmd.Args()
|
||||
|
@ -21,11 +21,12 @@ import (
|
||||
)
|
||||
|
||||
var appPsCommand = cli.Command{
|
||||
Name: "ps",
|
||||
Aliases: []string{"p"},
|
||||
Usage: "Check app status",
|
||||
ArgsUsage: "<domain>",
|
||||
Description: "Show status of a deployed app.",
|
||||
Name: "ps",
|
||||
Aliases: []string{"p"},
|
||||
Usage: "Check app status",
|
||||
HideHelpCommand: true,
|
||||
UsageText: "abra app ps [options] <domain>",
|
||||
Description: "Show status of a deployed app.",
|
||||
Flags: []cli.Flag{
|
||||
internal.MachineReadableFlag,
|
||||
},
|
||||
|
@ -16,12 +16,12 @@ import (
|
||||
)
|
||||
|
||||
var appRemoveCommand = cli.Command{
|
||||
Name: "remove",
|
||||
Aliases: []string{"rm"},
|
||||
ArgsUsage: "<domain>",
|
||||
Usage: "Remove all app data, locally and remotely",
|
||||
Description: `
|
||||
This command removes everything related to an app which is already undeployed.
|
||||
Name: "remove",
|
||||
Aliases: []string{"rm"},
|
||||
HideHelpCommand: true,
|
||||
UsageText: "abra app remove [options] <domain>",
|
||||
Usage: "Remove all app data, locally and remotely",
|
||||
Description: `Remove everything related to an app which is already undeployed.
|
||||
|
||||
By default, it will prompt for confirmation before proceeding. All secrets,
|
||||
volumes and the local app env file will be deleted.
|
||||
|
@ -16,25 +16,21 @@ import (
|
||||
)
|
||||
|
||||
var appRestartCommand = cli.Command{
|
||||
Name: "restart",
|
||||
Aliases: []string{"re"},
|
||||
Usage: "Restart an app",
|
||||
ArgsUsage: "<domain> [<service>]",
|
||||
Name: "restart",
|
||||
Aliases: []string{"re"},
|
||||
Usage: "Restart an app",
|
||||
HideHelpCommand: true,
|
||||
UsageText: "abra app restart [options] <domain> [<service>]",
|
||||
Flags: []cli.Flag{
|
||||
internal.OfflineFlag,
|
||||
internal.AllServicesFlag,
|
||||
},
|
||||
Before: internal.SubCommandBefore,
|
||||
Description: `
|
||||
This command restarts services within a deployed app.
|
||||
Description: `This command restarts services within a deployed app.
|
||||
|
||||
Run "abra app ps <domain>" to see a list of service names.
|
||||
|
||||
Pass "--all-services/-a" to restart all services.
|
||||
|
||||
EXAMPLE:
|
||||
|
||||
abra app restart example.com app`,
|
||||
Pass "--all-services/-a" to restart all services.`,
|
||||
EnableShellCompletion: true,
|
||||
ShellComplete: autocomplete.AppNameComplete,
|
||||
Action: func(ctx context.Context, cmd *cli.Command) error {
|
||||
|
@ -20,10 +20,11 @@ var targetPathFlag = &cli.StringFlag{
|
||||
}
|
||||
|
||||
var appRestoreCommand = cli.Command{
|
||||
Name: "restore",
|
||||
Aliases: []string{"rs"},
|
||||
Usage: "Restore an app backup",
|
||||
ArgsUsage: "<domain> <service>",
|
||||
Name: "restore",
|
||||
Aliases: []string{"rs"},
|
||||
Usage: "Restore an app backup",
|
||||
HideHelpCommand: true,
|
||||
UsageText: "abra app restore [options] <domain> <service>",
|
||||
Flags: []cli.Flag{
|
||||
internal.OfflineFlag,
|
||||
targetPathFlag,
|
||||
|
@ -19,10 +19,11 @@ import (
|
||||
)
|
||||
|
||||
var appRollbackCommand = cli.Command{
|
||||
Name: "rollback",
|
||||
Aliases: []string{"rl"},
|
||||
Usage: "Roll an app back to a previous version",
|
||||
ArgsUsage: "<domain> [<version>]",
|
||||
Name: "rollback",
|
||||
Aliases: []string{"rl"},
|
||||
Usage: "Roll an app back to a previous version",
|
||||
HideHelpCommand: true,
|
||||
UsageText: "abra app rollback [options] <domain> [<version>]",
|
||||
Flags: []cli.Flag{
|
||||
internal.NoInputFlag,
|
||||
internal.ForceFlag,
|
||||
@ -31,19 +32,13 @@ var appRollbackCommand = cli.Command{
|
||||
internal.OfflineFlag,
|
||||
},
|
||||
Before: internal.SubCommandBefore,
|
||||
Description: `
|
||||
This command rolls an app back to a previous version.
|
||||
Description: `This command rolls an app back to a previous version.
|
||||
|
||||
Unlike "deploy", chaos operations are not supported here. Only recipe versions
|
||||
are supported values for "[<version>]".
|
||||
|
||||
A rollback can be destructive, please ensure you have a copy of your app data
|
||||
beforehand.
|
||||
|
||||
EXAMPLE:
|
||||
|
||||
abra app rollback foo.example.com
|
||||
abra app rollback foo.example.com 1.2.3+3.2.1`,
|
||||
beforehand.`,
|
||||
EnableShellCompletion: true,
|
||||
ShellComplete: autocomplete.AppNameComplete,
|
||||
Action: func(ctx context.Context, cmd *cli.Command) error {
|
||||
|
@ -40,8 +40,9 @@ var appRunCommand = cli.Command{
|
||||
userFlag,
|
||||
},
|
||||
Before: internal.SubCommandBefore,
|
||||
ArgsUsage: "<domain> <service> <args>...",
|
||||
Usage: "Run a command in a service container",
|
||||
UsageText: "abra app run [options] <domain> <service> <args>",
|
||||
Usage: "Run a command in an app service",
|
||||
HideHelpCommand: true,
|
||||
EnableShellCompletion: true,
|
||||
ShellComplete: autocomplete.AppNameComplete,
|
||||
Action: func(ctx context.Context, cmd *cli.Command) error {
|
||||
|
@ -41,10 +41,11 @@ var (
|
||||
)
|
||||
|
||||
var appSecretGenerateCommand = cli.Command{
|
||||
Name: "generate",
|
||||
Aliases: []string{"g"},
|
||||
Usage: "Generate secrets",
|
||||
ArgsUsage: "<domain> <secret> <version>",
|
||||
Name: "generate",
|
||||
Aliases: []string{"g"},
|
||||
Usage: "Generate secrets",
|
||||
UsageText: "abra app secret generate [options] <domain> <secret> <version>",
|
||||
HideHelpCommand: true,
|
||||
Flags: []cli.Flag{
|
||||
allSecretsFlag,
|
||||
internal.PassFlag,
|
||||
@ -145,21 +146,15 @@ var appSecretInsertCommand = cli.Command{
|
||||
internal.TrimFlag,
|
||||
},
|
||||
Before: internal.SubCommandBefore,
|
||||
ArgsUsage: "<domain> <secret-name> <version> <data>",
|
||||
UsageText: "abra app secret insert [options] <domain> <secret> <version> <data>",
|
||||
HideHelpCommand: true,
|
||||
EnableShellCompletion: true,
|
||||
ShellComplete: autocomplete.AppNameComplete,
|
||||
Description: `
|
||||
This command inserts a secret into an app environment.
|
||||
Description: `This command inserts a secret into an app environment.
|
||||
|
||||
This can be useful when you want to manually generate secrets for an app
|
||||
environment. Typically, you can let Abra generate them for you on app creation
|
||||
(see "abra app new --secrets" for more).
|
||||
|
||||
Example:
|
||||
|
||||
abra app secret insert myapp db_pass v1 mySecretPassword
|
||||
|
||||
`,
|
||||
(see "abra app new --secrets" for more).`,
|
||||
Action: func(ctx context.Context, cmd *cli.Command) error {
|
||||
app := internal.ValidateApp(cmd)
|
||||
|
||||
@ -383,10 +378,11 @@ var appSecretLsCommand = cli.Command{
|
||||
}
|
||||
|
||||
var appSecretCommand = cli.Command{
|
||||
Name: "secret",
|
||||
Aliases: []string{"s"},
|
||||
Usage: "Manage app secrets",
|
||||
ArgsUsage: "<domain>",
|
||||
Name: "secret",
|
||||
Aliases: []string{"s"},
|
||||
Usage: "Manage app secrets",
|
||||
HideHelpCommand: true,
|
||||
UsageText: "abra app secret [command] [options] [arguments]",
|
||||
Commands: []*cli.Command{
|
||||
&appSecretGenerateCommand,
|
||||
&appSecretInsertCommand,
|
||||
|
@ -20,7 +20,8 @@ var appServicesCommand = cli.Command{
|
||||
Name: "services",
|
||||
Aliases: []string{"sr"},
|
||||
Usage: "Display all services of an app",
|
||||
ArgsUsage: "<domain>",
|
||||
HideHelpCommand: true,
|
||||
UsageText: "abra app services [options] <domain>",
|
||||
Before: internal.SubCommandBefore,
|
||||
EnableShellCompletion: true,
|
||||
ShellComplete: autocomplete.AppNameComplete,
|
||||
|
@ -62,9 +62,10 @@ func pruneApp(cl *dockerClient.Client, app appPkg.App) error {
|
||||
}
|
||||
|
||||
var appUndeployCommand = cli.Command{
|
||||
Name: "undeploy",
|
||||
Aliases: []string{"un"},
|
||||
ArgsUsage: "<domain>",
|
||||
Name: "undeploy",
|
||||
Aliases: []string{"un"},
|
||||
UsageText: "abra app undeploy [options] <domain>",
|
||||
HideHelpCommand: true,
|
||||
Flags: []cli.Flag{
|
||||
internal.NoInputFlag,
|
||||
pruneFlag,
|
||||
@ -73,8 +74,7 @@ var appUndeployCommand = cli.Command{
|
||||
Usage: "Undeploy an app",
|
||||
EnableShellCompletion: true,
|
||||
ShellComplete: autocomplete.AppNameComplete,
|
||||
Description: `
|
||||
This does not destroy any of the application data.
|
||||
Description: `This does not destroy any of the application data.
|
||||
|
||||
However, you should remain vigilant, as your swarm installation will consider
|
||||
any previously attached volumes as eligible for pruning once undeployed.
|
||||
|
@ -21,7 +21,7 @@ var appUpgradeCommand = cli.Command{
|
||||
Name: "upgrade",
|
||||
Aliases: []string{"up"},
|
||||
Usage: "Upgrade an app",
|
||||
ArgsUsage: "<domain> [<version>]",
|
||||
UsageText: "abra app upgrade [options] <domain> [<version>]",
|
||||
Flags: []cli.Flag{
|
||||
internal.NoInputFlag,
|
||||
internal.ForceFlag,
|
||||
@ -31,20 +31,15 @@ var appUpgradeCommand = cli.Command{
|
||||
internal.ReleaseNotesFlag,
|
||||
},
|
||||
Before: internal.SubCommandBefore,
|
||||
Description: `
|
||||
Upgrade an app.
|
||||
Description: `Upgrade an app.
|
||||
|
||||
Unlike "deploy", chaos operations are not supported here. Only recipe versions
|
||||
are supported values for "[<version>]".
|
||||
|
||||
An upgrade can be destructive, please ensure you have a copy of your app data
|
||||
beforehand.
|
||||
|
||||
EXAMPLE:
|
||||
|
||||
abra app upgrade foo.example.com
|
||||
abra app upgrade foo.example.com 1.2.3+3.2.1`,
|
||||
beforehand.`,
|
||||
EnableShellCompletion: true,
|
||||
HideHelpCommand: true,
|
||||
ShellComplete: autocomplete.AppNameComplete,
|
||||
Action: func(ctx context.Context, cmd *cli.Command) error {
|
||||
app := internal.ValidateApp(cmd)
|
||||
|
@ -16,12 +16,13 @@ import (
|
||||
var appVolumeListCommand = cli.Command{
|
||||
Name: "list",
|
||||
Aliases: []string{"ls"},
|
||||
ArgsUsage: "<domain>",
|
||||
UsageText: "abra app volume list [options] <domain>",
|
||||
Flags: []cli.Flag{
|
||||
internal.NoInputFlag,
|
||||
},
|
||||
Before: internal.SubCommandBefore,
|
||||
Usage: "List volumes associated with an app",
|
||||
HideHelpCommand: true,
|
||||
EnableShellCompletion: true,
|
||||
ShellComplete: autocomplete.AppNameComplete,
|
||||
Action: func(ctx context.Context, cmd *cli.Command) error {
|
||||
@ -64,20 +65,20 @@ var appVolumeListCommand = cli.Command{
|
||||
var appVolumeRemoveCommand = cli.Command{
|
||||
Name: "remove",
|
||||
Usage: "Remove volume(s) associated with an app",
|
||||
Description: `
|
||||
This command supports removing volumes associated with an app. The app in
|
||||
question must be undeployed before you try to remove volumes. See "abra app
|
||||
undeploy <domain>" for more.
|
||||
Description: `Memove volumes associated with an app.
|
||||
|
||||
The app in question must be undeployed before you try to remove volumes. See
|
||||
"abra app undeploy <domain>" for more.
|
||||
|
||||
The command is interactive and will show a multiple select input which allows
|
||||
you to make a seclection. Use the "?" key to see more help on navigating this
|
||||
interface.
|
||||
|
||||
Passing "--force/-f" will select all volumes for removal. Be careful.`,
|
||||
ArgsUsage: "<domain>",
|
||||
Aliases: []string{"rm"},
|
||||
HideHelpCommand: true,
|
||||
UsageText: "abra app volume remove [options] <domain>",
|
||||
Aliases: []string{"rm"},
|
||||
Flags: []cli.Flag{
|
||||
internal.DebugFlag,
|
||||
internal.NoInputFlag,
|
||||
internal.ForceFlag,
|
||||
},
|
||||
@ -146,10 +147,11 @@ Passing "--force/-f" will select all volumes for removal. Be careful.`,
|
||||
}
|
||||
|
||||
var appVolumeCommand = cli.Command{
|
||||
Name: "volume",
|
||||
Aliases: []string{"vl"},
|
||||
Usage: "Manage app volumes",
|
||||
ArgsUsage: "<domain>",
|
||||
Name: "volume",
|
||||
Aliases: []string{"vl"},
|
||||
Usage: "Manage app volumes",
|
||||
UsageText: "abra app volume [command] [options] [arguments]",
|
||||
HideHelpCommand: true,
|
||||
Commands: []*cli.Command{
|
||||
&appVolumeListCommand,
|
||||
&appVolumeRemoveCommand,
|
||||
|
@ -24,6 +24,7 @@ var catalogueGenerateCommand = cli.Command{
|
||||
Aliases: []string{"g"},
|
||||
Usage: "Generate the recipe catalogue",
|
||||
HideHelpCommand: true,
|
||||
UsageText: "abra catalogue generate [options] [<recipe>]",
|
||||
Flags: []cli.Flag{
|
||||
internal.NoInputFlag,
|
||||
internal.PublishFlag,
|
||||
@ -33,8 +34,7 @@ var catalogueGenerateCommand = cli.Command{
|
||||
internal.OfflineFlag,
|
||||
},
|
||||
Before: internal.SubCommandBefore,
|
||||
Description: `
|
||||
Generate a new copy of the recipe catalogue.
|
||||
Description: `Generate a new copy of the recipe catalogue.
|
||||
|
||||
It is possible to generate new metadata for a single recipe by passing
|
||||
<recipe>. The existing local catalogue will be updated, not overwritten.
|
||||
@ -46,7 +46,6 @@ If you have a Hub account you can have Abra log you in to avoid this. Pass
|
||||
Push your new release to git.coopcloud.tech with "-p/--publish". This requires
|
||||
that you have permission to git push to these repositories and have your SSH
|
||||
keys configured on your account.`,
|
||||
ArgsUsage: "[<recipe>]",
|
||||
EnableShellCompletion: true,
|
||||
ShellComplete: autocomplete.RecipeNameComplete,
|
||||
Action: func(ctx context.Context, cmd *cli.Command) error {
|
||||
@ -207,10 +206,11 @@ keys configured on your account.`,
|
||||
|
||||
// CatalogueCommand defines the `abra catalogue` command and sub-commands.
|
||||
var CatalogueCommand = cli.Command{
|
||||
Name: "catalogue",
|
||||
Usage: "Manage the recipe catalogue",
|
||||
Aliases: []string{"c"},
|
||||
ArgsUsage: "<recipe>",
|
||||
Name: "catalogue",
|
||||
Usage: "Manage the recipe catalogue",
|
||||
Aliases: []string{"c"},
|
||||
HideHelpCommand: true,
|
||||
UsageText: "abra catalogue [command] [options] [arguments]",
|
||||
Commands: []*cli.Command{
|
||||
&catalogueGenerateCommand,
|
||||
},
|
||||
|
33
cli/cli.go
33
cli/cli.go
@ -27,14 +27,9 @@ var AutoCompleteCommand = cli.Command{
|
||||
Name: "autocomplete",
|
||||
Aliases: []string{"ac"},
|
||||
Usage: "Configure shell autocompletion",
|
||||
Description: `
|
||||
Set up shell auto-completion.
|
||||
Description: `Set up shell auto-completion.
|
||||
|
||||
Supported shells are: bash, fish, fizsh & zsh.
|
||||
|
||||
EXAMPLE:
|
||||
|
||||
abra autocomplete bash`,
|
||||
Supported shells are: bash, fish, fizsh & zsh.`,
|
||||
ArgsUsage: "<shell>",
|
||||
Action: func(ctx context.Context, cmd *cli.Command) error {
|
||||
shellType := cmd.Args().First()
|
||||
@ -111,17 +106,11 @@ var UpgradeCommand = cli.Command{
|
||||
Name: "upgrade",
|
||||
Aliases: []string{"u"},
|
||||
Usage: "Upgrade abra",
|
||||
Description: `
|
||||
Upgrade abra in-place with the latest stable or release candidate.
|
||||
Description: `Upgrade abra in-place with the latest stable or release candidate.
|
||||
|
||||
Use "-r/--rc" to install the latest release candidate. Please bear in mind that
|
||||
it may contain absolutely catastrophic deal-breaker bugs. Thank you very much
|
||||
for the testing efforts 💗
|
||||
|
||||
EXAMPLE:
|
||||
|
||||
abra upgrade
|
||||
abra upgrade --rc`,
|
||||
for the testing efforts 💗`,
|
||||
Flags: []cli.Flag{internal.RCFlag},
|
||||
Action: func(ctx context.Context, cmd *cli.Command) error {
|
||||
mainURL := "https://install.abra.coopcloud.tech"
|
||||
@ -144,16 +133,10 @@ EXAMPLE:
|
||||
|
||||
func newAbraApp(version, commit string) *cli.Command {
|
||||
app := &cli.Command{
|
||||
Name: "abra",
|
||||
Usage: `the Co-op Cloud command-line utility belt 🎩🐇
|
||||
____ ____ _ _
|
||||
/ ___|___ ___ _ __ / ___| | ___ _ _ __| |
|
||||
| | / _ \ _____ / _ \| '_ \ | | | |/ _ \| | | |/ _' |
|
||||
| |__| (_) |_____| (_) | |_) | | |___| | (_) | |_| | (_| |
|
||||
\____\___/ \___/| .__/ \____|_|\___/ \__,_|\__,_|
|
||||
|_|
|
||||
`,
|
||||
Version: fmt.Sprintf("%s-%s", version, commit[:7]),
|
||||
Name: "abra",
|
||||
Usage: "The Co-op Cloud command-line utility belt 🎩🐇",
|
||||
UsageText: "abra [command] [options] [arguments]",
|
||||
Version: fmt.Sprintf("%s-%s", version, commit[:7]),
|
||||
Flags: []cli.Flag{
|
||||
internal.DebugFlag,
|
||||
},
|
||||
|
@ -11,11 +11,12 @@ import (
|
||||
)
|
||||
|
||||
var recipeDiffCommand = cli.Command{
|
||||
Name: "diff",
|
||||
Usage: "Show unstaged changes in recipe config",
|
||||
Description: "This command requires /usr/bin/git.",
|
||||
Aliases: []string{"d"},
|
||||
ArgsUsage: "<recipe>",
|
||||
Name: "diff",
|
||||
Usage: "Show unstaged changes in recipe config",
|
||||
Description: "This command requires /usr/bin/git.",
|
||||
HideHelpCommand: true,
|
||||
Aliases: []string{"d"},
|
||||
UsageText: "abra recipe diff [options] <recipe>",
|
||||
Flags: []cli.Flag{
|
||||
internal.NoInputFlag,
|
||||
},
|
||||
|
@ -15,7 +15,7 @@ var recipeFetchCommand = cli.Command{
|
||||
Name: "fetch",
|
||||
Usage: "Fetch recipe(s)",
|
||||
Aliases: []string{"f"},
|
||||
ArgsUsage: "[<recipe>]",
|
||||
UsageText: "abra recipe fetch [options] [<recipe>]",
|
||||
Description: "Retrieves all recipes if no <recipe> argument is passed",
|
||||
Flags: []cli.Flag{
|
||||
internal.NoInputFlag,
|
||||
|
@ -13,10 +13,11 @@ import (
|
||||
)
|
||||
|
||||
var recipeLintCommand = cli.Command{
|
||||
Name: "lint",
|
||||
Usage: "Lint a recipe",
|
||||
Aliases: []string{"l"},
|
||||
ArgsUsage: "<recipe>",
|
||||
Name: "lint",
|
||||
Usage: "Lint a recipe",
|
||||
Aliases: []string{"l"},
|
||||
UsageText: "abra recipe lint [options] <recipe>",
|
||||
HideHelpCommand: true,
|
||||
Flags: []cli.Flag{
|
||||
internal.OnlyErrorFlag,
|
||||
internal.OfflineFlag,
|
||||
|
@ -24,9 +24,11 @@ var patternFlag = &cli.StringFlag{
|
||||
}
|
||||
|
||||
var recipeListCommand = cli.Command{
|
||||
Name: "list",
|
||||
Usage: "List available recipes",
|
||||
Aliases: []string{"ls"},
|
||||
Name: "list",
|
||||
Usage: "List recipes",
|
||||
HideHelpCommand: true,
|
||||
UsageText: "abra recipe list [options]",
|
||||
Aliases: []string{"ls"},
|
||||
Flags: []cli.Flag{
|
||||
internal.MachineReadableFlag,
|
||||
patternFlag,
|
||||
|
@ -40,11 +40,11 @@ var recipeNewCommand = cli.Command{
|
||||
internal.GitNameFlag,
|
||||
internal.GitEmailFlag,
|
||||
},
|
||||
Before: internal.SubCommandBefore,
|
||||
Usage: "Create a new recipe",
|
||||
ArgsUsage: "<recipe>",
|
||||
Description: `
|
||||
Create a new recipe.
|
||||
Before: internal.SubCommandBefore,
|
||||
Usage: "Create a new recipe",
|
||||
UsageText: "abra recipe new [options] <recipe>",
|
||||
HideHelpCommand: true,
|
||||
Description: `Create a new recipe.
|
||||
|
||||
Abra uses the built-in example repository which is available here:
|
||||
|
||||
|
@ -9,9 +9,8 @@ var RecipeCommand = cli.Command{
|
||||
Name: "recipe",
|
||||
Aliases: []string{"r"},
|
||||
Usage: "Manage recipes",
|
||||
ArgsUsage: "<recipe>",
|
||||
Description: `
|
||||
A recipe is a blueprint for an app. It is a bunch of config files which
|
||||
UsageText: "abra recipe [command] [options] [arguments]",
|
||||
Description: `A recipe is a blueprint for an app. It is a bunch of config files which
|
||||
describe how to deploy and maintain an app. Recipes are maintained by the Co-op
|
||||
Cloud community and you can use Abra to read them, deploy them and create apps
|
||||
for you.
|
||||
|
@ -23,13 +23,15 @@ import (
|
||||
)
|
||||
|
||||
var recipeReleaseCommand = cli.Command{
|
||||
Name: "release",
|
||||
Aliases: []string{"rl"},
|
||||
Usage: "Release a new recipe version",
|
||||
ArgsUsage: "<recipe> [<version>]",
|
||||
Description: `
|
||||
Create a new version of a recipe. These versions are then published on the
|
||||
Co-op Cloud recipe catalogue. These versions take the following form:
|
||||
Name: "release",
|
||||
Aliases: []string{"rl"},
|
||||
Usage: "Release a new recipe version",
|
||||
HideHelpCommand: true,
|
||||
UsageText: "abra recipe release [options] <recipe> [<version>]",
|
||||
Description: `Create a new version of a recipe.
|
||||
|
||||
These versions are then published on the Co-op Cloud recipe catalogue. These
|
||||
versions take the following form:
|
||||
|
||||
a.b.c+x.y.z
|
||||
|
||||
|
@ -12,11 +12,12 @@ import (
|
||||
)
|
||||
|
||||
var recipeResetCommand = cli.Command{
|
||||
Name: "reset",
|
||||
Usage: "Remove all unstaged changes from recipe config",
|
||||
Description: "WARNING: this will delete your changes. Be Careful.",
|
||||
Aliases: []string{"rs"},
|
||||
ArgsUsage: "<recipe>",
|
||||
Name: "reset",
|
||||
Usage: "Remove all unstaged changes from recipe config",
|
||||
Description: "WARNING: this will delete your changes. Be Careful.",
|
||||
HideHelpCommand: true,
|
||||
Aliases: []string{"rs"},
|
||||
UsageText: "abra recipe reset [options] <recipe>",
|
||||
Flags: []cli.Flag{
|
||||
internal.NoInputFlag,
|
||||
},
|
||||
|
@ -17,10 +17,11 @@ import (
|
||||
)
|
||||
|
||||
var recipeSyncCommand = cli.Command{
|
||||
Name: "sync",
|
||||
Aliases: []string{"s"},
|
||||
Usage: "Sync recipe version label",
|
||||
ArgsUsage: "<recipe> [<version>]",
|
||||
Name: "sync",
|
||||
Aliases: []string{"s"},
|
||||
Usage: "Sync recipe version label",
|
||||
HideHelpCommand: true,
|
||||
UsageText: "abra recipe lint [options] <recipe> [<version>]",
|
||||
Flags: []cli.Flag{
|
||||
internal.NoInputFlag,
|
||||
internal.DryFlag,
|
||||
@ -29,9 +30,9 @@ var recipeSyncCommand = cli.Command{
|
||||
internal.PatchFlag,
|
||||
},
|
||||
Before: internal.SubCommandBefore,
|
||||
Description: `
|
||||
Generate labels for the main recipe service (i.e. by convention, the service
|
||||
named "app") which corresponds to the following format:
|
||||
Description: `Generate labels for the main recipe service.
|
||||
|
||||
By convention, the service named "app" using the following format:
|
||||
|
||||
coop-cloud.${STACK_NAME}.version=<version>
|
||||
|
||||
|
@ -28,8 +28,8 @@ type imgPin struct {
|
||||
version tagcmp.Tag
|
||||
}
|
||||
|
||||
// anUpgrade represents a single service upgrade (as within a recipe), and the list of tags that it can be upgraded to,
|
||||
// for serialization purposes.
|
||||
// anUpgrade represents a single service upgrade (as within a recipe), and the
|
||||
// list of tags that it can be upgraded to, for serialization purposes.
|
||||
type anUpgrade struct {
|
||||
Service string `json:"service"`
|
||||
Image string `json:"image"`
|
||||
@ -38,13 +38,13 @@ type anUpgrade struct {
|
||||
}
|
||||
|
||||
var recipeUpgradeCommand = cli.Command{
|
||||
Name: "upgrade",
|
||||
Aliases: []string{"u"},
|
||||
Usage: "Upgrade recipe image tags",
|
||||
Description: `
|
||||
Parse all image tags within the given <recipe> configuration and prompt with
|
||||
more recent tags to upgrade to. It will update the relevant compose file tags
|
||||
on the local file system.
|
||||
Name: "upgrade",
|
||||
Aliases: []string{"u"},
|
||||
Usage: "Upgrade recipe image tags",
|
||||
HideHelpCommand: true,
|
||||
Description: `Upgrade a given <recipe> configuration.
|
||||
|
||||
It will update the relevant compose file tags on the local file system.
|
||||
|
||||
Some image tags cannot be parsed because they do not follow some sort of
|
||||
semver-like convention. In this case, all possible tags will be listed and it
|
||||
@ -54,12 +54,8 @@ The command is interactive and will show a select input which allows you to
|
||||
make a seclection. Use the "?" key to see more help on navigating this
|
||||
interface.
|
||||
|
||||
You may invoke this command in "wizard" mode and be prompted for input.
|
||||
|
||||
EXAMPLE:
|
||||
|
||||
abra recipe upgrade`,
|
||||
ArgsUsage: "<recipe>",
|
||||
You may invoke this command in "wizard" mode and be prompted for input.`,
|
||||
UsageText: "abra recipe upgrade [options] [<recipe>]",
|
||||
Flags: []cli.Flag{
|
||||
internal.NoInputFlag,
|
||||
internal.PatchFlag,
|
||||
|
@ -25,10 +25,11 @@ func sortServiceByName(versions [][]string) func(i, j int) bool {
|
||||
}
|
||||
|
||||
var recipeVersionCommand = cli.Command{
|
||||
Name: "versions",
|
||||
Aliases: []string{"v"},
|
||||
Usage: "List recipe versions",
|
||||
ArgsUsage: "<recipe>",
|
||||
Name: "versions",
|
||||
Aliases: []string{"v"},
|
||||
Usage: "List recipe versions",
|
||||
UsageText: "abra recipe version [options] <recipe>",
|
||||
HideHelpCommand: true,
|
||||
Flags: []cli.Flag{
|
||||
internal.OfflineFlag,
|
||||
internal.NoInputFlag,
|
||||
|
@ -94,15 +94,16 @@ func createServerDir(name string) (bool, error) {
|
||||
}
|
||||
|
||||
var serverAddCommand = cli.Command{
|
||||
Name: "add",
|
||||
Aliases: []string{"a"},
|
||||
Usage: "Add a new server to your configuration",
|
||||
Description: `
|
||||
Add a new server to your configuration so that it can be managed by Abra.
|
||||
Name: "add",
|
||||
Aliases: []string{"a"},
|
||||
Usage: "Add a new server",
|
||||
UsageText: "abra server add [options] <domain>",
|
||||
HideHelpCommand: true,
|
||||
Description: `Add a new server to your configuration so that it can be managed by Abra.
|
||||
|
||||
Abra relies on the standard SSH command-line and ~/.ssh/config for client
|
||||
connection details. You must configure an entry per-host in your ~/.ssh/config
|
||||
for each server. For example:
|
||||
for each server:
|
||||
|
||||
Host example.com example
|
||||
Hostname example.com
|
||||
@ -110,10 +111,6 @@ for each server. For example:
|
||||
Port 12345
|
||||
IdentityFile ~/.ssh/example@somewhere
|
||||
|
||||
You can then add a server like so:
|
||||
|
||||
abra server add example.com
|
||||
|
||||
If "--local" is passed, then Abra assumes that the current local server is
|
||||
intended as the target server. This is useful when you want to have your entire
|
||||
Co-op Cloud config located on the server itself, and not on your local
|
||||
@ -121,9 +118,7 @@ developer machine. The domain is then set to "default".
|
||||
|
||||
You can also pass "--no-domain-checks/-D" flag to use any arbitrary name
|
||||
instead of a real domain. The host will be resolved with the "Hostname" entry
|
||||
of your ~/.ssh/config. Checks for a valid online domain will be skipped:
|
||||
|
||||
abra server add -D example`,
|
||||
of your ~/.ssh/config. Checks for a valid online domain will be skipped.`,
|
||||
Flags: []cli.Flag{
|
||||
internal.NoInputFlag,
|
||||
internal.NoDomainChecksFlag,
|
||||
|
@ -14,9 +14,11 @@ import (
|
||||
)
|
||||
|
||||
var serverListCommand = cli.Command{
|
||||
Name: "list",
|
||||
Aliases: []string{"ls"},
|
||||
Usage: "List managed servers",
|
||||
Name: "list",
|
||||
Aliases: []string{"ls"},
|
||||
Usage: "List managed servers",
|
||||
UsageText: "abra server list [options]",
|
||||
HideHelpCommand: true,
|
||||
Flags: []cli.Flag{
|
||||
internal.DebugFlag,
|
||||
internal.MachineReadableFlag,
|
||||
|
@ -31,11 +31,12 @@ var volumesFilterFlag = &cli.BoolFlag{
|
||||
}
|
||||
|
||||
var serverPruneCommand = cli.Command{
|
||||
Name: "prune",
|
||||
Aliases: []string{"p"},
|
||||
Usage: "Prune resources on a server",
|
||||
Description: `
|
||||
Prunes unused containers, networks, and dangling images.
|
||||
Name: "prune",
|
||||
Aliases: []string{"p"},
|
||||
Usage: "Prune resources on a server",
|
||||
UsageText: "abra server prune [options] <server>",
|
||||
HideHelpCommand: true,
|
||||
Description: `Prunes unused containers, networks, and dangling images.
|
||||
|
||||
Use "-v/--volumes" to remove volumes that are not associated with a deployed
|
||||
app. This can result in unwanted data loss if not used carefully.`,
|
||||
|
@ -14,16 +14,16 @@ import (
|
||||
)
|
||||
|
||||
var serverRemoveCommand = cli.Command{
|
||||
Name: "remove",
|
||||
Aliases: []string{"rm"},
|
||||
ArgsUsage: "<server>",
|
||||
Usage: "Remove a managed server",
|
||||
Description: `
|
||||
Remove a managed server.
|
||||
Name: "remove",
|
||||
Aliases: []string{"rm"},
|
||||
UsageText: "abra server remove [options] <domain>",
|
||||
Usage: "Remove a managed server",
|
||||
HideHelpCommand: true,
|
||||
Description: `Remove a managed server.
|
||||
|
||||
Abra will remove the internal bookkeeping (~/.abra/servers/...) and underlying
|
||||
client connection context. This server will then be lost in time, like tears in
|
||||
rain.`,
|
||||
Abra will remove the internal bookkeeping ($ABRA_DIR/servers/...) and
|
||||
underlying client connection context. This server will then be lost in time,
|
||||
like tears in rain.`,
|
||||
Flags: []cli.Flag{
|
||||
internal.NoInputFlag,
|
||||
internal.OfflineFlag,
|
||||
|
@ -9,6 +9,7 @@ var ServerCommand = cli.Command{
|
||||
Name: "server",
|
||||
Aliases: []string{"s"},
|
||||
Usage: "Manage servers",
|
||||
UsageText: "abra server [command] [options] [arguments]",
|
||||
HideHelpCommand: true,
|
||||
Commands: []*cli.Command{
|
||||
&serverAddCommand,
|
||||
|
@ -46,17 +46,16 @@ var allFlag = &cli.BoolFlag{
|
||||
|
||||
// Notify checks for available upgrades
|
||||
var Notify = cli.Command{
|
||||
Name: "notify",
|
||||
Aliases: []string{"n"},
|
||||
Usage: "Check for available upgrades",
|
||||
Name: "notify",
|
||||
Aliases: []string{"n"},
|
||||
Usage: "Check for available upgrades",
|
||||
UsageText: "kadabra notify [options]",
|
||||
HideHelpCommand: true,
|
||||
Flags: []cli.Flag{
|
||||
majorFlag,
|
||||
internal.OfflineFlag,
|
||||
},
|
||||
Before: internal.SubCommandBefore,
|
||||
Description: `
|
||||
Read the deployed app versions and look for new versions in the recipe
|
||||
catalogue.
|
||||
Description: `Notify on new versions for deployed apps.
|
||||
|
||||
If a new patch/minor version is available, a notification is printed.
|
||||
|
||||
@ -93,20 +92,18 @@ Use "--major" to include new major versions.`,
|
||||
|
||||
// UpgradeApp upgrades apps.
|
||||
var UpgradeApp = cli.Command{
|
||||
Name: "upgrade",
|
||||
Aliases: []string{"u"},
|
||||
Usage: "Upgrade apps",
|
||||
ArgsUsage: "<stack-name> <recipe>",
|
||||
Name: "upgrade",
|
||||
Aliases: []string{"u"},
|
||||
Usage: "Upgrade apps",
|
||||
UsageText: "kadabra notify [options] <stack> <recipe>",
|
||||
HideHelpCommand: true,
|
||||
Flags: []cli.Flag{
|
||||
internal.DebugFlag,
|
||||
internal.ChaosFlag,
|
||||
majorFlag,
|
||||
allFlag,
|
||||
internal.OfflineFlag,
|
||||
},
|
||||
Before: internal.SubCommandBefore,
|
||||
Description: `
|
||||
Upgrade an app by specifying stack name and recipe.
|
||||
Description: `Upgrade an app by specifying stack name and recipe.
|
||||
|
||||
Use "--all" to upgrade every deployed app.
|
||||
|
||||
@ -471,17 +468,15 @@ func upgrade(cl *dockerclient.Client, stackName, recipeName, upgradeVersion stri
|
||||
|
||||
func newAbraApp(version, commit string) *cli.Command {
|
||||
app := &cli.Command{
|
||||
Name: "kadabra",
|
||||
Usage: `The Co-op Cloud auto-updater
|
||||
____ ____ _ _
|
||||
/ ___|___ ___ _ __ / ___| | ___ _ _ __| |
|
||||
| | / _ \ _____ / _ \| '_ \ | | | |/ _ \| | | |/ _' |
|
||||
| |__| (_) |_____| (_) | |_) | | |___| | (_) | |_| | (_| |
|
||||
\____\___/ \___/| .__/ \____|_|\___/ \__,_|\__,_|
|
||||
|_|
|
||||
`,
|
||||
Name: "kadabra",
|
||||
Usage: "The Co-op Cloud auto-updater 🤖🚀",
|
||||
Version: fmt.Sprintf("%s-%s", version, commit[:7]),
|
||||
UsageText: "kadabra [command] [options] [arguments]",
|
||||
HideHelpCommand: true,
|
||||
Flags: []cli.Flag{
|
||||
internal.OfflineFlag,
|
||||
internal.DebugFlag,
|
||||
},
|
||||
Commands: []*cli.Command{
|
||||
&Notify,
|
||||
&UpgradeApp,
|
||||
|
Loading…
x
Reference in New Issue
Block a user