Files
lazygit/pkg/release_notes/release_notes.go
Jesse Duffield 3a191b913f Add release notes popup after update
We're using glamour for rendering the markdown, and I'm interested in using it in other places
too
2024-01-13 19:26:26 +11:00

74 lines
1.7 KiB
Go

package release_notes
import (
"encoding/json"
"fmt"
"io"
"net/http"
"strings"
"time"
)
// Represents the JSON structure of a GitHub release
type Release struct {
Name string `json:"name"`
PublishedAt string `json:"published_at"`
Body string `json:"body"`
}
// Fetches the last 5 releases from the lazygit repository and returns the information as a string
func GetLazyGitReleases() (string, error) {
url := "https://api.github.com/repos/jesseduffield/lazygit/releases?per_page=5"
resp, err := http.Get(url)
if err != nil {
return "", err
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return "", err
}
var releases []Release
err = json.Unmarshal(body, &releases)
if err != nil {
return "", err
}
var sb strings.Builder
sb.WriteString("_These are the latest release notes for lazygit. They are pulled straight from GitHub so if you're not on the latest version, you can see what you're missing out on!_\n\n")
for _, release := range releases {
sb.WriteString(fmt.Sprintf("# Version %s\n\n", release.Name))
sb.WriteString(fmt.Sprintf("_Released on %s_\n", formatDate(release.PublishedAt)))
sb.WriteString(fmt.Sprintf("%s\n", release.Body))
sb.WriteString("--------------------------------------------------\n")
}
return sb.String(), nil
}
func formatDate(dateStr string) string {
parsedDate, err := time.Parse(time.RFC3339, dateStr)
if err != nil {
return "Unknown date"
}
day := fmt.Sprintf("%d", parsedDate.Day())
switch day {
case "1", "21", "31":
day += "st"
case "2", "22":
day += "nd"
case "3", "23":
day += "rd"
default:
day += "th"
}
return parsedDate.Format("January " + day + " 2006")
}