From 49bc1043627d022fd17fa728e4819bf4a3d38157 Mon Sep 17 00:00:00 2001 From: rhysd Date: Tue, 26 Dec 2017 12:02:00 +0900 Subject: [PATCH] automatically detect version prefix (and omit it) --- selfupdate/detect.go | 28 +++++++++++++++++----------- selfupdate/detect_test.go | 12 ++++++------ 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/selfupdate/detect.go b/selfupdate/detect.go index f3bbb65..b31f4dd 100644 --- a/selfupdate/detect.go +++ b/selfupdate/detect.go @@ -8,18 +8,20 @@ import ( "golang.org/x/oauth2" "net/http" "os" + "regexp" "strings" ) +var reVersion = regexp.MustCompile(`\d+\.\d+\.\d+`) + // ReleaseDetector is responsible for detecting the latest release using GitHub Releases API. type ReleaseDetector struct { - verPrefix string - api *github.Client - apiCtx context.Context + api *github.Client + apiCtx context.Context } // NewDetector crates a new detector instance. It initializes GitHub API client. -func NewDetector(versionPrefix string) *ReleaseDetector { +func NewDetector() *ReleaseDetector { token := os.Getenv("GITHUB_TOKEN") ctx := context.Background() @@ -30,7 +32,7 @@ func NewDetector(versionPrefix string) *ReleaseDetector { } 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. @@ -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]) if err != nil { + log.Println("API returned an error response:", err) if res.StatusCode == 404 { // 404 means repository not found or release not found. It's not an error here. found = false err = nil log.Println("API returned 404. Repository or release not found") - } else { - log.Println("API returned an error:", err) } return } @@ -57,7 +58,12 @@ func (d *ReleaseDetector) DetectLatest(slug string) (ver semver.Version, found b tag := rel.GetTagName() 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 { found = true } @@ -65,7 +71,7 @@ func (d *ReleaseDetector) DetectLatest(slug string) (ver semver.Version, found b 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'). -func DetectLatest(slug, verPrefix string) (semver.Version, bool, error) { - return NewDetector(verPrefix).DetectLatest(slug) +// DetectLatest detects the latest release of the slug (owner/repo). +func DetectLatest(slug string) (semver.Version, bool, error) { + return NewDetector().DetectLatest(slug) } diff --git a/selfupdate/detect_test.go b/selfupdate/detect_test.go index 7860433..699f864 100644 --- a/selfupdate/detect_test.go +++ b/selfupdate/detect_test.go @@ -11,11 +11,11 @@ func TestGitHubTokenEnv(t *testing.T) { if token == "" { t.Skip("because $GITHUB_TOKEN is not set") } - _ = NewDetector("") + _ = NewDetector() } -func TestDetectRelease(t *testing.T) { - v, ok, err := DetectLatest("rhysd/github-clone-all", "v") +func TestDetectReleaseWithVersionPrefix(t *testing.T) { + v, ok, err := DetectLatest("rhysd/github-clone-all") if err != nil { t.Fatal("Fetch failed:", err) } @@ -28,7 +28,7 @@ func TestDetectRelease(t *testing.T) { } func TestInvalidSlug(t *testing.T) { - d := NewDetector("v") + d := NewDetector() for _, slug := range []string{ "foo", @@ -45,7 +45,7 @@ func TestInvalidSlug(t *testing.T) { } func TestNonExistingRepo(t *testing.T) { - d := NewDetector("") + d := NewDetector() v, ok, err := d.DetectLatest("rhysd/non-existing-repo") if err != nil { 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) { - d := NewDetector("") + d := NewDetector() _, ok, err := d.DetectLatest("rhysd/misc") if err != nil { t.Fatal("Repo having no release should not cause an error:", err)