Repository: cashapp/hermit
Pull request #450: chore(deps): Update to kong@1.9.0
Author: login: boblail
Created: 2025-03-10T16:44:10Z | Merged: 2025-03-12T00:05:45Z

This pull request has 3 commits. Kong v0.9.0 has a couple of breaking changes for `hermit`, so:
1. The first commit updates from Kong 0.5.0 → 0.8.1 safely
2. The second commit updates to Kong 0.9.0 and sorts out the changes
3. The third commit updates from Kong 0.9.0 → 1.9.0 safely

- [x] (Ideally I'd merge https://github.com/alecthomas/kong/pull/507 and then bump this to the next version)

fixes #444

Linked issue #444: Upgrade Hermit to Use Kong v1.1.0+
## Description

Hermit currently depends on Kong v0.5.0, but our internal Hermit setup depends on both Hermit and another package that requires Kong v1.1.0, leading to compatibility issues. Therefore, Hermit should be updated to support Kong v1.1.0 (or the latest one)


Diff:
diff --git a/app/commands.go b/app/commands.go
index 3bea2f2e1..80d5a5a9e 100644
--- a/app/commands.go
+++ b/app/commands.go
@@ -81,7 +81,6 @@ type activated struct {
 	Uninstall  uninstallCmd         `cmd:"" help:"Uninstall packages." group:"env"`
 	Upgrade    upgradeCmd           `cmd:"" help:"Upgrade packages" group:"env"`
 	List       listCmd              `cmd:"" help:"List local packages." group:"env"`
-	Exec       execCmd              `cmd:"" help:"Directly execute a binary in a package." group:"env"`
 	Env        envCmd               `cmd:"" help:"Manage environment variables." group:"env"`
 	Validate   activatedValidateCmd `cmd:"" help:"Hermit validation." group:"global"`
 	AddDigests addDigestsCmd        `cmd:"" help:"Add digests for all versions/platforms to the input manifest files." group:"global"`
diff --git a/go.mod b/go.mod
index b298f8ab9..5d94dbede 100644
--- a/go.mod
+++ b/go.mod
@@ -4,12 +4,12 @@ go 1.23
 
 require (
 	github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d
-	github.com/alecthomas/assert/v2 v2.1.0
+	github.com/alecthomas/assert/v2 v2.11.0
 	github.com/alecthomas/colour v0.1.0
-	github.com/alecthomas/hcl v0.5.4
-	github.com/alecthomas/kong v0.5.0
+	github.com/alecthomas/hcl v0.5.5
+	github.com/alecthomas/kong v1.9.0
 	github.com/alecthomas/participle/v2 v2.0.0-beta.5
-	github.com/alecthomas/repr v0.1.0
+	github.com/alecthomas/repr v0.4.0
 	github.com/andybalholm/cascadia v1.3.2
 	github.com/antchfx/htmlquery v1.2.4
 	github.com/antchfx/xpath v1.2.0
@@ -18,7 +18,6 @@ require (
 	github.com/creack/pty v1.1.18
 	github.com/gabriel-vasile/mimetype v1.4.2-0.20220907190543-d9466a5f6b0e
 	github.com/gobwas/glob v0.2.3
-	github.com/gofrs/flock v0.8.1
 	github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51
 	github.com/klauspost/compress v1.15.1
 	github.com/mattn/go-isatty v0.0.14
@@ -32,6 +31,7 @@ require (
 	github.com/willdonnelly/passwd v0.0.0-20141013001024-7935dab3074c
 	github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8
 	golang.org/x/net v0.9.0
+	golang.org/x/sync v0.3.0
 	golang.org/x/sys v0.7.0
 	golang.org/x/term v0.7.0
 	howett.net/plist v1.0.0
@@ -45,14 +45,11 @@ require (
 	github.com/hashicorp/go-multierror v1.1.1 // indirect
 	github.com/hexops/gotextdiff v1.0.3 // indirect
 	github.com/kr/text v0.2.0 // indirect
-	github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
 	github.com/pkg/errors v0.9.1 // indirect
 	github.com/riywo/loginshell v0.0.0-20200815045211-7d26008be1ab // indirect
 	github.com/saracen/go7z-fixtures v0.0.0-20190623165746-aa6b8fba1d2f // indirect
 	github.com/saracen/solidblock v0.0.0-20190426153529-45df20abab6f // indirect
 	github.com/ulikunitz/xz v0.5.10 // indirect
 	golang.org/x/crypto v0.0.0-20220214200702-86341886e292 // indirect
-	golang.org/x/sync v0.3.0 // indirect
 	golang.org/x/text v0.9.0 // indirect
-	gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect
 )
diff --git a/go.sum b/go.sum
index ba264b883..b283ce86c 100644
--- a/go.sum
+++ b/go.sum
@@ -3,19 +3,20 @@ github.com/DataDog/zstd v1.5.0 h1:+K/VEwIAaPcHiMtQvpLD4lqW7f0Gk3xdYZmI1hD+CXo=
 github.com/DataDog/zstd v1.5.0/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw=
 github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8=
 github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo=
-github.com/alecthomas/assert/v2 v2.1.0 h1:tbredtNcQnoSd3QBhQWI7QZ3XHOVkw1Moklp2ojoH/0=
-github.com/alecthomas/assert/v2 v2.1.0/go.mod h1:b/+1DI2Q6NckYi+3mXyH3wFb8qG37K/DuK80n7WefXA=
+github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
+github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
 github.com/alecthomas/colour v0.1.0 h1:nOE9rJm6dsZ66RGWYSFrXw461ZIt9A6+nHgL7FRrDUk=
 github.com/alecthomas/colour v0.1.0/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0=
-github.com/alecthomas/hcl v0.5.4 h1:4Z5dzFRpsXaphMVxJSPSdWP8Wqi2RJ+85WLdx3A0I0k=
-github.com/alecthomas/hcl v0.5.4/go.mod h1:I7ywm4p2YDXBNdEItWJ5UhhRvO/IH2RAgRhlovB6kX0=
-github.com/alecthomas/kong v0.5.0 h1:u8Kdw+eeml93qtMZ04iei0CFYve/WPcA5IFh+9wSskE=
-github.com/alecthomas/kong v0.5.0/go.mod h1:uzxf/HUh0tj43x1AyJROl3JT7SgsZ5m+icOv1csRhc0=
+github.com/alecthomas/hcl v0.5.5 h1:NvSiDRO6IvzZp+cfGVost6l6BAjYtWH++G2zZd5sqk4=
+github.com/alecthomas/hcl v0.5.5/go.mod h1:XAFzM7e+MoxvgApYUKiw0+C5hm22BYep3rWpAXJUT+M=
+github.com/alecthomas/kong v1.8.1 h1:6aamvWBE/REnR/BCq10EcozmcpUPc5aGI1lPAWdB0EE=
+github.com/alecthomas/kong v1.8.1/go.mod h1:p2vqieVMeTAnaC83txKtXe8FLke2X07aruPWXyMPQrU=
+github.com/alecthomas/kong v1.9.0 h1:Wgg0ll5Ys7xDnpgYBuBn/wPeLGAuK0NvYmEcisJgrIs=
+github.com/alecthomas/kong v1.9.0/go.mod h1:p2vqieVMeTAnaC83txKtXe8FLke2X07aruPWXyMPQrU=
 github.com/alecthomas/participle/v2 v2.0.0-beta.5 h1:y6dsSYVb1G5eK6mgmy+BgI3Mw35a3WghArZ/Hbebrjo=
 github.com/alecthomas/participle/v2 v2.0.0-beta.5/go.mod h1:RC764t6n4L8D8ITAJv0qdokritYSNR3wV5cVwmIEaMM=
-github.com/alecthomas/repr v0.0.0-20210801044451-80ca428c5142/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8=
-github.com/alecthomas/repr v0.1.0 h1:ENn2e1+J3k09gyj2shc0dHr/yjaWSHRlrJ4DPMevDqE=
-github.com/alecthomas/repr v0.1.0/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8=
+github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=
+github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
 github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss=
 github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU=
 github.com/antchfx/htmlquery v1.2.4 h1:qLteofCMe/KGovBI6SQgmou2QNyedFUW+pE+BpeZ494=
@@ -36,8 +37,6 @@ github.com/gabriel-vasile/mimetype v1.4.2-0.20220907190543-d9466a5f6b0e h1:FWNa9
 github.com/gabriel-vasile/mimetype v1.4.2-0.20220907190543-d9466a5f6b0e/go.mod h1:05Vi0w3Y9c/lNvJOdmIwvrrAhX3rYhfQQCaf9VJcv7M=
 github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
 github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
-github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw=
-github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
 github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
 github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -65,17 +64,10 @@ github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9
 github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
 github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc=
 github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg=
-github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
-github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
-github.com/otiai10/copy v1.7.0 h1:hVoPiN+t+7d2nzzwMiDHPSOogsWAStewq3TwU05+clE=
-github.com/otiai10/copy v1.7.0/go.mod h1:rmRl6QPdJj6EiUqXQ/4Nn2lLXoNQjFCQbbNrxgc/t3U=
 github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU=
 github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w=
-github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE=
-github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs=
-github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo=
-github.com/otiai10/mint v1.3.3 h1:7JgpsBaN0uMkyju4tbYHu0mnM55hNKVYLsXmwr15NQI=
-github.com/otiai10/mint v1.3.3/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc=
+github.com/otiai10/mint v1.5.1 h1:XaPLeE+9vGbuyEHem1JNk3bYc7KKqyI/na0/mLd/Kks=
+github.com/otiai10/mint v1.5.1/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
@@ -168,8 +160,6 @@ golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
-gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/manifest/resolver_test.go b/manifest/resolver_test.go
index 57abdb2a5..4dd4e90e4 100644
--- a/manifest/resolver_test.go
+++ b/manifest/resolver_test.go
@@ -337,8 +337,8 @@ func TestResolver_Resolve(t *testing.T) {
 					gotPkg.FS = nil
 				}
 				assert.Equal(t,
-					repr.String(tt.wantPkg, repr.Indent("  "), repr.Hide(hcl.Position{})),
-					repr.String(gotPkg, repr.Indent("  "), repr.Hide(hcl.Position{})))
+					repr.String(tt.wantPkg, repr.Indent("  "), repr.Hide[hcl.Position]()),
+					repr.String(gotPkg, repr.Indent("  "), repr.Hide[hcl.Position]()))
 			}
 			wantErrors := tt.manifestErrors
 			if wantErrors == nil {


Reviews:
user: login: copilot-pull-request-reviewer[bot]
body: ## PR Overview

This PR updates the dependency on Kong from v0.5.0 all the way through to v1.8.1 while handling breaking changes along the way. Key changes include:
- Updating the test output formatting in manifest/resolver_test.go to align with new API expectations.
- Removing the exec command from the activated command struct in app/commands.go.

### Reviewed Changes

| File                         | Description                                                                |
| ---------------------------- | -------------------------------------------------------------------------- |
| manifest/resolver_test.go    | Updated repr.Hide usage to match the new generic API style.                |
| app/commands.go              | Removed the exec command to reflect changes in the underlying dependency.  |

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

<details>
<summary>Comments suppressed due to low confidence (1)</summary>

**manifest/resolver_test.go:340**
* Verify that the updated usage of repr.Hide[hcl.Position]() is compatible with the updated version of Kong. If the API now expects generic instantiation rather than a struct instance, please confirm that this change behaves as intended in all tests.
```
repr.String(tt.wantPkg, repr.Indent("  "), repr.Hide[hcl.Position]())
```
</details>


state: COMMENTED
author_association: NONE
submitted_at: 2025-03-10T16:45:02Z
user: login: boblail
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-10T16:45:57Z
user: login: wsutina
body: 👍 LGTM -- Tested this with our private hermit and I can still install packages but I'd love @alecthomas confirmation on the removal of `execCmd` ([here](https://github.com/cashapp/hermit/pull/450/files#r1987669076)) 

And happy to wait for https://github.com/alecthomas/kong/pull/507 and then bump this to the next version
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-03-11T00:32:32Z
user: login: alecthomas
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-11T02:02:51Z
user: login: boblail
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-11T05:01:24Z
user: login: boblail
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-11T05:03:30Z
user: login: boblail
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-11T05:35:11Z
user: login: alecthomas
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-11T05:44:14Z

Review comments:
diff_hunk: @@ -81,7 +81,6 @@ type activated struct {
 	Uninstall  uninstallCmd         `cmd:"" help:"Uninstall packages." group:"env"`
 	Upgrade    upgradeCmd           `cmd:"" help:"Upgrade packages" group:"env"`
 	List       listCmd              `cmd:"" help:"List local packages." group:"env"`
-	Exec       execCmd              `cmd:"" help:"Directly execute a binary in a package." group:"env"`
path: app/commands.go
user: login: boblail
body: `type activated` inherits `Exec` from type `cliBase`.

On Hermit 0.9.0+ it is an error to define the command twice.

Both commands are implemented by `execCmd` so I removed this one.

But there is one difference: This one includes `group:"env"` and the inherited one does not. Will that matter?

(The integration tests all passed for me locally.)
created_at: 2025-03-10T16:45:57Z
author_association: CONTRIBUTOR
diff_hunk: @@ -81,7 +81,6 @@ type activated struct {
 	Uninstall  uninstallCmd         `cmd:"" help:"Uninstall packages." group:"env"`
 	Upgrade    upgradeCmd           `cmd:"" help:"Upgrade packages" group:"env"`
 	List       listCmd              `cmd:"" help:"List local packages." group:"env"`
-	Exec       execCmd              `cmd:"" help:"Directly execute a binary in a package." group:"env"`
path: app/commands.go
user: login: alecthomas
body: "exec" is only valid in an activated environment, so I think it should be this one that is kept, not the other one. Was there some reason to do it the other way?
created_at: 2025-03-11T02:02:30Z
author_association: COLLABORATOR
diff_hunk: @@ -81,7 +81,6 @@ type activated struct {
 	Uninstall  uninstallCmd         `cmd:"" help:"Uninstall packages." group:"env"`
 	Upgrade    upgradeCmd           `cmd:"" help:"Upgrade packages" group:"env"`
 	List       listCmd              `cmd:"" help:"List local packages." group:"env"`
-	Exec       execCmd              `cmd:"" help:"Directly execute a binary in a package." group:"env"`
path: app/commands.go
user: login: boblail
body: I only did it the other way b/c I wasn't sure what the intent was — and since `activated` is composed of `cliBase`, it would inherit `exec` and this _shouldn't_ alter any behavior.

I'll try the other way, though, and see how the integration tests go
created_at: 2025-03-11T05:01:24Z
author_association: CONTRIBUTOR
diff_hunk: @@ -81,7 +81,6 @@ type activated struct {
 	Uninstall  uninstallCmd         `cmd:"" help:"Uninstall packages." group:"env"`
 	Upgrade    upgradeCmd           `cmd:"" help:"Upgrade packages" group:"env"`
 	List       listCmd              `cmd:"" help:"List local packages." group:"env"`
-	Exec       execCmd              `cmd:"" help:"Directly execute a binary in a package." group:"env"`
path: app/commands.go
user: login: boblail
body: Done. If this looks good, I'll squash that `fixup!` commit in before merging
- [x] 👆  Do that
created_at: 2025-03-11T05:03:30Z
author_association: CONTRIBUTOR
diff_hunk: @@ -81,7 +81,6 @@ type activated struct {
 	Uninstall  uninstallCmd         `cmd:"" help:"Uninstall packages." group:"env"`
 	Upgrade    upgradeCmd           `cmd:"" help:"Upgrade packages" group:"env"`
 	List       listCmd              `cmd:"" help:"List local packages." group:"env"`
-	Exec       execCmd              `cmd:"" help:"Directly execute a binary in a package." group:"env"`
path: app/commands.go
user: login: boblail
body: Hm, @alecthomas, I get some failing integration tests if I remove `Exec` from `cliBase` instead of from `activated`.
created_at: 2025-03-11T05:35:11Z
author_association: CONTRIBUTOR
diff_hunk: @@ -81,7 +81,6 @@ type activated struct {
 	Uninstall  uninstallCmd         `cmd:"" help:"Uninstall packages." group:"env"`
 	Upgrade    upgradeCmd           `cmd:"" help:"Upgrade packages" group:"env"`
 	List       listCmd              `cmd:"" help:"List local packages." group:"env"`
-	Exec       execCmd              `cmd:"" help:"Directly execute a binary in a package." group:"env"`
path: app/commands.go
user: login: alecthomas
body: Kk thanks for trying anyway
created_at: 2025-03-11T05:44:14Z
author_association: COLLABORATOR

PR comments:
user: login: wsutina
created_at: 2025-03-10T23:45:46Z
body: Related to https://github.com/cashapp/hermit/issues/444

author_association: CONTRIBUTOR
user: login: alecthomas
created_at: 2025-03-11T07:04:23Z
body: I've tagged kong@v1.9.0 with the ExitCode changes
author_association: COLLABORATOR
user: login: boblail
created_at: 2025-03-11T14:33:08Z
body: @alecthomas, thanks! I bumped to `kong@1.9.0` and dropped the fixup commit
author_association: CONTRIBUTOR