Do not collapse build requests with different property sets.
diff --git a/zorg/buildbot/process/buildrequest.py b/zorg/buildbot/process/buildrequest.py index 7af49a1..594a09d 100644 --- a/zorg/buildbot/process/buildrequest.py +++ b/zorg/buildbot/process/buildrequest.py
@@ -7,23 +7,43 @@ This implements Zorg's default collapse strategy. """ - # If these are for the same buildset, collapse away + # If these are for the same buildset, collapse away. if req1['buildsetid'] == req2['buildsetid']: return True - # Get the buidlsets for each buildrequest + # Check properties and do not collapse if properties do not match. + if req1.get('properties', None) != req2.get('properties', None): + return False + + # Get the buidlsets for each buildrequest. selfBuildsets = yield master.data.get( ('buildsets', str(req1['buildsetid']))) otherBuildsets = yield master.data.get( ('buildsets', str(req2['buildsetid']))) - # extract sourcestamps, as dictionaries by codebase + # Fetch the buildset properties. + selfBuildsetPoperties = yield \ + master.db.buildsets.getBuildsetProperties( + str(req1['buildsetid']) + ) + otherBuildsetPoperties = yield \ + master.db.buildsets.getBuildsetProperties( + str(req2['buildsetid']) + ) + + # Check buildsets properties and do not collapse + # if properties do not match. This includes the check + # for different schedulers. + if selfBuildsetPoperties != otherBuildsetPoperties: + return False + + # Extract sourcestamps, as dictionaries by codebase. selfSources = dict((ss['codebase'], ss) for ss in selfBuildsets['sourcestamps']) otherSources = dict((ss['codebase'], ss) for ss in otherBuildsets['sourcestamps']) - # if the sets of codebases do not match, we can't collapse + # If the sets of codebases do not match, we can't collapse. if set(selfSources) != set(otherSources): return False @@ -41,14 +61,15 @@ # a part of the monorepo, so all of them are compatible # and could be collapsed. - # anything with a patch won't be collapsed + # Anything with a patch won't be collapsed. if selfSS['patch'] or otherSS['patch']: return False - # get changes & compare + # Get changes & compare. selfChanges = yield master.data.get(('sourcestamps', selfSS['ssid'], 'changes')) otherChanges = yield master.data.get(('sourcestamps', otherSS['ssid'], 'changes')) - # if both have changes, proceed, else fail - if no changes check revision instead + # If both have changes - proceed, else fail. + # If no changes - check revision instead. if selfChanges and otherChanges: continue @@ -58,7 +79,7 @@ if not selfChanges and otherChanges: return False - # else check revisions + # Else check revisions. if selfSS['revision'] != otherSS['revision']: return False