Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migration to Python #9

Open
wants to merge 636 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
636 commits
Select commit Hold shift + click to select a range
fdd6c54
Verschiebe Entschlüsselung und Mountvorgang in CLI
MaxG87 Jul 20, 2022
2d155e2
Schreibe prepare_btrfs_... um als Path-basiert
MaxG87 Jun 28, 2022
e77542e
Schreibe prepare_restic_... um als Path-basiert
MaxG87 Jun 28, 2022
425de59
Entferne ungenutzte Fixture
MaxG87 Jul 20, 2022
1f03de8
Erweitere CLI-Fehler-Tests auch auf andere Subkommandos
MaxG87 Jul 22, 2022
5caca43
Verzeichnisse werden nicht mehr als Konfigurationsdatei akzeptiert
MaxG87 Jul 22, 2022
bb05dae
Erstelle Rumpf des CLI-Kommando "format-device"
MaxG87 Jul 22, 2022
132427b
Ausgabe valider Konfiguration von `format-device`
MaxG87 Jul 23, 2022
ed26068
Ergänze `format-device`-Tests um etwas mehr Semantik
MaxG87 Jul 23, 2022
9185345
Unlesbare Dateien werden nicht mehr als Konfigurationsdatei akzeptiert
MaxG87 Jul 22, 2022
2533965
Verbessere Überprüfung der Konfigurations-Option
MaxG87 Jul 22, 2022
fc0f111
Erstelle BackupBackends
MaxG87 Jul 20, 2022
1d5627f
Erstelle BackendFactory
MaxG87 Jul 20, 2022
334bb42
Erstelle Unterkommando `format-device`
MaxG87 Jul 23, 2022
75ea5f5
Ersetze `backup_logic` durch BackupBackend
MaxG87 Jul 20, 2022
3d8b08f
Ändere `load_configuration` zu `parse_configuration`
MaxG87 Jul 23, 2022
ed858d0
Entferne nun ungenutztes Modul
MaxG87 Jul 20, 2022
1ffe4a1
Streiche `format-device` aus Liste ausstehender Aufgaben
MaxG87 Jul 23, 2022
dd3b06d
Entferne Aufgabenpunkt aus README.md
MaxG87 Jul 23, 2022
6ba764b
Verbessere Erklärung über fehlschlagende Tests
MaxG87 Jul 23, 2022
881203c
Ersetze backup_logic durch BackupBackend
MaxG87 Jul 23, 2022
38f3df8
Aktualisiere alle Abhängigkeiten auf die neueste Version
MaxG87 Jul 23, 2022
5e78914
Dokumentiere CLI-Kommandos mit Docstrings
MaxG87 Jul 23, 2022
cdaf8c0
Entferne auskommentierte Zeile
MaxG87 Jul 23, 2022
60a7ec6
Benenne Gerät nach Speichermedium um
MaxG87 Jul 23, 2022
de5a7fb
Füge Kommando `version` hinzu
MaxG87 Jul 23, 2022
cb8540b
Hebe Minor-Version an
MaxG87 Jul 23, 2022
e21dedd
Ergänze README.md um zwei Verbesserungsideen
MaxG87 Jul 25, 2022
dd5d906
Entferne Unterstützung für Python3.7
MaxG87 Jul 25, 2022
51e6101
Setze readable-Argument korrekt
MaxG87 Jul 26, 2022
49b5dd1
Hebe Patchlevel an
MaxG87 Jul 26, 2022
ff561a3
Füge `.mypy_cache` zu gitignore hinzu
MaxG87 Sep 11, 2022
84321bd
Behebe kleinen Grammtikfehler in Kommentar
MaxG87 Sep 11, 2022
bad1433
Benenne mounted_btrfs_device nach mounted_device um
MaxG87 Sep 14, 2022
535aad0
Setze Besitzer und Gruppe für Restic-Repository
MaxG87 Sep 11, 2022
9232e3a
Entferne überflüssiges `chown` in Tests
MaxG87 Sep 11, 2022
df26459
Setze Besitzer und Gruppe des Restic-Repositories
MaxG87 Sep 14, 2022
97e29e5
Hebe Minor-Version an
MaxG87 Sep 14, 2022
0182026
Kleinere Verbesserungen an README
MaxG87 Sep 16, 2022
5847c3d
Fix group in chmod
prataffel Sep 19, 2022
48ed3d2
Verschiebe Bestimmung der Gruppe in dedizierte Hilfsfunktion
MaxG87 Sep 20, 2022
a0e3c27
Erweitere Test um Überprüfung der erwarteten Gruppe
MaxG87 Sep 20, 2022
dfd65c8
Nutze `getpass.getuser` zur Nutzerbestimmung
MaxG87 Sep 20, 2022
94c8cda
Test chown if the user's group is not the username
prataffel Sep 21, 2022
8a2a5ab
Erweitere Kommentar in Dockerfile
MaxG87 Sep 22, 2022
b1b1de9
Setze Gruppenzugehörigkeit des Restic-Repositories korrekt
MaxG87 Sep 22, 2022
d14cdc8
Hebe Patchlevel an
MaxG87 Sep 22, 2022
b5c5edb
Unterbinde Dateisystemgrenzenüberquerung mit Restic
MaxG87 Sep 29, 2022
03c5f1a
Ändere Argumentreihenfolge für format-device
MaxG87 Sep 29, 2022
3f7cfb1
Verbessere Formatierung der ausgegebenen Konfiguration
MaxG87 Sep 29, 2022
b33830b
Füge Option `config-to` zu `format-device` hinzu
MaxG87 Sep 29, 2022
a7aa63e
Füge Hilfetext für `config-to` hinzu
MaxG87 Sep 29, 2022
4739e01
Füge Abschnitt über Bedrohungsszenario hinzu
MaxG87 Sep 30, 2022
c1e8e54
Korrigiere Formatierung der README durch `prettier`
MaxG87 Sep 30, 2022
233cfd1
Wechsel auf präzisere Namen
MaxG87 Sep 30, 2022
043f9be
Hebe Hauptversion auf 3.0.0 an
MaxG87 Sep 30, 2022
53a25f1
Füge Screencast hinzu
MaxG87 Sep 30, 2022
fb6d65b
Füge Logo hinzu
MaxG87 Sep 30, 2022
2ccd9b8
Passe Schlagzeile der README an
MaxG87 Sep 30, 2022
b55a7a6
Füge Logo in README ein
MaxG87 Sep 30, 2022
bc1a603
Verschiebe Abzeichen vor Hauptüberschrift
MaxG87 Sep 30, 2022
a419695
Verschiebe Logo zwischen Abzeichen und Hauptüberschrift
MaxG87 Sep 30, 2022
010d2d0
Entferne überflüssige Leerzeile
MaxG87 Sep 30, 2022
b45ac42
Füge Logo zu Projekt und README hinzu
MaxG87 Sep 30, 2022
455e783
Entferne Vermerk, Logo zu erstellen
MaxG87 Sep 30, 2022
b4bfdae
Füge neuen Vermerk für ausstehende Aufgaben hinzu
MaxG87 Sep 30, 2022
12cc441
Explizite Nennung des Tests, der anfangs fehlschlägt
MaxG87 Sep 30, 2022
ca716f5
Entferne Verweis auf ähnliche Projekte
MaxG87 Sep 30, 2022
c6105db
Verbessere Logo leicht
MaxG87 Oct 2, 2022
96140f6
Extrahiere geteilte Attribute in Basisklasse
MaxG87 Oct 6, 2022
80a941c
Repariere im vorhergehenden Merge kaputt gemachten Test
MaxG87 Oct 6, 2022
ec3d66d
Erlaube Konfiguration des Kompressionslevels
MaxG87 Oct 6, 2022
acf04d3
Erweitere Konfiguration-Roundtrip-Tests
MaxG87 Oct 6, 2022
ed79e95
Übergebe Kompressionskonfiguration bis zum Mount-Befehl
MaxG87 Oct 6, 2022
4c3c729
Verwende Kompressionskonfiguration in Mount-Befehl
MaxG87 Oct 6, 2022
a55bda6
Erweitere Beispielkonfiguration
MaxG87 Oct 6, 2022
431ae80
Entferne "null"-Feld aus Beispielkonfiguration
MaxG87 Oct 9, 2022
a5ae827
Erlaube Konfiguration der Dateisystemkompression
MaxG87 Oct 9, 2022
34e43b5
Hebe Minor-Version an
MaxG87 Oct 9, 2022
ad87e9e
Füge Sphinx als Entwicklungsabhängigkeit hinzu
MaxG87 Oct 4, 2022
17f9065
Installiere sphinx_rtd_theme
MaxG87 Oct 4, 2022
9e89444
Füge von `sphinx-quickstart` erzeugte Dateien hinzu
MaxG87 Oct 4, 2022
54615bf
Nutze Designthema sphinx_rtd_theme
MaxG87 Oct 4, 2022
b9d5fe4
Baue erste API-Referenz
MaxG87 Oct 4, 2022
364a7f1
Verschiebe Gefährdungsszenario in Dokumentation
MaxG87 Oct 12, 2022
6728c12
Referenziere beide Dokumentationsseiten in `indext.rst`
MaxG87 Oct 12, 2022
74c8263
Überführe Tabelle ins RestructuredText-Format
MaxG87 Oct 12, 2022
9eae1d5
Reformatiere conf.py
MaxG87 Oct 12, 2022
a7eba68
Füge numpydoc zu Sphinx-Konfiguration hinzu
MaxG87 Oct 12, 2022
0e53c2a
Füge ReadTheDocs-Konfiguration hinzu
MaxG87 Oct 12, 2022
d7b08dc
Füge weiteren Abschnitt zu RTD-Konfiguration hinzu
MaxG87 Oct 12, 2022
f8f9130
Korrigiere os-Eintrag
MaxG87 Oct 12, 2022
58677a0
Ersetze numpydoc mit napoleon
MaxG87 Oct 12, 2022
4d18143
Verwende `--delete-excluded` in BtrFSRsyncBackend
MaxG87 Dec 20, 2022
2783d57
Erkenne und vermeide Subvolume-Namenskonflikte
MaxG87 Dec 21, 2022
ff7c4a7
Hebe Bugfix-Version an
MaxG87 Dec 21, 2022
1314715
Beende st.text an st.text zu übergeben
MaxG87 Feb 8, 2023
e454adc
Aktualisiere alle Docker-Images
MaxG87 Feb 8, 2023
f2ccf8b
Erkläre Kompatibilität mit Python 3.11
MaxG87 Feb 8, 2023
84fbbe9
Aktualisiere Projekt auf Poetry 1.3.2
MaxG87 Feb 8, 2023
679f02d
Installiere poetry via pip
MaxG87 Feb 8, 2023
b7d3f0a
Entferne curl aus Dockerimages
MaxG87 Feb 8, 2023
71fafa5
Aktualisiere DockerImages, Poetry und unterstützte Python-Version
MaxG87 Feb 8, 2023
ae06db3
Aktualisiere fast alle Pakete
MaxG87 Feb 8, 2023
a656606
Hebe Python-Mindestversion auf 3.8.1 an
MaxG87 Feb 8, 2023
39a3e09
Aktualisiere flake8
MaxG87 Feb 8, 2023
46024f8
Aktiviere weitere Striktheitsschalter in mypy
MaxG87 Feb 8, 2023
29ca7a5
Vereinfache Bestimmung des Root-Gerätes
MaxG87 Feb 8, 2023
578d72a
Verbiete Verwendung möglicherweise ungenutzter Variablen
MaxG87 Feb 8, 2023
73e0e68
Entferne Schalter mit Voreinstellungswert
MaxG87 Feb 8, 2023
863eee5
Füge flake8-comprehensions hinzu
MaxG87 Feb 8, 2023
fa5a291
Füge flake8-builtins hinzu
MaxG87 Feb 8, 2023
066b289
Hebe Version aller Python-Abhängigkeiten an
MaxG87 Feb 8, 2023
50cfb1f
Hebe Version auf 3.2.0 an
MaxG87 Feb 8, 2023
8e5c00a
Wechsle zu nicht-negierten Optionen in mypy
MaxG87 Feb 21, 2023
d3e779c
Füge einige Rückgabetypannotationen hinzu
MaxG87 Feb 22, 2023
aa22da5
Restrukturiere Konfiguration mypys
MaxG87 Feb 22, 2023
ab4b9a4
Aktiviere den Strikt-Modus mypys
MaxG87 Feb 22, 2023
8d285c1
Aktiviere mypys strengen Modus
MaxG87 Mar 9, 2023
bdb6243
Füge Ruff zu dev-dependencies hinzu
MaxG87 Feb 20, 2023
6b3cce3
Erstelle erste Ruff-Konfiguration
MaxG87 Feb 21, 2023
0a06e93
Konfiguriere src/ als Projektwurzel in Ruff
MaxG87 Feb 21, 2023
b73e99b
Aktiviere den PIE-Regelsatz in Ruff
MaxG87 Feb 21, 2023
c915d75
Füge Ruff als Linter hinzu
MaxG87 Mar 9, 2023
c1d21b1
Aktiviere gesamte C-Regel-Menge
MaxG87 Mar 22, 2023
f47088a
Ignoriere PLC1901
MaxG87 Mar 22, 2023
4091225
Überprüfe Importsortierung mit Ruff
MaxG87 Mar 24, 2023
d2aef4f
Entferne isort
MaxG87 Apr 7, 2023
6e32767
Füge RUF als Regelsatz für `ruff` hinzu
MaxG87 Mar 22, 2023
17d5965
Entferne isort und flake8
MaxG87 Mar 22, 2023
7737a1b
Aktualisiere alle Abhängigkeiten
MaxG87 Mar 22, 2023
f14eea4
Behebe kleinen Tippfehler
MaxG87 Jun 15, 2023
0c1e04c
Behebe Fehler in Makefile
MaxG87 Jun 15, 2023
a1a3318
Hebe Version aller Dockerimages an
MaxG87 Jun 15, 2023
c04867b
Beziehe Poetry aus Arch-Repositories
MaxG87 Jun 15, 2023
2313516
Beziehe Poetry aus Debian-Repositories
MaxG87 Jun 15, 2023
7a4dbb0
Hebe Poetry-Version in Python Dockerimages an
MaxG87 Jun 15, 2023
ac64970
Wartungsarbeiten an Test Suite
MaxG87 Jun 15, 2023
8d4eede
Füge shell-interface als externe Bibliothek hinzu
MaxG87 Jun 15, 2023
7dffea4
Verwende externe Bibliothek `shell-interface`
MaxG87 Jun 15, 2023
f3b58ff
Entferne integriertes Modul `shell-interface`
MaxG87 Jun 15, 2023
f7d77b8
Ersetze integriertes `shell-interface` durch ausgelagertes
MaxG87 Jun 15, 2023
03dcb77
Entferne flake8-Konfigurationsdatei
MaxG87 Jun 15, 2023
4341654
Füge storage-device-managers von PyPI hinzu
MaxG87 Jun 15, 2023
66d6da5
Wechsle zu externem storage_device_managers
MaxG87 Jun 15, 2023
4c335bd
Entferne allen inkludierten device_managers Code
MaxG87 Jun 15, 2023
3b187d6
Ersetze integriertes `device_managers` durch ausgelagertes
MaxG87 Jun 15, 2023
6f9fad5
Hebe Version von storage-device-managers an
MaxG87 Jun 16, 2023
24d7a74
Behebe Problem bzgl. impliziten Weiterexports
MaxG87 Jun 16, 2023
87f41cd
Lasse nutzlose Übergabe des Kompressionsverfahrens an `sh.mounted_dev…
MaxG87 Jun 16, 2023
313478a
Setze $USER als Besitzer des Sicherungskopiegerätes ein
MaxG87 Jun 16, 2023
1545e52
Setze $USER als Besitzer des Sicherungskopiegerätes ein
MaxG87 Jun 16, 2023
7191624
Hebe Version auf 3.2.1 an
MaxG87 Jun 16, 2023
9635282
Hebe Version des storage_device_managers auf 0.11.1 an
MaxG87 Jun 16, 2023
3c0b236
Beschleunige Testsuite mit neuem Flag `fast_and_insecure`
MaxG87 Jun 16, 2023
f8b0447
Erweitere .gitignore
MaxG87 Jun 26, 2023
ac0e7a0
Aktualisiere alle Abhängigkeiten (dev und prod)
MaxG87 Jul 15, 2023
451e871
Erstelle `big_file` einmalig und kopiere bei Bedarf
MaxG87 Aug 14, 2023
3fb78b9
Erstelle BtrFSRsync-Datei einmalig und kopiere bei Bedarf
MaxG87 Aug 14, 2023
412934c
Erstelle Restic-Datei einmalig und kopiere bei Bedarf
MaxG87 Aug 14, 2023
32ae90e
Vereinfache Fixture durch Nutzung von NamedTemporaryFile
MaxG87 Aug 14, 2023
6cb7668
Entferne überflüssigen Test
MaxG87 Aug 14, 2023
bb3fbc3
Entferne ungenutzte `get_random_filename`
MaxG87 Aug 14, 2023
61e93ef
Leite ungeparste Konfiguration aus Konfigurationsinstanz ab
MaxG87 Aug 14, 2023
305a644
Beende Nutzung des Schalters `fast_and_insecure`
MaxG87 Aug 14, 2023
c3ace70
Beschleunigung und Bereinigung der Testsuite
MaxG87 Aug 14, 2023
e1e6e59
Behebe Formatierungsfehler
MaxG87 Aug 14, 2023
4804999
Füge Workflow-Definition als Kopie hinzu
MaxG87 Aug 16, 2023
b467858
Entferne ungültige Extraabhängigkeitsangabe
MaxG87 Aug 16, 2023
45f9bcf
Installiere restic in den CI-Testcontainer
MaxG87 Aug 16, 2023
986118e
Füge CI/CD als Github Workflow hinzu
MaxG87 Aug 17, 2023
2aec814
Hebe Version auf v3.3.1 an
MaxG87 Aug 17, 2023
a297aa8
Füge Rich als Extraabhängigkeit dazu
MaxG87 Aug 17, 2023
eb8b9ef
Erweitere Testmatrix um all-Extra
MaxG87 Aug 17, 2023
61f0d39
Ermögliche schönes CLI mit Rich
MaxG87 Aug 17, 2023
2b9eeeb
Merge abgebrochenen Versuch zur Einrichtung von ReadTheDocs
MaxG87 Aug 17, 2023
7f08839
ci: Richte CI-Pipeline "release-please" ein
MaxG87 Dec 14, 2023
7a5f310
ci: Verwende spezielles Zugangstoken für release-please
MaxG87 Dec 14, 2023
9e0b2bf
ci: Füge release-please der CI/CD-Pipeline hinzu
MaxG87 Dec 14, 2023
1efd945
chore: Benenne docker-images/ in dockerfiles/ um
MaxG87 Aug 17, 2023
c7cf981
docs: Überarbeite Abschnitt zu Testsuite in README
MaxG87 Aug 20, 2023
76ce803
ci: Verwende automatisch alle Dockerfiles für run-docker-tests
MaxG87 Aug 17, 2023
31f2b06
ci: Verwende `--rm`-Flag für `docker run`
MaxG87 Nov 25, 2023
082b660
ci: Verbessere Make-unterstützte Testsuite
MaxG87 Aug 17, 2023
fb28908
ci: Entferne veraltete Einstellung aus Workflow
MaxG87 Dec 15, 2023
3b38ac5
test: Verwende Poetry 1.7.1 in allen Docker-Tests
MaxG87 Dec 14, 2023
1d7b947
test: Aktualisiere alle Docker-Images
MaxG87 Dec 14, 2023
fb35a9a
test: Füge Python 3.12 zu Docker-Tests hinzu
MaxG87 Dec 14, 2023
9c51437
deps: Relock aller Abhängigkeiten
MaxG87 Dec 14, 2023
4b6fbfd
ci: Aktualisiere CI-Pipeline leicht
MaxG87 Dec 14, 2023
8ed2a45
ci: Verwende Poetry 1.7.1 im Veröffentlichungsschritt
MaxG87 Dec 14, 2023
ba8c332
chore: Modernisiere Tests, CI und Abhängigkeiten leicht
MaxG87 Dec 15, 2023
b335a8f
deps: Füge pytest-xdist als dev-dependency hinzu
MaxG87 Dec 15, 2023
64f1ec6
ci: Verwende pytest-xdist in lokaler CI
MaxG87 Dec 15, 2023
d2030de
ci: Erlaube parallele Ausführung der Tests
MaxG87 Dec 15, 2023
687c72d
chore: Erweitere Python-Unterstützung um Python 3.12 in pyproject.toml
MaxG87 Dec 15, 2023
6e6db2e
fix: Reduziere Pythonunterstützung zu 3.12
MaxG87 Dec 15, 2023
99a53a4
chore(main): release 3.3.2
MaxG87 Dec 15, 2023
784069f
chore: Erweitere Changelog um ein Feature
MaxG87 Dec 15, 2023
aff93b0
Merge release-please's release branch
MaxG87 Dec 15, 2023
ce50389
chore(main): release 3.3.2
MaxG87 Dec 15, 2023
62ed8c2
chore(main): release 3.3.2
MaxG87 Dec 15, 2023
31b0f7f
docs: Behebe kleinen Fehler in CHANGELOG
MaxG87 Dec 15, 2023
97bf295
ci: Erlaube direkte Ausführung einzelner Docker-Tests
MaxG87 Dec 22, 2023
f128b59
ci: Leichte Anpassungen der Dockerfiles
MaxG87 Dec 22, 2023
ef58a1e
deps: Hebe Version zweier Abhängigkeiten
MaxG87 Dec 22, 2023
26b59c5
feat: Erweitere Unterstützung auf Python 3.12
MaxG87 Dec 22, 2023
354cfd3
ci: Aufnahme von Python 3.12 in Githubs Testmatrix
MaxG87 Dec 22, 2023
711b225
Erweitere Python-Unterstützung auf 3.12
MaxG87 Dec 22, 2023
e3dc2fb
chore(main): release 3.4.0
MaxG87 Dec 22, 2023
dd787ea
Erweitere Pythonunterstützung auf 3.12
MaxG87 Dec 22, 2023
66393d7
chore(main): release 3.4.0
MaxG87 Dec 22, 2023
f94bd54
ci: Aktiviere Dependabot für Python-Abhängigkeiten
MaxG87 Jun 26, 2024
9b66553
chore(deps): Regeneriere Lockdatei
MaxG87 Jun 26, 2024
6faf06d
chore(dev-deps): Aktualisiere `black` auf 24.2.2
MaxG87 Jun 26, 2024
a132728
chore(deps): Aktualisiere `ruff` von 0.0.278 --> 0.4.10
MaxG87 Jun 26, 2024
7378ac2
Minor fixing dev-dependency updates
MaxG87 Jun 26, 2024
a08540b
ci: Verwende korrekte Referenz auf Aktionsdefinition
MaxG87 Jun 26, 2024
097b855
ci: Wechsle auf neues release-please Token
MaxG87 Jun 26, 2024
c6c8d81
build: Vermeide Doppel-/ in Makefile
MaxG87 Jul 7, 2024
8992b85
build: Behebe Make-Fehler, um Docker-Tests wieder auszuführen
MaxG87 Jul 7, 2024
6cfa620
ci: Führe dependabot nur noch monatlich aus
MaxG87 Jul 7, 2024
c5f5d3c
chore(dev-deps): Aktualisere Hypothesis
MaxG87 Jul 7, 2024
3269dc1
chore(dev-deps): Aktualisiere pynvim
MaxG87 Jul 7, 2024
b2d2aab
deps: Wechsle zu pydantic 2.0
MaxG87 Jul 7, 2024
80b0e65
refactor: Switch to model_validator
MaxG87 Jul 9, 2024
8d0dcec
Migriere auf Pydantic 2
MaxG87 Jul 9, 2024
a7b94f5
build(deps): bump typer
dependabot[bot] Jul 9, 2024
8120c8d
ci: Aktiviere Dependabot für Docker
MaxG87 Jul 9, 2024
5ce1ca9
ci: Fix package-ecosystem declaration
MaxG87 Jul 10, 2024
4c0b51e
build(deps): bump typer from 0.9.4 to 0.12.3
MaxG87 Jul 10, 2024
ecf20fb
chore(deps-dev): Remove jedi as dependency
MaxG87 Jul 21, 2024
2dc0dd6
chore(deps-dev): Bump some development dependencies
MaxG87 Jul 21, 2024
cf6b26a
chore(dockerfiles): Bump Poetry to 1.8.3 in Dockerfiles
MaxG87 Jul 21, 2024
7278ff5
test: Replace all parse_obj with model_validate
MaxG87 Jul 21, 2024
861d8d3
test: Switch to `model_dump_json` and `model_validate_json`
MaxG87 Jul 21, 2024
3ed64ee
test: Switch to ConfigDict
MaxG87 Jul 21, 2024
5135dd5
chore: Merge ButterBackup's code base
MaxG87 Jul 23, 2024
e65b58f
Finish migration to Pydantic v2
MaxG87 Jul 23, 2024
bfedaa8
Finish migration to Pydantic v2
MaxG87 Jul 23, 2024
9a8f2a3
Finish migration to Pydantic v2
MaxG87 Jul 23, 2024
01c9170
test: Replace another usage of `json()` with `model_dump_json()`
MaxG87 Jul 23, 2024
5a45f21
test: Replace another usage of `copy()` with `model_copy()`
MaxG87 Jul 23, 2024
208cc66
test: Add docstring to other fixture too
MaxG87 Jul 23, 2024
7aba49a
Finish migration to Pydantic v2 II
MaxG87 Jul 23, 2024
8593ad4
Finish migration to Pydantic v2 II
MaxG87 Jul 23, 2024
dcec19e
Replace main submodule with butter_backup
MaxG87 Jul 23, 2024
ef47596
Remove unused test
MaxG87 Jul 23, 2024
8a84819
WIP Refactoring of `open` and `close` commands
MaxG87 Jul 23, 2024
6d42768
deps: Drop support for Python 3.8
MaxG87 Jul 23, 2024
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
11 changes: 11 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
version: 2
updates:
- package-ecosystem: "pip"
directory: "/"
schedule:
interval: "monthly"
groups:
production-dependencies:
dependency-type: "production"
development-dependencies:
dependency-type: "development"
4 changes: 2 additions & 2 deletions .github/workflows/python-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@ jobs:
strategy:
matrix:
python-version: ["3.9", "3.10", "3.11", "3.12"]
dependency-extras: [""]
dependency-extras: ["", "-E all"]

steps:
- uses: actions/checkout@v3
- name: Install poetry
run: pipx install "poetry==1.5.1"
run: pipx install "poetry==1.8.3"
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/python-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
steps:
- uses: actions/checkout@v3
- name: Install poetry
run: pipx install 'poetry==1.5.1'
run: pipx install 'poetry==1.8.3'
- name: Set up Python
uses: actions/setup-python@v4
with:
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/release-please.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ jobs:
release-please:
runs-on: ubuntu-latest
steps:
- uses: google-github-actions/release-please-action@v3
- uses: googleapis/release-please-action@v4
with:
token: ${{ secrets.ReleasePlease }}
release-type: python
package-name: release-please-action
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

# Created by https://www.toptal.com/developers/gitignore/api/python
# Edit at https://www.toptal.com/developers/gitignore?templates=python

Expand Down
1 change: 0 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@

* **cicd:** Use correct project type in release-please ([2e5f5ce](https://github.com/MaxG87/root-subvol-snapshot/commit/2e5f5cea76d10758e2b3c85c2231206a04268a87))


### Documentation

* Add initial Changelog file ([8026b67](https://github.com/MaxG87/root-subvol-snapshot/commit/8026b6757a3f5984b679ec09742e356196b79b79))
Expand Down
29 changes: 29 additions & 0 deletions example.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
[
{
"BackupRepositoryFolder": "ButterBackupRepository",
"Compression": "zstd:15",
"UUID": "UUID der Festplatte wie in /dev/disk/by-uuid/ angegeben.",
"DevicePassCmd": "gpg --decrypt /pfad/zu/mein-kostbares-password",
"Folders": {
"/home/mmustermann/Downloads": "Downloads",
"/home/mmustermann/Videos/Privat": "Private-Videos",
"/shared/Bilder": "Bilder"
},
"Files": ["/etc/fstab"],
"FilesDest": "Einzeldateien"
},
{
"BackupRepositoryFolder": "ResticBackupRepository",
"ExcludePatternsFile": "~/.config/backup-exclude-patterns",
"UUID": "Noch eine UUID wie in /dev/disk/by-uuid/.",
"DevicePassCmd": "gpg --decrypt /pfad/zu/supersicheres-pwt",
"RepositoryPassCmd": "gpg --decrypt /pfad/zu/supersicheres-pwt-repo",
"FilesAndFolders": [
"/home/mmustermann/Downloads",
"/home/mmustermann/Videos/Privat",
"/shared/Bilder",
"/etc/fstab",
"~/.config/butter-backup.cfg"
]
}
]
757 changes: 531 additions & 226 deletions poetry.lock

Large diffs are not rendered by default.

72 changes: 64 additions & 8 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,76 @@ readme = "README.md"

[tool.poetry.dependencies]
python = ">=3.9,<3.13"
loguru = "^0.7.2"
pydantic = "^2.8.2"
rich = {version = "^13.7.1", optional = true}
shell-interface = "^0.13.0"
storage-device-managers = "^0.14.0"
typer = "^0.9.0"
typer = "^0.12.3"

[tool.poetry.extras]
# In fact, `typer[all]` would be preferred, but Poetry does not support to have
# optional extras of dependencies.
all = ["rich"]

[tool.poetry.group.dev.dependencies]
mypy = "^1.8.0"
ruff = "^0.2.0"
pytest = "^8.0.0"
pytest-cov = "^4.1.0"
black = "^24.4.2"
depr = "^0.2.1"
pynvim = "^0.5.0"
black = "^24.1.1"
hypothesis = "^6.108.4"
mypy = "^1.11.0"
pdbpp = "^0.10.3"
pynvim = "^0.5.0"
pytest = "^8.3.1"
pytest-cov = "^5.0.0"
pytest-xdist = "^3.6.1"
ruff = "^0.5.4"

[tool.poetry.scripts]
snapshots = "root_subvol_snapshot.cli:cli"


[tool.mypy]
plugins = [
"pydantic.mypy"
]
allow_any_unimported = false
warn_unreachable = true
enable_error_code = [
"possibly-undefined"
]
strict = true
allow_incomplete_defs = true
allow_untyped_defs = true

[[tool.mypy.overrides]]
module = "tests.*"
disable_error_code = [
"possibly-undefined"
]

[tool.pydantic-mypy]
init_forbid_extra = true
init_typed = true
warn_required_dynamic_aliases = true
warn_untyped_fields = true

[tool.pytest.ini_options]
addopts = [
"--cov", "src",
"--cov-branch",
"--cov-fail-under", "85"
]
testpaths = ["tests"]

[tool.ruff]
src = [".", "src/"]

[tool.ruff.lint]
select = ["A", "B", "C", "F", "I", "ISC", "PIE", "PL", "Q", "RUF", "SIM", "TID", "W", "YTT"]
ignore = ["E", "PLC1901", "SIM117"]
mccabe.max-complexity = 6


[build-system]
requires = ["poetry-core"]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
3 changes: 3 additions & 0 deletions src/root_subvol_snapshot/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from importlib import metadata

__version__ = metadata.version(__name__)
146 changes: 146 additions & 0 deletions src/root_subvol_snapshot/backup_backends.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
from __future__ import annotations

import abc
import datetime as dt
from dataclasses import dataclass
from pathlib import Path
from typing import Optional, Union, overload

import shell_interface as sh
from loguru import logger

from . import config_parser as cp


class BackupBackend(abc.ABC):
@abc.abstractmethod
def do_backup(self, mount_dir: Path) -> None: ...

@overload
@staticmethod
def from_config(config: cp.BtrFSRsyncConfig) -> BtrFSRsyncBackend: ...

@overload
@staticmethod
def from_config(config: cp.ResticConfig) -> ResticBackend: ...

@staticmethod
def from_config(
config: Union[cp.BtrFSRsyncConfig, cp.ResticConfig]
) -> Union[BtrFSRsyncBackend, ResticBackend]:
# Getestet durch Tests der Backuplogik
if isinstance(config, cp.BtrFSRsyncConfig):
return BtrFSRsyncBackend(config=config)
return ResticBackend(config=config)


@dataclass(frozen=True)
class BtrFSRsyncBackend(BackupBackend):
config: cp.BtrFSRsyncConfig

def do_backup(self, mount_dir: Path) -> None:
logger.info(f"Beginne mit BtrFS-Backup für Speichermedium {self.config.UUID}.")
backup_repository = mount_dir / self.config.BackupRepositoryFolder
src_snapshot = self.get_source_snapshot(backup_repository)
backup_root = self.snapshot(
src=src_snapshot, backup_repository=backup_repository
)
for src, dest_name in self.config.Folders.items():
dest = backup_root / dest_name
self.rsync_folder(src, dest, self.config.ExcludePatternsFile)

files_dest = backup_root / self.config.FilesDest
for src in self.config.Files:
self.rsync_file(src, files_dest)

@staticmethod
def get_source_snapshot(root: Path) -> Path:
return max(root.glob("202?-*"))

def snapshot(self, *, src: Path, backup_repository: Path) -> Path:
timestamp = dt.datetime.now()
date_fmt = self.config.SubvolTimestampFmt
while True:
# In order to get rid of sleeps in the tests, snapshot name
# collisions must be handled gracefully. Incrementing the timestamp
# by a few seconds seems to be acceptable both in test and real
# world scenarios.
# There is still the possibility of race conditions, where another
# process would create the target folder before a snapshot can be
# created. This possibility is believed to be negligible, so
# nothing is done to prevent it.
backup_root = backup_repository / timestamp.strftime(date_fmt)
if backup_root.exists():
timestamp += dt.timedelta(seconds=1)
else:
break
cmd: sh.StrPathList = [
"sudo",
"btrfs",
"subvolume",
"snapshot",
src,
backup_root,
]
sh.run_cmd(cmd=cmd)
return backup_root

@staticmethod
def rsync_file(src: Path, dest: Path) -> None:
cmd: sh.StrPathList = ["sudo", "rsync", "-ax", "--inplace", src, dest]
sh.run_cmd(cmd=cmd)

@staticmethod
def rsync_folder(
src: Path, dest: Path, maybe_exclude_patterns: Optional[Path]
) -> None:
cmd: sh.StrPathList = [
"sudo",
"rsync",
"-ax",
"--delete",
"--delete-excluded",
"--inplace",
]
if maybe_exclude_patterns is not None:
cmd.extend(["--exclude-from", maybe_exclude_patterns])
cmd.extend([f"{src}/", dest])
sh.run_cmd(cmd=cmd)


@dataclass(frozen=True)
class ResticBackend(BackupBackend):
config: cp.ResticConfig

def do_backup(self, mount_dir: Path) -> None:
logger.info(f"Beginne mit Restic-Backup für Speichermedium {self.config.UUID}.")
backup_repository = mount_dir / self.config.BackupRepositoryFolder
self.copy_files(backup_repository)
self.adapt_ownership(backup_repository)

@staticmethod
def adapt_ownership(backup_repository: Path) -> None:
user = sh.get_user()
group = sh.get_group(user)
chown_cmd: sh.StrPathList = [
"sudo",
"chown",
"-R",
f"{user}:{group}",
backup_repository,
]
sh.run_cmd(cmd=chown_cmd)

def copy_files(self, backup_repository: Path) -> None:
restic_cmd: sh.StrPathList = [
"sudo",
"restic",
"backup",
"--one-file-system",
"--repo",
backup_repository,
]
if self.config.ExcludePatternsFile is not None:
restic_cmd.extend(["--exclude-file", self.config.ExcludePatternsFile])
restic_cmd.extend(list(self.config.FilesAndFolders))
sh.pipe_pass_cmd_to_real_cmd(self.config.RepositoryPassCmd, restic_cmd)
Loading
Loading