github.com/AlpineAIO/wails/v2@v2.0.0-beta.32.0.20240505041856-1047a8fa5fef/internal/github/github.go (about) 1 package github 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "io" 7 "net/http" 8 "net/url" 9 "runtime" 10 "sort" 11 "strings" 12 13 "github.com/charmbracelet/glamour" 14 ) 15 16 func GetReleaseNotes(tagVersion string, noColour bool) string { 17 resp, err := http.Get("https://api.github.com/repos/wailsapp/wails/releases/tags/" + url.PathEscape(tagVersion)) 18 if err != nil { 19 return "Unable to retrieve release notes. Please check your network connection" 20 } 21 body, err := io.ReadAll(resp.Body) 22 if err != nil { 23 return "Unable to retrieve release notes. Please check your network connection" 24 } 25 26 data := map[string]interface{}{} 27 err = json.Unmarshal(body, &data) 28 if err != nil { 29 return "Unable to retrieve release notes. Please check your network connection" 30 } 31 32 if data["body"] == nil { 33 return "No release notes found" 34 } 35 36 result := "# Release Notes for " + tagVersion + "\n" + data["body"].(string) 37 var renderer *glamour.TermRenderer 38 39 var termRendererOpts []glamour.TermRendererOption 40 41 if runtime.GOOS == "windows" || noColour { 42 termRendererOpts = append(termRendererOpts, glamour.WithStyles(glamour.NoTTYStyleConfig)) 43 } else { 44 termRendererOpts = append(termRendererOpts, glamour.WithAutoStyle()) 45 } 46 47 renderer, err = glamour.NewTermRenderer(termRendererOpts...) 48 if err != nil { 49 return result 50 } 51 result, err = renderer.Render(result) 52 if err != nil { 53 return err.Error() 54 } 55 return result 56 } 57 58 // GetVersionTags gets the list of tags on the Wails repo 59 // It returns a list of sorted tags in descending order 60 func GetVersionTags() ([]*SemanticVersion, error) { 61 result := []*SemanticVersion{} 62 var err error 63 64 resp, err := http.Get("https://api.github.com/repos/wailsapp/wails/tags") 65 if err != nil { 66 return result, err 67 } 68 body, err := io.ReadAll(resp.Body) 69 if err != nil { 70 return result, err 71 } 72 73 data := []map[string]interface{}{} 74 err = json.Unmarshal(body, &data) 75 if err != nil { 76 return result, err 77 } 78 79 // Convert tag data to Version structs 80 for _, tag := range data { 81 version := tag["name"].(string) 82 if !strings.HasPrefix(version, "v2") { 83 continue 84 } 85 semver, err := NewSemanticVersion(version) 86 if err != nil { 87 return result, err 88 } 89 result = append(result, semver) 90 } 91 92 // Reverse Sort 93 sort.Sort(sort.Reverse(SemverCollection(result))) 94 95 return result, err 96 } 97 98 // GetLatestStableRelease gets the latest stable release on GitHub 99 func GetLatestStableRelease() (result *SemanticVersion, err error) { 100 tags, err := GetVersionTags() 101 if err != nil { 102 return nil, err 103 } 104 105 for _, tag := range tags { 106 if tag.IsRelease() { 107 return tag, nil 108 } 109 } 110 111 return nil, fmt.Errorf("no release tag found") 112 } 113 114 // GetLatestPreRelease gets the latest prerelease on GitHub 115 func GetLatestPreRelease() (result *SemanticVersion, err error) { 116 tags, err := GetVersionTags() 117 if err != nil { 118 return nil, err 119 } 120 121 for _, tag := range tags { 122 if tag.IsPreRelease() { 123 return tag, nil 124 } 125 } 126 127 return nil, fmt.Errorf("no prerelease tag found") 128 } 129 130 // IsValidTag returns true if the given string is a valid tag 131 func IsValidTag(tagVersion string) (bool, error) { 132 if tagVersion[0] == 'v' { 133 tagVersion = tagVersion[1:] 134 } 135 tags, err := GetVersionTags() 136 if err != nil { 137 return false, err 138 } 139 140 for _, tag := range tags { 141 if tag.String() == tagVersion { 142 return true, nil 143 } 144 } 145 return false, nil 146 }