aboutsummaryrefslogtreecommitdiffstats
path: root/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/status/web/feeds.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/status/web/feeds.py')
-rw-r--r--lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/status/web/feeds.py275
1 files changed, 0 insertions, 275 deletions
diff --git a/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/status/web/feeds.py b/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/status/web/feeds.py
deleted file mode 100644
index f29a11ca..00000000
--- a/lib/python2.7/site-packages/buildbot-0.8.8-py2.7.egg/buildbot/status/web/feeds.py
+++ /dev/null
@@ -1,275 +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
-
-# This module enables ATOM and RSS feeds from webstatus.
-#
-# It is based on "feeder.py" which was part of the Buildbot
-# configuration for the Subversion project. The original file was
-# created by Lieven Gobaerts and later adjusted by API
-# (apinheiro@igalia.coma) and also here
-# http://code.google.com/p/pybots/source/browse/trunk/master/Feeder.py
-#
-# All subsequent changes to feeder.py where made by Chandan-Dutta
-# Chowdhury <chandan-dutta.chowdhury @ hp.com> and Gareth Armstrong
-# <gareth.armstrong @ hp.com>.
-#
-# Those modifications are as follows:
-# 1) the feeds are usable from baseweb.WebStatus
-# 2) feeds are fully validated ATOM 1.0 and RSS 2.0 feeds, verified
-# with code from http://feedvalidator.org
-# 3) nicer xml output
-# 4) feeds can be filtered as per the /waterfall display with the
-# builder and category filters
-# 5) cleaned up white space and imports
-#
-# Finally, the code was directly integrated into these two files,
-# buildbot/status/web/feeds.py (you're reading it, ;-)) and
-# buildbot/status/web/baseweb.py.
-
-import os
-import re
-import time
-from twisted.web import resource
-from buildbot.status import results
-
-class XmlResource(resource.Resource):
- contentType = "text/xml; charset=UTF-8"
- docType = ''
-
- def getChild(self, name, request):
- return self
-
- def render(self, request):
- data = self.content(request)
- request.setHeader("content-type", self.contentType)
- if request.method == "HEAD":
- request.setHeader("content-length", len(data))
- return ''
- return data
-
-_abbr_day = [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
-_abbr_mon = ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug',
- 'Sep', 'Oct', 'Nov', 'Dec']
-
-def rfc822_time(tstamp):
- res = time.strftime("%%s, %d %%s %Y %H:%M:%S GMT",
- tstamp)
- res = res % (_abbr_day[tstamp.tm_wday], _abbr_mon[tstamp.tm_mon])
- return res
-
-class FeedResource(XmlResource):
- pageTitle = None
- link = 'http://dummylink'
- language = 'en-us'
- description = 'Dummy rss'
- status = None
-
- def __init__(self, status, categories=None, pageTitle=None):
- self.status = status
- self.categories = categories
- self.pageTitle = pageTitle
- self.title = self.status.getTitle()
- self.link = self.status.getBuildbotURL()
- self.description = 'List of builds'
- self.pubdate = time.gmtime(int(time.time()))
- self.user = self.getEnv(['USER', 'USERNAME'], 'buildmaster')
- self.hostname = self.getEnv(['HOSTNAME', 'COMPUTERNAME'],
- 'buildmaster')
- self.children = {}
-
- def getEnv(self, keys, fallback):
- for key in keys:
- if key in os.environ:
- return os.environ[key]
- return fallback
-
- def getBuilds(self, request):
- builds = []
- # THIS is lifted straight from the WaterfallStatusResource Class in
- # status/web/waterfall.py
- #
- # we start with all Builders available to this Waterfall: this is
- # limited by the config-file -time categories= argument, and defaults
- # to all defined Builders.
- allBuilderNames = self.status.getBuilderNames(categories=self.categories)
- builders = [self.status.getBuilder(name) for name in allBuilderNames]
-
- # but if the URL has one or more builder= arguments (or the old show=
- # argument, which is still accepted for backwards compatibility), we
- # use that set of builders instead. We still don't show anything
- # outside the config-file time set limited by categories=.
- showBuilders = request.args.get("show", [])
- showBuilders.extend(request.args.get("builder", []))
- if showBuilders:
- builders = [b for b in builders if b.name in showBuilders]
-
- # now, if the URL has one or category= arguments, use them as a
- # filter: only show those builders which belong to one of the given
- # categories.
- showCategories = request.args.get("category", [])
- if showCategories:
- builders = [b for b in builders if b.category in showCategories]
-
- failures_only = request.args.get("failures_only", ["false"])
- failures_only = failures_only[0] not in ('false', '0', 'no', 'off')
-
- maxFeeds = 25
-
- # Copy all failed builds in a new list.
- # This could clearly be implemented much better if we had
- # access to a global list of builds.
- for b in builders:
- if failures_only:
- res = (results.FAILURE,)
- else:
- res = None
- builds.extend(b.generateFinishedBuilds(results=res, max_search=maxFeeds))
-
- # Sort build list by date, youngest first.
- # To keep compatibility with python < 2.4, use this for sorting instead:
- # We apply Decorate-Sort-Undecorate
- deco = [(build.getTimes(), build) for build in builds]
- deco.sort()
- deco.reverse()
- builds = [build for (b1, build) in deco]
-
- if builds:
- builds = builds[:min(len(builds), maxFeeds)]
- return builds
-
- def content(self, request):
- builds = self.getBuilds(request)
-
- build_cxts = []
-
- for build in builds:
- start, finished = build.getTimes()
- finishedTime = time.gmtime(int(finished))
- link = re.sub(r'index.html', "", self.status.getURLForThing(build))
-
- # title: trunk r22191 (plus patch) failed on
- # 'i686-debian-sarge1 shared gcc-3.3.5'
- ss_list = build.getSourceStamps()
- all_got_revisions = build.getAllGotRevisions()
- src_cxts = []
- for ss in ss_list:
- sc = {}
- sc['codebase'] = ss.codebase
- if (ss.branch is None and ss.revision is None and ss.patch is None
- and not ss.changes):
- sc['repository'] = None
- sc['branch'] = None
- sc['revision'] = "Latest revision"
- else:
- sc['repository'] = ss.repository
- sc['branch'] = ss.branch
- got_revision = all_got_revisions.get(ss.codebase, None)
- if got_revision:
- sc['revision'] = got_revision
- else:
- sc['revision'] = str(ss.revision)
- if ss.patch:
- sc['revision'] += " (plus patch)"
- if ss.changes:
- pass
- src_cxts.append(sc)
- res = build.getResults()
- pageTitle = ('Builder "%s": %s' %
- (build.getBuilder().getName(), results.Results[res]))
-
- # Add information about the failing steps.
- failed_steps = []
- log_lines = []
- for s in build.getSteps():
- res = s.getResults()[0]
- if res not in (results.SUCCESS, results.WARNINGS,
- results.SKIPPED):
- failed_steps.append(s.getName())
-
- # Add the last 30 lines of each log.
- for log in s.getLogs():
- log_lines.append('Last lines of build log "%s":' %
- log.getName())
- log_lines.append([])
- try:
- logdata = log.getText()
- except IOError:
- # Probably the log file has been removed
- logdata ='** log file not available **'
- unilist = list()
- for line in logdata.split('\n')[-30:]:
- unilist.append(unicode(line,'utf-8'))
- log_lines.extend(unilist)
-
- bc = {}
- bc['sources'] = src_cxts
- bc['date'] = rfc822_time(finishedTime)
- bc['summary_link'] = ('%sbuilders/%s' %
- (self.link,
- build.getBuilder().getName()))
- bc['name'] = build.getBuilder().getName()
- bc['number'] = build.getNumber()
- bc['responsible_users'] = build.getResponsibleUsers()
- bc['failed_steps'] = failed_steps
- bc['pageTitle'] = pageTitle
- bc['link'] = link
- bc['log_lines'] = log_lines
-
- if finishedTime is not None:
- bc['rfc822_pubdate'] = rfc822_time(finishedTime)
- bc['rfc3339_pubdate'] = time.strftime("%Y-%m-%dT%H:%M:%SZ",
- finishedTime)
-
- # Every RSS/Atom item must have a globally unique ID
- guid = ('tag:%s@%s,%s:%s' %
- (self.user, self.hostname,
- time.strftime("%Y-%m-%d", finishedTime),
- time.strftime("%Y%m%d%H%M%S", finishedTime)))
- bc['guid'] = guid
-
- build_cxts.append(bc)
-
- pageTitle = self.pageTitle
- if not pageTitle:
- pageTitle = 'Build status of %s' % self.title
-
- cxt = {}
- cxt['pageTitle'] = pageTitle
- cxt['title_url'] = self.link
- cxt['title'] = self.title
- cxt['language'] = self.language
- cxt['description'] = self.description
- if self.pubdate is not None:
- cxt['rfc822_pubdate'] = rfc822_time( self.pubdate)
- cxt['rfc3339_pubdate'] = time.strftime("%Y-%m-%dT%H:%M:%SZ",
- self.pubdate)
-
- cxt['builds'] = build_cxts
- template = request.site.buildbot_service.templates.get_template(self.template_file)
- return template.render(**cxt).encode('utf-8').strip()
-
-class Rss20StatusResource(FeedResource):
- # contentType = 'application/rss+xml' (browser dependent)
- template_file = 'feed_rss20.xml'
-
- def __init__(self, status, categories=None, pageTitle=None):
- FeedResource.__init__(self, status, categories, pageTitle)
-
-class Atom10StatusResource(FeedResource):
- # contentType = 'application/atom+xml' (browser dependent)
- template_file = 'feed_atom10.xml'
-
- def __init__(self, status, categories=None, pageTitle=None):
- FeedResource.__init__(self, status, categories, pageTitle)