update
This commit is contained in:
parent
ec571e8c14
commit
8a2cf5e596
2
LICENSE
2
LICENSE
|
@ -1,6 +1,6 @@
|
||||||
the MIT License
|
the MIT License
|
||||||
|
|
||||||
Copyright (c) 2017 MedzikUser
|
Copyright (c) 2017 rhysd
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
|
@ -36,7 +36,7 @@ And small wrapper CLIs are provided:
|
||||||
- [detect-latest-release](./cmd/detect-latest-release): Detect the latest release of given GitHub repository from command line
|
- [detect-latest-release](./cmd/detect-latest-release): Detect the latest release of given GitHub repository from command line
|
||||||
- [go-get-release](./cmd/go-get-release): Like `go get`, but install a release binary from GitHub instead
|
- [go-get-release](./cmd/go-get-release): Like `go get`, but install a release binary from GitHub instead
|
||||||
|
|
||||||
[Slide at GoCon 2018 Spring (Japanese)](https://speakerdeck.com/MedzikUser/go-selfupdate-github-de-turuwozi-ji-atupudetosuru)
|
[Slide at GoCon 2018 Spring (Japanese)](https://speakerdeck.com/rhysd/go-selfupdate-github-de-turuwozi-ji-atupudetosuru)
|
||||||
|
|
||||||
[go-github-selfupdate]: https://github.com/MedzikUser/go-github-selfupdate
|
[go-github-selfupdate]: https://github.com/MedzikUser/go-github-selfupdate
|
||||||
[GitHub Releases API]: https://developer.github.com/v3/repos/releases/
|
[GitHub Releases API]: https://developer.github.com/v3/repos/releases/
|
||||||
|
@ -76,9 +76,9 @@ So running `-selfupdate` again only shows 'Current binary is the latest version'
|
||||||
|
|
||||||
Following tools are using this library.
|
Following tools are using this library.
|
||||||
|
|
||||||
- [dot-github](https://github.com/MedzikUser/dot-github)
|
- [dot-github](https://github.com/rhysd/dot-github)
|
||||||
- [dotfiles](https://github.com/MedzikUser/dotfiles)
|
- [dotfiles](https://github.com/rhysd/dotfiles)
|
||||||
- [github-clone-all](https://github.com/MedzikUser/github-clone-all)
|
- [github-clone-all](https://github.com/rhysd/github-clone-all)
|
||||||
- [pythonbrew](https://github.com/utahta/pythonbrew)
|
- [pythonbrew](https://github.com/utahta/pythonbrew)
|
||||||
- [akashic](https://github.com/cowlick/akashic)
|
- [akashic](https://github.com/cowlick/akashic)
|
||||||
- [butler](https://github.com/netzkern/butler)
|
- [butler](https://github.com/netzkern/butler)
|
||||||
|
|
|
@ -12,9 +12,9 @@ To know the usage, please try the command without any argument.
|
||||||
$ detect-latest-release
|
$ detect-latest-release
|
||||||
```
|
```
|
||||||
|
|
||||||
For example, following shows the latest version of [github-clone-all](https://github.com/MedzikUser/github-clone-all).
|
For example, following shows the latest version of [github-clone-all](https://github.com/rhysd/github-clone-all).
|
||||||
|
|
||||||
```
|
```
|
||||||
$ detect-latest-release MedzikUser/github-clone-all
|
$ detect-latest-release rhysd/github-clone-all
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@ func getCommand(pkg string) string {
|
||||||
_, cmd := filepath.Split(pkg)
|
_, cmd := filepath.Split(pkg)
|
||||||
if cmd == "" {
|
if cmd == "" {
|
||||||
// When pkg path is ending with path separator, we need to split it out.
|
// When pkg path is ending with path separator, we need to split it out.
|
||||||
// i.e. github.com/MedzikUser/foo/cmd/bar/
|
// i.e. github.com/rhysd/foo/cmd/bar/
|
||||||
_, cmd = filepath.Split(cmd)
|
_, cmd = filepath.Split(cmd)
|
||||||
}
|
}
|
||||||
return cmd
|
return cmd
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
{
|
|
||||||
"extends": [
|
|
||||||
"config:base"
|
|
||||||
],
|
|
||||||
"includeForks": true,
|
|
||||||
"prHourlyLimit": 0,
|
|
||||||
"automergeType": "pr",
|
|
||||||
"prCreation": "immediate",
|
|
||||||
"packageRules": [
|
|
||||||
{
|
|
||||||
"matchUpdateTypes": [
|
|
||||||
"minor",
|
|
||||||
"patch",
|
|
||||||
"pin",
|
|
||||||
"digest"
|
|
||||||
],
|
|
||||||
"automerge": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
|
@ -12,7 +12,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestDetectReleaseWithVersionPrefix(t *testing.T) {
|
func TestDetectReleaseWithVersionPrefix(t *testing.T) {
|
||||||
r, ok, err := DetectLatest("MedzikUser/github-clone-all")
|
r, ok, err := DetectLatest("rhysd/github-clone-all")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal("Fetch failed:", err)
|
t.Fatal("Fetch failed:", err)
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,7 @@ func TestDetectReleaseWithVersionPrefix(t *testing.T) {
|
||||||
if r.PublishedAt.IsZero() {
|
if r.PublishedAt.IsZero() {
|
||||||
t.Error("Release time is unexpectedly zero")
|
t.Error("Release time is unexpectedly zero")
|
||||||
}
|
}
|
||||||
if r.RepoOwner != "MedzikUser" {
|
if r.RepoOwner != "rhysd" {
|
||||||
t.Error("Repo owner is not correct:", r.RepoOwner)
|
t.Error("Repo owner is not correct:", r.RepoOwner)
|
||||||
}
|
}
|
||||||
if r.RepoName != "github-clone-all" {
|
if r.RepoName != "github-clone-all" {
|
||||||
|
@ -56,7 +56,7 @@ func TestDetectReleaseWithVersionPrefix(t *testing.T) {
|
||||||
|
|
||||||
func TestDetectVersionExisting(t *testing.T) {
|
func TestDetectVersionExisting(t *testing.T) {
|
||||||
testVersion := "v2.2.0"
|
testVersion := "v2.2.0"
|
||||||
r, ok, err := DetectVersion("MedzikUser/github-clone-all", testVersion)
|
r, ok, err := DetectVersion("rhysd/github-clone-all", testVersion)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal("Fetch failed:", err)
|
t.Fatal("Fetch failed:", err)
|
||||||
}
|
}
|
||||||
|
@ -69,7 +69,7 @@ func TestDetectVersionExisting(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDetectVersionNotExisting(t *testing.T) {
|
func TestDetectVersionNotExisting(t *testing.T) {
|
||||||
r, ok, err := DetectVersion("MedzikUser/github-clone-all", "foobar")
|
r, ok, err := DetectVersion("rhysd/github-clone-all", "foobar")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal("Fetch failed:", err)
|
t.Fatal("Fetch failed:", err)
|
||||||
}
|
}
|
||||||
|
@ -86,11 +86,11 @@ func TestDetectReleasesForVariousArchives(t *testing.T) {
|
||||||
slug string
|
slug string
|
||||||
prefix string
|
prefix string
|
||||||
}{
|
}{
|
||||||
{"MedzikUser-test/test-release-zip", "v"},
|
{"rhysd-test/test-release-zip", "v"},
|
||||||
{"MedzikUser-test/test-release-tar", "v"},
|
{"rhysd-test/test-release-tar", "v"},
|
||||||
{"MedzikUser-test/test-release-gzip", "v"},
|
{"rhysd-test/test-release-gzip", "v"},
|
||||||
{"MedzikUser-test/test-release-xz", "release-v"},
|
{"rhysd-test/test-release-xz", "release-v"},
|
||||||
{"MedzikUser-test/test-release-tar-xz", "release-"},
|
{"rhysd-test/test-release-tar-xz", "release-"},
|
||||||
} {
|
} {
|
||||||
t.Run(tc.slug, func(t *testing.T) {
|
t.Run(tc.slug, func(t *testing.T) {
|
||||||
r, ok, err := DetectLatest(tc.slug)
|
r, ok, err := DetectLatest(tc.slug)
|
||||||
|
@ -128,8 +128,8 @@ func TestDetectReleasesForVariousArchives(t *testing.T) {
|
||||||
if r.PublishedAt.IsZero() {
|
if r.PublishedAt.IsZero() {
|
||||||
t.Error("Release time is unexpectedly zero")
|
t.Error("Release time is unexpectedly zero")
|
||||||
}
|
}
|
||||||
if r.RepoOwner != "MedzikUser-test" {
|
if r.RepoOwner != "rhysd-test" {
|
||||||
t.Error("Repo owner should be MedzikUser-test:", r.RepoOwner)
|
t.Error("Repo owner should be rhysd-test:", r.RepoOwner)
|
||||||
}
|
}
|
||||||
if !strings.HasPrefix(r.RepoName, "test-release-") {
|
if !strings.HasPrefix(r.RepoName, "test-release-") {
|
||||||
t.Error("Repo name was not properly detectd:", r.RepoName)
|
t.Error("Repo name was not properly detectd:", r.RepoName)
|
||||||
|
@ -139,7 +139,7 @@ func TestDetectReleasesForVariousArchives(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDetectReleaseButNoAsset(t *testing.T) {
|
func TestDetectReleaseButNoAsset(t *testing.T) {
|
||||||
_, ok, err := DetectLatest("MedzikUser/clever-f.vim")
|
_, ok, err := DetectLatest("rhysd/clever-f.vim")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal("Fetch failed:", err)
|
t.Fatal("Fetch failed:", err)
|
||||||
}
|
}
|
||||||
|
@ -149,7 +149,7 @@ func TestDetectReleaseButNoAsset(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDetectNoRelease(t *testing.T) {
|
func TestDetectNoRelease(t *testing.T) {
|
||||||
_, ok, err := DetectLatest("MedzikUser/clever-f.vim")
|
_, ok, err := DetectLatest("rhysd/clever-f.vim")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal("Fetch failed:", err)
|
t.Fatal("Fetch failed:", err)
|
||||||
}
|
}
|
||||||
|
@ -179,7 +179,7 @@ func TestInvalidSlug(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestNonExistingRepo(t *testing.T) {
|
func TestNonExistingRepo(t *testing.T) {
|
||||||
v, ok, err := DetectLatest("MedzikUser/non-existing-repo")
|
v, ok, err := 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)
|
||||||
}
|
}
|
||||||
|
@ -189,7 +189,7 @@ func TestNonExistingRepo(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestNoReleaseFound(t *testing.T) {
|
func TestNoReleaseFound(t *testing.T) {
|
||||||
_, ok, err := DetectLatest("MedzikUser/misc")
|
_, ok, err := 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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,12 +51,12 @@ func TestUpdateCommand(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, slug := range []string{
|
for _, slug := range []string{
|
||||||
"MedzikUser-test/test-release-zip",
|
"rhysd-test/test-release-zip",
|
||||||
"MedzikUser-test/test-release-tar",
|
"rhysd-test/test-release-tar",
|
||||||
"MedzikUser-test/test-release-gzip",
|
"rhysd-test/test-release-gzip",
|
||||||
"MedzikUser-test/test-release-tar-xz",
|
"rhysd-test/test-release-tar-xz",
|
||||||
"MedzikUser-test/test-release-xz",
|
"rhysd-test/test-release-xz",
|
||||||
"MedzikUser-test/test-release-contain-version",
|
"rhysd-test/test-release-contain-version",
|
||||||
} {
|
} {
|
||||||
t.Run(slug, func(t *testing.T) {
|
t.Run(slug, func(t *testing.T) {
|
||||||
setupTestBinary()
|
setupTestBinary()
|
||||||
|
@ -88,7 +88,7 @@ func TestUpdateWithDifferentBinaryName(t *testing.T) {
|
||||||
latest := semver.MustParse("1.2.3")
|
latest := semver.MustParse("1.2.3")
|
||||||
prev := semver.MustParse("1.2.2")
|
prev := semver.MustParse("1.2.2")
|
||||||
|
|
||||||
_, err := UpdateCommand("gh-release-test", prev, "MedzikUser-test/test-release-zip")
|
_, err := UpdateCommand("gh-release-test", prev, "rhysd-test/test-release-zip")
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Fatal("Error should occur for broken package")
|
t.Fatal("Error should occur for broken package")
|
||||||
}
|
}
|
||||||
|
@ -100,7 +100,7 @@ func TestUpdateWithDifferentBinaryName(t *testing.T) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
rel, err := up.UpdateCommand("gh-release-test", prev, "MedzikUser-test/test-release-zip")
|
rel, err := up.UpdateCommand("gh-release-test", prev, "rhysd-test/test-release-zip")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -140,7 +140,7 @@ func TestUpdateViaSymlink(t *testing.T) {
|
||||||
|
|
||||||
latest := semver.MustParse("1.2.3")
|
latest := semver.MustParse("1.2.3")
|
||||||
prev := semver.MustParse("1.2.2")
|
prev := semver.MustParse("1.2.2")
|
||||||
rel, err := UpdateCommand(symPath, prev, "MedzikUser-test/test-release-zip")
|
rel, err := UpdateCommand(symPath, prev, "rhysd-test/test-release-zip")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -220,7 +220,7 @@ func TestNotExistingCommandPath(t *testing.T) {
|
||||||
func TestNoReleaseFoundForUpdate(t *testing.T) {
|
func TestNoReleaseFoundForUpdate(t *testing.T) {
|
||||||
v := semver.MustParse("1.0.0")
|
v := semver.MustParse("1.0.0")
|
||||||
fake := filepath.FromSlash("./testdata/fake-executable")
|
fake := filepath.FromSlash("./testdata/fake-executable")
|
||||||
rel, err := UpdateCommand(fake, v, "MedzikUser/misc")
|
rel, err := UpdateCommand(fake, v, "rhysd/misc")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal("No release should not make an error:", err)
|
t.Fatal("No release should not make an error:", err)
|
||||||
}
|
}
|
||||||
|
@ -246,7 +246,7 @@ func TestCurrentIsTheLatest(t *testing.T) {
|
||||||
defer teardownTestBinary()
|
defer teardownTestBinary()
|
||||||
|
|
||||||
v := semver.MustParse("1.2.3")
|
v := semver.MustParse("1.2.3")
|
||||||
rel, err := UpdateCommand("github-release-test", v, "MedzikUser-test/test-release-zip")
|
rel, err := UpdateCommand("github-release-test", v, "rhysd-test/test-release-zip")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -270,7 +270,7 @@ func TestBrokenBinaryUpdate(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
fake := filepath.FromSlash("./testdata/fake-executable")
|
fake := filepath.FromSlash("./testdata/fake-executable")
|
||||||
_, err := UpdateCommand(fake, semver.MustParse("1.2.2"), "MedzikUser-test/test-incorrect-release")
|
_, err := UpdateCommand(fake, semver.MustParse("1.2.2"), "rhysd-test/test-incorrect-release")
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Fatal("Error should occur for broken package")
|
t.Fatal("Error should occur for broken package")
|
||||||
}
|
}
|
||||||
|
@ -281,7 +281,7 @@ func TestBrokenBinaryUpdate(t *testing.T) {
|
||||||
|
|
||||||
func TestInvalidSlugForUpdate(t *testing.T) {
|
func TestInvalidSlugForUpdate(t *testing.T) {
|
||||||
fake := filepath.FromSlash("./testdata/fake-executable")
|
fake := filepath.FromSlash("./testdata/fake-executable")
|
||||||
_, err := UpdateCommand(fake, semver.MustParse("1.0.0"), "MedzikUser/")
|
_, err := UpdateCommand(fake, semver.MustParse("1.0.0"), "rhysd/")
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Fatal("Unknown repo should cause an error")
|
t.Fatal("Unknown repo should cause an error")
|
||||||
}
|
}
|
||||||
|
@ -291,7 +291,7 @@ func TestInvalidSlugForUpdate(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestInvalidAssetURL(t *testing.T) {
|
func TestInvalidAssetURL(t *testing.T) {
|
||||||
err := UpdateTo("https://github.com/MedzikUser/non-existing-repo/releases/download/v1.2.3/foo.zip", "foo")
|
err := UpdateTo("https://github.com/rhysd/non-existing-repo/releases/download/v1.2.3/foo.zip", "foo")
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Fatal("Error should occur for URL not found")
|
t.Fatal("Error should occur for URL not found")
|
||||||
}
|
}
|
||||||
|
@ -301,7 +301,7 @@ func TestInvalidAssetURL(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestBrokenAsset(t *testing.T) {
|
func TestBrokenAsset(t *testing.T) {
|
||||||
asset := "https://github.com/MedzikUser-test/test-incorrect-release/releases/download/invalid/broken-zip.zip"
|
asset := "https://github.com/rhysd-test/test-incorrect-release/releases/download/invalid/broken-zip.zip"
|
||||||
err := UpdateTo(asset, "foo")
|
err := UpdateTo(asset, "foo")
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Fatal("Error should occur for URL not found")
|
t.Fatal("Error should occur for URL not found")
|
||||||
|
@ -385,7 +385,7 @@ func TestUpdateFromGitHubPrivateRepo(t *testing.T) {
|
||||||
|
|
||||||
latest := semver.MustParse("1.2.3")
|
latest := semver.MustParse("1.2.3")
|
||||||
prev := semver.MustParse("1.2.2")
|
prev := semver.MustParse("1.2.2")
|
||||||
rel, err := up.UpdateCommand("github-release-test", prev, "MedzikUser/private-release-test")
|
rel, err := up.UpdateCommand("github-release-test", prev, "rhysd/private-release-test")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue