blob: 0bcae8b37a331b2108f523bb3f5bc5d6df17e410 [file] [log] [blame]
from twisted.python import log
from buildbot.schedulers.filter import ChangeFilter
from buildbot.schedulers.basic import SingleBranchScheduler
def getProjectsToFilter(projects):
# Here we could have "clang" project. In this case replace it by "cfe".
return [ p if p != "clang" else "cfe" for p in projects ]
# Since we have many parametric builders, we dynamically build the minimum set
# of schedulers, which covers all actually used combinations of dependencies.
def getSingleBranchSchedulers(builders, schedulers, **kwargs):
"""
I'm taking over all of not yet assigned builders with the
declared source code dependencies, and automatically generate
a minimum set of SingleBranchSchedulers to handle all the declared
source code dependency combinations.
"""
# Prepare a list of builders which already have been assigned to schedulers.
builders_with_schedulers = {
b for s in schedulers for b in s.builderNames
}
builders_with_automatic_schedulers = []
legacy_builders_with_automatic_schedulers = []
for builder in builders:
# Only for the builders created with LLVMBuildFactory or similar.
if getattr(builder['factory'], 'depends_on_projects', None):
if getattr(builder['factory'], 'is_legacy_mode', True):
# Only if this builder is in the legacy mode and
# does not yet have an assigned scheduler.
if builder['name'] not in builders_with_schedulers:
legacy_builders_with_automatic_schedulers.append(builder)
else:
# There are no manually assigned schedulers in this case.
builders_with_automatic_schedulers.append(builder)
automatic_schedulers = []
automatic_schedulers.extend(
_getSingleBranchAutomaticSchedulers(
builders_with_automatic_schedulers,
filter_branch='master', # git monorepo branch.
treeStableTimer=kwargs.get('treeStableTimer', 2*60)))
automatic_schedulers.extend(
_getSingleBranchAutomaticSchedulers(
legacy_builders_with_automatic_schedulers,
filter_branch='trunk', # svn repo branch.
treeStableTimer=kwargs.get('treeStableTimer', 2*60)))
return automatic_schedulers
def _getSingleBranchAutomaticSchedulers(
builders_with_automatic_schedulers,
filter_branch,
treeStableTimer):
automatic_schedulers = []
# Do we have any to take care of?
if builders_with_automatic_schedulers:
# Let's reconsile first to get a unique set of dependencies.
# We need a set of unique sets of dependent projects.
set_of_dependencies = set([
frozenset(getattr(b['factory'], 'depends_on_projects'))
for b in builders_with_automatic_schedulers
])
for projects in set_of_dependencies:
sch_builders = [
b['name']
for b in builders_with_automatic_schedulers
if frozenset(getattr(b['factory'], 'depends_on_projects')) == projects
]
automatic_scheduler_name = filter_branch + ":" + ",".join(sorted(projects))
projects_to_filter = getProjectsToFilter(projects)
automatic_schedulers.append(
SingleBranchScheduler(
name=automatic_scheduler_name,
treeStableTimer=treeStableTimer,
builderNames=sch_builders,
change_filter=ChangeFilter(project=projects_to_filter, branch=filter_branch)
)
)
log.msg(
"Generated SingleBranchScheduler: { name='%s'" % automatic_scheduler_name,
", builderNames=", sch_builders,
", change_filter=", projects_to_filter, " (branch: %s)" % filter_branch,
"}")
return automatic_schedulers