This is an automated email from the ASF dual-hosted git repository.

amolina pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/master by this push:
     new 8655525887 ARROW-16892: [Dev][Release] Fix version sorting on 
merge_arrow script (#13427)
8655525887 is described below

commit 865552588746caff53f757845d5cea13db07ada2
Author: Raúl Cumplido <[email protected]>
AuthorDate: Tue Jun 28 12:09:55 2022 +0200

    ARROW-16892: [Dev][Release] Fix version sorting on merge_arrow script 
(#13427)
    
    I have tested injecting FakeVersions and seeing how it prompts the correct 
one.
    If there would be an 8.0.0 today it will prompt for it:
    ```
    (Pdb) versions[0].name = "8.0.0"
    (Pdb) c
    Enter comma-separated fix version(s) [8.0.0]:
    ```
    If there would be a 10.0.0 it would prompt the 9.0.0 as expected:
    ```
    (Pdb) versions[0].name = "10.0.0"
    (Pdb) c
    Enter comma-separated fix version(s) [9.0.0]:
    ```
    
    Authored-by: Raúl Cumplido <[email protected]>
    Signed-off-by: Alessandro Molina <[email protected]>
---
 dev/merge_arrow_pr.py      | 12 +++++++++---
 dev/test_merge_arrow_pr.py | 30 ++++++++++++++++++++----------
 2 files changed, 29 insertions(+), 13 deletions(-)

diff --git a/dev/merge_arrow_pr.py b/dev/merge_arrow_pr.py
index 1f9191c59f..67cff18dcd 100755
--- a/dev/merge_arrow_pr.py
+++ b/dev/merge_arrow_pr.py
@@ -139,16 +139,22 @@ class JiraIssue(object):
     def current_fix_versions(self):
         return self.issue.fields.fixVersions
 
+    @classmethod
+    def sort_versions(cls, versions):
+        def version_tuple(x):
+            # Parquet versions are something like cpp-1.2.0
+            numeric_version = x.name.split("-", 1)[-1]
+            return tuple(int(_) for _ in numeric_version.split("."))
+        return sorted(versions, key=version_tuple, reverse=True)
+
     def get_candidate_fix_versions(self, merge_branches=('master',)):
         # Only suggest versions starting with a number, like 0.x but not JS-0.x
         all_versions = self.jira_con.project_versions(self.project)
         unreleased_versions = [x for x in all_versions
                                if not x.raw['released']]
 
-        unreleased_versions = sorted(unreleased_versions,
-                                     key=lambda x: x.name, reverse=True)
-
         mainline_versions = self._filter_mainline_versions(unreleased_versions)
+        mainline_versions = self.sort_versions(mainline_versions)
 
         mainline_non_patch_versions = []
         for v in mainline_versions:
diff --git a/dev/test_merge_arrow_pr.py b/dev/test_merge_arrow_pr.py
index 5452152828..1a89677ed9 100755
--- a/dev/test_merge_arrow_pr.py
+++ b/dev/test_merge_arrow_pr.py
@@ -34,10 +34,10 @@ FakeVersion = namedtuple('version', ['name', 'raw'])
 
 RAW_VERSION_JSON = [
     {'name': 'JS-0.4.0', 'released': False},
-    {'name': '0.11.0', 'released': False},
-    {'name': '0.12.0', 'released': False},
-    {'name': '0.10.0', 'released': True},
-    {'name': '0.9.0', 'released': True}
+    {'name': '0.9.0', 'released': False},
+    {'name': '0.10.0', 'released': False},
+    {'name': '0.8.0', 'released': True},
+    {'name': '0.7.0', 'released': True}
 ]
 
 
@@ -78,7 +78,7 @@ class FakeJIRA:
         }
 
     def get_candidate_fix_versions(self):
-        return SOURCE_VERSIONS, ['0.12.0']
+        return SOURCE_VERSIONS, ['0.11.0']
 
     def project_versions(self, project):
         return self._project_versions
@@ -106,13 +106,13 @@ def test_jira_fix_versions():
     issue = merge_arrow_pr.JiraIssue(jira, 'ARROW-1234', 'ARROW', FakeCLI())
     all_versions, default_versions = issue.get_candidate_fix_versions()
     assert all_versions == SOURCE_VERSIONS
-    assert default_versions == ['0.11.0']
+    assert default_versions == ['0.9.0']
 
 
 def test_jira_no_suggest_patch_release():
     versions_json = [
-        {'name': '0.11.1', 'released': False},
-        {'name': '0.12.0', 'released': False},
+        {'name': '0.9.1', 'released': False},
+        {'name': '0.10.0', 'released': False},
     ]
 
     versions = [FakeVersion(raw['name'], raw) for raw in versions_json]
@@ -121,7 +121,7 @@ def test_jira_no_suggest_patch_release():
     issue = merge_arrow_pr.JiraIssue(jira, 'ARROW-1234', 'ARROW', FakeCLI())
     all_versions, default_versions = issue.get_candidate_fix_versions()
     assert all_versions == versions
-    assert default_versions == ['0.12.0']
+    assert default_versions == ['0.10.0']
 
 
 def test_jira_parquet_no_suggest_non_cpp():
@@ -199,7 +199,7 @@ def test_jira_resolve_released_fix_version():
                     project_versions=SOURCE_VERSIONS,
                     transitions=TRANSITIONS)
 
-    cmd = FakeCLI(responses=['0.9.0'])
+    cmd = FakeCLI(responses=['0.7.0'])
     fix_versions_json = merge_arrow_pr.prompt_for_fix_version(cmd, jira)
     assert fix_versions_json == [RAW_VERSION_JSON[-1]]
 
@@ -315,3 +315,13 @@ Assignee\tFoo Bar
 Components\tC++, Python
 Status\t\tResolved
 URL\t\thttps://issues.apache.org/jira/browse/ARROW-1234""";
+
+
+def test_sorting_versions():
+    versions_json = [
+        {'name': '9.0.0', 'released': False},
+        {'name': '10.0.0', 'released': False},
+    ]
+    versions = [FakeVersion(raw['name'], raw) for raw in versions_json]
+    ordered_versions = merge_arrow_pr.JiraIssue.sort_versions(versions)
+    assert ordered_versions[0].name == "10.0.0"

Reply via email to