Skip to content

Commit ebef22a

Browse files
authored
Merge branch 'master' into patch-1
2 parents d9939f1 + ee09a13 commit ebef22a

102 files changed

Lines changed: 15988 additions & 142 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.devcontainer/Dockerfile‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM ubuntu:24.04
1+
FROM ubuntu:26.04
22

33
LABEL org.opencontainers.image.source="https://github.com/nextcloud/documentation"
44
LABEL org.opencontainers.image.description="Sphinx build environment for Nextcloud documentation"

‎.github/dependabot.yml‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,7 @@ updates:
2525
open-pull-requests-limit: 10
2626
cooldown:
2727
default-days: 10
28+
ignore:
29+
# Stick to Ubuntu LTS releases (even year, .04)
30+
- dependency-name: "ubuntu"
31+
versions: ["25.x", "26.10", "27.x", "28.10", "29.x"]

‎.github/workflows/build-docs.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ jobs:
251251
252252
- name: Set up Docker Buildx
253253
if: steps.changed.outputs.dockerfile_changed == 'true'
254-
uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4.3.0
254+
uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4.4.1
255255

256256
- name: Login to GitHub Container Registry
257257
if: steps.changed.outputs.dockerfile_changed == 'true'
@@ -263,7 +263,7 @@ jobs:
263263

264264
- name: Build and push image with SHA tag
265265
if: steps.changed.outputs.dockerfile_changed == 'true'
266-
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
266+
uses: docker/build-push-action@c3c9e263c25d99ce0380d002d59b67737d91b0dc # v7.4.0
267267
with:
268268
context: .devcontainer
269269
push: true
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
# This workflow is provided via the organization template repository
2+
#
3+
# https://github.com/nextcloud/.github
4+
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
5+
#
6+
# SPDX-FileCopyrightText: Nextcloud GmbH and Nextcloud contributors
7+
# SPDX-License-Identifier: MIT
8+
9+
name: Auto approve Dependabot PRs
10+
11+
on:
12+
pull_request:
13+
branches:
14+
- main
15+
- master
16+
- stable*
17+
18+
permissions:
19+
contents: read
20+
21+
concurrency:
22+
group: dependabot-approve-merge-${{ github.head_ref || github.run_id }}
23+
cancel-in-progress: true
24+
25+
jobs:
26+
auto-approve-merge:
27+
if: github.event.pull_request.user.login == 'dependabot[bot]'
28+
runs-on: ubuntu-latest-low
29+
env:
30+
# env variable for maintainers: 'true' allows to auto-merge 1.0.2 -> 2.0.0
31+
ALLOW_MAJOR: false
32+
# env variable for maintainers: 'true' allows to auto-merge 1.0.2 -> 1.1.0
33+
ALLOW_MINOR: true
34+
# env variable for maintainers: RegExp string to ignore some dependencies from auto-approve and auto-merge
35+
IGNORE_PATTERN: ''
36+
permissions:
37+
# for auto-approve step to work
38+
pull-requests: write
39+
# for alexwilson/enable-github-automerge-action to approve PRs
40+
contents: write
41+
42+
steps:
43+
- name: Disabled on forks
44+
if: ${{ github.event.pull_request.head.repo.full_name != github.repository }}
45+
run: |
46+
echo 'Can not approve PRs from forks'
47+
exit 1
48+
49+
- uses: mdecoleman/pr-branch-name@55795d86b4566d300d237883103f052125cc7508 # v3.0.0
50+
id: branchname
51+
with:
52+
repo-token: ${{ secrets.GITHUB_TOKEN }}
53+
54+
- name: Dependabot metadata
55+
id: metadata
56+
if: startsWith(steps.branchname.outputs.branch, 'dependabot/')
57+
uses: dependabot/fetch-metadata@25dd0e34f4fe68f24cc83900b1fe3fe149efef98 # v3.1.0
58+
with:
59+
github-token: ${{ secrets.GITHUB_TOKEN }}
60+
61+
- name: Check for ignored dependencies in the PR
62+
id: validate
63+
if: startsWith(steps.branchname.outputs.branch, 'dependabot/')
64+
env:
65+
IGNORE_PATTERN: ${{ env.IGNORE_PATTERN }}
66+
DEPENDENCY_NAMES: ${{ steps.metadata.outputs.dependency-names }}
67+
run: |
68+
if [[ -z ${IGNORE_PATTERN} ]]; then
69+
echo "ignore=false" >> "$GITHUB_OUTPUT"
70+
elif [[ -z ${DEPENDENCY_NAMES} ]]; then
71+
echo "ignore=false" >> "$GITHUB_OUTPUT"
72+
elif [[ ${DEPENDENCY_NAMES} =~ ${IGNORE_PATTERN} ]]; then
73+
echo "ignore=true" >> "$GITHUB_OUTPUT"
74+
fi
75+
76+
- name: GitHub actions bot approve
77+
id: auto_approve
78+
if: ${{
79+
startsWith(steps.branchname.outputs.branch, 'dependabot/')
80+
&& steps.validate.outputs.ignore != 'true'
81+
}}
82+
run: gh pr review --approve "$PR_URL"
83+
env:
84+
PR_URL: ${{ github.event.pull_request.html_url }}
85+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
86+
87+
# Enable GitHub auto merge
88+
- name: Auto merge
89+
uses: alexwilson/enable-github-automerge-action@2c32e18a76e0726ffe7a573bfff2d42a20885126 # 3.0.0
90+
if: ${{
91+
startsWith(steps.branchname.outputs.branch, 'dependabot/')
92+
&& steps.auto_approve.conclusion == 'success'
93+
&& (github.event.action == 'opened' || github.event.action == 'reopened')
94+
&& (
95+
steps.metadata.outputs.update-type == 'version-update:semver-patch'
96+
|| (fromJSON(env.ALLOW_MINOR) && steps.metadata.outputs.update-type == 'version-update:semver-minor')
97+
|| (fromJSON(env.ALLOW_MAJOR) && steps.metadata.outputs.update-type == 'version-update:semver-major')
98+
)
99+
}}
100+
with:
101+
github-token: ${{ secrets.GITHUB_TOKEN }}

‎.github/workflows/docker-build.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ jobs:
2525
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
2626

2727
- name: Set up Docker Buildx
28-
uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4.3.0
28+
uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4.4.1
2929

3030
- name: Login to GitHub Container Registry
3131
if: github.event_name != 'pull_request'
@@ -45,7 +45,7 @@ jobs:
4545
type=sha,prefix=sha-
4646
4747
- name: Build and publish Docker image
48-
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
48+
uses: docker/build-push-action@c3c9e263c25d99ce0380d002d59b67737d91b0dc # v7.4.0
4949
with:
5050
context: .devcontainer
5151
push: ${{ github.event_name != 'pull_request' }}

‎.github/workflows/generate-top-index.yml‎

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ on:
44
push:
55
branches:
66
- master
7-
tags:
8-
- '*'
97
pull_request:
108
branches:
119
- master
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
# SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
2+
# SPDX-License-Identifier: AGPL-3.0-or-later
3+
#
4+
# Squash the gh-pages history on every release.
5+
#
6+
# Every deploy commits a full set of rebuilt PDF and ePub files, so gh-pages
7+
# grows by ~18 MiB a day. build/squash-gh-pages.sh rebuilds the branch as one
8+
# snapshot commit per release day, keeps the deploys made since the last
9+
# release, and stores out of support version folders only once. The published
10+
# tree is unchanged; see the script for details.
11+
#
12+
# Required setup (repository admin):
13+
# GH_PAGES_DEPLOY_KEY – private half of a deploy key with write access, added
14+
# as a bypass actor to the "Pages" ruleset, which
15+
# otherwise blocks force pushes to gh-pages.
16+
name: "Squash gh-pages history"
17+
18+
on:
19+
push:
20+
tags:
21+
- 'v*'
22+
pull_request:
23+
paths:
24+
- '.github/workflows/squash-gh-pages.yml'
25+
- 'build/squash-gh-pages.sh'
26+
- 'build/tests/**'
27+
workflow_dispatch:
28+
inputs:
29+
dry_run:
30+
description: "Compute the rewrite without pushing it"
31+
type: boolean
32+
default: true
33+
34+
permissions:
35+
contents: read
36+
37+
concurrency:
38+
group: squash-gh-pages
39+
cancel-in-progress: false
40+
41+
jobs:
42+
test:
43+
name: Test squash script
44+
runs-on: ubuntu-latest
45+
46+
steps:
47+
- name: Checkout repository
48+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
49+
with:
50+
persist-credentials: false
51+
52+
- name: Run unit tests
53+
run: bash build/tests/test-squash-gh-pages.sh
54+
55+
squash:
56+
name: Squash gh-pages
57+
needs: test
58+
# Final releases only: rc, beta and alpha tags do not get a snapshot.
59+
if: >-
60+
github.event_name == 'workflow_dispatch' ||
61+
(github.event_name == 'push' && !contains(github.ref_name, 'rc') &&
62+
!contains(github.ref_name, 'beta') && !contains(github.ref_name, 'alpha'))
63+
runs-on: ubuntu-latest
64+
65+
permissions:
66+
contents: read
67+
68+
steps:
69+
# Full history: the release dates are read from the tags.
70+
- name: Checkout repository
71+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
72+
with:
73+
ref: ${{ github.event.repository.default_branch }}
74+
fetch-depth: 0
75+
persist-credentials: false
76+
77+
- name: Setup PHP
78+
uses: shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240 # v2.37.2
79+
with:
80+
php-version: '8.3'
81+
82+
- name: Detect lowest supported version
83+
id: versions
84+
env:
85+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
86+
run: |
87+
mapfile -t nums < <(git ls-remote --heads origin "heads/stable[0-9][0-9]" \
88+
| sed -n 's?.*refs/heads/stable\([0-9]\{2\}\)$?\1?p' | sort -n)
89+
eval "$(php build/detect-versions.php "${nums[@]}")"
90+
echo "Folders below server/${lowest_stable} are frozen"
91+
echo "lowest_stable=${lowest_stable}" >> "$GITHUB_OUTPUT"
92+
93+
- name: Fetch gh-pages history
94+
run: git fetch --no-tags origin +refs/heads/gh-pages:refs/heads/gh-pages
95+
96+
- name: Rewrite gh-pages
97+
id: rewrite
98+
run: |
99+
echo "old=$(git rev-parse gh-pages)" >> "$GITHUB_OUTPUT"
100+
build/squash-gh-pages.sh gh-pages "${{ steps.versions.outputs.lowest_stable }}" \
101+
refs/heads/gh-pages-squashed | tee -a "$GITHUB_OUTPUT"
102+
103+
# Deploy PRs are based on the old history: merging one after the rewrite
104+
# would bring every squashed commit back. The next nightly deploy opens a
105+
# fresh one on top of the new history.
106+
- name: Close open deploy pull requests
107+
if: steps.rewrite.outputs.changed == 'true' && inputs.dry_run != true
108+
env:
109+
GH_TOKEN: ${{ secrets.COMMAND_BOT_PAT }}
110+
run: |
111+
gh pr list --repo "${{ github.repository }}" --base gh-pages --state open \
112+
--json number,headRefName \
113+
--jq '.[] | select(.headRefName | startswith("automated/deploy/")) | .number' \
114+
| while read -r number; do
115+
gh pr close "${number}" --repo "${{ github.repository }}" --delete-branch \
116+
--comment "Closed because gh-pages was squashed. The next scheduled deploy reopens it on the new history."
117+
done
118+
119+
# The lease makes the push fail if anything landed on gh-pages since the
120+
# fetch, rather than dropping it. Re-run the workflow in that case.
121+
- name: Push rewritten gh-pages
122+
if: steps.rewrite.outputs.changed == 'true' && inputs.dry_run != true
123+
env:
124+
DEPLOY_KEY: ${{ secrets.GH_PAGES_DEPLOY_KEY }}
125+
run: |
126+
key="${RUNNER_TEMP}/gh-pages-deploy-key"
127+
hosts="${RUNNER_TEMP}/github-known-hosts"
128+
install -m 600 /dev/null "${key}"
129+
printf '%s\n' "${DEPLOY_KEY}" > "${key}"
130+
# GitHub's published host keys, fetched over TLS rather than trusted on first use.
131+
curl -fsSL https://api.github.com/meta | jq -r '.ssh_keys[] | "github.com " + .' > "${hosts}"
132+
GIT_SSH_COMMAND="ssh -i ${key} -o IdentitiesOnly=yes -o UserKnownHostsFile=${hosts} -o StrictHostKeyChecking=yes" git push \
133+
--force-with-lease="refs/heads/gh-pages:${{ steps.rewrite.outputs.old }}" \
134+
"git@github.com:${{ github.repository }}.git" \
135+
refs/heads/gh-pages-squashed:refs/heads/gh-pages
136+
rm -f "${key}"

‎admin_manual/configuration_server/email_configuration.rst‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,13 @@ settings and look the same in all the different email clients out there.
110110
Modifying the look of emails beyond the theming app capabilities
111111
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
112112

113+
.. warning:: Nextcloud 36 redesigned the email template: every email is now a single card,
114+
with dark mode and right-to-left support. A custom class overriding the HTML fragments of the
115+
previous design keeps working, but its parts will look out of place next to the new ones.
116+
Review it against the new ``EMailTemplate`` before upgrading. Calendar emails also no longer
117+
pass the ``meeting_*_html`` values to the template, they pass ``meeting_*_previous`` for
118+
changed values instead.
119+
113120
You can overwrite templates by writing a class that implements the template interface
114121
(or extends it to not need to copy over everything). Easiest way is to then put this class into
115122
an app and load it so you do not need to patch it on every update.

‎admin_manual/maintenance/upgrade.rst‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,7 @@ backup before every upgrade.
9393

9494
Then review third-party apps, if you have any, for compatibility with the new
9595
Nextcloud release. Any apps that are not developed by Nextcloud show a 3rd party
96-
designation. **Install unsupported apps at your own risk**. Then, before the
97-
upgrade, all 3rd party apps must be disabled. After the upgrade is complete you
98-
may re-enable them.
96+
designation. **Install unsupported apps at your own risk**.
9997

10098
Maintenance mode
10199
----------------

0 commit comments

Comments
 (0)