Check gerrit dependencies using isMerged()
When a gerrit change is merged, the dependencies are not always updated correctly until you change or rebase a patch. Calling isMerged() gets around this issue to make sure the dependency is merged. Consider the following scenario (merge-mode: cherry-pick): A user creates relation chain patch A and B. They update only A with a new patchset and gate. Then they apply the correct votes for B to gate. If isMerged() isn't called, change B will not start gating because it's dependencies are using a cached version of is_merged. Merge-mode cherry-pick supports merging a change that is an indirect ancestor (parent is any patchset of another change) as long as there are no conflicts with what is already merged in the repository. Change-Id: I6afc8b9897a0c04b416edd26b880386963932082
This commit is contained in:
parent
59ca809a9e
commit
8340dcce79
|
@ -881,10 +881,22 @@ class GerritConnection(ZKChangeCacheMixin, ZKBranchCacheMixin, BaseConnection):
|
||||||
'GerritChange', str(dep_num), str(dep_ps))
|
'GerritChange', str(dep_num), str(dep_ps))
|
||||||
dep = self._getChange(dep_key, history=history,
|
dep = self._getChange(dep_key, history=history,
|
||||||
event=event)
|
event=event)
|
||||||
|
# Check if the change is depending on an older commit than what
|
||||||
|
# is the latest. If it is, then it might already be merged. In
|
||||||
|
# this case, call isMerged() to verify and don't use the cached
|
||||||
|
# version. This is necessary in the case of merge-mode cherry-pick.
|
||||||
|
# A change's parent may point to old patchset of a dependency but
|
||||||
|
# still be allowed to gate.
|
||||||
|
check_dep_key = ChangeKey(self.connection_name, None,
|
||||||
|
'GerritChange', str(dep_num),
|
||||||
|
str(dep_ps + 1))
|
||||||
|
check_dep = self._getChange(check_dep_key)
|
||||||
|
|
||||||
# This is a git commit dependency. So we only ignore it if it is
|
# 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
|
# already merged. So even if it is "ABANDONED", we should not
|
||||||
# ignore it.
|
# ignore it.
|
||||||
if (not dep.is_merged) and dep not in needs_changes:
|
if dep not in needs_changes and not (
|
||||||
|
dep.is_merged or not check_dep or self.isMerged(dep)):
|
||||||
git_needs_changes.append(dep_key.reference)
|
git_needs_changes.append(dep_key.reference)
|
||||||
needs_changes.add(dep_key.reference)
|
needs_changes.add(dep_key.reference)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue