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  }