You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by ko...@apache.org on 2022/07/27 00:31:03 UTC

[arrow] branch master updated: ARROW-17205: [Dev][Release] Merge script should prompt for next version when maintenance branch is created (#13708)

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

kou 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 83495257c0 ARROW-17205: [Dev][Release] Merge script should prompt for next version when maintenance branch is created (#13708)
83495257c0 is described below

commit 83495257c0881d6f08c38f077e53921ef286fe8a
Author: Raúl Cumplido <ra...@gmail.com>
AuthorDate: Wed Jul 27 02:30:55 2022 +0200

    ARROW-17205: [Dev][Release] Merge script should prompt for next version when maintenance branch is created (#13708)
    
    Currently the merge_pr script is asking to merge to 9.0.0 when the fetature freeze has been implemented. If the maintenance branch is created we should filter them from the possible versions.
    
    Authored-by: Raúl Cumplido <ra...@gmail.com>
    Signed-off-by: Sutou Kouhei <ko...@clear-code.com>
---
 dev/merge_arrow_pr.py      | 28 ++++++++++++++++++++++++----
 dev/test_merge_arrow_pr.py | 15 ++++++++++++++-
 2 files changed, 38 insertions(+), 5 deletions(-)

diff --git a/dev/merge_arrow_pr.py b/dev/merge_arrow_pr.py
index 67cff18dcd..a0c1398eb5 100755
--- a/dev/merge_arrow_pr.py
+++ b/dev/merge_arrow_pr.py
@@ -147,7 +147,8 @@ class JiraIssue(object):
             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',)):
+    def get_candidate_fix_versions(self, merge_branches=('master',),
+                                   maintenance_branches=()):
         # 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
@@ -166,12 +167,19 @@ class JiraIssue(object):
             # If there is a non-patch release, suggest that instead
             mainline_versions = mainline_non_patch_versions
 
+        mainline_versions = self._filter_maintenance_versions(
+            mainline_versions, maintenance_branches
+        )
         default_fix_versions = [
             fix_version_from_branch(x, mainline_versions).name
             for x in merge_branches]
 
         return all_versions, default_fix_versions
 
+    def _filter_maintenance_versions(self, versions, maintenance_branches):
+        return [v for v in versions
+                if f"maint-{v.name}" not in maintenance_branches]
+
     def _filter_mainline_versions(self, versions):
         if self.project == 'PARQUET':
             mainline_regex = re.compile(r'cpp-\d.*')
@@ -270,6 +278,10 @@ class GitHubAPI(object):
         return get_json("%s/pulls/%s/commits" % (self.github_api, number),
                         headers=self.headers)
 
+    def get_branches(self):
+        return get_json("%s/branches" % (self.github_api),
+                        headers=self.headers)
+
     def merge_pr(self, number, commit_title, commit_message):
         url = f'{self.github_api}/pulls/{number}/merge'
         payload = {
@@ -350,6 +362,11 @@ class PullRequest(object):
     def is_mergeable(self):
         return bool(self._pr_data["mergeable"])
 
+    @property
+    def maintenance_branches(self):
+        return [x["name"] for x in self._github_api.get_branches()
+                if x["name"].startswith("maint-")]
+
     def _get_jira(self):
         if self.title.startswith("MINOR:"):
             return None
@@ -468,9 +485,11 @@ def get_primary_author(cmd, distinct_authors):
     return primary_author, distinct_other_authors
 
 
-def prompt_for_fix_version(cmd, jira_issue):
+def prompt_for_fix_version(cmd, jira_issue, maintenance_branches=()):
     (all_versions,
-     default_fix_versions) = jira_issue.get_candidate_fix_versions()
+     default_fix_versions) = jira_issue.get_candidate_fix_versions(
+        maintenance_branches=maintenance_branches
+    )
 
     default_fix_versions = ",".join(default_fix_versions)
 
@@ -571,7 +590,8 @@ def cli():
            "https://github.com/apache/" + PROJECT_NAME + "/pull",
            pr_num))
 
-    fix_versions_json = prompt_for_fix_version(cmd, pr.jira_issue)
+    fix_versions_json = prompt_for_fix_version(cmd, pr.jira_issue,
+                                               pr.maintenance_branches)
     pr.jira_issue.resolve(fix_versions_json, jira_comment)
 
 
diff --git a/dev/test_merge_arrow_pr.py b/dev/test_merge_arrow_pr.py
index 1a89677ed9..2367c50b6b 100755
--- a/dev/test_merge_arrow_pr.py
+++ b/dev/test_merge_arrow_pr.py
@@ -77,7 +77,7 @@ class FakeJIRA:
             'fixVersions': fixVersions
         }
 
-    def get_candidate_fix_versions(self):
+    def get_candidate_fix_versions(self, maintenance_branches):
         return SOURCE_VERSIONS, ['0.11.0']
 
     def project_versions(self, project):
@@ -109,6 +109,19 @@ def test_jira_fix_versions():
     assert default_versions == ['0.9.0']
 
 
+def test_jira_fix_versions_filters_maintenance():
+    maintenance_branches = ["maint-0.9.0"]
+    jira = FakeJIRA(project_versions=SOURCE_VERSIONS,
+                    transitions=TRANSITIONS)
+
+    issue = merge_arrow_pr.JiraIssue(jira, 'ARROW-1234', 'ARROW', FakeCLI())
+    all_versions, default_versions = issue.get_candidate_fix_versions(
+        maintenance_branches=maintenance_branches
+    )
+    assert all_versions == SOURCE_VERSIONS
+    assert default_versions == ['0.10.0']
+
+
 def test_jira_no_suggest_patch_release():
     versions_json = [
         {'name': '0.9.1', 'released': False},