aboutsummaryrefslogtreecommitdiffstats
path: root/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/process/buildrequest.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/process/buildrequest.py')
-rw-r--r--lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/process/buildrequest.py253
1 files changed, 0 insertions, 253 deletions
diff --git a/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/process/buildrequest.py b/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/process/buildrequest.py
deleted file mode 100644
index c9b9daa7..00000000
--- a/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/process/buildrequest.py
+++ /dev/null
@@ -1,253 +0,0 @@
-# This file is part of Buildbot. Buildbot is free software: you can
-# redistribute it and/or modify it under the terms of the GNU General Public
-# License as published by the Free Software Foundation, version 2.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
-# details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, write to the Free Software Foundation, Inc., 51
-# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Copyright Buildbot Team Members
-
-import calendar
-from zope.interface import implements
-from twisted.python import log
-from twisted.internet import defer
-from buildbot import interfaces, sourcestamp
-from buildbot.process import properties
-from buildbot.status.results import FAILURE
-from buildbot.db import buildrequests
-
-class BuildRequest(object):
- """
-
- A rolled-up encapsulation of all of the data relevant to a build request.
-
- This class is used by the C{nextBuild} and C{mergeRequests} configuration
- parameters, as well as in starting a build. Construction of a BuildRequest
- object is a heavyweight process involving a lot of database queries, so
- it should be avoided where possible. See bug #1894.
-
- Build requests have a SourceStamp which specifies what sources to build.
- This may specify a specific revision of the source tree (so source.branch,
- source.revision, and source.patch are used). The .patch attribute is either
- None or a tuple of (patchlevel, diff), consisting of a number to use in
- 'patch -pN', and a unified-format context diff.
-
- Alternatively, the SourceStamp may specify a set of Changes to be built,
- contained in source.changes. In this case, the requeset may be mergeable
- with other BuildRequests on the same branch.
-
- @type source: L{buildbot.sourcestamp.SourceStamp}
- @ivar source: the source stamp that this BuildRequest use
-
- @type reason: string
- @ivar reason: the reason this Build is being requested. Schedulers provide
- this, but for forced builds the user requesting the build will provide a
- string. It comes from the buildsets table.
-
- @type properties: L{properties.Properties}
- @ivar properties: properties that should be applied to this build, taken
- from the buildset containing this build request
-
- @ivar submittedAt: a timestamp (seconds since epoch) when this request was
- submitted to the Builder. This is used by the CVS step to compute a
- checkout timestamp, as well as by the master to prioritize build requests
- from oldest to newest.
-
- @ivar buildername: name of the requested builder
-
- @ivar priority: request priority
-
- @ivar id: build request ID
-
- @ivar bsid: ID of the parent buildset
- """
-
- source = None
- sources = None
- submittedAt = None
-
- @classmethod
- def fromBrdict(cls, master, brdict):
- """
- Construct a new L{BuildRequest} from a dictionary as returned by
- L{BuildRequestsConnectorComponent.getBuildRequest}.
-
- This method uses a cache, which may result in return of stale objects;
- for the most up-to-date information, use the database connector
- methods.
-
- @param master: current build master
- @param brdict: build request dictionary
-
- @returns: L{BuildRequest}, via Deferred
- """
- cache = master.caches.get_cache("BuildRequests", cls._make_br)
- return cache.get(brdict['brid'], brdict=brdict, master=master)
-
- @classmethod
- @defer.inlineCallbacks
- def _make_br(cls, brid, brdict, master):
- buildrequest = cls()
- buildrequest.id = brid
- buildrequest.bsid = brdict['buildsetid']
- buildrequest.buildername = brdict['buildername']
- buildrequest.priority = brdict['priority']
- dt = brdict['submitted_at']
- buildrequest.submittedAt = dt and calendar.timegm(dt.utctimetuple())
- buildrequest.master = master
-
- # fetch the buildset to get the reason
- buildset = yield master.db.buildsets.getBuildset(brdict['buildsetid'])
- assert buildset # schema should guarantee this
- buildrequest.reason = buildset['reason']
-
- # fetch the buildset properties, and convert to Properties
- buildset_properties = yield master.db.buildsets.getBuildsetProperties(brdict['buildsetid'])
-
- buildrequest.properties = properties.Properties.fromDict(buildset_properties)
-
- # fetch the sourcestamp dictionary
- sslist = yield master.db.sourcestamps.getSourceStamps(buildset['sourcestampsetid'])
- assert len(sslist) > 0, "Empty sourcestampset: db schema enforces set to exist but cannot enforce a non empty set"
-
- # and turn it into a SourceStamps
- buildrequest.sources = {}
- def store_source(source):
- buildrequest.sources[source.codebase] = source
-
- dlist = []
- for ssdict in sslist:
- d = sourcestamp.SourceStamp.fromSsdict(master, ssdict)
- d.addCallback(store_source)
- dlist.append(d)
-
- yield defer.gatherResults(dlist)
-
- if buildrequest.sources:
- buildrequest.source = buildrequest.sources.values()[0]
-
- defer.returnValue(buildrequest)
-
- def requestsHaveSameCodebases(self, other):
- self_codebases = set(self.sources.iterkeys())
- other_codebases = set(other.sources.iterkeys())
- return self_codebases == other_codebases
-
- def requestsHaveChangesForSameCodebases(self, other):
- # Merge can only be done if both requests have sourcestampsets containing
- # comparable sourcestamps, that means sourcestamps with the same codebase.
- # This means that both requests must have exact the same set of codebases
- # If not then merge cannot be performed.
- # The second requirement is that both request have the changes in the
- # same codebases.
- #
- # Normaly a scheduler always delivers the same set of codebases:
- # sourcestamps with and without changes
- # For the case a scheduler is not configured with a set of codebases
- # it delivers only a set with sourcestamps that have changes.
- self_codebases = set(self.sources.iterkeys())
- other_codebases = set(other.sources.iterkeys())
- if self_codebases != other_codebases:
- return False
-
- for c in self_codebases:
- # Check either both or neither have changes
- if ((len(self.sources[c].changes) > 0)
- != (len(other.sources[c].changes) > 0)):
- return False
- # all codebases tested, no differences found
- return True
-
- def canBeMergedWith(self, other):
- """
- Returns if both requests can be merged
- """
-
- if not self.requestsHaveChangesForSameCodebases(other):
- return False
-
- #get codebases from myself, they are equal to other
- self_codebases = set(self.sources.iterkeys())
-
- for c in self_codebases:
- # check to prevent exception
- if c not in other.sources:
- return False
- if not self.sources[c].canBeMergedWith(other.sources[c]):
- return False
- return True
-
- def mergeSourceStampsWith(self, others):
- """ Returns one merged sourcestamp for every codebase """
- #get all codebases from all requests
- all_codebases = set(self.sources.iterkeys())
- for other in others:
- all_codebases |= set(other.sources.iterkeys())
-
- all_merged_sources = {}
- # walk along the codebases
- for codebase in all_codebases:
- all_sources = []
- if codebase in self.sources:
- all_sources.append(self.sources[codebase])
- for other in others:
- if codebase in other.sources:
- all_sources.append(other.sources[codebase])
- assert len(all_sources)>0, "each codebase should have atleast one sourcestamp"
- all_merged_sources[codebase] = all_sources[0].mergeWith(all_sources[1:])
-
- return [source for source in all_merged_sources.itervalues()]
-
- def mergeReasons(self, others):
- """Return a reason for the merged build request."""
- reasons = []
- for req in [self] + others:
- if req.reason and req.reason not in reasons:
- reasons.append(req.reason)
- return ", ".join(reasons)
-
- def getSubmitTime(self):
- return self.submittedAt
-
- @defer.inlineCallbacks
- def cancelBuildRequest(self):
- # first, try to claim the request; if this fails, then it's too late to
- # cancel the build anyway
- try:
- yield self.master.db.buildrequests.claimBuildRequests([self.id])
- except buildrequests.AlreadyClaimedError:
- log.msg("build request already claimed; cannot cancel")
- return
-
- # then complete it with 'FAILURE'; this is the closest we can get to
- # cancelling a request without running into trouble with dangling
- # references.
- yield self.master.db.buildrequests.completeBuildRequests([self.id],
- FAILURE)
-
- # and let the master know that the enclosing buildset may be complete
- yield self.master.maybeBuildsetComplete(self.bsid)
-
-class BuildRequestControl:
- implements(interfaces.IBuildRequestControl)
-
- def __init__(self, builder, request):
- self.original_builder = builder
- self.original_request = request
- self.brid = request.id
-
- def subscribe(self, observer):
- raise NotImplementedError
-
- def unsubscribe(self, observer):
- raise NotImplementedError
-
- def cancel(self):
- d = self.original_request.cancelBuildRequest()
- d.addErrback(log.err, 'while cancelling build request')