mirror of
https://github.com/MedzikUser/go-github-selfupdate.git
synced 2024-08-15 03:25:29 +00:00
automatically detect version prefix (and omit it)
This commit is contained in:
parent
f0345e54e2
commit
49bc104362
2 changed files with 23 additions and 17 deletions
|
@ -8,18 +8,20 @@ import (
|
||||||
"golang.org/x/oauth2"
|
"golang.org/x/oauth2"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var reVersion = regexp.MustCompile(`\d+\.\d+\.\d+`)
|
||||||
|
|
||||||
// ReleaseDetector is responsible for detecting the latest release using GitHub Releases API.
|
// ReleaseDetector is responsible for detecting the latest release using GitHub Releases API.
|
||||||
type ReleaseDetector struct {
|
type ReleaseDetector struct {
|
||||||
verPrefix string
|
api *github.Client
|
||||||
api *github.Client
|
apiCtx context.Context
|
||||||
apiCtx context.Context
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewDetector crates a new detector instance. It initializes GitHub API client.
|
// NewDetector crates a new detector instance. It initializes GitHub API client.
|
||||||
func NewDetector(versionPrefix string) *ReleaseDetector {
|
func NewDetector() *ReleaseDetector {
|
||||||
token := os.Getenv("GITHUB_TOKEN")
|
token := os.Getenv("GITHUB_TOKEN")
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
|
@ -30,7 +32,7 @@ func NewDetector(versionPrefix string) *ReleaseDetector {
|
||||||
}
|
}
|
||||||
|
|
||||||
client := github.NewClient(auth)
|
client := github.NewClient(auth)
|
||||||
return &ReleaseDetector{versionPrefix, client, ctx}
|
return &ReleaseDetector{client, ctx}
|
||||||
}
|
}
|
||||||
|
|
||||||
// DetectLatest tries to get the latest version of the repository on GitHub. 'slug' means 'owner/name' formatted string.
|
// DetectLatest tries to get the latest version of the repository on GitHub. 'slug' means 'owner/name' formatted string.
|
||||||
|
@ -43,13 +45,12 @@ func (d *ReleaseDetector) DetectLatest(slug string) (ver semver.Version, found b
|
||||||
|
|
||||||
rel, res, err := d.api.Repositories.GetLatestRelease(d.apiCtx, repo[0], repo[1])
|
rel, res, err := d.api.Repositories.GetLatestRelease(d.apiCtx, repo[0], repo[1])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
log.Println("API returned an error response:", err)
|
||||||
if res.StatusCode == 404 {
|
if res.StatusCode == 404 {
|
||||||
// 404 means repository not found or release not found. It's not an error here.
|
// 404 means repository not found or release not found. It's not an error here.
|
||||||
found = false
|
found = false
|
||||||
err = nil
|
err = nil
|
||||||
log.Println("API returned 404. Repository or release not found")
|
log.Println("API returned 404. Repository or release not found")
|
||||||
} else {
|
|
||||||
log.Println("API returned an error:", err)
|
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -57,7 +58,12 @@ func (d *ReleaseDetector) DetectLatest(slug string) (ver semver.Version, found b
|
||||||
tag := rel.GetTagName()
|
tag := rel.GetTagName()
|
||||||
log.Println("Successfully fetched the latest release. tag:", tag, ", name:", rel.GetName(), ", URL:", rel.GetURL())
|
log.Println("Successfully fetched the latest release. tag:", tag, ", name:", rel.GetName(), ", URL:", rel.GetURL())
|
||||||
|
|
||||||
ver, err = semver.Make(strings.TrimPrefix(tag, d.verPrefix))
|
// Strip version prefix
|
||||||
|
if indices := reVersion.FindStringIndex(tag); indices != nil && indices[0] > 0 {
|
||||||
|
tag = tag[indices[0]:]
|
||||||
|
}
|
||||||
|
|
||||||
|
ver, err = semver.Make(tag)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
found = true
|
found = true
|
||||||
}
|
}
|
||||||
|
@ -65,7 +71,7 @@ func (d *ReleaseDetector) DetectLatest(slug string) (ver semver.Version, found b
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// DetectLatest detects the latest release of the slug (owner/repo). verPrefix is a prefix of version in tag name (i.e. 'v' for 'v1.2.3').
|
// DetectLatest detects the latest release of the slug (owner/repo).
|
||||||
func DetectLatest(slug, verPrefix string) (semver.Version, bool, error) {
|
func DetectLatest(slug string) (semver.Version, bool, error) {
|
||||||
return NewDetector(verPrefix).DetectLatest(slug)
|
return NewDetector().DetectLatest(slug)
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,11 +11,11 @@ func TestGitHubTokenEnv(t *testing.T) {
|
||||||
if token == "" {
|
if token == "" {
|
||||||
t.Skip("because $GITHUB_TOKEN is not set")
|
t.Skip("because $GITHUB_TOKEN is not set")
|
||||||
}
|
}
|
||||||
_ = NewDetector("")
|
_ = NewDetector()
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDetectRelease(t *testing.T) {
|
func TestDetectReleaseWithVersionPrefix(t *testing.T) {
|
||||||
v, ok, err := DetectLatest("rhysd/github-clone-all", "v")
|
v, ok, err := DetectLatest("rhysd/github-clone-all")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal("Fetch failed:", err)
|
t.Fatal("Fetch failed:", err)
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,7 @@ func TestDetectRelease(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestInvalidSlug(t *testing.T) {
|
func TestInvalidSlug(t *testing.T) {
|
||||||
d := NewDetector("v")
|
d := NewDetector()
|
||||||
|
|
||||||
for _, slug := range []string{
|
for _, slug := range []string{
|
||||||
"foo",
|
"foo",
|
||||||
|
@ -45,7 +45,7 @@ func TestInvalidSlug(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestNonExistingRepo(t *testing.T) {
|
func TestNonExistingRepo(t *testing.T) {
|
||||||
d := NewDetector("")
|
d := NewDetector()
|
||||||
v, ok, err := d.DetectLatest("rhysd/non-existing-repo")
|
v, ok, err := d.DetectLatest("rhysd/non-existing-repo")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal("Non-existing repo should not cause an error:", v)
|
t.Fatal("Non-existing repo should not cause an error:", v)
|
||||||
|
@ -56,7 +56,7 @@ func TestNonExistingRepo(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestNoReleaseFound(t *testing.T) {
|
func TestNoReleaseFound(t *testing.T) {
|
||||||
d := NewDetector("")
|
d := NewDetector()
|
||||||
_, ok, err := d.DetectLatest("rhysd/misc")
|
_, ok, err := d.DetectLatest("rhysd/misc")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal("Repo having no release should not cause an error:", err)
|
t.Fatal("Repo having no release should not cause an error:", err)
|
||||||
|
|
Loading…
Reference in a new issue