feat: auto-create SVN branch when git branch has no SVN counterpart

This commit is contained in:
2026-07-16 15:55:10 +02:00
parent 31bf43dfc8
commit daa8ebcc39
+42 -2
View File
@@ -133,9 +133,15 @@ def _ensure_wc(mirror: Mirror, svn_branch: str):
try: try:
_run_svn(["checkout", "--ignore-externals", svn_url, str(wc)], _run_svn(["checkout", "--ignore-externals", svn_url, str(wc)],
timeout=900, auth_args=auth_args) timeout=900, auth_args=auth_args)
except GitToSVNError: except GitToSVNError as e:
_cleanup_failed_wc(wc) _cleanup_failed_wc(wc)
raise if _is_svn_not_found(e):
_create_svn_branch(mirror, svn_branch, auth_args)
wc.mkdir(parents=True, exist_ok=True)
_run_svn(["checkout", "--ignore-externals", svn_url, str(wc)],
timeout=900, auth_args=auth_args)
else:
raise
else: else:
_try_revert(wc, auth_args) _try_revert(wc, auth_args)
try: try:
@@ -189,6 +195,40 @@ def _cleanup_failed_wc(wc: Path):
logger.warning("Could not fully remove failed WC at %s", wc) logger.warning("Could not fully remove failed WC at %s", wc)
def _is_svn_not_found(e: GitToSVNError) -> bool:
return "E170000" in str(e)
def _create_svn_branch(mirror: Mirror, svn_branch: str,
auth_args: Optional[list]):
"""Create an SVN branch by copying from trunk.
Called when a Git branch has no corresponding SVN path yet.
"""
root = mirror.config.svn.url.rstrip("/")
trunk_url = f"{root}/{mirror.config.svn.trunk}"
branch_url = f"{root}/{svn_branch}"
branch_name = svn_branch.rsplit("/", 1)[-1]
msg = f"Create branch {branch_name} from {mirror.config.svn.trunk}"
logger.info("Creating SVN branch: %s", branch_url)
result = _run_svn(
["copy", trunk_url, branch_url, "-m", msg],
timeout=120, auth_args=auth_args,
)
new_rev = _parse_commit_revision(result)
# Restore author revprop (svn copy uses buildbot as committer)
try:
_run_svn(
["propset", "--revprop", "-r", str(new_rev),
"svn:author", mirror.config.svn.username or "buildbot",
root],
timeout=30, auth_args=auth_args,
)
except GitToSVNError:
logger.debug("Could not set svn:author for branch creation r%d", new_rev)
logger.info("Created SVN branch %s (r%d)", branch_url, new_rev)
# ─── Author mapping (reverse) ────────────────────────────────── # ─── Author mapping (reverse) ──────────────────────────────────