Compare commits

..
1 Commits
Author SHA1 Message Date
truecloud-patch bot 9943033fdc docs: refresh the TrueNAS compatibility matrix 2026-08-03 06:17:38 +00:00
9 changed files with 15 additions and 44 deletions
-2
View File
@@ -1,2 +0,0 @@
github: sudolulo
ko_fi: sudolulo
+9 -10
View File
@@ -43,21 +43,20 @@ jobs:
steps:
- uses: actions/checkout@v4
# uv-managed interpreters instead of actions/setup-python: the prebuilt-CPython
# download path setup-python relies on does not work on the self-hosted Gitea
# runner (all three matrix jobs failed at setup there while passing on GitHub);
# uv works identically on both.
- uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python }}
- name: install dev deps
run: python -m pip install --upgrade pip pytest ruff
- name: ruff
# Pinned: an unpinned ruff means any upstream release can turn main red
# with no code change.
run: uvx ruff@0.16.1 check patch tests tools
run: ruff check patch tests tools
- name: pytest
run: uvx --python ${{ matrix.python }} pytest tests -v
run: pytest tests -v
- name: verify injected middleware blocks compile
# Belt-and-braces: the *_BLOCK strings are appended into live middlewared
# modules. A syntax error there would break the box at boot.
run: uvx --python ${{ matrix.python }} pytest tests/test_apply_blocks.py -v
run: pytest tests/test_apply_blocks.py -v
+1 -1
View File
@@ -124,7 +124,7 @@ jobs:
echo "--- release body ---"
cat /tmp/notes.md
# This repo is canonically hosted on Gitea (git.arch.fyi) and mirrored to
# This repo is canonically hosted on Gitea (git.onetick.ninja) and mirrored to
# GitHub, and BOTH run this workflow -- Gitea reads .github/workflows too. So
# the publish step has to work on whichever forge it lands on. Everything
# above is forge-agnostic; only the "create a release" API differs.
-12
View File
@@ -9,18 +9,6 @@ worse than no alert, because one day it carries a security fix.
## Unreleased
### Changed
- **CI's python matrix is green on the self-hosted Gitea runner again.** The real
failure was that the Gitea runner image executes jobs as root, and the two
unreadable-sidecar tests build their scenario with `chmod(0)` — which cannot make
a file unreadable for root (`CAP_DAC_OVERRIDE`). Those two tests now skip as root
with that reason; GitHub's non-root runner still exercises them. The matrix also
moved to uv-managed interpreters (one toolchain across both runners) and ruff is
pinned to 0.16.1 so an upstream ruff release can't turn `main` red without a code
change.
- **README badges point at the public GitHub mirror** (workflow status and
releases) instead of the private forge. The release badge had also been reading
the stale Gitea v0.6.1 release instead of the current v0.7.0 on GitHub.
- **`master` is now labelled `27-dev`, because it is not the next release.** iX
branches each major onto its own `release/` line and master rolls straight on to the
one after — on 2026-07-14 every recent commit on master targeted `27.0.0-BETA.1`
-4
View File
@@ -1,4 +0,0 @@
truenas-truecloud-patch
Parts of this project were written with AI assistance (Claude); all of it is
reviewed and tested before release.
+2 -6
View File
@@ -1,7 +1,5 @@
# truenas-truecloud-patch
[![CI](https://git.arch.fyi/flan/truenas-truecloud-patch/actions/workflows/ci.yml/badge.svg)](https://git.arch.fyi/flan/truenas-truecloud-patch/actions)
Extends TrueNAS SCALE's **TrueCloud Backup** to:
- back up to **Backblaze B2 and any S3-compatible provider**, not just Storj;
@@ -238,7 +236,5 @@ and restores the original UI bundle from backup.
- Filing a TrueNAS bug? **Remove the patch first** and reproduce on a stock system.
- Provided as-is, no warranty. See LICENSE.
## Support
If truenas-truecloud-patch is useful to you, consider supporting development via
[GitHub Sponsors](https://github.com/sponsors/sudolulo) or [Ko-fi](https://ko-fi.com/sudolulo).
Parts of this project were written with AI assistance (Claude); all of it is reviewed
and tested before release. Bugs are mine.
+1 -1
View File
@@ -25,7 +25,7 @@ are worth calling out, because nothing else would catch what they catch:
newest CHANGELOG entry. `VERSION=` had silently drifted to three different
values across the scripts before anything checked.
The project is hosted on **Gitea** (`git.arch.fyi/flan/truenas-truecloud-patch`)
The project is hosted on **Gitea** (`git.onetick.ninja/flan/truenas-truecloud-patch`)
and mirrored to GitHub. Both run the same workflows — Gitea reads
`.github/workflows/` too — so a change is checked twice, on two independent runners.
+2 -2
View File
@@ -47,8 +47,8 @@ _VERSION_RE = re.compile(r'^VERSION="([^"]+)"', re.M)
#: owner/repo out of any of:
#: git@github.com:sudolulo/repo.git
#: https://github.com/sudolulo/repo.git
#: ssh://git@git.arch.fyi:55214/flan/repo.git
#: https://git.arch.fyi/flan/repo.git
#: ssh://git@git.onetick.ninja:55214/flan/repo.git
#: https://git.onetick.ninja/flan/repo.git
#: The SSH port is deliberately not captured: it is not the web port.
_REMOTE_RE = re.compile(
r"^(?:\w+://)?(?:[^@/]+@)?([^:/]+)(?::\d+)?[:/]([^/]+)/([^/]+?)(?:\.git)?/?$"
-6
View File
@@ -1914,9 +1914,6 @@ class TestTheSnapshotRecordIsNeverLostToAnUnreadableFile:
only record of a tree it had just failed to read.
"""
@pytest.mark.skipif(os.geteuid() == 0, reason=
"chmod(0) cannot make a file unreadable for root (CAP_DAC_OVERRIDE); "
"the Gitea runner image executes jobs as root")
def test_an_unreadable_sidecar_raises_rather_than_reading_as_empty(self, tmp_path):
sc = tmp_path / "cloud_backup-5.snapshot"
sc.write_text("Tap@snap\n")
@@ -1930,9 +1927,6 @@ class TestTheSnapshotRecordIsNeverLostToAnUnreadableFile:
def test_a_missing_sidecar_is_simply_empty(self, tmp_path):
assert tn._read_sidecar(str(tmp_path / "nope")) == []
@pytest.mark.skipif(os.geteuid() == 0, reason=
"chmod(0) cannot make a file unreadable for root (CAP_DAC_OVERRIDE); "
"the Gitea runner image executes jobs as root")
def test_cleanup_all_still_UNMOUNTS_when_a_sidecar_cannot_be_read(self, tmp_path):
# cleanup_all is what recover.sh and uninstall.sh call, i.e. it runs precisely
# when the box is already stuck. Its job is to get the mounts off. Aborting on