summaryrefslogtreecommitdiff
path: root/goSrcFind.go
blob: ba77a338384ae14480bf643501d91e08811ad7dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package fhelp

// returns whatever your golang source dir is
// If there is a go.work file in your parent, that directory will be returned
// otherwise, return ~/go/src

import (
	"fmt"
	"os"
	"path/filepath"

	"go.wit.com/log"
)

// look for a go.work file
// otherwise use ~/go/src
func findGoSrc() (string, error) {
	pwd, err := os.Getwd()
	// startpwd, _ := os.Getwd()
	if err == nil {
		// Check for go.work in the current directory and then move up until root
		if pwd, err := digup(pwd); err == nil {
			// found an existing go.work file
			// os.Chdir(pwd)
			return pwd, nil
		} else {
			// if there is an error looking for the go.work file
			// default to using ~/go/src
			// log.Info("forge.digup() err", pwd, err)
		}
	} else {
		// this shouldn't really happen. maybe your working directory got deleted
		log.Info("forge.findGoSrc() os.Getwd() was probably deleted", pwd, err)
	}

	// there are no go.work files, resume the ~/go/src behavior from prior to golang 1.22
	pwd, err = useGoSrc()
	return pwd, err
}

// this is the 'old way" and works fine for me. I use it because I like the ~/go/src directory
// because I know exactly what is in it: GO stuff & nothing else
func useGoSrc() (string, error) {
	homeDir, err := os.UserHomeDir()
	if err != nil {
		return "", err
	}
	pwd := filepath.Join(homeDir, "go/src")
	err = os.MkdirAll(pwd, os.ModePerm)
	return pwd, err
}

func goWorkExists(dir string) bool {
	var err error
	workFilePath := filepath.Join(dir, "go.work")
	if _, err = os.Stat(workFilePath); err == nil {
		// log.Info("f.goWorkExists() found", workFilePath)
		return true
	} else if !os.IsNotExist(err) {
		// log.Info("f.goWorkExists() missing", workFilePath)
		return false
	}
	// probably false, but some other error
	// log.Info("f.goWorkExists() os.Stat() error", err, workFilePath)
	return false
}

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")
}