diff --git a/swh/loader/svn/replay.py b/swh/loader/svn/replay.py --- a/swh/loader/svn/replay.py +++ b/swh/loader/svn/replay.py @@ -664,12 +664,26 @@ temp_path = os.path.join(temp_dir, dest_path) os.makedirs(b"/".join(temp_path.split(b"/")[:-1]), exist_ok=True) if external_url not in self.editor.dead_externals: - logger.debug("Exporting external %s to path %s", external_url, path) + logger.debug( + "Exporting external %s%s to path %s", + external_url, + f"@{revision}" if revision else "", + path, + ) + url = external_url.rstrip("/") + origin_url = self.svnrepo.origin_url.rstrip("/") + if ( + url.startswith(origin_url + "/") + and not self.svnrepo.has_relative_externals + ): + url = url.replace(origin_url, self.svnrepo.remote_url) + logger.debug( + "svn export --ignore-keywords %s%s", + url, + f"@{revision}" if revision else "", + ) self.svnrepo.client.export( - external_url.rstrip("/"), - to=temp_path, - peg_rev=revision, - ignore_keywords=True, + url, to=temp_path, peg_rev=revision, ignore_keywords=True, ) self.editor.externals_cache[external] = temp_path diff --git a/swh/loader/svn/tests/test_loader.py b/swh/loader/svn/tests/test_loader.py --- a/swh/loader/svn/tests/test_loader.py +++ b/swh/loader/svn/tests/test_loader.py @@ -1887,6 +1887,12 @@ CommitChange(change_type=CommitChangeType.AddOrUpdate, path="branches/",), CommitChange(change_type=CommitChangeType.AddOrUpdate, path="tags/",), CommitChange(change_type=CommitChangeType.AddOrUpdate, path="trunk/",), + CommitChange( + change_type=CommitChangeType.AddOrUpdate, + path="trunk/bar.sh", + properties={"svn:executable": "*"}, + data=b"#!/bin/bash\necho bar", + ), ], ) @@ -1904,7 +1910,8 @@ properties={ "svn:externals": ( f"{svn_urljoin(external_repo_url, 'code/hello')} hello\n" - f"{svn_urljoin(external_repo_url, 'foo.sh')} foo.sh" + f"{svn_urljoin(external_repo_url, 'foo.sh')} foo.sh\n" + f"{svn_urljoin(repo_url, 'trunk/bar.sh')} bar.sh" ) }, ),