Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
61b6ee1
DOC-6909 Add link render hook to replace relref, with coexistence fin…
andy-stark-redis Jul 30, 2026
03de590
DOC-6909 Resolve page-bundle resource links in the render hook
andy-stark-redis Jul 30, 2026
96cd672
DOC-6909 Normalise leading ./ in render-hook link resolution
andy-stark-redis Jul 30, 2026
22f3cf6
DOC-6909 Use .PageInner and split fragment links in the render hook
andy-stark-redis Jul 30, 2026
7d340dc
DOC-6909 Document tooling that assumes relref (review follow-up)
andy-stark-redis Jul 30, 2026
c4e3953
DOC-6909 Record diverse-section stress-test results in the assessment
andy-stark-redis Jul 30, 2026
93abb35
DOC-6909 Harden render-hook anchor handling (safeURL + first-# split)
andy-stark-redis Jul 30, 2026
f8bfc62
DOC-6909 Record versioned-tree stress-test result in the assessment
andy-stark-redis Jul 30, 2026
e5665e0
DOC-6909 Fix broken links surfaced by the render-hook investigation
andy-stark-redis Jul 30, 2026
49b53ca
DOC-6909 Fix the remaining pre-existing broken links surfaced by the …
andy-stark-redis Jul 30, 2026
ce39f5b
DOC-6909 Remove aggregations-syntax note linking a non-existent dataset
andy-stark-redis Jul 30, 2026
c7dd76f
DOC-6909 Migrate develop/clients/redis-py links from relref to plain …
andy-stark-redis Jul 30, 2026
f29556e
DOC-6909 Add blockquote-alert render hook (portable callouts)
andy-stark-redis Jul 31, 2026
3139628
DOC-6909 Migrate redis-py callouts from note shortcodes to blockquote…
andy-stark-redis Aug 3, 2026
2422cff
DOC-6909 Make redis-py links source-relative (portable end state)
andy-stark-redis Aug 3, 2026
c1ba272
DOC-6909 Revert RedisVL doc edits (externally synced, would be overwr…
andy-stark-redis Aug 5, 2026
07328c9
DOC-6909 Restore RedisVL link fixes (keep in this PR)
andy-stark-redis Aug 5, 2026
3315a24
DOC-6909 Use repo-root-relative /content/ links for redis-py
andy-stark-redis Aug 11, 2026
f351060
DOC-6909 Rewrite /content/ links in the AI Markdown and JSON output
andy-stark-redis Aug 11, 2026
34f9577
DOC-6909 Version plain /content/ links when archiving a version
andy-stark-redis Aug 11, 2026
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
493 changes: 493 additions & 0 deletions HUGO_DEPENDENCY_ASSESSMENT.md

Large diffs are not rendered by default.

161 changes: 161 additions & 0 deletions build/test_version_archiver.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
#!/usr/bin/env python3
"""
Test script for version_archiver's link versioning.

When a version is archived, intra-product links must point at the frozen copy,
not at latest. The archiver originally rewrote only `relref`, so a section
migrated to plain Markdown links (DOC-6909) was silently left pointing at
latest -- wrong content in an archived version, with no error or warning.

These tests cover both notations, the guards they share, and the forms that must
NOT be touched.
"""

import os
import sys
import tempfile

# Add the build directory to the path
sys.path.insert(0, os.path.dirname(__file__))

from version_archiver import VersionArchiver


def archive(product, version, page_relpath, content):
"""Run the real version_relrefs() over one page in an isolated tree.

page_relpath is relative to the versioned directory, so nesting can be
realistic -- it matters for source-relative links, which resolve against the
page's own location.
"""
cwd = os.getcwd()
with tempfile.TemporaryDirectory() as tmp:
arch_cwd = tmp
os.chdir(arch_cwd)
try:
archiver = VersionArchiver(product, version)
page = os.path.join(archiver.new_directory, page_relpath)
os.makedirs(os.path.dirname(page), exist_ok=True)
with open(page, "w") as f:
f.write(content)
archiver.version_relrefs()
with open(page) as f:
return f.read()
finally:
os.chdir(cwd)


DEEP = os.path.join("databases", "configure", "page.md")


def test_relref_is_versioned():
"""The original behaviour: an intra-product relref gains the version."""
out = archive("rs", "9.9", DEEP,
'[a]({{< relref "/operate/rs/databases/memory/eviction" >}})')
assert "/operate/rs/9.9/databases/memory/eviction" in out, out
print("✓ relref link is versioned")


def test_plain_content_link_is_versioned():
"""DOC-6909's repo-root-relative form must be versioned the same way."""
out = archive("rs", "9.9", DEEP,
'[b](/content/operate/rs/databases/memory/eviction.md)')
assert "](/content/operate/rs/9.9/databases/memory/eviction.md)" in out, out
print("✓ plain /content/ link is versioned")


def test_plain_content_link_keeps_anchor():
"""An anchor must survive versioning."""
out = archive("rs", "9.9", DEEP,
'[c](/content/operate/rs/databases/memory/eviction.md#policies)')
assert "/operate/rs/9.9/databases/memory/eviction.md#policies" in out, out
print("✓ anchor preserved when versioning a plain link")


def test_source_relative_link_is_left_alone():
"""Source-relative links need no rewriting and must not be touched.

The whole subtree is copied, so a link between two pages inside it already
resolves within the versioned directory.
"""
link = '[d](../memory/eviction.md)'
out = archive("rs", "9.9", DEEP, link)
assert out == link, out
# and confirm the claim: it resolves inside the frozen tree
page_dir = os.path.join("content", "operate", "rs", "9.9",
os.path.dirname(DEEP))
resolved = os.path.normpath(os.path.join(page_dir, "../memory/eviction.md"))
assert resolved.startswith(os.path.join("content", "operate", "rs", "9.9")), resolved
print("✓ source-relative link untouched, and resolves inside the version")


def test_release_notes_are_exempt():
"""Release notes are deliberately not versioned, in either notation."""
both = ('[e]({{< relref "/operate/rs/release-notes/rs-7-8" >}})\n'
'[f](/content/operate/rs/release-notes/rs-7-8.md)')
out = archive("rs", "9.9", DEEP, both)
assert out == both, out
print("✓ release-notes links exempt in both notations")


def test_already_versioned_is_idempotent():
"""Re-running must not double-version an already-versioned link."""
both = ('[g]({{< relref "/operate/rs/9.9/databases/memory/eviction" >}})\n'
'[h](/content/operate/rs/9.9/databases/memory/eviction.md)')
out = archive("rs", "9.9", DEEP, both)
assert out == both, out
assert "9.9/9.9" not in out, out
print("✓ already-versioned links are left alone (idempotent)")


def test_other_product_and_external_urls_untouched():
"""Only the product being archived is rewritten, and external URLs are safe.

The GitHub blob URL is the important one: it contains the substring
'/content/operate/rs/', so the pattern must anchor on a link destination
('](/content/...') rather than matching anywhere in the line.
"""
content = ('[i](/content/operate/kubernetes/deploy/quickstart.md)\n'
'[j](https://github.com/redis/docs/blob/main/content/operate/rs/x.md)\n'
'[k]({{< relref "/develop/data-types/hashes" >}})')
out = archive("rs", "9.9", DEEP, content)
assert out == content, out
print("✓ other products, external URLs and other sections untouched")


def test_other_products_use_their_own_prefix():
"""The pattern is parameterised, so non-'operate' products work too."""
out = archive("redis-data-integration", "1.20", DEEP,
'[l](/content/integrate/redis-data-integration/reference/config.md)')
assert "/integrate/redis-data-integration/1.20/reference/config.md" in out, out
print("✓ redis-data-integration (integrate prefix) is versioned")


def main():
tests = [
test_relref_is_versioned,
test_plain_content_link_is_versioned,
test_plain_content_link_keeps_anchor,
test_source_relative_link_is_left_alone,
test_release_notes_are_exempt,
test_already_versioned_is_idempotent,
test_other_product_and_external_urls_untouched,
test_other_products_use_their_own_prefix,
]
try:
for t in tests:
t()
print("\n✅ All tests passed!")
return 0
except AssertionError as e:
print(f"\n❌ Test failed: {e}")
return 1
except Exception as e:
print(f"\n❌ Unexpected error: {e}")
import traceback
traceback.print_exc()
return 1


if __name__ == '__main__':
sys.exit(main())
19 changes: 18 additions & 1 deletion build/version_archiver.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,19 @@ def update_relrefs(self, file_path, version, product):
+ re.escape(product)
+ r'/([^"]+)" ?>\}\})'
)
# Repo-root-relative Markdown links replace relref in sections migrated
# for DOC-6909, and need the same versioning. Without this they keep
# resolving to the latest page instead of the copy being frozen, which is
# silently wrong content in an archived version (no error, no warning).
# Source-relative links need no rewriting: the whole subtree is copied, so
# a link between two pages inside it already resolves within the version.
plain_pattern = (
r'(\]\(/content/'
+ self.prefix
+ "/"
+ re.escape(product)
+ r'/([^)]+)\))'
)
with open(file_path, "r") as file:
lines = file.readlines()

Expand All @@ -74,8 +87,12 @@ def replace_link(match):
return f"{new_link}"
return full_match

# Replace all relref links in the line
# Replace all relref links in the line, then the plain Markdown ones.
# Both share replace_link: each match contains "/<prefix>/<product>/",
# so the same substitution and the same release-notes and
# already-versioned guards apply to either notation.
modified_line = re.sub(pattern, replace_link, lines[i])
modified_line = re.sub(plain_pattern, replace_link, modified_line)

# If the line was modified, update the lines list
if modified_line != lines[i]:
Expand Down
2 changes: 1 addition & 1 deletion content/commands/discard.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ title: DISCARD
Flushes all previously queued commands in a [transaction][tt] and restores the
connection state to normal.

[tt]: /develop/interact/transactions
[tt]: /develop/using-commands/transactions

If [`WATCH`]({{< relref "/commands/watch" >}}) was used, `DISCARD` unwatches all keys watched by the connection.

Expand Down
4 changes: 2 additions & 2 deletions content/commands/exec.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,12 @@ This command's behavior varies in clustered Redis environments. See the [multi-k
Executes all previously queued commands in a [transaction][tt] and restores the
connection state to normal.

[tt]: /develop/interact/transactions
[tt]: /develop/using-commands/transactions

When using [`WATCH`]({{< relref "/commands/watch" >}}), `EXEC` will execute commands only if the watched keys were
not modified, allowing for a [check-and-set mechanism][ttc].

[ttc]: /develop/interact/transactions#cas
[ttc]: /develop/using-commands/transactions#cas

## Redis Software and Redis Cloud compatibility

Expand Down
2 changes: 1 addition & 1 deletion content/commands/expire.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ Note that calling `EXPIRE`/[`PEXPIRE`]({{< relref "/commands/pexpire" >}}) with
will be `del`, not `expired`).

[del]: /commands/del
[ntf]: /develop/use/keyspace-notifications
[ntf]: /develop/pubsub/keyspace-notifications

## Required arguments

Expand Down
2 changes: 1 addition & 1 deletion content/commands/multi.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ This command's behavior varies in clustered Redis environments. See the [multi-k
Marks the start of a [transaction][tt] block.
Subsequent commands will be queued for atomic execution using [`EXEC`]({{< relref "/commands/exec" >}}).

[tt]: /develop/interact/transactions
[tt]: /develop/using-commands/transactions

## Redis Software and Redis Cloud compatibility

Expand Down
2 changes: 1 addition & 1 deletion content/commands/setbit.md
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ native programming language. Symmetrically, it is also possible to set an entire
bitmap by performing the bits-to-bytes encoding in the client and calling [`SET`]({{< relref "/commands/set" >}})
with the resultant string.

[ti]: /develop/data-types-intro#bitmaps
[ti]: /develop/data-types#bitmaps

### Pattern: setting multiple bits

Expand Down
2 changes: 1 addition & 1 deletion content/commands/unwatch.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ title: UNWATCH
---
Flushes all the previously watched keys for a [transaction][tt].

[tt]: /develop/interact/transactions
[tt]: /develop/using-commands/transactions

If you call [`EXEC`]({{< relref "/commands/exec" >}}) or [`DISCARD`]({{< relref "/commands/discard" >}}), there's no need to manually call `UNWATCH`.

Expand Down
2 changes: 1 addition & 1 deletion content/commands/watch.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ This command's behavior varies in clustered Redis environments. See the [multi-k
Marks the given keys to be watched for conditional execution of a
[transaction][tt].

[tt]: /develop/interact/transactions
[tt]: /develop/using-commands/transactions

## Redis Software and Redis Cloud compatibility

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -500,7 +500,7 @@ results

### Aggregations

See docs for redis supported reducer functions: [https://redis.io/docs/latest/develop/ai/search-and-query/advanced-concepts/aggregations/#supported-groupby-reducers](docs).
See docs for redis supported reducer functions: [docs](https://redis.io/docs/latest/develop/ai/search-and-query/advanced-concepts/aggregations/#supported-groupby-reducers).


```python
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ authenticated.
Authentication is a separate concern from **transport security** (Host/Origin
validation), which is always on for the HTTP transports and defends against DNS
rebinding independently of auth. See
[Transport Security](mcp.md#transport-security-host-origin-validation). Both
[Transport Security]({{< relref "mcp#transport-security-host-origin-validation" >}}). Both
layers apply together: auth decides *who* may call; the Host/Origin guard
rejects requests whose claimed authority is not allowlisted.
{{< /note >}}
Expand Down
10 changes: 0 additions & 10 deletions content/develop/ai/redisvl/0.6.0/user_guide/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,13 +84,3 @@ User guides provide helpful resources for using RedisVL and its different compon
* [Optimize](threshold_optimization/#optimize)
* [Test it out](threshold_optimization/#test-it-out)
* [Cleanup](threshold_optimization/#cleanup)
* [Release Guides](release_guide/)
* [0.5.1 Feature Overview](release_guide/0_5_0_release/)
* [HybridQuery class](release_guide/0_5_0_release/#hybridquery-class)
* [TextQueries](release_guide/0_5_0_release/#textqueries)
* [Threshold optimization](release_guide/0_5_0_release/#threshold-optimization)
* [Schema validation](release_guide/0_5_0_release/#schema-validation)
* [Timestamp filters](release_guide/0_5_0_release/#timestamp-filters)
* [Batch search](release_guide/0_5_0_release/#batch-search)
* [Vector normalization](release_guide/0_5_0_release/#vector-normalization)
* [Hybrid policy on knn with filters](release_guide/0_5_0_release/#hybrid-policy-on-knn-with-filters)
10 changes: 0 additions & 10 deletions content/develop/ai/redisvl/0.7.0/user_guide/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,13 +84,3 @@ User guides provide helpful resources for using RedisVL and its different compon
* [Optimize](threshold_optimization/#optimize)
* [Test it out](threshold_optimization/#test-it-out)
* [Cleanup](threshold_optimization/#cleanup)
* [Release Guides](release_guide/)
* [0.5.1 Feature Overview](release_guide/0_5_0_release/)
* [HybridQuery class](release_guide/0_5_0_release/#hybridquery-class)
* [TextQueries](release_guide/0_5_0_release/#textqueries)
* [Threshold optimization](release_guide/0_5_0_release/#threshold-optimization)
* [Schema validation](release_guide/0_5_0_release/#schema-validation)
* [Timestamp filters](release_guide/0_5_0_release/#timestamp-filters)
* [Batch search](release_guide/0_5_0_release/#batch-search)
* [Vector normalization](release_guide/0_5_0_release/#vector-normalization)
* [Hybrid policy on knn with filters](release_guide/0_5_0_release/#hybrid-policy-on-knn-with-filters)
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ authenticated.
Authentication is a separate concern from **transport security** (Host/Origin
validation), which is always on for the HTTP transports and defends against DNS
rebinding independently of auth. See
[Transport Security](mcp.md#transport-security-host-origin-validation). Both
[Transport Security]({{< relref "mcp#transport-security-host-origin-validation" >}}). Both
layers apply together: auth decides *who* may call; the Host/Origin guard
rejects requests whose claimed authority is not allowlisted.
{{< /note >}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,6 @@ The [main aggregations page]({{< relref "/develop/ai/search-and-query/advanced-c

`GROUPBY` ... `REDUCE` ... `APPLY` ... `GROUPBY` ... `REDUCE`

{{< note >}}
Comment thread
andy-stark-redis marked this conversation as resolved.
The examples on this page are based on a hypothetical "products" data set, which you can [download here](./data/products.txt).
{{< /note >}}
Comment thread
andy-stark-redis marked this conversation as resolved.

## Syntax and expression ordering

The `FT.AGGREGATE` command processes multiple expressions in a pipeline. Below is the recommended order:
Expand Down
2 changes: 1 addition & 1 deletion content/develop/clients/nodejs/amr.md
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ authorityConfig: {
},
// ...
```
See Microsoft's [Authority]([Authority](https://learn.microsoft.com/en-us/entra/identity-platform/msal-client-application-configuration#authority))
See Microsoft's [Authority](https://learn.microsoft.com/en-us/entra/identity-platform/msal-client-application-configuration#authority)
docs for more information.

### Authenticate with a service principal
Expand Down
4 changes: 2 additions & 2 deletions content/develop/clients/redis-py/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@ weight: 1
The sections below explain how to install `redis-py` and connect your application
to a Redis database.

`redis-py` requires a running Redis server. See [here]({{< relref "/operate/oss_and_stack/install/" >}}) for Redis Open Source installation instructions.
`redis-py` requires a running Redis server. See [here](/content/operate/oss_and_stack/install/_index.md) for Redis Open Source installation instructions.

You can also access Redis with an object-mapping client interface. See
[RedisOM for Python]({{< relref "/integrate/redisom-for-python" >}})
[RedisOM for Python](/content/integrate/redisom-for-python/_index.md)
Comment thread
cursor[bot] marked this conversation as resolved.
for more information.

## Install
Expand Down
12 changes: 6 additions & 6 deletions content/develop/clients/redis-py/amr.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ letting `redis-entra-id` fetch and renew the authentication tokens for you autom

## Install

Install [`redis-py`]({{< relref "/develop/clients/redis-py#install" >}}) first,
Install [`redis-py`](/content/develop/clients/redis-py/_index.md#install) first,
if you have not already done so. Then, install `redis-entra-id` with the
following command:

Expand Down Expand Up @@ -134,11 +134,11 @@ When you have created your `CredentialProvider` instance, you are ready to
connect to AMR.
The example below shows how to pass the instance as a parameter to the standard
`RedisCluster()` connection method.
{{< note >}} Azure requires you to use
[Transport Layer Security (TLS)](https://en.wikipedia.org/wiki/Transport_Layer_Security)
when you connect (see
[Connect with TLS]({{< relref "/develop/clients/redis-py/connect#connect-to-your-production-redis-with-tls" >}}) for more information).
{{< /note >}}
> [!NOTE]
> Azure requires you to use
> [Transport Layer Security (TLS)](https://en.wikipedia.org/wiki/Transport_Layer_Security)
> when you connect (see
> [Connect with TLS](/content/develop/clients/redis-py/connect.md#connect-to-your-production-redis-with-tls) for more information).

```python
from redis import RedisCluster
Expand Down
Loading
Loading