blob: 0a5bc121b26cd407054d52e4c9f7ec8264503ad3 [file] [log] [blame]
# Copyright (c) 2011-2012 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Module that contains trybot patch pool code."""
import constants
import functools
def ChromiteFilter(patch):
"""Used with FilterFn to isolate patches to chromite."""
return patch.project == constants.CHROMITE_PROJECT
def ManifestFilter(patch):
"""Used with FilterFn to isolate patches to the manifest."""
return patch.project in (constants.MANIFEST_PROJECT,
constants.MANIFEST_INT_PROJECT)
def BranchFilter(branch, patch):
"""Used with FilterFn to isolate patches based on a specific upstream."""
return patch.tracking_branch == branch
class TrybotPatchPool(object):
"""Represents patches specified by the user to test."""
def __init__(self, gerrit_patches=(), local_patches=(), remote_patches=()):
self.gerrit_patches = tuple(gerrit_patches)
self.local_patches = tuple(local_patches)
self.remote_patches = tuple(remote_patches)
def __nonzero__(self):
"""Returns True if the pool has no patches."""
return any([self.gerrit_patches, self.local_patches, self.remote_patches])
def Filter(self, **kwargs):
"""Returns a new pool with only patches that match constraints.
Args:
**kwargs: constraints in the form of attr=value. I.e.,
project='chromiumos/chromite', tracking_branch='master'.
"""
def AttributeFilter(patch):
for key in kwargs:
if getattr(patch, key, object()) != kwargs[key]:
return False
else:
return True
return self.FilterFn(AttributeFilter)
def FilterFn(self, filter_fn, negate=False):
"""Returns a new pool with only patches that match constraints.
Args:
filter_fn: Functor that accepts a 'patch' argument, and returns whether to
include the patch in the results.
negate: Return patches that don't pass the filter_fn.
"""
f = filter_fn
if negate:
f = lambda p : not filter_fn(p)
return self.__class__(
gerrit_patches=filter(f, self.gerrit_patches),
local_patches=filter(f, self.local_patches),
remote_patches=filter(f, self.remote_patches))
def FilterManifest(self, negate=False):
"""Return a patch pool with only patches to the manifest."""
return self.FilterFn(ManifestFilter, negate=negate)
def FilterBranch(self, branch, negate=False):
"""Return a patch pool with only patches based on a particular branch."""
return self.FilterFn(functools.partial(BranchFilter, branch), negate=negate)
def __iter__(self):
for source in [self.local_patches, self.remote_patches,
self.gerrit_patches]:
for patch in source:
yield patch