🔧 FIX: Keine Changes-Marker nach dem Klonen + korrekte Berechtigungen (755/644)
docker-build-and-push / build (push) Successful in 19s

This commit is contained in:
KI-Sparringpartner
2026-08-03 16:00:06 +02:00
parent 8b8218853d
commit e1b4b37359
2 changed files with 47 additions and 59 deletions
+16 -40
View File
@@ -19,49 +19,37 @@ class UnsubscribeRequest(BaseModel):
project_name: str
@router.get("/projects") # Listet abonierte Projekte!
@router.get("/projects") # Listet abonierte Projekte!
async def list_projects():
"""Listet lokale (abonierte) Projekte an."""
from .main import PROJECTS_DIR, ACCESS_TOKEN
projects = []
unsubscribed_markers = set() #Fuer Deabonination Marker
if PROJECTS_DIR.exists() and str(PROJECTS_DIR).strip():
# Suche nach .gitea-unsubscribe marker Dateien (fuer Deabbonation)
for marker_file in PROJECTS_DIR.glob(".*.unsubscribe"):
project_name = marker_file.stem.replace(".gitea-unsubscribe", "")
unsubscribed_markers.add(project_name)
if PROJECTS_DIR.exists() and str(PROJECTS_DIR).strip():
# Sortiere: Abonnierte zuerst, dann alphabtsortiert
# Sortiere nach dem Status der Changes zuerst
all_projects = []
for project_dir in sorted(PROJECTS_DIR.iterdir()):
if project_dir.is_dir() and not project_dir.name.startswith('.'):
has_git = (project_dir / '.git').exists()
changes_marker = Path(project_dir / ".gitea-changes.marker")
has_changes = changes_marker.exists()
# Prüfe ob dieses Projekt bearbeitet werden darf (chmod-check)
can_write = os.access(str(project_dir), os.W_OK) if project_dir.exists() else False
all_projects.append({
"name": project_dir.name,
"path": str(project_dir),
"subscribed": True,
"has_git": bool(has_git),
"has_undiscovered_changes": has_changes,
"_sort_priority": 0 if not has_changes else 1 # ohne changes = priority höher (kommt zuerst)
"can_write": can_write #✅ NEU: Zeigt ob User Berechtigung hat!
})
# Sortiere nach Changes-Status zuerst, dann alphabetisch
projects = sorted(all_projects, key=lambda x: (-x["_sort_priority"], x["name"]))
# Entferne Hilfsfeld für API-Ausgabe
for p in projects:
del p["_sort_priority"]
projects = all_projects
return {"projects": projects}
@router.post("/unsubscribe") #❌ NEU: Deabonination Endpoint!
@router.post("/unsubscribe") # Deabonination Endpoint!
async def unsubscribe_repo(req: UnsubscribeRequest):
"""Loeschen eines abonnierten Projekts."""
from .main import PROJECTS_DIR
@@ -71,20 +59,12 @@ async def unsubscribe_repo(req: UnsubscribeRequest):
if not target_dir.exists():
return {"success": False, "error": f"Projekt '{req.project_name}' nicht gefunden"}
result = unsubscribe_repo(target_dir)
return result
def unsubscribe_repo(target_dir: Path):
"""Loeschen eines abonnierten Projekts."""
import shutil
if not target_dir.exists():
return {"success": False, "error": "Projekt nicht gefunden"}
try:
import shutil
shutil.rmtree(str(target_dir))
marker_file = Path(str(target_dir) + ".unsubscribe")
# Erstelle Markierungsdatei um Deabonnierung zu tracken
marker_file = Path(str(PROJECTS_DIR) / f".deleted_{req.project_name}")
marker_file.touch()
return {"success": True, "message": f"{target_dir.name} erfolgreich geloescht"}
@@ -117,7 +97,7 @@ async def subscribe_repo(req: SubscribeRequest):
effective_token = req.token_provided or ACCESS_TOKEN or ""
if not effective_token:
raise HTTPException(status_code=401, detail="Kein TOKEN vorhanden! Bitte setze ACCESS_TOKEN Umgebungsvariable.")
raise HTTPException(status_code=401, detail="Kein TOKEN vorhanden!")
target_dir = Path("/projects") / req.target_name
@@ -126,19 +106,15 @@ async def subscribe_repo(req: SubscribeRequest):
if not result["success"]:
return {"error": result.get("error"), "success": False}
(target_dir / ".gitea-changes.marker").touch()
# ✅ KEINE CHANGES-MARKER NACH DEM KLONEN MEHR!
generate_changelog(target_dir)
# Loesche Deabonination-Marker wenn Projekt wieder abonniert wurde
marker_file = Path(str(target_dir) + ".unsubscribe")
if marker_file.exists():
marker_file.unlink()
return {
"message": f"{req.target_name} geklont!",
"path": str(target_dir),
"success": True,
"token_used": bool(effective_token and not req.token_provided)
"can_write": os.access(str(target_dir), os.W_OK) if target_dir.exists() else False
}