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

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


The following commit(s) were added to refs/heads/main by this push:
     new 6cbdec55b6 GH-41282: [Dev] Always prompt next major version on merge 
script if it exists (#41305)
6cbdec55b6 is described below

commit 6cbdec55b6bbaee3f00a42541bf89998452a3718
Author: Raúl Cumplido <[email protected]>
AuthorDate: Fri Apr 26 12:26:22 2024 +0200

    GH-41282: [Dev] Always prompt next major version on merge script if it 
exists (#41305)
    
    ### Rationale for this change
    
    When we created the `16.1.0` milestone the merge script started prompting 
it instead of `17.0.0` we want to default to the next major release.
    
    ### What changes are included in this PR?
    
    Update archery logic to default to major versions online.
    
    ### Are these changes tested?
    I've tested locally and now it defaults to `17.0.0`:
    
    ```
    Enter fix version [17.0.0]:
    ```
    
    ### Are there any user-facing changes?
    No
    * GitHub Issue: #41282
    
    Authored-by: Raúl Cumplido <[email protected]>
    Signed-off-by: Raúl Cumplido <[email protected]>
---
 dev/merge_arrow_pr.py      | 14 ++++-------
 dev/test_merge_arrow_pr.py | 62 ++++++++++++++++++++++++++++++++++------------
 2 files changed, 51 insertions(+), 25 deletions(-)

diff --git a/dev/merge_arrow_pr.py b/dev/merge_arrow_pr.py
index 25d3372d8b..344d943fd8 100755
--- a/dev/merge_arrow_pr.py
+++ b/dev/merge_arrow_pr.py
@@ -306,15 +306,11 @@ def get_candidate_fix_version(mainline_versions,
 
     # Only suggest versions starting with a number, like 0.x but not JS-0.x
     mainline_versions = all_versions
-    mainline_non_patch_versions = []
-    for v in mainline_versions:
-        (major, minor, patch) = v.split(".")
-        if patch == "0":
-            mainline_non_patch_versions.append(v)
-
-    if len(mainline_versions) > len(mainline_non_patch_versions):
-        # If there is a non-patch release, suggest that instead
-        mainline_versions = mainline_non_patch_versions
+    major_versions = [v for v in mainline_versions if v.endswith('.0.0')]
+
+    if len(mainline_versions) > len(major_versions):
+        # If there is a future major release, suggest that
+        mainline_versions = major_versions
 
     mainline_versions = [v for v in mainline_versions
                          if f"maint-{v}" not in maintenance_branches]
diff --git a/dev/test_merge_arrow_pr.py b/dev/test_merge_arrow_pr.py
index 305b08f283..0067c10414 100755
--- a/dev/test_merge_arrow_pr.py
+++ b/dev/test_merge_arrow_pr.py
@@ -26,14 +26,17 @@ import merge_arrow_pr
 
 FakeIssue = namedtuple('issue', ['fields'])
 FakeFields = namedtuple('fields', ['status', 'summary', 'assignee',
-                                   'components', 'fixVersions'])
+                                   'components', 'fixVersions', 'milestone'])
 FakeAssignee = namedtuple('assignee', ['displayName'])
 FakeStatus = namedtuple('status', ['name'])
 FakeComponent = namedtuple('component', ['name'])
 FakeVersion = namedtuple('version', ['name', 'raw'])
+FakeMilestone = namedtuple('milestone', ['state'])
 
 RAW_VERSION_JSON = [
     {'name': 'JS-0.4.0', 'released': False},
+    {'name': '1.0.0', 'released': False},
+    {'name': '2.0.0', 'released': False},
     {'name': '0.9.0', 'released': False},
     {'name': '0.10.0', 'released': False},
     {'name': '0.8.0', 'released': True},
@@ -50,7 +53,7 @@ jira_id = 'ARROW-1234'
 status = FakeStatus('In Progress')
 fields = FakeFields(status, 'issue summary', FakeAssignee('groundhog'),
                     [FakeComponent('C++'), FakeComponent('Format')],
-                    [])
+                    [], FakeMilestone('closed')._asdict())
 FAKE_ISSUE_1 = FakeIssue(fields)
 
 
@@ -92,6 +95,31 @@ class FakeJIRA:
         return self._project_versions
 
 
+class FakeGitHub:
+
+    def __init__(self, issue=None, project_versions=None):
+        self._issue = issue
+        self._project_versions = project_versions
+
+    @property
+    def issue(self):
+        return self._issue.fields._asdict()
+
+    @property
+    def current_versions(self):
+        all_versions = self._project_versions or SOURCE_VERSIONS
+        return [
+            v for v in all_versions if not v.raw.get("released")
+        ] + ['0.11.0']
+
+    @property
+    def current_fix_versions(self):
+        return 'JS-0.4.0'
+
+    def project_versions(self, project):
+        return self._project_versions
+
+
 class FakeCLI:
 
     def __init__(self, responses=()):
@@ -115,11 +143,11 @@ def test_jira_fix_versions():
     fix_version = merge_arrow_pr.get_candidate_fix_version(
         issue.current_versions
     )
-    assert fix_version == '0.9.0'
+    assert fix_version == '1.0.0'
 
 
 def test_jira_fix_versions_filters_maintenance():
-    maintenance_branches = ["maint-0.9.0"]
+    maintenance_branches = ["maint-1.0.0"]
     jira = FakeJIRA(project_versions=SOURCE_VERSIONS,
                     transitions=TRANSITIONS)
 
@@ -128,13 +156,14 @@ def test_jira_fix_versions_filters_maintenance():
         issue.current_versions,
         maintenance_branches=maintenance_branches
     )
-    assert fix_version == '0.10.0'
+    assert fix_version == '2.0.0'
 
 
-def test_jira_no_suggest_patch_release():
+def test_jira_only_suggest_major_release():
     versions_json = [
         {'name': '0.9.1', 'released': False},
         {'name': '0.10.0', 'released': False},
+        {'name': '1.0.0', 'released': False},
     ]
 
     versions = [FakeVersion(raw['name'], raw) for raw in versions_json]
@@ -144,7 +173,7 @@ def test_jira_no_suggest_patch_release():
     fix_version = merge_arrow_pr.get_candidate_fix_version(
         issue.current_versions
     )
-    assert fix_version == '0.10.0'
+    assert fix_version == '1.0.0'
 
 
 def test_jira_parquet_no_suggest_non_cpp():
@@ -153,8 +182,10 @@ def test_jira_parquet_no_suggest_non_cpp():
         {'name': 'cpp-1.5.0', 'released': True},
         {'name': 'cpp-1.6.0', 'released': False},
         {'name': 'cpp-1.7.0', 'released': False},
+        {'name': 'cpp-2.0.0', 'released': False},
         {'name': '1.11.0', 'released': False},
-        {'name': '1.12.0', 'released': False}
+        {'name': '1.12.0', 'released': False},
+        {'name': '2.0.0', 'released': False}
     ]
 
     versions = [FakeVersion(raw['name'], raw)
@@ -166,7 +197,7 @@ def test_jira_parquet_no_suggest_non_cpp():
     fix_version = merge_arrow_pr.get_candidate_fix_version(
         issue.current_versions
     )
-    assert fix_version == 'cpp-1.6.0'
+    assert fix_version == 'cpp-2.0.0'
 
 
 def test_jira_invalid_issue():
@@ -219,13 +250,12 @@ def test_jira_resolve_non_mainline():
 
 def test_jira_resolve_released_fix_version():
     # ARROW-5083
-    jira = FakeJIRA(issue=FAKE_ISSUE_1,
-                    project_versions=SOURCE_VERSIONS,
-                    transitions=TRANSITIONS)
+    jira = FakeGitHub(issue=FAKE_ISSUE_1,
+                      project_versions=SOURCE_VERSIONS)
 
-    cmd = FakeCLI(responses=['0.7.0'])
+    cmd = FakeCLI(responses=['1.0.0'])
     fix_versions_json = merge_arrow_pr.prompt_for_fix_version(cmd, jira)
-    assert fix_versions_json == "0.7.0"
+    assert fix_versions_json == "1.0.0"
 
 
 def test_multiple_authors_bad_input():
@@ -256,7 +286,7 @@ def test_multiple_authors_bad_input():
 def test_jira_already_resolved():
     status = FakeStatus('Resolved')
     fields = FakeFields(status, 'issue summary', FakeAssignee('groundhog'),
-                        [FakeComponent('Java')], [])
+                        [FakeComponent('Java')], [], None)
     issue = FakeIssue(fields)
 
     jira = FakeJIRA(issue=issue,
@@ -287,7 +317,7 @@ def test_no_unset_point_release_fix_version():
     fields = FakeFields(status, 'summary', FakeAssignee('someone'),
                         [FakeComponent('Java')],
                         [FakeVersion(v, versions_json[v])
-                         for v in ['0.17.0', '0.15.1', '0.14.2']])
+                         for v in ['0.17.0', '0.15.1', '0.14.2']], None)
     issue = FakeIssue(fields)
 
     jira = FakeJIRA(

Reply via email to