From 77ff146991ce0958f21d1dd49b16cce43805a45b Mon Sep 17 00:00:00 2001 From: decentral1se Date: Mon, 18 Aug 2025 20:03:39 +0200 Subject: [PATCH 1/5] fix: better parsing errors See https://git.coopcloud.tech/toolshed/organising/issues/608 See https://git.coopcloud.tech/toolshed/organising/issues/531 --- cli/app/upgrade.go | 13 +++++++------ go.mod | 2 +- go.sum | 2 ++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/cli/app/upgrade.go b/cli/app/upgrade.go index 7083a145..5e6ef87d 100644 --- a/cli/app/upgrade.go +++ b/cli/app/upgrade.go @@ -117,7 +117,7 @@ beforehand. See "abra app backup" for more.`, } if deployMeta.Version != config.UNKNOWN_DEFAULT && chosenUpgrade == "" { - upgradeAvailable, err := ensureUpgradesAvailable(versions, &availableUpgrades, deployMeta) + upgradeAvailable, err := ensureUpgradesAvailable(app, versions, &availableUpgrades, deployMeta) if err != nil { log.Fatal(err) } @@ -314,18 +314,18 @@ func getReleaseNotes( ) error { parsedChosenUpgrade, err := tagcmp.Parse(chosenUpgrade) if err != nil { - return err + return fmt.Errorf("parsing chosen upgrade version failed: %s", err) } parsedDeployedVersion, err := tagcmp.Parse(deployMeta.Version) if err != nil { - return err + return fmt.Errorf("parsing deployment version failed: %s", err) } for _, version := range internal.SortVersionsDesc(versions) { parsedVersion, err := tagcmp.Parse(version) if err != nil { - return err + return fmt.Errorf("parsing recipe version failed: %s", err) } if parsedVersion.IsGreaterThan(parsedDeployedVersion) && @@ -351,19 +351,20 @@ func getReleaseNotes( // ensureUpgradesAvailable ensures that there are available upgrades. func ensureUpgradesAvailable( + app app.App, versions []string, availableUpgrades *[]string, deployMeta stack.DeployMeta, ) (bool, error) { parsedDeployedVersion, err := tagcmp.Parse(deployMeta.Version) if err != nil { - return false, err + return false, fmt.Errorf("parsing deployed version failed: %s", err) } for _, version := range versions { parsedVersion, err := tagcmp.Parse(version) if err != nil { - return false, err + return false, fmt.Errorf("parsing recipe version failed: %s", err) } if parsedVersion.IsGreaterThan(parsedDeployedVersion) && diff --git a/go.mod b/go.mod index 4c6bfc38..17689d4e 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.23.5 toolchain go1.24.1 require ( - coopcloud.tech/tagcmp v0.0.0-20250427094623-9ea3bbbde8e5 + coopcloud.tech/tagcmp v0.0.0-20250818180036-0ec1b205b5ca git.coopcloud.tech/toolshed/godotenv v1.5.2-0.20250103171850-4d0ca41daa5c github.com/AlecAivazis/survey/v2 v2.3.7 github.com/charmbracelet/bubbletea v1.3.6 diff --git a/go.sum b/go.sum index 8db9fdbd..7c621a59 100644 --- a/go.sum +++ b/go.sum @@ -26,6 +26,8 @@ coopcloud.tech/tagcmp v0.0.0-20230809071031-eb3e7758d4eb h1:Ws6WEwKXeaYEkfdkX6Aq coopcloud.tech/tagcmp v0.0.0-20230809071031-eb3e7758d4eb/go.mod h1:ESVm0wQKcbcFi06jItF3rI7enf4Jt2PvbkWpDDHk1DQ= coopcloud.tech/tagcmp v0.0.0-20250427094623-9ea3bbbde8e5 h1:tphJCjFJw9fdjyKnbU0f7f3z5KtYE8VbUcAfu+oHKg8= coopcloud.tech/tagcmp v0.0.0-20250427094623-9ea3bbbde8e5/go.mod h1:ESVm0wQKcbcFi06jItF3rI7enf4Jt2PvbkWpDDHk1DQ= +coopcloud.tech/tagcmp v0.0.0-20250818180036-0ec1b205b5ca h1:gSD53tBAsbIGq4SnFfq+mEep6foekQ2a5ea7b38qkm0= +coopcloud.tech/tagcmp v0.0.0-20250818180036-0ec1b205b5ca/go.mod h1:ESVm0wQKcbcFi06jItF3rI7enf4Jt2PvbkWpDDHk1DQ= dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= -- 2.49.0 From e0bd03bec3758366de416ce100ce5433f23a452c Mon Sep 17 00:00:00 2001 From: decentral1se Date: Mon, 18 Aug 2025 20:04:05 +0200 Subject: [PATCH 2/5] chore: bump deps --- go.mod | 6 +++--- go.sum | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 17689d4e..be78dc17 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module coopcloud.tech/abra -go 1.23.5 +go 1.24.0 toolchain go1.24.1 @@ -39,7 +39,7 @@ require ( github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/charmbracelet/colorprofile v0.3.1 // indirect + github.com/charmbracelet/colorprofile v0.3.2 // indirect github.com/charmbracelet/x/ansi v0.10.1 // indirect github.com/charmbracelet/x/cellbuf v0.0.13 // indirect github.com/charmbracelet/x/term v0.2.1 // indirect @@ -128,7 +128,7 @@ require ( go.opentelemetry.io/otel/trace v1.37.0 // indirect go.opentelemetry.io/proto/otlp v1.7.1 // indirect golang.org/x/crypto v0.41.0 // indirect - golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 // indirect + golang.org/x/exp v0.0.0-20250813145105-42675adae3e6 // indirect golang.org/x/net v0.43.0 // indirect golang.org/x/sync v0.16.0 // indirect golang.org/x/text v0.28.0 // indirect diff --git a/go.sum b/go.sum index 7c621a59..ed1015b9 100644 --- a/go.sum +++ b/go.sum @@ -158,6 +158,8 @@ github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4p github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk= github.com/charmbracelet/colorprofile v0.3.1 h1:k8dTHMd7fgw4bnFd7jXTLZrSU/CQrKnL3m+AxCzDz40= github.com/charmbracelet/colorprofile v0.3.1/go.mod h1:/GkGusxNs8VB/RSOh3fu0TJmQ4ICMMPApIIVn0KszZ0= +github.com/charmbracelet/colorprofile v0.3.2 h1:9J27WdztfJQVAQKX2WOlSSRB+5gaKqqITmrvb1uTIiI= +github.com/charmbracelet/colorprofile v0.3.2/go.mod h1:mTD5XzNeWHj8oqHb+S1bssQb7vIHbepiebQ2kPKVKbI= github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY= github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30= github.com/charmbracelet/log v0.4.1 h1:6AYnoHKADkghm/vt4neaNEXkxcXLSV2g1rdyFDOpTyk= @@ -1106,6 +1108,8 @@ golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 h1:nDVHiLt8aIbd/VzvPWN6kSOPE golang.org/x/exp v0.0.0-20250305212735-054e65f0b394/go.mod h1:sIifuuw/Yco/y6yb6+bDNfyeQ/MdPUy/hKEMYQV17cM= golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 h1:3yiSh9fhy5/RhCSntf4Sy0Tnx50DmMpQ4MQdKKk4yg4= golang.org/x/exp v0.0.0-20250811191247-51f88131bc50/go.mod h1:rT6SFzZ7oxADUDx58pcaKFTcZ+inxAa9fTrYx/uVYwg= +golang.org/x/exp v0.0.0-20250813145105-42675adae3e6 h1:SbTAbRFnd5kjQXbczszQ0hdk3ctwYf3qBNH9jIsGclE= +golang.org/x/exp v0.0.0-20250813145105-42675adae3e6/go.mod h1:4QTo5u+SEIbbKW1RacMZq1YEfOBqeXa19JeshGi+zc4= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -- 2.49.0 From 1894c2f5fc3e0e66e0d6bb98ab0588cc15758f2a Mon Sep 17 00:00:00 2001 From: decentral1se Date: Mon, 18 Aug 2025 20:27:24 +0200 Subject: [PATCH 3/5] chore: appease formatter --- cli/app/secret.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/app/secret.go b/cli/app/secret.go index a1d4db17..6b5da2a2 100644 --- a/cli/app/secret.go +++ b/cli/app/secret.go @@ -202,7 +202,7 @@ environment. Typically, you can let Abra generate them for you on app creation } var isRecipeSecret bool - for secretName, _ := range secrets { + for secretName := range secrets { if secretName == name { isRecipeSecret = true } -- 2.49.0 From 34d2e3b092f0d852c9b1dd23b8db156418e1af4c Mon Sep 17 00:00:00 2001 From: decentral1se Date: Mon, 18 Aug 2025 20:29:23 +0200 Subject: [PATCH 4/5] chore: go mod vendor --- vendor/coopcloud.tech/tagcmp/tagcmp.go | 2 +- .../charmbracelet/colorprofile/.golangci.yml | 5 +- .../charmbracelet/colorprofile/README.md | 6 + .../charmbracelet/colorprofile/profile.go | 385 ++---------------- vendor/modules.txt | 8 +- 5 files changed, 58 insertions(+), 348 deletions(-) diff --git a/vendor/coopcloud.tech/tagcmp/tagcmp.go b/vendor/coopcloud.tech/tagcmp/tagcmp.go index 2498a56b..c9919089 100644 --- a/vendor/coopcloud.tech/tagcmp/tagcmp.go +++ b/vendor/coopcloud.tech/tagcmp/tagcmp.go @@ -290,7 +290,7 @@ func patternMatches(tag string) error { for _, pattern := range unsupported { if match, _ := regexp.Match(pattern, []byte(tag)); match { - return fmt.Errorf("'%s' is not supported (%s)", tag, pattern) + return fmt.Errorf("version %s is not supported (matched: %s)", tag, pattern) } } diff --git a/vendor/github.com/charmbracelet/colorprofile/.golangci.yml b/vendor/github.com/charmbracelet/colorprofile/.golangci.yml index be61d89b..929cb0ac 100644 --- a/vendor/github.com/charmbracelet/colorprofile/.golangci.yml +++ b/vendor/github.com/charmbracelet/colorprofile/.golangci.yml @@ -7,7 +7,6 @@ linters: - exhaustive - goconst - godot - - godox - gomoddirectives - goprintffuncname - gosec @@ -27,6 +26,10 @@ linters: - whitespace - wrapcheck exclusions: + rules: + - text: '(slog|log)\.\w+' + linters: + - noctx generated: lax presets: - common-false-positives diff --git a/vendor/github.com/charmbracelet/colorprofile/README.md b/vendor/github.com/charmbracelet/colorprofile/README.md index c72b2f4b..2afffce0 100644 --- a/vendor/github.com/charmbracelet/colorprofile/README.md +++ b/vendor/github.com/charmbracelet/colorprofile/README.md @@ -82,6 +82,12 @@ w.Profile = colorprofile.NoTTY fmt.Fprintf(w, myFancyANSI) // not as fancy ``` +## Contributing + +See [contributing][contribute]. + +[contribute]: https://github.com/charmbracelet/colorprofile/contribute + ## Feedback We’d love to hear your thoughts on this project. Feel free to drop us a note! diff --git a/vendor/github.com/charmbracelet/colorprofile/profile.go b/vendor/github.com/charmbracelet/colorprofile/profile.go index 2bcb37c6..4eb77ca4 100644 --- a/vendor/github.com/charmbracelet/colorprofile/profile.go +++ b/vendor/github.com/charmbracelet/colorprofile/profile.go @@ -2,10 +2,9 @@ package colorprofile import ( "image/color" - "math" + "sync" "github.com/charmbracelet/x/ansi" - "github.com/lucasb-eyer/go-colorful" ) // Profile is a color profile: NoTTY, Ascii, ANSI, ANSI256, or TrueColor. @@ -41,359 +40,61 @@ func (p Profile) String() string { return "Unknown" } +var ( + cache = map[Profile]map[color.Color]color.Color{ + ANSI256: {}, + ANSI: {}, + } + mu sync.RWMutex +) + // Convert transforms a given Color to a Color supported within the Profile. -func (p Profile) Convert(c color.Color) color.Color { +func (p Profile) Convert(c color.Color) (cc color.Color) { if p <= Ascii { return nil } + if p == TrueColor { + // TrueColor is a passthrough. + return c + } - switch c := c.(type) { + // Do we have a cached color for this profile and color? + mu.RLock() + if c != nil && cache[p] != nil { + if cc, ok := cache[p][c]; ok { + mu.RUnlock() + return cc + } + } + mu.RUnlock() + + // If we don't have a cached color, we need to convert it and cache it. + defer func() { + mu.Lock() + if cc != nil && cache[p] != nil { + if _, ok := cache[p][c]; !ok { + cache[p][c] = cc + } + } + mu.Unlock() + }() + + switch c.(type) { case ansi.BasicColor: return c - case ansi.ExtendedColor: + case ansi.IndexedColor: if p == ANSI { - return ansi256ToANSIColor(c) + return ansi.Convert16(c) } return c - case ansi.TrueColor, color.Color: - h, ok := colorful.MakeColor(c) - if !ok { - return nil - } - if p != TrueColor { - ac := hexToANSI256Color(h) - if p == ANSI { - return ansi256ToANSIColor(ac) - } - return ac + default: + if p == ANSI256 { + return ansi.Convert256(c) + } else if p == ANSI { + return ansi.Convert16(c) } return c } - - return c -} - -func hexToANSI256Color(c colorful.Color) ansi.ExtendedColor { - v2ci := func(v float64) int { - if v < 48 { - return 0 - } - if v < 115 { - return 1 - } - return int((v - 35) / 40) - } - - // Calculate the nearest 0-based color index at 16..231 - r := v2ci(c.R * 255.0) // 0..5 each - g := v2ci(c.G * 255.0) - b := v2ci(c.B * 255.0) - ci := 36*r + 6*g + b /* 0..215 */ - - // Calculate the represented colors back from the index - i2cv := [6]int{0, 0x5f, 0x87, 0xaf, 0xd7, 0xff} - cr := i2cv[r] // r/g/b, 0..255 each - cg := i2cv[g] - cb := i2cv[b] - - // Calculate the nearest 0-based gray index at 232..255 - var grayIdx int - average := (cr + cg + cb) / 3 - if average > 238 { - grayIdx = 23 - } else { - grayIdx = (average - 3) / 10 // 0..23 - } - gv := 8 + 10*grayIdx // same value for r/g/b, 0..255 - - // Return the one which is nearer to the original input rgb value - c2 := colorful.Color{R: float64(cr) / 255.0, G: float64(cg) / 255.0, B: float64(cb) / 255.0} - g2 := colorful.Color{R: float64(gv) / 255.0, G: float64(gv) / 255.0, B: float64(gv) / 255.0} - colorDist := c.DistanceHSLuv(c2) - grayDist := c.DistanceHSLuv(g2) - - if colorDist <= grayDist { - return ansi.ExtendedColor(16 + ci) //nolint:gosec - } - return ansi.ExtendedColor(232 + grayIdx) //nolint:gosec -} - -func ansi256ToANSIColor(c ansi.ExtendedColor) ansi.BasicColor { - var r int - md := math.MaxFloat64 - - h, _ := colorful.Hex(ansiHex[c]) - for i := 0; i <= 15; i++ { - hb, _ := colorful.Hex(ansiHex[i]) - d := h.DistanceHSLuv(hb) - - if d < md { - md = d - r = i - } - } - - return ansi.BasicColor(r) //nolint:gosec -} - -// RGB values of ANSI colors (0-255). -var ansiHex = []string{ - "#000000", - "#800000", - "#008000", - "#808000", - "#000080", - "#800080", - "#008080", - "#c0c0c0", - "#808080", - "#ff0000", - "#00ff00", - "#ffff00", - "#0000ff", - "#ff00ff", - "#00ffff", - "#ffffff", - "#000000", - "#00005f", - "#000087", - "#0000af", - "#0000d7", - "#0000ff", - "#005f00", - "#005f5f", - "#005f87", - "#005faf", - "#005fd7", - "#005fff", - "#008700", - "#00875f", - "#008787", - "#0087af", - "#0087d7", - "#0087ff", - "#00af00", - "#00af5f", - "#00af87", - "#00afaf", - "#00afd7", - "#00afff", - "#00d700", - "#00d75f", - "#00d787", - "#00d7af", - "#00d7d7", - "#00d7ff", - "#00ff00", - "#00ff5f", - "#00ff87", - "#00ffaf", - "#00ffd7", - "#00ffff", - "#5f0000", - "#5f005f", - "#5f0087", - "#5f00af", - "#5f00d7", - "#5f00ff", - "#5f5f00", - "#5f5f5f", - "#5f5f87", - "#5f5faf", - "#5f5fd7", - "#5f5fff", - "#5f8700", - "#5f875f", - "#5f8787", - "#5f87af", - "#5f87d7", - "#5f87ff", - "#5faf00", - "#5faf5f", - "#5faf87", - "#5fafaf", - "#5fafd7", - "#5fafff", - "#5fd700", - "#5fd75f", - "#5fd787", - "#5fd7af", - "#5fd7d7", - "#5fd7ff", - "#5fff00", - "#5fff5f", - "#5fff87", - "#5fffaf", - "#5fffd7", - "#5fffff", - "#870000", - "#87005f", - "#870087", - "#8700af", - "#8700d7", - "#8700ff", - "#875f00", - "#875f5f", - "#875f87", - "#875faf", - "#875fd7", - "#875fff", - "#878700", - "#87875f", - "#878787", - "#8787af", - "#8787d7", - "#8787ff", - "#87af00", - "#87af5f", - "#87af87", - "#87afaf", - "#87afd7", - "#87afff", - "#87d700", - "#87d75f", - "#87d787", - "#87d7af", - "#87d7d7", - "#87d7ff", - "#87ff00", - "#87ff5f", - "#87ff87", - "#87ffaf", - "#87ffd7", - "#87ffff", - "#af0000", - "#af005f", - "#af0087", - "#af00af", - "#af00d7", - "#af00ff", - "#af5f00", - "#af5f5f", - "#af5f87", - "#af5faf", - "#af5fd7", - "#af5fff", - "#af8700", - "#af875f", - "#af8787", - "#af87af", - "#af87d7", - "#af87ff", - "#afaf00", - "#afaf5f", - "#afaf87", - "#afafaf", - "#afafd7", - "#afafff", - "#afd700", - "#afd75f", - "#afd787", - "#afd7af", - "#afd7d7", - "#afd7ff", - "#afff00", - "#afff5f", - "#afff87", - "#afffaf", - "#afffd7", - "#afffff", - "#d70000", - "#d7005f", - "#d70087", - "#d700af", - "#d700d7", - "#d700ff", - "#d75f00", - "#d75f5f", - "#d75f87", - "#d75faf", - "#d75fd7", - "#d75fff", - "#d78700", - "#d7875f", - "#d78787", - "#d787af", - "#d787d7", - "#d787ff", - "#d7af00", - "#d7af5f", - "#d7af87", - "#d7afaf", - "#d7afd7", - "#d7afff", - "#d7d700", - "#d7d75f", - "#d7d787", - "#d7d7af", - "#d7d7d7", - "#d7d7ff", - "#d7ff00", - "#d7ff5f", - "#d7ff87", - "#d7ffaf", - "#d7ffd7", - "#d7ffff", - "#ff0000", - "#ff005f", - "#ff0087", - "#ff00af", - "#ff00d7", - "#ff00ff", - "#ff5f00", - "#ff5f5f", - "#ff5f87", - "#ff5faf", - "#ff5fd7", - "#ff5fff", - "#ff8700", - "#ff875f", - "#ff8787", - "#ff87af", - "#ff87d7", - "#ff87ff", - "#ffaf00", - "#ffaf5f", - "#ffaf87", - "#ffafaf", - "#ffafd7", - "#ffafff", - "#ffd700", - "#ffd75f", - "#ffd787", - "#ffd7af", - "#ffd7d7", - "#ffd7ff", - "#ffff00", - "#ffff5f", - "#ffff87", - "#ffffaf", - "#ffffd7", - "#ffffff", - "#080808", - "#121212", - "#1c1c1c", - "#262626", - "#303030", - "#3a3a3a", - "#444444", - "#4e4e4e", - "#585858", - "#626262", - "#6c6c6c", - "#767676", - "#808080", - "#8a8a8a", - "#949494", - "#9e9e9e", - "#a8a8a8", - "#b2b2b2", - "#bcbcbc", - "#c6c6c6", - "#d0d0d0", - "#dadada", - "#e4e4e4", - "#eeeeee", } diff --git a/vendor/modules.txt b/vendor/modules.txt index 5e1306c3..b6d67d59 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1,4 +1,4 @@ -# coopcloud.tech/tagcmp v0.0.0-20250427094623-9ea3bbbde8e5 +# coopcloud.tech/tagcmp v0.0.0-20250818180036-0ec1b205b5ca ## explicit; go 1.16 coopcloud.tech/tagcmp # dario.cat/mergo v1.0.2 @@ -70,7 +70,7 @@ github.com/cespare/xxhash/v2 # github.com/charmbracelet/bubbletea v1.3.6 ## explicit; go 1.23.0 github.com/charmbracelet/bubbletea -# github.com/charmbracelet/colorprofile v0.3.1 +# github.com/charmbracelet/colorprofile v0.3.2 ## explicit; go 1.23.0 github.com/charmbracelet/colorprofile # github.com/charmbracelet/lipgloss v1.1.0 @@ -671,8 +671,8 @@ golang.org/x/crypto/ssh golang.org/x/crypto/ssh/agent golang.org/x/crypto/ssh/internal/bcrypt_pbkdf golang.org/x/crypto/ssh/knownhosts -# golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 -## explicit; go 1.23.0 +# golang.org/x/exp v0.0.0-20250813145105-42675adae3e6 +## explicit; go 1.24.0 golang.org/x/exp/slices golang.org/x/exp/slog golang.org/x/exp/slog/internal -- 2.49.0 From 81c28e30062a26eb479d50d236dd963640b33a25 Mon Sep 17 00:00:00 2001 From: decentral1se Date: Mon, 18 Aug 2025 20:45:47 +0200 Subject: [PATCH 5/5] test: appease the tester --- cli/internal/deploy.go | 6 +++--- pkg/upstream/stack/remove.go | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cli/internal/deploy.go b/cli/internal/deploy.go index 481e7a63..d687c49f 100644 --- a/cli/internal/deploy.go +++ b/cli/internal/deploy.go @@ -146,7 +146,7 @@ func getDeployType(currentVersion, newVersion string) string { func PostCmds(cl *dockerClient.Client, app appPkg.App, commands string) error { if _, err := os.Stat(app.Recipe.AbraShPath); err != nil { if os.IsNotExist(err) { - return fmt.Errorf(fmt.Sprintf("%s does not exist for %s?", app.Recipe.AbraShPath, app.Name)) + return fmt.Errorf("%s does not exist for %s?", app.Recipe.AbraShPath, app.Name) } return err } @@ -154,7 +154,7 @@ func PostCmds(cl *dockerClient.Client, app appPkg.App, commands string) error { for _, command := range strings.Split(commands, "|") { commandParts := strings.Split(command, " ") if len(commandParts) < 2 { - return fmt.Errorf(fmt.Sprintf("not enough arguments: %s", command)) + return fmt.Errorf("not enough arguments: %s", command) } targetServiceName := commandParts[0] cmdName := commandParts[1] @@ -181,7 +181,7 @@ func PostCmds(cl *dockerClient.Client, app appPkg.App, commands string) error { } if !matchingServiceName { - return fmt.Errorf(fmt.Sprintf("no service %s for %s?", targetServiceName, app.Name)) + return fmt.Errorf("no service %s for %s?", targetServiceName, app.Name) } log.Debugf("running command %s %s within the context of %s_%s", cmdName, parsedCmdArgs, app.StackName(), targetServiceName) diff --git a/pkg/upstream/stack/remove.go b/pkg/upstream/stack/remove.go index a6f5d1ef..a2fde29d 100644 --- a/pkg/upstream/stack/remove.go +++ b/pkg/upstream/stack/remove.go @@ -88,7 +88,7 @@ func RunRemove(ctx context.Context, client *apiclient.Client, opts Remove) error } if len(errs) > 0 { - errCh <- errors.Errorf(strings.Join(errs, "\n")) + errCh <- errors.New(strings.Join(errs, "\n")) return } -- 2.49.0