| 381 | |
| 382 | |
| 383 | class PullRequest(object): |
| 384 | GITHUB_PR_TITLE_PATTERN = re.compile(r'^GH-([0-9]+)\b.*$') |
| 385 | |
| 386 | def __init__(self, cmd, github_api, git_remote, number): |
| 387 | self.cmd = cmd |
| 388 | self._github_api = github_api |
| 389 | self.git_remote = git_remote |
| 390 | self.number = number |
| 391 | self._pr_data = github_api.get_pr_data(number) |
| 392 | try: |
| 393 | self.url = self._pr_data["url"] |
| 394 | self.title = self._pr_data["title"] |
| 395 | self.body = self._pr_data["body"] |
| 396 | self.target_ref = self._pr_data["base"]["ref"] |
| 397 | self.user_login = self._pr_data["user"]["login"] |
| 398 | self.base_ref = self._pr_data["head"]["ref"] |
| 399 | except KeyError: |
| 400 | pprint.pprint(self._pr_data) |
| 401 | raise |
| 402 | self.description = "%s/%s" % (self.user_login, self.base_ref) |
| 403 | |
| 404 | self.issue = self._get_issue() |
| 405 | |
| 406 | def show(self): |
| 407 | print("\n=== Pull Request #%s ===" % self.number) |
| 408 | print("title\t%s\nsource\t%s\ntarget\t%s\nurl\t%s" |
| 409 | % (self.title, self.description, self.target_ref, self.url)) |
| 410 | if self.issue is not None: |
| 411 | self.issue.show() |
| 412 | else: |
| 413 | print("Minor PR. Please ensure it meets guidelines for minor.\n") |
| 414 | |
| 415 | @property |
| 416 | def is_merged(self): |
| 417 | return bool(self._pr_data["merged"]) |
| 418 | |
| 419 | @property |
| 420 | def is_mergeable(self): |
| 421 | return bool(self._pr_data["mergeable"]) |
| 422 | |
| 423 | @property |
| 424 | def maintenance_branches(self): |
| 425 | return [x["name"] for x in self._github_api.get_branches() |
| 426 | if x["name"].startswith("maint-")] |
| 427 | |
| 428 | def _get_issue(self): |
| 429 | if self.title.startswith("MINOR:"): |
| 430 | return None |
| 431 | |
| 432 | m = self.GITHUB_PR_TITLE_PATTERN.search(self.title) |
| 433 | if m: |
| 434 | github_id = m.group(1) |
| 435 | return GitHubIssue(self._github_api, github_id, self.cmd) |
| 436 | |
| 437 | self.cmd.fail("PR title should be prefixed by a GitHub ID, like: " |
| 438 | f"GH-XXX, but found {self.title}") |
| 439 | |
| 440 | def merge(self): |