forked from toolshed/abra
		
	refactor!: archive kadabra
This commit is contained in:
		| @ -4,5 +4,4 @@ | ||||
| Dockerfile | ||||
| abra | ||||
| dist | ||||
| kadabra | ||||
| tags | ||||
|  | ||||
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -4,7 +4,6 @@ | ||||
| .envrc | ||||
| .vscode/ | ||||
| /abra | ||||
| /kadabra | ||||
| /bin | ||||
| dist/ | ||||
| tests/integration/.bats | ||||
| /bin | ||||
|  | ||||
| @ -32,31 +32,6 @@ builds: | ||||
|       - "-s" | ||||
|       - "-w" | ||||
|  | ||||
|   - id: kadabra | ||||
|     binary: kadabra | ||||
|     dir: cmd/kadabra | ||||
|     env: | ||||
|       - CGO_ENABLED=0 | ||||
|     goos: | ||||
|       - linux | ||||
|       - darwin | ||||
|     goarch: | ||||
|       - 386 | ||||
|       - amd64 | ||||
|       - arm | ||||
|       - arm64 | ||||
|     goarm: | ||||
|       - 5 | ||||
|       - 6 | ||||
|       - 7 | ||||
|     gcflags: | ||||
|       - "all=-l -B" | ||||
|     ldflags: | ||||
|       - "-X 'main.Commit={{ .Commit }}'" | ||||
|       - "-X 'main.Version={{ .Version }}'" | ||||
|       - "-s" | ||||
|       - "-w" | ||||
|  | ||||
| checksum: | ||||
|   name_template: "checksums.txt" | ||||
|  | ||||
|  | ||||
							
								
								
									
										25
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								Makefile
									
									
									
									
									
								
							| @ -1,5 +1,4 @@ | ||||
| ABRA         := ./cmd/abra | ||||
| KADABRA      := ./cmd/kadabra | ||||
| COMMIT       := $(shell git rev-list -1 HEAD) | ||||
| GOPATH       := $(shell go env GOPATH) | ||||
| GOVERSION    := 1.24 | ||||
| @ -16,37 +15,21 @@ export GOPRIVATE=coopcloud.tech | ||||
| # NOTE(d1): default `make` optimised for Abra hacking | ||||
| all: format check build-abra test | ||||
|  | ||||
| run-abra: | ||||
| run: | ||||
| 	@go run -gcflags=$(GCFLAGS) -ldflags=$(LDFLAGS) $(ABRA) | ||||
|  | ||||
| run-kadabra: | ||||
| 	@go run -gcflags=$(GCFLAGS) -ldflags=$(LDFLAGS) $(KADABRA) | ||||
|  | ||||
| install-abra: | ||||
| install: | ||||
| 	@go install -gcflags=$(GCFLAGS) -ldflags=$(LDFLAGS) $(ABRA) | ||||
|  | ||||
| install-kadabra: | ||||
| 	@go install -gcflags=$(GCFLAGS) -ldflags=$(LDFLAGS) $(KADABRA) | ||||
|  | ||||
| install: install-abra install-kadabra | ||||
|  | ||||
| build-abra: | ||||
| build: | ||||
| 	@go build -v -gcflags=$(GCFLAGS) -ldflags=$(DIST_LDFLAGS) $(ABRA) | ||||
|  | ||||
| build-kadabra: | ||||
| 	@go build -v -gcflags=$(GCFLAGS) -ldflags=$(DIST_LDFLAGS) $(KADABRA) | ||||
|  | ||||
| build: build-abra build-kadabra | ||||
|  | ||||
| build-docker-abra: | ||||
| build-docker: | ||||
| 	@docker run -it -v $(PWD):/abra golang:$(GOVERSION) \ | ||||
| 		bash -c 'cd /abra; ./scripts/docker/build.sh' | ||||
|  | ||||
| build-docker: build-docker-abra | ||||
|  | ||||
| clean: | ||||
| 	@rm '$(GOPATH)/bin/abra' | ||||
| 	@rm '$(GOPATH)/bin/kadabra' | ||||
|  | ||||
| format: | ||||
| 	@gofmt -s -w $$(find . -type f -name '*.go' | grep -v "/vendor/") | ||||
|  | ||||
| @ -1,558 +0,0 @@ | ||||
| package updater | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
|  | ||||
| 	"coopcloud.tech/abra/cli/internal" | ||||
| 	appPkg "coopcloud.tech/abra/pkg/app" | ||||
| 	"coopcloud.tech/abra/pkg/client" | ||||
| 	"coopcloud.tech/abra/pkg/deploy" | ||||
| 	"coopcloud.tech/abra/pkg/envfile" | ||||
| 	"coopcloud.tech/abra/pkg/i18n" | ||||
| 	"coopcloud.tech/abra/pkg/lint" | ||||
| 	"coopcloud.tech/abra/pkg/recipe" | ||||
| 	"coopcloud.tech/abra/pkg/upstream/convert" | ||||
| 	"coopcloud.tech/abra/pkg/upstream/stack" | ||||
| 	"coopcloud.tech/tagcmp" | ||||
| 	charmLog "github.com/charmbracelet/log" | ||||
| 	composetypes "github.com/docker/cli/cli/compose/types" | ||||
| 	"github.com/docker/docker/api/types" | ||||
| 	"github.com/docker/docker/api/types/filters" | ||||
| 	dockerclient "github.com/docker/docker/client" | ||||
| 	"github.com/spf13/cobra" | ||||
|  | ||||
| 	"coopcloud.tech/abra/pkg/log" | ||||
| ) | ||||
|  | ||||
| const SERVER = "localhost" | ||||
|  | ||||
| // translators: `kadabra notify` aliases. use a comma separated list of aliases | ||||
| // with no spaces in between | ||||
| var notifyAliases = i18n.G("n") | ||||
|  | ||||
| // NotifyCommand checks for available upgrades. | ||||
| var NotifyCommand = &cobra.Command{ | ||||
| 	// translators: `notify` command | ||||
| 	Use:     i18n.G("notify [flags]"), | ||||
| 	Aliases: strings.Split(notifyAliases, ","), | ||||
| 	// translators: Short description for `notify` command | ||||
| 	Short: i18n.G("Check for available upgrades"), | ||||
| 	Long: i18n.G(`Notify on new versions for deployed apps. | ||||
|  | ||||
| If a new patch/minor version is available, a notification is printed. | ||||
|  | ||||
| Use "--major/-m" to include new major versions.`), | ||||
| 	Args: cobra.NoArgs, | ||||
| 	Run: func(cmd *cobra.Command, args []string) { | ||||
| 		cl, err := client.New("default") | ||||
| 		if err != nil { | ||||
| 			log.Fatal(err) | ||||
| 		} | ||||
|  | ||||
| 		stacks, err := stack.GetStacks(cl) | ||||
| 		if err != nil { | ||||
| 			log.Fatal(err) | ||||
| 		} | ||||
|  | ||||
| 		for _, stackInfo := range stacks { | ||||
| 			stackName := stackInfo.Name | ||||
| 			recipeName, err := getLabel(cl, stackName, "recipe") | ||||
| 			if err != nil { | ||||
| 				log.Fatal(err) | ||||
| 			} | ||||
|  | ||||
| 			if recipeName != "" { | ||||
| 				_, err = getLatestUpgrade(cl, stackName, recipeName) | ||||
| 				if err != nil { | ||||
| 					log.Fatal(err) | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| // translators: `kadabra upgrade` aliases. use a comma separated list of aliases with | ||||
| // no spaces in between | ||||
| var upgradeAliases = i18n.G("u") | ||||
|  | ||||
| // UpgradeCommand upgrades apps. | ||||
| var UpgradeCommand = &cobra.Command{ | ||||
| 	// translators: `app upgrade` command | ||||
| 	Use:     i18n.G("upgrade [[stack] [recipe] | --all] [flags]"), | ||||
| 	Aliases: strings.Split(upgradeAliases, ","), | ||||
| 	// translators: Short description for `app upgrade` command | ||||
| 	Short: i18n.G("Upgrade apps"), | ||||
| 	Long: i18n.G(`Upgrade an app by specifying stack name and recipe.  | ||||
|  | ||||
| Use "--all" to upgrade every deployed app. | ||||
|  | ||||
| For each app with auto updates enabled, the deployed version is compared with | ||||
| the current recipe catalogue version. If a new patch/minor version is | ||||
| available, the app is upgraded. | ||||
|  | ||||
| To include major versions use the "--major/-m" flag. You probably don't want | ||||
| that as it will break things. Only apps that are not deployed with "--chaos/-C" | ||||
| are upgraded, to update chaos deployments use the "--chaos/-C" flag. Use it | ||||
| with care.`), | ||||
| 	Args: cobra.RangeArgs(0, 2), | ||||
| 	// TODO(d1): complete stack/recipe | ||||
| 	// ValidArgsFunction: func( | ||||
| 	// 	cmd *cobra.Command, | ||||
| 	// 	args []string, | ||||
| 	// 	toComplete string) ([]string, cobra.ShellCompDirective) { | ||||
| 	// }, | ||||
| 	Run: func(cmd *cobra.Command, args []string) { | ||||
| 		cl, err := client.New("default") | ||||
| 		if err != nil { | ||||
| 			log.Fatal(err) | ||||
| 		} | ||||
|  | ||||
| 		if !updateAll && len(args) != 2 { | ||||
| 			log.Fatal(i18n.G("missing arguments or --all/-a flag")) | ||||
| 		} | ||||
|  | ||||
| 		if !updateAll { | ||||
| 			stackName := args[0] | ||||
| 			recipeName := args[1] | ||||
|  | ||||
| 			err = tryUpgrade(cl, stackName, recipeName) | ||||
| 			if err != nil { | ||||
| 				log.Fatal(err) | ||||
| 			} | ||||
|  | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		stacks, err := stack.GetStacks(cl) | ||||
| 		if err != nil { | ||||
| 			log.Fatal(err) | ||||
| 		} | ||||
|  | ||||
| 		for _, stackInfo := range stacks { | ||||
| 			stackName := stackInfo.Name | ||||
| 			recipeName, err := getLabel(cl, stackName, "recipe") | ||||
| 			if err != nil { | ||||
| 				log.Fatal(err) | ||||
| 			} | ||||
|  | ||||
| 			err = tryUpgrade(cl, stackName, recipeName) | ||||
| 			if err != nil { | ||||
| 				log.Fatal(err) | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| // getLabel reads docker labels from running services in the format of "coop-cloud.${STACK_NAME}.${LABEL}". | ||||
| func getLabel(cl *dockerclient.Client, stackName string, label string) (string, error) { | ||||
| 	filter := filters.NewArgs() | ||||
| 	filter.Add("label", fmt.Sprintf("%s=%s", convert.LabelNamespace, stackName)) | ||||
|  | ||||
| 	services, err := cl.ServiceList(context.Background(), types.ServiceListOptions{Filters: filter}) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
|  | ||||
| 	for _, service := range services { | ||||
| 		labelKey := fmt.Sprintf("coop-cloud.%s.%s", stackName, label) | ||||
| 		if labelValue, ok := service.Spec.Labels[labelKey]; ok { | ||||
| 			return labelValue, nil | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	log.Debug(i18n.G("no %s label found for %s", label, stackName)) | ||||
|  | ||||
| 	return "", nil | ||||
| } | ||||
|  | ||||
| // getBoolLabel reads a boolean docker label from running services | ||||
| func getBoolLabel(cl *dockerclient.Client, stackName string, label string) (bool, error) { | ||||
| 	lableValue, err := getLabel(cl, stackName, label) | ||||
| 	if err != nil { | ||||
| 		return false, err | ||||
| 	} | ||||
|  | ||||
| 	if lableValue != "" { | ||||
| 		value, err := strconv.ParseBool(lableValue) | ||||
| 		if err != nil { | ||||
| 			return false, err | ||||
| 		} | ||||
|  | ||||
| 		return value, nil | ||||
| 	} | ||||
|  | ||||
| 	log.Debug(i18n.G("boolean label %s could not be found for %s, set default to false.", label, stackName)) | ||||
|  | ||||
| 	return false, nil | ||||
| } | ||||
|  | ||||
| // getEnv reads env variables from docker services. | ||||
| func getEnv(cl *dockerclient.Client, stackName string) (envfile.AppEnv, error) { | ||||
| 	envMap := make(map[string]string) | ||||
| 	filter := filters.NewArgs() | ||||
| 	filter.Add("label", fmt.Sprintf("%s=%s", convert.LabelNamespace, stackName)) | ||||
|  | ||||
| 	services, err := cl.ServiceList(context.Background(), types.ServiceListOptions{Filters: filter}) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	for _, service := range services { | ||||
| 		envList := service.Spec.TaskTemplate.ContainerSpec.Env | ||||
| 		for _, envString := range envList { | ||||
| 			splitString := strings.SplitN(envString, "=", 2) | ||||
| 			if len(splitString) != 2 { | ||||
| 				log.Debug(i18n.G("can't separate key from value: %s (this variable is probably unset)", envString)) | ||||
| 				continue | ||||
| 			} | ||||
| 			k := splitString[0] | ||||
| 			v := splitString[1] | ||||
| 			log.Debugf(i18n.G("for %s read env %s with value: %s from docker service", stackName, k, v)) | ||||
| 			envMap[k] = v | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return envMap, nil | ||||
| } | ||||
|  | ||||
| // getLatestUpgrade returns the latest available version for an app respecting | ||||
| // the "--major" flag if it is newer than the currently deployed version. | ||||
| func getLatestUpgrade(cl *dockerclient.Client, stackName string, recipeName string) (string, error) { | ||||
| 	deployedVersion, err := getDeployedVersion(cl, stackName, recipeName) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
|  | ||||
| 	availableUpgrades, err := getAvailableUpgrades(cl, stackName, recipeName, deployedVersion) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
|  | ||||
| 	if len(availableUpgrades) == 0 { | ||||
| 		log.Debugf(i18n.G("no available upgrades for %s", stackName)) | ||||
| 		return "", nil | ||||
| 	} | ||||
|  | ||||
| 	var chosenUpgrade string | ||||
| 	if len(availableUpgrades) > 0 { | ||||
| 		chosenUpgrade = availableUpgrades[len(availableUpgrades)-1] | ||||
| 		log.Info(i18n.G("%s (%s) can be upgraded from version %s to %s", stackName, recipeName, deployedVersion, chosenUpgrade)) | ||||
| 	} | ||||
|  | ||||
| 	return chosenUpgrade, nil | ||||
| } | ||||
|  | ||||
| // getDeployedVersion returns the currently deployed version of an app. | ||||
| func getDeployedVersion(cl *dockerclient.Client, stackName string, recipeName string) (string, error) { | ||||
| 	log.Debug(i18n.G("retrieve deployed version whether %s is already deployed", stackName)) | ||||
|  | ||||
| 	deployMeta, err := stack.IsDeployed(context.Background(), cl, stackName) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
|  | ||||
| 	if !deployMeta.IsDeployed { | ||||
| 		return "", errors.New(i18n.G("%s is not deployed?", stackName)) | ||||
| 	} | ||||
|  | ||||
| 	if deployMeta.Version == "unknown" { | ||||
| 		return "", errors.New(i18n.G("failed to determine deployed version of %s", stackName)) | ||||
| 	} | ||||
|  | ||||
| 	return deployMeta.Version, nil | ||||
| } | ||||
|  | ||||
| // getAvailableUpgrades returns all available versions of an app that are newer | ||||
| // than the deployed version. It only includes major upgrades if the "--major" | ||||
| // flag is set. | ||||
| func getAvailableUpgrades(cl *dockerclient.Client, stackName string, recipeName string, | ||||
| 	deployedVersion string) ([]string, error) { | ||||
| 	catl, err := recipe.ReadRecipeCatalogue(internal.Offline) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	versions, err := recipe.GetRecipeCatalogueVersions(recipeName, catl) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	if len(versions) == 0 { | ||||
| 		log.Warn(i18n.G("no published releases for %s in the recipe catalogue?", recipeName)) | ||||
| 		return nil, nil | ||||
| 	} | ||||
|  | ||||
| 	var availableUpgrades []string | ||||
| 	for _, version := range versions { | ||||
| 		parsedDeployedVersion, err := tagcmp.Parse(deployedVersion) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
|  | ||||
| 		parsedVersion, err := tagcmp.Parse(version) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
|  | ||||
| 		versionDelta, err := parsedDeployedVersion.UpgradeDelta(parsedVersion) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
|  | ||||
| 		if 0 < versionDelta.UpgradeType() && (versionDelta.UpgradeType() < 4 || includeMajorUpdates) { | ||||
| 			availableUpgrades = append(availableUpgrades, version) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	log.Debug(i18n.G("available updates for %s: %s", stackName, availableUpgrades)) | ||||
|  | ||||
| 	return availableUpgrades, nil | ||||
| } | ||||
|  | ||||
| // processRecipeRepoVersion clones, pulls, checks out the version and lints the | ||||
| // recipe repository. | ||||
| func processRecipeRepoVersion(r recipe.Recipe, version string) error { | ||||
| 	if err := r.EnsureExists(); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if err := r.EnsureUpToDate(); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if _, err := r.EnsureVersion(version); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if err := lint.LintForErrors(r); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // createDeployConfig merges and enriches the compose config for the deployment. | ||||
| func createDeployConfig(r recipe.Recipe, stackName string, env envfile.AppEnv) (*composetypes.Config, stack.Deploy, error) { | ||||
| 	env["STACK_NAME"] = stackName | ||||
|  | ||||
| 	deployOpts := stack.Deploy{ | ||||
| 		Namespace:    stackName, | ||||
| 		Prune:        false, | ||||
| 		ResolveImage: stack.ResolveImageAlways, | ||||
| 		Detach:       false, | ||||
| 	} | ||||
|  | ||||
| 	composeFiles, err := r.GetComposeFiles(env) | ||||
| 	if err != nil { | ||||
| 		return nil, deployOpts, err | ||||
| 	} | ||||
|  | ||||
| 	deployOpts.Composefiles = composeFiles | ||||
| 	compose, err := appPkg.GetAppComposeConfig(stackName, deployOpts, env) | ||||
| 	if err != nil { | ||||
| 		return nil, deployOpts, err | ||||
| 	} | ||||
|  | ||||
| 	appPkg.ExposeAllEnv(stackName, compose, env) | ||||
|  | ||||
| 	// after the upgrade the deployment won't be in chaos state anymore | ||||
| 	appPkg.SetChaosLabel(compose, stackName, false) | ||||
| 	appPkg.SetRecipeLabel(compose, stackName, r.Name) | ||||
| 	appPkg.SetUpdateLabel(compose, stackName, env) | ||||
|  | ||||
| 	return compose, deployOpts, nil | ||||
| } | ||||
|  | ||||
| // tryUpgrade performs the upgrade if all the requirements are fulfilled. | ||||
| func tryUpgrade(cl *dockerclient.Client, stackName, recipeName string) error { | ||||
| 	if recipeName == "" { | ||||
| 		log.Debug(i18n.G("don't update %s due to missing recipe name", stackName)) | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	chaos, err := getBoolLabel(cl, stackName, "chaos") | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if chaos && !internal.Chaos { | ||||
| 		log.Debug(i18n.G("don't update %s due to chaos deployment", stackName)) | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	updatesEnabled, err := getBoolLabel(cl, stackName, "autoupdate") | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if !updatesEnabled { | ||||
| 		log.Debug(i18n.G("don't update %s due to disabled auto updates or missing ENABLE_AUTO_UPDATE env", stackName)) | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	upgradeVersion, err := getLatestUpgrade(cl, stackName, recipeName) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if upgradeVersion == "" { | ||||
| 		log.Debug(i18n.G("don't update %s due to no new version", stackName)) | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	err = upgrade(cl, stackName, recipeName, upgradeVersion) | ||||
|  | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // upgrade performs all necessary steps to upgrade an app. | ||||
| func upgrade(cl *dockerclient.Client, stackName, recipeName, upgradeVersion string) error { | ||||
| 	env, err := getEnv(cl, stackName) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	app := appPkg.App{ | ||||
| 		Name:   stackName, | ||||
| 		Recipe: recipe.Get(recipeName), | ||||
| 		Server: SERVER, | ||||
| 		Env:    env, | ||||
| 	} | ||||
|  | ||||
| 	r := recipe.Get(recipeName) | ||||
|  | ||||
| 	if err = processRecipeRepoVersion(r, upgradeVersion); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if err = deploy.MergeAbraShEnv(app.Recipe, app.Env); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	compose, deployOpts, err := createDeployConfig(r, stackName, app.Env) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	log.Info(i18n.G("upgrade %s (%s) to version %s", stackName, recipeName, upgradeVersion)) | ||||
|  | ||||
| 	serviceNames, err := appPkg.GetAppServiceNames(app.Name) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	f, err := app.Filters(true, false, serviceNames...) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	err = stack.RunDeploy( | ||||
| 		cl, | ||||
| 		deployOpts, | ||||
| 		compose, | ||||
| 		stackName, | ||||
| 		app.Server, | ||||
| 		true, | ||||
| 		f, | ||||
| 	) | ||||
|  | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| func newKadabraApp(version, commit string) *cobra.Command { | ||||
| 	rootCmd := &cobra.Command{ | ||||
| 		// translators: `kadabra` binary name | ||||
| 		Use:     i18n.G("kadabra [cmd] [flags]"), | ||||
| 		Version: fmt.Sprintf("%s-%s", version, commit[:7]), | ||||
| 		// translators: Short description for `kababra` binary | ||||
| 		Short: i18n.G("The Co-op Cloud auto-updater 🤖 🚀"), | ||||
| 		PersistentPreRun: func(cmd *cobra.Command, args []string) { | ||||
| 			log.Logger.SetStyles(charmLog.DefaultStyles()) | ||||
| 			charmLog.SetDefault(log.Logger) | ||||
|  | ||||
| 			if internal.Debug { | ||||
| 				log.SetLevel(log.DebugLevel) | ||||
| 				log.SetOutput(os.Stderr) | ||||
| 				log.SetReportCaller(true) | ||||
| 			} | ||||
|  | ||||
| 			log.Debug(i18n.G("kadabra version %s, commit %s", version, commit)) | ||||
| 		}, | ||||
| 	} | ||||
|  | ||||
| 	rootCmd.PersistentFlags().BoolVarP( | ||||
| 		&internal.Debug, | ||||
| 		i18n.G("debug"), | ||||
| 		i18n.G("d"), | ||||
| 		false, | ||||
| 		i18n.G("show debug messages"), | ||||
| 	) | ||||
|  | ||||
| 	rootCmd.PersistentFlags().BoolVarP( | ||||
| 		&internal.NoInput, | ||||
| 		i18n.G("no-input"), | ||||
| 		i18n.G("n"), | ||||
| 		false, | ||||
| 		i18n.G("toggle non-interactive mode"), | ||||
| 	) | ||||
|  | ||||
| 	rootCmd.AddCommand( | ||||
| 		NotifyCommand, | ||||
| 		UpgradeCommand, | ||||
| 	) | ||||
|  | ||||
| 	return rootCmd | ||||
| } | ||||
|  | ||||
| // RunApp runs CLI abra app. | ||||
| func RunApp(version, commit string) { | ||||
| 	app := newKadabraApp(version, commit) | ||||
|  | ||||
| 	if err := app.Execute(); err != nil { | ||||
| 		log.Fatal(err) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	includeMajorUpdates bool | ||||
| 	updateAll           bool | ||||
| ) | ||||
|  | ||||
| func init() { | ||||
| 	NotifyCommand.Flags().BoolVarP( | ||||
| 		&includeMajorUpdates, | ||||
| 		"major", | ||||
| 		"m", | ||||
| 		false, | ||||
| 		"check for major updates", | ||||
| 	) | ||||
|  | ||||
| 	UpgradeCommand.Flags().BoolVarP( | ||||
| 		&internal.Chaos, | ||||
| 		i18n.G("chaos"), | ||||
| 		i18n.G("C"), | ||||
| 		false, | ||||
| 		i18n.G("ignore uncommitted recipes changes"), | ||||
| 	) | ||||
|  | ||||
| 	UpgradeCommand.Flags().BoolVarP( | ||||
| 		&includeMajorUpdates, | ||||
| 		i18n.G("major"), | ||||
| 		i18n.G("m"), | ||||
| 		false, | ||||
| 		i18n.G("check for major updates"), | ||||
| 	) | ||||
|  | ||||
| 	UpgradeCommand.Flags().BoolVarP( | ||||
| 		&updateAll, | ||||
| 		i18n.G("all"), | ||||
| 		i18n.GC("a", "abra upgrade"), | ||||
| 		false, | ||||
| 		i18n.G("update all deployed apps"), | ||||
| 	) | ||||
| } | ||||
| @ -1,23 +0,0 @@ | ||||
| // Package main provides the command-line entrypoint. | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"coopcloud.tech/abra/cli/updater" | ||||
| ) | ||||
|  | ||||
| // Version is the current version of Kadabra. | ||||
| var Version string | ||||
|  | ||||
| // Commit is the current git commit of Kadabra. | ||||
| var Commit string | ||||
|  | ||||
| func main() { | ||||
| 	if Version == "" { | ||||
| 		Version = "dev" | ||||
| 	} | ||||
| 	if Commit == "" { | ||||
| 		Commit = "       " | ||||
| 	} | ||||
|  | ||||
| 	updater.RunApp(Version, Commit) | ||||
| } | ||||
| @ -7,7 +7,7 @@ | ||||
| msgid   "" | ||||
| msgstr  "Project-Id-Version: \n" | ||||
|         "Report-Msgid-Bugs-To: EMAIL\n" | ||||
|         "POT-Creation-Date: 2025-10-18 16:03-0400\n" | ||||
|         "POT-Creation-Date: 2025-10-19 15:32+0200\n" | ||||
|         "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | ||||
|         "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | ||||
|         "Language-Team: LANGUAGE <LL@li.org>\n" | ||||
| @ -181,11 +181,6 @@ msgstr  "" | ||||
| msgid   "%d volumes removed successfully" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/updater/updater.go:244 | ||||
| #, c-format | ||||
| msgid   "%s (%s) can be upgraded from version %s to %s" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./pkg/recipe/git.go:191 | ||||
| #, c-format | ||||
| msgid   "%s (%s) has locally unstaged changes?" | ||||
| @ -346,7 +341,7 @@ msgstr  "" | ||||
| msgid   "%s is not an upgrade for %s?" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/app/logs.go:65 ./cli/app/ps.go:62 ./cli/app/restart.go:100 ./cli/app/services.go:55 ./cli/app/undeploy.go:65 ./cli/app/upgrade.go:448 ./cli/updater/updater.go:260 | ||||
| #: ./cli/app/logs.go:65 ./cli/app/ps.go:62 ./cli/app/restart.go:100 ./cli/app/services.go:55 ./cli/app/undeploy.go:65 ./cli/app/upgrade.go:448 | ||||
| #, c-format | ||||
| msgid   "%s is not deployed?" | ||||
| msgstr  "" | ||||
| @ -612,7 +607,7 @@ msgstr  "" | ||||
| msgid   "Both local recipe and live deployment labels are shown." | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/app/backup.go:319 ./cli/app/backup.go:335 ./cli/app/check.go:95 ./cli/app/cmd.go:285 ./cli/app/cp.go:385 ./cli/app/deploy.go:394 ./cli/app/labels.go:143 ./cli/app/new.go:397 ./cli/app/ps.go:213 ./cli/app/restart.go:162 ./cli/app/restore.go:138 ./cli/app/secret.go:569 ./cli/app/secret.go:609 ./cli/app/secret.go:633 ./cli/app/secret.go:641 ./cli/catalogue/catalogue.go:318 ./cli/recipe/lint.go:137 ./cli/updater/updater.go:538 | ||||
| #: ./cli/app/backup.go:319 ./cli/app/backup.go:335 ./cli/app/check.go:95 ./cli/app/cmd.go:285 ./cli/app/cp.go:385 ./cli/app/deploy.go:394 ./cli/app/labels.go:143 ./cli/app/new.go:397 ./cli/app/ps.go:213 ./cli/app/restart.go:162 ./cli/app/restore.go:138 ./cli/app/secret.go:569 ./cli/app/secret.go:609 ./cli/app/secret.go:633 ./cli/app/secret.go:641 ./cli/catalogue/catalogue.go:318 ./cli/recipe/lint.go:137 | ||||
| msgid   "C" | ||||
| msgstr  "" | ||||
|  | ||||
| @ -660,11 +655,6 @@ msgstr  "" | ||||
| msgid   "Check app deployment status" | ||||
| msgstr  "" | ||||
|  | ||||
| #. translators: Short description for `notify` command | ||||
| #: ./cli/updater/updater.go:44 | ||||
| msgid   "Check for available upgrades" | ||||
| msgstr  "" | ||||
|  | ||||
| #. translators: Short description for `recipe fetch` command | ||||
| #: ./cli/recipe/fetch.go:27 | ||||
| msgid   "Clone recipe(s) locally" | ||||
| @ -1089,14 +1079,6 @@ msgstr  "" | ||||
| msgid   "NOW" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/updater/updater.go:45 | ||||
| msgid   "Notify on new versions for deployed apps.\n" | ||||
|         "\n" | ||||
|         "If a new patch/minor version is available, a notification is printed.\n" | ||||
|         "\n" | ||||
|         "Use \"--major/-m\" to include new major versions." | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/internal/deploy.go:210 | ||||
| msgid   "OLD SERVER" | ||||
| msgstr  "" | ||||
| @ -1346,11 +1328,6 @@ msgstr  "" | ||||
| msgid   "Tail app logs" | ||||
| msgstr  "" | ||||
|  | ||||
| #. translators: Short description for `kababra` binary | ||||
| #: ./cli/updater/updater.go:473 | ||||
| msgid   "The Co-op Cloud auto-updater 🤖 🚀" | ||||
| msgstr  "" | ||||
|  | ||||
| #. translators: Short description for `abra` binary | ||||
| #: ./cli/run.go:80 | ||||
| msgid   "The Co-op Cloud command-line utility belt 🎩🐇" | ||||
| @ -1513,21 +1490,6 @@ msgstr  "" | ||||
| msgid   "Upgrade an app" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/updater/updater.go:90 | ||||
| msgid   "Upgrade an app by specifying stack name and recipe. \n" | ||||
|         "\n" | ||||
|         "Use \"--all\" to upgrade every deployed app.\n" | ||||
|         "\n" | ||||
|         "For each app with auto updates enabled, the deployed version is compared with\n" | ||||
|         "the current recipe catalogue version. If a new patch/minor version is\n" | ||||
|         "available, the app is upgraded.\n" | ||||
|         "\n" | ||||
|         "To include major versions use the \"--major/-m\" flag. You probably don't want\n" | ||||
|         "that as it will break things. Only apps that are not deployed with \"--chaos/-C\"\n" | ||||
|         "are upgraded, to update chaos deployments use the \"--chaos/-C\" flag. Use it\n" | ||||
|         "with care." | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/app/upgrade.go:37 | ||||
| msgid   "Upgrade an app.\n" | ||||
|         "\n" | ||||
| @ -1545,11 +1507,6 @@ msgid   "Upgrade an app.\n" | ||||
|         "beforehand. See \"abra app backup\" for more." | ||||
| msgstr  "" | ||||
|  | ||||
| #. translators: Short description for `app upgrade` command | ||||
| #: ./cli/updater/updater.go:89 | ||||
| msgid   "Upgrade apps" | ||||
| msgstr  "" | ||||
|  | ||||
| #. translators: Short description for `recipe upgrade` command | ||||
| #: ./cli/recipe/upgrade.go:49 | ||||
| msgid   "Upgrade recipe image tags" | ||||
| @ -1721,11 +1678,6 @@ msgctxt "server prune" | ||||
| msgid   "a" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/updater/updater.go:554 | ||||
| msgctxt "abra upgrade" | ||||
| msgid   "a" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/app/remove.go:66 | ||||
| msgid   "aborting as requested" | ||||
| msgstr  "" | ||||
| @ -1778,7 +1730,7 @@ msgstr  "" | ||||
| msgid   "adding env vars to %s service config" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/app/backup.go:270 ./cli/app/secret.go:576 ./cli/app/secret.go:616 ./cli/recipe/fetch.go:121 ./cli/server/prune.go:98 ./cli/updater/updater.go:553 | ||||
| #: ./cli/app/backup.go:270 ./cli/app/secret.go:576 ./cli/app/secret.go:616 ./cli/recipe/fetch.go:121 ./cli/server/prune.go:98 | ||||
| msgid   "all" | ||||
| msgstr  "" | ||||
|  | ||||
| @ -1895,11 +1847,6 @@ msgstr  "" | ||||
| msgid   "automatically set ssh remote" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/updater/updater.go:312 | ||||
| #, c-format | ||||
| msgid   "available updates for %s: %s" | ||||
| msgstr  "" | ||||
|  | ||||
| #. translators: `abra app backup` aliases. use a comma separated list of aliases with | ||||
| #. no spaces in between | ||||
| #: ./cli/app/backup.go:239 | ||||
| @ -1933,11 +1880,6 @@ msgstr  "" | ||||
| msgid   "bind options are incompatible with type volume" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/updater/updater.go:189 | ||||
| #, c-format | ||||
| msgid   "boolean label %s could not be found for %s, set default to false." | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./pkg/config/env.go:74 ./pkg/config/env.go:107 | ||||
| #, c-format | ||||
| msgid   "broken symlink in your abra config folders: %s" | ||||
| @ -1974,11 +1916,6 @@ msgstr  "" | ||||
| msgid   "can't read local recipes: %s" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/updater/updater.go:210 | ||||
| #, c-format | ||||
| msgid   "can't separate key from value: %s (this variable is probably unset)" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/internal/deploy.go:237 | ||||
| msgid   "cancelled" | ||||
| msgstr  "" | ||||
| @ -2087,7 +2024,7 @@ msgstr  "" | ||||
| msgid   "cfg" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/app/backup.go:318 ./cli/app/backup.go:334 ./cli/app/check.go:94 ./cli/app/cmd.go:284 ./cli/app/cp.go:384 ./cli/app/deploy.go:393 ./cli/app/labels.go:142 ./cli/app/new.go:396 ./cli/app/ps.go:212 ./cli/app/restart.go:161 ./cli/app/restore.go:137 ./cli/app/secret.go:568 ./cli/app/secret.go:608 ./cli/app/secret.go:632 ./cli/app/secret.go:640 ./cli/catalogue/catalogue.go:317 ./cli/recipe/lint.go:136 ./cli/updater/updater.go:537 | ||||
| #: ./cli/app/backup.go:318 ./cli/app/backup.go:334 ./cli/app/check.go:94 ./cli/app/cmd.go:284 ./cli/app/cp.go:384 ./cli/app/deploy.go:393 ./cli/app/labels.go:142 ./cli/app/new.go:396 ./cli/app/ps.go:212 ./cli/app/restart.go:161 ./cli/app/restore.go:137 ./cli/app/secret.go:568 ./cli/app/secret.go:608 ./cli/app/secret.go:632 ./cli/app/secret.go:640 ./cli/catalogue/catalogue.go:317 ./cli/recipe/lint.go:136 | ||||
| msgid   "chaos" | ||||
| msgstr  "" | ||||
|  | ||||
| @ -2096,10 +2033,6 @@ msgstr  "" | ||||
| msgid   "check <domain> [flags]" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/updater/updater.go:548 | ||||
| msgid   "check for major updates" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/app/deploy.go:94 ./cli/app/undeploy.go:57 ./cli/app/upgrade.go:440 | ||||
| #, c-format | ||||
| msgid   "checking whether %s is already deployed" | ||||
| @ -2403,14 +2336,10 @@ msgstr  "" | ||||
| #. no spaces in between | ||||
| #. translators: `abra recipe diff` aliases. use a comma separated list of aliases | ||||
| #. with no spaces in between | ||||
| #: ./cli/app/backup.go:73 ./cli/app/deploy.go:29 ./cli/recipe/diff.go:16 ./cli/updater/updater.go:491 | ||||
| #: ./cli/app/backup.go:73 ./cli/app/deploy.go:29 ./cli/recipe/diff.go:16 | ||||
| msgid   "d" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/updater/updater.go:490 | ||||
| msgid   "debug" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/app/secret.go:326 | ||||
| #, c-format | ||||
| msgid   "deleted %s successfully from local pass store" | ||||
| @ -2577,26 +2506,6 @@ msgstr  "" | ||||
| msgid   "don't forget to run 'sudo mandb'" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/updater/updater.go:384 | ||||
| #, c-format | ||||
| msgid   "don't update %s due to chaos deployment" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/updater/updater.go:394 | ||||
| #, c-format | ||||
| msgid   "don't update %s due to disabled auto updates or missing ENABLE_AUTO_UPDATE env" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/updater/updater.go:374 | ||||
| #, c-format | ||||
| msgid   "don't update %s due to missing recipe name" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/updater/updater.go:404 | ||||
| #, c-format | ||||
| msgid   "don't update %s due to no new version" | ||||
| msgstr  "" | ||||
|  | ||||
| #. translators: `app backup download` command | ||||
| #: ./cli/app/backup.go:77 | ||||
| msgid   "download <domain> [flags]" | ||||
| @ -2841,11 +2750,6 @@ msgstr  "" | ||||
| msgid   "failed to create volume %s on %s: %s" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/updater/updater.go:264 | ||||
| #, c-format | ||||
| msgid   "failed to determine deployed version of %s" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./pkg/upstream/stack/remove.go:239 | ||||
| #, c-format | ||||
| msgid   "failed to get tasks: %w" | ||||
| @ -3013,11 +2917,6 @@ msgstr  "" | ||||
| msgid   "filter by recipe" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/updater/updater.go:215 | ||||
| #, c-format | ||||
| msgid   "for %s read env %s with value: %s from docker service" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/app/deploy.go:401 ./cli/app/remove.go:162 ./cli/app/rollback.go:349 ./cli/app/upgrade.go:459 ./cli/app/volume.go:216 ./cli/recipe/fetch.go:137 | ||||
| msgid   "force" | ||||
| msgstr  "" | ||||
| @ -3232,7 +3131,7 @@ msgstr  "" | ||||
| msgid   "id: %s, " | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/app/backup.go:321 ./cli/app/backup.go:337 ./cli/app/check.go:97 ./cli/app/cmd.go:287 ./cli/app/cp.go:387 ./cli/app/deploy.go:396 ./cli/app/labels.go:145 ./cli/app/new.go:399 ./cli/app/ps.go:215 ./cli/app/restart.go:164 ./cli/app/restore.go:140 ./cli/app/secret.go:571 ./cli/app/secret.go:611 ./cli/app/secret.go:635 ./cli/app/secret.go:643 ./cli/catalogue/catalogue.go:320 ./cli/recipe/lint.go:139 ./cli/updater/updater.go:540 | ||||
| #: ./cli/app/backup.go:321 ./cli/app/backup.go:337 ./cli/app/check.go:97 ./cli/app/cmd.go:287 ./cli/app/cp.go:387 ./cli/app/deploy.go:396 ./cli/app/labels.go:145 ./cli/app/new.go:399 ./cli/app/ps.go:215 ./cli/app/restart.go:164 ./cli/app/restore.go:140 ./cli/app/secret.go:571 ./cli/app/secret.go:611 ./cli/app/secret.go:635 ./cli/app/secret.go:643 ./cli/catalogue/catalogue.go:320 ./cli/recipe/lint.go:139 | ||||
| msgid   "ignore uncommitted recipes changes" | ||||
| msgstr  "" | ||||
|  | ||||
| @ -3411,16 +3310,6 @@ msgstr  "" | ||||
| msgid   "invalid version %s specified" | ||||
| msgstr  "" | ||||
|  | ||||
| #. translators: `kadabra` binary name | ||||
| #: ./cli/updater/updater.go:470 | ||||
| msgid   "kadabra [cmd] [flags]" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/updater/updater.go:484 | ||||
| #, c-format | ||||
| msgid   "kadabra version %s, commit %s" | ||||
| msgstr  "" | ||||
|  | ||||
| #. translators: `abra app logs` aliases. use a comma separated list of aliases with | ||||
| #. no spaces in between | ||||
| #. translators: `abra recipe lint` aliases. use a comma separated list of | ||||
| @ -3557,7 +3446,7 @@ msgstr  "" | ||||
| #. with no spaces in between | ||||
| #. translators: `abra man` aliases. use a comma separated list of aliases | ||||
| #. with no spaces in between | ||||
| #: ./cli/app/list.go:323 ./cli/app/move.go:34 ./cli/app/ps.go:205 ./cli/app/secret.go:553 ./cli/app/secret.go:649 ./cli/recipe/list.go:104 ./cli/recipe/upgrade.go:376 ./cli/recipe/version.go:139 ./cli/run.go:152 ./cli/server/list.go:106 ./cli/updater/updater.go:546 | ||||
| #: ./cli/app/list.go:323 ./cli/app/move.go:34 ./cli/app/ps.go:205 ./cli/app/secret.go:553 ./cli/app/secret.go:649 ./cli/recipe/list.go:104 ./cli/recipe/upgrade.go:376 ./cli/recipe/version.go:139 ./cli/run.go:152 ./cli/server/list.go:106 | ||||
| msgid   "m" | ||||
| msgstr  "" | ||||
|  | ||||
| @ -3570,7 +3459,7 @@ msgstr  "" | ||||
| msgid   "main app service version for %s is empty?" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/internal/recipe.go:48 ./cli/internal/recipe.go:66 ./cli/internal/recipe.go:80 ./cli/recipe/release.go:656 ./cli/recipe/sync.go:279 ./cli/recipe/upgrade.go:351 ./cli/updater/updater.go:545 | ||||
| #: ./cli/internal/recipe.go:48 ./cli/internal/recipe.go:66 ./cli/internal/recipe.go:80 ./cli/recipe/release.go:656 ./cli/recipe/sync.go:279 ./cli/recipe/upgrade.go:351 | ||||
| msgid   "major" | ||||
| msgstr  "" | ||||
|  | ||||
| @ -3614,10 +3503,6 @@ msgstr  "" | ||||
| msgid   "missing arguments [secret]/[version] or '--all'" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/updater/updater.go:116 | ||||
| msgid   "missing arguments or --all/-a flag" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./pkg/secret/secret.go:131 | ||||
| #, c-format | ||||
| msgid   "missing version for secret? (%s)" | ||||
| @ -3641,9 +3526,7 @@ msgstr  "" | ||||
| #. no spaces in between | ||||
| #. translators: `abra recipe new` aliases. use a comma separated list of | ||||
| #. aliases with no spaces in between | ||||
| #. translators: `kadabra notify` aliases. use a comma separated list of aliases | ||||
| #. with no spaces in between | ||||
| #: ./cli/app/new.go:48 ./cli/recipe/new.go:36 ./cli/updater/updater.go:36 ./cli/updater/updater.go:499 | ||||
| #: ./cli/app/new.go:48 ./cli/recipe/new.go:36 | ||||
| msgid   "n" | ||||
| msgstr  "" | ||||
|  | ||||
| @ -3719,7 +3602,7 @@ msgstr  "" | ||||
| msgid   "no %s exists, skipping reading gitignore paths" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/updater/updater.go:168 ./pkg/app/compose.go:87 | ||||
| #: ./pkg/app/compose.go:87 | ||||
| #, c-format | ||||
| msgid   "no %s label found for %s" | ||||
| msgstr  "" | ||||
| @ -3750,11 +3633,6 @@ msgstr  "" | ||||
| msgid   "no available upgrades" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/updater/updater.go:237 | ||||
| #, c-format | ||||
| msgid   "no available upgrades for %s" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/internal/backup.go:26 | ||||
| msgid   "no backupbot discovered, is it deployed?" | ||||
| msgstr  "" | ||||
| @ -3799,11 +3677,6 @@ msgstr  "" | ||||
| msgid   "no new versions available for %s, assuming %s is the latest (use -a/--all-tags to see all anyway)" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/updater/updater.go:286 | ||||
| #, c-format | ||||
| msgid   "no published releases for %s in the recipe catalogue?" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/internal/validate.go:64 | ||||
| #, c-format | ||||
| msgid   "no recipe '%s' exists?" | ||||
| @ -3905,10 +3778,6 @@ msgstr  "" | ||||
| msgid   "no-domain-checks" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/updater/updater.go:498 | ||||
| msgid   "no-input" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/app/run.go:109 | ||||
| msgid   "no-tty" | ||||
| msgstr  "" | ||||
| @ -3941,11 +3810,6 @@ msgstr  "" | ||||
| msgid   "nothing found in stack: %s" | ||||
| msgstr  "" | ||||
|  | ||||
| #. translators: `notify` command | ||||
| #: ./cli/updater/updater.go:41 | ||||
| msgid   "notify [flags]" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/app/backup.go:329 | ||||
| msgid   "number of retry attempts" | ||||
| msgstr  "" | ||||
| @ -4445,11 +4309,6 @@ msgstr  "" | ||||
| msgid   "retries" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/updater/updater.go:252 | ||||
| #, c-format | ||||
| msgid   "retrieve deployed version whether %s is already deployed" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/internal/backup.go:29 | ||||
| #, c-format | ||||
| msgid   "retrieved %s as backup enabled service" | ||||
| @ -4797,7 +4656,7 @@ msgstr  "" | ||||
| msgid   "show apps of a specific server" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/run.go:193 ./cli/updater/updater.go:493 | ||||
| #: ./cli/run.go:193 | ||||
| msgid   "show debug messages" | ||||
| msgstr  "" | ||||
|  | ||||
| @ -5082,7 +4941,7 @@ msgstr  "" | ||||
| msgid   "tmpfs options are incompatible with type volume" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/run.go:201 ./cli/updater/updater.go:501 | ||||
| #: ./cli/run.go:201 | ||||
| msgid   "toggle non-interactive mode" | ||||
| msgstr  "" | ||||
|  | ||||
| @ -5113,11 +4972,9 @@ msgstr  "" | ||||
|  | ||||
| #. translators: `abra recipe upgrade` aliases. use a comma separated list of | ||||
| #. aliases with no spaces in between | ||||
| #. translators: `kadabra upgrade` aliases. use a comma separated list of aliases with | ||||
| #. no spaces in between | ||||
| #. translators: `abra upgrade` aliases. use a comma separated list of aliases with | ||||
| #. no spaces in between | ||||
| #: ./cli/app/cmd.go:269 ./cli/app/run.go:118 ./cli/recipe/upgrade.go:42 ./cli/updater/updater.go:81 ./cli/upgrade.go:17 | ||||
| #: ./cli/app/cmd.go:269 ./cli/app/run.go:118 ./cli/recipe/upgrade.go:42 ./cli/upgrade.go:17 | ||||
| msgid   "u" | ||||
| msgstr  "" | ||||
|  | ||||
| @ -5452,10 +5309,6 @@ msgstr  "" | ||||
| msgid   "up" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/updater/updater.go:556 | ||||
| msgid   "update all deployed apps" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./pkg/upstream/stack/stack.go:473 | ||||
| #, c-format | ||||
| msgid   "updating %s" | ||||
| @ -5471,11 +5324,6 @@ msgstr  "" | ||||
| msgid   "upgrade" | ||||
| msgstr  "" | ||||
|  | ||||
| #: ./cli/updater/updater.go:442 | ||||
| #, c-format | ||||
| msgid   "upgrade %s (%s) to version %s" | ||||
| msgstr  "" | ||||
|  | ||||
| #. translators: `app upgrade` command | ||||
| #: ./cli/app/upgrade.go:33 | ||||
| msgid   "upgrade <domain> [version] [flags]" | ||||
| @ -5486,11 +5334,6 @@ msgstr  "" | ||||
| msgid   "upgrade <recipe> [flags]" | ||||
| msgstr  "" | ||||
|  | ||||
| #. translators: `app upgrade` command | ||||
| #: ./cli/updater/updater.go:86 | ||||
| msgid   "upgrade [[stack] [recipe] | --all] [flags]" | ||||
| msgstr  "" | ||||
|  | ||||
| #. translators: `upgrade` command | ||||
| #: ./cli/upgrade.go:22 | ||||
| msgid   "upgrade [flags]" | ||||
|  | ||||
										
											Binary file not shown.
										
									
								
							| @ -2,7 +2,7 @@ msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: \n" | ||||
| "Report-Msgid-Bugs-To: EMAIL\n" | ||||
| "POT-Creation-Date: 2025-10-18 16:03-0400\n" | ||||
| "POT-Creation-Date: 2025-10-19 15:32+0200\n" | ||||
| "PO-Revision-Date: 2025-09-04 08:14+0000\n" | ||||
| "Last-Translator: chasqui <chasqui@cryptolab.net>\n" | ||||
| "Language-Team: Spanish <https://translate.coopcloud.tech/projects/co-op-" | ||||
| @ -191,11 +191,6 @@ msgstr "" | ||||
| msgid "%d volumes removed successfully" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/updater/updater.go:244 | ||||
| #, c-format | ||||
| msgid "%s (%s) can be upgraded from version %s to %s" | ||||
| msgstr "" | ||||
|  | ||||
| #: pkg/recipe/git.go:191 | ||||
| #, c-format | ||||
| msgid "%s (%s) has locally unstaged changes?" | ||||
| @ -361,7 +356,6 @@ msgstr "" | ||||
|  | ||||
| #: cli/app/logs.go:65 cli/app/ps.go:62 cli/app/restart.go:100 | ||||
| #: cli/app/services.go:55 cli/app/undeploy.go:65 cli/app/upgrade.go:448 | ||||
| #: cli/updater/updater.go:260 | ||||
| #, c-format | ||||
| msgid "%s is not deployed?" | ||||
| msgstr "" | ||||
| @ -645,7 +639,6 @@ msgstr "" | ||||
| #: cli/app/restart.go:162 cli/app/restore.go:138 cli/app/secret.go:569 | ||||
| #: cli/app/secret.go:609 cli/app/secret.go:633 cli/app/secret.go:641 | ||||
| #: cli/catalogue/catalogue.go:318 cli/recipe/lint.go:137 | ||||
| #: cli/updater/updater.go:538 | ||||
| msgid "C" | ||||
| msgstr "" | ||||
|  | ||||
| @ -693,11 +686,6 @@ msgstr "" | ||||
| msgid "Check app deployment status" | ||||
| msgstr "📋 Revisar el estado de una plataforma" | ||||
|  | ||||
| #. translators: Short description for `notify` command | ||||
| #: cli/updater/updater.go:44 | ||||
| msgid "Check for available upgrades" | ||||
| msgstr "📨 Revisar las actualizaciones disponibles" | ||||
|  | ||||
| #. translators: Short description for `recipe fetch` command | ||||
| #: cli/recipe/fetch.go:27 | ||||
| msgid "Clone recipe(s) locally" | ||||
| @ -1166,15 +1154,6 @@ msgstr "" | ||||
| msgid "NOW" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/updater/updater.go:45 | ||||
| msgid "" | ||||
| "Notify on new versions for deployed apps.\n" | ||||
| "\n" | ||||
| "If a new patch/minor version is available, a notification is printed.\n" | ||||
| "\n" | ||||
| "Use \"--major/-m\" to include new major versions." | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/internal/deploy.go:210 | ||||
| msgid "OLD SERVER" | ||||
| msgstr "" | ||||
| @ -1449,11 +1428,6 @@ msgstr "" | ||||
| msgid "Tail app logs" | ||||
| msgstr "📋 Seguir logs 📈 de la plataforma 🚀" | ||||
|  | ||||
| #. translators: Short description for `kababra` binary | ||||
| #: cli/updater/updater.go:473 | ||||
| msgid "The Co-op Cloud auto-updater 🤖 🚀" | ||||
| msgstr "📨 Actualizador automático de Co-op Cloud 🤖 🚀" | ||||
|  | ||||
| #. translators: Short description for `abra` binary | ||||
| #: cli/run.go:80 | ||||
| msgid "The Co-op Cloud command-line utility belt 🎩🐇" | ||||
| @ -1637,26 +1611,6 @@ msgstr "" | ||||
| msgid "Upgrade an app" | ||||
| msgstr "📨 Actualizar una plataforma 🚀" | ||||
|  | ||||
| #: cli/updater/updater.go:90 | ||||
| msgid "" | ||||
| "Upgrade an app by specifying stack name and recipe. \n" | ||||
| "\n" | ||||
| "Use \"--all\" to upgrade every deployed app.\n" | ||||
| "\n" | ||||
| "For each app with auto updates enabled, the deployed version is compared " | ||||
| "with\n" | ||||
| "the current recipe catalogue version. If a new patch/minor version is\n" | ||||
| "available, the app is upgraded.\n" | ||||
| "\n" | ||||
| "To include major versions use the \"--major/-m\" flag. You probably don't " | ||||
| "want\n" | ||||
| "that as it will break things. Only apps that are not deployed with \"--" | ||||
| "chaos/-C\"\n" | ||||
| "are upgraded, to update chaos deployments use the \"--chaos/-C\" flag. Use " | ||||
| "it\n" | ||||
| "with care." | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/app/upgrade.go:37 | ||||
| msgid "" | ||||
| "Upgrade an app.\n" | ||||
| @ -1680,11 +1634,6 @@ msgid "" | ||||
| "beforehand. See \"abra app backup\" for more." | ||||
| msgstr "" | ||||
|  | ||||
| #. translators: Short description for `app upgrade` command | ||||
| #: cli/updater/updater.go:89 | ||||
| msgid "Upgrade apps" | ||||
| msgstr "📨 Actualizar plataformas 🚀" | ||||
|  | ||||
| #. translators: Short description for `recipe upgrade` command | ||||
| #: cli/recipe/upgrade.go:49 | ||||
| msgid "Upgrade recipe image tags" | ||||
| @ -1706,19 +1655,19 @@ msgid "" | ||||
| "\n" | ||||
| "Available Commands:{{range .Commands}}{{if (or .IsAvailableCommand (eq .Name " | ||||
| "\"help\"))}}\n" | ||||
| "  {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}" | ||||
| "{{if .HasAvailableLocalFlags}}\n" | ||||
| "  {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{if ." | ||||
| "HasAvailableLocalFlags}}\n" | ||||
| "\n" | ||||
| "Flags:\n" | ||||
| "{{.LocalFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}" | ||||
| "{{if .HasAvailableInheritedFlags}}\n" | ||||
| "{{.LocalFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if ." | ||||
| "HasAvailableInheritedFlags}}\n" | ||||
| "\n" | ||||
| "Global Flags:\n" | ||||
| "{{.InheritedFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}" | ||||
| "{{if .HasHelpSubCommands}}\n" | ||||
| "{{.InheritedFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if ." | ||||
| "HasHelpSubCommands}}\n" | ||||
| "\n" | ||||
| "Additional help topics:{{range .Commands}}" | ||||
| "{{if .IsAdditionalHelpTopicCommand}}\n" | ||||
| "Additional help topics:{{range .Commands}}{{if ." | ||||
| "IsAdditionalHelpTopicCommand}}\n" | ||||
| "  {{rpad .CommandPath .CommandPathPadding}} {{.Short}}{{end}}{{end}}{{end}}" | ||||
| "{{if .HasAvailableSubCommands}}\n" | ||||
| "\n" | ||||
| @ -1883,11 +1832,6 @@ msgctxt "server prune" | ||||
| msgid "a" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/updater/updater.go:554 | ||||
| msgctxt "abra upgrade" | ||||
| msgid "a" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/app/remove.go:66 | ||||
| msgid "aborting as requested" | ||||
| msgstr "" | ||||
| @ -1941,7 +1885,7 @@ msgid "adding env vars to %s service config" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/app/backup.go:270 cli/app/secret.go:576 cli/app/secret.go:616 | ||||
| #: cli/recipe/fetch.go:121 cli/server/prune.go:98 cli/updater/updater.go:553 | ||||
| #: cli/recipe/fetch.go:121 cli/server/prune.go:98 | ||||
| msgid "all" | ||||
| msgstr "" | ||||
|  | ||||
| @ -2064,11 +2008,6 @@ msgstr "" | ||||
| msgid "automatically set ssh remote" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/updater/updater.go:312 | ||||
| #, c-format | ||||
| msgid "available updates for %s: %s" | ||||
| msgstr "" | ||||
|  | ||||
| #. translators: `abra app backup` aliases. use a comma separated list of aliases with | ||||
| #. no spaces in between | ||||
| #: cli/app/backup.go:239 | ||||
| @ -2102,11 +2041,6 @@ msgstr "" | ||||
| msgid "bind options are incompatible with type volume" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/updater/updater.go:189 | ||||
| #, c-format | ||||
| msgid "boolean label %s could not be found for %s, set default to false." | ||||
| msgstr "" | ||||
|  | ||||
| #: pkg/config/env.go:74 pkg/config/env.go:107 | ||||
| #, c-format | ||||
| msgid "broken symlink in your abra config folders: %s" | ||||
| @ -2144,11 +2078,6 @@ msgstr "" | ||||
| msgid "can't read local recipes: %s" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/updater/updater.go:210 | ||||
| #, c-format | ||||
| msgid "can't separate key from value: %s (this variable is probably unset)" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/internal/deploy.go:237 | ||||
| msgid "cancelled" | ||||
| msgstr "" | ||||
| @ -2267,7 +2196,6 @@ msgstr "" | ||||
| #: cli/app/restart.go:161 cli/app/restore.go:137 cli/app/secret.go:568 | ||||
| #: cli/app/secret.go:608 cli/app/secret.go:632 cli/app/secret.go:640 | ||||
| #: cli/catalogue/catalogue.go:317 cli/recipe/lint.go:136 | ||||
| #: cli/updater/updater.go:537 | ||||
| msgid "chaos" | ||||
| msgstr "" | ||||
|  | ||||
| @ -2276,10 +2204,6 @@ msgstr "" | ||||
| msgid "check <domain> [flags]" | ||||
| msgstr "verificar <domain> [flags]" | ||||
|  | ||||
| #: cli/updater/updater.go:548 | ||||
| msgid "check for major updates" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/app/deploy.go:94 cli/app/undeploy.go:57 cli/app/upgrade.go:440 | ||||
| #, c-format | ||||
| msgid "checking whether %s is already deployed" | ||||
| @ -2590,14 +2514,9 @@ msgstr "" | ||||
| #. translators: `abra recipe diff` aliases. use a comma separated list of aliases | ||||
| #. with no spaces in between | ||||
| #: cli/app/backup.go:73 cli/app/deploy.go:29 cli/recipe/diff.go:16 | ||||
| #: cli/updater/updater.go:491 | ||||
| msgid "d" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/updater/updater.go:490 | ||||
| msgid "debug" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/app/secret.go:326 | ||||
| #, c-format | ||||
| msgid "deleted %s successfully from local pass store" | ||||
| @ -2765,28 +2684,6 @@ msgstr "" | ||||
| msgid "don't forget to run 'sudo mandb'" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/updater/updater.go:384 | ||||
| #, c-format | ||||
| msgid "don't update %s due to chaos deployment" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/updater/updater.go:394 | ||||
| #, c-format | ||||
| msgid "" | ||||
| "don't update %s due to disabled auto updates or missing ENABLE_AUTO_UPDATE " | ||||
| "env" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/updater/updater.go:374 | ||||
| #, c-format | ||||
| msgid "don't update %s due to missing recipe name" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/updater/updater.go:404 | ||||
| #, c-format | ||||
| msgid "don't update %s due to no new version" | ||||
| msgstr "" | ||||
|  | ||||
| #. translators: `app backup download` command | ||||
| #: cli/app/backup.go:77 | ||||
| msgid "download <domain> [flags]" | ||||
| @ -3038,11 +2935,6 @@ msgstr "" | ||||
| msgid "failed to create volume %s on %s: %s" | ||||
| msgstr "🥷 Genera secretos (contraseñas) automáticamente 🤖" | ||||
|  | ||||
| #: cli/updater/updater.go:264 | ||||
| #, c-format | ||||
| msgid "failed to determine deployed version of %s" | ||||
| msgstr "" | ||||
|  | ||||
| #: pkg/upstream/stack/remove.go:239 | ||||
| #, c-format | ||||
| msgid "failed to get tasks: %w" | ||||
| @ -3210,11 +3102,6 @@ msgstr "" | ||||
| msgid "filter by recipe" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/updater/updater.go:215 | ||||
| #, c-format | ||||
| msgid "for %s read env %s with value: %s from docker service" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/app/deploy.go:401 cli/app/remove.go:162 cli/app/rollback.go:349 | ||||
| #: cli/app/upgrade.go:459 cli/app/volume.go:216 cli/recipe/fetch.go:137 | ||||
| msgid "force" | ||||
| @ -3437,7 +3324,6 @@ msgstr "" | ||||
| #: cli/app/restart.go:164 cli/app/restore.go:140 cli/app/secret.go:571 | ||||
| #: cli/app/secret.go:611 cli/app/secret.go:635 cli/app/secret.go:643 | ||||
| #: cli/catalogue/catalogue.go:320 cli/recipe/lint.go:139 | ||||
| #: cli/updater/updater.go:540 | ||||
| msgid "ignore uncommitted recipes changes" | ||||
| msgstr "" | ||||
|  | ||||
| @ -3618,16 +3504,6 @@ msgstr "" | ||||
| msgid "invalid version %s specified" | ||||
| msgstr "" | ||||
|  | ||||
| #. translators: `kadabra` binary name | ||||
| #: cli/updater/updater.go:470 | ||||
| msgid "kadabra [cmd] [flags]" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/updater/updater.go:484 | ||||
| #, c-format | ||||
| msgid "kadabra version %s, commit %s" | ||||
| msgstr "" | ||||
|  | ||||
| #. translators: `abra app logs` aliases. use a comma separated list of aliases with | ||||
| #. no spaces in between | ||||
| #. translators: `abra recipe lint` aliases. use a comma separated list of | ||||
| @ -3770,7 +3646,7 @@ msgstr "plataformas" | ||||
| #: cli/app/list.go:323 cli/app/move.go:34 cli/app/ps.go:205 | ||||
| #: cli/app/secret.go:553 cli/app/secret.go:649 cli/recipe/list.go:104 | ||||
| #: cli/recipe/upgrade.go:376 cli/recipe/version.go:139 cli/run.go:152 | ||||
| #: cli/server/list.go:106 cli/updater/updater.go:546 | ||||
| #: cli/server/list.go:106 | ||||
| msgid "m" | ||||
| msgstr "" | ||||
|  | ||||
| @ -3787,7 +3663,7 @@ msgstr "" | ||||
|  | ||||
| #: cli/internal/recipe.go:48 cli/internal/recipe.go:66 | ||||
| #: cli/internal/recipe.go:80 cli/recipe/release.go:656 cli/recipe/sync.go:279 | ||||
| #: cli/recipe/upgrade.go:351 cli/updater/updater.go:545 | ||||
| #: cli/recipe/upgrade.go:351 | ||||
| msgid "major" | ||||
| msgstr "" | ||||
|  | ||||
| @ -3833,10 +3709,6 @@ msgstr "" | ||||
| msgid "missing arguments [secret]/[version] or '--all'" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/updater/updater.go:116 | ||||
| msgid "missing arguments or --all/-a flag" | ||||
| msgstr "" | ||||
|  | ||||
| #: pkg/secret/secret.go:131 | ||||
| #, c-format | ||||
| msgid "missing version for secret? (%s)" | ||||
| @ -3860,10 +3732,7 @@ msgstr "" | ||||
| #. no spaces in between | ||||
| #. translators: `abra recipe new` aliases. use a comma separated list of | ||||
| #. aliases with no spaces in between | ||||
| #. translators: `kadabra notify` aliases. use a comma separated list of aliases | ||||
| #. with no spaces in between | ||||
| #: cli/app/new.go:48 cli/recipe/new.go:36 cli/updater/updater.go:36 | ||||
| #: cli/updater/updater.go:499 | ||||
| #: cli/app/new.go:48 cli/recipe/new.go:36 | ||||
| msgid "n" | ||||
| msgstr "n" | ||||
|  | ||||
| @ -3944,7 +3813,7 @@ msgstr "" | ||||
| msgid "no %s exists, skipping reading gitignore paths" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/updater/updater.go:168 pkg/app/compose.go:87 | ||||
| #: pkg/app/compose.go:87 | ||||
| #, c-format | ||||
| msgid "no %s label found for %s" | ||||
| msgstr "" | ||||
| @ -3975,11 +3844,6 @@ msgstr "" | ||||
| msgid "no available upgrades" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/updater/updater.go:237 | ||||
| #, c-format | ||||
| msgid "no available upgrades for %s" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/internal/backup.go:26 | ||||
| msgid "no backupbot discovered, is it deployed?" | ||||
| msgstr "" | ||||
| @ -4026,11 +3890,6 @@ msgid "" | ||||
| "tags to see all anyway)" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/updater/updater.go:286 | ||||
| #, fuzzy, c-format | ||||
| msgid "no published releases for %s in the recipe catalogue?" | ||||
| msgstr "TRANSLATE THIS FUCKING SHIT ALREADY" | ||||
|  | ||||
| #: cli/internal/validate.go:64 | ||||
| #, c-format | ||||
| msgid "no recipe '%s' exists?" | ||||
| @ -4134,10 +3993,6 @@ msgstr "" | ||||
| msgid "no-domain-checks" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/updater/updater.go:498 | ||||
| msgid "no-input" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/app/run.go:109 | ||||
| msgid "no-tty" | ||||
| msgstr "" | ||||
| @ -4172,11 +4027,6 @@ msgstr "" | ||||
| msgid "nothing found in stack: %s" | ||||
| msgstr "" | ||||
|  | ||||
| #. translators: `notify` command | ||||
| #: cli/updater/updater.go:41 | ||||
| msgid "notify [flags]" | ||||
| msgstr "notificar [flags]" | ||||
|  | ||||
| #: cli/app/backup.go:329 | ||||
| msgid "number of retry attempts" | ||||
| msgstr "" | ||||
| @ -4691,11 +4541,6 @@ msgstr "" | ||||
| msgid "retries" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/updater/updater.go:252 | ||||
| #, c-format | ||||
| msgid "retrieve deployed version whether %s is already deployed" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/internal/backup.go:29 | ||||
| #, c-format | ||||
| msgid "retrieved %s as backup enabled service" | ||||
| @ -4975,8 +4820,8 @@ msgstr "" | ||||
| #: cli/recipe/upgrade.go:228 | ||||
| #, c-format | ||||
| msgid "" | ||||
| "service %s is at version %s, but pinned to %s, please correct your " | ||||
| "compose.yml file manually!" | ||||
| "service %s is at version %s, but pinned to %s, please correct your compose." | ||||
| "yml file manually!" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/recipe/upgrade.go:224 | ||||
| @ -5051,7 +4896,7 @@ msgstr "" | ||||
| msgid "show apps of a specific server" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/run.go:193 cli/updater/updater.go:493 | ||||
| #: cli/run.go:193 | ||||
| msgid "show debug messages" | ||||
| msgstr "" | ||||
|  | ||||
| @ -5339,7 +5184,7 @@ msgstr "" | ||||
| msgid "tmpfs options are incompatible with type volume" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/run.go:201 cli/updater/updater.go:501 | ||||
| #: cli/run.go:201 | ||||
| msgid "toggle non-interactive mode" | ||||
| msgstr "" | ||||
|  | ||||
| @ -5370,12 +5215,10 @@ msgstr "" | ||||
|  | ||||
| #. translators: `abra recipe upgrade` aliases. use a comma separated list of | ||||
| #. aliases with no spaces in between | ||||
| #. translators: `kadabra upgrade` aliases. use a comma separated list of aliases with | ||||
| #. no spaces in between | ||||
| #. translators: `abra upgrade` aliases. use a comma separated list of aliases with | ||||
| #. no spaces in between | ||||
| #: cli/app/cmd.go:269 cli/app/run.go:118 cli/recipe/upgrade.go:42 | ||||
| #: cli/updater/updater.go:81 cli/upgrade.go:17 | ||||
| #: cli/upgrade.go:17 | ||||
| msgid "u" | ||||
| msgstr "" | ||||
|  | ||||
| @ -5718,10 +5561,6 @@ msgstr "" | ||||
| msgid "up" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/updater/updater.go:556 | ||||
| msgid "update all deployed apps" | ||||
| msgstr "" | ||||
|  | ||||
| #: pkg/upstream/stack/stack.go:473 | ||||
| #, c-format | ||||
| msgid "updating %s" | ||||
| @ -5737,11 +5576,6 @@ msgstr "" | ||||
| msgid "upgrade" | ||||
| msgstr "" | ||||
|  | ||||
| #: cli/updater/updater.go:442 | ||||
| #, c-format | ||||
| msgid "upgrade %s (%s) to version %s" | ||||
| msgstr "" | ||||
|  | ||||
| #. translators: `app upgrade` command | ||||
| #: cli/app/upgrade.go:33 | ||||
| msgid "upgrade <domain> [version] [flags]" | ||||
| @ -5752,11 +5586,6 @@ msgstr "actualizar <domain> [version] [flags]" | ||||
| msgid "upgrade <recipe> [flags]" | ||||
| msgstr "actualizar <recipe> [flags]" | ||||
|  | ||||
| #. translators: `app upgrade` command | ||||
| #: cli/updater/updater.go:86 | ||||
| msgid "upgrade [[stack] [recipe] | --all] [flags]" | ||||
| msgstr "actualizar [[stack] [recipe] | --all] [flags]" | ||||
|  | ||||
| #. translators: `upgrade` command | ||||
| #: cli/upgrade.go:22 | ||||
| msgid "upgrade [flags]" | ||||
| @ -6061,5 +5890,24 @@ msgstr "" | ||||
| msgid "{name: %s, " | ||||
| msgstr "" | ||||
|  | ||||
| #~ msgid "Check for available upgrades" | ||||
| #~ msgstr "📨 Revisar las actualizaciones disponibles" | ||||
|  | ||||
| #~ msgid "The Co-op Cloud auto-updater 🤖 🚀" | ||||
| #~ msgstr "📨 Actualizador automático de Co-op Cloud 🤖 🚀" | ||||
|  | ||||
| #~ msgid "Upgrade apps" | ||||
| #~ msgstr "📨 Actualizar plataformas 🚀" | ||||
|  | ||||
| #, fuzzy, c-format | ||||
| #~ msgid "no published releases for %s in the recipe catalogue?" | ||||
| #~ msgstr "TRANSLATE THIS FUCKING SHIT ALREADY" | ||||
|  | ||||
| #~ msgid "notify [flags]" | ||||
| #~ msgstr "notificar [flags]" | ||||
|  | ||||
| #~ msgid "upgrade [[stack] [recipe] | --all] [flags]" | ||||
| #~ msgstr "actualizar [[stack] [recipe] | --all] [flags]" | ||||
|  | ||||
| #~ msgid "Undeploy an app" | ||||
| #~ msgstr "📥 Desarma una plataforma 🚀 (los datos 📦 persisten)" | ||||
|  | ||||
		Reference in New Issue
	
	Block a user