Changeset View
Changeset View
Standalone View
Standalone View
swh/loader/svn/svn.py
Show First 20 Lines • Show All 440 Lines • ▼ Show 20 Lines | def export_temporary(self, revision: int) -> Tuple[str, bytes]: | ||||
# if some paths have external URLs relative to the repository URL but targeting | # if some paths have external URLs relative to the repository URL but targeting | ||||
# paths outside it, we need to export from the origin URL as the remote URL can | # paths outside it, we need to export from the origin URL as the remote URL can | ||||
# target a dump mounted on the local filesystem | # target a dump mounted on the local filesystem | ||||
if self.replay_started and self.has_relative_externals: | if self.replay_started and self.has_relative_externals: | ||||
# externals detected while replaying revisions | # externals detected while replaying revisions | ||||
url = self.origin_url | url = self.origin_url | ||||
elif not self.replay_started: | elif not self.replay_started: | ||||
# revisions replay has not started, we need to check if svn:externals | # revisions replay has not started, we need to check if svn:externals | ||||
# properties are set from a checkout of the revision and if some | # properties are set and if some external URLs are relative to pick | ||||
# external URLs are relative to pick the right export URL, | # the right export URL,recursive externals are also checked | ||||
# recursive externals are also checked | |||||
with tempfile.TemporaryDirectory( | |||||
dir=self.local_dirname, prefix=f"checkout-revision-{revision}." | |||||
) as co_dirname: | |||||
self.checkout( | |||||
self.remote_url, co_dirname, revision, ignore_externals=True | |||||
) | |||||
# get all svn:externals properties recursively | # get all svn:externals properties recursively | ||||
externals = self.propget("svn:externals", co_dirname, None, None, True) | externals = self.propget( | ||||
"svn:externals", self.remote_url, revision, revision, True | |||||
) | |||||
self.has_relative_externals = False | self.has_relative_externals = False | ||||
self.has_recursive_externals = False | self.has_recursive_externals = False | ||||
for path, external_defs in externals.items(): | for path, external_defs in externals.items(): | ||||
if self.has_relative_externals or self.has_recursive_externals: | if self.has_relative_externals or self.has_recursive_externals: | ||||
break | break | ||||
path = path.replace(self.remote_url.rstrip("/") + "/", "") | path = path.replace(self.remote_url.rstrip("/") + "/", "") | ||||
for external_def in os.fsdecode(external_defs).split("\n"): | for external_def in os.fsdecode(external_defs).split("\n"): | ||||
# skip empty line or comment | # skip empty line or comment | ||||
if not external_def or external_def.startswith("#"): | if not external_def or external_def.startswith("#"): | ||||
continue | continue | ||||
( | ( | ||||
external_path, | external_path, | ||||
external_url, | external_url, | ||||
_, | _, | ||||
relative_url, | relative_url, | ||||
) = parse_external_definition( | ) = parse_external_definition( | ||||
external_def.rstrip("\r"), path, self.origin_url | external_def.rstrip("\r"), path, self.origin_url | ||||
) | ) | ||||
if is_recursive_external( | if is_recursive_external( | ||||
self.origin_url, | self.origin_url, | ||||
path, | path, | ||||
external_path, | external_path, | ||||
external_url, | external_url, | ||||
): | ): | ||||
self.has_recursive_externals = True | self.has_recursive_externals = True | ||||
url = self.remote_url | url = self.remote_url | ||||
break | break | ||||
if relative_url: | if relative_url: | ||||
self.has_relative_externals = True | self.has_relative_externals = True | ||||
url = self.origin_url | url = self.origin_url | ||||
break | break | ||||
try: | try: | ||||
url = url.rstrip("/") | url = url.rstrip("/") | ||||
self.export( | self.export( | ||||
url, | url, | ||||
to=local_url, | to=local_url, | ||||
rev=revision, | rev=revision, | ||||
▲ Show 20 Lines • Show All 127 Lines • Show Last 20 Lines |