Changeset View
Changeset View
Standalone View
Standalone View
swh/loader/svn/svn.py
# Copyright (C) 2015-2022 The Software Heritage developers | # Copyright (C) 2015-2022 The Software Heritage developers | ||||
# See the AUTHORS file at the top-level directory of this distribution | # See the AUTHORS file at the top-level directory of this distribution | ||||
# License: GNU General Public License version 3, or any later version | # License: GNU General Public License version 3, or any later version | ||||
# See top-level LICENSE file for more information | # See top-level LICENSE file for more information | ||||
"""SVN client in charge of iterating over svn logs and yield commit | """SVN client in charge of iterating over svn logs and yield commit | ||||
representations including the hash tree/content computations per svn | representations including the hash tree/content computations per svn | ||||
commit. | commit. | ||||
""" | """ | ||||
import logging | import logging | ||||
import os | import os | ||||
import shutil | import shutil | ||||
import tempfile | import tempfile | ||||
from typing import Dict, Iterator, List, Optional, Tuple, Union | from typing import Dict, Iterator, List, Optional, Tuple, Union | ||||
from urllib.parse import urlparse, urlunparse | from urllib.parse import quote, urlparse, urlunparse | ||||
from subvertpy import SubversionException, client, properties, wc | from subvertpy import SubversionException, client, properties, wc | ||||
from subvertpy.ra import ( | from subvertpy.ra import ( | ||||
Auth, | Auth, | ||||
RemoteAccess, | RemoteAccess, | ||||
get_simple_prompt_provider, | get_simple_prompt_provider, | ||||
get_username_provider, | get_username_provider, | ||||
) | ) | ||||
Show All 12 Lines | |||||
from .utils import is_recursive_external, parse_external_definition | from .utils import is_recursive_external, parse_external_definition | ||||
# When log message contains empty data | # When log message contains empty data | ||||
DEFAULT_AUTHOR_MESSAGE = "" | DEFAULT_AUTHOR_MESSAGE = "" | ||||
logger = logging.getLogger(__name__) | logger = logging.getLogger(__name__) | ||||
def quote_svn_url(url: Union[bytes, str]) -> str: | |||||
return quote(url, safe=":/&$+,;=?@#") | |||||
class SvnRepo: | class SvnRepo: | ||||
"""Svn repository representation. | """Svn repository representation. | ||||
Args: | Args: | ||||
remote_url: Remove svn repository url | remote_url: Remove svn repository url | ||||
origin_url: Associated origin identifier | origin_url: Associated origin identifier | ||||
local_dirname: Path to write intermediary svn action results | local_dirname: Path to write intermediary svn action results | ||||
▲ Show 20 Lines • Show All 214 Lines • ▼ Show 20 Lines | def remote_access(self, auth: Auth) -> RemoteAccess: | ||||
"""Simple wrapper around subvertpy.ra.RemoteAccess creation | """Simple wrapper around subvertpy.ra.RemoteAccess creation | ||||
enabling to retry the operation if a network error occurs.""" | enabling to retry the operation if a network error occurs.""" | ||||
return RemoteAccess(self.remote_url, auth=auth) | return RemoteAccess(self.remote_url, auth=auth) | ||||
@svn_retry() | @svn_retry() | ||||
def info(self, origin_url: str): | def info(self, origin_url: str): | ||||
"""Simple wrapper around subvertpy.client.Client.info enabling to retry | """Simple wrapper around subvertpy.client.Client.info enabling to retry | ||||
the command if a network error occurs.""" | the command if a network error occurs.""" | ||||
info = self.client.info(origin_url.rstrip("/")) | info = self.client.info(quote_svn_url(origin_url).rstrip("/")) | ||||
return next(iter(info.values())) | return next(iter(info.values())) | ||||
@svn_retry() | @svn_retry() | ||||
def export( | def export( | ||||
self, | self, | ||||
url: str, | url: str, | ||||
to: str, | to: str, | ||||
rev: Optional[int] = None, | rev: Optional[int] = None, | ||||
Show All 23 Lines | ) -> int: | ||||
options.append("--ignore-externals") | options.append("--ignore-externals") | ||||
if overwrite: | if overwrite: | ||||
options.append("--force") | options.append("--force") | ||||
if ignore_keywords: | if ignore_keywords: | ||||
options.append("--ignore-keywords") | options.append("--ignore-keywords") | ||||
logger.debug( | logger.debug( | ||||
"svn export %s %s%s %s", | "svn export %s %s%s %s", | ||||
" ".join(options), | " ".join(options), | ||||
url, | quote_svn_url(url), | ||||
f"@{peg_rev}" if peg_rev else "", | f"@{peg_rev}" if peg_rev else "", | ||||
to, | to, | ||||
) | ) | ||||
return self.client.export( | return self.client.export( | ||||
url, | quote_svn_url(url), | ||||
to=to, | to=to, | ||||
rev=rev, | rev=rev, | ||||
peg_rev=peg_rev, | peg_rev=peg_rev, | ||||
recurse=recurse, | recurse=recurse, | ||||
ignore_externals=ignore_externals, | ignore_externals=ignore_externals, | ||||
overwrite=overwrite, | overwrite=overwrite, | ||||
ignore_keywords=ignore_keywords, | ignore_keywords=ignore_keywords, | ||||
) | ) | ||||
Show All 27 Lines | ) -> int: | ||||
options.append(f"-r {rev}") | options.append(f"-r {rev}") | ||||
if recurse: | if recurse: | ||||
options.append("--depth infinity") | options.append("--depth infinity") | ||||
if ignore_externals: | if ignore_externals: | ||||
options.append("--ignore-externals") | options.append("--ignore-externals") | ||||
logger.debug( | logger.debug( | ||||
"svn checkout %s %s%s %s", | "svn checkout %s %s%s %s", | ||||
" ".join(options), | " ".join(options), | ||||
self.remote_url, | quote_svn_url(url), | ||||
f"@{peg_rev}" if peg_rev else "", | f"@{peg_rev}" if peg_rev else "", | ||||
path, | path, | ||||
) | ) | ||||
return self.client.checkout( | return self.client.checkout( | ||||
url, | quote_svn_url(url), | ||||
path=path, | path=path, | ||||
rev=rev, | rev=rev, | ||||
peg_rev=peg_rev, | peg_rev=peg_rev, | ||||
recurse=recurse, | recurse=recurse, | ||||
ignore_externals=ignore_externals, | ignore_externals=ignore_externals, | ||||
allow_unver_obstructions=allow_unver_obstructions, | allow_unver_obstructions=allow_unver_obstructions, | ||||
) | ) | ||||
▲ Show 20 Lines • Show All 213 Lines • Show Last 20 Lines |