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