package recipe import ( "fmt" "coopcloud.tech/abra/cli/internal" "coopcloud.tech/abra/pkg/catalogue" "github.com/AlecAivazis/survey/v2" "github.com/sirupsen/logrus" "github.com/urfave/cli/v2" ) var recipeSyncCommand = &cli.Command{ Name: "sync", Usage: "Ensure recipe version labels are up-to-date", Aliases: []string{"s"}, Description: ` This command will generate labels for the main recipe service (i.e. the service named "app", by convention) which corresponds to the following format: coop-cloud.${STACK_NAME}.version=${RECIPE_TAG} The ${RECIPE_TAG} is determined by the recipe maintainer and is retrieved by this command by asking for the list of git tags on the local git repository. The configuration will be updated on the local file system. `, ArgsUsage: "", BashComplete: func(c *cli.Context) { catl, err := catalogue.ReadRecipeCatalogue() if err != nil { logrus.Warn(err) } if c.NArg() > 0 { return } for name := range catl { fmt.Println(name) } }, Action: func(c *cli.Context) error { recipe := internal.ValidateRecipe(c) mainService := "app" var services []string hasAppService := false for _, service := range recipe.Config.Services { services = append(services, service.Name) if service.Name == "app" { hasAppService = true logrus.Debugf("detected app service in '%s'", recipe.Name) } } if !hasAppService { logrus.Warnf("no 'app' service defined in '%s'", recipe.Name) var chosenService string prompt := &survey.Select{ Message: fmt.Sprintf("what is the main service name for '%s'?", recipe.Name), Options: services, } if err := survey.AskOne(prompt, &chosenService); err != nil { logrus.Fatal(err) } mainService = chosenService } logrus.Debugf("selecting '%s' as the service to sync version labels", mainService) tags, err := recipe.Tags() if err != nil { logrus.Fatal(err) } if len(tags) == 0 { logrus.Fatalf("no tags detected for '%s'", recipe.Name) } latestTag := tags[len(tags)-1] logrus.Infof("choosing '%s' as latest tag for recipe '%s'", latestTag, recipe.Name) label := fmt.Sprintf("coop-cloud.${STACK_NAME}.version=%s", latestTag) if err := recipe.UpdateLabel(mainService, label); err != nil { logrus.Fatal(err) } logrus.Infof("added label '%s' to service '%s'", label, mainService) return nil }, }