From b5825e93dd9a8d6923c9a0058c8ed3bd4f52ceb8 Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Thu, 7 Mar 2024 19:30:09 -0600 Subject: [PATCH] look for and use any go.work file --- .gitignore | 1 + Makefile | 2 +- main.go | 116 +++++++++++++++++++++++++++++++++++++++-------------- 3 files changed, 87 insertions(+), 32 deletions(-) diff --git a/.gitignore b/.gitignore index 97c6dcd..b38b406 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ go.mod go.sum /files/* +/work/* go-clone diff --git a/Makefile b/Makefile index abbc63e..bef96ae 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ VERSION = $(shell git describe --tags) run: build - ./go-clone github.com/rclone/rclone + ./go-clone --work github.com/rclone/rclone vet: @GO111MODULE=off go vet diff --git a/main.go b/main.go index e7a97f8..7b14246 100644 --- a/main.go +++ b/main.go @@ -1,6 +1,10 @@ package main import ( + "fmt" + "os" + "path/filepath" + "go.wit.com/dev/alexflint/arg" "go.wit.com/gui" "go.wit.com/lib/gui/repolist" @@ -11,56 +15,106 @@ import ( var VERSION string var rv *repolist.RepoList +var myargs args func main() { - - var myargs args - // tmp := arg.MustParse(&myargs) arg.MustParse(&myargs) - if myargs.Work { - shell.Mkdir("work") - } else { - // filepath := filepath.Join("/home/jcarr/go/src") - // os.Chdir(filepath) + if myargs.Repo == "" { + // tmp.WriteHelp(os.Stdout) + // fmt.Println("hello world") + tmp := myargs.Description() + fmt.Println(tmp) + os.Exit(0) } - // if myargs.Repo == "" { - // // tmp.WriteHelp(os.Stdout) - // // fmt.Println("hello world") - // tmp := myargs.Description() - // fmt.Println(tmp) - // os.Exit(0) - // } + + wdir, err := findWorkFile() + if err != nil { + log.Info(err) + os.Exit(-1) + } + log.Info("go.work directory:", wdir) + os.Setenv("REPO_WORK_PATH", wdir) + + // readControlFile() b := gui.RawBox() rv = repolist.AutotypistView(b) - // shell.TestTerminalColor() - readControlFile() - - clone(myargs.Repo) + // clone(myargs.Repo) rv.NewRepo(myargs.Repo) - rv.NewRepo("go.wit.com/apps/helloworld") + // rv.NewRepo("go.wit.com/apps/helloworld") for _, repo := range rv.AllRepos() { log.Info("found repo", repo.GoPath(), repo.Status.Path()) } - rv.Watchdog(func() { - log.Info("watchdog") - }) + // rv.Watchdog(func() { + // log.Info("watchdog") + // }) } func clone(path string) { - shell.RunPath([]string{"git", "clone", path}) + pwd, err := os.Getwd() + if err != nil { + return + } + + shell.RunPath(pwd, []string{"git", "clone", path}) } -func findWorkDir() { - if myargs.Work { - shell.Mkdir("work") - shell.Mkdir("work") - } - // filepath := filepath.Join("/home/jcarr/go/src") - // os.Chdir(filepath) +// look for or make a go.work file +// otherwise use ~/go/src +func findWorkFile() (string, error) { + pwd, err := os.Getwd() + if err == nil { + // Check for go.work in the current directory and then move up until root + pwd, err = digup(pwd) + if err == nil { + os.Chdir(pwd) + return pwd, nil + } + if myargs.Work { + pwd := filepath.Join(pwd, "work") + shell.Mkdir(pwd) + os.Chdir(pwd) + if _, err := os.Stat("go.work"); err == nil { + return pwd, nil + } + shell.RunPath(pwd, []string{"go", "work", "init"}) + if shell.Exists("go.work") { + return pwd, nil + } + } + } + + homeDir, err := os.UserHomeDir() + if err != nil { + return "", err + } + pwd = filepath.Join(homeDir, "go/src") + shell.Mkdir(pwd) + os.Chdir(pwd) + return pwd, nil +} + +func digup(path string) (string, error) { + for { + workFilePath := filepath.Join(path, "go.work") + if _, err := os.Stat(workFilePath); err == nil { + return path, nil // Found the go.work file + } else if !os.IsNotExist(err) { + return "", err // An error other than not existing + } + + parentPath := filepath.Dir(path) + if parentPath == path { + break // Reached the filesystem root + } + path = parentPath + } + + return "", fmt.Errorf("no go.work file found") +}