Merge "Fix dependency cycle false positive" into feature/zuulv3

This commit is contained in:
Zuul 2018-01-17 05:20:12 +00:00 committed by Gerrit Code Review
commit f641f8b8f2
4 changed files with 67 additions and 4 deletions

View File

@ -90,6 +90,40 @@ class TestGerritCRD(ZuulTestCase):
'project-merge', 'org/project1').changes
self.assertEqual(changes, '2,1 1,1')
def test_crd_gate_triangle(self):
A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
C = self.fake_gerrit.addFakeChange('org/project2', 'master', 'C')
A.addApproval('Code-Review', 2)
B.addApproval('Code-Review', 2)
C.addApproval('Code-Review', 2)
A.addApproval('Approved', 1)
B.addApproval('Approved', 1)
# C-->B
# \ /
# v
# A
# C Depends-On: A
C.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
C.subject, A.data['url'])
# B Depends-On: A
B.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
B.subject, A.data['url'])
# C git-depends on B
C.setDependsOn(B, 1)
self.fake_gerrit.addEvent(C.addApproval('Approved', 1))
self.waitUntilSettled()
self.assertEqual(A.reported, 2)
self.assertEqual(B.reported, 2)
self.assertEqual(C.reported, 2)
self.assertEqual(A.data['status'], 'MERGED')
self.assertEqual(B.data['status'], 'MERGED')
self.assertEqual(C.data['status'], 'MERGED')
self.assertEqual(self.history[-1].changes, '1,1 2,1 3,1')
def test_crd_branch(self):
"Test cross-repo dependencies in multiple branches"
@ -257,6 +291,7 @@ class TestGerritCRD(ZuulTestCase):
B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
A.addApproval('Code-Review', 2)
B.addApproval('Code-Review', 2)
B.addApproval('Approved', 1)
# A -> B -> A (via commit-depends)
@ -522,6 +557,30 @@ class TestGerritCRD(ZuulTestCase):
for job in self.history:
self.assertEqual(len(job.changes.split()), 1)
def test_crd_check_triangle(self):
A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
C = self.fake_gerrit.addFakeChange('org/project2', 'master', 'C')
# C-->B
# \ /
# v
# A
# C Depends-On: A
C.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
C.subject, A.data['url'])
# B Depends-On: A
B.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
B.subject, A.data['url'])
# C git-depends on B
C.setDependsOn(B, 1)
self.fake_gerrit.addEvent(C.getPatchsetCreatedEvent(1))
self.waitUntilSettled()
self.assertEqual(C.reported, 1)
self.assertEqual(self.history[0].changes, '1,1 2,1 3,1')
@simple_layout('layouts/three-projects.yaml')
def test_crd_check_transitive(self):
"Test transitive cross-repo dependencies"

View File

@ -260,6 +260,7 @@ class TestGerritLegacyCRD(ZuulTestCase):
B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
A.addApproval('Code-Review', 2)
B.addApproval('Code-Review', 2)
B.addApproval('Approved', 1)
# A -> B -> A (via commit-depends)

View File

@ -141,13 +141,16 @@ class DependentPipelineManager(PipelineManager):
def enqueueChangesAhead(self, change, quiet, ignore_requirements,
change_queue, history=None):
if history and change.number in history:
if history and change in history:
# detected dependency cycle
self.log.warn("Dependency cycle detected")
return False
if hasattr(change, 'number'):
history = history or []
history.append(change.number)
history = history + [change]
else:
# Don't enqueue dependencies ahead of a non-change ref.
return True
ret = self.checkForChangesNeededBy(change, change_queue)
if ret in [True, False]:

View File

@ -34,13 +34,13 @@ class IndependentPipelineManager(PipelineManager):
def enqueueChangesAhead(self, change, quiet, ignore_requirements,
change_queue, history=None):
if history and change.number in history:
if history and change in history:
# detected dependency cycle
self.log.warn("Dependency cycle detected")
return False
if hasattr(change, 'number'):
history = history or []
history.append(change.number)
history = history + [change]
else:
# Don't enqueue dependencies ahead of a non-change ref.
return True