diff options
Diffstat (limited to 'new.go')
| -rw-r--r-- | new.go | 184 |
1 files changed, 0 insertions, 184 deletions
@@ -1,15 +1,10 @@ package repostatus import ( - "errors" - "io/ioutil" - "net/http" "os" - "path/filepath" "strings" "go.wit.com/lib/gadgets" - "go.wit.com/lib/gui/shell" "go.wit.com/log" ) @@ -48,185 +43,6 @@ func SetWorkPath(path string) { os.Setenv("REPO_WORK_PATH", path) } -// guess the paths. returns -// realpath : the actual path on the filesystem -// goSrcPath : this could be ~/go/src, or where the go.work file is -// goPath : go.wit.com/lib/gui/repostatus (for example) -// true/false if the repo is a golang repo -func guessPaths(path string) (string, string, string, bool, error) { - var realpath, goSrcDir string - var isGoLang bool = false - - homeDir, err := os.UserHomeDir() - if err != nil { - log.Log(WARN, "Error getting home directory:", err) - return path, realpath, goSrcDir, false, err - } - goSrcDir = filepath.Join(homeDir, "go/src") - - // allow arbitrary paths, otherwise, assume the repo is in ~/go/src - // unless REPO_WORK_PATH was set. to over-ride ~/go/src - // todo, look for go.work - if os.Getenv("REPO_WORK_PATH") == "" { - os.Setenv("REPO_WORK_PATH", goSrcDir) - } else { - goSrcDir = os.Getenv("REPO_WORK_PATH") - } - - if strings.HasPrefix(path, "/") { - realpath = path - } else if strings.HasPrefix(path, "~") { - tmp := strings.TrimPrefix(path, "~") - realpath = filepath.Join(homeDir, tmp) - } else { - realpath = filepath.Join(goSrcDir, path) - isGoLang = true - } - - if os.Getenv("REPO_AUTO_CLONE") == "true" { - err := Clone(goSrcDir, path) - if err != nil { - // directory doesn't exist. exit with nil and error nil - return path, realpath, goSrcDir, false, errors.New("git clone") - } - } - - if !IsDirectory(realpath) { - log.Log(REPOWARN, "directory doesn't exist", realpath) - // directory doesn't exist. exit with nil and error nil - return path, realpath, goSrcDir, false, errors.New(realpath + " does not exist") - } - - filename := filepath.Join(realpath, ".git/config") - - _, err = os.Open(filename) - if err != nil { - // log.Log(WARN, "Error reading .git/config:", filename, err) - // log.Log(WARN, "TODO: find .git/config in parent directory") - return path, realpath, goSrcDir, false, err - } - return path, realpath, goSrcDir, isGoLang, nil -} - -// attempt to git clone if the go path doesn't exist -func Clone(wdir string, path string) error { - fullpath := filepath.Join(wdir, path) - if IsDirectory(fullpath) { - // directory already exists - return nil - } - err := os.Chdir(wdir) - if err != nil { - return err - } - - fulldir := filepath.Join(wdir, filepath.Dir(path)) - base := filepath.Base(path) - os.MkdirAll(fulldir, 0750) - err = os.Chdir(fulldir) - if err != nil { - return err - } - // TODO: attempt to work around things like: - // todo: move this to a resources/ text file in go-clone - // go get golang.org/x/term - // is now supposed to be: - // git clone https://go.googlesource.com/term - // if url, err = findGoImport("http://" + path); err != nil { - switch path { - case "golang.org/x/crypto": - path = "go.googlesource.com/crypto" - case "golang.org/x/mod": - path = "go.googlesource.com/mod" - case "golang.org/x/net": - path = "go.googlesource.com/net" - case "golang.org/x/sys": - path = "go.googlesource.com/sys" - case "golang.org/x/sync": - path = "go.googlesource.com/sync" - case "golang.org/x/term": - path = "go.googlesource.com/term" - case "golang.org/x/text": - path = "go.googlesource.com/text" - case "golang.org/x/tools": - path = "go.googlesource.com/tools" - case "golang.org/x/xerrors": - path = "go.googlesource.com/xerrors" - } - - r := shell.PathRunRealtime(fulldir, []string{"git", "clone", "--verbose", "--progress", "http://" + path}) - if r.Error != nil { - log.Warn("git clone error", r.Error) - log.Error(r.Error) - } - - if IsDirectory(fullpath) { - // clone worked - return nil - } - var url string - - // this creates a valid URL for git clone - if url, err = runGoList(path); err != nil { - return err - } - log.Info("URL:", url) - shell.PathRunRealtime(fulldir, []string{"git", "clone", url, base}) - if IsDirectory(fullpath) { - // clone worked - return nil - } - return errors.New("resolve go import") -} - -// this is a terrible hack and really -// shouldn't be here. Hopefully this can -// be removed and the GO compiler code can -// be involked directly (it appears to currently -// be an internal/ function in the GO sources -// so it can't be imported from outside the compiler -func findGoImport(url string) (string, error) { - resp, err := http.Get(url) - if err != nil { - return "", err - } - defer resp.Body.Close() - - bodyBytes, err := ioutil.ReadAll(resp.Body) - if err != nil { - return "", err - } - - tmp := string(bodyBytes) - parts := strings.Split(tmp, "go-import") - if len(parts) < 2 { - return "", errors.New("missing go-import") - } - // this is terrible, it doesn't even look for 'content=' - // but again, this is just a hack for my own code to be - // usuable after the removal in go v1.22 of the go get clone behavior that was in v1.21 - parts = strings.Split(parts[1], "\"") - var newurl string - for { - if len(parts) == 0 { - break - } - tmp := strings.TrimSpace(parts[0]) - fields := strings.Split(tmp, " ") - // log.Info("FIELDS:", fields) - if len(fields) == 3 { - newurl = fields[2] - break - } - parts = parts[1:] - } - if newurl == "" { - return "", errors.New("missing git content string") - } - - return newurl, nil -} - func NewRepoStatusWindow(path string) (error, *RepoStatus) { path, realpath, goSrcDir, isGoLang, err := guessPaths(path) if err != nil { |
