@@ -8,13 +8,16 @@ import (
88 "os"
99 "path/filepath"
1010 "runtime"
11+ "slices"
1112 "strings"
1213 "time"
1314
1415 "github.com/Masterminds/semver/v3"
1516 "github.com/runtipi/cli/internal/config"
1617)
1718
19+ var NonPreReleaseTags = []string {"nightly" , "e2e" }
20+
1821type GitHubRelease struct {
1922 TagName string `json:"tag_name"`
2023 Name string `json:"name"`
@@ -28,32 +31,40 @@ type GitHubRelease struct {
2831 } `json:"assets"`
2932}
3033
31- func GetLatestRelease () (string , error ) {
32- url := "https://api.github.com/repos/runtipi/runtipi/releases/latest"
33-
34+ func GetReleases (url string ) ([]GitHubRelease , error ) {
3435 req , err := http .NewRequest ("GET" , url , nil )
3536 if err != nil {
36- return "" , fmt .Errorf ("failed to create request: %v" , err )
37+ return nil , fmt .Errorf ("failed to create request: %v" , err )
3738 }
3839
3940 req .Header .Set ("User-Agent" , "Runtipi-CLI" )
4041 client := & http.Client {Timeout : 10 * time .Second }
4142 resp , err := client .Do (req )
4243 if err != nil {
43- return "" , fmt .Errorf ("failed to send request: %v" , err )
44+ return nil , fmt .Errorf ("failed to send request: %v" , err )
4445 }
4546 defer resp .Body .Close ()
4647
4748 if resp .StatusCode != http .StatusOK {
48- return "" , fmt .Errorf ("failed to fetch latest release . Status code: %d" , resp .StatusCode )
49+ return nil , fmt .Errorf ("failed to fetch releases . Status code: %d" , resp .StatusCode )
4950 }
5051
51- var release GitHubRelease
52- if err := json . NewDecoder ( resp . Body ). Decode ( & release ); err != nil {
53- return "" , fmt .Errorf ("failed to parse latest release : %v" , err )
52+ body , err := io . ReadAll ( resp . Body )
53+ if err != nil {
54+ return nil , fmt .Errorf ("failed to read response body : %v" , err )
5455 }
5556
56- return release .TagName , nil
57+ // The latest release is not returned in an array so we will try to decode it as a single release
58+ var releases []GitHubRelease
59+ if err := json .Unmarshal (body , & releases ); err != nil {
60+ var release GitHubRelease
61+ if err := json .Unmarshal (body , & release ); err != nil {
62+ return nil , fmt .Errorf ("failed to parse releases: %v" , err )
63+ }
64+ releases = append (releases , release )
65+ }
66+
67+ return releases , nil
5768}
5869
5970func IsMajorBump (currentVersion , newVersion string ) bool {
@@ -190,3 +201,14 @@ func FindReleaseByVersion(version string) (GitHubRelease, error) {
190201
191202 return GitHubRelease {}, fmt .Errorf ("release not found. Did you forget the v prefix? (e.g. v4.0.0 instead of 4.0.0)" )
192203}
204+
205+ func FilterNonPreReleases (releases []GitHubRelease ) []GitHubRelease {
206+ var filtered []GitHubRelease
207+ for _ , release := range releases {
208+ if slices .Contains (NonPreReleaseTags , release .TagName ) || ! release .Prerelease {
209+ continue
210+ }
211+ filtered = append (filtered , release )
212+ }
213+ return filtered
214+ }
0 commit comments