jhbuild r2214 - in trunk: . buildbot buildbot/jhbuildbot buildbot/jhbuildbot/status buildbot/jhbuildbot/status/web buildbot/jhbuildbot/test buildbot/jhbuildbot/test/mail buildbot/public_html



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">&nbsp;</td><td class="empty">&nbsp;</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+ '">&nbsp;</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]