jhbuild r2214 - in trunk: . buildbot buildbot/jhbuildbot buildbot/jhbuildbot/status buildbot/jhbuildbot/status/web buildbot/jhbuildbot/test buildbot/jhbuildbot/test/mail buildbot/public_html
- From: fpeters svn gnome org
- To: svn-commits-list gnome org
- Subject: jhbuild r2214 - in trunk: . buildbot buildbot/jhbuildbot buildbot/jhbuildbot/status buildbot/jhbuildbot/status/web buildbot/jhbuildbot/test buildbot/jhbuildbot/test/mail buildbot/public_html
- Date: Wed, 13 Aug 2008 14:18:33 +0000 (UTC)
Author: fpeters
Date: Wed Aug 13 14:18:33 2008
New Revision: 2214
URL: http://svn.gnome.org/viewvc/jhbuild?rev=2214&view=rev
Log:
* buildbot/: buildbot master server.
Added:
trunk/buildbot/
trunk/buildbot/.svnignore
trunk/buildbot/AUTHORS
trunk/buildbot/ChangeLog
trunk/buildbot/Makefile
trunk/buildbot/README
trunk/buildbot/buildbot.tac
trunk/buildbot/jhbuildbot/
trunk/buildbot/jhbuildbot/__init__.py
trunk/buildbot/jhbuildbot/changes.py
trunk/buildbot/jhbuildbot/factory.py
trunk/buildbot/jhbuildbot/scheduler.py
trunk/buildbot/jhbuildbot/status/
trunk/buildbot/jhbuildbot/status/__init__.py
trunk/buildbot/jhbuildbot/status/web/
trunk/buildbot/jhbuildbot/status/web/__init__.py
trunk/buildbot/jhbuildbot/status/web/feeder.py
trunk/buildbot/jhbuildbot/steps.py
trunk/buildbot/jhbuildbot/test/
trunk/buildbot/jhbuildbot/test/__init__.py
trunk/buildbot/jhbuildbot/test/mail/
trunk/buildbot/jhbuildbot/test/mail/svn-commits-list.1
trunk/buildbot/jhbuildbot/test/mail/svn-commits-list.2
trunk/buildbot/jhbuildbot/test/mail/svn-commits-list.3
trunk/buildbot/jhbuildbot/test/mail/svn-commits-list.3.comments
trunk/buildbot/jhbuildbot/test/mail/svn-commits-list.4
trunk/buildbot/jhbuildbot/test/mail/svn-commits-list.5
trunk/buildbot/jhbuildbot/test/mail/svn-commits-list.6
trunk/buildbot/jhbuildbot/test/test_mail.py
trunk/buildbot/master.cfg
trunk/buildbot/public_html/
trunk/buildbot/public_html/bar.png (contents, props changed)
trunk/buildbot/public_html/buildbot.css
trunk/buildbot/public_html/cyan-bar.png (contents, props changed)
trunk/buildbot/public_html/download.png (contents, props changed)
trunk/buildbot/public_html/emptyimg.png (contents, props changed)
trunk/buildbot/public_html/error.png (contents, props changed)
trunk/buildbot/public_html/feed-atom.png (contents, props changed)
trunk/buildbot/public_html/feed.png (contents, props changed)
trunk/buildbot/public_html/figure.png (contents, props changed)
trunk/buildbot/public_html/foot-16.png (contents, props changed)
trunk/buildbot/public_html/foot.png (contents, props changed)
trunk/buildbot/public_html/general_bg.png (contents, props changed)
trunk/buildbot/public_html/general_separator.png (contents, props changed)
trunk/buildbot/public_html/gnome-16.png (contents, props changed)
trunk/buildbot/public_html/gnome-64.png (contents, props changed)
trunk/buildbot/public_html/gnome-gtp.png (contents, props changed)
trunk/buildbot/public_html/green-bar.png (contents, props changed)
trunk/buildbot/public_html/images.jpeg (contents, props changed)
trunk/buildbot/public_html/index.html
trunk/buildbot/public_html/info.png (contents, props changed)
trunk/buildbot/public_html/lgo.css
trunk/buildbot/public_html/logo.png (contents, props changed)
trunk/buildbot/public_html/nobody.png (contents, props changed)
trunk/buildbot/public_html/purple-bar.png (contents, props changed)
trunk/buildbot/public_html/red-bar.png (contents, props changed)
trunk/buildbot/public_html/robots.txt
trunk/buildbot/public_html/star.png (contents, props changed)
trunk/buildbot/public_html/t.png (contents, props changed)
trunk/buildbot/public_html/tab_left.png (contents, props changed)
trunk/buildbot/public_html/tab_right.png (contents, props changed)
trunk/buildbot/public_html/warn.png (contents, props changed)
trunk/buildbot/public_html/webpage.png (contents, props changed)
trunk/buildbot/template.html
Modified:
trunk/ChangeLog
Added: trunk/buildbot/.svnignore
==============================================================================
--- (empty file)
+++ trunk/buildbot/.svnignore Wed Aug 13 14:18:33 2008
@@ -0,0 +1,4 @@
+builddir
+changes.pck
+twistd.log*
+twistd.pid
Added: trunk/buildbot/AUTHORS
==============================================================================
--- (empty file)
+++ trunk/buildbot/AUTHORS Wed Aug 13 14:18:33 2008
@@ -0,0 +1,3 @@
+John Carr <john carr unrouted co uk>
+Frederic Peters <fpeters 0d be>
+API <apinheiro igalia com>
Added: trunk/buildbot/Makefile
==============================================================================
--- (empty file)
+++ trunk/buildbot/Makefile Wed Aug 13 14:18:33 2008
@@ -0,0 +1,19 @@
+# -*- makefile -*-
+
+# This is a simple makefile which lives in a buildmaster/buildslave
+# directory (next to the buildbot.tac file). It allows you to start/stop the
+# master or slave by doing 'make start' or 'make stop'.
+
+# The 'reconfig' target will tell a buildmaster to reload its config file.
+
+start:
+ twistd --no_save -y buildbot.tac --nodaemon
+
+stop:
+ kill `cat twistd.pid`
+
+reconfig:
+ kill -HUP `cat twistd.pid`
+
+log:
+ tail -f twistd.log
Added: trunk/buildbot/README
==============================================================================
--- (empty file)
+++ trunk/buildbot/README Wed Aug 13 14:18:33 2008
@@ -0,0 +1,3 @@
+You must at minimum edit those two lines in master.cfg:
+ c['jhbuild'] = "~/bin/jhbuild"
+ c['jhbuildrc'] = "/home/fred/.jhbuildrc"
Added: trunk/buildbot/buildbot.tac
==============================================================================
--- (empty file)
+++ trunk/buildbot/buildbot.tac Wed Aug 13 14:18:33 2008
@@ -0,0 +1,11 @@
+from twisted.application import service
+from buildbot.master import BuildMaster
+import os
+
+basedir = os.path.dirname(os.path.abspath(__file__))
+os.makedirs(os.path.join(basedir, 'builddir'))
+configfile = r'master.cfg'
+
+application = service.Application('buildmaster')
+BuildMaster(basedir, configfile).setServiceParent(application)
+
Added: trunk/buildbot/jhbuildbot/__init__.py
==============================================================================
--- (empty file)
+++ trunk/buildbot/jhbuildbot/__init__.py Wed Aug 13 14:18:33 2008
@@ -0,0 +1,9 @@
+
+import commands
+
+def jhbuild_list(c, moduleset, modules):
+ command = c['jhbuild'] + " --file="+ c['jhbuildrc'] +" --moduleset=" + moduleset + " " + "list" + " " + modules
+ (status, output) = commands.getstatusoutput(command)
+ if (status == 0):
+ return [x for x in output.split('\n') if x[:5] != "meta-"]
+ return []
Added: trunk/buildbot/jhbuildbot/changes.py
==============================================================================
--- (empty file)
+++ trunk/buildbot/jhbuildbot/changes.py Wed Aug 13 14:18:33 2008
@@ -0,0 +1,53 @@
+from buildbot import util
+from buildbot.changes.mail import MaildirSource
+from buildbot.changes import changes
+
+from email.Utils import parseaddr
+from email.Iterators import body_line_iterator
+
+class GnomeMaildirSource(MaildirSource):
+
+ name = "Gnome svn-commits-list"
+
+ def parse(self, m, prefix=None):
+ # From is svnuser svn gnome org
+ name, domain = m["from"].split("@")
+
+ # If this e-mail is valid, it will come from an svn.gnome.org email
+ if domain != "svn.gnome.org":
+ return None
+
+ # we take the time of receipt as the time of checkin. Not correct, but it
+ # avoids the out-of-order-changes issue. See the comment in parseSyncmail
+ # about using the 'Date:' header
+ when = util.now()
+
+ revision = None
+ files = []
+ comments = ""
+ isdir = 0
+ lines = list(body_line_iterator(m))
+ changeType = ''
+ links = []
+ while lines:
+ line = lines.pop(0)
+
+ if line[:14] == "New Revision: ":
+ revision = line[14:-1]
+
+ if line[:5] == "URL: ":
+ links.append(line[5:-1])
+
+ if line[:-1] == "Log:":
+ while not (lines[0].startswith("Added:") or lines[0].startswith("Modified:") or lines[0].startswith("Removed:")):
+ comments += lines.pop(0)
+ comments = comments.rstrip()
+
+ if line[:-1] in ("Added:", "Modified:", "Removed:"):
+ while not (lines[0] == "\n"):
+ l = lines.pop(0)
+ if l[:-1] not in ("Added:", "Modified:", "Removed:"):
+ files.append(l[3:-1])
+
+ return changes.Change(name, files, comments, isdir, revision=revision, links=links, when=when)
+
Added: trunk/buildbot/jhbuildbot/factory.py
==============================================================================
--- (empty file)
+++ trunk/buildbot/jhbuildbot/factory.py Wed Aug 13 14:18:33 2008
@@ -0,0 +1,27 @@
+from buildbot.process import factory
+from jhbuildbot.steps import JHBuildSource, JHBuildCommand, JHBuildModulePathTestCommand, JHBuildModulePathCommand
+
+# This is the JHBuild factory. It creates a standard procedure to compile modules, run
+# checks and create reports.
+
+class JHBuildFactory(factory.BuildFactory):
+ module = None
+ moduleset = None
+ targets = []
+ steps = []
+
+ def __init__(self, module, moduleset=None):
+ factory.BuildFactory.__init__(self)
+ self.moduleset = moduleset
+ self.module = module
+ self.getSteps()
+
+ def getSteps(self):
+ self.addStep(JHBuildSource, moduleset=self.moduleset, module=self.module)
+ self.addStep(JHBuildCommand, stage='build', moduleset=self.moduleset, module=self.module)
+ self.addStep(JHBuildCommand, stage='check', moduleset=self.moduleset, module=self.module)
+ #self.addStep(JHBuildModulePathTestCommand, moduleset=self.moduleset, module=self.module, action=['make-check.sh'], haltOnFailure = False)
+ #self.addStep(JHBuildModulePathCommand, moduleset=self.moduleset, module=self.module, action=['module-reports.sh'], haltOnFailure = False)
+
+ def newBuild(self, request):
+ return factory.BuildFactory.newBuild(self, request)
Added: trunk/buildbot/jhbuildbot/scheduler.py
==============================================================================
--- (empty file)
+++ trunk/buildbot/jhbuildbot/scheduler.py Wed Aug 13 14:18:33 2008
@@ -0,0 +1,78 @@
+from twisted.application import service, internet
+
+from buildbot.scheduler import Periodic, BaseUpstreamScheduler
+from buildbot.sourcestamp import SourceStamp
+from buildbot import buildset
+
+def SerialScheduler(name, builderNames, periodicBuildTimer=60*60*12, upstream=None, branch=None):
+ if not upstream:
+ return StartSerial(name, builderNames, periodicBuildTimer, branch)
+ return Serial(name, upstream, builderNames, branch)
+
+class StartSerial(Periodic):
+
+ def __init__(self, name, builderNames, periodicBuildTimer,
+ branch=None):
+ Periodic.__init__(self,name,builderNames,periodicBuildTimer,branch)
+ self.finishedWatchers = []
+
+ def subscribeToFinishedBuilds(self, watcher):
+ self.finishedWatchers.append(watcher)
+
+ def unsubscribeToFinishedBuilds(self, watcher):
+ self.finishedWatchers.remove(watcher)
+
+ def buildSetFinished(self, bss):
+ if not self.running:
+ return
+ ss = bss.getSourceStamp()
+ for w in self.finishedWatchers:
+ w(ss)
+ Periodic.buildSetFinished(self,bss)
+
+class Serial(BaseUpstreamScheduler):
+ """This scheduler runs some set of builds that should be run
+ after the 'upstream' scheduler has completed (successfully or not)."""
+ compare_attrs = ('name', 'upstream', 'builders', 'branch')
+
+ def __init__(self, name, upstream, builderNames, branch):
+ BaseUpstreamScheduler.__init__(self, name)
+ self.upstream = upstream
+ self.branch = branch
+ self.builderNames = builderNames
+ self.finishedWatchers = []
+
+ def subscribeToFinishedBuilds(self, watcher):
+ self.finishedWatchers.append(watcher)
+
+ def unsubscribeToFinishedBuilds(self, watcher):
+ self.finishedWatchers.remove(watcher)
+
+ def buildSetFinished(self, bss):
+ if not self.running:
+ return
+ ss = bss.getSourceStamp()
+ for w in self.finishedWatchers:
+ w(ss)
+ BaseUpstreamScheduler.buildSetFinished(self,bss)
+
+ def listBuilderNames(self):
+ return self.builderNames
+
+ def getPendingBuildTimes(self):
+ # report the upstream's value
+ return self.upstream.getPendingBuildTimes()
+
+ def startService(self):
+ service.MultiService.startService(self)
+ self.upstream.subscribeToFinishedBuilds(self.upstreamBuilt)
+
+ def stopService(self):
+ d = service.MultiService.stopService(self)
+ self.upstream.unsubscribeToFinishedBuilds(self.upstreamBuilt)
+ return d
+
+ def upstreamBuilt(self, ss):
+ bs = buildset.BuildSet(self.builderNames, SourceStamp(branch=self.branch))
+ self.submitBuildSet(bs)
+
Added: trunk/buildbot/jhbuildbot/status/__init__.py
==============================================================================
Added: trunk/buildbot/jhbuildbot/status/web/__init__.py
==============================================================================
--- (empty file)
+++ trunk/buildbot/jhbuildbot/status/web/__init__.py Wed Aug 13 14:18:33 2008
@@ -0,0 +1,96 @@
+import os
+from twisted.web import server, static, resource
+from buildbot.status.web.base import HtmlResource, ITopBox, build_get_class
+
+def content(self, request):
+ """
+ We want to give /all/ HTMLResource objects this replacement content method
+ Monkey patch :)
+ """
+ s = request.site.buildbot_service
+ data = s.template
+ data = data.replace('@@GNOME_BUILDBOT_TITLE@@', self.getTitle(request))
+ data = data.replace('@@GNOME_BUILDBOT_BODY@@', self.body(request))
+ return data
+HtmlResource.content = content
+
+from buildbot.status.web.baseweb import WebStatus
+from jhbuildbot.status.web.feeder import WaterfallWithFeeds
+
+class ProjectsSummary(HtmlResource):
+
+ MAX_PROJECT_NAME = 25
+
+ def getTitle(self, request):
+ return "BuildBot"
+
+ def body(self, request):
+ parent = request.site.buildbot_service
+ status = self.getStatus(request)
+
+ result = ''
+ result += '<table class="ProjectSummary" border="0">\n'
+
+ # Headers
+ result += '<thead><tr><td class="empty"> </td><td class="empty"> </td><th>'+parent.moduleset+'</td>'
+ for name in parent.slaves:
+ if len(name) > 25:
+ name = name[:25] + "(...)"
+ result += '<td colspan="2" class="LeftBorder TopBorder header" align="center"><b>' + name + '</b></td>\n'
+ result += '</tr>\n'
+ result += '<tr><th></th><th></th><th><b>Project</b></td>\n'
+ for i in range(len(parent.slaves)):
+ result += '<td class="BottomBorder LeftBorder header" align="center">Last-Build</td>\n'
+ result += '<td class="BottomBorder header" align="center">State</td>\n'
+ result += '</tr></thead>\n'
+
+ # Contents
+ result += '<tbody>'
+ for module in parent.modules:
+ result += '<tr>'
+ result += '<td class="Atom" align="center"><a href="'+module+'/atom">'
+ result += '<image src="/feed-atom.png" border="0" alt="Atom"></a></td>'
+ result += '<td class="RSS" align="center"><a href="'+module+'/rss">'
+ result += '<image src="/feed.png" border="0" alt="RSS"></a></td>\n'
+ result += '<th class="BottomBorder LeftBorder ProjectSummaryBuilder"><a href="'+module+'">'+module+'</a></td>'
+
+ for slave in parent.slaves:
+ builder = status.getBuilder("%s-%s" % (module, slave))
+ box = ITopBox(builder).getBox(request)
+ lastbuild = ''
+ for bt in box.text:
+ if bt == "successful" or bt == "failed":
+ lastbuild = bt
+ if lastbuild == "successful" or lastbuild == "failed":
+ class_ = build_get_class(builder.getLastFinishedBuild())
+ else:
+ class_ = ''
+ result += '<td align="center" class="BottomBorder LeftBorder '+class_+'">'+lastbuild+'</td>'
+ state, builds = builder.getState()
+ result += '<td align="center" class="BottomBorder '+state+'">'+state+'</td>'
+ result += '</tr>\n'
+ result += '</tbody>'
+ result += '</table>'
+
+ return result
+
+class JHBuildWebStatus(WebStatus):
+
+ def __init__(self, moduleset, modules, slaves, *args, **kwargs):
+ WebStatus.__init__(self, *args, **kwargs)
+ self.moduleset = moduleset
+ self.modules = modules
+ self.slaves = slaves
+
+ # set up the per-module waterfalls
+ for module in self.modules:
+ self.putChild(module, feeder.WaterfallWithFeeds(categories=[module]))
+
+ # set the summary homepage
+ self.putChild("", ProjectsSummary())
+
+ def setupSite(self):
+ WebStatus.setupSite(self)
+
+ # load the template into memory
+ self.template = open(os.path.join(self.parent.basedir, "template.html")).read()
Added: trunk/buildbot/jhbuildbot/status/web/feeder.py
==============================================================================
--- (empty file)
+++ trunk/buildbot/jhbuildbot/status/web/feeder.py Wed Aug 13 14:18:33 2008
@@ -0,0 +1,257 @@
+# This file is part of the Buildbot configuration for the Subversion project.
+# The original file was created by Lieven Gobaerts
+# Minor changes made by API (apinheiro igalia com) in order to fit with our
+# configuration and last buildbot changes
+
+import urllib, time, re
+
+from twisted.web.resource import Resource
+from twisted.application import strports
+from twisted.web import server, distrib
+from twisted.web import html as twhtml
+
+from buildbot import interfaces
+from buildbot.status.builder import FAILURE, SUCCESS, WARNINGS
+from buildbot.status.web.waterfall import WaterfallStatusResource
+
+class XmlResource(Resource):
+ contentType = "text/xml; charset=UTF-8"
+ 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
+ docType = ''
+ def header (self, request):
+ data = ('<?xml version="1.0"?>\n')
+ return data
+ def footer(self, request):
+ data = ''
+ return data
+ def content(self, request):
+ data = self.docType
+ data += self.header(request)
+ data += self.body(request)
+ data += self.footer(request)
+ return data
+ def body(self, request):
+ return ''
+ def getStatus(self, request):
+ return request.site.buildbot_service.getStatus()
+ def getControl(self, request):
+ return request.site.buildbot_service.getControl()
+ def getChangemaster(self, request):
+ return request.site.buildbot_service.parent.change_svc
+
+class FeedResource(XmlResource):
+ title = 'Dummy'
+ link = 'http://dummylink'
+ language = 'en'
+ description = 'Dummy rss'
+ status = None
+
+ def __init__(self, categories):
+ self.categories = categories
+
+ def getBuilds(self):
+ builds = []
+ builderNames = self.status.getBuilderNames(categories=self.categories)
+ builders = map(lambda name: self.status.getBuilder(name), builderNames)
+ maxFeeds = 5
+
+ # 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:
+ lastbuild = b.getLastFinishedBuild()
+ if lastbuild is None:
+ continue
+
+# if b.category != "prod":
+# continue
+ lastnr = lastbuild.getNumber()
+
+ totalbuilds = 0
+ i = lastnr
+ while i >= 0:
+ build = b.getBuild(i)
+ i -= 1
+ if not build:
+ continue
+
+ results = build.getResults()
+
+ # only add entries for failed builds!
+ if results == FAILURE:
+ totalbuilds += 1
+ builds.append(build)
+
+ # stop for this builder when our total nr. of feeds is reached
+ if totalbuilds >= maxFeeds:
+ break
+
+ # Sort build list by date, youngest first.
+# builds.sort(key=lambda build: build.getTimes(), reverse=True)
+
+ # If you need 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 body (self, request):
+ data = ''
+ self.status = self.getStatus(request)
+ self.link = str(self.status.getBuildbotURL())
+ self.title = 'Build status of %s' % self.status.getProjectName()
+ self.description = 'List of FAILed builds'
+
+ builds = self.getBuilds()
+
+ for build in builds:
+ start, finished = build.getTimes()
+ strFinished = time.strftime("%a, %d %b %Y %H:%M:%S %z", time.localtime(int(finished)))
+ projectName = str(self.status.getProjectName())
+ link = str(self.status.getURLForThing(build))
+
+ # title: trunk r22191 (plus patch) failed on 'i686-debian-sarge1 shared gcc-3.3.5'
+ ss = build.getSourceStamp()
+ if ss is None:
+ source = "[src unknown]"
+ else:
+ branch, revision, patch = ss.branch, ss.revision, ss.patch
+ if build.getChanges():
+ revision = max([int(c.revision) for c in build.getChanges()])
+ source = ""
+ if branch:
+ source += "Branch %s " % branch
+ if revision:
+ source += "r%s " % str(revision)
+ else:
+ source += "HEAD"
+ if patch is not None:
+ source += " (plus patch)"
+ title = source + " failed on '" + build.getBuilder().getName() + "'"
+
+ # get name of the failed step and the last 30 lines of its log.
+ if build.getLogs():
+ log = build.getLogs()[-1]
+ laststep = log.getStep().getName()
+ try:
+ lastlog = log.getText()
+ except IOError:
+ # Probably the log file has been removed
+ lastlog='<b>log file not available</b>'
+
+ lines = re.split('\n', lastlog)
+ lastlog = ''
+ for logline in lines[max(0, len(lines)-30):]:
+ lastlog = lastlog + logline + '<br/>'
+
+ description = '<![CDATA['
+ description += 'Date: ' + strFinished + '<br/><br/>'
+ description += 'Full details are available at: <br/>'
+ description += 'Build summary: <a href="' + self.link + projectName + '">' + self.link + projectName + '</a><br/><br/>'
+ description += 'Build details: <a href="' + link + '">' + self.link + link[1:] + '</a><br/><br/>'
+ description += 'Author list: <b>' + ",".join(build.getResponsibleUsers()) + '</b><br/><br/>'
+ description += 'Failed step: <b>' + laststep + '</b><br/><br/>'
+ description += 'Last lines of the build log:<br/>'
+ description += lastlog.replace('\n', '<br/>')
+ description += ']]>'
+
+ data += self.item(title,
+ description = description,
+ link=link,pubDate=strFinished)
+
+ return data
+
+ def item(self, title='', link='', description='', pubDate=''):
+ """Generates xml for one item in the feed"""
+
+class Rss20StatusResource(FeedResource):
+ def __init__(self, categories):
+ FeedResource.__init__(self, categories)
+ contentType = 'application/rss+xml'
+
+ def header(self, request):
+ data = FeedResource.header(self, request)
+ data += '<rss version="2.0">\n'
+ data += '<channel>'
+ if self.title is not None:
+ data += '<title>'+self.title+'</title>'
+ if self.link is not None:
+ data += '<link>'+self.link+'</link>'
+ if self.language is not None:
+ data += '<language>'+self.language+'</language>'
+ if self.description is not None:
+ data += '<description>'+self.description+'</description>'
+ return data
+
+ def item(self, title='', link='', description='', pubDate=''):
+ data = '<item>'
+ data += '<title>'+title+'</title>'
+ if link is not None:
+ data += '<link>'+link+'</link>'
+ if description is not None:
+ data += '<description>'+ description + '</description>'
+ if pubDate is not None:
+ data += '<pubDate>'+pubDate+'</pubDate>'
+ data += '</item>'
+ return data
+
+ def footer(self, request):
+ data = ('</channel>'
+ '</rss>')
+ return data
+
+class Atom10StatusResource(FeedResource):
+ def __init__(self, categories):
+ FeedResource.__init__(self, categories)
+ contentType = 'application/atom+xml'
+
+ def header(self, request):
+ data = FeedResource.header(self, request)
+ data += '<feed xmlns="http://www.w3.org/2005/Atom">\n'
+ if self.title is not None:
+ data += '<title>'+self.title+'</title>'
+ if self.link is not None:
+ data += '<link href="'+self.link+'"/>'
+ # if self.language is not None:
+ # data += '<language>'+self.language+'</language>'
+ if self.description is not None:
+ data += '<subtitle>'+self.description+'</subtitle>'
+ return data
+
+ def item(self, title='', link='', description='', pubDate=''):
+ data = '<entry>'
+ data += '<title>'+title+'</title>'
+ if link is not None:
+ data += '<link href="'+link+'"/>'
+ if description is not None:
+ data += '<summary type="xhtml">'+ description + '</summary>'
+ if pubDate is not None:
+ data += '<updated>'+pubDate+'</updated>'
+ data += '</entry>'
+ return data
+
+ def footer(self, request):
+ data = ('</feed>')
+ return data
+
+class WaterfallWithFeeds(WaterfallStatusResource):
+ """ Override the standard Waterfall class to add RSS and Atom feeds """
+
+ def __init__(self, *args, **kwargs):
+ WaterfallStatusResource.__init__(self, *args, **kwargs)
+
+ rss = Rss20StatusResource(self.categories)
+ self.putChild("rss", rss)
+ atom = Atom10StatusResource(self.categories)
+ self.putChild("atom", atom)
Added: trunk/buildbot/jhbuildbot/steps.py
==============================================================================
--- (empty file)
+++ trunk/buildbot/jhbuildbot/steps.py Wed Aug 13 14:18:33 2008
@@ -0,0 +1,245 @@
+import os, commands, re, StringIO
+
+from buildbot.process import factory
+from buildbot.process import buildstep
+from buildbot import steps
+from buildbot.status.builder import SUCCESS, WARNINGS, FAILURE, SKIPPED, EXCEPTION
+
+class JHBuildSource(steps.source.Source):
+ name = "jhbuild"
+
+ def __init__ (self, moduleset=None, module=None, stage=None, clobber=0, export=0, copydir=None, **kwargs):
+ if not kwargs.has_key('mode') and (clobber or export or copydir):
+ # deal with old configs
+ warnings.warn("Please use mode=, not clobber/export/copydir",
+ DeprecationWarning)
+ if export:
+ kwargs['mode'] = "export"
+ elif clobber:
+ kwargs['mode'] = "clobber"
+ elif copydir:
+ kwargs['mode'] = "copy"
+ else:
+ kwargs['mode'] = "update"
+ steps.source.Source.__init__(self, **kwargs)
+ self.args.update({'moduleset': moduleset,
+ 'module': module,
+ 'command': 'updateone',
+ 'stage': None,
+ 'timeout': 900,
+ })
+ self.name = module + ' update'
+ self.description = [module + ' updating']
+ self.descriptionDone = [module + ' updated']
+
+ def computeSourceRevision(self, changes):
+ if not changes:
+ return None
+ return max([int(c.revision) for c in changes])
+
+ def startVC(self, branch, revision, patch):
+ warnings = []
+ cmd = buildstep.LoggedRemoteCommand("jhbuild", self.args)
+ self.startCommand(cmd, warnings)
+
+class UnitTestsObserver(buildstep.LogLineObserver):
+
+ def __init__(self):
+ self.regroupfailed = []
+ self.regrouppassed = []
+ self.reunittest = []
+ self.unittests = []
+ buildstep.LogLineObserver.__init__(self)
+ if len(self.regroupfailed) == 0:
+ self.regroupfailed.append((re.compile('^(FAIL:) (.*)$'), 1))
+ if len(self.regrouppassed) == 0:
+ self.regrouppassed.append((re.compile('^(PASS:) (.*)$'), 1))
+ if len(self.reunittest) == 0:
+ self.reunittest.append((re.compile('^([^:]*):([^:]*):([^:]*):([^:]*):([^:]*):([^:]*).*$'), 4, 5))
+
+ def outLineReceived(self, line):
+ matched = False
+ for r in self.regroupfailed:
+ result = r[0].search(line)
+ if result:
+ self.step.failedTestsCount += 1
+ self.step.testsResults.append((result.groups()[r[1]].strip(), False, self.unittests))
+ self.unittests = []
+ matched = True
+ if not matched:
+ for r in self.regrouppassed:
+ result = r[0].search(line)
+ if result:
+ self.step.passedTestsCount += 1
+ self.step.testsResults.append((result.groups()[r[1]].strip(), True, self.unittests))
+ self.unittests = []
+ matched = True
+ if not matched:
+ for r in self.reunittest:
+ result = r[0].search(line)
+ if result:
+ err_msg = result.groups()[r[2]].strip()
+ if err_msg == "Passed":
+ self.unittests.append((result.groups()[r[1]].strip(), True, err_msg))
+ else:
+ self.unittests.append((result.groups()[r[1]].strip(), False, err_msg))
+ matched = True
+
+class JHBuildCommand(steps.shell.ShellCommand):
+ name = "jhbuild_stage"
+ haltOnFailure = 1
+ description = ["jhbuild command"]
+ descriptionDone = ["jhbuild"]
+ command = None
+ OFFprogressMetrics = ('output',)
+
+ # things to track: number of files compiled, number of directories
+ # traversed (assuming 'make' is being used)
+ def __init__(self, stage=None,module=None, moduleset=None, **kwargs):
+ assert module is not None
+ kwargs['workdir'] = "./"
+ #workdir = "./"
+ command = ['jhbuild']
+ if (moduleset is not None):
+ command += ['--moduleset='+moduleset]
+ command += ['bot', '--step', stage, module]
+ self.name =module + ' ' + stage
+ self.description = [module + ' ' + stage + ' (running)']
+ self.descriptionDone = [module + ' ' + stage]
+ steps.shell.ShellCommand.__init__(self, description=self.description,
+ descriptionDone=self.descriptionDone, command=command, **kwargs)
+
+ def getText(self, cmd, results):
+ text = self.describe(True)[:]
+ return text
+
+class JHBuildModulePathCommand(steps.shell.ShellCommand):
+ name = "jhbuild_stage"
+ haltOnFailure = 1
+ description = ["jhbuild command"]
+ descriptionDone = ["jhbuild"]
+ command = None
+ OFFprogressMetrics = ('output',)
+
+ # things to track: number of files compiled, number of directories
+ # traversed (assuming 'make' is being used)
+ def __init__(self, module=None, moduleset=None, action=[], **kwargs):
+ assert module is not None
+ kwargs['workdir'] = "./"
+ #workdir = "./"
+ command = ["jhbuild"]
+ if (moduleset is not None):
+ command += ['--moduleset='+moduleset]
+ command += ['bot', '--step', 'run', '--in-builddir', module,
+ '--', action]
+ self.name=module+" "+" ".join(action)
+ self.description = [" ".join(action) + '(run)']
+ self.descriptionDone = [" ".join(action)]
+ steps.shell.ShellCommand.__init__(self, description=self.description,
+ descriptionDone=self.descriptionDone, command=command, **kwargs)
+
+ def createSummary(self, log):
+ output = StringIO.StringIO(log.getText())
+ warnings = []
+ for line in output.readlines():
+ if "warning:" in line:
+ warnings.append(line)
+ if "buildbot-url:" in line:
+ arr = line.split()
+ if len(arr) == 3:
+ self.addURL(arr[1], arr[2])
+ if (len(warnings) > 0):
+ self.addCompleteLog('warnings', "".join(warnings))
+
+ def getText(self, cmd, results):
+ text = self.describe(True)[:]
+ return text
+
+class JHBuildModulePathTestCommand(JHBuildModulePathCommand):
+
+ def __init__(self, module=None, moduleset=None, action=[], **kwargs):
+ JHBuildModulePathCommand.__init__(self, module, moduleset, action, **kwargs)
+ self.failedTestsCount = 0
+ self.passedTestsCount = 0
+ self.testsResults = []
+ testFailuresObserver = UnitTestsObserver ()
+ self.addLogObserver('stdio', testFailuresObserver)
+
+ def createSummary(self, log):
+ if self.failedTestsCount > 0 or self.passedTestsCount > 0:
+ self.addHTMLLog ('tests summary', self.createTestsSummary())
+
+ def getText(self, cmd, results):
+ text = JHBuildModulePathCommand.getText(self, cmd, results)
+ if self.failedTestsCount > 0 or self.passedTestsCount > 0:
+ text.append("tests failed: " + str(self.failedTestsCount))
+ text.append("tests passed: " + str(self.passedTestsCount))
+ return text
+
+ def evaluateCommand(self, cmd):
+ if self.failedTestsCount > 0:
+ return WARNINGS
+ else:
+ return SUCCESS
+
+ def createTestsSummary (self):
+ html = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"'
+ html += '"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n'
+ html += '<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">\n'
+ html += '<head>\n'
+ html += ' <title>BuildBot: tests summary</title>\n'
+ html += '<link href="/buildbot.css" rel="stylesheet" type="text/css"/>\n'
+ html += '</head>\n'
+ html += '<body vlink="#800080">\n'
+
+ # Show summary
+ html += '<table width="720" class="TestsSummary" cellspacing="0" cellpadding="4" align="center">\n'
+ col = 0
+ maxcolumns = 5
+
+ for t in self.testsResults:
+ if col == 0:
+ html += '<tr>\n'
+ if t[1]:
+ ttdclass = "success"
+ else:
+ ttdclass = "failure"
+ html += '<td width="20%" class="TestsSummary '+ ttdclass + '"><a href="#' + t[0] + '">' + t[0] + '</a></td>\n'
+ col += 1
+ if col >= maxcolumns:
+ col = 0
+ html += '</tr>\n'
+ html += '</table>\n'
+
+ html += '<br><hr>\n'
+
+ # Show details
+ for t in self.testsResults:
+ html += '<br><br>\n'
+ html += '<table align="center" width="720" class="TestsDetail" cellspacing="0" cellpadding="4">\n'
+ if t[1]:
+ ttdclass = "success"
+ else:
+ ttdclass = "failure"
+ html += '<tr><td colspan="2" class="TestsDetailHeader ' + ttdclass + '"><a name="' + t[0]+ '"></a>' + t[0] + '</td></tr>\n'
+
+ if len(t[2]) > 0:
+ for ut in t[2]:
+ if ut[1]:
+ uttdclass = "success"
+ else:
+ uttdclass = "failure"
+ html += '<tr><td width="15" class="TestsDetail ' + uttdclass+ '"> </td>\n'
+ html += '<td class="TestsDetail">' + ut[0]
+ if ut[1] == False:
+ html += '<br><span class="text' + uttdclass+ '">' + ut[2] + '</span>'
+ html += '</td></tr>'
+ else:
+ html += '<tr><td colspan="2" class="TestDetail">No unit tests found.</td></tr>\n'
+ html += '</table>\n'
+
+ html += '</body>\n'
+ html += '</html>\n'
+
+ return html
+
Added: trunk/buildbot/jhbuildbot/test/__init__.py
==============================================================================
Added: trunk/buildbot/jhbuildbot/test/mail/svn-commits-list.1
==============================================================================
--- (empty file)
+++ trunk/buildbot/jhbuildbot/test/mail/svn-commits-list.1 Wed Aug 13 14:18:33 2008
@@ -0,0 +1,1370 @@
+Return-path: <svn-commits-list-bounces gnome org>
+Envelope-to: x469yq unrouted co uk
+Delivery-date: Sun, 15 Jun 2008 13:52:12 +0100
+Received: from menubar.gnome.org ([209.132.176.177])
+ by isshin.unrouted.co.uk with esmtp (Exim 4.63)
+ (envelope-from <svn-commits-list-bounces gnome org>)
+ id 1K7riM-0003dR-RW
+ for x469yq unrouted co uk; Sun, 15 Jun 2008 13:52:11 +0100
+Received: from menubar.gnome.org (localhost.localdomain [127.0.0.1])
+ by menubar.gnome.org (Postfix) with ESMTP id E20C275019F;
+ Sun, 15 Jun 2008 12:52:09 +0000 (GMT)
+X-Original-To: svn-commits-list gnome org
+Delivered-To: svn-commits-list gnome org
+Received: from localhost (localhost.localdomain [127.0.0.1])
+ by menubar.gnome.org (Postfix) with ESMTP id E51517500CF
+ for <svn-commits-list gnome org>; Sun, 15 Jun 2008 12:52:06 +0000 (GMT)
+X-Virus-Scanned: by amavisd-new at gnome.org
+X-Spam-Flag: NO
+X-Spam-Score: -0.74
+X-Spam-Level:
+X-Spam-Status: No, score=-0.74 tagged_above=-999 required=2
+ tests=[BAYES_20=-0.74]
+X-Amavis-OS-Fingerprint: Linux 2.6 (newer, 3) (up: 172 hrs), (distance 18,
+ link: ethernet/modem), [91.189.93.3]
+Received: from menubar.gnome.org ([127.0.0.1])
+ by localhost (menubar.gnome.org [127.0.0.1]) (amavisd-new, port 10024)
+ with ESMTP id k3vIDUV6rkyw for <svn-commits-list gnome org>;
+ Sun, 15 Jun 2008 12:51:52 +0000 (GMT)
+Received: from socket.gnome.org (cobalt.canonical.com [91.189.93.3])
+ by menubar.gnome.org (Postfix) with ESMTP id BD4077501C9
+ for <svn-commits-list gnome org>; Sun, 15 Jun 2008 12:51:47 +0000 (GMT)
+Received: by socket.gnome.org (Postfix, from userid 7472)
+ id 2D9551BA001C; Sun, 15 Jun 2008 12:51:46 +0000 (UTC)
+From: lapo svn gnome org
+To: svn-commits-list gnome org
+Subject: gnome-icon-theme r1820 - in trunk: . 22x22/actions 24x24/actions
+MIME-Version: 1.0
+keywords: gnome-icon-theme
+Message-Id: <20080615125146 2D9551BA001C socket gnome org>
+Date: Sun, 15 Jun 2008 12:51:46 +0000 (UTC)
+X-Topics: gnome-icon-theme
+X-BeenThere: svn-commits-list gnome org
+X-Mailman-Version: 2.1.10
+Precedence: list
+List-Id: SVN commits <svn-commits-list.gnome.org>
+List-Unsubscribe: <http://mail.gnome.org/mailman/options/svn-commits-list>,
+ <mailto:svn-commits-list-request gnome org?subject=unsubscribe>
+List-Archive: </archives/svn-commits-list>
+List-Post: <mailto:svn-commits-list gnome org>
+List-Help: <mailto:svn-commits-list-request gnome org?subject=help>
+List-Subscribe: <http://mail.gnome.org/mailman/listinfo/svn-commits-list>,
+ <mailto:svn-commits-list-request gnome org?subject=subscribe>
+Content-Type: text/plain; charset="us-ascii"
+Content-Transfer-Encoding: 7bit
+Sender: svn-commits-list-bounces gnome org
+Errors-To: svn-commits-list-bounces gnome org
+
+Author: lapo
+Date: Sun Jun 15 12:51:45 2008
+New Revision: 1820
+URL: http://svn.gnome.org/viewvc/gnome-icon-theme?rev=1820&view=rev
+
+Log:
+redid 22x22 zoom actions in svg.
+
+Added:
+ trunk/22x22/actions/zoom-fit-best.svg
+ trunk/22x22/actions/zoom-in.svg
+ trunk/22x22/actions/zoom-original.svg
+ trunk/22x22/actions/zoom-out.svg
+Removed:
+ trunk/22x22/actions/zoom-fit-best.xcf.bz2
+ trunk/22x22/actions/zoom-in.xcf.bz2
+ trunk/22x22/actions/zoom-original.xcf.bz2
+ trunk/22x22/actions/zoom-out.xcf.bz2
+Modified:
+ trunk/22x22/actions/zoom-fit-best.png
+ trunk/22x22/actions/zoom-in.png
+ trunk/22x22/actions/zoom-original.png
+ trunk/22x22/actions/zoom-out.png
+ trunk/24x24/actions/zoom-fit-best.png
+ trunk/24x24/actions/zoom-in.png
+ trunk/24x24/actions/zoom-original.png
+ trunk/24x24/actions/zoom-out.png
+ trunk/ChangeLog
+
+Modified: trunk/22x22/actions/zoom-fit-best.png
+==============================================================================
+Binary files. No diff available.
+
+Added: trunk/22x22/actions/zoom-fit-best.svg
+==============================================================================
+--- (empty file)
++++ trunk/22x22/actions/zoom-fit-best.svg Sun Jun 15 12:51:45 2008
+@@ -0,0 +1,323 @@
++<?xml version="1.0" encoding="UTF-8" standalone="no"?>
++<!-- Created with Inkscape (http://www.inkscape.org/) -->
++<svg
++ xmlns:dc="http://purl.org/dc/elements/1.1/"
++ xmlns:cc="http://creativecommons.org/ns#"
++ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
++ xmlns:svg="http://www.w3.org/2000/svg"
++ xmlns="http://www.w3.org/2000/svg"
++ xmlns:xlink="http://www.w3.org/1999/xlink"
++ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
++ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
++ id="svg2"
++ sodipodi:version="0.32"
++ inkscape:version="0.46"
++ width="22"
++ height="22"
++ version="1.0"
++ sodipodi:docname="zoom-fit-best.svg"
++ inkscape:output_extension="org.inkscape.output.svg.inkscape"
++ inkscape:export-filename="/home/lapo/Icone/gnome-icon-theme/22x22/actions/zoom-fit-best.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <metadata
++ id="metadata7">
++ <rdf:RDF>
++ <cc:Work
++ rdf:about="">
++ <dc:format>image/svg+xml</dc:format>
++ <dc:type
++ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
++ </cc:Work>
++ </rdf:RDF>
++ </metadata>
++ <defs
++ id="defs5">
++ <inkscape:perspective
++ sodipodi:type="inkscape:persp3d"
++ inkscape:vp_x="0 : 11 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_z="22 : 11 : 1"
++ inkscape:persp3d-origin="11 : 7.3333333 : 1"
++ id="perspective54" />
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient3457">
++ <stop
++ style="stop-color:#000000;stop-opacity:1;"
++ offset="0"
++ id="stop3459" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0;"
++ offset="1"
++ id="stop3461" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient3390">
++ <stop
++ style="stop-color:#d3d7cf;stop-opacity:1;"
++ offset="0"
++ id="stop3392" />
++ <stop
++ style="stop-color:#d3d7cf;stop-opacity:0;"
++ offset="1"
++ id="stop3394" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient3363">
++ <stop
++ style="stop-color:#555753;stop-opacity:1"
++ offset="0"
++ id="stop3365" />
++ <stop
++ style="stop-color:#babdb6;stop-opacity:1"
++ offset="1"
++ id="stop3367" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient3355">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1;"
++ offset="0"
++ id="stop3357" />
++ <stop
++ style="stop-color:#ffffff;stop-opacity:0;"
++ offset="1"
++ id="stop3359" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient3173">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1;"
++ offset="0"
++ id="stop3175" />
++ <stop
++ style="stop-color:#ffffff;stop-opacity:0;"
++ offset="1"
++ id="stop3177" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient3158">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1"
++ offset="0"
++ id="stop3160" />
++ <stop
++ style="stop-color:#729fcf;stop-opacity:1"
++ offset="1"
++ id="stop3162" />
++ </linearGradient>
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3158"
++ id="radialGradient3164"
++ cx="5.25"
++ cy="11.319382"
++ fx="5.25"
++ fy="11.319382"
++ r="5.0219594"
++ gradientTransform="matrix(2.1423871,0,0,1.4095343,-5.9975318,-4.534562)"
++ gradientUnits="userSpaceOnUse" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3173"
++ id="radialGradient3187"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(2.4294068,-0.6509576,0.3478761,1.2982909,-81.987706,22.881631)"
++ cx="35.694305"
++ cy="4.3747716"
++ fx="35.694305"
++ fy="4.3747716"
++ r="7.421875" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3363"
++ id="linearGradient3375"
++ gradientUnits="userSpaceOnUse"
++ x1="46.539745"
++ y1="18.554003"
++ x2="49.09462"
++ y2="15.999128" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3390"
++ id="linearGradient3396"
++ x1="45.542095"
++ y1="15.459262"
++ x2="47.597126"
++ y2="18.795923"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(-30,0)" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3355"
++ id="linearGradient3398"
++ gradientUnits="userSpaceOnUse"
++ x1="47.921947"
++ y1="16.265554"
++ x2="46.20237"
++ y2="17.98513" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3457"
++ id="linearGradient3467"
++ gradientUnits="userSpaceOnUse"
++ x1="18.97526"
++ y1="20.932081"
++ x2="2.3619795"
++ y2="17.282845" />
++ <filter
++ inkscape:collect="always"
++ id="filter3541"
++ x="-0.11223404"
++ width="1.2244681"
++ y="-0.34716634"
++ height="1.6943327">
++ <feGaussianBlur
++ inkscape:collect="always"
++ stdDeviation="1.036119"
++ id="feGaussianBlur3543" />
++ </filter>
++ </defs>
++ <sodipodi:namedview
++ inkscape:window-height="867"
++ inkscape:window-width="920"
++ inkscape:pageshadow="2"
++ inkscape:pageopacity="0.0"
++ guidetolerance="10.0"
++ gridtolerance="10.0"
++ objecttolerance="10.0"
++ borderopacity="1.0"
++ bordercolor="#666666"
++ pagecolor="#ffffff"
++ id="base"
++ showgrid="false"
++ showborder="false"
++ inkscape:snap-nodes="true"
++ inkscape:snap-bbox="true"
++ inkscape:showpageshadow="false"
++ inkscape:zoom="5.6568542"
++ inkscape:cx="15.033086"
++ inkscape:cy="15.464747"
++ inkscape:window-x="10"
++ inkscape:window-y="81"
++ inkscape:current-layer="svg2">
++ <inkscape:grid
++ type="xygrid"
++ id="grid2384"
++ visible="true"
++ enabled="true"
++ spacingx="0.5px"
++ spacingy="0.5px"
++ empspacing="2" />
++ </sodipodi:namedview>
++ <path
++ sodipodi:type="inkscape:offset"
++ inkscape:radius="0.27968878"
++ inkscape:original="M 9 15.5 C 4.308 15.5 0.5 16.591949 0.5 17.9375 C 0.5 19.283051 4.3079999 20.375 9 20.375 C 11.219282 20.374999 13.235673 20.118645 14.75 19.71875 L 15.5 20.375 L 19 21.375 C 20.5 21.805163 22.5 21.242664 21 20.8125 L 17.5 19.8125 L 15.25 19.59375 C 16.644453 19.159477 17.5 18.573936 17.5 17.9375 C 17.5 16.591949 13.692 15.5 9 15.5 z "
++ style="fill:url(#linearGradient3467);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3541);opacity:0.3023424"
++ id="path3465"
++ d="M 9,15.21875 C 6.6323031,15.21875 4.4809605,15.485935 2.90625,15.9375 C 2.1188947,16.163282 1.469465,16.431881 1,16.75 C 0.53053501,17.068119 0.21875,17.469189 0.21875,17.9375 C 0.21875,18.405811 0.53053502,18.806881 1,19.125 C 1.469465,19.443119 2.1188947,19.711718 2.90625,19.9375 C 4.4809605,20.389065 6.632303,20.65625 9,20.65625 C 11.174648,20.656249 13.128948,20.418495 14.65625,20.03125 L 15.3125,20.59375 C 15.331945,20.606738 15.352942,20.617237 15.375,20.625 C 15.394445,20.637988 15.415442,20.648487 15.4375,20.65625 L 18.9375,21.65625 C 19.750215,21.889317 20.616637,21.848055 21.1875,21.6875 C 21.330216,21.647361 21.453415,21.603239 21.5625,21.53125 C 21.671585,21.459261 21.8125,21.346277 21.8125,21.15625 C 21.8125,20.966223 21.687225,20.830853 21.5625,20.75 C 21.437775,20.669147 21.265679,20.589517 21.0625,20.53125 L 17.5625,19.53125 C 17.552091,19.530668 17.541659,19.530668 17.53125,19.53125 L 16.4375,19.4375 C 16.670499,19.324009 16.883343,19.191827 17.0625
,
+ 19.0625 C 17.48938,18.75435 17.78125,18.381045 17.78125,17.9375 C 17.78125,17.469189 17.469465,17.068119 17,16.75 C 16.530535,16.431881 15.881105,16.163282 15.09375,15.9375 C 13.519039,15.485935 11.367697,15.21875 9,15.21875 z"
++ transform="matrix(0.9795918,0,0,0.9859961,-1.2755102e-3,0.2091829)" />
++ <g
++ id="g3371"
++ transform="translate(-30,0)">
++ <path
++ sodipodi:nodetypes="cccccc"
++ id="path3349"
++ d="M 51,19 C 52.5,20.5 50.5,22.5 49,21 L 45.5,17.5 L 44.5,14.5 L 47.5,15.5 L 51,19 z"
++ style="fill:url(#linearGradient3375);fill-opacity:1;fill-rule:evenodd;stroke:#555753;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
++ <path
++ d="M 45.625,15.625 L 46.125,17.0625 L 49.53125,20.46875 C 50.051432,20.988932 50.352295,20.835205 50.59375,20.59375 C 50.835205,20.352295 50.988932,20.051432 50.46875,19.53125 L 47.0625,16.125 L 45.625,15.625 z"
++ id="path3353"
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3398);stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:original="M 44.5 14.5 L 45.5 17.5 L 49 21 C 50.5 22.5 52.5 20.5 51 19 L 47.5 15.5 L 44.5 14.5 z "
++ inkscape:radius="-0.73127669"
++ sodipodi:type="inkscape:offset" />
++ </g>
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:url(#radialGradient3164);fill-opacity:1;stroke:#888a85;stroke-width:0.54391884999999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="path2386"
++ sodipodi:cx="5.25"
++ sodipodi:cy="5"
++ sodipodi:rx="4.75"
++ sodipodi:ry="4.5"
++ d="M 10,5 A 4.75,4.5 0 1 1 0.5,5 A 4.75,4.5 0 1 1 10,5 z"
++ transform="matrix(1.7894737,0,0,1.8888889,-0.394737,-0.4444445)" />
++ <path
++ style="opacity:0.6;fill:url(#radialGradient3187);fill-opacity:1;stroke:none;stroke-width:0.61644136999999999;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ d="M 9.032555,2.5 C 5.443835,2.5 2.53125,5.4125849 2.53125,9.0013055 C 2.53125,9.2371183 2.540593,9.4830461 2.565111,9.7123857 C 4.162343,10.301644 5.958713,10.626632 7.881283,10.626632 C 10.805871,10.626632 13.459736,9.8309449 15.5,8.5611129 C 15.276225,5.1747021 12.475288,2.5 9.032555,2.5 z"
++ id="path3168" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:none;fill-opacity:1;stroke:#eeeeec;stroke-width:0.61644137;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="path3166"
++ sodipodi:cx="5.25"
++ sodipodi:cy="5"
++ sodipodi:rx="4.75"
++ sodipodi:ry="4.5"
++ d="M 10,5 A 4.75,4.5 0 1 1 0.5,5 A 4.75,4.5 0 1 1 10,5 z"
++ transform="matrix(1.5789474,0,0,1.6666667,0.710526,0.6666667)" />
++ <path
++ style="fill:url(#linearGradient3396);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
++ d="M 15.25,15.25 L 15.890625,17.1875 C 16.82927,17.075122 16.917574,16.647028 17.265625,15.90625 L 15.25,15.25 z"
++ id="path3379"
++ sodipodi:nodetypes="cccc" />
++ <g
++ id="g3378"
++ style="opacity:0.7">
++ <g
++ id="g3355">
++ <path
++ style="opacity:1;fill:#3465a4;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ d="M 4,3 L 4,4 L 3,4 L 3,7 L 4,7 L 4,8 L 5,8 L 5,7 L 6,7 L 6,6 L 7,6 L 7,5 L 8,5 L 8,4 L 7,4 L 7,3 L 4,3 z"
++ id="rect3346" />
++ <path
++ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ d="M 4,4 L 4,5 L 4,7 L 5,7 L 5,5 L 7,5 L 7,4 L 5,4 L 4,4 z"
++ id="rect3341" />
++ </g>
++ <g
++ transform="matrix(0,1,-1,0,18,0)"
++ id="g3359">
++ <path
++ style="opacity:1;fill:#3465a4;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ d="M 4,3 L 4,4 L 3,4 L 3,7 L 4,7 L 4,8 L 5,8 L 5,7 L 6,7 L 6,6 L 7,6 L 7,5 L 8,5 L 8,4 L 7,4 L 7,3 L 4,3 z"
++ id="path3361" />
++ <path
++ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ d="M 4,4 L 4,5 L 4,7 L 5,7 L 5,5 L 7,5 L 7,4 L 5,4 L 4,4 z"
++ id="path3363" />
++ </g>
++ <g
++ transform="matrix(-1,0,0,-1,18,18)"
++ id="g3365">
++ <path
++ style="opacity:1;fill:#3465a4;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ d="M 4,3 L 4,4 L 3,4 L 3,7 L 4,7 L 4,8 L 5,8 L 5,7 L 6,7 L 6,6 L 7,6 L 7,5 L 8,5 L 8,4 L 7,4 L 7,3 L 4,3 z"
++ id="path3367" />
++ <path
++ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ d="M 4,4 L 4,5 L 4,7 L 5,7 L 5,5 L 7,5 L 7,4 L 5,4 L 4,4 z"
++ id="path3369" />
++ </g>
++ <g
++ transform="matrix(0,-1,1,0,0,18)"
++ id="g3372">
++ <path
++ style="opacity:1;fill:#3465a4;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ d="M 4,3 L 4,4 L 3,4 L 3,7 L 4,7 L 4,8 L 5,8 L 5,7 L 6,7 L 6,6 L 7,6 L 7,5 L 8,5 L 8,4 L 7,4 L 7,3 L 4,3 z"
++ id="path3374" />
++ <path
++ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ d="M 4,4 L 4,5 L 4,7 L 5,7 L 5,5 L 7,5 L 7,4 L 5,4 L 4,4 z"
++ id="path3376" />
++ </g>
++ </g>
++</svg>
+
+Modified: trunk/22x22/actions/zoom-in.png
+==============================================================================
+Binary files. No diff available.
+
+Added: trunk/22x22/actions/zoom-in.svg
+==============================================================================
+--- (empty file)
++++ trunk/22x22/actions/zoom-in.svg Sun Jun 15 12:51:45 2008
+@@ -0,0 +1,317 @@
++<?xml version="1.0" encoding="UTF-8" standalone="no"?>
++<!-- Created with Inkscape (http://www.inkscape.org/) -->
++<svg
++ xmlns:dc="http://purl.org/dc/elements/1.1/"
++ xmlns:cc="http://creativecommons.org/ns#"
++ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
++ xmlns:svg="http://www.w3.org/2000/svg"
++ xmlns="http://www.w3.org/2000/svg"
++ xmlns:xlink="http://www.w3.org/1999/xlink"
++ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
++ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
++ id="svg2"
++ sodipodi:version="0.32"
++ inkscape:version="0.46"
++ width="22"
++ height="22"
++ version="1.0"
++ sodipodi:docname="zoom-in.svg"
++ inkscape:output_extension="org.inkscape.output.svg.inkscape"
++ inkscape:export-filename="/home/lapo/Icone/gnome-icon-theme/22x22/actions/zoom-in.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <metadata
++ id="metadata7">
++ <rdf:RDF>
++ <cc:Work
++ rdf:about="">
++ <dc:format>image/svg+xml</dc:format>
++ <dc:type
++ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
++ </cc:Work>
++ </rdf:RDF>
++ </metadata>
++ <defs
++ id="defs5">
++ <inkscape:perspective
++ sodipodi:type="inkscape:persp3d"
++ inkscape:vp_x="0 : 11 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_z="22 : 11 : 1"
++ inkscape:persp3d-origin="11 : 7.3333333 : 1"
++ id="perspective47" />
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient3457">
++ <stop
++ style="stop-color:#000000;stop-opacity:1;"
++ offset="0"
++ id="stop3459" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0;"
++ offset="1"
++ id="stop3461" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient3390">
++ <stop
++ style="stop-color:#d3d7cf;stop-opacity:1;"
++ offset="0"
++ id="stop3392" />
++ <stop
++ style="stop-color:#d3d7cf;stop-opacity:0;"
++ offset="1"
++ id="stop3394" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient3363">
++ <stop
++ style="stop-color:#555753;stop-opacity:1"
++ offset="0"
++ id="stop3365" />
++ <stop
++ style="stop-color:#babdb6;stop-opacity:1"
++ offset="1"
++ id="stop3367" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient3355">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1;"
++ offset="0"
++ id="stop3357" />
++ <stop
++ style="stop-color:#ffffff;stop-opacity:0;"
++ offset="1"
++ id="stop3359" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient3173">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1;"
++ offset="0"
++ id="stop3175" />
++ <stop
++ style="stop-color:#ffffff;stop-opacity:0;"
++ offset="1"
++ id="stop3177" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient3158">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1"
++ offset="0"
++ id="stop3160" />
++ <stop
++ style="stop-color:#729fcf;stop-opacity:1"
++ offset="1"
++ id="stop3162" />
++ </linearGradient>
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3158"
++ id="radialGradient3164"
++ cx="5.25"
++ cy="11.319382"
++ fx="5.25"
++ fy="11.319382"
++ r="5.0219594"
++ gradientTransform="matrix(2.1423871,0,0,1.4095343,-5.9975318,-4.534562)"
++ gradientUnits="userSpaceOnUse" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3173"
++ id="radialGradient3187"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(2.4294068,-0.6509576,0.3478761,1.2982909,-81.987706,22.881631)"
++ cx="35.694305"
++ cy="4.3747716"
++ fx="35.694305"
++ fy="4.3747716"
++ r="7.421875" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3363"
++ id="linearGradient3375"
++ gradientUnits="userSpaceOnUse"
++ x1="46.539745"
++ y1="18.554003"
++ x2="49.09462"
++ y2="15.999128" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3390"
++ id="linearGradient3396"
++ x1="45.542095"
++ y1="15.459262"
++ x2="47.597126"
++ y2="18.795923"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(-30,0)" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3355"
++ id="linearGradient3398"
++ gradientUnits="userSpaceOnUse"
++ x1="47.921947"
++ y1="16.265554"
++ x2="46.20237"
++ y2="17.98513" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3457"
++ id="linearGradient3467"
++ gradientUnits="userSpaceOnUse"
++ x1="18.97526"
++ y1="20.932081"
++ x2="2.3619795"
++ y2="17.282845" />
++ <filter
++ inkscape:collect="always"
++ id="filter3541"
++ x="-0.11223404"
++ width="1.2244681"
++ y="-0.34716634"
++ height="1.6943327">
++ <feGaussianBlur
++ inkscape:collect="always"
++ stdDeviation="1.036119"
++ id="feGaussianBlur3543" />
++ </filter>
++ </defs>
++ <sodipodi:namedview
++ inkscape:window-height="867"
++ inkscape:window-width="920"
++ inkscape:pageshadow="2"
++ inkscape:pageopacity="0.0"
++ guidetolerance="10.0"
++ gridtolerance="10.0"
++ objecttolerance="10.0"
++ borderopacity="1.0"
++ bordercolor="#666666"
++ pagecolor="#ffffff"
++ id="base"
++ showgrid="false"
++ showborder="false"
++ inkscape:snap-nodes="true"
++ inkscape:snap-bbox="true"
++ inkscape:showpageshadow="false"
++ inkscape:zoom="11.313708"
++ inkscape:cx="2.3162319"
++ inkscape:cy="19.062859"
++ inkscape:window-x="15"
++ inkscape:window-y="105"
++ inkscape:current-layer="svg2">
++ <inkscape:grid
++ type="xygrid"
++ id="grid2384"
++ visible="true"
++ enabled="true"
++ spacingx="0.5px"
++ spacingy="0.5px"
++ empspacing="2" />
++ </sodipodi:namedview>
++ <path
++ sodipodi:type="inkscape:offset"
++ inkscape:radius="0.27968878"
++ inkscape:original="M 9 15.5 C 4.308 15.5 0.5 16.591949 0.5 17.9375 C 0.5 19.283051 4.3079999 20.375 9 20.375 C 11.219282 20.374999 13.235673 20.118645 14.75 19.71875 L 15.5 20.375 L 19 21.375 C 20.5 21.805163 22.5 21.242664 21 20.8125 L 17.5 19.8125 L 15.25 19.59375 C 16.644453 19.159477 17.5 18.573936 17.5 17.9375 C 17.5 16.591949 13.692 15.5 9 15.5 z "
++ style="fill:url(#linearGradient3467);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3541);opacity:0.3023424"
++ id="path3465"
++ d="M 9,15.21875 C 6.6323031,15.21875 4.4809605,15.485935 2.90625,15.9375 C 2.1188947,16.163282 1.469465,16.431881 1,16.75 C 0.53053501,17.068119 0.21875,17.469189 0.21875,17.9375 C 0.21875,18.405811 0.53053502,18.806881 1,19.125 C 1.469465,19.443119 2.1188947,19.711718 2.90625,19.9375 C 4.4809605,20.389065 6.632303,20.65625 9,20.65625 C 11.174648,20.656249 13.128948,20.418495 14.65625,20.03125 L 15.3125,20.59375 C 15.331945,20.606738 15.352942,20.617237 15.375,20.625 C 15.394445,20.637988 15.415442,20.648487 15.4375,20.65625 L 18.9375,21.65625 C 19.750215,21.889317 20.616637,21.848055 21.1875,21.6875 C 21.330216,21.647361 21.453415,21.603239 21.5625,21.53125 C 21.671585,21.459261 21.8125,21.346277 21.8125,21.15625 C 21.8125,20.966223 21.687225,20.830853 21.5625,20.75 C 21.437775,20.669147 21.265679,20.589517 21.0625,20.53125 L 17.5625,19.53125 C 17.552091,19.530668 17.541659,19.530668 17.53125,19.53125 L 16.4375,19.4375 C 16.670499,19.324009 16.883343,19.191827 17.0625
,
+ 19.0625 C 17.48938,18.75435 17.78125,18.381045 17.78125,17.9375 C 17.78125,17.469189 17.469465,17.068119 17,16.75 C 16.530535,16.431881 15.881105,16.163282 15.09375,15.9375 C 13.519039,15.485935 11.367697,15.21875 9,15.21875 z"
++ transform="matrix(0.9795918,0,0,0.9859961,-1.2755102e-3,0.2091829)" />
++ <g
++ id="g3371"
++ transform="translate(-30,0)">
++ <path
++ sodipodi:nodetypes="cccccc"
++ id="path3349"
++ d="M 51,19 C 52.5,20.5 50.5,22.5 49,21 L 45.5,17.5 L 44.5,14.5 L 47.5,15.5 L 51,19 z"
++ style="fill:url(#linearGradient3375);fill-opacity:1;fill-rule:evenodd;stroke:#555753;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
++ <path
++ d="M 45.625,15.625 L 46.125,17.0625 L 49.53125,20.46875 C 50.051432,20.988932 50.352295,20.835205 50.59375,20.59375 C 50.835205,20.352295 50.988932,20.051432 50.46875,19.53125 L 47.0625,16.125 L 45.625,15.625 z"
++ id="path3353"
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3398);stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:original="M 44.5 14.5 L 45.5 17.5 L 49 21 C 50.5 22.5 52.5 20.5 51 19 L 47.5 15.5 L 44.5 14.5 z "
++ inkscape:radius="-0.73127669"
++ sodipodi:type="inkscape:offset" />
++ </g>
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:url(#radialGradient3164);fill-opacity:1;stroke:#888a85;stroke-width:0.54391884999999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="path2386"
++ sodipodi:cx="5.25"
++ sodipodi:cy="5"
++ sodipodi:rx="4.75"
++ sodipodi:ry="4.5"
++ d="M 10,5 A 4.75,4.5 0 1 1 0.5,5 A 4.75,4.5 0 1 1 10,5 z"
++ transform="matrix(1.7894737,0,0,1.8888889,-0.394737,-0.4444445)" />
++ <path
++ style="opacity:0.6;fill:url(#radialGradient3187);fill-opacity:1;stroke:none;stroke-width:0.61644136999999999;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ d="M 9.032555,2.5 C 5.443835,2.5 2.53125,5.4125849 2.53125,9.0013055 C 2.53125,9.2371183 2.540593,9.4830461 2.565111,9.7123857 C 4.162343,10.301644 5.958713,10.626632 7.881283,10.626632 C 10.805871,10.626632 13.459736,9.8309449 15.5,8.5611129 C 15.276225,5.1747021 12.475288,2.5 9.032555,2.5 z"
++ id="path3168" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:none;fill-opacity:1;stroke:#eeeeec;stroke-width:0.61644137;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="path3166"
++ sodipodi:cx="5.25"
++ sodipodi:cy="5"
++ sodipodi:rx="4.75"
++ sodipodi:ry="4.5"
++ d="M 10,5 A 4.75,4.5 0 1 1 0.5,5 A 4.75,4.5 0 1 1 10,5 z"
++ transform="matrix(1.5789474,0,0,1.6666667,0.710526,0.6666667)" />
++ <path
++ style="fill:url(#linearGradient3396);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
++ d="M 15.25,15.25 L 15.890625,17.1875 C 16.82927,17.075122 16.917574,16.647028 17.265625,15.90625 L 15.25,15.25 z"
++ id="path3379"
++ sodipodi:nodetypes="cccc" />
++ <g
++ id="g3314"
++ style="opacity:0.7">
++ <rect
++ ry="1.2794101"
++ rx="1.2794101"
++ y="7.5"
++ x="4.5"
++ height="3"
++ width="9"
++ id="rect2508"
++ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#3465a4;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
++ <g
++ transform="matrix(0,1,-1,0,18,0)"
++ style="opacity:1"
++ id="g3306">
++ <rect
++ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#3465a4;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3308"
++ width="9"
++ height="3"
++ x="4.5"
++ y="7.5"
++ rx="1.2794101"
++ ry="1.2794101" />
++ <rect
++ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3310"
++ width="8"
++ height="2"
++ x="5"
++ y="8"
++ rx="0"
++ ry="0" />
++ </g>
++ <rect
++ ry="0"
++ rx="0"
++ y="8"
++ x="5"
++ height="2"
++ width="8"
++ id="rect3280"
++ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
++ </g>
++</svg>
+
+Modified: trunk/22x22/actions/zoom-original.png
+==============================================================================
+Binary files. No diff available.
+
+Added: trunk/22x22/actions/zoom-original.svg
+==============================================================================
+--- (empty file)
++++ trunk/22x22/actions/zoom-original.svg Sun Jun 15 12:51:45 2008
+@@ -0,0 +1,285 @@
++<?xml version="1.0" encoding="UTF-8" standalone="no"?>
++<!-- Created with Inkscape (http://www.inkscape.org/) -->
++<svg
++ xmlns:dc="http://purl.org/dc/elements/1.1/"
++ xmlns:cc="http://creativecommons.org/ns#"
++ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
++ xmlns:svg="http://www.w3.org/2000/svg"
++ xmlns="http://www.w3.org/2000/svg"
++ xmlns:xlink="http://www.w3.org/1999/xlink"
++ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
++ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
++ id="svg2"
++ sodipodi:version="0.32"
++ inkscape:version="0.46"
++ width="22"
++ height="22"
++ version="1.0"
++ sodipodi:docname="zoom-original.svg"
++ inkscape:output_extension="org.inkscape.output.svg.inkscape"
++ inkscape:export-filename="/home/lapo/Icone/gnome-icon-theme/22x22/actions/zoom-original.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <metadata
++ id="metadata7">
++ <rdf:RDF>
++ <cc:Work
++ rdf:about="">
++ <dc:format>image/svg+xml</dc:format>
++ <dc:type
++ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
++ </cc:Work>
++ </rdf:RDF>
++ </metadata>
++ <defs
++ id="defs5">
++ <inkscape:perspective
++ sodipodi:type="inkscape:persp3d"
++ inkscape:vp_x="0 : 11 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_z="22 : 11 : 1"
++ inkscape:persp3d-origin="11 : 7.3333333 : 1"
++ id="perspective44" />
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient3457">
++ <stop
++ style="stop-color:#000000;stop-opacity:1;"
++ offset="0"
++ id="stop3459" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0;"
++ offset="1"
++ id="stop3461" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient3390">
++ <stop
++ style="stop-color:#d3d7cf;stop-opacity:1;"
++ offset="0"
++ id="stop3392" />
++ <stop
++ style="stop-color:#d3d7cf;stop-opacity:0;"
++ offset="1"
++ id="stop3394" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient3363">
++ <stop
++ style="stop-color:#555753;stop-opacity:1"
++ offset="0"
++ id="stop3365" />
++ <stop
++ style="stop-color:#babdb6;stop-opacity:1"
++ offset="1"
++ id="stop3367" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient3355">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1;"
++ offset="0"
++ id="stop3357" />
++ <stop
++ style="stop-color:#ffffff;stop-opacity:0;"
++ offset="1"
++ id="stop3359" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient3173">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1;"
++ offset="0"
++ id="stop3175" />
++ <stop
++ style="stop-color:#ffffff;stop-opacity:0;"
++ offset="1"
++ id="stop3177" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient3158">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1"
++ offset="0"
++ id="stop3160" />
++ <stop
++ style="stop-color:#729fcf;stop-opacity:1"
++ offset="1"
++ id="stop3162" />
++ </linearGradient>
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3158"
++ id="radialGradient3164"
++ cx="5.25"
++ cy="11.319382"
++ fx="5.25"
++ fy="11.319382"
++ r="5.0219594"
++ gradientTransform="matrix(2.1423871,0,0,1.4095343,-5.9975318,-4.534562)"
++ gradientUnits="userSpaceOnUse" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3173"
++ id="radialGradient3187"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(2.4294068,-0.6509576,0.3478761,1.2982909,-81.987706,22.881631)"
++ cx="35.694305"
++ cy="4.3747716"
++ fx="35.694305"
++ fy="4.3747716"
++ r="7.421875" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3363"
++ id="linearGradient3375"
++ gradientUnits="userSpaceOnUse"
++ x1="46.539745"
++ y1="18.554003"
++ x2="49.09462"
++ y2="15.999128" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3390"
++ id="linearGradient3396"
++ x1="45.542095"
++ y1="15.459262"
++ x2="47.597126"
++ y2="18.795923"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(-30,0)" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3355"
++ id="linearGradient3398"
++ gradientUnits="userSpaceOnUse"
++ x1="47.921947"
++ y1="16.265554"
++ x2="46.20237"
++ y2="17.98513" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3457"
++ id="linearGradient3467"
++ gradientUnits="userSpaceOnUse"
++ x1="18.97526"
++ y1="20.932081"
++ x2="2.3619795"
++ y2="17.282845" />
++ <filter
++ inkscape:collect="always"
++ id="filter3541"
++ x="-0.11223404"
++ width="1.2244681"
++ y="-0.34716634"
++ height="1.6943327">
++ <feGaussianBlur
++ inkscape:collect="always"
++ stdDeviation="1.036119"
++ id="feGaussianBlur3543" />
++ </filter>
++ </defs>
++ <sodipodi:namedview
++ inkscape:window-height="867"
++ inkscape:window-width="920"
++ inkscape:pageshadow="2"
++ inkscape:pageopacity="0.0"
++ guidetolerance="10.0"
++ gridtolerance="10.0"
++ objecttolerance="10.0"
++ borderopacity="1.0"
++ bordercolor="#666666"
++ pagecolor="#ffffff"
++ id="base"
++ showgrid="false"
++ showborder="false"
++ inkscape:snap-nodes="true"
++ inkscape:snap-bbox="true"
++ inkscape:showpageshadow="false"
++ inkscape:zoom="1"
++ inkscape:cx="14.501823"
++ inkscape:cy="-1.5122589"
++ inkscape:window-x="5"
++ inkscape:window-y="57"
++ inkscape:current-layer="svg2">
++ <inkscape:grid
++ type="xygrid"
++ id="grid2384"
++ visible="true"
++ enabled="true"
++ spacingx="0.5px"
++ spacingy="0.5px"
++ empspacing="2" />
++ </sodipodi:namedview>
++ <path
++ sodipodi:type="inkscape:offset"
++ inkscape:radius="0.27968878"
++ inkscape:original="M 9 15.5 C 4.308 15.5 0.5 16.591949 0.5 17.9375 C 0.5 19.283051 4.3079999 20.375 9 20.375 C 11.219282 20.374999 13.235673 20.118645 14.75 19.71875 L 15.5 20.375 L 19 21.375 C 20.5 21.805163 22.5 21.242664 21 20.8125 L 17.5 19.8125 L 15.25 19.59375 C 16.644453 19.159477 17.5 18.573936 17.5 17.9375 C 17.5 16.591949 13.692 15.5 9 15.5 z "
++ style="fill:url(#linearGradient3467);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3541);opacity:0.3023424"
++ id="path3465"
++ d="M 9,15.21875 C 6.6323031,15.21875 4.4809605,15.485935 2.90625,15.9375 C 2.1188947,16.163282 1.469465,16.431881 1,16.75 C 0.53053501,17.068119 0.21875,17.469189 0.21875,17.9375 C 0.21875,18.405811 0.53053502,18.806881 1,19.125 C 1.469465,19.443119 2.1188947,19.711718 2.90625,19.9375 C 4.4809605,20.389065 6.632303,20.65625 9,20.65625 C 11.174648,20.656249 13.128948,20.418495 14.65625,20.03125 L 15.3125,20.59375 C 15.331945,20.606738 15.352942,20.617237 15.375,20.625 C 15.394445,20.637988 15.415442,20.648487 15.4375,20.65625 L 18.9375,21.65625 C 19.750215,21.889317 20.616637,21.848055 21.1875,21.6875 C 21.330216,21.647361 21.453415,21.603239 21.5625,21.53125 C 21.671585,21.459261 21.8125,21.346277 21.8125,21.15625 C 21.8125,20.966223 21.687225,20.830853 21.5625,20.75 C 21.437775,20.669147 21.265679,20.589517 21.0625,20.53125 L 17.5625,19.53125 C 17.552091,19.530668 17.541659,19.530668 17.53125,19.53125 L 16.4375,19.4375 C 16.670499,19.324009 16.883343,19.191827 17.0625
,
+ 19.0625 C 17.48938,18.75435 17.78125,18.381045 17.78125,17.9375 C 17.78125,17.469189 17.469465,17.068119 17,16.75 C 16.530535,16.431881 15.881105,16.163282 15.09375,15.9375 C 13.519039,15.485935 11.367697,15.21875 9,15.21875 z"
++ transform="matrix(0.9795918,0,0,0.9859961,-1.2755102e-3,0.2091829)" />
++ <g
++ id="g3371"
++ transform="translate(-30,0)">
++ <path
++ sodipodi:nodetypes="cccccc"
++ id="path3349"
++ d="M 51,19 C 52.5,20.5 50.5,22.5 49,21 L 45.5,17.5 L 44.5,14.5 L 47.5,15.5 L 51,19 z"
++ style="fill:url(#linearGradient3375);fill-opacity:1;fill-rule:evenodd;stroke:#555753;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
++ <path
++ d="M 45.625,15.625 L 46.125,17.0625 L 49.53125,20.46875 C 50.051432,20.988932 50.352295,20.835205 50.59375,20.59375 C 50.835205,20.352295 50.988932,20.051432 50.46875,19.53125 L 47.0625,16.125 L 45.625,15.625 z"
++ id="path3353"
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3398);stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:original="M 44.5 14.5 L 45.5 17.5 L 49 21 C 50.5 22.5 52.5 20.5 51 19 L 47.5 15.5 L 44.5 14.5 z "
++ inkscape:radius="-0.73127669"
++ sodipodi:type="inkscape:offset" />
++ </g>
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:url(#radialGradient3164);fill-opacity:1;stroke:#888a85;stroke-width:0.54391884999999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="path2386"
++ sodipodi:cx="5.25"
++ sodipodi:cy="5"
++ sodipodi:rx="4.75"
++ sodipodi:ry="4.5"
++ d="M 10,5 A 4.75,4.5 0 1 1 0.5,5 A 4.75,4.5 0 1 1 10,5 z"
++ transform="matrix(1.7894737,0,0,1.8888889,-0.394737,-0.4444445)" />
++ <path
++ style="opacity:0.6;fill:url(#radialGradient3187);fill-opacity:1;stroke:none;stroke-width:0.61644136999999999;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ d="M 9.032555,2.5 C 5.443835,2.5 2.53125,5.4125849 2.53125,9.0013055 C 2.53125,9.2371183 2.540593,9.4830461 2.565111,9.7123857 C 4.162343,10.301644 5.958713,10.626632 7.881283,10.626632 C 10.805871,10.626632 13.459736,9.8309449 15.5,8.5611129 C 15.276225,5.1747021 12.475288,2.5 9.032555,2.5 z"
++ id="path3168" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:none;fill-opacity:1;stroke:#eeeeec;stroke-width:0.61644137;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="path3166"
++ sodipodi:cx="5.25"
++ sodipodi:cy="5"
++ sodipodi:rx="4.75"
++ sodipodi:ry="4.5"
++ d="M 10,5 A 4.75,4.5 0 1 1 0.5,5 A 4.75,4.5 0 1 1 10,5 z"
++ transform="matrix(1.5789474,0,0,1.6666667,0.710526,0.6666667)" />
++ <path
++ style="fill:url(#linearGradient3396);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
++ d="M 15.25,15.25 L 15.890625,17.1875 C 16.82927,17.075122 16.917574,16.647028 17.265625,15.90625 L 15.25,15.25 z"
++ id="path3379"
++ sodipodi:nodetypes="cccc" />
++ <g
++ id="g3429"
++ style="opacity:0.7"
++ transform="translate(30,0)">
++ <path
++ id="rect3400"
++ d="M -22,4 L -22,5 L -20,5 L -20,13 L -19,13 L -19,4 L -22,4 z M -20,13 L -22,13 L -22,14 L -20,14 L -20,13 z M -22,13 L -22,8 L -24,8 L -24,9 L -23,9 L -23,13 L -22,13 z M -24,8 L -24,7 L -25,7 L -25,8 L -24,8 z M -24,7 L -23,7 L -23,6 L -24,6 L -24,7 z M -23,6 L -22,6 L -22,5 L -23,5 L -23,6 z"
++ style="opacity:1;fill:#3465a4;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
++ <path
++ id="rect3420"
++ d="M -22,5 L -22,6 L -23,6 L -23,7 L -24,7 L -24,8 L -23,8 L -22,8 L -22,13 L -21,13 L -20,13 L -20,5 L -21,5 L -22,5 z"
++ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
++ </g>
++</svg>
+
+Modified: trunk/22x22/actions/zoom-out.png
+==============================================================================
+Binary files. No diff available.
+
+Added: trunk/22x22/actions/zoom-out.svg
+==============================================================================
+--- (empty file)
++++ trunk/22x22/actions/zoom-out.svg Sun Jun 15 12:51:45 2008
+@@ -0,0 +1,294 @@
++<?xml version="1.0" encoding="UTF-8" standalone="no"?>
++<!-- Created with Inkscape (http://www.inkscape.org/) -->
++<svg
++ xmlns:dc="http://purl.org/dc/elements/1.1/"
++ xmlns:cc="http://creativecommons.org/ns#"
++ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
++ xmlns:svg="http://www.w3.org/2000/svg"
++ xmlns="http://www.w3.org/2000/svg"
++ xmlns:xlink="http://www.w3.org/1999/xlink"
++ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
++ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
++ id="svg2"
++ sodipodi:version="0.32"
++ inkscape:version="0.46"
++ width="22"
++ height="22"
++ version="1.0"
++ sodipodi:docname="zoom-out.svg"
++ inkscape:output_extension="org.inkscape.output.svg.inkscape"
++ inkscape:export-filename="/home/lapo/Icone/gnome-icon-theme/22x22/actions/zoom-out.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <metadata
++ id="metadata7">
++ <rdf:RDF>
++ <cc:Work
++ rdf:about="">
++ <dc:format>image/svg+xml</dc:format>
++ <dc:type
++ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
++ </cc:Work>
++ </rdf:RDF>
++ </metadata>
++ <defs
++ id="defs5">
++ <inkscape:perspective
++ sodipodi:type="inkscape:persp3d"
++ inkscape:vp_x="0 : 11 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_z="22 : 11 : 1"
++ inkscape:persp3d-origin="11 : 7.3333333 : 1"
++ id="perspective44" />
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient3457">
++ <stop
++ style="stop-color:#000000;stop-opacity:1;"
++ offset="0"
++ id="stop3459" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0;"
++ offset="1"
++ id="stop3461" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient3390">
++ <stop
++ style="stop-color:#d3d7cf;stop-opacity:1;"
++ offset="0"
++ id="stop3392" />
++ <stop
++ style="stop-color:#d3d7cf;stop-opacity:0;"
++ offset="1"
++ id="stop3394" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient3363">
++ <stop
++ style="stop-color:#555753;stop-opacity:1"
++ offset="0"
++ id="stop3365" />
++ <stop
++ style="stop-color:#babdb6;stop-opacity:1"
++ offset="1"
++ id="stop3367" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient3355">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1;"
++ offset="0"
++ id="stop3357" />
++ <stop
++ style="stop-color:#ffffff;stop-opacity:0;"
++ offset="1"
++ id="stop3359" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient3173">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1;"
++ offset="0"
++ id="stop3175" />
++ <stop
++ style="stop-color:#ffffff;stop-opacity:0;"
++ offset="1"
++ id="stop3177" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient3158">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1"
++ offset="0"
++ id="stop3160" />
++ <stop
++ style="stop-color:#729fcf;stop-opacity:1"
++ offset="1"
++ id="stop3162" />
++ </linearGradient>
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3158"
++ id="radialGradient3164"
++ cx="5.25"
++ cy="11.319382"
++ fx="5.25"
++ fy="11.319382"
++ r="5.0219594"
++ gradientTransform="matrix(2.1423871,0,0,1.4095343,-5.9975318,-4.534562)"
++ gradientUnits="userSpaceOnUse" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3173"
++ id="radialGradient3187"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(2.4294068,-0.6509576,0.3478761,1.2982909,-81.987706,22.881631)"
++ cx="35.694305"
++ cy="4.3747716"
++ fx="35.694305"
++ fy="4.3747716"
++ r="7.421875" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3363"
++ id="linearGradient3375"
++ gradientUnits="userSpaceOnUse"
++ x1="46.539745"
++ y1="18.554003"
++ x2="49.09462"
++ y2="15.999128" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3390"
++ id="linearGradient3396"
++ x1="45.542095"
++ y1="15.459262"
++ x2="47.597126"
++ y2="18.795923"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(-30,0)" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3355"
++ id="linearGradient3398"
++ gradientUnits="userSpaceOnUse"
++ x1="47.921947"
++ y1="16.265554"
++ x2="46.20237"
++ y2="17.98513" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3457"
++ id="linearGradient3467"
++ gradientUnits="userSpaceOnUse"
++ x1="18.97526"
++ y1="20.932081"
++ x2="2.3619795"
++ y2="17.282845" />
++ <filter
++ inkscape:collect="always"
++ id="filter3541"
++ x="-0.11223404"
++ width="1.2244681"
++ y="-0.34716634"
++ height="1.6943327">
++ <feGaussianBlur
++ inkscape:collect="always"
++ stdDeviation="1.036119"
++ id="feGaussianBlur3543" />
++ </filter>
++ </defs>
++ <sodipodi:namedview
++ inkscape:window-height="867"
++ inkscape:window-width="920"
++ inkscape:pageshadow="2"
++ inkscape:pageopacity="0.0"
++ guidetolerance="10.0"
++ gridtolerance="10.0"
++ objecttolerance="10.0"
++ borderopacity="1.0"
++ bordercolor="#666666"
++ pagecolor="#ffffff"
++ id="base"
++ showgrid="false"
++ showborder="false"
++ inkscape:snap-nodes="true"
++ inkscape:snap-bbox="true"
++ inkscape:showpageshadow="false"
++ inkscape:zoom="4"
++ inkscape:cx="38.674726"
++ inkscape:cy="-6.0396134"
++ inkscape:window-x="10"
++ inkscape:window-y="81"
++ inkscape:current-layer="svg2">
++ <inkscape:grid
++ type="xygrid"
++ id="grid2384"
++ visible="true"
++ enabled="true"
++ spacingx="0.5px"
++ spacingy="0.5px"
++ empspacing="2" />
++ </sodipodi:namedview>
++ <path
++ sodipodi:type="inkscape:offset"
++ inkscape:radius="0.27968878"
++ inkscape:original="M 9 15.5 C 4.308 15.5 0.5 16.591949 0.5 17.9375 C 0.5 19.283051 4.3079999 20.375 9 20.375 C 11.219282 20.374999 13.235673 20.118645 14.75 19.71875 L 15.5 20.375 L 19 21.375 C 20.5 21.805163 22.5 21.242664 21 20.8125 L 17.5 19.8125 L 15.25 19.59375 C 16.644453 19.159477 17.5 18.573936 17.5 17.9375 C 17.5 16.591949 13.692 15.5 9 15.5 z "
++ style="fill:url(#linearGradient3467);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3541);opacity:0.3023424"
++ id="path3465"
++ d="M 9,15.21875 C 6.6323031,15.21875 4.4809605,15.485935 2.90625,15.9375 C 2.1188947,16.163282 1.469465,16.431881 1,16.75 C 0.53053501,17.068119 0.21875,17.469189 0.21875,17.9375 C 0.21875,18.405811 0.53053502,18.806881 1,19.125 C 1.469465,19.443119 2.1188947,19.711718 2.90625,19.9375 C 4.4809605,20.389065 6.632303,20.65625 9,20.65625 C 11.174648,20.656249 13.128948,20.418495 14.65625,20.03125 L 15.3125,20.59375 C 15.331945,20.606738 15.352942,20.617237 15.375,20.625 C 15.394445,20.637988 15.415442,20.648487 15.4375,20.65625 L 18.9375,21.65625 C 19.750215,21.889317 20.616637,21.848055 21.1875,21.6875 C 21.330216,21.647361 21.453415,21.603239 21.5625,21.53125 C 21.671585,21.459261 21.8125,21.346277 21.8125,21.15625 C 21.8125,20.966223 21.687225,20.830853 21.5625,20.75 C 21.437775,20.669147 21.265679,20.589517 21.0625,20.53125 L 17.5625,19.53125 C 17.552091,19.530668 17.541659,19.530668 17.53125,19.53125 L 16.4375,19.4375 C 16.670499,19.324009 16.883343,19.191827 17.0625
,
+ 19.0625 C 17.48938,18.75435 17.78125,18.381045 17.78125,17.9375 C 17.78125,17.469189 17.469465,17.068119 17,16.75 C 16.530535,16.431881 15.881105,16.163282 15.09375,15.9375 C 13.519039,15.485935 11.367697,15.21875 9,15.21875 z"
++ transform="matrix(0.9795918,0,0,0.9859961,-1.2755102e-3,0.2091829)" />
++ <g
++ id="g3371"
++ transform="translate(-30,0)">
++ <path
++ sodipodi:nodetypes="cccccc"
++ id="path3349"
++ d="M 51,19 C 52.5,20.5 50.5,22.5 49,21 L 45.5,17.5 L 44.5,14.5 L 47.5,15.5 L 51,19 z"
++ style="fill:url(#linearGradient3375);fill-opacity:1;fill-rule:evenodd;stroke:#555753;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
++ <path
++ d="M 45.625,15.625 L 46.125,17.0625 L 49.53125,20.46875 C 50.051432,20.988932 50.352295,20.835205 50.59375,20.59375 C 50.835205,20.352295 50.988932,20.051432 50.46875,19.53125 L 47.0625,16.125 L 45.625,15.625 z"
++ id="path3353"
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3398);stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:original="M 44.5 14.5 L 45.5 17.5 L 49 21 C 50.5 22.5 52.5 20.5 51 19 L 47.5 15.5 L 44.5 14.5 z "
++ inkscape:radius="-0.73127669"
++ sodipodi:type="inkscape:offset" />
++ </g>
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:url(#radialGradient3164);fill-opacity:1;stroke:#888a85;stroke-width:0.54391884999999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="path2386"
++ sodipodi:cx="5.25"
++ sodipodi:cy="5"
++ sodipodi:rx="4.75"
++ sodipodi:ry="4.5"
++ d="M 10,5 A 4.75,4.5 0 1 1 0.5,5 A 4.75,4.5 0 1 1 10,5 z"
++ transform="matrix(1.7894737,0,0,1.8888889,-0.394737,-0.4444445)" />
++ <path
++ style="opacity:0.6;fill:url(#radialGradient3187);fill-opacity:1;stroke:none;stroke-width:0.61644136999999999;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ d="M 9.032555,2.5 C 5.443835,2.5 2.53125,5.4125849 2.53125,9.0013055 C 2.53125,9.2371183 2.540593,9.4830461 2.565111,9.7123857 C 4.162343,10.301644 5.958713,10.626632 7.881283,10.626632 C 10.805871,10.626632 13.459736,9.8309449 15.5,8.5611129 C 15.276225,5.1747021 12.475288,2.5 9.032555,2.5 z"
++ id="path3168" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:none;fill-opacity:1;stroke:#eeeeec;stroke-width:0.61644137;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="path3166"
++ sodipodi:cx="5.25"
++ sodipodi:cy="5"
++ sodipodi:rx="4.75"
++ sodipodi:ry="4.5"
++ d="M 10,5 A 4.75,4.5 0 1 1 0.5,5 A 4.75,4.5 0 1 1 10,5 z"
++ transform="matrix(1.5789474,0,0,1.6666667,0.710526,0.6666667)" />
++ <path
++ style="fill:url(#linearGradient3396);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
++ d="M 15.25,15.25 L 15.890625,17.1875 C 16.82927,17.075122 16.917574,16.647028 17.265625,15.90625 L 15.25,15.25 z"
++ id="path3379"
++ sodipodi:nodetypes="cccc" />
++ <g
++ id="g3282"
++ style="opacity:0.7">
++ <rect
++ ry="1.2794101"
++ rx="1.2794101"
++ y="7.5"
++ x="4.5"
++ height="3"
++ width="9"
++ id="rect2508"
++ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#3465a4;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
++ <rect
++ ry="0"
++ rx="0"
++ y="8"
++ x="5"
++ height="2"
++ width="8"
++ id="rect3280"
++ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
++ </g>
++</svg>
+
+Modified: trunk/24x24/actions/zoom-fit-best.png
+==============================================================================
+Binary files. No diff available.
+
+Modified: trunk/24x24/actions/zoom-in.png
+==============================================================================
+Binary files. No diff available.
+
+Modified: trunk/24x24/actions/zoom-original.png
+==============================================================================
+Binary files. No diff available.
+
+Modified: trunk/24x24/actions/zoom-out.png
+==============================================================================
+Binary files. No diff available.
+_______________________________________________
+SVN-commits-list mailing list (read only)
+http://mail.gnome.org/mailman/listinfo/svn-commits-list
+
+Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want.
+Module maintainer? It is possible to set the reply-to to your development mailing list. Email svnmaster gnome org if interested.
Added: trunk/buildbot/jhbuildbot/test/mail/svn-commits-list.2
==============================================================================
--- (empty file)
+++ trunk/buildbot/jhbuildbot/test/mail/svn-commits-list.2 Wed Aug 13 14:18:33 2008
@@ -0,0 +1,91 @@
+Return-path: <svn-commits-list-bounces gnome org>
+Envelope-to: x469yq unrouted co uk
+Delivery-date: Fri, 20 Jun 2008 12:03:07 +0100
+Received: from menubar.gnome.org ([209.132.176.177])
+ by isshin.unrouted.co.uk with esmtp (Exim 4.63)
+ (envelope-from <svn-commits-list-bounces gnome org>)
+ id 1K9eOZ-0005NJ-6t
+ for x469yq unrouted co uk; Fri, 20 Jun 2008 12:03:07 +0100
+Received: from menubar.gnome.org (localhost.localdomain [127.0.0.1])
+ by menubar.gnome.org (Postfix) with ESMTP id 678F27504AC;
+ Fri, 20 Jun 2008 11:03:06 +0000 (GMT)
+X-Original-To: svn-commits-list gnome org
+Delivered-To: svn-commits-list gnome org
+Received: from localhost (localhost.localdomain [127.0.0.1])
+ by menubar.gnome.org (Postfix) with ESMTP id 788BF75041C
+ for <svn-commits-list gnome org>; Fri, 20 Jun 2008 11:02:35 +0000 (GMT)
+X-Virus-Scanned: by amavisd-new at gnome.org
+X-Spam-Flag: NO
+X-Spam-Score: -2.599
+X-Spam-Level:
+X-Spam-Status: No, score=-2.599 tagged_above=-999 required=2
+ tests=[BAYES_00=-2.599]
+X-Amavis-OS-Fingerprint: Linux 2.6 (newer, 3) (up: 290 hrs), (distance 18,
+ link: ethernet/modem), [91.189.93.3]
+Received: from menubar.gnome.org ([127.0.0.1])
+ by localhost (menubar.gnome.org [127.0.0.1]) (amavisd-new, port 10024)
+ with ESMTP id uGasZTOHKLte for <svn-commits-list gnome org>;
+ Fri, 20 Jun 2008 11:02:27 +0000 (GMT)
+Received: from socket.gnome.org (cobalt.canonical.com [91.189.93.3])
+ by menubar.gnome.org (Postfix) with ESMTP id 9404E7502A5
+ for <svn-commits-list gnome org>; Fri, 20 Jun 2008 11:00:08 +0000 (GMT)
+Received: by socket.gnome.org (Postfix, from userid 2225)
+ id DFBEA1BA001B; Fri, 20 Jun 2008 11:00:06 +0000 (UTC)
+From: timj svn gnome org
+To: svn-commits-list gnome org
+Subject: gtk+ r20514 - trunk/gtk
+MIME-Version: 1.0
+keywords: gtk+
+Message-Id: <20080620110006 DFBEA1BA001B socket gnome org>
+Date: Fri, 20 Jun 2008 11:00:06 +0000 (UTC)
+X-Topics: gtk+
+X-BeenThere: svn-commits-list gnome org
+X-Mailman-Version: 2.1.10
+Precedence: list
+List-Id: SVN commits <svn-commits-list.gnome.org>
+List-Unsubscribe: <http://mail.gnome.org/mailman/options/svn-commits-list>,
+ <mailto:svn-commits-list-request gnome org?subject=unsubscribe>
+List-Archive: </archives/svn-commits-list>
+List-Post: <mailto:svn-commits-list gnome org>
+List-Help: <mailto:svn-commits-list-request gnome org?subject=help>
+List-Subscribe: <http://mail.gnome.org/mailman/listinfo/svn-commits-list>,
+ <mailto:svn-commits-list-request gnome org?subject=subscribe>
+Content-Type: text/plain; charset="us-ascii"
+Content-Transfer-Encoding: 7bit
+Sender: svn-commits-list-bounces gnome org
+Errors-To: svn-commits-list-bounces gnome org
+
+Author: timj
+Date: Fri Jun 20 11:00:06 2008
+New Revision: 20514
+URL: http://svn.gnome.org/viewvc/gtk+?rev=20514&view=rev
+
+Log:
+* gtk/gtkcontainer.h: seal members.
+
+
+Modified:
+ trunk/gtk/gtkcontainer.h
+
+Modified: trunk/gtk/gtkcontainer.h
+==============================================================================
+--- trunk/gtk/gtkcontainer.h (original)
++++ trunk/gtk/gtkcontainer.h Fri Jun 20 11:00:06 2008
+@@ -57,9 +57,9 @@
+ {
+ GtkWidget widget;
+
+- GtkWidget *focus_child;
++ GtkWidget *GSEAL (focus_child);
+
+- guint border_width : 16;
++ guint GSEAL (border_width : 16);
+
+ /*< private >*/
+ guint need_resize : 1;
+_______________________________________________
+SVN-commits-list mailing list (read only)
+http://mail.gnome.org/mailman/listinfo/svn-commits-list
+
+Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want.
+Module maintainer? It is possible to set the reply-to to your development mailing list. Email svnmaster gnome org if interested.
Added: trunk/buildbot/jhbuildbot/test/mail/svn-commits-list.3
==============================================================================
--- (empty file)
+++ trunk/buildbot/jhbuildbot/test/mail/svn-commits-list.3 Wed Aug 13 14:18:33 2008
@@ -0,0 +1,709 @@
+Return-path: <svn-commits-list-bounces gnome org>
+Envelope-to: x469yq unrouted co uk
+Delivery-date: Sun, 22 Jun 2008 12:47:06 +0100
+Received: from menubar.gnome.org ([209.132.176.177])
+ by isshin.unrouted.co.uk with esmtp (Exim 4.63)
+ (envelope-from <svn-commits-list-bounces gnome org>)
+ id 1KAO2D-0001Wr-5Z
+ for x469yq unrouted co uk; Sun, 22 Jun 2008 12:47:06 +0100
+Received: from menubar.gnome.org (localhost.localdomain [127.0.0.1])
+ by menubar.gnome.org (Postfix) with ESMTP id A98657501A7;
+ Sun, 22 Jun 2008 11:47:03 +0000 (GMT)
+X-Original-To: svn-commits-list gnome org
+Delivered-To: svn-commits-list gnome org
+Received: from localhost (localhost.localdomain [127.0.0.1])
+ by menubar.gnome.org (Postfix) with ESMTP id 8E111750089
+ for <svn-commits-list gnome org>; Sun, 22 Jun 2008 11:46:59 +0000 (GMT)
+X-Virus-Scanned: by amavisd-new at gnome.org
+X-Spam-Flag: NO
+X-Spam-Score: -0.644
+X-Spam-Level:
+X-Spam-Status: No, score=-0.644 tagged_above=-999 required=2
+ tests=[BAYES_00=-2.599, URIBL_BLACK=1.955]
+X-Amavis-OS-Fingerprint: Linux 2.6 (newer, 3) (up: 339 hrs), (distance 18,
+ link: ethernet/modem), [91.189.93.3]
+Received: from menubar.gnome.org ([127.0.0.1])
+ by localhost (menubar.gnome.org [127.0.0.1]) (amavisd-new, port 10024)
+ with ESMTP id mL5jeyfGoqZ6 for <svn-commits-list gnome org>;
+ Sun, 22 Jun 2008 11:46:50 +0000 (GMT)
+Received: from socket.gnome.org (cobalt.canonical.com [91.189.93.3])
+ by menubar.gnome.org (Postfix) with ESMTP id 5FD0C750172
+ for <svn-commits-list gnome org>; Sun, 22 Jun 2008 11:46:49 +0000 (GMT)
+Received: by socket.gnome.org (Postfix, from userid 7705)
+ id C68AA1BA001C; Sun, 22 Jun 2008 11:46:47 +0000 (UTC)
+From: pohly svn gnome org
+To: svn-commits-list gnome org
+Subject: evolution-data-server r9023 - in branches/gnome-2-22: .
+ calendar/libecal
+MIME-Version: 1.0
+keywords: evolution-data-server
+Message-Id: <20080622114647 C68AA1BA001C socket gnome org>
+Date: Sun, 22 Jun 2008 11:46:47 +0000 (UTC)
+X-Topics: evolution-data-server
+X-BeenThere: svn-commits-list gnome org
+X-Mailman-Version: 2.1.10
+Precedence: list
+List-Id: SVN commits <svn-commits-list.gnome.org>
+List-Unsubscribe: <http://mail.gnome.org/mailman/options/svn-commits-list>,
+ <mailto:svn-commits-list-request gnome org?subject=unsubscribe>
+List-Archive: </archives/svn-commits-list>
+List-Post: <mailto:svn-commits-list gnome org>
+List-Help: <mailto:svn-commits-list-request gnome org?subject=help>
+List-Subscribe: <http://mail.gnome.org/mailman/listinfo/svn-commits-list>,
+ <mailto:svn-commits-list-request gnome org?subject=subscribe>
+Content-Type: text/plain; charset="us-ascii"
+Content-Transfer-Encoding: 7bit
+Sender: svn-commits-list-bounces gnome org
+Errors-To: svn-commits-list-bounces gnome org
+
+Author: pohly
+Date: Sun Jun 22 11:46:47 2008
+New Revision: 9023
+URL: http://svn.gnome.org/viewvc/evolution-data-server?rev=9023&view=rev
+
+Log:
+GNOME Bugzilla #52890: improved time zone handling
+
+This patch adds a new utility function e_cal_check_timezones() to
+libecal. The library version of libecal is bumped in a backwards
+compatible way: code compiled against previous releases still works
+with the extended library.
+
+e_cal_check_timezones() can be used by calendar backends to fix two
+problems:
+
+1. Importing a new meeting invitation into a calendar which already
+contains an old time zone definition ignores the new time zone
+definition. The new meeting is then displayed using the old
+definition.
+
+2. There is no mechanism to update the time zone rules used by
+existing meetings if their time zone changes.
+
+If possible, time zone definitions are mapped to the system time zone
+definitions used by Evolution. Currently this only works for time zone
+definitions which have a known location at the end of their time zone
+identifiers (i.e., older Evolution releases and other programs
+following the Olson database naming scheme). If this mapping works,
+then problem 1 and 2 no longer occur (but see the caveat below).
+
+If the mapping fails, then problem 1 is avoided by checking for an
+existing, conflicting time zone definition first and importing items
+with a renamed time zone definition in such a case.
+
+The caveat with regards to time zone handling is that Evolution only
+uses a subset of the information available for a system time
+zone. Events using a system time zone are only guaranteed to be
+displayed correctly starting at the current time and one year into the
+future. Past events and events even further into the future may be
+displayed incorrectly.
+
+Due to this limitation, past meetings which would have been displayed
+correctly using the time zone information they came with might be
+displayed incorrectly using Evolution's stripped system time zones.
+This limitation needs to be addressed separately in further patches.
+
+e-cal-check-timezones.[ch] are 1:1 copies of
+SyncEvolution/trunk revision 625.
+
+
+Added:
+ branches/gnome-2-22/calendar/libecal/e-cal-check-timezones.c
+ branches/gnome-2-22/calendar/libecal/e-cal-check-timezones.h
+Modified:
+ branches/gnome-2-22/calendar/libecal/Makefile.am
+ branches/gnome-2-22/configure.in
+
+Modified: branches/gnome-2-22/calendar/libecal/Makefile.am
+==============================================================================
+--- branches/gnome-2-22/calendar/libecal/Makefile.am (original)
++++ branches/gnome-2-22/calendar/libecal/Makefile.am Sun Jun 22 11:46:47 2008
+@@ -48,6 +48,7 @@
+ e-cal-listener.h \
+ e-cal-recur.c \
+ e-cal-time-util.c \
++ e-cal-check-timezones.c \
+ e-cal-util.c \
+ e-cal-view.c \
+ e-cal-view-listener.c \
+@@ -71,6 +72,7 @@
+ e-cal-component.h \
+ e-cal-recur.h \
+ e-cal-time-util.h \
++ e-cal-check-timezones.h \
+ e-cal-types.h \
+ e-cal-util.h \
+ e-cal-view.h
+
+Added: branches/gnome-2-22/calendar/libecal/e-cal-check-timezones.c
+==============================================================================
+--- (empty file)
++++ branches/gnome-2-22/calendar/libecal/e-cal-check-timezones.c Sun Jun 22 11:46:47 2008
+@@ -0,0 +1,490 @@
++/*
++ * Copyright (C) 2008 Novell, Inc.
++ *
++ * Authors: Patrick Ohly <patrick ohly gmx de>
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of version 2 of the GNU Lesser General Public
++ * License as published by the Free Software Foundation.
++ *
++ * 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 Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser 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.
++ */
++
++#ifndef HANDLE_LIBICAL_MEMORY
++# define HANDLE_LIBICAL_MEMORY 1
++#endif
++#include <libical/ical.h>
++
++#ifdef LIBICAL_MEMFIXES
++/* avoid dependency on icalstrdup.h, works when compiling as part of EDS >= 2.22 */
++# define ical_strdup(_x) (_x)
++#else
++/* use icalstrdup.h to get runtime detection of memory fix patch */
++# include "libical/icalstrdup.h"
++#endif
++
++#include "e-cal-check-timezones.h"
++#include <libecal/e-cal.h>
++#include <string.h>
++#include <ctype.h>
++
++/**
++ * Matches a location to a system timezone definition via a fuzzy
++ * search and returns the matching TZID, or NULL if none found.
++ *
++ * Currently simply strips a suffix introduced by a hyphen,
++ * as in "America/Denver-(Standard)".
++ */
++static const char *e_cal_match_location(const char *location)
++{
++ icaltimezone *icomp;
++ const char *tail;
++ size_t len;
++ char *buffer;
++
++ icomp = icaltimezone_get_builtin_timezone (location);
++ if (icomp) {
++ return icaltimezone_get_tzid(icomp);
++ }
++
++ /* try a bit harder by stripping trailing suffix */
++ tail = strrchr(location, '-');
++ len = tail ? (tail - location) : strlen(location);
++ buffer = g_malloc(len + 1);
++
++ if (buffer) {
++ memcpy(buffer, location, len);
++ buffer[len] = 0;
++ icomp = icaltimezone_get_builtin_timezone (buffer);
++ g_free(buffer);
++ if (icomp) {
++ return icaltimezone_get_tzid(icomp);
++ }
++ }
++
++ return NULL;
++}
++
++/**
++ * e_cal_match_tzid:
++ * matches a TZID against the system timezone definitions
++ * and returns the matching TZID, or NULL if none found
++ */
++const char *e_cal_match_tzid(const char *tzid)
++{
++ const char *location;
++ const char *systzid;
++ size_t len = strlen(tzid);
++ ssize_t eostr;
++
++ /*
++ * Try without any trailing spaces/digits: they might have been added
++ * by e_cal_check_timezones() in order to distinguish between
++ * different incompatible definitions. At that time mapping
++ * to system time zones must have failed, but perhaps now
++ * we have better code and it succeeds...
++ */
++ eostr = len - 1;
++ while (eostr >= 0 &&
++ isdigit(tzid[eostr])) {
++ eostr--;
++ }
++ while (eostr >= 0 &&
++ isspace(tzid[eostr])) {
++ eostr--;
++ }
++ if (eostr + 1 < len) {
++ char *strippedtzid = g_strndup(tzid, eostr + 1);
++ if (strippedtzid) {
++ systzid = e_cal_match_tzid(strippedtzid);
++ g_free(strippedtzid);
++ if (systzid) {
++ return systzid;
++ }
++ }
++ }
++
++ /*
++ * old-style Evolution: /softwarestudio.org/Olson_20011030_5/America/Denver
++ *
++ * jump from one slash to the next and check whether the remainder
++ * is a known location; start with the whole string (just in case)
++ */
++ for (location = tzid;
++ location && location[0];
++ location = strchr(location + 1, '/')) {
++ systzid = e_cal_match_location(location[0] == '/' ?
++ location + 1 :
++ location);
++ if (systzid) {
++ return systzid;
++ }
++ }
++
++ /* TODO: lookup table for Exchange TZIDs */
++
++ return NULL;
++}
++
++static void patch_tzids(icalcomponent *subcomp,
++ GHashTable *mapping)
++{
++ char *tzid = NULL;
++
++ if (icalcomponent_isa(subcomp) != ICAL_VTIMEZONE_COMPONENT) {
++ icalproperty *prop = icalcomponent_get_first_property(subcomp,
++ ICAL_ANY_PROPERTY);
++ while (prop) {
++ icalparameter *param = icalproperty_get_first_parameter(prop,
++ ICAL_TZID_PARAMETER);
++ while (param) {
++ const char *oldtzid;
++ const char *newtzid;
++
++ g_free(tzid);
++ tzid = g_strdup(icalparameter_get_tzid(param));
++
++ if (!g_hash_table_lookup_extended(mapping,
++ tzid,
++ (gpointer *)&oldtzid,
++ (gpointer *)&newtzid)) {
++ /* Corresponding VTIMEZONE not seen before! */
++ newtzid = e_cal_match_tzid(tzid);
++ }
++ if (newtzid) {
++ icalparameter_set_tzid(param, newtzid);
++ }
++ param = icalproperty_get_next_parameter(prop,
++ ICAL_TZID_PARAMETER);
++ }
++ prop = icalcomponent_get_next_property(subcomp,
++ ICAL_ANY_PROPERTY);
++ }
++ }
++
++ g_free(tzid);
++}
++
++static void addsystemtz(gpointer key,
++ gpointer value,
++ gpointer user_data)
++{
++ const char *tzid = key;
++ icalcomponent *comp = user_data;
++ icaltimezone *zone;
++
++ zone = icaltimezone_get_builtin_timezone_from_tzid(tzid);
++ if (zone) {
++ icalcomponent_add_component(comp,
++ icalcomponent_new_clone(icaltimezone_get_component(zone)));
++ }
++}
++
++/**
++ * e_cal_check_timezones:
++ * @comp: a VCALENDAR containing a list of
++ * VTIMEZONE and arbitrary other components, in
++ * arbitrary order: these other components are
++ * modified by this call
++ * @comps: a list of icalcomponent instances which
++ * also have to be patched; may be NULL
++ * @tzlookup: a callback function which is called to retrieve
++ * a calendar's VTIMEZONE definition; the returned
++ * definition is *not* freed by e_cal_check_timezones()
++ * (to be compatible with e_cal_get_timezone());
++ * NULL indicates that no such timezone exists
++ * or an error occurred
++ * @custom: an arbitrary pointer which is passed through to
++ * the tzlookup function
++ * @error: an error description in case of a failure
++ *
++ * This function cleans up VEVENT, VJOURNAL, VTODO and VTIMEZONE
++ * items which are to be imported into Evolution.
++ *
++ * Using VTIMEZONE definitions is problematic because they cannot be
++ * updated properly when timezone definitions change. They are also
++ * incomplete (for compatibility reason only one set of rules for
++ * summer saving changes can be included, even if different rules
++ * apply in different years). This function looks for matches of the
++ * used TZIDs against system timezones and replaces such TZIDs with
++ * the corresponding system timezone. This works for TZIDs containing
++ * a location (found via a fuzzy string search) and for Outlook TZIDs
++ * (via a hard-coded lookup table).
++ *
++ * Some programs generate broken meeting invitations with TZID, but
++ * without including the corresponding VTIMEZONE. Importing such
++ * invitations unchanged causes problems later on (meeting displayed
++ * incorrectly, #e_cal_get_component_as_string fails). The situation
++ * where this occurred in the past (found by a SyncEvolution user) is
++ * now handled via the location based mapping.
++ *
++ * If this mapping fails, this function also deals with VTIMEZONE
++ * conflicts: such conflicts occur when the calendar already contains
++ * an old VTIMEZONE definition with the same TZID, but different
++ * summer saving rules. Replacing the VTIMEZONE potentially breaks
++ * displaying of old events, whereas not replacing it breaks the new
++ * events (the behavior in Evolution <= 2.22.1).
++ *
++ * The way this problem is resolved is by renaming the new VTIMEZONE
++ * definition until the TZID is unique. A running count is appended to
++ * the TZID. All items referencing the renamed TZID are adapted
++ * accordingly.
++ *
++ * Return value: TRUE if successful, FALSE otherwise.
++ */
++gboolean e_cal_check_timezones(icalcomponent *comp,
++ GList *comps,
++ icaltimezone *(*tzlookup)(const char *tzid,
++ const void *custom,
++ GError **error),
++ const void *custom,
++ GError **error)
++{
++ gboolean success = TRUE;
++ icalcomponent *subcomp = NULL;
++ icaltimezone *zone = icaltimezone_new();
++ char *key = NULL, *value = NULL;
++ char *buffer = NULL;
++ char *zonestr = NULL;
++ char *tzid = NULL;
++ GList *l;
++
++ /** a hash from old to new tzid; strings dynamically allocated */
++ GHashTable *mapping = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
++
++ /** a hash of all system time zone IDs which have to be added; strings are shared with mapping hash */
++ GHashTable *systemtzids = g_hash_table_new(g_str_hash, g_str_equal);
++
++ *error = NULL;
++
++ if (!mapping || !zone) {
++ goto nomem;
++ }
++
++ /* iterate over all VTIMEZONE definitions */
++ subcomp = icalcomponent_get_first_component(comp,
++ ICAL_VTIMEZONE_COMPONENT);
++ while (subcomp) {
++ if (icaltimezone_set_component(zone, subcomp)) {
++ g_free(tzid);
++ tzid = g_strdup(icaltimezone_get_tzid(zone));
++ if (tzid) {
++ const char *newtzid = e_cal_match_tzid(tzid);
++ if (newtzid) {
++ /* matched against system time zone */
++ g_free(key);
++ key = g_strdup(tzid);
++ if (!key) {
++ goto nomem;
++ }
++
++ g_free(value);
++ value = g_strdup(newtzid);
++ if (!value) {
++ goto nomem;
++ }
++
++ g_hash_table_insert(mapping, key, value);
++ g_hash_table_insert(systemtzids, value, NULL);
++ key =
++ value = NULL;
++ } else {
++ zonestr = ical_strdup(icalcomponent_as_ical_string(subcomp));
++
++ /* check for collisions with existing timezones */
++ int counter;
++ for (counter = 0;
++ counter < 100 /* sanity limit */;
++ counter++) {
++ icaltimezone *existing_zone;
++
++ if (counter) {
++ g_free(value);
++ value = g_strdup_printf("%s %d", tzid, counter);
++ }
++ existing_zone = tzlookup(counter ? value : tzid,
++ custom,
++ error);
++ if (!existing_zone) {
++ if (*error) {
++ goto failed;
++ } else {
++ break;
++ }
++ }
++ g_free(buffer);
++ buffer = ical_strdup(icalcomponent_as_ical_string(icaltimezone_get_component(existing_zone)));
++
++ if (counter) {
++ char *fulltzid = g_strdup_printf("TZID:%s", value);
++ size_t baselen = strlen("TZID:") + strlen(tzid);
++ size_t fulllen = strlen(fulltzid);
++ char *tzidprop;
++ /*
++ * Map TZID with counter suffix back to basename.
++ */
++ tzidprop = strstr(buffer, fulltzid);
++ if (tzidprop) {
++ memmove(tzidprop + baselen,
++ tzidprop + fulllen,
++ strlen(tzidprop + fulllen) + 1);
++ }
++ g_free(fulltzid);
++ }
++
++
++ /*
++ * If the strings are identical, then the
++ * VTIMEZONE definitions are identical. If
++ * they are not identical, then VTIMEZONE
++ * definitions might still be semantically
++ * correct and we waste some space by
++ * needlesly duplicating the VTIMEZONE. This
++ * is expected to occur rarely (if at all) in
++ * practice.
++ */
++ if (!strcmp(zonestr, buffer)) {
++ break;
++ }
++ }
++
++ if (!counter) {
++ /* does not exist, nothing to do */
++ } else {
++ /* timezone renamed */
++ icalproperty *prop = icalcomponent_get_first_property(subcomp,
++ ICAL_TZID_PROPERTY);
++ while (prop) {
++ icalproperty_set_value_from_string(prop, value, "NO");
++ prop = icalcomponent_get_next_property(subcomp,
++ ICAL_ANY_PROPERTY);
++ }
++ g_free(key);
++ key = g_strdup(tzid);
++ g_hash_table_insert(mapping, key, value);
++ key =
++ value = NULL;
++ }
++ }
++ }
++ }
++
++ subcomp = icalcomponent_get_next_component(comp,
++ ICAL_VTIMEZONE_COMPONENT);
++ }
++
++ /*
++ * now replace all TZID parameters in place
++ */
++ subcomp = icalcomponent_get_first_component(comp,
++ ICAL_ANY_COMPONENT);
++ while (subcomp) {
++ /*
++ * Leave VTIMEZONE unchanged, iterate over properties of
++ * everything else.
++ *
++ * Note that no attempt is made to remove unused VTIMEZONE
++ * definitions. That would just make the code more complex for
++ * little additional gain. However, newly used time zones are
++ * added below.
++ */
++ patch_tzids (subcomp, mapping);
++ subcomp = icalcomponent_get_next_component(comp,
++ ICAL_ANY_COMPONENT);
++ }
++
++ for (l = comps; l; l = l->next) {
++ patch_tzids (l->data, mapping);
++ }
++
++ /*
++ * add system time zones that we mapped to: adding them ensures
++ * that the VCALENDAR remains consistent
++ */
++ g_hash_table_foreach(systemtzids, addsystemtz, comp);
++
++ goto done;
++ nomem:
++ /* set gerror for "out of memory" if possible, otherwise abort via g_error() */
++ *error = g_error_new(E_CALENDAR_ERROR, E_CALENDAR_STATUS_OTHER_ERROR, "out of memory");
++ if (!*error) {
++ g_error("e_cal_check_timezones(): out of memory, cannot proceed - sorry!");
++ }
++ failed:
++ /* gerror should have been set already */
++ success = FALSE;
++ done:
++ if (mapping) {
++ g_hash_table_destroy(mapping);
++ }
++ if (systemtzids) {
++ g_hash_table_destroy(systemtzids);
++ }
++ if (zone) {
++ icaltimezone_free(zone, 1);
++ }
++ g_free(tzid);
++ g_free(zonestr);
++ g_free(buffer);
++ g_free(key);
++ g_free(value);
++
++ return success;
++}
++
++/**
++ * e_cal_tzlookup_ecal:
++ * @custom: must be a valid ECal pointer
++ *
++ * An implementation of the tzlookup callback which clients
++ * can use. Calls #e_cal_get_timezone.
++ */
++icaltimezone *e_cal_tzlookup_ecal(const char *tzid,
++ const void *custom,
++ GError **error)
++{
++ ECal *ecal = (ECal *)custom;
++ icaltimezone *zone = NULL;
++
++ if (e_cal_get_timezone(ecal, tzid, &zone, error)) {
++ g_assert(*error == NULL);
++ return zone;
++ } else {
++ g_assert(*error);
++ if ((*error)->domain == E_CALENDAR_ERROR &&
++ (*error)->code == E_CALENDAR_STATUS_OBJECT_NOT_FOUND) {
++ /*
++ * we had to trigger this error to check for the timezone existance,
++ * clear it and return NULL
++ */
++ g_clear_error(error);
++ }
++ return NULL;
++ }
++}
++
++/**
++ * e_cal_tzlookup_icomp:
++ * @custom: must be a icalcomponent pointer which contains
++ * either a VCALENDAR with VTIMEZONEs or VTIMEZONES
++ * directly
++ *
++ * An implementation of the tzlookup callback which backends
++ * like the file backend can use. Searches for the timezone
++ * in the component list.
++ */
++icaltimezone *e_cal_tzlookup_icomp(const char *tzid,
++ const void *custom,
++ GError **error)
++{
++ icalcomponent *icomp = (icalcomponent *)custom;
++
++ return icalcomponent_get_timezone(icomp, (char *)tzid);
++}
+
+Added: branches/gnome-2-22/calendar/libecal/e-cal-check-timezones.h
+==============================================================================
+--- (empty file)
++++ branches/gnome-2-22/calendar/libecal/e-cal-check-timezones.h Sun Jun 22 11:46:47 2008
+@@ -0,0 +1,48 @@
++/*
++ * Copyright (C) 2008 Novell, Inc.
++ *
++ * Authors: Patrick Ohly <patrick ohly gmx de>
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of version 2 of the GNU Lesser General Public
++ * License as published by the Free Software Foundation.
++ *
++ * 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 Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser 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.
++ */
++
++#ifndef E_CAL_CHECK_TIMEZONES_H
++#define E_CAL_CHECK_TIMEZONES_H
++
++#include <libical/ical.h>
++#include <glib.h>
++
++G_BEGIN_DECLS
++
++gboolean e_cal_check_timezones(icalcomponent *comp,
++ GList *comps,
++ icaltimezone *(*tzlookup)(const char *tzid,
++ const void *custom,
++ GError **error),
++ const void *custom,
++ GError **error);
++
++icaltimezone *e_cal_tzlookup_ecal(const char *tzid,
++ const void *custom,
++ GError **error);
++
++icaltimezone *e_cal_tzlookup_icomp(const char *tzid,
++ const void *custom,
++ GError **error);
++
++const char *e_cal_match_tzid(const char *tzid);
++
++G_END_DECLS
++
++#endif /* E_CAL_CHECK_TIMEZONES_H */
+
+Modified: branches/gnome-2-22/configure.in
+==============================================================================
+--- branches/gnome-2-22/configure.in (original)
++++ branches/gnome-2-22/configure.in Sun Jun 22 11:46:47 2008
+@@ -47,9 +47,9 @@
+ LIBEDATASERVERUI_REVISION=0
+ LIBEDATASERVERUI_AGE=1
+
+-LIBECAL_CURRENT=8
++LIBECAL_CURRENT=9
+ LIBECAL_REVISION=0
+-LIBECAL_AGE=1
++LIBECAL_AGE=2
+
+ LIBEDATACAL_CURRENT=6
+ LIBEDATACAL_REVISION=2
+_______________________________________________
+SVN-commits-list mailing list (read only)
+http://mail.gnome.org/mailman/listinfo/svn-commits-list
+
+Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want.
+Module maintainer? It is possible to set the reply-to to your development mailing list. Email svnmaster gnome org if interested.
Added: trunk/buildbot/jhbuildbot/test/mail/svn-commits-list.3.comments
==============================================================================
--- (empty file)
+++ trunk/buildbot/jhbuildbot/test/mail/svn-commits-list.3.comments Wed Aug 13 14:18:33 2008
@@ -0,0 +1,43 @@
+GNOME Bugzilla #52890: improved time zone handling
+
+This patch adds a new utility function e_cal_check_timezones() to
+libecal. The library version of libecal is bumped in a backwards
+compatible way: code compiled against previous releases still works
+with the extended library.
+
+e_cal_check_timezones() can be used by calendar backends to fix two
+problems:
+
+1. Importing a new meeting invitation into a calendar which already
+contains an old time zone definition ignores the new time zone
+definition. The new meeting is then displayed using the old
+definition.
+
+2. There is no mechanism to update the time zone rules used by
+existing meetings if their time zone changes.
+
+If possible, time zone definitions are mapped to the system time zone
+definitions used by Evolution. Currently this only works for time zone
+definitions which have a known location at the end of their time zone
+identifiers (i.e., older Evolution releases and other programs
+following the Olson database naming scheme). If this mapping works,
+then problem 1 and 2 no longer occur (but see the caveat below).
+
+If the mapping fails, then problem 1 is avoided by checking for an
+existing, conflicting time zone definition first and importing items
+with a renamed time zone definition in such a case.
+
+The caveat with regards to time zone handling is that Evolution only
+uses a subset of the information available for a system time
+zone. Events using a system time zone are only guaranteed to be
+displayed correctly starting at the current time and one year into the
+future. Past events and events even further into the future may be
+displayed incorrectly.
+
+Due to this limitation, past meetings which would have been displayed
+correctly using the time zone information they came with might be
+displayed incorrectly using Evolution's stripped system time zones.
+This limitation needs to be addressed separately in further patches.
+
+e-cal-check-timezones.[ch] are 1:1 copies of
+SyncEvolution/trunk revision 625.
Added: trunk/buildbot/jhbuildbot/test/mail/svn-commits-list.4
==============================================================================
--- (empty file)
+++ trunk/buildbot/jhbuildbot/test/mail/svn-commits-list.4 Wed Aug 13 14:18:33 2008
@@ -0,0 +1,70 @@
+Return-path: <svn-commits-list-bounces gnome org>
+Envelope-to: x469yq unrouted co uk
+Delivery-date: Tue, 01 Jul 2008 08:10:33 +0100
+Received: from menubar.gnome.org ([209.132.176.177])
+ by isshin.unrouted.co.uk with esmtp (Exim 4.63)
+ (envelope-from <svn-commits-list-bounces gnome org>)
+ id 1KDa0X-0000gO-HO
+ for x469yq unrouted co uk; Tue, 01 Jul 2008 08:10:33 +0100
+Received: from menubar.gnome.org (localhost.localdomain [127.0.0.1])
+ by menubar.gnome.org (Postfix) with ESMTP id 0489A75022E;
+ Tue, 1 Jul 2008 07:10:32 +0000 (GMT)
+X-Original-To: svn-commits-list gnome org
+Delivered-To: svn-commits-list gnome org
+Received: from localhost (localhost.localdomain [127.0.0.1])
+ by menubar.gnome.org (Postfix) with ESMTP id A2E11750081
+ for <svn-commits-list gnome org>; Tue, 1 Jul 2008 07:10:28 +0000 (GMT)
+X-Virus-Scanned: by amavisd-new at gnome.org
+X-Spam-Flag: NO
+X-Spam-Score: -2.599
+X-Spam-Level:
+X-Spam-Status: No, score=-2.599 tagged_above=-999 required=2
+ tests=[BAYES_00=-2.599]
+X-Amavis-OS-Fingerprint: Linux 2.6 (newer, 3) (up: 550 hrs), (distance 18,
+ link: ethernet/modem), [91.189.93.3]
+Received: from menubar.gnome.org ([127.0.0.1])
+ by localhost (menubar.gnome.org [127.0.0.1]) (amavisd-new, port 10024)
+ with ESMTP id 5h27zEzaAIxj for <svn-commits-list gnome org>;
+ Tue, 1 Jul 2008 07:10:20 +0000 (GMT)
+Received: from socket.gnome.org (cobalt.canonical.com [91.189.93.3])
+ by menubar.gnome.org (Postfix) with ESMTP id 1F0B5750167
+ for <svn-commits-list gnome org>; Tue, 1 Jul 2008 07:10:20 +0000 (GMT)
+Received: by socket.gnome.org (Postfix, from userid 2182)
+ id 821439AC02F; Tue, 1 Jul 2008 07:10:18 +0000 (UTC)
+From: kmaraas svn gnome org
+To: svn-commits-list gnome org
+Subject: NetworkManager r3792 - trunk/po
+MIME-Version: 1.0
+keywords: NetworkManager
+Message-Id: <20080701071018 821439AC02F socket gnome org>
+Date: Tue, 1 Jul 2008 07:10:18 +0000 (UTC)
+X-Topics: NetworkManager
+X-BeenThere: svn-commits-list gnome org
+X-Mailman-Version: 2.1.10
+Precedence: list
+List-Id: SVN commits <svn-commits-list.gnome.org>
+List-Unsubscribe: <http://mail.gnome.org/mailman/options/svn-commits-list>,
+ <mailto:svn-commits-list-request gnome org?subject=unsubscribe>
+List-Archive: </archives/svn-commits-list>
+List-Post: <mailto:svn-commits-list gnome org>
+List-Help: <mailto:svn-commits-list-request gnome org?subject=help>
+List-Subscribe: <http://mail.gnome.org/mailman/listinfo/svn-commits-list>,
+ <mailto:svn-commits-list-request gnome org?subject=subscribe>
+Content-Type: text/plain; charset="utf-8"
+Content-Transfer-Encoding: base64
+Sender: svn-commits-list-bounces gnome org
+Errors-To: svn-commits-list-bounces gnome org
+
+QXV0aG9yOiBrbWFyYWFzCkRhdGU6IFR1ZSBKdWwgIDEgMDc6MTA6MTggMjAwOApOZXcgUmV2aXNp
+b246IDM3OTIKVVJMOiBodHRwOi8vc3ZuLmdub21lLm9yZy92aWV3dmMvTmV0d29ya01hbmFnZXI/
+cmV2PTM3OTImdmlldz1yZXYKCkxvZzoKMjAwOC0wNy0wMSAgS2phcnRhbiBNYXJhYXMgIDxrbWFy
+YWFzQGdub21lLm9yZz4KCgkqIG5iLnBvOiBVcGRhdGVkIE5vcndlZ2lhbiBib2ttw6VsIHRyYW5z
+bGF0aW9uLgoKTW9kaWZpZWQ6CiAgIHRydW5rL3BvL0NoYW5nZUxvZwogICB0cnVuay9wby9uYi5w
+bwpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpTVk4tY29t
+bWl0cy1saXN0IG1haWxpbmcgbGlzdCAocmVhZCBvbmx5KQpodHRwOi8vbWFpbC5nbm9tZS5vcmcv
+bWFpbG1hbi9saXN0aW5mby9zdm4tY29tbWl0cy1saXN0CgpXYW50IHRvIGxpbWl0IHRoZSBjb21t
+aXRzIHRvIGEgZmV3IG1vZHVsZXM/IEdvIHRvIGFib3ZlIFVSTCwgbG9nIGluIHRvIGVkaXQgeW91
+ciBvcHRpb25zIGFuZCBzZWxlY3QgdGhlIG1vZHVsZXMgKCd0b3BpY3MnKSB5b3Ugd2FudC4KTW9k
+dWxlIG1haW50YWluZXI/IEl0IGlzIHBvc3NpYmxlIHRvIHNldCB0aGUgcmVwbHktdG8gdG8geW91
+ciBkZXZlbG9wbWVudCBtYWlsaW5nIGxpc3QuIEVtYWlsIHN2bm1hc3RlckBnbm9tZS5vcmcgaWYg
+aW50ZXJlc3RlZC4=
Added: trunk/buildbot/jhbuildbot/test/mail/svn-commits-list.5
==============================================================================
--- (empty file)
+++ trunk/buildbot/jhbuildbot/test/mail/svn-commits-list.5 Wed Aug 13 14:18:33 2008
@@ -0,0 +1,114 @@
+Return-path: <svn-commits-list-bounces gnome org>
+Envelope-to: x469yq unrouted co uk
+Delivery-date: Wed, 16 Jul 2008 05:49:43 +0100
+Received: from menubar.gnome.org ([209.132.176.177])
+ by isshin.unrouted.co.uk with esmtp (Exim 4.63)
+ (envelope-from <svn-commits-list-bounces gnome org>)
+ id 1KIyxS-0004mV-U0
+ for x469yq unrouted co uk; Wed, 16 Jul 2008 05:49:43 +0100
+Received: from menubar.gnome.org (localhost.localdomain [127.0.0.1])
+ by menubar.gnome.org (Postfix) with ESMTP id E9793750162;
+ Wed, 16 Jul 2008 04:49:41 +0000 (GMT)
+X-Original-To: svn-commits-list gnome org
+Delivered-To: svn-commits-list gnome org
+Received: from localhost (localhost.localdomain [127.0.0.1])
+ by menubar.gnome.org (Postfix) with ESMTP id D9E2B7500C0
+ for <svn-commits-list gnome org>; Wed, 16 Jul 2008 04:49:32 +0000 (GMT)
+X-Virus-Scanned: by amavisd-new at gnome.org
+X-Spam-Flag: NO
+X-Spam-Score: -2.599
+X-Spam-Level:
+X-Spam-Status: No, score=-2.599 tagged_above=-999 required=2
+ tests=[BAYES_00=-2.599]
+X-Amavis-OS-Fingerprint: Linux 2.6 (newer, 3) (up: 908 hrs), (distance 18,
+ link: ethernet/modem), [91.189.93.3]
+Received: from menubar.gnome.org ([127.0.0.1])
+ by localhost (menubar.gnome.org [127.0.0.1]) (amavisd-new, port 10024)
+ with ESMTP id YqahOU0vh13P for <svn-commits-list gnome org>;
+ Wed, 16 Jul 2008 04:49:05 +0000 (GMT)
+Received: from socket.gnome.org (cobalt.canonical.com [91.189.93.3])
+ by menubar.gnome.org (Postfix) with ESMTP id 788517500BE
+ for <svn-commits-list gnome org>; Wed, 16 Jul 2008 04:49:05 +0000 (GMT)
+Received: by socket.gnome.org (Postfix, from userid 7538)
+ id C4B939AC021; Wed, 16 Jul 2008 04:49:03 +0000 (UTC)
+From: jstowers svn gnome org
+To: svn-commits-list gnome org
+Subject: conduit r1559 - in trunk: . conduit/modules/NetworkModule
+MIME-Version: 1.0
+keywords: conduit
+Message-Id: <20080716044903 C4B939AC021 socket gnome org>
+Date: Wed, 16 Jul 2008 04:49:03 +0000 (UTC)
+X-Topics: conduit
+X-BeenThere: svn-commits-list gnome org
+X-Mailman-Version: 2.1.10
+Precedence: list
+List-Id: SVN commits <svn-commits-list.gnome.org>
+List-Unsubscribe: <http://mail.gnome.org/mailman/options/svn-commits-list>,
+ <mailto:svn-commits-list-request gnome org?subject=unsubscribe>
+List-Archive: </archives/svn-commits-list>
+List-Post: <mailto:svn-commits-list gnome org>
+List-Help: <mailto:svn-commits-list-request gnome org?subject=help>
+List-Subscribe: <http://mail.gnome.org/mailman/listinfo/svn-commits-list>,
+ <mailto:svn-commits-list-request gnome org?subject=subscribe>
+Content-Type: text/plain; charset="us-ascii"
+Content-Transfer-Encoding: 7bit
+Sender: svn-commits-list-bounces gnome org
+Errors-To: svn-commits-list-bounces gnome org
+
+Author: jstowers
+Date: Wed Jul 16 04:49:03 2008
+New Revision: 1559
+URL: http://svn.gnome.org/viewvc/conduit?rev=1559&view=rev
+
+Log:
+Send and check the protocol version over the network module. This will require the maemo packages to be updated
+
+Modified:
+ trunk/ (props changed)
+ trunk/conduit/modules/NetworkModule/Peers.py
+
+Modified: trunk/conduit/modules/NetworkModule/Peers.py
+==============================================================================
+--- trunk/conduit/modules/NetworkModule/Peers.py (original)
++++ trunk/conduit/modules/NetworkModule/Peers.py Wed Jul 16 04:49:03 2008
+@@ -19,6 +19,7 @@
+
+ AVAHI_SERVICE_NAME = "_conduit._tcp"
+ AVAHI_SERVICE_DOMAIN = ""
++PROTOCOL_VERSION = "1"
+
+ PORT_IDX = 0
+ VERSION_IDX = 1
+@@ -165,7 +166,9 @@
+ AVAHI_SERVICE_DOMAIN, #domain
+ '', #host
+ dbus.UInt16(self.port), #port
+- string_array_to_txt_array(["version=%s" % conduit.VERSION])
++ string_array_to_txt_array([
++ "version=%s" % conduit.VERSION,
++ "protocol-version=%s" % PROTOCOL_VERSION])
+ )
+ self.group.Commit()
+
+@@ -243,10 +246,13 @@
+
+ # Check if the service is local and then check the
+ # conduit versions are identical
+- if extra.has_key("version") and extra["version"] == conduit.VERSION:
++ if extra.get("protocol-version", None) == PROTOCOL_VERSION:
+ self.detected_cb(str(name), str(host), str(address), str(port), extra_info)
+ else:
+- log.debug("Ignoring %s because remote conduit is different version" % name)
++ log.debug("Ignoring %s (version: %s, protocol version: %s)" % (
++ name,
++ extra.get("version", "unknown"),
++ extra.get("protocol-version", "unknown")))
+
+ def _remove_service(self, interface, protocol, name, type, domain, flags):
+ """
+_______________________________________________
+SVN-commits-list mailing list (read only)
+http://mail.gnome.org/mailman/listinfo/svn-commits-list
+
+Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want.
+Module maintainer? It is possible to set the reply-to to your development mailing list. Email svnmaster gnome org if interested.
Added: trunk/buildbot/jhbuildbot/test/mail/svn-commits-list.6
==============================================================================
--- (empty file)
+++ trunk/buildbot/jhbuildbot/test/mail/svn-commits-list.6 Wed Aug 13 14:18:33 2008
@@ -0,0 +1,87 @@
+Return-path: <svn-commits-list-bounces gnome org>
+Envelope-to: x469yq unrouted co uk
+Delivery-date: Fri, 18 Jul 2008 19:05:23 +0100
+Received: from menubar.gnome.org ([209.132.176.177])
+ by isshin.unrouted.co.uk with esmtp (Exim 4.63)
+ (envelope-from <svn-commits-list-bounces gnome org>)
+ id 1KJuKZ-0007Ai-1E
+ for x469yq unrouted co uk; Fri, 18 Jul 2008 19:05:23 +0100
+Received: from menubar.gnome.org (localhost.localdomain [127.0.0.1])
+ by menubar.gnome.org (Postfix) with ESMTP id 86EB8750193;
+ Fri, 18 Jul 2008 18:05:21 +0000 (GMT)
+X-Original-To: svn-commits-list gnome org
+Delivered-To: svn-commits-list gnome org
+Received: from localhost (localhost.localdomain [127.0.0.1])
+ by menubar.gnome.org (Postfix) with ESMTP id D7085750166
+ for <svn-commits-list gnome org>; Fri, 18 Jul 2008 18:05:18 +0000 (GMT)
+X-Virus-Scanned: by amavisd-new at gnome.org
+X-Spam-Flag: NO
+X-Spam-Score: -2.599
+X-Spam-Level:
+X-Spam-Status: No, score=-2.599 tagged_above=-999 required=2
+ tests=[BAYES_00=-2.599]
+X-Amavis-OS-Fingerprint: Linux 2.6 (newer, 3) (up: 969 hrs), (distance 18,
+ link: ethernet/modem), [91.189.93.3]
+Received: from menubar.gnome.org ([127.0.0.1])
+ by localhost (menubar.gnome.org [127.0.0.1]) (amavisd-new, port 10024)
+ with ESMTP id ad2+LB+NSQ2b for <svn-commits-list gnome org>;
+ Fri, 18 Jul 2008 18:05:06 +0000 (GMT)
+Received: from socket.gnome.org (cobalt.canonical.com [91.189.93.3])
+ by menubar.gnome.org (Postfix) with ESMTP id 833727500C6
+ for <svn-commits-list gnome org>; Fri, 18 Jul 2008 18:05:06 +0000 (GMT)
+Received: by socket.gnome.org (Postfix, from userid 6211)
+ id AAFBB9AC021; Fri, 18 Jul 2008 18:04:59 +0000 (UTC)
+From: dcbw svn gnome org
+To: svn-commits-list gnome org
+Subject: NetworkManager r3831 - trunk/libnm-util
+MIME-Version: 1.0
+keywords: NetworkManager
+Message-Id: <20080718180459 AAFBB9AC021 socket gnome org>
+Date: Fri, 18 Jul 2008 18:04:59 +0000 (UTC)
+X-Topics: NetworkManager
+X-BeenThere: svn-commits-list gnome org
+X-Mailman-Version: 2.1.10
+Precedence: list
+List-Id: SVN commits <svn-commits-list.gnome.org>
+List-Unsubscribe: <http://mail.gnome.org/mailman/options/svn-commits-list>,
+ <mailto:svn-commits-list-request gnome org?subject=unsubscribe>
+List-Archive: </archives/svn-commits-list>
+List-Post: <mailto:svn-commits-list gnome org>
+List-Help: <mailto:svn-commits-list-request gnome org?subject=help>
+List-Subscribe: <http://mail.gnome.org/mailman/listinfo/svn-commits-list>,
+ <mailto:svn-commits-list-request gnome org?subject=subscribe>
+Content-Type: text/plain; charset="us-ascii"
+Content-Transfer-Encoding: 7bit
+Sender: svn-commits-list-bounces gnome org
+Errors-To: svn-commits-list-bounces gnome org
+
+Author: dcbw
+Date: Fri Jul 18 18:04:59 2008
+New Revision: 3831
+URL: http://svn.gnome.org/viewvc/NetworkManager?rev=3831&view=rev
+
+Log:
+Fix misspelling of MPPE
+
+Modified:
+ trunk/libnm-util/nm-setting-ppp.h
+
+Modified: trunk/libnm-util/nm-setting-ppp.h
+==============================================================================
+--- trunk/libnm-util/nm-setting-ppp.h (original)
++++ trunk/libnm-util/nm-setting-ppp.h Fri Jul 18 18:04:59 2008
+@@ -41,7 +41,7 @@
+ #define NM_SETTING_PPP_NO_VJ_COMP "no-vj-comp"
+ #define NM_SETTING_PPP_REQUIRE_MPPE "require-mppe"
+ #define NM_SETTING_PPP_REQUIRE_MPPE_128 "require-mppe-128"
+-#define NM_SETTING_PPP_MPPE_STATEFUL "mpppe-stateful"
++#define NM_SETTING_PPP_MPPE_STATEFUL "mppe-stateful"
+ #define NM_SETTING_PPP_CRTSCTS "crtscts"
+ #define NM_SETTING_PPP_BAUD "baud"
+ #define NM_SETTING_PPP_MRU "mru"
+_______________________________________________
+SVN-commits-list mailing list (read only)
+http://mail.gnome.org/mailman/listinfo/svn-commits-list
+
+Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want.
+Module maintainer? It is possible to set the reply-to to your development mailing list. Email svnmaster gnome org if interested.
Added: trunk/buildbot/jhbuildbot/test/test_mail.py
==============================================================================
--- (empty file)
+++ trunk/buildbot/jhbuildbot/test/test_mail.py Wed Aug 13 14:18:33 2008
@@ -0,0 +1,68 @@
+
+from twisted.trial import unittest
+from twisted.python import util
+
+from jhbuildbot import changes
+
+class TestGnomeMaildirSource(unittest.TestCase):
+
+ def get(self, msg):
+ msg = util.sibpath(__file__, msg)
+ s = changes.GnomeMaildirSource(None)
+ return s.parse_file(open(msg, "r"))
+
+ def read(self, path):
+ path = util.sibpath(__file__, path)
+ return open(path).read().rstrip()
+
+ def testMsg1(self):
+ c = self.get("mail/svn-commits-list.1")
+ self.assertEqual(c.who, "lapo")
+ self.assertEqual(c.files, ['trunk/22x22/actions/zoom-fit-best.svg', 'trunk/22x22/actions/zoom-in.svg',
+ 'trunk/22x22/actions/zoom-original.svg', 'trunk/22x22/actions/zoom-out.svg',
+ 'trunk/22x22/actions/zoom-fit-best.xcf.bz2', 'trunk/22x22/actions/zoom-in.xcf.bz2',
+ 'trunk/22x22/actions/zoom-original.xcf.bz2', 'trunk/22x22/actions/zoom-out.xcf.bz2',
+ 'trunk/22x22/actions/zoom-fit-best.png', 'trunk/22x22/actions/zoom-in.png',
+ 'trunk/22x22/actions/zoom-original.png', 'trunk/22x22/actions/zoom-out.png',
+ 'trunk/24x24/actions/zoom-fit-best.png', 'trunk/24x24/actions/zoom-in.png',
+ 'trunk/24x24/actions/zoom-original.png', 'trunk/24x24/actions/zoom-out.png', 'trunk/ChangeLog'])
+ self.assertEqual(c.comments, 'redid 22x22 zoom actions in svg.')
+ self.assertEqual(c.isdir, 0)
+ self.assertEqual(c.revision, '1820')
+ self.assertEqual(c.links, ['http://svn.gnome.org/viewvc/gnome-icon-theme?rev=1820&view=rev'])
+
+ def testMsg2(self):
+ c = self.get("mail/svn-commits-list.2")
+ self.assertEqual(c.who, "timj")
+ self.assertEqual(c.files, ['trunk/gtk/gtkcontainer.h'])
+ self.assertEqual(c.comments, '* gtk/gtkcontainer.h: seal members.')
+ self.assertEqual(c.revision, '20514')
+ self.assertEqual(c.links, ['http://svn.gnome.org/viewvc/gtk+?rev=20514&view=rev'])
+
+ def testMsg3(self):
+ c = self.get("mail/svn-commits-list.3")
+ self.assertEqual(c.who, "pohly")
+ self.assertEqual(c.files, ['branches/gnome-2-22/calendar/libecal/e-cal-check-timezones.c',
+ 'branches/gnome-2-22/calendar/libecal/e-cal-check-timezones.h',
+ 'branches/gnome-2-22/calendar/libecal/Makefile.am',
+ 'branches/gnome-2-22/configure.in'])
+ self.assertEqual(c.comments, self.read('mail/svn-commits-list.3.comments'))
+ self.assertEqual(c.revision, '9023')
+ self.assertEqual(c.links, ['http://svn.gnome.org/viewvc/evolution-data-server?rev=9023&view=rev'])
+
+ def testMsg4(self):
+ c = self.get("mail/svn-commits-list.4")
+ self.assertEqual(c.who, "kmaraas")
+ self.assertEqual(c.files, [])
+ self.assertEqual(c.comments, '')
+ self.assertEqual(c.revision, None)
+ self.assertEqual(c.links, [])
+
+ def testMsg5(self):
+ c = self.get("mail/svn-commits-list.5")
+ self.assertEqual(c.who, "jstowers")
+ self.assertEqual(c.files, ['trunk/ (props changed)', 'trunk/conduit/modules/NetworkModule/Peers.py'])
+ self.assertEqual(c.comments, 'Send and check the protocol version over the network module. This will require the maemo packages to be updated')
+ self.assertEqual(c.revision, '1559')
+ self.assertEqual(c.links, ['http://svn.gnome.org/viewvc/conduit?rev=1559&view=rev'])
+
Added: trunk/buildbot/master.cfg
==============================================================================
--- (empty file)
+++ trunk/buildbot/master.cfg Wed Aug 13 14:18:33 2008
@@ -0,0 +1,193 @@
+# -*- python -*-
+# ex: set syntax=python:
+
+# This is a sample buildmaster config file. It must be installed as
+# 'master.cfg' in your buildmaster's base directory (although the filename
+# can be changed with the --basedir option to 'mktap buildbot master').
+
+# It has one job: define a dictionary named BuildmasterConfig. This
+# dictionary has a variety of keys to control different aspects of the
+# buildmaster. They are documented in docs/config.xhtml .
+
+
+# This is the dictionary that the buildmaster pays attention to. We also use
+# a shorter alias to save typing.
+c = BuildmasterConfig = {}
+
+####### JHBUILD
+
+c['jhbuild'] = "~/bin/jhbuild"
+c['jhbuildrc'] = "/home/fred/.jhbuildrc"
+c['moduleset'] = "gnome-2.24"
+c['modules'] = "meta-gnome-desktop"
+
+####### BUILDSLAVES
+
+# the 'slaves' list defines the set of allowable buildslaves. Each element is
+# a tuple of bot-name and bot-password. These correspond to values given to
+# the buildslave's mktap invocation.
+from buildbot.buildslave import BuildSlave
+c['slaves'] = [
+ BuildSlave('slavename', 'password')
+]
+
+# to limit to two concurrent builds on a slave, use
+# c['slaves'] = [BuildSlave("bot1name", "bot1passwd", max_builds=2)]
+
+
+# 'slavePortnum' defines the TCP port to listen on. This must match the value
+# configured into the buildslaves (with their --master option)
+
+c['slavePortnum'] = 9070
+
+####### PROJECTS
+
+# the 'projects' list defines which jhbuild modules that to build
+from jhbuildbot import jhbuild_list
+c['projects'] = jhbuild_list(c, c['moduleset'], c['modules'])
+
+####### CHANGESOURCES
+
+# the 'change_source' setting tells the buildmaster how it should find out
+# about source code changes. Any class which implements IChangeSource can be
+# put here: there are several in buildbot/changes/*.py to choose from.
+
+# Eventually we want to trigger builds using svn-commits-list
+# import os
+# from jhbuildbot.changes import GnomeMaildirSource
+# c['change_source'] = GnomeMaildirSource(os.path.expanduser('~/Maildir'), prefix=None)
+
+# But for now, lets just inject them
+from buildbot.changes.pb import PBChangeSource
+c['change_source'] = PBChangeSource()
+
+# For example, if you had CVSToys installed on your repository, and your
+# CVSROOT/freshcfg file had an entry like this:
+#pb = ConfigurationSet([
+# (None, None, None, PBService(userpass=('foo', 'bar'), port=4519)),
+# ])
+
+# then you could use the following buildmaster Change Source to subscribe to
+# the FreshCVS daemon and be notified on every commit:
+#
+#from buildbot.changes.freshcvs import FreshCVSSource
+#fc_source = FreshCVSSource("cvs.example.com", 4519, "foo", "bar")
+#c['change_source'] = fc_source
+
+# or, use a PBChangeSource, and then have your repository's commit script run
+# 'buildbot sendchange', or use contrib/svn_buildbot.py, or
+# contrib/arch_buildbot.py :
+#
+#from buildbot.changes.pb import PBChangeSource
+#c['change_source'] = PBChangeSource()
+
+####### SCHEDULERS
+
+## configure the Schedulers
+from jhbuildbot.scheduler import SerialScheduler
+c['schedulers'] = []
+for slave in c['slaves']:
+ s = None
+ for project in c['projects']:
+ buildername = "%s-%s" % (project, slave.slavename)
+ s = SerialScheduler(buildername, upstream=s,
+ builderNames=[buildername])
+ c['schedulers'].append(s)
+
+####### BUILDERS
+
+# the 'builders' list defines the Builders. Each one is configured with a
+# dictionary, using the following keys:
+# name (required): the name used to describe this bilder
+# slavename (required): which slave to use, must appear in c['bots']
+# builddir (required): which subdirectory to run the builder in
+# factory (required): a BuildFactory to define how the build is run
+# periodicBuildTime (optional): if set, force a build every N seconds
+
+# buildbot/process/factory.py provides several BuildFactory classes you can
+# start with, which implement build processes for common targets (GNU
+# autoconf projects, CPAN perl modules, etc). The factory.BuildFactory is the
+# base class, and is configured with a series of BuildSteps. When the build
+# is run, the appropriate buildslave is told to execute each Step in turn.
+
+# the first BuildStep is typically responsible for obtaining a copy of the
+# sources. There are source-obtaining Steps in buildbot/steps/source.py for
+# CVS, SVN, and others.
+
+from jhbuildbot.factory import JHBuildFactory
+c['builders'] = []
+for project in c['projects']:
+ for slave in c['slaves']:
+ f = JHBuildFactory(project, c['moduleset'])
+ c['builders'].append({
+ 'name' : "%s-%s" % (project, slave.slavename),
+ 'slavename' : slave.slavename,
+ 'builddir' : 'builddir/%s.%s' % (project, slave.slavename),
+ 'factory' : f,
+ 'category' : project
+ })
+
+####### STATUS TARGETS
+
+# 'status' is a list of Status Targets. The results of each build will be
+# pushed to these targets. buildbot/status/*.py has a variety to choose from,
+# including web pages, email senders, and IRC bots.
+
+c['status'] = []
+
+from jhbuildbot.status.web import JHBuildWebStatus
+c['status'].append(
+ JHBuildWebStatus(c['moduleset'], c['projects'], [x.slavename for x in c['slaves']],
+ http_port=8080, allowForce=True)
+)
+
+# from buildbot.status import mail
+# c['status'].append(mail.MailNotifier(fromaddr="buildbot localhost",
+# extraRecipients=["builds example com"],
+# sendToInterestedUsers=False))
+#
+# from buildbot.status import words
+# c['status'].append(words.IRC(host="irc.example.com", nick="bb",
+# channels=["#example"]))
+#
+# from buildbot.status import client
+# c['status'].append(client.PBListener(9988))
+
+
+####### DEBUGGING OPTIONS
+
+# if you set 'debugPassword', then you can connect to the buildmaster with
+# the diagnostic tool in contrib/debugclient.py . From this tool, you can
+# manually force builds and inject changes, which may be useful for testing
+# your buildmaster without actually commiting changes to your repository (or
+# before you have a functioning 'sources' set up). The debug tool uses the
+# same port number as the slaves do: 'slavePortnum'.
+
+#c['debugPassword'] = "debugpassword"
+
+# if you set 'manhole', you can ssh into the buildmaster and get an
+# interactive python shell, which may be useful for debugging buildbot
+# internals. It is probably only useful for buildbot developers. You can also
+# use an authorized_keys file, or plain telnet.
+#from buildbot import manhole
+#c['manhole'] = manhole.PasswordManhole("tcp:9999:interface=127.0.0.1",
+# "admin", "password")
+
+
+####### PROJECT IDENTITY
+
+# the 'projectName' string will be used to describe the project that this
+# buildbot is working on. For example, it is used as the title of the
+# waterfall HTML page. The 'projectURL' string will be used to provide a link
+# from buildbot HTML pages to your project's home page.
+
+c['projectName'] = "GNOME Buildbot"
+c['projectURL'] = "http://www.gnome.org"
+
+# the 'buildbotURL' string should point to the location where the buildbot's
+# internal web server (usually the html.Waterfall page) is visible. This
+# typically uses the port number set in the Waterfall 'status' entry, but
+# with an externally-visible host name which the buildbot cannot figure out
+# without some help.
+
+c['buildbotURL'] = "http://localhost:8010/"
Added: trunk/buildbot/public_html/bar.png
==============================================================================
Binary file. No diff available.
Added: trunk/buildbot/public_html/buildbot.css
==============================================================================
--- (empty file)
+++ trunk/buildbot/public_html/buildbot.css Wed Aug 13 14:18:33 2008
@@ -0,0 +1,43 @@
+a:visited {
+ color: #800080;
+}
+
+td.Event, td.BuildStep, td.Activity, td.Change, td.Time, td.Builder {
+ border-top: 1px solid;
+ border-right: 1px solid;
+}
+
+td.box {
+ border: 1px solid;
+}
+
+/* Activity states */
+.offline {
+ background-color: red;
+}
+.idle {
+ background-color: white;
+}
+.waiting {
+ background-color: yellow;
+}
+.building {
+ background-color: yellow;
+}
+
+/* LastBuild, BuildStep states */
+.success {
+ background-color: #72ff75;
+}
+.failure {
+ background-color: red;
+}
+.warnings {
+ background-color: #ff8000;
+}
+.exception {
+ background-color: #c000c0;
+}
+.start,.running {
+ background-color: yellow;
+}
Added: trunk/buildbot/public_html/cyan-bar.png
==============================================================================
Binary file. No diff available.
Added: trunk/buildbot/public_html/download.png
==============================================================================
Binary file. No diff available.
Added: trunk/buildbot/public_html/emptyimg.png
==============================================================================
Binary file. No diff available.
Added: trunk/buildbot/public_html/error.png
==============================================================================
Binary file. No diff available.
Added: trunk/buildbot/public_html/feed-atom.png
==============================================================================
Binary file. No diff available.
Added: trunk/buildbot/public_html/feed.png
==============================================================================
Binary file. No diff available.
Added: trunk/buildbot/public_html/figure.png
==============================================================================
Binary file. No diff available.
Added: trunk/buildbot/public_html/foot-16.png
==============================================================================
Binary file. No diff available.
Added: trunk/buildbot/public_html/foot.png
==============================================================================
Binary file. No diff available.
Added: trunk/buildbot/public_html/general_bg.png
==============================================================================
Binary file. No diff available.
Added: trunk/buildbot/public_html/general_separator.png
==============================================================================
Binary file. No diff available.
Added: trunk/buildbot/public_html/gnome-16.png
==============================================================================
Binary file. No diff available.
Added: trunk/buildbot/public_html/gnome-64.png
==============================================================================
Binary file. No diff available.
Added: trunk/buildbot/public_html/gnome-gtp.png
==============================================================================
Binary file. No diff available.
Added: trunk/buildbot/public_html/green-bar.png
==============================================================================
Binary file. No diff available.
Added: trunk/buildbot/public_html/images.jpeg
==============================================================================
Binary file. No diff available.
Added: trunk/buildbot/public_html/index.html
==============================================================================
--- (empty file)
+++ trunk/buildbot/public_html/index.html Wed Aug 13 14:18:33 2008
@@ -0,0 +1,29 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15">
+<title>Welcome to the Buildbot</title>
+</head>
+
+<body>
+<h1>Welcome to the Buildbot!</h1>
+
+<ul>
+ <li>the <a href="waterfall">Waterfall Display</a> will give you a
+ time-oriented summary of recent buildbot activity.</li>
+
+ <li>The <a href="one_box_per_builder">Latest Build</a> for each builder is
+ here.</li>
+
+ <li><a href="one_line_per_build">Recent Builds</a> are summarized here, one
+ per line.</li>
+
+ <li><a href="buildslaves">Buildslave</a> information</li>
+ <li><a href="changes">ChangeSource</a> information.</li>
+
+ <br />
+ <li><a href="about">About this Buildbot</a></li>
+</ul>
+
+
+</body> </html>
Added: trunk/buildbot/public_html/info.png
==============================================================================
Binary file. No diff available.
Added: trunk/buildbot/public_html/lgo.css
==============================================================================
--- (empty file)
+++ trunk/buildbot/public_html/lgo.css Wed Aug 13 14:18:33 2008
@@ -0,0 +1,625 @@
+body {
+ margin: 0px;
+ padding: 0px;
+ font-family: sans-serif;
+ background: white;
+ color: black;
+ height: 101%;
+}
+
+body.with-star {
+ background: white url(star.png) -100px -200px no-repeat;
+}
+
+#page {
+ margin: 0px;
+ padding: 0px;
+}
+
+div.in-column {
+ margin: 0 0 2em 1em;
+ float: right;
+ max-width: 12em;
+}
+
+hr {
+ color: #888;
+ background: #888;
+ border: 0;
+ height: 1px;
+ width: 90%;
+ text-align: center;
+ clear: both;
+}
+
+
+div.body {
+ clear: both;
+}
+
+
+div.sidebar {
+ position: absolute;
+ text-align: left;
+ right: 0px;
+ top: 60px;
+ width: 27ex;
+ padding-left: 1ex;
+ border-left: 1ex solid #eee;
+ margin-top: 4em;
+}
+
+div.sidebar h2 {
+ margin-top: 0;
+ padding: 5px 2ex 5px 2ex;
+ background: url(t.png) top left repeat-y;
+ font-size: 100%;
+}
+
+ul.i18n,
+ul.toc {
+ padding: 0;
+ padding-left: 20px;
+ margin: 0;
+ margin-right: 10px;
+ list-style: none;
+}
+
+ul.i18n li,
+ul.toc li {
+ margin: 0;
+ margin-left: 1em;
+ padding: 0;
+ list-style: circle;
+}
+
+ul.toc li a {
+ text-decoration: none;
+ color: black;
+}
+
+ul.toc li a:hover {
+ text-decoration: underline;
+}
+
+#general {
+ list-style: none;
+ background: #2E3436 url(general_bg.png) 0 100% repeat-x;
+ text-align: right;
+ padding: 0 1ex;
+ margin: 0;
+ font-size: 70%;
+}
+
+#general li {
+ display: inline;
+ background: url(general_separator.png) 0 0 no-repeat;
+ padding-top: 10px;
+ padding-bottom: 8px;
+ margin-left: 0px;
+ margin-top: 0px;
+}
+
+#general li a {
+ font-weight: bold;
+ color: #FFFFFF;
+ margin: 0 2ex;
+ text-decoration: none;
+ line-height: 30px;
+}
+
+#general li a:hover {
+ text-decoration: underline;
+}
+
+#general .home {
+ float: left;
+ background: url(general_separator.png) 100% 0 no-repeat;
+ padding-top: 0;
+ padding-bottom: 0;
+}
+
+#general .home a {
+ float: left;
+ background: url(foot.png) 7px 50% no-repeat;
+ margin-left: 0;
+ padding-left: 27px;
+}
+
+
+#header {
+ background: #729FCF url(nobody.png) 15px 10px no-repeat;
+ float: left;
+ width: 100%;
+ font-size: 75%;
+}
+
+#header h1 {
+ margin: 0;
+ margin-left: 85px;
+ padding-top: 25px;
+ font-size: 200%;
+ color: #eeeeec;
+}
+
+#tabs {
+ background: url(bar.png) 0 100% repeat-x;
+ width: 100%;
+ float: left;
+ margin: 0;
+ padding: 0;
+}
+
+#portal-globalnav {
+ float: right;
+ list-style: none;
+ margin: 0;
+ margin-right: 3ex;
+}
+
+#portal-globalnav li {
+ float: left;
+ margin: 0;
+ margin-left: 0.2ex;
+ font-size: 2ex;
+}
+
+#portal-globalnav li a:hover {
+ color: #111111;
+}
+
+#portal-globalnav li a {
+ float: left;
+ text-decoration: none;
+ color: #555555;
+ background: url(tab_left.png) 0 0 no-repeat;
+ padding: 7px 0 7px 7px;
+ border-bottom: 2px solid #CCCCCC;
+}
+
+#portal-globalnav li span {
+ background: url(tab_right.png) 100% 0 no-repeat;
+ padding: 7px 28px 7px 19px;
+}
+
+#portal-globalnav li.selected a {
+ color: #3566A5;
+ background: url(tab_left.png) 0 -57px no-repeat;
+ border-bottom: none;
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+
+#portal-globalnav li.selected a span {
+ background: url(tab_right.png) 100% -57px no-repeat;
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+
+
+
+div.articleinfo h1 {
+ padding-top: 1ex;
+ color: #3f3f3f;
+}
+
+div.articleinfo h3.abstract {
+ font-weight: normal;
+ border: 5px solid #eee;
+ padding: 1ex;
+ -moz-border-radius: 10px;
+ -khtml-border-radius: 10px;
+ font-size: 100%;
+ background: white;
+}
+
+div.articleinfo dd.affiliation {
+ color: #a4a4a4;
+ margin-bottom: 1ex;
+}
+
+div.articleinfo dl {
+ margin-left: 1em;
+}
+
+dl.doc-index {
+ margin-left: 1em;
+}
+
+dl.doc-index p {
+ margin: 0.5ex 0;
+}
+
+dl.doc-index dt {
+ margin-top: 2em;
+}
+
+dl.doc-index dd {
+ margin: 0em 1em 2em 1em;
+}
+
+dl.doc-index dt a {
+ border-bottom: 1px dotted #888;
+ text-decoration: none;
+ font-weight: bold;
+ font-size: 110%;
+}
+
+dl.doc-index dt a:hover {
+ border-bottom: 1px solid transparent;
+}
+
+div.body {
+ background-color: transparent;
+ border: none;
+ padding: 1em;
+}
+
+div.body-sidebar {
+ margin-right: 27ex;
+}
+
+a {
+ color: #3465a4;
+}
+
+div.navbar {
+ margin: 0 29ex 0 2ex;
+}
+
+h1.title {
+ font-size: 1.72em;
+ margin: 0; padding: 0;
+ color: #3f3f3f;
+}
+
+h1.title a {
+ color: inherit;
+ text-decoration: none;
+}
+
+div#language {
+ position: absolute;
+ right: 2em;
+ top: 6ex;
+}
+
+/* from goran css */
+
+#dev, #usr, #adm {
+ float: left;
+ margin: 20px 3% 0px 3%;
+ width: 42%;
+ padding: 5px;
+}
+
+div.sidebar #dev, div.sidebar #usr, div.sidebar #adm {
+ float: none;
+ width: 90%;
+ font-size: 90%;
+ margin-top: 0;
+}
+
+br.clear {
+ clear: both;
+}
+
+#dev p, #usr p, #adm p {
+ margin: 20px;
+}
+
+#usr h2 a, #usr h2 span,
+#dev h2 a, #dev h2 span,
+#adm h2 a, #adm h2 span {
+ display: block; width: 80%;
+ text-decoration: none;
+ padding: 10px 20px;
+}
+#usr h2 a, #usr h2 span { color: #ffffff; }
+#dev h2 a, #dev h2 span { color: #2e3436; }
+#adm h2 a, #adm h2 span { color: #ffffff; }
+
+#usr h2, #dev h2, #adm h2 {
+ height: 40px;
+ font-size: 11pt;
+ -moz-border-radius: 10px;
+ -khtml-border-radius: 10px;
+ padding: 0px;
+ background: none;
+}
+
+#usr h2 { background: #729fcf url(user-icon.png) 95% no-repeat; }
+#dev h2 { background: #edd400 url(dev-icon.png) 95% no-repeat; }
+#adm h2 { background: #00b147 url(adm-icon.png) 95% no-repeat; }
+
+#updated h3 { margin-bottom: 15px; }
+
+div.sidebar h4 a {
+ text-decoration: none;
+ margin: 0px;
+}
+div.sidebar p.i18n {
+ margin-top: -15px;
+}
+
+div.sidebar fieldset {
+ margin-top: 30px;
+ border: none;
+}
+
+table#top {
+ margin: 1em auto;
+ clear: both;
+ border: 1px solid #faa;
+ background: #fee;
+ width: 95%;
+}
+
+div.book, div.chapter, div.refentry, div.sect1, div.index {
+ margin: 1em;
+}
+
+.synopsis, .classsynopsis
+{
+ background: #eee;
+ border: solid 1px #aaa;
+ padding: 0.5em;
+}
+.programlisting
+{
+ background: #eef;
+ border: solid 1px #aaf;
+ padding: 0.5em;
+}
+.variablelist
+{
+ padding: 4px;
+ margin-left: 3em;
+}
+.variablelist td:first-child
+{
+ vertical-align: top;
+}
+
+div.other-languages ul, div.downloads ul {
+ list-style: none;
+ padding: 0 1em;
+ margin: 0;
+}
+
+div.other-languages ul li, div.downloads ul li {
+ margin: 0;
+ padding: 0;
+}
+
+div.other-languages a, div.downloads a {
+ text-decoration: none;
+}
+
+div.other-languages a:hover, div.downloads a:hover {
+ text-decoration: underline;
+}
+
+ul.versions {
+ margin: 0;
+ padding: 0;
+ padding-left: 1em;
+}
+
+ul.versions li {
+ display: inline;
+ margin: 0 0.5ex;
+}
+
+h2.category {
+ background-position: center left;
+ background-repeat: no-repeat;
+ margin-top: 2em;
+ color: #006;
+ min-height: 32px;
+}
+
+h2.cat-accessibility-directory { padding-left: 40px; background-image: url(icons/accessibility-directory.png); }
+h2.cat-gnome-util { padding-left: 40px; background-image: url(icons/gnome-util.png); }
+h2.cat-gnome-joystick { padding-left: 40px; background-image: url(icons/gnome-joystick.png); }
+h2.cat-gnome-graphics { padding-left: 40px; background-image: url(icons/gnome-graphics.png); }
+h2.cat-gnome-globe { padding-left: 40px; background-image: url(icons/gnome-globe.png); }
+h2.cat-gnome-applications { padding-left: 40px; background-image: url(icons/gnome-applications.png); }
+h2.cat-gnome-other { padding-left: 40px; background-image: url(icons/gnome-other.png); }
+h2.cat-gnome-devel { padding-left: 40px; background-image: url(icons/gnome-devel.png); }
+h2.cat-gnome-multimedia { padding-left: 40px; background-image: url(icons/gnome-multimedia.png); }
+h2.cat-gnome-system { padding-left: 40px; background-image: url(icons/gnome-system.png); }
+
+h2.cat-gdp-documentation { padding-left: 40px; background-image: url(icons/gdp-32.png); }
+
+h3.subsection {
+ color: #006;
+ font-style: italic;
+ margin-left: 1ex;
+}
+
+span.lang-code {
+ font-size: 70%;
+ color: #666;
+}
+
+li.active-language {
+ font-weight: bold;
+ margin-bottom: 1ex;
+}
+
+p.no-translation {
+ font-style: italic;
+ color: #888;
+ font-size: 80%;
+}
+
+p.no-translation a {
+ text-decoration: none;
+}
+
+div.subindex {
+ margin: 2em 7em 1em 4em;
+ padding-left: 110px;
+ background-position: top left;
+ background-repeat: no-repeat;
+ min-height: 96px;
+}
+
+div.subindex p {
+ color: #666;
+}
+
+div.subindex h2 {
+ padding: 0;
+ margin: 0;
+}
+
+div.subindex h2 a {
+ text-decoration: inherit;
+ border-bottom: 1px dotted #888;
+}
+
+div.subindex h2 a:hover {
+ border-bottom: 1px solid black;
+}
+
+h1.subindex {
+ padding-left: 110px;
+ background-position: top left;
+ background-repeat: no-repeat;
+ line-height: 96px;
+ min-height: 96px;
+}
+
+#subindex-references { background-image: url(icons/api-96.png); }
+#subindex-guides { background-image: url(icons/guides-96.png); }
+#subindex-tools { background-image: url(icons/tools-96.png); }
+#subindex-gdp { background-image: url(icons/gdp-96.png); }
+
+div#search {
+ position: absolute;
+ text-align: right;
+ right: 1em;
+ top: 5em;
+ font-size: 75%;
+}
+
+form#symlookup {
+ margin: 2em 1em 2em 0em;
+ text-align: right;
+}
+
+input.searchTerms {
+ border: 1px solid #888888;
+}
+
+div#search input.searchTerms {
+ margin-right: 1ex;
+}
+
+input.searchButton {
+ background: white url(search_icon.gif) no-repeat scroll 2px center;
+ cursor: pointer;
+ padding: 1px 1px 1px 15px;
+ text-transform: none;
+ border: 1px solid #888888;
+}
+
+form#symlookup input.searchTerms {
+ width: 100%;
+ margin-bottom: 1ex;
+}
+
+p.other-versions {
+ font-size: 80%;
+ color: #888;
+}
+
+p.other-versions a {
+ text-decoration: none;
+}
+
+p.upcoming-deprecation {
+ padding: 0.5em 1em 0.5em 60px;
+ min-height: 48px;
+ border: solid 1px #e0e0df;
+ background-color: #fffff0;
+ background-position: 6px 0.5em;
+ background-repeat: no-repeat;
+ background-image: url(/skin/admon-warning.png);
+}
+
+p.canonical-ref {
+ padding: 0.5em 1em 0.5em 60px;
+ min-height: 48px;
+ border: solid 1px #e0e0df;
+ margin-right: 29ex;
+ background-color: #fffff0;
+ background-position: 6px 0.5em;
+ background-repeat: no-repeat;
+ background-image: url(/skin/admon-note.png);
+}
+
+ul.indextoc {
+ margin: 1em 0;
+ padding: 0 0 0 1em;
+ list-style: circle;
+}
+
+ul.indextoc ul {
+ padding: 0 0 0 1em;
+}
+
+ul.indextoc li {
+ font-weight: bold;
+}
+
+ul.indextoc li li {
+ font-weight: normal;
+}
+
+ul.indextoc ul {
+ margin-bottom: 1ex;
+}
+ul.indextoc a {
+ border-bottom: 1px dotted #888;
+ text-decoration: none;
+}
+
+div.downloads h4 {
+ min-height: 24px;
+ line-height: 24px;
+ background: transparent url(gnome-mime-application-x-archive.png) top left no-repeat;
+ padding-left: 26px;
+}
+
+div.downloads p.devhelp-note {
+ font-size: 80%;
+}
+
+div.downloads p.devhelp-note {
+ font-size: 80%;
+ color: #444;
+}
+
+span.module-more {
+ font-size: 75%;
+}
+
+dl.doc-index dt span.module-more a {
+ font-weight: normal;
+}
+
+/* From classic */
+td.Change, td.Time, td.Event {
+ background: #e0e0e0;
+}
+
+td.Event, td.BuildStep, td.Activity, td.Change, td.Time, td.Builder, td.LastBuild {
+ border-top: 1px solid;
+ border-right: 1px solid;
+ border-bottom: 1px solid;
+ border-left: 1px solid;
+}
+
Added: trunk/buildbot/public_html/logo.png
==============================================================================
Binary file. No diff available.
Added: trunk/buildbot/public_html/nobody.png
==============================================================================
Binary file. No diff available.
Added: trunk/buildbot/public_html/purple-bar.png
==============================================================================
Binary file. No diff available.
Added: trunk/buildbot/public_html/red-bar.png
==============================================================================
Binary file. No diff available.
Added: trunk/buildbot/public_html/robots.txt
==============================================================================
--- (empty file)
+++ trunk/buildbot/public_html/robots.txt Wed Aug 13 14:18:33 2008
@@ -0,0 +1,9 @@
+User-agent: *
+Disallow: /waterfall
+Disallow: /builders
+Disallow: /changes
+Disallow: /buildslaves
+Disallow: /schedulers
+Disallow: /one_line_per_build
+Disallow: /one_box_per_builder
+Disallow: /xmlrpc
Added: trunk/buildbot/public_html/star.png
==============================================================================
Binary file. No diff available.
Added: trunk/buildbot/public_html/t.png
==============================================================================
Binary file. No diff available.
Added: trunk/buildbot/public_html/tab_left.png
==============================================================================
Binary file. No diff available.
Added: trunk/buildbot/public_html/tab_right.png
==============================================================================
Binary file. No diff available.
Added: trunk/buildbot/public_html/warn.png
==============================================================================
Binary file. No diff available.
Added: trunk/buildbot/public_html/webpage.png
==============================================================================
Binary file. No diff available.
Added: trunk/buildbot/template.html
==============================================================================
--- (empty file)
+++ trunk/buildbot/template.html Wed Aug 13 14:18:33 2008
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en"><head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>@@GNOME_BUILDBOT_TITLE@@</title>
+ <link rel="stylesheet" type="text/css" href="/lgo.css">
+ <link rel="icon" type="image/png" href="/gnome-16.png">
+ <link rel="SHORTCUT ICON" type="image/png" href="/gnome-16.png">
+
+<!--[if IE]>
+<style>
+div.body-sidebar { width: 100%; }
+</style>
+<![endif]-->
+
+<style type="text/css">
+table.ProjectSummary tbody th {
+ text-align: left;
+}
+td.success {
+ background: #8f8;
+}
+td.failure {
+ background: #f88;
+}
+td.building {
+ background: #ff8;
+}
+td.idle {
+ color: #888;
+ background: #f8f8f8;
+}
+td.offline {
+ color: #000;
+ background: #f88;
+}
+table.ProjectSummary tbody td {
+ border: 1px solid #888;
+ padding: 0 3px;
+}
+table.ProjectSummary tbody td.RSS {
+ border: none;
+ padding-right: 2px;
+}
+table.ProjectSummary tbody td.Atom {
+ border: none;
+ padding-right: 2px;
+}
+a img {
+ border: none;
+}
+</style>
+
+</head><body class="with-star">
+<div id="page">
+<ul id="general">
+<li id="siteaction-gnome_home" class="home"><a href="http://www.gnome.org/">Home</a></li>
+<li id="siteaction-gnome_news"><a href="http://news.gnome.org/">News</a></li>
+<li id="siteaction-gnome_projects"><a href="http://www.gnome.org/projects/">Projects</a></li>
+<li id="siteaction-gnome_art"><a href="http://art.gnome.org/">Art</a></li>
+<li id="siteaction-gnome_support"><a href="http://www.gnome.org/support/">Support</a></li>
+<li id="siteaction-gnome_development"><a href="http://developer.gnome.org/">Development</a></li>
+<li id="siteaction-gnome_community"><a href="http://www.gnome.org/community/">Community</a></li>
+</ul>
+<div id="header">
+<h1>GNOME Buildbot</h1>
+
+ <div id="tabs">
+ <ul id="portal-globalnav">
+ <li id="portaltab-0" class="selected"><a href="http://build.gnome.org"><span>GNOME Desktop</span></a></li>
+ <li id="portaltab-1"><a href="http://live.gnome.org/BuildBrigade/DocsAndGuides"><span>Participate</span></a></li>
+ <li id="portaltab-2"><a href="http://live.gnome.org/BuildBrigade"><span>About</span></a></li>
+ </ul>
+ </div>
+
+</div>
+</div>
+<div class="body body-sidebar">
+
+@@GNOME_BUILDBOT_BODY@@
+
+</tbody>
+</table>
+</div></body></html>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]