package cmd import ( "os" "os/user" "path/filepath" "strings" "github.com/spf13/cobra" "gitlab.sweetwater.com/it/devops/tools/gitlab-project-manager/internal/config" "gitlab.sweetwater.com/it/devops/tools/gitlab-project-manager/internal/gitlab" "gitlab.sweetwater.com/it/devops/tools/gitlab-project-manager/internal/projects" "golang.org/x/sys/unix" ) // This file contains init methods that may be used by // multiple sub-commands. For instance, the cach and projects // sub-commands both depend on a cache and may both call the initProjectCache // func from their PersistentPreRun commands func initProjectCache(cmd *cobra.Command, args []string) { plog.Debug("Running pre-run for cacheCmd") conf.Cache.File = conf.ProjectPath + "/.cache.yaml" gitlabClient, err := gitlab.NewGitlabClient(cmd.Context(), conf.GitlabHost, conf.GitlabToken) if err != nil { plog.Error("Failed to create GitLab client", plog.Args("error", err)) os.Exit(1) } cacheOpts := &projects.CacheOpts{ ProjectsPath: conf.ProjectPath, Path: conf.Cache.File, TTL: conf.Cache.Ttl, Logger: plog, Gitlab: gitlabClient, Config: &conf, } if cache, err = projects.NewProjectCache(cacheOpts); err != nil { plog.Error("Failed to prepare project cache", plog.Args("error", err)) os.Exit(1) } if err := cache.Read(); err != nil { plog.Error("Cache load failed", plog.Args("error", err)) os.Exit(1) } } func postProjectCache(cmd *cobra.Command, args []string) { cache.Write() } func initProjectPath(cmd *cobra.Command, args []string) { plog.Debug("Running persistent pre-run for rootCmd") var err error if conf.ProjectPath == "" { conf.ProjectPath = config.DefaultConfig.ProjectPath } if conf.ProjectPath, err = resolvePath(conf.ProjectPath); err != nil { plog.Error("Failed to determine project path", plog.Args("error", err)) os.Exit(1) } _, err = os.Stat(conf.ProjectPath) if err != nil { plog.Error("Failed to stat project path, trying to create", plog.Args("error", err)) if err := os.Mkdir(conf.ProjectPath, 0750); err != nil { plog.Error("Failed to create project path", plog.Args("error", err)) os.Exit(1) } plog.Info("Project path created", plog.Args("path", conf.ProjectPath)) } else { if err = unix.Access(conf.ProjectPath, unix.W_OK); err != nil { plog.Error("Unable to write to project path", plog.Args( "path", conf.ProjectPath, "error", err)) os.Exit(1) } } } func resolvePath(path string) (string, error) { if strings.HasPrefix(path, "~/") { usr, _ := user.Current() path = filepath.Join(usr.HomeDir, path[2:]) } return filepath.Abs(path) }