fix(2.7.1): Auskuenfte, die stimmen - Fassung, Health, doctor, Ansicht
Der erste Durchlauf der Testinstanz hat neun Bugs zutage gefoerdert, und fast
alle waren dieselbe Sorte Fehler: eine Auskunft, die nicht stimmte.
Am folgenreichsten die Fassung. config/config.php fuehrte app.version als feste
Zeichenkette und stand seit 2.0.0 darauf, waehrend 2.7.0 lief - unbemerkt, weil
die Datei gitignored ist und in keinem Diff auftaucht. Zwei gemeldete Bugs sind
daran fehldiagnostiziert worden ("der Server ist zu alt"). src/bootstrap.php
leitet die Fassung jetzt aus "current" in public/docs/changelog.json ab.
Im Einzelnen:
- #346 Fassung aus dem Changelog statt aus der Konfiguration
- #60 /api/health ueberlebt eine leere Datenbank: eigener Check "schema",
healthy=false mit Begruendung statt HTTP 500
- #54 dc-testkit doctor prueft Mindestfassung (semantisch) und Rechte, statt
sie nur anzuzeigen - dafuer neu: GET /api/tokens/v1/whoami
- #53 dc-testkit.sh unter /testkit/ erreichbar (Route fehlte, der
dokumentierte Bezugsweg hat nie funktioniert) und mit LF ausgeliefert
(deploy.py/deploy_dev.py entfernen CR bei .sh/.bash beim Upload)
- #288 Filter und Formulare werfen nicht mehr aufs Dashboard zurueck: die
offene Ansicht wandert bei GET als "view" in den Query-String, und die
Filter loesen ueber requestSubmit() aus - form.submit() erzeugt kein
submit-Ereignis, weshalb der zentrale Zuhoerer dort nie lief
- #347 /api/bugtracker/v1/roadmap auch ohne .php erreichbar
- #55 Fassungshinweis in TESTUMGEBUNG.md 4.6 (serverseitig war das mit 2.6.0
bereits behoben)
Nicht geprueft: php -l. Auf dem Arbeitsplatz ist kein PHP installiert; die
Abnahme laeuft ueber die Testinstanz.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
afcbb3c091
commit
3b56839a1e
+31
-1
@@ -17,6 +17,7 @@ gibt gruenes Licht fuer Code, den er nie gesehen hat.
|
||||
import os
|
||||
import json
|
||||
import ftplib
|
||||
import io
|
||||
import subprocess
|
||||
import sys
|
||||
import hashlib
|
||||
@@ -110,6 +111,35 @@ def should_ignore(rel_path):
|
||||
return True
|
||||
return False
|
||||
|
||||
# Dateien, die auf dem Server ausgefuehrt oder von einer Shell gelesen werden.
|
||||
# Fuer sie ist CRLF kein Schoenheitsfehler, sondern ein Abbruch.
|
||||
LF_REQUIRED_SUFFIXES = {'.sh', '.bash'}
|
||||
|
||||
|
||||
def open_for_upload(full_path):
|
||||
"""
|
||||
Oeffnet eine Datei zum Hochladen und entfernt bei Shell-Skripten das CR.
|
||||
|
||||
Warum das noetig ist, obwohl .gitattributes "*.sh text eol=lf" fuehrt:
|
||||
Normalisiert wird beim EINCHECKEN. Eine Arbeitskopie, die vorher schon
|
||||
CRLF hatte, bleibt unberuehrt - und genau die laedt dieses Skript hoch,
|
||||
denn es liest den Arbeitsbaum, nicht den Index. storbinary uebertraegt
|
||||
Byte fuer Byte. So landete public/testkit/dc-testkit.sh mit CRLF im
|
||||
Webroot und scheiterte auf der Linux-VM mit
|
||||
"env: bash\r: No such file or directory".
|
||||
|
||||
Die Umwandlung hier schuetzt unabhaengig davon, von welchem Rechner
|
||||
ausgeliefert wird und in welchem Zustand die Arbeitskopie ist.
|
||||
"""
|
||||
if os.path.splitext(full_path)[1].lower() not in LF_REQUIRED_SUFFIXES:
|
||||
return open(full_path, 'rb')
|
||||
|
||||
with open(full_path, 'rb') as handle:
|
||||
data = handle.read()
|
||||
|
||||
return io.BytesIO(data.replace(b'\r\n', b'\n'))
|
||||
|
||||
|
||||
def collect_changes(cache):
|
||||
"""Ermittelt alle Dateien, die sich seit dem letzten Deployment geaendert haben."""
|
||||
files_to_upload = []
|
||||
@@ -216,7 +246,7 @@ def deploy():
|
||||
|
||||
ftp.cwd('/')
|
||||
print(f"Uploading {rel_file} ...")
|
||||
with open(full_path, 'rb') as f:
|
||||
with open_for_upload(full_path) as f:
|
||||
ftp.storbinary(f"STOR {remote_file_path}", f)
|
||||
|
||||
new_cache[rel_file] = file_hash
|
||||
|
||||
Reference in New Issue
Block a user