Implement github pipeline req of current-patchset
Require that the commit from the event is the latest commit in the pull
request.
Also fix a problem with faked github status grabs. Now we're sending an
event where the sha of the event isn't the head sha, and that was
tripping up our fakes.
Change-Id: I269c97d096e42f0a2d4a0f1b0e57eb238e0b7baf
diff --git a/tests/base.py b/tests/base.py
index c01e9c3..f41d783 100755
--- a/tests/base.py
+++ b/tests/base.py
@@ -996,8 +996,12 @@
owner, proj = project.split('/')
for pr in self.pull_requests:
pr_owner, pr_project = pr.project.split('/')
+ # This is somewhat risky, if the same commit exists in multiple
+ # PRs, we might grab the wrong one that doesn't have a status
+ # that is expected to be there. Maybe re-work this so that there
+ # is a global registry of commit statuses like with github.
if (pr_owner == owner and pr_project == proj and
- pr.head_sha == sha):
+ sha in pr.statuses):
return pr.statuses[sha]
def setCommitStatus(self, project, sha, state,
diff --git a/tests/fixtures/layouts/requirements-github.yaml b/tests/fixtures/layouts/requirements-github.yaml
index c7f1830..9933f27 100644
--- a/tests/fixtures/layouts/requirements-github.yaml
+++ b/tests/fixtures/layouts/requirements-github.yaml
@@ -154,6 +154,20 @@
github:
comment: true
+- pipeline:
+ name: require_current
+ manager: independent
+ require:
+ github:
+ current-patchset: true
+ trigger:
+ github:
+ - event: pull_request
+ action: changed
+ success:
+ github:
+ comment: true
+
- job:
name: project1-pipeline
- job:
@@ -170,6 +184,8 @@
name: project7-olderthan
- job:
name: project8-requireopen
+- job:
+ name: project9-requirecurrent
- project:
name: org/project1
@@ -221,3 +237,9 @@
require_open:
jobs:
- project8-requireopen
+
+- project:
+ name: org/project9
+ require_current:
+ jobs:
+ - project9-requirecurrent
diff --git a/tests/unit/test_github_requirements.py b/tests/unit/test_github_requirements.py
index 3c77ff2..5dd6e80 100644
--- a/tests/unit/test_github_requirements.py
+++ b/tests/unit/test_github_requirements.py
@@ -307,3 +307,22 @@
self.waitUntilSettled()
# PR is closed, should not trigger
self.assertEqual(len(self.history), 1)
+
+ @simple_layout('layouts/requirements-github.yaml', driver='github')
+ def test_require_current(self):
+
+ A = self.fake_github.openFakePullRequest('org/project9', 'master', 'A')
+ # A sync event that we will keep submitting to trigger
+ sync = A.getPullRequestSynchronizeEvent()
+ self.fake_github.emitEvent(sync)
+ self.waitUntilSettled()
+
+ # PR head is current should enqueue
+ self.assertEqual(len(self.history), 1)
+
+ # Add a commit to the PR, re-issue the original comment event
+ A.addCommit()
+ self.fake_github.emitEvent(sync)
+ self.waitUntilSettled()
+ # Event hash is not current, should not trigger
+ self.assertEqual(len(self.history), 1)