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 @@ -659,6 +659,13 @@ 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) + 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) self.svnrepo.client.export( external_url.rstrip("/"), to=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" ) }, ),