From 651e2964eeb3c0dc3c691973bd26c6495593176d Mon Sep 17 00:00:00 2001
From: Antoine Lambert <anlambert@softwareheritage.org>
Date: Fri, 17 Jun 2022 12:01:36 +0200
Subject: [PATCH] utils: Ensure to return correct revision in
 parse_external_definition

An external definition can be of the following form (where XXX and YYY
are revision numbers):

	-r XXX <repo_url>@YYY

In that case, the official subversion client will export the revision
XXX of the external repository.

So ensure to have the same behavior when the subversion loader processes
a repository with such external defintion in it.
---
 swh/loader/svn/tests/test_utils.py | 12 ++++++++++++
 swh/loader/svn/utils.py            |  5 ++++-
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/swh/loader/svn/tests/test_utils.py b/swh/loader/svn/tests/test_utils.py
index a41a8f4f..ccc3c2a5 100644
--- a/swh/loader/svn/tests/test_utils.py
+++ b/swh/loader/svn/tests/test_utils.py
@@ -408,6 +408,18 @@ def test_svn_urljoin(base_url, paths_to_join, expected_result):
                 False,
             ),
         ),
+        (
+            "-r 123 http://svn.example.com/repos/sounds@100 third-party/sounds",
+            "trunk/externals",
+            "http://svn.example.org/repos/test",
+            ("third-party/sounds", "http://svn.example.com/repos/sounds", 123, False),
+        ),
+        (
+            "-r 123 http://svn.example.com/repos/sounds@150 third-party/sounds",
+            "trunk/externals",
+            "http://svn.example.org/repos/test",
+            ("third-party/sounds", "http://svn.example.com/repos/sounds", 123, False),
+        ),
     ],
 )
 def test_parse_external_definition(external, dir_path, repo_url, expected_result):
diff --git a/swh/loader/svn/utils.py b/swh/loader/svn/utils.py
index 3fbe9fe6..3319efee 100644
--- a/swh/loader/svn/utils.py
+++ b/swh/loader/svn/utils.py
@@ -288,7 +288,10 @@ def parse_external_definition(
         # http://svn.example.org/repos/test/path@XXX
         url, revision_s = external_url.rsplit("@", maxsplit=1)
         try:
-            revision = int(revision_s)
+            # ensure revision_s can be parsed to int
+            rev = int(revision_s)
+            # -r XXX takes priority over <svn_url>@XXX
+            revision = revision or rev
             external_url = url
         except ValueError:
             # handle URL like http://user@svn.example.org/
-- 
GitLab