Only depend-on open changes
Instead of checking if changes found from a Depends-On line are merged, check if they are open. This ignores abandoned changes when building the list of dependent changes. In the event that change I0000 depends-on change-id I1234 and change-id I1234 matches multiple changes, one of which is abandoned, then change I0000 will never enter the gate as it waits indefinitely for the abandoned I1234 to become eligible for the gate. Change-Id: Ia6ae7b1da13fa2bcf6fc08fac49563e7ac960a84
This commit is contained in:
parent
7b3f3be326
commit
773651ad7b
@ -3903,19 +3903,23 @@ For CI problems and help debugging, contact ci@example.org"""
|
||||
"Test cross-repo dependencies in multiple branches"
|
||||
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', 'mp', 'C')
|
||||
C.data['id'] = B.data['id']
|
||||
C1 = self.fake_gerrit.addFakeChange('org/project2', 'mp', 'C1')
|
||||
C2 = self.fake_gerrit.addFakeChange('org/project2', 'mp', 'C2',
|
||||
status="ABANDONED")
|
||||
C1.data['id'] = B.data['id']
|
||||
C2.data['id'] = B.data['id']
|
||||
|
||||
A.addApproval('CRVW', 2)
|
||||
B.addApproval('CRVW', 2)
|
||||
C.addApproval('CRVW', 2)
|
||||
C1.addApproval('CRVW', 2)
|
||||
|
||||
# A Depends-On: B+C
|
||||
# A Depends-On: B+C1
|
||||
A.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
|
||||
A.subject, B.data['id'])
|
||||
|
||||
self.worker.hold_jobs_in_build = True
|
||||
B.addApproval('APRV', 1)
|
||||
C.addApproval('APRV', 1)
|
||||
C1.addApproval('APRV', 1)
|
||||
self.fake_gerrit.addEvent(A.addApproval('APRV', 1))
|
||||
self.waitUntilSettled()
|
||||
|
||||
@ -3931,10 +3935,10 @@ For CI problems and help debugging, contact ci@example.org"""
|
||||
|
||||
self.assertEqual(A.data['status'], 'MERGED')
|
||||
self.assertEqual(B.data['status'], 'MERGED')
|
||||
self.assertEqual(C.data['status'], 'MERGED')
|
||||
self.assertEqual(C1.data['status'], 'MERGED')
|
||||
self.assertEqual(A.reported, 2)
|
||||
self.assertEqual(B.reported, 2)
|
||||
self.assertEqual(C.reported, 2)
|
||||
self.assertEqual(C1.reported, 2)
|
||||
|
||||
self.assertEqual(self.getJobFromHistory('project1-merge').changes,
|
||||
'2,1 3,1 1,1')
|
||||
|
@ -295,6 +295,9 @@ class GerritSource(BaseSource):
|
||||
# cycle, we won't detect it. By explicitly performing a
|
||||
# walk of the dependency tree, we will.
|
||||
detect_cycle(dep, history)
|
||||
# This is a git commit dependency. So we only ignore it if it is
|
||||
# already merged. So even if it is "ABANDONED", we should not
|
||||
# ignore it.
|
||||
if (not dep.is_merged) and dep not in needs_changes:
|
||||
needs_changes.append(dep)
|
||||
|
||||
@ -315,7 +318,7 @@ class GerritSource(BaseSource):
|
||||
# cycle, we won't detect it. By explicitly performing a
|
||||
# walk of the dependency tree, we will.
|
||||
detect_cycle(dep, history)
|
||||
if (not dep.is_merged) and dep not in needs_changes:
|
||||
if dep.open and dep not in needs_changes:
|
||||
needs_changes.append(dep)
|
||||
change.needs_changes = needs_changes
|
||||
|
||||
@ -327,7 +330,7 @@ class GerritSource(BaseSource):
|
||||
self.log.debug("Updating %s: Getting git-needed change %s,%s" %
|
||||
(change, dep_num, dep_ps))
|
||||
dep = self._getChange(dep_num, dep_ps)
|
||||
if (not dep.is_merged) and dep.is_current_patchset:
|
||||
if dep.open and dep.is_current_patchset:
|
||||
needed_by_changes.append(dep)
|
||||
|
||||
for record in self._getNeededByFromCommit(data['id'], change):
|
||||
@ -340,7 +343,7 @@ class GerritSource(BaseSource):
|
||||
# reference the latest patchset of its Depends-On (this
|
||||
# change).
|
||||
dep = self._getChange(dep_num, dep_ps, refresh=True)
|
||||
if (not dep.is_merged) and dep.is_current_patchset:
|
||||
if dep.open and dep.is_current_patchset:
|
||||
needed_by_changes.append(dep)
|
||||
change.needed_by_changes = needed_by_changes
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user