Skip to content

Commit

Permalink
Support using the merge ref instead of the head ref in a pull request
Browse files Browse the repository at this point in the history
Add merge_commit_sha and merge_commit_status properties
to GithubPullRequest class (and PullRequest superclass);
merge_commit_status returns a MergeCommitStatus.

GitHub's 'mergeable' boolean maps to MergeCommitStatus.can_be_merged (true)
or MergeCommitStatus.cannot_be_merged (false).

GitLab's 'merge_status' string values map to MergeCommitStatus
values verbatim.

New test_pull_requests.py:test_merge_commit_sha methods for
GitHub and GitLab.

OGR issue #584.

Signed-off-by: Ben Crocker <[email protected]>
  • Loading branch information
bcrocker15 committed Jun 22, 2021
1 parent 9a8149e commit b0a1692
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 13 deletions.
34 changes: 25 additions & 9 deletions ogr/abstract.py
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,23 @@ class PRStatus(IntEnum):
all = 4


class CommitStatus(Enum):
pending = 1
success = 2
failure = 3
error = 4
canceled = 5
running = 6


class MergeCommitStatus(Enum):
can_be_merged = 1
cannot_be_merged = 2
unchecked = 3
checking = 4
cannot_be_merged_recheck = 5


class PullRequest(OgrAbstractClass):
@deprecate_and_set_removal(
since="0.9.0",
Expand Down Expand Up @@ -404,6 +421,14 @@ def patch(self) -> bytes:
def head_commit(self) -> str:
raise NotImplementedError

@property
def merge_commit_sha(self) -> str:
raise NotImplementedError()

@property
def merge_commit_status(self) -> MergeCommitStatus:
raise NotImplementedError()

@property
def source_project(self) -> "GitProject":
raise NotImplementedError()
Expand Down Expand Up @@ -588,15 +613,6 @@ def get_statuses(self) -> List["CommitFlag"]:
raise NotImplementedError()


class CommitStatus(Enum):
pending = 1
success = 2
failure = 3
error = 4
canceled = 5
running = 6


class CommitFlag(OgrAbstractClass):
_states: Dict[str, CommitStatus] = dict()

Expand Down
13 changes: 12 additions & 1 deletion ogr/services/github/pull_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
from github.IssueComment import IssueComment as _GithubIssueComment
from github.PullRequestComment import PullRequestComment as _GithubPullRequestComment

from ogr.abstract import PRComment, PRStatus, PullRequest
from ogr.abstract import PRComment, PRStatus, PullRequest, MergeCommitStatus
from ogr.exceptions import GithubAPIException
from ogr.services import github as ogr_github
from ogr.services.base import BasePullRequest
Expand Down Expand Up @@ -109,6 +109,17 @@ def commits_url(self) -> str:
def head_commit(self) -> str:
return self._raw_pr.head.sha

@property
def merge_commit_sha(self) -> str:
return self._raw_pr.merge_commit_sha

@property
def merge_commit_status(self) -> MergeCommitStatus:
if self._raw_pr.mergeable:
return MergeCommitStatus.can_be_merged
else:
return MergeCommitStatus.cannot_be_merged

@property
def source_project(self) -> "ogr_github.GithubProject":
if self._source_project is None:
Expand Down
23 changes: 22 additions & 1 deletion ogr/services/gitlab/pull_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@

from gitlab.v4.objects import MergeRequest as _GitlabMergeRequest

from ogr.abstract import PullRequest, PRComment, PRStatus
from ogr.abstract import PullRequest, PRComment, PRStatus, MergeCommitStatus
from ogr.exceptions import GitlabAPIException
from ogr.services import gitlab as ogr_gitlab
from ogr.services.base import BasePullRequest
Expand Down Expand Up @@ -103,6 +103,27 @@ def commits_url(self) -> str:
def head_commit(self) -> str:
return self._raw_pr.sha

@property
def merge_commit_sha(self) -> str:
return self._raw_pr.merge_commit_sha

@property
def merge_commit_status(self) -> MergeCommitStatus:
if self._raw_pr.merge_status == "can_be_merged":
return MergeCommitStatus.can_be_merged
elif self._raw_pr.merge_status == "cannot_be_merged":
return MergeCommitStatus.cannot_be_merged
elif self._raw_pr.merge_status == "unchecked":
return MergeCommitStatus.unchecked
elif self._raw_pr.merge_status == "checking":
return MergeCommitStatus.checking
elif self._raw_pr.merge_status == "cannot_be_merged_recheck":
return MergeCommitStatus.cannot_be_merged_recheck
else:
raise GitlabAPIException(
f"Invalid merge_status {self._raw_pr.merge_status}"
)

@property
def source_project(self) -> "ogr_gitlab.GitlabProject":
if self._source_project is None:
Expand Down
19 changes: 18 additions & 1 deletion tests/integration/github/test_pull_requests.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from requre.online_replacing import record_requests_for_all_methods

from tests.integration.github.base import GithubTests
from ogr.abstract import PRStatus
from ogr.abstract import PRStatus, MergeCommitStatus


@record_requests_for_all_methods()
Expand Down Expand Up @@ -260,6 +260,23 @@ def test_head_commit(self):
== "7cf6d0cbeca285ecbeb19a0067cb243783b3c768"
)

def test_merge_commit_sha(self):
pr240 = self.hello_world_project.get_pr(240)
assert pr240.head_commit == "dabfd3862702e49b6877da7f224e6d6458eb961a"
assert pr240.merge_commit_sha == "f502aae6920d82948f2dba0b70c9260fb1e34822"
assert pr240.merge_commit_status == MergeCommitStatus.cannot_be_merged
# ^ Because it's already merged
pr111 = self.hello_world_project.get_pr(111)
assert pr111.head_commit == "1abb19255a7c1bec7ffcae2487f022b23175af2b"
assert pr111.merge_commit_sha == "8512ef316918edc39c4a6eee13e6cc45344d03ac"
assert pr111.merge_commit_status == MergeCommitStatus.cannot_be_merged
# ^ Conflicts
pr112 = self.hello_world_project.get_pr(112)
assert pr112.head_commit == "9ab13fa4b4944510022730708045f42aea106cef"
assert pr112.merge_commit_sha == "0dc8211e10e37370f49364495249f5c693a9eff7"
assert pr112.merge_commit_status == MergeCommitStatus.can_be_merged
# ^ Not (yet) merged; good thing! (invalid specfile):

def test_source_project_upstream_branch(self):
# Tests source project for PR from upstream to upstream.
pr = self.hello_world_project.get_pr(72)
Expand Down
13 changes: 12 additions & 1 deletion tests/integration/gitlab/test_pull_requests.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from requre.online_replacing import record_requests_for_all_methods

from tests.integration.gitlab.base import GitlabTests
from ogr.abstract import PRStatus, CommitStatus
from ogr.abstract import PRStatus, CommitStatus, MergeCommitStatus


@record_requests_for_all_methods()
Expand Down Expand Up @@ -174,6 +174,17 @@ def test_head_commit(self):
== "59b1a9bab5b5198c619270646410867788685c16"
)

def test_merge_commit_sha(self):
pr1 = self.project.get_pr(1)
pr12 = self.project.get_pr(12)
pr19 = self.project.get_pr(19)
assert pr1.merge_commit_sha == "101a42bbbe174d04b465d49caf274dc3b4defeca"
assert pr1.merge_commit_status == MergeCommitStatus.can_be_merged
assert pr12.merge_commit_sha == "f6de56d97ec3ec74cd5194e79175162d9f969195"
assert pr12.merge_commit_status == MergeCommitStatus.can_be_merged
assert pr19.merge_commit_sha == "b8e18207cfdad954f1b3a96db34d0706b272e6cf"
assert pr19.merge_commit_status == MergeCommitStatus.can_be_merged

def test_source_project_upstream_branch(self):
pr = self.project.get_pr(23)
source_project = pr.source_project
Expand Down

0 comments on commit b0a1692

Please sign in to comment.