code: def main():
      global original_head
  
      original_head = get_current_ref()
  
      # Check this up front to avoid failing the JIRA update at the very end
      if not JIRA_ACCESS_TOKEN:
          continue_maybe(
              "The env-var JIRA_ACCESS_TOKEN is not set. Continue?"
          )
  
      branches = get_json("%s/branches" % GITHUB_API_BASE)
      branch_names = list(
          filter(
              lambda x: x.startswith("branch-"),
              [x["name"] for x in branches],
          )
      )
      # Assumes branch names can be sorted lexicographically
      branch_names = sorted(branch_names, reverse=True)
      branch_iter = iter(branch_names)
  
      pr_num = input(
          "Which pull request would you like to merge? (e.g. 34): "
      )
      pr = get_json("%s/pulls/%s" % (GITHUB_API_BASE, pr_num))
      pr_events = get_json(
          "%s/issues/%s/events" % (GITHUB_API_BASE, pr_num)
      )
  
      url = pr["url"]
  
      # Warn if the PR is WIP
      if "[WIP]" in pr["title"]:
          msg = "The PR title has `[WIP]`:\n%s\nContinue?" % pr["title"]
          continue_maybe(msg)
  
      title = pr["title"].rstrip(".")
  
      modified_body = re.sub(
          re.compile(r"<!--[^>]*-->\n?", re.DOTALL), "", pr["body"]
      ).lstrip()
      if modified_body != pr["body"]:
          print("=" * 80)
          print(modified_body)
          print("=" * 80)
          print(
              "I've removed the comments from PR template like the above:"
          )
          result = input(
              "Would you like to use the modified body? (y/n): "
          )
          if result.lower() == "y":
              body = modified_body
              print("Using modified body:")
          else:
              body = pr["body"]
              print("Using original body:")
          print("=" * 80)
          print(body)
          print("=" * 80)
      else:
          body = pr["body"]
      target_ref = pr["base"]["ref"]
      user_login = pr["user"]["login"]
      base_ref = pr["head"]["ref"]
      pr_repo_desc = "%s/%s" % (user_login, base_ref)
  
      # Merged pull requests don't appear as merged in the GitHub API;
      # Instead, they're closed by asfgit.
      merge_commits = [
          e
          for e in pr_events
          if e["actor"]["login"] == "asfgit" and e["event"] == "closed"
      ]
  
      if merge_commits:
          merge_hash = merge_commits[0]["commit_id"]
          message = get_json(
              "%s/commits/%s" % (GITHUB_API_BASE, merge_hash)
          )["commit"]["message"]
  
          print(
              "Pull request %s has already been merged, assuming you want to backport"
              % pr_num
          )
          commit_is_downloaded = (
              run_cmd(
                  [
                      "git",
                      "rev-parse",
                      "--quiet",
                      "--verify",
                      "%s^{commit}" % merge_hash,
                  ]
              ).strip()
              != ""
          )
          if not commit_is_downloaded:
              fail(
                  "Couldn't find any merge commit for #%s, you may need to update HEAD."
                  % pr_num
              )
  
          print("Found commit %s:\n%s" % (merge_hash, message))
          cherry_pick(
              pr_num, merge_hash, next(branch_iter, branch_names[0])
          )
          sys.exit(0)
  
      if not bool(pr["mergeable"]):
          msg = (
              "Pull request %s is not mergeable in its current form.\n"
              % pr_num
              + "Continue? (experts only!)"
          )
          continue_maybe(msg)
  
      print("\n=== Pull Request #%s ===" % pr_num)
      print(
          "title\t%s\nsource\t%s\ntarget\t%s\nurl\t%s"
          % (title, pr_repo_desc, target_ref, url)
      )
      continue_maybe("Proceed with merging pull request #%s?" % pr_num)
  
      merged_refs = [target_ref]
  
      merge_hash = merge_pr(
          pr_num, target_ref, title, body, pr_repo_desc
      )
  
      pick_prompt = (
          "Would you like to pick %s into another branch?" % merge_hash
      )
      while input("\n%s (y/n): " % pick_prompt).lower() == "y":
          merged_refs = merged_refs + [
              cherry_pick(
                  pr_num, merge_hash, next(branch_iter, branch_names[0])
              )
          ]
  
      if JIRA_IMPORTED:
          if JIRA_ACCESS_TOKEN:
              continue_maybe(
                  "Would you like to update an associated JIRA?"
              )
              jira_comment = (
                  "Issue resolved by pull request %s\n[%s/%s]"
                  % (
                      pr_num,
                      GITHUB_BASE,
                      pr_num,
                  )
              )
              resolve_jira_issues(title, merged_refs, jira_comment)
          else:
              print("JIRA_ACCESS_TOKEN not set")
              print(
                  "Exiting without trying to close the associated JIRA."
              )
      else:
          print(
              "Could not find jira-python library. Run 'sudo pip3 install jira' to install."
          )
          print("Exiting without trying to close the associated JIRA.")
  
imports: import json
  import os
  import re
  import subprocess
  import sys
  import traceback
  from urllib.request import urlopen
  from urllib.request import Request
  from urllib.error import HTTPError
label_desc: Use image node_id 15 for calling a global function with example usage: main() without return types