gomod/gomod.go

143 lines
3.3 KiB
Go
Raw Normal View History

2023-05-24 15:37:48 +00:00
package gomod
import (
2023-06-07 15:58:59 +00:00
"context"
2023-05-24 15:37:48 +00:00
"fmt"
"os"
"os/exec"
2023-06-07 15:58:59 +00:00
"regexp"
"strings"
2023-05-24 15:37:48 +00:00
2023-06-07 15:58:59 +00:00
"github.com/google/go-github/v53/github"
2023-07-22 08:00:31 +00:00
"github.com/sirupsen/logrus"
2023-05-24 15:37:48 +00:00
"golang.org/x/mod/modfile"
)
2023-07-22 08:00:31 +00:00
const (
defaultVersion = "latest"
)
2023-10-13 14:07:39 +00:00
var (
githubRegexp = regexp.MustCompile(`github.com/(.*?)/(.*)`)
genericWhitelist = []string{
"google.golang.org",
}
)
2023-06-07 15:58:59 +00:00
2023-07-22 08:00:31 +00:00
func upgrade(url string) (newUrl string, err error) {
var version = defaultVersion
if strings.Contains(url, "github.com") {
commitID, err := getCommitID(url)
if err != nil {
logrus.WithField("url", url).Warnf("get github commit id failed, use default version: %v", err)
} else {
version = commitID
}
}
2023-10-13 14:07:39 +00:00
if version == defaultVersion && !ElemIn(genericWhitelist, url) {
2023-07-22 08:00:31 +00:00
v, err := lsRemote.setUrl(url).getLatestTagOrCommitID()
if err != nil {
logrus.WithField("url", url).Warnf("get git ls-remote info failed, use default version: %v", err)
} else {
version = v
}
}
versionUrl := url + "@" + version
cmd := exec.Command("go", "get", "-u", versionUrl)
2023-05-24 15:37:48 +00:00
if _, err := cmd.CombinedOutput(); err != nil {
2023-07-22 08:00:31 +00:00
return "", err
2023-05-24 15:37:48 +00:00
}
2023-07-22 08:00:31 +00:00
return versionUrl, nil
2023-05-24 15:37:48 +00:00
}
func AllModUpgrade() {
modFileData, err := os.ReadFile("go.mod")
if err != nil {
2023-06-11 10:46:51 +00:00
logrus.Errorf("read go.mod file failed: %v", err)
2023-05-24 15:37:48 +00:00
return
}
modFile, err := modfile.Parse("go.mod", modFileData, nil)
if err != nil {
2023-06-11 10:46:51 +00:00
logrus.Errorf("parse go.mod file failed: %v", err)
2023-05-24 15:37:48 +00:00
return
}
for _, mod := range modFile.Require {
2023-06-07 15:58:59 +00:00
if mod.Indirect {
continue
}
2023-07-22 08:35:59 +00:00
versionUrl, err := upgrade(mod.Mod.Path)
2023-07-22 08:00:31 +00:00
if err != nil {
2023-07-22 08:35:59 +00:00
logrus.WithField("url", mod.Mod.Path).Errorf("upgrade failed: %v", err)
2023-05-24 15:37:48 +00:00
continue
}
2023-07-22 08:00:31 +00:00
logrus.WithField("url", versionUrl).Infof("upgrade success")
2023-05-24 15:37:48 +00:00
}
2023-10-13 14:07:39 +00:00
tidy()
2023-05-24 15:37:48 +00:00
}
func SingleModUpgrade(url string) {
2023-07-22 08:00:31 +00:00
versionUrl, err := upgrade(url)
if err != nil {
logrus.WithField("url", url).Errorf("upgrade failed: %v", err)
2023-05-24 15:37:48 +00:00
return
}
2023-07-22 08:00:31 +00:00
logrus.WithField("url", versionUrl).Infof("upgrade success")
2023-10-13 14:07:39 +00:00
tidy()
2023-06-07 15:58:59 +00:00
}
func parseUrl(url string) (owner, repo string) {
res := githubRegexp.FindAllStringSubmatch(url, -1)
if len(res) != 1 {
2023-06-11 10:46:51 +00:00
logrus.Panicf(fmt.Sprintf("%s url no match github url rule: %s", url, githubRegexp.String()))
2023-06-07 15:58:59 +00:00
}
if len(res[0]) != 3 {
2023-06-11 10:46:51 +00:00
logrus.Panicf(fmt.Sprintf("%s url no match github url rule: %s", url, githubRegexp.String()))
2023-06-07 15:58:59 +00:00
}
2023-07-22 08:35:59 +00:00
owner = res[0][1]
repo = res[0][2]
if repoA := strings.Split(repo, "/"); len(repoA) > 1 {
repo = repoA[0]
}
return owner, repo
2023-06-07 15:58:59 +00:00
}
func getCommitID(url string) (string, error) {
owner, repo := parseUrl(url)
client := github.NewClient(nil)
ctx := context.Background()
tags, _, err := client.Repositories.ListTags(ctx, owner, repo, &github.ListOptions{
Page: 0,
PerPage: 1,
})
2023-07-22 08:00:31 +00:00
if err != nil {
logrus.WithField("url", url).Warnf("get tag info failed: %v, start get commit id", err)
}
if len(tags) != 0 {
return tags[0].GetName(), nil
2023-06-07 15:58:59 +00:00
}
2023-07-22 08:00:31 +00:00
// get latest commit id
2023-06-07 15:58:59 +00:00
commits, _, err := client.Repositories.ListCommits(ctx, owner, repo, &github.CommitsListOptions{
ListOptions: github.ListOptions{
Page: 0,
PerPage: 1,
},
})
if err != nil {
2023-07-22 08:00:31 +00:00
logrus.WithField("url", url).Errorf("get latest commit failed: %v", err)
2023-06-07 15:58:59 +00:00
return "", err
}
if len(commits) == 0 {
return "", fmt.Errorf("get commit info empty")
}
return *commits[0].SHA, nil
2023-05-24 15:37:48 +00:00
}
2023-10-13 14:07:39 +00:00
func tidy() {
cmd := exec.Command("go", "mod", "tidy")
_ = cmd.Run()
}