From 9e548b0c4dda5ead3137996f930a3fc0cb8ba270 Mon Sep 17 00:00:00 2001 From: skjnldsv Date: Tue, 16 Jun 2026 09:38:53 +0200 Subject: [PATCH 1/4] fix: use GITHUB_BASE_REF to detect stable branch for display_version and PDF MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous approach matched GITHUB_REF against a stable branch pattern. This breaks for backport/*/stableNN branches where GITHUB_REF points to the source branch, not the target. Use GITHUB_BASE_REF (the PR target, always stableNN) for PRs, falling back to GITHUB_REF for direct pushes. Both are matched strictly against ^stable([0-9]+)$ — no loose suffix matching. Also set html_context current_version to the detected stable version integer so the picker correctly highlights the current docs version instead of always showing "latest" as selected on stable branch builds and PRs. Signed-off-by: skjnldsv --- .github/workflows/sphinxbuild.yml | 11 ++++++----- conf.py | 18 ++++++++++++++++-- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/.github/workflows/sphinxbuild.yml b/.github/workflows/sphinxbuild.yml index 7b9e3da2939..7ac98a47f97 100644 --- a/.github/workflows/sphinxbuild.yml +++ b/.github/workflows/sphinxbuild.yml @@ -272,12 +272,13 @@ jobs: - name: Compute PDF release version id: pdf_version run: | - branch="${GITHUB_REF#refs/heads/}" - if [[ "$branch" == stable* ]]; then - echo "release=${branch#stable}" >> $GITHUB_OUTPUT + # For PRs use the target branch; for pushes use the current branch. + # This handles both stable34 direct pushes and backport/*/stable34 PRs. + branch="${GITHUB_BASE_REF:-${GITHUB_REF#refs/heads/}}" + if [[ "$branch" =~ ^stable([0-9]+)$ ]]; then + echo "release=${BASH_REMATCH[1]}" >> $GITHUB_OUTPUT else - # For master (latest), derive the dev version from conf.py so the - # PDF cover shows a real version number rather than "latest". + # master: derive the dev version from conf.py. version_stable=$(grep -m1 '^\s*version_stable\s*=' conf.py | grep -o '[0-9]\+') echo "release=$((version_stable + 1))" >> $GITHUB_OUTPUT fi diff --git a/conf.py b/conf.py index e38f607fa53..299e8736bf0 100644 --- a/conf.py +++ b/conf.py @@ -64,7 +64,21 @@ # latest released stable — CHANGING IT MUST RESULT IN A CHANGE OF THE SYMLINK ON THE LIVE SERVER version_stable = 34 # mapped to https://docs.nextcloud.com/server/stable/ -display_version = release if release != 'latest' else str(version_stable + 1) +import re as _re +# Detect stable branch version for display purposes. +# For PRs: GITHUB_BASE_REF is the target branch (e.g. 'stable34'). +# For direct pushes: GITHUB_REF is 'refs/heads/stable34'. +_base = os.environ.get('GITHUB_BASE_REF', '') +_ref = os.environ.get('GITHUB_REF', '') +_stable_ver = ( + _re.match(r'^stable(\d+)$', _base) + or _re.match(r'^refs/heads/stable(\d+)$', _ref) +) +display_version = ( + release if release != 'latest' # PDF/ePub builds (DOCS_RELEASE set) + else _stable_ver.group(1) if _stable_ver # stableNN branches and PRs targeting them + else str(version_stable + 1) # master +) # Also search for "TODO ON RELEASE" in the rst files @@ -96,7 +110,7 @@ def generateVersionsDocs(current_docs): github_branch = 'master' html_context = { - 'current_version': version, + 'current_version': int(_stable_ver.group(1)) if _stable_ver else version, 'display_version': display_version, 'READTHEDOCS': True, From e29e29ce752d3da42b7f3412bc7de072f13edd5e Mon Sep 17 00:00:00 2001 From: skjnldsv Date: Tue, 16 Jun 2026 09:41:13 +0200 Subject: [PATCH 2/4] fix: add shell: bash to PDF release version step (container uses sh) Signed-off-by: skjnldsv --- .github/workflows/sphinxbuild.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/sphinxbuild.yml b/.github/workflows/sphinxbuild.yml index 7ac98a47f97..7863de72597 100644 --- a/.github/workflows/sphinxbuild.yml +++ b/.github/workflows/sphinxbuild.yml @@ -271,6 +271,7 @@ jobs: - name: Compute PDF release version id: pdf_version + shell: bash run: | # For PRs use the target branch; for pushes use the current branch. # This handles both stable34 direct pushes and backport/*/stable34 PRs. From 5f3d7eb54ceabbee22d33f80bc8f64cb6a5f9763 Mon Sep 17 00:00:00 2001 From: skjnldsv Date: Tue, 16 Jun 2026 09:53:33 +0200 Subject: [PATCH 3/4] fix: use version_stable+1 for latest picker label, not display_version display_version reflects the current branch (e.g. '32' on stable32), which is correct for titles and the picker button but wrong for the 'latest' picker entry which should always show the master dev version. Signed-off-by: skjnldsv --- conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf.py b/conf.py index 299e8736bf0..8c5037cd5cd 100644 --- a/conf.py +++ b/conf.py @@ -101,7 +101,7 @@ def generateVersionsDocs(current_docs): url = 'https://docs.nextcloud.com/server/%s/%s' % (str(v), current_docs) versions_doc.append((v, url, str(v))) versions_doc.append(('stable', 'https://docs.nextcloud.com/server/stable/%s' % current_docs, '%s (stable)' % version_stable)) - versions_doc.append(('latest', 'https://docs.nextcloud.com/server/latest/%s' % current_docs, '%s (latest)' % display_version)) + versions_doc.append(('latest', 'https://docs.nextcloud.com/server/latest/%s' % current_docs, '%s (latest)' % str(version_stable + 1))) return versions_doc if version.isdigit(): From 75c0153d4cb62bc317716fd0f662c03caf11007b Mon Sep 17 00:00:00 2001 From: skjnldsv Date: Tue, 16 Jun 2026 09:56:02 +0200 Subject: [PATCH 4/4] feat: add unsupported version entry to picker when viewing old branch docs When building docs for a branch older than version_start (e.g. stable26), the picker now includes that version labeled "(unsupported)" at the bottom, so users can see: 35 (latest), 34 (stable), 33, 32, 26 (unsupported). Signed-off-by: skjnldsv --- conf.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/conf.py b/conf.py index 8c5037cd5cd..6c5a2cb6dc1 100644 --- a/conf.py +++ b/conf.py @@ -97,6 +97,15 @@ def setup(app): def generateVersionsDocs(current_docs): versions_doc = [] + + # If viewing an unsupported (older than version_start) branch, prepend it so it + # appears last after the template's |reverse — e.g. "26 (unsupported)" at the bottom. + if _stable_ver: + branch_ver = int(_stable_ver.group(1)) + if branch_ver < version_start: + url = 'https://docs.nextcloud.com/server/%s/%s' % (str(branch_ver), current_docs) + versions_doc.append((branch_ver, url, '%s (unsupported)' % branch_ver)) + for v in range(version_start, version_stable): url = 'https://docs.nextcloud.com/server/%s/%s' % (str(v), current_docs) versions_doc.append((v, url, str(v)))