aboutsummaryrefslogtreecommitdiffstats
path: root/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/sourcestamp.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/sourcestamp.py')
-rw-r--r--lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/sourcestamp.py359
1 files changed, 0 insertions, 359 deletions
diff --git a/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/sourcestamp.py b/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/sourcestamp.py
deleted file mode 100644
index bb4042ce..00000000
--- a/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/sourcestamp.py
+++ /dev/null
@@ -1,359 +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
-
-
-from zope.interface import implements
-from twisted.persisted import styles
-from twisted.internet import defer
-from buildbot.changes.changes import Change
-from buildbot import util, interfaces
-# TODO: kill this class, or at least make it less significant
-class SourceStamp(util.ComparableMixin, styles.Versioned):
- """This is a tuple of (branch, revision, patchspec, changes, project, repository).
-
- C{branch} is always valid, although it may be None to let the Source
- step use its default branch. There are three possibilities for the
- remaining elements:
- - (revision=REV, patchspec=None, changes=None): build REV. If REV is
- None, build the HEAD revision from the given branch. Note that REV
- must always be a string: SVN, Perforce, and other systems which use
- integers should provide a string here, but the Source checkout step
- will integerize it when making comparisons.
- - (revision=REV, patchspec=(LEVEL, DIFF), changes=None): checkout REV,
- then apply a patch to the source, with C{patch -pLEVEL <DIFF}.
- If REV is None, checkout HEAD and patch it.
- - (revision=None, patchspec=None, changes=[CHANGES]): let the Source
- step check out the latest revision indicated by the given Changes.
- CHANGES is a tuple of L{buildbot.changes.changes.Change} instances,
- and all must be on the same branch.
-
- @ivar ssid: sourcestamp ID, or None if this sourcestamp has not yet been
- added to the database
-
- @ivar branch: branch name or None
-
- @ivar revision: revision string or None
-
- @ivar patch: tuple (patch level, patch body) or None
-
- @ivar patch_info: tuple (patch author, patch comment) or None
-
- @ivar changes: tuple of changes that went into this source stamp, sorted by
- number
-
- @ivar project: project name
-
- @ivar repository: repository URL
- """
-
- persistenceVersion = 3
- persistenceForgets = ( 'wasUpgraded', )
-
- # all seven of these are publicly visible attributes
- branch = None
- revision = None
- patch = None
- patch_info = None
- changes = ()
- project = ''
- repository = ''
- codebase = ''
- sourcestampsetid = None
- ssid = None
-
- compare_attrs = ('branch', 'revision', 'patch', 'patch_info', 'changes', 'project', 'repository', 'codebase')
-
- implements(interfaces.ISourceStamp)
-
- @classmethod
- def fromSsdict(cls, master, ssdict):
- """
- Class method to create a L{SourceStamp} from a dictionary as returned
- by L{SourceStampConnectorComponent.getSourceStamp}.
-
- @param master: build master instance
- @param ssdict: source stamp dictionary
-
- @returns: L{SourceStamp} via Deferred
- """
- # try to fetch from the cache, falling back to _make_ss if not
- # found
- cache = master.caches.get_cache("SourceStamps", cls._make_ss)
- return cache.get(ssdict['ssid'], ssdict=ssdict, master=master)
-
- @classmethod
- def _make_ss(cls, ssid, ssdict, master):
- sourcestamp = cls(_fromSsdict=True)
- sourcestamp.ssid = ssid
- sourcestamp.branch = ssdict['branch']
- sourcestamp.revision = ssdict['revision']
- sourcestamp.project = ssdict['project']
- sourcestamp.repository = ssdict['repository']
- sourcestamp.codebase = ssdict['codebase']
- sourcestamp.sourcestampsetid = ssdict['sourcestampsetid']
-
- sourcestamp.patch = None
- if ssdict['patch_body']:
- sourcestamp.patch = (ssdict['patch_level'], ssdict['patch_body'],
- ssdict.get('patch_subdir'))
- sourcestamp.patch_info = (ssdict['patch_author'],
- ssdict['patch_comment'])
-
- if ssdict['changeids']:
- # sort the changeids in order, oldest to newest
- sorted_changeids = sorted(ssdict['changeids'])
- def gci(id):
- d = master.db.changes.getChange(id)
- d.addCallback(lambda chdict :
- Change.fromChdict(master, chdict))
- return d
- d = defer.gatherResults([ gci(id)
- for id in sorted_changeids ])
- else:
- d = defer.succeed([])
- def got_changes(changes):
- sourcestamp.changes = tuple(changes)
- return sourcestamp
- d.addCallback(got_changes)
- return d
-
- def __init__(self, branch=None, revision=None, patch=None, sourcestampsetid=None,
- patch_info=None, changes=None, project='', repository='',
- codebase = '', _fromSsdict=False, _ignoreChanges=False):
- self._addSourceStampToDatabase_lock = defer.DeferredLock();
-
- # skip all this madness if we're being built from the database
- if _fromSsdict:
- return
-
- if patch is not None:
- assert 2 <= len(patch) <= 3
- assert int(patch[0]) != -1
- self.sourcestampsetid = sourcestampsetid
- self.branch = branch
- self.patch = patch
- self.patch_info = patch_info
- self.project = project or ''
- self.repository = repository or ''
- self.codebase = codebase or ''
- if changes:
- self.changes = changes = list(changes)
- changes.sort()
- if not _ignoreChanges:
- # set branch and revision to most recent change
- self.branch = changes[-1].branch
- revision = changes[-1].revision
- if not self.project and hasattr(changes[-1], 'project'):
- self.project = changes[-1].project
- if not self.repository and hasattr(changes[-1], 'repository'):
- self.repository = changes[-1].repository
-
- if revision is not None:
- if isinstance(revision, int):
- revision = str(revision)
-
- self.revision = revision
-
- def canBeMergedWith(self, other):
- # this algorithm implements the "compatible" mergeRequests defined in
- # detail in cfg-buidlers.texinfo; change that documentation if the
- # algorithm changes!
- if other.codebase != self.codebase:
- return False
- if other.repository != self.repository:
- return False
- if other.branch != self.branch:
- return False # the builds are completely unrelated
- if other.project != self.project:
- return False
- if self.patch or other.patch:
- # you can't merge patched builds with anything else
- return self is other
-
- if self.changes and other.changes:
- return True
- elif self.changes and not other.changes:
- return False # we're using changes, they aren't
- elif not self.changes and other.changes:
- return False # they're using changes, we aren't
-
- if self.revision == other.revision:
- # both builds are using the same specific revision, so they can
- # be merged. It might be the case that revision==None, so they're
- # both building HEAD.
- return True
-
- return False
-
- def mergeWith(self, others):
- """Generate a SourceStamp for the merger of me and all the other
- SourceStamps. This is called by a Build when it starts, to figure
- out what its sourceStamp should be."""
-
- # either we're all building the same thing (changes==None), or we're
- # all building changes (which can be merged)
- changes = []
- changes.extend(self.changes)
- for ss in others:
- changes.extend(ss.changes)
- newsource = SourceStamp(sourcestampsetid=self.sourcestampsetid,
- branch=self.branch,
- revision=self.revision,
- patch=self.patch,
- patch_info=self.patch_info,
- project=self.project,
- repository=self.repository,
- codebase=self.codebase,
- changes=changes)
- return newsource
-
- def clone(self):
- # Create an exact but identityless copy
- return SourceStamp(branch=self.branch, revision=self.revision,
- patch=self.patch, repository=self.repository,
- codebase=self.codebase, patch_info=self.patch_info,
- project=self.project, changes=self.changes,
- _ignoreChanges=True)
-
- def getAbsoluteSourceStamp(self, got_revision):
- cloned = self.clone()
- cloned.revision = got_revision
- return cloned
-
- def getText(self):
- # note: this won't work for VC systems with huge 'revision' strings
- text = []
- if self.project:
- text.append("for %s" % self.project)
- if self.repository:
- text.append("in %s" % self.repository)
- if self.codebase:
- text.append("(%s)" % self.codebase)
- if self.revision is None:
- return text + [ "latest" ]
- text.append(str(self.revision))
- if self.branch:
- text.append("in '%s'" % self.branch)
- if self.patch:
- text.append("[patch]")
- return text
-
- def asDict(self):
- result = {}
- # Constant
- result['revision'] = self.revision
-
- # TODO(maruel): Make the patch content a suburl.
- result['hasPatch'] = self.patch is not None
- if self.patch:
- result['patch_level'] = self.patch[0]
- result['patch_body'] = self.patch[1]
- if len(self.patch) > 2:
- result['patch_subdir'] = self.patch[2]
- if self.patch_info:
- result['patch_author'] = self.patch_info[0]
- result['patch_comment'] = self.patch_info[1]
-
- result['branch'] = self.branch
- result['changes'] = [c.asDict() for c in getattr(self, 'changes', [])]
- result['project'] = self.project
- result['repository'] = self.repository
- result['codebase'] = self.codebase
- return result
-
- def __setstate__(self, d):
- styles.Versioned.__setstate__(self, d)
- self._addSourceStampToDatabase_lock = defer.DeferredLock();
-
- def upgradeToVersion1(self):
- # version 0 was untyped; in version 1 and later, types matter.
- if self.branch is not None and not isinstance(self.branch, str):
- self.branch = str(self.branch)
- if self.revision is not None and not isinstance(self.revision, str):
- self.revision = str(self.revision)
- if self.patch is not None:
- self.patch = ( int(self.patch[0]), str(self.patch[1]) )
- self.wasUpgraded = True
-
- def upgradeToVersion2(self):
- # version 1 did not have project or repository; just set them to a default ''
- self.project = ''
- self.repository = ''
- self.wasUpgraded = True
-
- def upgradeToVersion3(self):
- #The database has been upgraded where all existing sourcestamps got an
- #setid equal to its ssid
- self.sourcestampsetid = self.ssid
- #version 2 did not have codebase; set to ''
- self.codebase = ''
- self.wasUpgraded = True
-
- def getSourceStampSetId(self, master):
- "temporary; do not use widely!"
- if self.sourcestampsetid:
- return defer.succeed(self.sourcestampsetid)
- else:
- return self.addSourceStampToDatabase(master)
-
-
- @util.deferredLocked('_addSourceStampToDatabase_lock')
- def addSourceStampToDatabase(self, master, sourcestampsetid = None):
- # add it to the DB
- patch_body = None
- patch_level = None
- patch_subdir = None
- if self.patch:
- patch_level = self.patch[0]
- patch_body = self.patch[1]
- if len(self.patch) > 2:
- patch_subdir = self.patch[2]
-
- patch_author = None
- patch_comment = None
- if self.patch_info:
- patch_author, patch_comment = self.patch_info
-
- def get_setid():
- if sourcestampsetid is not None:
- return defer.succeed( sourcestampsetid )
- else:
- return master.db.sourcestampsets.addSourceStampSet()
-
- def set_setid(setid):
- self.sourcestampsetid = setid
- return setid
-
- def add_sourcestamp(setid):
- return master.db.sourcestamps.addSourceStamp(
- sourcestampsetid=setid,
- branch=self.branch, revision=self.revision,
- repository=self.repository, codebase=self.codebase,
- project=self.project,
- patch_body=patch_body, patch_level=patch_level,
- patch_author=patch_author, patch_comment=patch_comment,
- patch_subdir=patch_subdir,
- changeids=[c.number for c in self.changes])
-
- def set_ssid(ssid):
- self.ssid = ssid
- return ssid
-
- d = get_setid()
- d.addCallback(set_setid)
- d.addCallback(add_sourcestamp)
- d.addCallback(set_ssid)
- d.addCallback(lambda _ : self.sourcestampsetid)
- return d