| 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 |