91 lines
2.3 KiB
Go
91 lines
2.3 KiB
Go
package main
|
|
|
|
// recreates the go.mod and go.sum files
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/go-cmd/cmd"
|
|
"go.wit.com/lib/protobuf/gitpb"
|
|
"go.wit.com/log"
|
|
)
|
|
|
|
// remove every go.mod and go.sum
|
|
// testing to see where this stuff is coming from
|
|
func eraseGoMod(repo *gitpb.Repo) {
|
|
// unset the go development ENV var to generate release files
|
|
if err := repo.StrictRun([]string{"rm", "-f", "go.mod", "go.sum"}); err != nil {
|
|
log.Warn(repo.GetGoPath(), "rm go.mod go.sum failed", err)
|
|
}
|
|
}
|
|
|
|
// sets the required golang version in go.mod
|
|
func setGoVersion(repo *gitpb.Repo, version string) error {
|
|
if err := repo.StrictRun([]string{"go", "mod", "edit", "-go=" + version}); err != nil {
|
|
log.Warn(repo.GetGoPath(), "go mod edit failed", err)
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func goTidy(fullpath string) (cmd.Status, error) {
|
|
if result, err := runVerbose(fullpath, []string{"go", "mod", "tidy", "-go=" + golangVersion}); err == nil {
|
|
return result, nil
|
|
} else {
|
|
return result, err
|
|
}
|
|
}
|
|
|
|
// wrapper around 'go mod init' and 'go mod tidy'
|
|
func redoGoMod(repo *gitpb.Repo) error {
|
|
// unset the go development ENV var to generate release files
|
|
os.Unsetenv("GO111MODULE")
|
|
if err := repo.StrictRun([]string{"rm", "-f", "go.mod", "go.sum"}); err != nil {
|
|
log.Warn("rm go.mod go.sum failed", err)
|
|
return err
|
|
}
|
|
if err := repo.StrictRun([]string{"go", "mod", "init", repo.GetGoPath()}); err != nil {
|
|
log.Warn("go mod init failed", err)
|
|
return err
|
|
}
|
|
|
|
if result, err := goTidy(repo.FullPath); err != nil {
|
|
if tinyFixer(result) {
|
|
if _, err := goTidy(repo.FullPath); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
|
|
// most things should build with golang after 1.21 // todo: allow this to be set somewhere
|
|
if err := setGoVersion(repo, golangVersion); err != nil {
|
|
log.Warn(repo.GetGoPath(), "go mod edit failed", err)
|
|
return err
|
|
}
|
|
|
|
// parse the go.mod and go.sum files
|
|
if repo.ParseGoSum() {
|
|
return nil
|
|
}
|
|
|
|
return fmt.Errorf("check.ParseGoSum() failed")
|
|
}
|
|
|
|
func tinyFixer(result cmd.Status) bool {
|
|
for _, line := range result.Stdout {
|
|
if strings.Contains(line, "requires go@") {
|
|
log.Info("tinyFixer:", line)
|
|
parts := strings.Split(line, "requires go@")
|
|
if len(parts) == 2 {
|
|
parts = strings.Split(parts[1], ",")
|
|
golangVersion = parts[0]
|
|
return true
|
|
}
|
|
log.Info("tinyFixer:", line, "golangVersion", golangVersion)
|
|
}
|
|
}
|
|
return false
|
|
}
|