Skip to content

Commit

Permalink
bugfix: get latest tag doesn't require git credentials (#251)
Browse files Browse the repository at this point in the history
  • Loading branch information
howieyuen committed Feb 22, 2023
1 parent c98f4e3 commit 6028ea2
Show file tree
Hide file tree
Showing 5 changed files with 95 additions and 110 deletions.
3 changes: 2 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ require (
github.com/gonvenience/text v1.0.5
github.com/gonvenience/wrap v1.1.0
github.com/gonvenience/ytbx v1.3.0
github.com/google/go-cmp v0.5.8
github.com/google/go-cmp v0.5.9
github.com/google/go-github/v50 v50.0.0
github.com/gookit/goutil v0.5.1
github.com/gosuri/uilive v0.0.4
github.com/hashicorp/errwrap v1.0.0
Expand Down
5 changes: 4 additions & 1 deletion go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -456,8 +456,11 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-github/v50 v50.0.0 h1:gdO1AeuSZZK4iYWwVbjni7zg8PIQhp7QfmPunr016Jk=
github.com/google/go-github/v50 v50.0.0/go.mod h1:Ev4Tre8QoKiolvbpOSG3FIi4Mlon3S2Nt9W5JYqKiwA=
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
Expand Down
8 changes: 4 additions & 4 deletions pkg/cmd/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ func NewKusionctlCmd(in io.Reader, out, err io.Writer) *cobra.Command {
func checkForUpdate() string {
curVer, err := semver.ParseTolerant(versionInfo.ReleaseVersion())
if err != nil {
log.Infof("error parsing current version: %s", err)
log.Errorf("error parsing current version: %s", err)
}

// We don't care about warning for you to update if you have installed a developer version
Expand All @@ -160,7 +160,7 @@ func checkForUpdate() string {

latestVer, err := getLatestVersionInfo()
if err != nil {
log.Infof("error fetching latest version information: %v", err)
log.Errorf("error fetching latest version information: %v", err)
}

if latestVer.GT(curVer) {
Expand Down Expand Up @@ -202,7 +202,7 @@ func getLatestVersionInfo() (semver.Version, error) {
}

if err = cacheVersionInfo(latest); err != nil {
log.Infof("failed to cache version info: %s", err)
log.Errorf("failed to cache version info: %s", err)
}

return latest, nil
Expand Down Expand Up @@ -279,7 +279,7 @@ func getUpgradeCommand() string {

isKusionup, err := isKusionUpInstall(exe)
if err != nil {
log.Infof("error determining if the running executable was installed with kusionup: %s", err)
log.Errorf("error determining if the running executable was installed with kusionup: %s", err)
}
if isKusionup {
return "$ kusionup install"
Expand Down
124 changes: 57 additions & 67 deletions pkg/util/gitutil/gitutil.go
Original file line number Diff line number Diff line change
@@ -1,56 +1,56 @@
package gitutil

import (
"context"
"errors"
"os/exec"
"strings"

"github.com/blang/semver/v4"
"github.com/google/go-github/v50/github"
)

// https://git-scm.com/docs/git-tag
// https://github.com/vivin/better-setuptools-git-version/blob/master/better_setuptools_git_version.py

var ErrEmptyGitTag = errors.New("empty tag")

// get remote url
func GetRemoteURL() (string, error) {
stdout, err := exec.Command(
"git", "config", "--get", "remote.origin.url",
).CombinedOutput()
if err != nil {
return "", err
}
return strings.TrimSpace(string(stdout)), nil
}
const (
Owner = "KusionStack"
Repo = "kusion"
)

func GetLatestTag() (string, error) {
tag, err := GetLatestTagFromLocal()
tag, err := getLatestTagFromLocal()
if tag == "" || err != nil {
return GetLatestTagFromRemote()
return getLatestTagFromRemote()
}
return tag, nil
}

// get latest tag from remote,
// the fitting git clone depth is 1
func GetLatestTagFromRemote() (tag string, err error) {
// get remote url
remoteURL, err := GetRemoteURL()
// getLatestTagFromRemote the fitting git clone depth is 1
func getLatestTagFromRemote() (string, error) {
tags, err := getTagListFromRemote(Owner, Repo)
if err != nil {
return "", err
}

// get latest tag from remote
return tags[0], nil
}

// get remote url
func getRemoteURL() (string, error) {
stdout, err := exec.Command(
`bash`, `-c`, `git ls-remote --tags --sort=v:refname `+remoteURL+` | tail -n1 | sed 's/.*\///; s/\^{}//'`,
"git", "config", "--get", "remote.origin.url",
).CombinedOutput()
if err != nil {
return "", err
}
return strings.TrimSpace(string(stdout)), nil
}

func GetLatestTagFromLocal() (tag string, err error) {
tags, err := GetTagList()
func getLatestTagFromLocal() (tag string, err error) {
tags, err := getTagListFromLocal()
if err != nil {
return "", err
}
Expand All @@ -60,7 +60,7 @@ func GetLatestTagFromLocal() (tag string, err error) {
return strings.TrimSpace(tag), nil
}

func GetTagList() (tags []string, err error) {
func getTagListFromLocal() (tags []string, err error) {
// git tag --merged
stdout, err := exec.Command(
`git`, `describe`, `--abbrev=0`, `--tags`,
Expand All @@ -77,38 +77,28 @@ func GetTagList() (tags []string, err error) {
return
}

func GetTagListFromRemote(remoteURL string, reverse bool) (tags []string, err error) {
tmpTags := []string{}
// Get all tags from remote
stdout, err := exec.Command(
`bash`, `-c`, `git ls-remote --tags --sort=v:refname `+remoteURL+` | sed 's/.*\///; s/\^{}//'`,
).CombinedOutput()
func getTagListFromRemote(owner, repo string) (tags []string, err error) {
client := github.NewClient(nil)
rts, _, err := client.Repositories.ListTags(context.Background(), owner, repo, nil)
if err != nil {
return nil, err
}

for _, s := range strings.Split(strings.TrimSpace(string(stdout)), "\n") {
if s := strings.TrimSpace(s); s != "" {
tmpTags = append(tmpTags, s)
}
if len(rts) == 0 {
return nil, errors.New("no tag found")
}

// Reverse slice
if reverse {
for i, j := 0, len(tmpTags)-1; i < j; i, j = i+1, j-1 {
tmpTags[i], tmpTags[j] = tmpTags[j], tmpTags[i]
for _, rt := range rts {
v, err := semver.ParseTolerant(rt.GetName())
if err != nil {
continue
}
}

// Remove duplicates
tagSet := make(map[string]struct{})
for _, tag := range tmpTags {
if _, ok := tagSet[tag]; !ok {
tags = append(tags, tag)
tagSet[tag] = struct{}{}
if len(v.Pre) > 0 || len(v.Build) > 0 {
continue
}
tags = append(tags, rt.GetName())
}
return

return tags, nil
}

func GetHeadHash() (sha string, err error) {
Expand All @@ -135,19 +125,34 @@ func GetHeadHashShort() (sha string, err error) {
return
}

func GetTagCommitSha(tag string) (sha string, err error) {
func IsHeadAtTag(tag string) (bool, error) {
if tag == "" {
return false, ErrEmptyGitTag
}
sha1, err1 := getTagCommitSha(tag)
if err1 != nil {
return false, err1
}
sha2, err2 := GetHeadHash()
if err2 != nil {
return false, err2
}
return sha1 == sha2, nil
}

func getTagCommitSha(tag string) (sha string, err error) {
if tag == "" {
return "", ErrEmptyGitTag
}

sha, err = GetTagCommitShaFromLocal(tag)
sha, err = getTagCommitShaFromLocal(tag)
if sha == "" || err != nil {
return GetTagCommitShaFromRemote(tag)
return getTagCommitShaFromRemote(tag)
}
return
}

func GetTagCommitShaFromLocal(tag string) (sha string, err error) {
func getTagCommitShaFromLocal(tag string) (sha string, err error) {
// git rev-list -n 1 {tag}
stdout, err := exec.Command(
`git`, `rev-list`, `-n`, `1`, tag,
Expand All @@ -169,9 +174,9 @@ func GetTagCommitShaFromLocal(tag string) (sha string, err error) {

// get tag commit sha from remote,
// the fitting git clone depth is 1
func GetTagCommitShaFromRemote(_ string) (string, error) {
func getTagCommitShaFromRemote(_ string) (string, error) {
// get remote url
remoteURL, err := GetRemoteURL()
remoteURL, err := getRemoteURL()
if err != nil {
return "", err
}
Expand All @@ -186,21 +191,6 @@ func GetTagCommitShaFromRemote(_ string) (string, error) {
return strings.TrimSpace(string(stdout)), nil
}

func IsHeadAtTag(tag string) (bool, error) {
if tag == "" {
return false, ErrEmptyGitTag
}
sha1, err1 := GetTagCommitSha(tag)
if err1 != nil {
return false, err1
}
sha2, err2 := GetHeadHash()
if err2 != nil {
return false, err2
}
return sha1 == sha2, nil
}

func IsDirty() (dirty bool, err error) {
// git status -s
stdout, err := exec.Command(
Expand Down
Loading

0 comments on commit 6028ea2

Please sign in to comment.