mirror of
https://github.com/Sea-Haven-Industries/open-swe.git
synced 2026-09-30 09:13:14 +00:00
43 lines
1.3 KiB
Python
43 lines
1.3 KiB
Python
|
|
"""Utilities for extracting repository configuration from text."""
|
||
|
|
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import os
|
||
|
|
import re
|
||
|
|
|
||
|
|
_DEFAULT_REPO_OWNER = os.environ.get("DEFAULT_REPO_OWNER", "langchain-ai")
|
||
|
|
|
||
|
|
|
||
|
|
def extract_repo_from_text(text: str, default_owner: str | None = None) -> dict[str, str] | None:
|
||
|
|
"""Extract owner/name repo config from text containing repo: syntax or GitHub URLs.
|
||
|
|
|
||
|
|
Checks for explicit ``repo:owner/name`` or ``repo owner/name`` first, then
|
||
|
|
falls back to GitHub URL extraction.
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
A dict with ``owner`` and ``name`` keys, or ``None`` if no repo found.
|
||
|
|
"""
|
||
|
|
if default_owner is None:
|
||
|
|
default_owner = _DEFAULT_REPO_OWNER
|
||
|
|
owner: str | None = None
|
||
|
|
name: str | None = None
|
||
|
|
|
||
|
|
if "repo:" in text or "repo " in text:
|
||
|
|
match = re.search(r"repo[: ]([a-zA-Z0-9_.\-/]+)", text)
|
||
|
|
if match:
|
||
|
|
value = match.group(1).rstrip("/")
|
||
|
|
if "/" in value:
|
||
|
|
owner, name = value.split("/", 1)
|
||
|
|
else:
|
||
|
|
owner = default_owner
|
||
|
|
name = value
|
||
|
|
|
||
|
|
if not owner or not name:
|
||
|
|
github_match = re.search(r"github\.com/([a-zA-Z0-9_.-]+/[a-zA-Z0-9_.-]+)", text)
|
||
|
|
if github_match:
|
||
|
|
owner, name = github_match.group(1).split("/", 1)
|
||
|
|
|
||
|
|
if owner and name:
|
||
|
|
return {"owner": owner, "name": name}
|
||
|
|
return None
|