From 8960fd8c4d41223627a350df0d84e488193c22ed Mon Sep 17 00:00:00 2001 From: Uzair Ashraf Date: Sun, 9 May 2021 11:41:35 -0700 Subject: [PATCH 1/6] Added version integration into entry point --- cli/main.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/cli/main.go b/cli/main.go index ddc5334..e81347f 100644 --- a/cli/main.go +++ b/cli/main.go @@ -1,7 +1,6 @@ package main import ( - "fyne.io/fyne/dialog" "log" "net/url" "time" @@ -11,6 +10,7 @@ import ( "fyne.io/fyne" "fyne.io/fyne/app" "fyne.io/fyne/canvas" + "fyne.io/fyne/dialog" "fyne.io/fyne/layout" "fyne.io/fyne/widget" ) @@ -163,7 +163,14 @@ const lockfile = "vrc_auto_rejoin_tool.rejoinLock" func main() { vrc := vrcarjt.NewVRCAutoRejoinTool() - + currentVersion, _ := vrc.GetCurrentVersion() + latestVersion, _ := vrc.GetLatestVersion() + if currentVersion != nil && latestVersion != nil { + if currentVersion.Major != latestVersion.Major { + log.Println("auto rejoin tool が更新されました。最新バージョンを入手してください. ") + return + } + } home := vrc.GetUserHome() lock := vrcarjt.NewDupRunLock(home + `\AppData\Local\Temp\` + lockfile) ok, err := lock.Try() From d8b19a83fa61d4203304bd04c5f5e95b7ec461c1 Mon Sep 17 00:00:00 2001 From: Uzair Ashraf Date: Sun, 9 May 2021 11:42:08 -0700 Subject: [PATCH 2/6] Added Version checking along with a test suite --- version.go | 152 ++++++++++++++++++++++++++++++++++++++++++++++++ version_test.go | 43 ++++++++++++++ 2 files changed, 195 insertions(+) create mode 100644 version.go create mode 100644 version_test.go diff --git a/version.go b/version.go new file mode 100644 index 0000000..5ceb713 --- /dev/null +++ b/version.go @@ -0,0 +1,152 @@ +package vrcarjt + +import ( + "encoding/json" + "errors" + "fmt" + "io" + "io/ioutil" + "log" + "net/http" + "strconv" + "strings" + "time" +) + +const BuildVersion = "v2.7.0" + +type Version struct { + Major int + Minor int + Patch int +} + +func getVersion(version string) (*Version, error) { + if version == "" { + return nil, errors.New("Please provide a valid version to parse") + } + nums := strings.Split(version, "") + if len(nums) != 6 { + return nil, errors.New(fmt.Sprintf("Please follow the proper versioning format, Got: %v, Expected: v0.0.0", version)) + } + if nums[0] != "v" { + return nil, errors.New(fmt.Sprintf("Please follow the proper versioning format, Got: %v, Expected: v0.0.0", version)) + } + major, err := strconv.Atoi(nums[1]) + if err != nil { + return nil, err + } + minor, err := strconv.Atoi(nums[3]) + if err != nil { + return nil, err + } + patch, err := strconv.Atoi(nums[5]) + if err != nil { + return nil, err + } + return &Version{ + Major: major, + Minor: minor, + Patch: patch, + }, nil +} + +type LatestVersion struct { + URL string `json:"url"` + AssetsURL string `json:"assets_url"` + UploadURL string `json:"upload_url"` + HTMLURL string `json:"html_url"` + ID int `json:"id"` + Author struct { + Login string `json:"login"` + ID int `json:"id"` + NodeID string `json:"node_id"` + AvatarURL string `json:"avatar_url"` + GravatarID string `json:"gravatar_id"` + URL string `json:"url"` + HTMLURL string `json:"html_url"` + FollowersURL string `json:"followers_url"` + FollowingURL string `json:"following_url"` + GistsURL string `json:"gists_url"` + StarredURL string `json:"starred_url"` + SubscriptionsURL string `json:"subscriptions_url"` + OrganizationsURL string `json:"organizations_url"` + ReposURL string `json:"repos_url"` + EventsURL string `json:"events_url"` + ReceivedEventsURL string `json:"received_events_url"` + Type string `json:"type"` + SiteAdmin bool `json:"site_admin"` + } `json:"author"` + NodeID string `json:"node_id"` + TagName string `json:"tag_name"` + TargetCommitish string `json:"target_commitish"` + Name string `json:"name"` + Draft bool `json:"draft"` + Prerelease bool `json:"prerelease"` + CreatedAt time.Time `json:"created_at"` + PublishedAt time.Time `json:"published_at"` + Assets []struct { + URL string `json:"url"` + ID int `json:"id"` + NodeID string `json:"node_id"` + Name string `json:"name"` + Label string `json:"label"` + Uploader struct { + Login string `json:"login"` + ID int `json:"id"` + NodeID string `json:"node_id"` + AvatarURL string `json:"avatar_url"` + GravatarID string `json:"gravatar_id"` + URL string `json:"url"` + HTMLURL string `json:"html_url"` + FollowersURL string `json:"followers_url"` + FollowingURL string `json:"following_url"` + GistsURL string `json:"gists_url"` + StarredURL string `json:"starred_url"` + SubscriptionsURL string `json:"subscriptions_url"` + OrganizationsURL string `json:"organizations_url"` + ReposURL string `json:"repos_url"` + EventsURL string `json:"events_url"` + ReceivedEventsURL string `json:"received_events_url"` + Type string `json:"type"` + SiteAdmin bool `json:"site_admin"` + } `json:"uploader"` + ContentType string `json:"content_type"` + State string `json:"state"` + Size int `json:"size"` + DownloadCount int `json:"download_count"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + BrowserDownloadURL string `json:"browser_download_url"` + } `json:"assets"` + TarballURL string `json:"tarball_url"` + ZipballURL string `json:"zipball_url"` + Body string `json:"body"` +} + +func (v *VRCAutoRejoinTool) GetLatestVersion() (*Version, error) { + resp, err := http.Get("https://api.github.com/repos/bootjp/vrc_auto_rejoin_tool/releases/latest") + if err != nil { + log.Println(err) + return nil, err + } + defer resp.Body.Close() + ioutil.ReadAll(resp.Body) + body, err := io.ReadAll(resp.Body) + if err != nil { + log.Println(err) + return nil, err + } + log.Println(string(body)) + var latestVersion LatestVersion + err = json.Unmarshal(body, &latestVersion) + if err != nil { + log.Println(err) + return nil, err + } + + return getVersion(latestVersion.TagName) +} +func (v *VRCAutoRejoinTool) GetCurrentVersion() (*Version, error) { + return getVersion(BuildVersion) +} diff --git a/version_test.go b/version_test.go new file mode 100644 index 0000000..827a803 --- /dev/null +++ b/version_test.go @@ -0,0 +1,43 @@ +package vrcarjt + +import ( + "reflect" + "testing" +) + +func Test_getVersion(t *testing.T) { + type args struct { + version string + } + tests := []struct { + name string + args args + want *Version + wantErr bool + }{ + { + name: "Should return a valid Version for v2.7.0", + args: args{ + "v2.7.0", + }, + want: &Version{ + Major: 2, + Minor: 7, + Patch: 0, + }, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := getVersion(tt.args.version) + if (err != nil) != tt.wantErr { + t.Errorf("getVersion() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("getVersion() = %v, want %v", got, tt.want) + } + }) + } +} From 196eaf44532c73baca4ea8f7b6771ebd17de2ce0 Mon Sep 17 00:00:00 2001 From: Uzair Ashraf Date: Sun, 9 May 2021 15:13:48 -0700 Subject: [PATCH 3/6] Added blocking select statement to keep terminal from closing after displaying message --- cli/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/main.go b/cli/main.go index e81347f..c1c893d 100644 --- a/cli/main.go +++ b/cli/main.go @@ -168,7 +168,7 @@ func main() { if currentVersion != nil && latestVersion != nil { if currentVersion.Major != latestVersion.Major { log.Println("auto rejoin tool が更新されました。最新バージョンを入手してください. ") - return + select {} } } home := vrc.GetUserHome() From 98bb2f0a4248136b360180cba24b75db1163bac8 Mon Sep 17 00:00:00 2001 From: Uzair Ashraf Date: Sun, 9 May 2021 15:14:28 -0700 Subject: [PATCH 4/6] ioutil used once and refined error messages --- version.go | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/version.go b/version.go index 5ceb713..21740e2 100644 --- a/version.go +++ b/version.go @@ -4,7 +4,6 @@ import ( "encoding/json" "errors" "fmt" - "io" "io/ioutil" "log" "net/http" @@ -13,8 +12,6 @@ import ( "time" ) -const BuildVersion = "v2.7.0" - type Version struct { Major int Minor int @@ -27,10 +24,10 @@ func getVersion(version string) (*Version, error) { } nums := strings.Split(version, "") if len(nums) != 6 { - return nil, errors.New(fmt.Sprintf("Please follow the proper versioning format, Got: %v, Expected: v0.0.0", version)) + return nil, fmt.Errorf("Please follow the proper versioning format, Got: %v, Expected: v0.0.0", version) } if nums[0] != "v" { - return nil, errors.New(fmt.Sprintf("Please follow the proper versioning format, Got: %v, Expected: v0.0.0", version)) + return nil, fmt.Errorf("Please follow the proper versioning format, Got: %v, Expected: v0.0.0", version) } major, err := strconv.Atoi(nums[1]) if err != nil { @@ -131,13 +128,12 @@ func (v *VRCAutoRejoinTool) GetLatestVersion() (*Version, error) { return nil, err } defer resp.Body.Close() - ioutil.ReadAll(resp.Body) - body, err := io.ReadAll(resp.Body) + + body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Println(err) return nil, err } - log.Println(string(body)) var latestVersion LatestVersion err = json.Unmarshal(body, &latestVersion) if err != nil { From 597804acd1ab5dd4fc8565a105d0d613395c7afb Mon Sep 17 00:00:00 2001 From: Uzair Ashraf Date: Sun, 9 May 2021 15:14:54 -0700 Subject: [PATCH 5/6] Added test suite to ensure version translation works properly --- version_test.go | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/version_test.go b/version_test.go index 827a803..e43e54e 100644 --- a/version_test.go +++ b/version_test.go @@ -27,6 +27,34 @@ func Test_getVersion(t *testing.T) { }, wantErr: false, }, + { + name: "Should return a valid Version for v2.7.1", + args: args{ + "v2.7.1", + }, + want: &Version{ + Major: 2, + Minor: 7, + Patch: 1, + }, + wantErr: false, + }, + { + name: "Should fail for an invalid version type for 2.7.1", + args: args{ + "2.7.1", + }, + want: nil, + wantErr: true, + }, + { + name: "Should fail for an empty string", + args: args{ + "", + }, + want: nil, + wantErr: true, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -41,3 +69,14 @@ func Test_getVersion(t *testing.T) { }) } } + +func TestVRCAutoRejoinTool_GetCurrentVersion(t *testing.T) { + + t.Run("Should return a valid version", func(t *testing.T) { + v := NewVRCAutoRejoinTool() + _, err := v.GetCurrentVersion() + if err != nil { + t.Errorf("VRCAutoRejoinTool.GetCurrentVersion() error = %v", err) + } + }) +} From 08ca4e38ba4b181850d3aec37e433d054c754f3c Mon Sep 17 00:00:00 2001 From: Uzair Ashraf Date: Sun, 9 May 2021 15:15:14 -0700 Subject: [PATCH 6/6] Added build version to main script --- vrc_auto_rejoin_tool.go | 1 + 1 file changed, 1 insertion(+) diff --git a/vrc_auto_rejoin_tool.go b/vrc_auto_rejoin_tool.go index a0ce1bd..0bd2cd9 100644 --- a/vrc_auto_rejoin_tool.go +++ b/vrc_auto_rejoin_tool.go @@ -30,6 +30,7 @@ const Location = "Local" const TimeFormat = "2006.01.02 15:04:05" const vrcRelativeLogPath = `\AppData\LocalLow\VRChat\VRChat\` const Timeout = "Timeout: Your connection to VRChat timed out." +const BuildVersion = "v2.7.0" func NewVRCAutoRejoinTool() *VRCAutoRejoinTool { conf := LoadConf("setting.yml")