diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 7b705ee6..927d045f 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -1,5 +1,96 @@ # Release Notes +# 9.19.0 (2026-04-27) + +## ๐Ÿš€ Highlights + +### FIPS-Compatible Script Helper + +`Script` now supports a FIPS-safe execution mode that avoids client-side SHA-1 computation, which is blocked in strict FIPS environments. A new `NewScriptServerSHA` constructor uses `SCRIPT LOAD` to obtain and cache the digest from the server, then runs commands via `EVALSHA`/`EVALSHA_RO`. Falls back to `EVAL`/`EVALRO` if loading fails, and transparently retries once on `NOSCRIPT`. The default behavior is unchanged for existing users. + +([#3700](https://github.com/redis/go-redis/pull/3700)) by [@chaitanyabodlapati](https://github.com/chaitanyabodlapati) + +### FT.AGGREGATE Step-Based Pipeline Builder + +Added a new step-based `FT.AGGREGATE` pipeline API via `FTAggregateOptions.Steps`, allowing `LOAD`, `APPLY`, `GROUPBY`, and `SORTBY` (with per-step `MAX`) to be repeated and interleaved in arbitrary order โ€” matching Redis's native multi-stage aggregation semantics. The legacy `Load`/`Apply`/`GroupBy`/`SortBy`/`SortByMax` fields are now deprecated. + +([#3782](https://github.com/redis/go-redis/pull/3782)) by [@ndyakov](https://github.com/ndyakov) + +### Raw RESP Protocol Access + +Added `DoRaw` and `DoRawWriteTo` methods for executing arbitrary commands and reading the raw RESP response. Useful for proxying, custom protocol inspection, and working with commands not yet wrapped by go-redis. + +([#3713](https://github.com/redis/go-redis/pull/3713)) by [@ofekshenawa](https://github.com/ofekshenawa) + +### Configurable Dial Retry Backoff + +Added `DialerRetryBackoff` option (plumbed through `Options`, `ClusterOptions`, `RingOptions`, `FailoverOptions`) to let callers customize the delay between failed dial attempts. Helpers `DialRetryBackoffConstant` and `DialRetryBackoffExponential` (with jitter and cap) are provided out of the box. Dial timeout is now also applied **per attempt** rather than across all retries. + +([#3706](https://github.com/redis/go-redis/pull/3706), [#3705](https://github.com/redis/go-redis/pull/3705)) by [@mwhooker](https://github.com/mwhooker) + +## โœจ New Features + +- **FT.AGGREGATE Steps**: Step-based pipeline builder for `FT.AGGREGATE` with support for repeated/interleaved `LOAD`, `APPLY`, `GROUPBY`, and `SORTBY` stages ([#3782](https://github.com/redis/go-redis/pull/3782)) by [@ndyakov](https://github.com/ndyakov) +- **VectorSet commands**: Added `VISMEMBER` and `WITHATTRIBS` support ([#3753](https://github.com/redis/go-redis/pull/3753)) by [@romanpovol](https://github.com/romanpovol) +- **FIPS-safe Script**: `NewScriptServerSHA` uses `SCRIPT LOAD` to obtain the digest from the server, avoiding client-side SHA-1 ([#3700](https://github.com/redis/go-redis/pull/3700)) by [@chaitanyabodlapati](https://github.com/chaitanyabodlapati) +- **Raw RESP access**: `DoRaw` and `DoRawWriteTo` for raw RESP protocol access ([#3713](https://github.com/redis/go-redis/pull/3713)) by [@ofekshenawa](https://github.com/ofekshenawa) +- **Dial retry backoff**: `DialerRetryBackoff` function option with constant and exponential helpers ([#3706](https://github.com/redis/go-redis/pull/3706)) by [@mwhooker](https://github.com/mwhooker) +- **Typed NOSCRIPT error**: Redis `NOSCRIPT` replies are now surfaced as a typed error for easier handling ([#3738](https://github.com/redis/go-redis/pull/3738)) by [@LINKIWI](https://github.com/LINKIWI) +- **PubSub ClientSetName**: Added `ClientSetName` method to `PubSub` ([#3727](https://github.com/redis/go-redis/pull/3727)) by [@Flack74](https://github.com/Flack74) +- **ReplicaOf**: New `ReplicaOf` method replaces the deprecated `SlaveOf` ([#3720](https://github.com/redis/go-redis/pull/3720)) by [@Copilot](https://github.com/apps/copilot-swe-agent) +- **HSCAN BinaryUnmarshaler**: `HScan` now supports types implementing `encoding.BinaryUnmarshaler` ([#3768](https://github.com/redis/go-redis/pull/3768)) by [@Aaditya-dubey1](https://github.com/Aaditya-dubey1) + +## ๐Ÿ› Bug Fixes + +- **Auto hostname type detection**: Improved endpoint type detection for maintenance notifications using DNS-based classification; handles empty hosts and expanded private-IP ranges ([#3789](https://github.com/redis/go-redis/pull/3789)) by [@ndyakov](https://github.com/ndyakov) +- **HELLO fallback**: Don't send `CLIENT MAINT_NOTIFICATIONS` handshake when `HELLO` fails and connection falls back to RESP2; fail fast when explicitly enabled with RESP3 ([#3788](https://github.com/redis/go-redis/pull/3788)) by [@ndyakov](https://github.com/ndyakov) +- **Dial TCP retry**: `ShouldRetry` now treats `net.OpError` with `Op == "dial"` timeout errors as safe to retry since no command was sent ([#3787](https://github.com/redis/go-redis/pull/3787)) by [@vladisa88](https://github.com/vladisa88) +- **wrappedOnClose leak**: Fixed resource leak caused by repeatedly wrapping `baseClient` close logic; replaced with a bounded, concurrency-safe named-hook registry ([#3785](https://github.com/redis/go-redis/pull/3785)) by [@ndyakov](https://github.com/ndyakov) +- **Pool Close() on stale connections**: Suppress close errors (e.g., TLS `closeNotify` timeouts) for connections already dropped by the server due to idle timeout ([#3778](https://github.com/redis/go-redis/pull/3778)) by [@ofekshenawa](https://github.com/ofekshenawa) +- **FIFO waiter ordering**: Fixed race in `ConnStateMachine.notifyWaiters` that could wake multiple waiters under a single mutex hold and violate FIFO ordering ([#3777](https://github.com/redis/go-redis/pull/3777)) by [@0x48core](https://github.com/0x48core) +- **Lua READONLY detection**: Detect `READONLY` errors embedded in Lua script error messages on read-only replicas so commands are correctly retried ([#3769](https://github.com/redis/go-redis/pull/3769)) by [@zhengjilei](https://github.com/zhengjilei) +- **VectorScoreSliceCmd RESP2**: Fixed `VSimWithScores`, `VSimWithArgsWithScores`, and `VLinksWithScores` which were broken on RESP2 connections returning flat arrays instead of maps ([#3767](https://github.com/redis/go-redis/pull/3767)) by [@Copilot](https://github.com/apps/copilot-swe-agent) +- **Closed connection handling**: Two fixes for closed connection handling in the pool ([#3764](https://github.com/redis/go-redis/pull/3764)) by [@cxljs](https://github.com/cxljs) +- **ZRangeArgs Rev**: Fixed `ZRangeArgs` with `Rev` + `ByScore`/`ByLex` incorrectly swapping `Start`/`Stop`, breaking `ZRANGESTORE` ([#3751](https://github.com/redis/go-redis/pull/3751)) by [@Copilot](https://github.com/apps/copilot-swe-agent) +- **OTel metric instrument types**: Fixed metric instrument types in `redisotel-native` ([#3743](https://github.com/redis/go-redis/pull/3743)) by [@ofekshenawa](https://github.com/ofekshenawa) +- **Options.clone() data race**: Fixed data race when cloning `Options` ([#3739](https://github.com/redis/go-redis/pull/3739)) by [@rubensayshi](https://github.com/rubensayshi) +- **Connection closure metrics**: Fixed connection closure metrics and enabled all metric groups by default in `redisotel-native` ([#3735](https://github.com/redis/go-redis/pull/3735)) by [@ofekshenawa](https://github.com/ofekshenawa) +- **OTel semconv v1.38.0**: Use metric definition from `otel/semconv/v1.38.0` in `redisotel-native` ([#3731](https://github.com/redis/go-redis/pull/3731)) by [@wzy9607](https://github.com/wzy9607) +- **SETNX semantics**: Use `SET ... NX` instead of the deprecated `SETNX` command ([#3723](https://github.com/redis/go-redis/pull/3723)) by [@ndyakov](https://github.com/ndyakov) +- **TIME keyless routing**: Mark `TIME` as a keyless command for correct cluster routing ([#3722](https://github.com/redis/go-redis/pull/3722)) by [@fatal10110](https://github.com/fatal10110) +- **Dial timeout per retry**: Dial timeout now applies per attempt instead of across all retry attempts combined ([#3705](https://github.com/redis/go-redis/pull/3705)) by [@mwhooker](https://github.com/mwhooker) +- **Cluster metrics attributes**: Fixed `pool.name` being appended per node, which corrupted and dropped user-provided custom attributes ([#3699](https://github.com/redis/go-redis/pull/3699)) by [@Jesse-Bonfire](https://github.com/Jesse-Bonfire) +- **initConn nil dereference**: Fixed nil pointer dereference and potential deadlock in `*baseClient.initConn()`; added explicit nil option guards to client constructors ([#3676](https://github.com/redis/go-redis/pull/3676)) by [@olde-ducke](https://github.com/olde-ducke) + +## โšก Performance + +- **RESP reader**: Optimized RESP reader by eliminating intermediate string allocations ([#3774](https://github.com/redis/go-redis/pull/3774)) by [@Aaditya-dubey1](https://github.com/Aaditya-dubey1) +- **Inline rendezvous hashing**: Replaced `github.com/dgryski/go-rendezvous` dependency with an in-repo implementation in `internal/hashtag`, reducing the dependency graph while preserving algorithm parity ([#3762](https://github.com/redis/go-redis/pull/3762)) by [@bigsk05](https://github.com/bigsk05) + +## ๐Ÿงช Testing & Infrastructure + +- **Release automation**: Added `repository`, `ref`, and `client-libs-test-image-tag` inputs to the `run-tests` composite action; `redis-version` is now optional so unstable builds use `REDIS_VERSION` from the Makefile ([#3749](https://github.com/redis/go-redis/pull/3749)) by [@dariaguy](https://github.com/dariaguy) +- **Go 1.24**: Updated minimum Go version to 1.24 and use `-compat=1.24` in release scripts ([#3714](https://github.com/redis/go-redis/pull/3714), [#3754](https://github.com/redis/go-redis/pull/3754)) by [@ndyakov](https://github.com/ndyakov), [@cxljs](https://github.com/cxljs) + +## ๐Ÿงฐ Maintenance + +- **Pool state machine**: Removed redundant `Conn.closed` atomic field in favor of the state machine's `StateClosed` ([#3783](https://github.com/redis/go-redis/pull/3783)) by [@cxljs](https://github.com/cxljs) +- **OTel SDK**: Updated OpenTelemetry SDK dependencies in `redisotel`/`redisotel-native` ([#3770](https://github.com/redis/go-redis/pull/3770)) by [@ndyakov](https://github.com/ndyakov) +- **Go 1.21+ built-ins**: Use `maps.Keys`, `slices.Collect`, `slices.Contains`, `clear()`, and `slices.SortFunc` instead of custom helpers ([#3758](https://github.com/redis/go-redis/pull/3758), [#3746](https://github.com/redis/go-redis/pull/3746)) by [@cxljs](https://github.com/cxljs) +- **HGetAll docs**: Added Go doc comment to `HGetAll` describing behavior and complexity ([#3776](https://github.com/redis/go-redis/pull/3776)) by [@0x48core](https://github.com/0x48core) +- **Docs links**: Fixed irrelevant docs links ([#3724](https://github.com/redis/go-redis/pull/3724)) by [@olzhas-sabiyev](https://github.com/olzhas-sabiyev) +- **Examples cleanup**: Removed throughput binary from examples ([#3733](https://github.com/redis/go-redis/pull/3733)) by [@ndyakov](https://github.com/ndyakov) + +## ๐Ÿ‘ฅ Contributors + +We'd like to thank all the contributors who worked on this release! + +[@0x48core](https://github.com/0x48core), [@Aaditya-dubey1](https://github.com/Aaditya-dubey1), [@Copilot](https://github.com/apps/copilot-swe-agent), [@Flack74](https://github.com/Flack74), [@Jesse-Bonfire](https://github.com/Jesse-Bonfire), [@LINKIWI](https://github.com/LINKIWI), [@bigsk05](https://github.com/bigsk05), [@chaitanyabodlapati](https://github.com/chaitanyabodlapati), [@cxljs](https://github.com/cxljs), [@dariaguy](https://github.com/dariaguy), [@fatal10110](https://github.com/fatal10110), [@mwhooker](https://github.com/mwhooker), [@ndyakov](https://github.com/ndyakov), [@ofekshenawa](https://github.com/ofekshenawa), [@olde-ducke](https://github.com/olde-ducke), [@olzhas-sabiyev](https://github.com/olzhas-sabiyev), [@romanpovol](https://github.com/romanpovol), [@rubensayshi](https://github.com/rubensayshi), [@vladisa88](https://github.com/vladisa88), [@wzy9607](https://github.com/wzy9607), [@zhengjilei](https://github.com/zhengjilei) + +--- + +**Full Changelog**: https://github.com/redis/go-redis/compare/v9.18.0...v9.19.0 + # 9.18.0 (2026-02-16) ## ๐Ÿš€ Highlights diff --git a/RELEASING.md b/RELEASING.md index 1115db4e..033ec100 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -1,15 +1,146 @@ # Releasing -1. Run `release.sh` script which updates versions in go.mod files and pushes a new branch to GitHub: +This document is the runbook for cutting a go-redis release. It is intended +for maintainers with write/tag access to the repository. + +For the format and style of the release notes themselves, see +[.github/RELEASE_NOTES_TEMPLATE.md](./.github/RELEASE_NOTES_TEMPLATE.md). + +## Versioning + +go-redis follows [Semantic Versioning](https://semver.org/): + +- **Patch** (`vX.Y.Z+1`) โ€” bug fixes, no API changes. +- **Minor** (`vX.Y+1.0`) โ€” backwards-compatible new features, deprecations. +- **Major** (`vX+1.0.0`) โ€” breaking changes. Coordinate with the team first. + +Pre-releases use `vX.Y.Z-beta.N` / `vX.Y.Z-rc.N`. + +## Pre-release checklist + +- [ ] Target branch is `master` and CI is green on the latest commit. +- [ ] All PRs intended for this release are merged. +- [ ] There are no open issues in the release milestone (if used). +- [ ] `CHANGELOG` / release notes have been considered; dependabot-only + and doc-only changes are excluded per the template. +- [ ] Confirm the next version number and decide if it's a patch / minor / major. + +## 1. Draft the release notes + +1. Open the draft release auto-generated by + [release-drafter](.github/release-drafter-config.yml) on GitHub. +2. Prepend a new section to [`RELEASE-NOTES.md`](./RELEASE-NOTES.md) using + [`.github/RELEASE_NOTES_TEMPLATE.md`](./.github/RELEASE_NOTES_TEMPLATE.md) + as the format. Keep the file in chronological order (newest first). +3. Pick 3โ€“5 **Highlights** โ€” the most user-facing, impactful changes. +4. Remove dependabot bumps and doc-only typo fixes from the lists. +5. Verify every PR has a contributor attribution and link. +6. Open a PR with just the release-notes change if you want review before + bumping versions, otherwise include it in the release PR below. + +## 2. Bump versions and open the release PR + +Create a release branch from `master`: ```shell -TAG=v1.0.0 ./scripts/release.sh +git checkout master && git pull --ff-only +git checkout -b release/vX.Y.Z ``` -2. Open a pull request and wait for the build to finish. - -3. Merge the pull request and run `tag.sh` to create tags for packages: +Run the release script on that branch: ```shell -TAG=v1.0.0 ./scripts/tag.sh +TAG=vX.Y.Z ./scripts/release.sh ``` + +What the script does (and explicitly does **not** do): + +- โœ… Validates `TAG` matches the semver regex and isn't already a git tag. +- โœ… Rewrites every `redis/go-redis*` line in every sub-module `go.mod` to + point at the new `TAG`. Trailing `// indirect` markers are preserved. +- โœ… Runs `go mod tidy -compat=1.24` in each sub-module. +- โœ… Updates the return value in [`version.go`](./version.go). +- โŒ Does **not** switch branches (runs in your current branch). +- โŒ Does **not** require a clean working tree (so you can mix it with + release-notes edits in the same branch). +- โŒ Does **not** commit, tag, or push anything. + +Review and commit the changes yourself: + +```shell +git diff # sanity-check the bumps +git add -u +git commit -m "chore: release vX.Y.Z" +git push origin release/vX.Y.Z +``` + +Then on GitHub: + +- [ ] Open a PR from `release/vX.Y.Z` into `master`. +- [ ] Wait for all required CI checks (build, golangci-lint, spellcheck, + doctests, e2e where applicable) to pass. +- [ ] Get at least one maintainer approval. +- [ ] Merge the PR (use a merge commit โ€” the tag will point at the merge SHA). + +## 3. Tag the release + +After the release PR is merged, pull the latest `master` and dry-run the +tagger: + +```shell +git checkout master && git pull --ff-only +TAG=vX.Y.Z ./scripts/tag.sh vX.Y.Z +``` + +The script defaults to **dry-run** and prints the commands it would run. +Verify the output, then apply for real with `-t`: + +```shell +./scripts/tag.sh vX.Y.Z -t +``` + +This creates and pushes: +- The top-level tag `vX.Y.Z`. +- A per-module tag `/vX.Y.Z` for each public sub-module + (skipping `example/*` and `internal/*`). + +## 4. Publish the GitHub release + +1. On GitHub, open the draft release created by release-drafter. +2. Set the tag to `vX.Y.Z` and the target to `master`. +3. Replace the auto-generated body with the curated notes from + `RELEASE-NOTES.md` for this version. +4. For pre-releases, check **"Set as a pre-release"**. +5. Publish. + +## 5. Post-release + +- [ ] Verify the release appears on + [pkg.go.dev](https://pkg.go.dev/github.com/redis/go-redis/v9) within + a few minutes (trigger a fetch by visiting the version URL if needed). +- [ ] Announce on Discord (see the link in `CONTRIBUTING.md`). +- [ ] Close the release milestone if one was used. +- [ ] Open follow-up issues for anything deferred from this release. + +## Hotfix / patch release + +For an urgent fix on top of the latest release: + +1. Branch from the latest release tag: `git checkout -b hotfix/vX.Y.Z+1 vX.Y.Z`. +2. Cherry-pick (or re-apply) only the required fix commits. +3. Follow the normal release flow above with `TAG=vX.Y.Z+1`. +4. Make sure the fix is also present on `master` (forward-port if necessary). + +## Troubleshooting + +- **`release.sh` fails with "tag already exists"** โ€” the tag has already + been created. Pick the next version, or delete the local tag first if + it was created by mistake. +- **`tag.sh` reports version mismatch in a `go.mod`** โ€” a sub-module was + not updated by `release.sh`. Fix the `go.mod` manually (or re-run + `release.sh`), amend the release PR, and re-run the tagger. +- **`version.go` does not contain the tag** โ€” `release.sh` did not run or + the bump was reverted. Re-run `release.sh` on the release branch. +- **pkg.go.dev does not show the new version** โ€” visit + `https://pkg.go.dev/github.com/redis/go-redis/v9@vX.Y.Z` once to trigger + a fetch from the module proxy. diff --git a/example/cluster-mget/go.mod b/example/cluster-mget/go.mod index 88583750..b1fff1e8 100644 --- a/example/cluster-mget/go.mod +++ b/example/cluster-mget/go.mod @@ -4,7 +4,7 @@ go 1.24 replace github.com/redis/go-redis/v9 => ../.. -require github.com/redis/go-redis/v9 v9.16.0 +require github.com/redis/go-redis/v9 v9.19.0 require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect diff --git a/example/del-keys-without-ttl/go.mod b/example/del-keys-without-ttl/go.mod index 6e9695cc..dc63bef0 100644 --- a/example/del-keys-without-ttl/go.mod +++ b/example/del-keys-without-ttl/go.mod @@ -5,7 +5,7 @@ go 1.24 replace github.com/redis/go-redis/v9 => ../.. require ( - github.com/redis/go-redis/v9 v9.18.0 + github.com/redis/go-redis/v9 v9.19.0 go.uber.org/zap v1.24.0 ) diff --git a/example/digest-optimistic-locking/go.mod b/example/digest-optimistic-locking/go.mod index 25139c97..8f744282 100644 --- a/example/digest-optimistic-locking/go.mod +++ b/example/digest-optimistic-locking/go.mod @@ -4,7 +4,7 @@ go 1.24 replace github.com/redis/go-redis/v9 => ../.. -require github.com/redis/go-redis/v9 v9.18.0 +require github.com/redis/go-redis/v9 v9.19.0 require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect diff --git a/example/disable-maintnotifications/go.mod b/example/disable-maintnotifications/go.mod index 527cb6d0..6a48682e 100644 --- a/example/disable-maintnotifications/go.mod +++ b/example/disable-maintnotifications/go.mod @@ -4,7 +4,7 @@ go 1.24 replace github.com/redis/go-redis/v9 => ../.. -require github.com/redis/go-redis/v9 v9.7.0 +require github.com/redis/go-redis/v9 v9.19.0 require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect diff --git a/example/hll/go.mod b/example/hll/go.mod index 8a88c357..35566c77 100644 --- a/example/hll/go.mod +++ b/example/hll/go.mod @@ -4,7 +4,7 @@ go 1.24 replace github.com/redis/go-redis/v9 => ../.. -require github.com/redis/go-redis/v9 v9.18.0 +require github.com/redis/go-redis/v9 v9.19.0 require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect diff --git a/example/hset-struct/go.mod b/example/hset-struct/go.mod index 2cfc60c2..f131a327 100644 --- a/example/hset-struct/go.mod +++ b/example/hset-struct/go.mod @@ -6,7 +6,7 @@ replace github.com/redis/go-redis/v9 => ../.. require ( github.com/davecgh/go-spew v1.1.1 - github.com/redis/go-redis/v9 v9.18.0 + github.com/redis/go-redis/v9 v9.19.0 ) require ( diff --git a/example/lua-scripting/go.mod b/example/lua-scripting/go.mod index 61065685..3a4d3124 100644 --- a/example/lua-scripting/go.mod +++ b/example/lua-scripting/go.mod @@ -4,7 +4,7 @@ go 1.24 replace github.com/redis/go-redis/v9 => ../.. -require github.com/redis/go-redis/v9 v9.18.0 +require github.com/redis/go-redis/v9 v9.19.0 require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect diff --git a/example/maintnotifiations-pubsub/go.mod b/example/maintnotifiations-pubsub/go.mod index 2a40157a..39513f87 100644 --- a/example/maintnotifiations-pubsub/go.mod +++ b/example/maintnotifiations-pubsub/go.mod @@ -4,7 +4,7 @@ go 1.24 replace github.com/redis/go-redis/v9 => ../.. -require github.com/redis/go-redis/v9 v9.11.0 +require github.com/redis/go-redis/v9 v9.19.0 require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect diff --git a/example/otel-metrics/go.mod b/example/otel-metrics/go.mod index 45c98a18..48cca7aa 100644 --- a/example/otel-metrics/go.mod +++ b/example/otel-metrics/go.mod @@ -7,8 +7,8 @@ replace github.com/redis/go-redis/v9 => ../.. replace github.com/redis/go-redis/extra/redisotel-native/v9 => ../../extra/redisotel-native require ( - github.com/redis/go-redis/extra/redisotel-native/v9 v9.18.0 - github.com/redis/go-redis/v9 v9.18.0 + github.com/redis/go-redis/extra/redisotel-native/v9 v9.19.0 + github.com/redis/go-redis/v9 v9.19.0 go.opentelemetry.io/otel v1.43.0 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.43.0 go.opentelemetry.io/otel/sdk/metric v1.43.0 diff --git a/example/otel/go.mod b/example/otel/go.mod index 2291cf2d..856ec7c0 100644 --- a/example/otel/go.mod +++ b/example/otel/go.mod @@ -9,8 +9,8 @@ replace github.com/redis/go-redis/extra/redisotel/v9 => ../../extra/redisotel replace github.com/redis/go-redis/extra/rediscmd/v9 => ../../extra/rediscmd require ( - github.com/redis/go-redis/extra/redisotel/v9 v9.18.0 - github.com/redis/go-redis/v9 v9.18.0 + github.com/redis/go-redis/extra/redisotel/v9 v9.19.0 + github.com/redis/go-redis/v9 v9.19.0 github.com/uptrace/uptrace-go v1.41.1 go.opentelemetry.io/otel v1.43.0 ) @@ -22,7 +22,7 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect - github.com/redis/go-redis/extra/rediscmd/v9 v9.18.0 // indirect + github.com/redis/go-redis/extra/rediscmd/v9 v9.19.0 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/instrumentation/runtime v0.68.0 // indirect go.opentelemetry.io/contrib/processors/minsev v0.16.0 // indirect diff --git a/example/redis-bloom/go.mod b/example/redis-bloom/go.mod index 223179ba..ab4574f5 100644 --- a/example/redis-bloom/go.mod +++ b/example/redis-bloom/go.mod @@ -4,7 +4,7 @@ go 1.24 replace github.com/redis/go-redis/v9 => ../.. -require github.com/redis/go-redis/v9 v9.18.0 +require github.com/redis/go-redis/v9 v9.19.0 require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect diff --git a/example/scan-struct/go.mod b/example/scan-struct/go.mod index 2cfc60c2..f131a327 100644 --- a/example/scan-struct/go.mod +++ b/example/scan-struct/go.mod @@ -6,7 +6,7 @@ replace github.com/redis/go-redis/v9 => ../.. require ( github.com/davecgh/go-spew v1.1.1 - github.com/redis/go-redis/v9 v9.18.0 + github.com/redis/go-redis/v9 v9.19.0 ) require ( diff --git a/example/search-aggregate-steps/go.mod b/example/search-aggregate-steps/go.mod index 2aac11be..524cfa1f 100644 --- a/example/search-aggregate-steps/go.mod +++ b/example/search-aggregate-steps/go.mod @@ -4,7 +4,7 @@ go 1.24 replace github.com/redis/go-redis/v9 => ../.. -require github.com/redis/go-redis/v9 v9.18.0 +require github.com/redis/go-redis/v9 v9.19.0 require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect diff --git a/example/tls-cert-auth/go.mod b/example/tls-cert-auth/go.mod index ac9d95ac..e356253b 100644 --- a/example/tls-cert-auth/go.mod +++ b/example/tls-cert-auth/go.mod @@ -4,7 +4,7 @@ go 1.24 replace github.com/redis/go-redis/v9 => ../.. -require github.com/redis/go-redis/v9 v9.18.0 +require github.com/redis/go-redis/v9 v9.19.0 require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect diff --git a/example/tls-connection/go.mod b/example/tls-connection/go.mod index fab6a6c5..5f961be5 100644 --- a/example/tls-connection/go.mod +++ b/example/tls-connection/go.mod @@ -4,7 +4,7 @@ go 1.24 replace github.com/redis/go-redis/v9 => ../.. -require github.com/redis/go-redis/v9 v9.18.0 +require github.com/redis/go-redis/v9 v9.19.0 require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect diff --git a/extra/rediscensus/go.mod b/extra/rediscensus/go.mod index 64b59171..a8a44ad0 100644 --- a/extra/rediscensus/go.mod +++ b/extra/rediscensus/go.mod @@ -7,8 +7,8 @@ replace github.com/redis/go-redis/v9 => ../.. replace github.com/redis/go-redis/extra/rediscmd/v9 => ../rediscmd require ( - github.com/redis/go-redis/extra/rediscmd/v9 v9.18.0 - github.com/redis/go-redis/v9 v9.18.0 + github.com/redis/go-redis/extra/rediscmd/v9 v9.19.0 + github.com/redis/go-redis/v9 v9.19.0 go.opencensus.io v0.24.0 ) diff --git a/extra/rediscmd/go.mod b/extra/rediscmd/go.mod index abc57d76..dace2fea 100644 --- a/extra/rediscmd/go.mod +++ b/extra/rediscmd/go.mod @@ -7,7 +7,7 @@ replace github.com/redis/go-redis/v9 => ../.. require ( github.com/bsm/ginkgo/v2 v2.12.0 github.com/bsm/gomega v1.27.10 - github.com/redis/go-redis/v9 v9.18.0 + github.com/redis/go-redis/v9 v9.19.0 ) require ( diff --git a/extra/redisotel-native/go.mod b/extra/redisotel-native/go.mod index 0cda32cd..54bb3708 100644 --- a/extra/redisotel-native/go.mod +++ b/extra/redisotel-native/go.mod @@ -5,7 +5,7 @@ go 1.25.0 replace github.com/redis/go-redis/v9 => ../.. require ( - github.com/redis/go-redis/v9 v9.18.0 + github.com/redis/go-redis/v9 v9.19.0 go.opentelemetry.io/otel v1.43.0 go.opentelemetry.io/otel/metric v1.43.0 go.opentelemetry.io/otel/sdk/metric v1.43.0 diff --git a/extra/redisotel/go.mod b/extra/redisotel/go.mod index f55ea475..3155f4e7 100644 --- a/extra/redisotel/go.mod +++ b/extra/redisotel/go.mod @@ -7,8 +7,8 @@ replace github.com/redis/go-redis/v9 => ../.. replace github.com/redis/go-redis/extra/rediscmd/v9 => ../rediscmd require ( - github.com/redis/go-redis/extra/rediscmd/v9 v9.18.0 - github.com/redis/go-redis/v9 v9.18.0 + github.com/redis/go-redis/extra/rediscmd/v9 v9.19.0 + github.com/redis/go-redis/v9 v9.19.0 go.opentelemetry.io/otel v1.43.0 go.opentelemetry.io/otel/metric v1.43.0 go.opentelemetry.io/otel/sdk v1.43.0 diff --git a/extra/redisprometheus/go.mod b/extra/redisprometheus/go.mod index 3a767407..76e783b0 100644 --- a/extra/redisprometheus/go.mod +++ b/extra/redisprometheus/go.mod @@ -6,7 +6,7 @@ replace github.com/redis/go-redis/v9 => ../.. require ( github.com/prometheus/client_golang v1.14.0 - github.com/redis/go-redis/v9 v9.18.0 + github.com/redis/go-redis/v9 v9.19.0 ) require ( diff --git a/scripts/release.sh b/scripts/release.sh index 50b5abba..e8dcffbf 100755 --- a/scripts/release.sh +++ b/scripts/release.sh @@ -6,7 +6,9 @@ help() { cat <<- EOF Usage: TAG=tag $0 -Updates version in go.mod files and pushes a new brash to GitHub. +Updates redis/go-redis dependency versions in all sub-module go.mod files +and bumps version.go to the new tag. Runs in the current branch and does +NOT commit, push, or switch branches โ€” review the diff and commit yourself. VARIABLES: TAG git tag, for example, v1.0.0 @@ -32,14 +34,14 @@ if [[ ${TAG_FOUND} = ${TAG} ]] ; then exit 1 fi -if ! git diff --quiet -then - printf "working tree is not clean\n\n" - git status - exit 1 -fi - -git checkout master +# Portable in-place sed: works on both GNU sed and BSD/macOS sed by +# always writing a .bak backup and removing it afterwards. +sed_inplace() { + local script=$1 + local file=$2 + sed -i.bak "$script" "$file" + rm -f "${file}.bak" +} PACKAGE_DIRS=$(find . -mindepth 2 -type f -name 'go.mod' -exec dirname {} \; \ | sed 's/^\.\///' \ @@ -47,21 +49,14 @@ PACKAGE_DIRS=$(find . -mindepth 2 -type f -name 'go.mod' -exec dirname {} \; \ for dir in $PACKAGE_DIRS do - printf "${dir}: go get -u && go mod tidy\n" - #(cd ./${dir} && go get -u && go mod tidy -compat=1.24) + printf "updating %s/go.mod\n" "${dir}" + sed_inplace \ + "s|\(github.com/redis/go-redis[^ ]*\) v[^ ]*|\1 ${TAG}|" \ + "${dir}/go.mod" + (cd "./${dir}" && go mod tidy -compat=1.24) done -for dir in $PACKAGE_DIRS -do - sed --in-place \ - "s/redis\/go-redis\([^ ]*\) v.*/redis\/go-redis\1 ${TAG}/" "${dir}/go.mod" - #(cd ./${dir} && go get -u && go mod tidy -compat=1.24) - (cd ./${dir} && go mod tidy -compat=1.24) -done +printf "updating version.go\n" +sed_inplace "s/\(return \)\"[^\"]*\"/\1\"${TAG#v}\"/" ./version.go -sed --in-place "s/\(return \)\"[^\"]*\"/\1\"${TAG#v}\"/" ./version.go - -git checkout -b release/${TAG} master -git add -u -git commit -m "chore: release $TAG (release.sh)" -git push origin release/${TAG} +printf "\nDone. Review changes with 'git diff' and commit when ready.\n" diff --git a/version.go b/version.go index 49f001e5..5005aa98 100644 --- a/version.go +++ b/version.go @@ -2,5 +2,5 @@ package redis // Version is the current release version. func Version() string { - return "9.18.0" + return "9.19.0" }