Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 6 additions & 7 deletions pkg/cli/cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ capabilities.
$ escape-cli issues list --severity HIGH,CRITICAL

💡 PRO TIPS:
• Use -v for verbose logging (-vv for debug, -vvv for trace)
• Use -v for debug, -vv for trace, -vvv for http/raw debug
• Output in JSON or YAML with -o json or -o yaml
• Most list commands support powerful filtering options
• Use --watch flag when starting scans for real-time updates
Expand All @@ -78,16 +78,15 @@ capabilities.
verbosityFrom = "environment variable ESCAPE_VERBOSITY"
}

// Verbosity levels per Health Monitoring for Private Locations docs:
// 0 = default (minimal), 1 = debug, 2 = trace, 3 = trace + http/raw
if rootCmdVerbose > 0 { //nolint:mnd
log.SetLevel(logrus.InfoLevel)
}
if rootCmdVerbose > 1 { //nolint:mnd
log.SetLevel(logrus.DebugLevel)
}
if rootCmdVerbose > 2 { //nolint:mnd
if rootCmdVerbose > 1 { //nolint:mnd
log.SetLevel(logrus.TraceLevel)
}
if rootCmdVerbose > 3 { //nolint:mnd
if rootCmdVerbose > 2 { //nolint:mnd
escape.Debug = true
}
log.Info("Verbose mode: %d from %s", rootCmdVerbose, verbosityFrom)
Expand All @@ -107,7 +106,7 @@ capabilities.
}

func init() {
rootCmd.PersistentFlags().CountVarP(&rootCmdVerbose, "verbose", "v", "verbose output: -v (info), -vv (debug), -vvv (trace), -vvvv (http debug)")
rootCmd.PersistentFlags().CountVarP(&rootCmdVerbose, "verbose", "v", "verbose output: -v (debug), -vv (trace), -vvv (http/raw debug)")
rootCmd.PersistentFlags().StringVarP(&rootCmdOutputStr, "output", "o", "pretty", "output format: pretty (human-readable tables), json (machine-readable), yaml (configuration files)")
rootCmd.SetUsageTemplate(rootCmd.UsageTemplate() + `
COMMAND CATEGORIES:
Expand Down
2 changes: 1 addition & 1 deletion pkg/log/main_test.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package log
package log //nolint:revive

import (
"testing"
Expand Down
86 changes: 42 additions & 44 deletions pkg/version/update_check.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package version
package version //nolint:revive

import (
"context"
Expand All @@ -15,62 +15,60 @@ import (
const updateCheckTimeout = 1000 * time.Millisecond

type githubRelease struct {
TagName string `json:"tag_name"`
TagName string `json:"tag_name"`
}

func normalizeVersion(v string) string {
v = strings.TrimSpace(v)
v = strings.TrimPrefix(v, "v")
return v
v = strings.TrimSpace(v)
v = strings.TrimPrefix(v, "v")
return v
}

func getLatestReleaseTag(ctx context.Context) (string, error) {
client := env.GetHTTPClient()
req, err := http.NewRequestWithContext(ctx, http.MethodGet, "https://api.github.com/repos/Escape-Technologies/cli/releases/latest", nil)
if err != nil {
return "", fmt.Errorf("create request: %w", err)
}
client := env.GetHTTPClient()
req, err := http.NewRequestWithContext(ctx, http.MethodGet, "https://api.github.com/repos/Escape-Technologies/cli/releases/latest", nil)
if err != nil {
return "", fmt.Errorf("create request: %w", err)
}

resp, err := client.Do(req)
if err != nil {
return "", fmt.Errorf("perform request: %w", err)
}
defer func() { _ = resp.Body.Close() }()
if resp.StatusCode != http.StatusOK {
return "", fmt.Errorf("unexpected status: %s", resp.Status)
}
var release githubRelease
if err := json.NewDecoder(resp.Body).Decode(&release); err != nil {
return "", fmt.Errorf("decode response: %w", err)
}
return strings.TrimSpace(release.TagName), nil
resp, err := client.Do(req)
if err != nil {
return "", fmt.Errorf("perform request: %w", err)
}
defer func() { _ = resp.Body.Close() }()
if resp.StatusCode != http.StatusOK {
return "", fmt.Errorf("unexpected status: %s", resp.Status)
}
var release githubRelease
if err := json.NewDecoder(resp.Body).Decode(&release); err != nil {
return "", fmt.Errorf("decode response: %w", err)
}
return strings.TrimSpace(release.TagName), nil
}

// WarnIfNotLatestVersion checks the latest GitHub release and prints if the current version is not the latest.
func WarnIfNotLatestVersion(parentCtx context.Context) {
v := GetVersion()
if strings.TrimSpace(v.Version) == "" || v.Version == "local" {
return
}
v := GetVersion()
if strings.TrimSpace(v.Version) == "" || v.Version == "local" {
return
}

ctx, cancel := context.WithTimeout(parentCtx, updateCheckTimeout)
defer cancel()
ctx, cancel := context.WithTimeout(parentCtx, updateCheckTimeout)
defer cancel()

latest, err := getLatestReleaseTag(ctx)
if err != nil || latest == "" {
return
}
latest, err := getLatestReleaseTag(ctx)
if err != nil || latest == "" {
return
}

current := normalizeVersion(v.Version)
latestNorm := normalizeVersion(latest)
if current == latestNorm {
return
}
current := normalizeVersion(v.Version)
latestNorm := normalizeVersion(latest)
if current == latestNorm {
return
}

yellow := "\x1b[33m"
reset := "\x1b[0m"
msg := fmt.Sprintf("A new version of escape-cli is available: %s (you have %s). Update: https://docs.escape.tech/documentation/tooling/cli/?h=cli", latest, v.Version)
fmt.Fprintf(os.Stderr, "%s%s%s\n", yellow, msg, reset)
yellow := "\x1b[33m"
reset := "\x1b[0m"
msg := fmt.Sprintf("A new version of escape-cli is available: %s (you have %s). Update: https://docs.escape.tech/documentation/tooling/cli/?h=cli", latest, v.Version)
fmt.Fprintf(os.Stderr, "%s%s%s\n", yellow, msg, reset)
}


2 changes: 1 addition & 1 deletion pkg/version/version.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// Package version contains the version information for the CLI
package version
package version //nolint:revive

import "fmt"

Expand Down
Loading