Align update command UX/state handling with AX conventions

This commit is contained in:
Virgil 2026-03-30 00:24:43 +00:00
parent ee154a2c15
commit 333857cb3a
3 changed files with 15 additions and 18 deletions

16
cmd.go
View file

@ -4,6 +4,7 @@ import (
"context"
"fmt"
"runtime"
"strings"
"forge.lthn.ai/core/cli/pkg/cli"
"github.com/spf13/cobra"
@ -47,7 +48,7 @@ Examples:
updateCmd.PersistentFlags().StringVar(&updateChannel, "channel", "stable", "Release channel: stable, beta, alpha, or dev")
updateCmd.PersistentFlags().BoolVar(&updateForce, "force", false, "Force update even if already on latest version")
updateCmd.Flags().BoolVar(&updateCheck, "check", false, "Only check for updates, don't apply")
updateCmd.Flags().BoolVar(&updateCheck, "check", false, "Only check for updates, do not apply")
updateCmd.Flags().IntVar(&updateWatchPID, "watch-pid", 0, "Internal: watch for parent PID to die then restart")
_ = updateCmd.Flags().MarkHidden("watch-pid")
@ -55,7 +56,9 @@ Examples:
Use: "check",
Short: "Check for available updates",
RunE: func(cmd *cobra.Command, args []string) error {
previousCheck := updateCheck
updateCheck = true
defer func() { updateCheck = previousCheck }()
return runUpdate(cmd, args)
},
})
@ -70,24 +73,25 @@ func runUpdate(cmd *cobra.Command, args []string) error {
}
currentVersion := cli.AppVersion
normalizedChannel := strings.TrimSpace(strings.ToLower(updateChannel))
cli.Print("%s %s\n", cli.DimStyle.Render("Current version:"), cli.ValueStyle.Render(currentVersion))
cli.Print("%s %s/%s\n", cli.DimStyle.Render("Platform:"), runtime.GOOS, runtime.GOARCH)
cli.Print("%s %s\n\n", cli.DimStyle.Render("Channel:"), updateChannel)
cli.Print("%s %s\n\n", cli.DimStyle.Render("Channel:"), normalizedChannel)
// Handle dev channel specially - it's a prerelease tag, not a semver channel
if updateChannel == "dev" {
if normalizedChannel == "dev" {
return handleDevUpdate(currentVersion)
}
// Check for newer version
release, updateAvailable, err := CheckForNewerVersion(repoOwner, repoName, updateChannel, true)
release, updateAvailable, err := CheckForNewerVersion(repoOwner, repoName, normalizedChannel, true)
if err != nil {
return cli.Wrap(err, "failed to check for updates")
}
if release == nil {
cli.Print("%s No releases found in %s channel\n", cli.WarningStyle.Render("!"), updateChannel)
cli.Print("%s No releases found in %s channel\n", cli.WarningStyle.Render("!"), normalizedChannel)
return nil
}
@ -140,7 +144,7 @@ func handleDevUpdate(currentVersion string) error {
client := NewGithubClient()
// Fetch the dev release directly by tag
release, err := client.GetLatestRelease(context.TODO(), repoOwner, repoName, "beta")
release, err := client.GetLatestRelease(context.Background(), repoOwner, repoName, "beta")
if err != nil {
// Try fetching the "dev" tag directly
return handleDevTagUpdate(currentVersion)

View file

@ -26,9 +26,7 @@ The `CheckOnStartup` field can take one of the following values:
If you are using the example CLI provided in `cmd/updater`, the following flags are available:
* `--check-update`: Check for new updates without applying them.
* `--do-update`: Perform an update if available.
* `--channel`: Set the update channel (e.g., stable, beta, alpha). If not set, it's determined from the current version tag.
* `--force-semver-prefix`: Force 'v' prefix on semver tags (default `true`).
* `--release-url-format`: A URL format for release assets.
* `--pull-request`: Update to a specific pull request (integer ID).
* `--check`: Check for new updates without applying them.
* `--channel`: Set the update channel (e.g., stable, beta, alpha). Defaults to `stable`.
* `--force`: Force update even when already on latest.
* `--watch-pid`: Internal flag used during restart after update.

View file

@ -42,10 +42,7 @@ var DoUpdate = func(url string) error {
return coreerr.E("DoUpdate", "failed to download update", err)
}
defer func(Body io.ReadCloser) {
err := Body.Close()
if err != nil {
fmt.Printf("failed to close response body: %v\n", err)
}
_ = Body.Close()
}(resp.Body)
if resp.StatusCode != http.StatusOK {
@ -59,8 +56,6 @@ var DoUpdate = func(url string) error {
}
return coreerr.E("DoUpdate", "update failed", err)
}
fmt.Println("Update applied successfully.")
return nil
}