uros-b commented on code in PR #56400:
URL: https://github.com/apache/spark/pull/56400#discussion_r3444192252
##########
dev/merge_spark_pr.py:
##########
@@ -652,13 +652,90 @@ def print_jira_issue_summary(issue):
assignee = assignee.displayName
assignee = "Assignee\t%s\n" % assignee
status = "Status\t\t%s\n" % issue.fields.status.name
+ components = "Components\t%s\n" % [x.name for x in issue.fields.components]
url = "Url\t\t%s/%s\n" % (JIRA_BASE, issue.key)
target_versions = "Affected\t%s\n" % [x.name for x in
issue.fields.versions]
fix_versions = ""
if len(issue.fields.fixVersions) > 0:
fix_versions = "Fixed\t\t%s\n" % [x.name for x in
issue.fields.fixVersions]
print("=== JIRA %s ===" % issue.key)
- print("%s%s%s%s%s%s" % (summary, assignee, status, url, target_versions,
fix_versions))
+ print(
+ "%s%s%s%s%s%s%s"
+ % (summary, assignee, status, components, url, target_versions,
fix_versions)
+ )
+
+
+def jira_components_from_title_tags(tags):
+ """Canonical SPARK JIRA component names implied by PR-title component tags.
+
+ Each tag is resolved through the component registry; a tag that maps to a
+ JIRA component contributes that component's canonical name, whether primary
+ or not (e.g. [SQL] -> "SQL", [TEST] -> "Tests"). Tags that are not JIRA
+ components (status markers like [FOLLOWUP]/[MINOR], version tags like
[4.X],
+ or unknown tags) contribute nothing. Aliases normalize to the canonical
+ name. The result preserves input order and is de-duplicated.
+
+ >>> jira_components_from_title_tags(["SQL", "CORE"])
+ ['SQL', 'Spark Core']
+ >>> jira_components_from_title_tags(["PYSPARK", "DOCS"])
+ ['PySpark', 'Documentation']
+ >>> jira_components_from_title_tags(["SQL", "TEST"])
+ ['SQL', 'Tests']
+ >>> jira_components_from_title_tags(["SQL", "FOLLOWUP", "4.X", "BOGUS"])
+ ['SQL']
+ >>> jira_components_from_title_tags(["SQL", "SQL"])
+ ['SQL']
+ """
+ names = []
+ for tag in tags:
+ c = Component.find(tag)
+ if c is not None and c.jira_name:
+ names.append(c.jira_name)
+ return list(dict.fromkeys(names))
+
+
+def reconcile_jira_components(issue, title_components):
+ """Prompt to sync JIRA components when they differ from the PR title.
+
+ ``title_components`` is the list of normalized PR-title component tags
(e.g.
+ ["SQL", "TEST"]). Every tag that maps to a JIRA component -- primary or
not,
+ e.g. [SQL] -> "SQL" and [TEST] -> "Tests" -- is reconciled; tags with no
JIRA
+ component ([MINOR], [FOLLOWUP], version tags, unknown tags) are dropped.
The
+ mapped names are compared, as a set, against the issue's current
components.
+ On a mismatch, offer to overwrite JIRA with the PR title's components,
append
+ them to the existing ones, or keep JIRA unchanged (the default).
+ """
+ title_jira_components = jira_components_from_title_tags(title_components)
+ if not title_jira_components:
+ return
+ current = [c.name for c in issue.fields.components]
+ if set(current) == set(title_jira_components):
+ return
+
+ print()
+ print("=" * 80)
+ print("PR title components differ from JIRA %s:" % issue.key)
+ print(" PR title: %s" % ", ".join(title_jira_components))
+ print(" JIRA: %s" % (", ".join(current) if current else "(none)"))
+ print("=" * 80)
+ choice = get_input(
+ "[o]verwrite JIRA with PR title / [a]ppend PR title to JIRA / [k]eep
JIRA as is "
+ "(default: keep): ",
+ {"o": ["o", "overwrite"], "a": ["a", "append"], "k": ["k", "keep",
""]},
+ )
+ if choice == "k":
+ print("Keeping JIRA %s components unchanged." % issue.key)
+ return
+ if choice == "o":
+ new_names = list(title_jira_components)
+ else: # "a": append the PR title's components, keeping the existing ones
first.
Review Comment:
Nit: if "a" is really what we're looking for here, then it may be better to
just use explicit `elif choice == "a"` to document intent more tightly.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]