5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-12 23:19:29 +08:00
wails/v3/internal/commands/tool_version.go
2025-04-23 10:29:51 +10:00

124 lines
3.2 KiB
Go

package commands
import (
"fmt"
"strconv"
"strings"
"github.com/wailsapp/wails/v3/internal/github"
)
type ToolVersionOptions struct {
Version string `name:"v" description:"Current version to bump"`
Major bool `name:"major" description:"Bump major version"`
Minor bool `name:"minor" description:"Bump minor version"`
Patch bool `name:"patch" description:"Bump patch version"`
Prerelease bool `name:"prerelease" description:"Bump prerelease version (e.g., alpha.5 to alpha.6)"`
}
// bumpPrerelease increments the numeric part of a prerelease string
// For example, "alpha.5" becomes "alpha.6"
func bumpPrerelease(prerelease string) string {
// If prerelease is empty, return it as is
if prerelease == "" {
return prerelease
}
// Split the prerelease string by dots
parts := strings.Split(prerelease, ".")
// If there's only one part (e.g., "alpha"), return it as is
if len(parts) == 1 {
return prerelease
}
// Try to parse the last part as a number
lastPart := parts[len(parts)-1]
num, err := strconv.Atoi(lastPart)
if err != nil {
// If the last part is not a number, return the prerelease as is
return prerelease
}
// Increment the number
num++
// Replace the last part with the incremented number
parts[len(parts)-1] = strconv.Itoa(num)
// Join the parts back together
return strings.Join(parts, ".")
}
// ToolVersion bumps a semantic version based on the provided flags
func ToolVersion(options *ToolVersionOptions) error {
DisableFooter = true
if options.Version == "" {
return fmt.Errorf("please provide a version using the -v flag")
}
// Check if the version has a "v" prefix
hasVPrefix := false
versionStr := options.Version
if len(versionStr) > 0 && versionStr[0] == 'v' {
hasVPrefix = true
versionStr = versionStr[1:]
}
// Parse the current version
semver, err := github.NewSemanticVersion(versionStr)
if err != nil {
return fmt.Errorf("invalid version format: %v", err)
}
// Get the current version components
major := semver.Version.Major()
minor := semver.Version.Minor()
patch := semver.Version.Patch()
prerelease := semver.Version.Prerelease()
metadata := semver.Version.Metadata()
// Check if at least one flag is specified
if !options.Major && !options.Minor && !options.Patch && !options.Prerelease {
return fmt.Errorf("please specify one of -major, -minor, -patch, or -prerelease")
}
// Bump the version based on the flags (major takes precedence over minor, which takes precedence over patch)
if options.Major {
major++
minor = 0
patch = 0
} else if options.Minor {
minor++
patch = 0
} else if options.Patch {
patch++
} else if options.Prerelease {
// If only prerelease flag is specified, bump the prerelease version
if prerelease == "" {
return fmt.Errorf("cannot bump prerelease version: no prerelease part in the version")
}
prerelease = bumpPrerelease(prerelease)
}
// Format the new version
newVersion := fmt.Sprintf("%d.%d.%d", major, minor, patch)
if prerelease != "" {
newVersion += "-" + prerelease
}
if metadata != "" {
newVersion += "+" + metadata
}
// Add the "v" prefix back if it was present in the input
if hasVPrefix {
newVersion = "v" + newVersion
}
// Print the new version
fmt.Println(newVersion)
return nil
}