diff --git a/backend/services/ideen.py b/backend/services/ideen.py index bad786d..59b3efd 100644 --- a/backend/services/ideen.py +++ b/backend/services/ideen.py @@ -582,10 +582,22 @@ def prio_task(task_id: str, richtung: str) -> dict: # ~/.git-credentials), damit der Commander es DIREKT im Auftragsbuch liest, # ohne das Repo aufzumachen (User-Wunsch 20.07.). _GITEA_HOST = "git.tobisniceshomelab.ddnsfree.com" +# Kein Raten am Zeilenende: greedy bis zum ersten Nicht-Repo-Zeichen matchen und den +# Treffer HINTERHER säubern. (Der Worker schreibt die URL gern in Markdown-Backticks — +# eine Lookahead-Liste erwischt sowas nie zuverlässig, Bug-Fund 20.07.) _GITEA_REPO_RX = re.compile( - re.escape(_GITEA_HOST) + r"/([A-Za-z0-9_.-]+/[A-Za-z0-9_][A-Za-z0-9_.-]*?)(?:\.git)?(?=[\s)\"'<>]|/?$)" + re.escape(_GITEA_HOST) + r"/([A-Za-z0-9_.-]+/[A-Za-z0-9_][A-Za-z0-9_.-]*)" ) -_REPO_FALLBACK_RX = re.compile(r"[Rr]epo\S*[:\s]+([A-Za-z0-9_.-]+/[A-Za-z0-9_][A-Za-z0-9_.-]*)") +_REPO_FALLBACK_RX = re.compile(r"[Rr]epo\S*[:\s]+[`'\"]?([A-Za-z0-9_.-]+/[A-Za-z0-9_][A-Za-z0-9_.-]*)") + + +def _clean_repo(raw: str) -> str | None: + """Trailing Markdown-/Satzzeichen und .git vom Treffer abschneiden.""" + r = (raw or "").strip().strip("`'\"") + r = r.rstrip(".,;:)»>") + r = re.sub(r"\.git$", "", r) + r = r.rstrip(".,;:") + return r or None _KONZEPT_NAMES = ("KONZEPT.md", "Konzept.md", "konzept.md", "CONCEPT.md") _konzept_cache: dict = {} @@ -609,9 +621,9 @@ def _extract_repo(text: str) -> str | None: return None m = _GITEA_REPO_RX.search(text) if m: - return m.group(1) + return _clean_repo(m.group(1)) m = _REPO_FALLBACK_RX.search(text) - return m.group(1) if m else None + return _clean_repo(m.group(1)) if m else None def konzept_of(task_id: str) -> dict: