From 277bb4ff097d11cdc4f006d1bf23f279a4737cc0 Mon Sep 17 00:00:00 2001 From: davidmdm Date: Tue, 9 Feb 2021 16:47:33 -0500 Subject: [PATCH] refactor pull --- src/cmd/pull/pull.go | 15 ++++---- src/cmd/root.go | 5 ++- src/internal/home/home.go | 75 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+), 10 deletions(-) create mode 100644 src/internal/home/home.go diff --git a/src/cmd/pull/pull.go b/src/cmd/pull/pull.go index bea032b..145c0bb 100644 --- a/src/cmd/pull/pull.go +++ b/src/cmd/pull/pull.go @@ -1,23 +1,24 @@ package pull import ( - "github.com/Samasource/jen/src/internal/model" + "github.com/Samasource/jen/src/internal/home" "github.com/Samasource/jen/src/internal/shell" "github.com/spf13/cobra" ) // New creates the "jen pull" cobra sub-command -func New(config *model.Config) *cobra.Command { +func New() *cobra.Command { return &cobra.Command{ Use: "pull", Short: "Pulls latest templates from git repo", Args: cobra.NoArgs, RunE: func(_ *cobra.Command, args []string) error { - return run(config) + jenHome, err := home.CloneJenRepo() + if err != nil { + return err + } + + return shell.Execute(nil, jenHome, nil, "git pull") }, } } - -func run(config *model.Config) error { - return shell.Execute(nil, config.JenDir, config.BinDirs, "git pull") -} diff --git a/src/cmd/root.go b/src/cmd/root.go index 746c024..c19d30d 100644 --- a/src/cmd/root.go +++ b/src/cmd/root.go @@ -34,7 +34,7 @@ continues to support you throughout development in executing project-related com c.PersistentFlags().StringVarP(&config.TemplateName, "template", "t", "", "Name of template to use (defaults to prompting user)") c.PersistentFlags().BoolVarP(&config.SkipConfirm, "yes", "y", false, "skip all confirmation prompts") c.PersistentFlags().StringSliceVarP(&config.RawVarOverrides, "set", "s", []string{}, "sets a project variable manually (can be used multiple times)") - c.AddCommand(pull.New(config)) + c.AddCommand(pull.New()) c.AddCommand(do.New(config)) c.AddCommand(exec.New(config)) c.PersistentPreRunE = func(*cobra.Command, []string) error { @@ -55,8 +55,7 @@ func initialize(config *model.Config) error { return err } - err = cloneJenRepo(config.JenDir, jenRepo) - if err != nil { + if err := cloneJenRepo(config.JenDir, jenRepo); err != nil { return err } diff --git a/src/internal/home/home.go b/src/internal/home/home.go new file mode 100644 index 0000000..13108f0 --- /dev/null +++ b/src/internal/home/home.go @@ -0,0 +1,75 @@ +package home + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + + "github.com/Samasource/jen/src/internal/helpers" + "github.com/Samasource/jen/src/internal/logging" + "github.com/Samasource/jen/src/internal/shell" + "github.com/mitchellh/go-homedir" +) + +// getJenRepo reads the repoitory value from the environment and returns an error if it is not set +func getJenRepo() (string, error) { + jenRepo, ok := os.LookupEnv("JEN_REPO") + if !ok { + return "", fmt.Errorf("please specify a JEN_REPO env var pointing to your jen templates git repo") + } + return jenRepo, nil +} + +// getJenHomeDir returns the path to the jen home folder defaulting to ~/.jen if not provided +func getJenHomeDir() (jenHomeDir string, err error) { + defer func() { + if err == nil { + logging.Log("Using jen home dir: %s", jenHomeDir) + } + }() + + jenHomeDir, ok := os.LookupEnv("JEN_HOME") + if ok && jenHomeDir != "" { + return + } + + home, err := homedir.Dir() + if err != nil { + err = fmt.Errorf("failed to detect home directory: %v", err) + return + } + jenHomeDir = filepath.Join(home, ".jen") + return +} + +// CloneJenRepo will clone the jenRepo if it does not exist, and return the path to where it was cloned +func CloneJenRepo() (string, error) { + jenHome, err := getJenHomeDir() + if err != nil { + return "", fmt.Errorf("failed to locate jen home: %w", err) + } + + if helpers.PathExists(jenHome) { + if helpers.PathExists(filepath.Join(jenHome, ".git")) { + return jenHome, nil + } + + infos, err := ioutil.ReadDir(jenHome) + if err != nil { + return jenHome, fmt.Errorf("listing content of jen dir %q to ensure it's empty before cloning into it: %w", jenHome, err) + } + + if len(infos) > 0 { + return jenHome, fmt.Errorf("jen dir %q already exists, is not a valid git working copy and already contains files so we cannot clone into it (please delete or empty it)", jenHome) + } + } + + jenRepo, err := getJenRepo() + if err != nil { + return jenHome, fmt.Errorf("failed to detect jen repo: %w", err) + } + + logging.Log("Cloning jen templates repo %q into jen dir %q", jenRepo, jenHome) + return jenHome, shell.Execute(nil, "", nil, fmt.Sprintf("git clone %s %s", jenRepo, jenHome)) +}