summaryrefslogtreecommitdiff
path: root/goDep.redoGoMod.go
blob: 81e861fe013e679b008f6a64ea58ecabf4be6d3e (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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package gitpb

// does processing on the go.mod and go.sum files

import (
	"bufio"
	"errors"
	"os"
	"path/filepath"
	"strings"

	"go.wit.com/log"
)

// poor name perhaps. It's because in most of these
// repos you can also type "make redomod" to do the same thing
// since it's a Makefile task that is also useful to be able to run
// from the command line
func (repo *Repo) MakeRedomod() (bool, error) {
	// unset the go development ENV var to generate release files
	os.Unsetenv("GO111MODULE")
	if ok, err := repo.strictRun([]string{"rm", "-f", "go.mod", "go.sum"}); !ok {
		log.Warn("rm go.mod go.sum failed", err)
		return ok, err
	}
	if ok, err := repo.strictRun([]string{"go", "mod", "init", repo.GoPath}); !ok {
		log.Warn("go mod init failed", err)
		return ok, err
	}
	if ok, err := repo.strictRun([]string{"go", "mod", "tidy"}); !ok {
		log.Warn("go mod tidy failed", err)
		return ok, err
	}
	// most things should build with golang after 1.20
	// TODO: move this to autogenpb
	if ok, err := repo.strictRun([]string{"go", "mod", "edit", "-go=1.20"}); !ok {
		log.Warn("go mod edit failed", err)
		return ok, err
	}
	log.Info("MakeRedomod() worked", repo.GoPath)

	if repo.Exists("go.sum") {
		// return the attempt to parse go.mod & go.sum
		return repo.parseGoSum()
	}
	repo.GoDeps = nil
	repo.GoPrimitive = false

	ok, err := repo.isPrimativeGoMod()
	if err != nil {
		// this means this repo does not depend on any other package
		log.Info("PRIMATIVE repo error:", repo.GoPath, "err =", err)
		return false, err
	}
	if ok {
		// this means the repo is primitive so there is no go.sum
		repo.GoPrimitive = true
		return true, nil
	}
	// this should never happen
	return false, errors.New("MakeRedomod() logic failed")
}

// reads and parses the go.sum file
func (repo *Repo) parseGoSum() (bool, error) {
	// empty out what was there before
	repo.GoDeps = nil
	tmp := filepath.Join(repo.FullPath, "go.sum")
	gosum, err := os.Open(tmp)
	if err != nil {
		log.Warn("missing go.sum", repo.FullPath)
		return false, err
	}
	defer gosum.Close()

	scanner := bufio.NewScanner(gosum)
	log.Info("gosum:", tmp)
	for scanner.Scan() {
		line := strings.TrimSpace(scanner.Text())

		parts := strings.Split(line, " ")
		if len(parts) == 3 {
			godep := strings.TrimSpace(parts[0])
			version := strings.TrimSpace(parts[1])
			if strings.HasSuffix(version, "/go.mod") {
				version = strings.TrimSuffix(version, "/go.mod")
			}
			new1 := GoDep{
				GoPath:  godep,
				Version: version,
			}
			repo.GoDeps.AppendUniqueGoPath(&new1)
			/*
				found := repo.FindGoDepByPath(godep)
				if found == nil {
				currentversion, ok := deps[godep]
				if ok {
					// only use the first value found in the file?
					// this shouldn't have been possible. this function should
					// only be called from MakeRedomod()
					// todo: make go things a seperate package so this function
					// isn't exported?
					if version != currentversion {
						log.Warn("\tgo.sum ", godep, "had both", version, currentversion)
					}
				} else {
					deps[godep] = version
					log.Info("\t", godep, "=", version)
				}
			*/
		} else {
			// I've never seen this happen yet
			panic(errors.New("go.sum invalid: " + line))
			// return false, errors.New("go.sum invalid: " + line)
		}
	}

	if err := scanner.Err(); err != nil {
		repo.GoDeps = nil
		return false, err
	}
	return true, nil
}
func (repo *Repo) RepoType() string {
	os.Setenv("GO111MODULE", "off")
	cmd := []string{"go", "list", "-f", "'{{if eq .Name \"main\"}}binary{{else}}library{{end}}'"}
	// cmd := []string{"go", "list", "-f", "'{{.Name}}'"} // probably use this. this just prints out the package name
	// cmd := []string{"go", "list", "-f", "'{{.ImportPath}}'"} // returns go.wit.com/lib/protobuf/gitpb

	result := repo.RunQuiet(cmd)
	if result.Error != nil {
		log.Warn("go list binary detect failed", result.Error)
		return ""
	}
	output := strings.TrimSpace(strings.Join(result.Stdout, "\n"))
	output = strings.Trim(output, "'")
	return output
}