1
0
mirror of https://github.com/go-task/task.git synced 2025-11-23 22:24:45 +02:00
Files
task/cmd/release/main.go

134 lines
2.7 KiB
Go
Raw Normal View History

2023-03-26 15:32:20 +00:00
package main
import (
"fmt"
"os"
"regexp"
"strings"
"time"
"github.com/Masterminds/semver/v3"
2024-05-13 14:37:07 +00:00
"github.com/spf13/pflag"
"github.com/go-task/task/v3/errors"
2023-03-26 15:32:20 +00:00
)
const (
changelogSource = "CHANGELOG.md"
2025-09-15 12:17:28 +00:00
changelogTarget = "website/src/docs/changelog.md"
versionFile = "internal/version/version.txt"
2023-03-26 15:32:20 +00:00
)
2025-09-15 12:17:28 +00:00
var changelogReleaseRegex = regexp.MustCompile(`## Unreleased`)
2023-03-26 15:32:20 +00:00
2024-05-13 14:37:07 +00:00
// Flags
var (
versionFlag bool
)
func init() {
pflag.BoolVarP(&versionFlag, "version", "v", false, "resolved version number")
pflag.Parse()
}
2023-03-26 15:32:20 +00:00
func main() {
if err := release(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}
func release() error {
2024-05-13 14:37:07 +00:00
if len(pflag.Args()) != 1 {
2023-03-26 15:32:20 +00:00
return errors.New("error: expected version number")
}
2025-09-15 12:17:28 +00:00
version, err := getVersion(versionFile)
2023-03-26 15:32:20 +00:00
if err != nil {
return err
}
2024-05-13 14:37:07 +00:00
if err := bumpVersion(version, pflag.Arg(0)); err != nil {
2023-03-26 15:32:20 +00:00
return err
}
2024-05-13 14:37:07 +00:00
if versionFlag {
fmt.Println(version)
return nil
}
2023-03-26 15:32:20 +00:00
if err := changelog(version); err != nil {
return err
}
2025-09-15 12:17:28 +00:00
if err := setVersionFile(versionFile, version); err != nil {
return err
}
2023-03-26 15:32:20 +00:00
return nil
}
2025-09-15 12:17:28 +00:00
func getVersion(filename string) (*semver.Version, error) {
b, err := os.ReadFile(filename)
2023-03-26 15:32:20 +00:00
if err != nil {
return nil, err
}
return semver.NewVersion(strings.TrimSpace(string(b)))
}
func bumpVersion(version *semver.Version, verb string) error {
switch verb {
case "major":
*version = version.IncMajor()
case "minor":
*version = version.IncMinor()
case "patch":
*version = version.IncPatch()
default:
*version = *semver.MustParse(verb)
}
return nil
}
func changelog(version *semver.Version) error {
// Open changelog target file
b, err := os.ReadFile(changelogTarget)
if err != nil {
return err
}
// Get the current frontmatter
currentChangelog := string(b)
sections := strings.SplitN(currentChangelog, "---", 3)
if len(sections) != 3 {
return errors.New("error: invalid frontmatter")
}
frontmatter := strings.TrimSpace(sections[1])
2023-03-26 15:32:20 +00:00
// Open changelog source file
b, err = os.ReadFile(changelogSource)
2023-03-26 15:32:20 +00:00
if err != nil {
return err
2023-03-26 15:32:20 +00:00
}
changelog := string(b)
date := time.Now().Format("2006-01-02")
// Replace "Unreleased" with the new version and date
changelog = changelogReleaseRegex.ReplaceAllString(changelog, fmt.Sprintf("## v%s - %s", version, date))
// Write the changelog to the source file
2023-03-31 19:13:29 +00:00
if err := os.WriteFile(changelogSource, []byte(changelog), 0o644); err != nil {
return err
2023-03-26 15:32:20 +00:00
}
// Add the frontmatter to the changelog
changelog = fmt.Sprintf("---\n%s\n---\n\n%s", frontmatter, changelog)
2023-03-26 15:32:20 +00:00
// Write the changelog to the target file
2023-03-31 19:13:29 +00:00
return os.WriteFile(changelogTarget, []byte(changelog), 0o644)
}
2025-04-05 23:09:27 +01:00
func setVersionFile(fileName string, version *semver.Version) error {
return os.WriteFile(fileName, []byte(version.String()+"\n"), 0o644)
}