summaryrefslogtreecommitdiffstats
path: root/zarb-ml/mageia-sysadm/attachments/20110107/ed31022c/attachment-0001.html
diff options
context:
space:
mode:
Diffstat (limited to 'zarb-ml/mageia-sysadm/attachments/20110107/ed31022c/attachment-0001.html')
-rw-r--r--zarb-ml/mageia-sysadm/attachments/20110107/ed31022c/attachment-0001.html503
1 files changed, 503 insertions, 0 deletions
diff --git a/zarb-ml/mageia-sysadm/attachments/20110107/ed31022c/attachment-0001.html b/zarb-ml/mageia-sysadm/attachments/20110107/ed31022c/attachment-0001.html
new file mode 100644
index 000000000..713963f74
--- /dev/null
+++ b/zarb-ml/mageia-sysadm/attachments/20110107/ed31022c/attachment-0001.html
@@ -0,0 +1,503 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<title>[704] add cia bot svn hook</title>
+</head>
+<body>
+
+<style type="text/css"><!--
+#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
+#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
+#msg dt:after { content:':';}
+#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
+#msg dl a { font-weight: bold}
+#msg dl a:link { color:#fc3; }
+#msg dl a:active { color:#ff0; }
+#msg dl a:visited { color:#cc6; }
+h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
+#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
+#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
+#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
+#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
+#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
+#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
+#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
+#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
+#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
+#logmsg pre { background: #eee; padding: 1em; }
+#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
+#logmsg dl { margin: 0; }
+#logmsg dt { font-weight: bold; }
+#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
+#logmsg dd:before { content:'\00bb';}
+#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
+#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
+#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
+#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
+#logmsg table th.Corner { text-align: left; }
+#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
+#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
+#patch { width: 100%; }
+--></style>
+<div id="msg">
+<dl class="meta">
+<dt>Revision</dt> <dd>704</dd>
+<dt>Author</dt> <dd>boklm</dd>
+<dt>Date</dt> <dd>2011-01-07 18:43:33 +0100 (Fri, 07 Jan 2011)</dd>
+</dl>
+
+<h3>Log Message</h3>
+<pre>add cia bot svn hook</pre>
+
+<h3>Modified Paths</h3>
+<ul>
+<li><a href="#puppetmodulessubversionmanifestsinitpp">puppet/modules/subversion/manifests/init.pp</a></li>
+</ul>
+
+<h3>Added Paths</h3>
+<ul>
+<li><a href="#puppetmodulessubversiontemplatesciabot_svnpy">puppet/modules/subversion/templates/ciabot_svn.py</a></li>
+</ul>
+
+</div>
+<div id="patch"><pre>
+<a id="puppetmodulessubversionmanifestsinitpp">Modified: puppet/modules/subversion/manifests/init.pp</a>
+===================================================================
+--- puppet/modules/subversion/manifests/init.pp 2011-01-07 15:10:20 UTC (rev 703)
++++ puppet/modules/subversion/manifests/init.pp 2011-01-07 17:43:33 UTC (rev 704)
+@@ -123,6 +123,7 @@
+ define repository ($group = &quot;svn&quot;,
+ $public = true,
+ $commit_mail = '',
++ $cia_post = true,
+ $syntax_check = '',
+ $extract_dir = '') {
+ # check permissions
+@@ -177,6 +178,17 @@
+ }
+ }
+
++ if $cia_post {
++ file { &quot;$name/hooks/post-commit.d/cia.vc&quot;:
++ ensure =&gt; present,
++ owner =&gt; root,
++ group =&gt; root,
++ mode =&gt; 755,
++ content =&gt; template(&quot;subversion/ciabot_svn.py&quot;),
++ }
++
++ }
++
+ if $extract_dir {
+ file { &quot;$name/hooks/post-commit.d/extract_dir&quot;:
+ ensure =&gt; present,
+
+<a id="puppetmodulessubversiontemplatesciabot_svnpy">Added: puppet/modules/subversion/templates/ciabot_svn.py</a>
+===================================================================
+--- puppet/modules/subversion/templates/ciabot_svn.py (rev 0)
++++ puppet/modules/subversion/templates/ciabot_svn.py 2011-01-07 17:43:33 UTC (rev 704)
+@@ -0,0 +1,398 @@
++#!/usr/bin/env python
++#
++# This is a CIA client script for Subversion repositories, written in python.
++# It generates commit messages using CIA's XML format, and can deliver them
++# using either XML-RPC or email. See below for usage and cuztomization
++# information.
++#
++# --------------------------------------------------------------------------
++#
++# Copyright (c) 2004-2007, Micah Dowty
++# All rights reserved.
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted provided that the following conditions are met:
++#
++# * Redistributions of source code must retain the above copyright notice,
++# this list of conditions and the following disclaimer.
++# * Redistributions in binary form must reproduce the above copyright
++# notice, this list of conditions and the following disclaimer in the
++# documentation and/or other materials provided with the distribution.
++# * The name of the author may not be used to endorse or promote products
++# derived from this software without specific prior written permission.
++#
++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot;
++# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
++# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
++# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
++# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
++# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
++# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
++# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
++# POSSIBILITY OF SUCH DAMAGE.
++#
++# --------------------------------------------------------------------------
++#
++# This script is cleaner and much more featureful than the shell
++# script version, but won't work on systems without Python.
++#
++# To use the CIA bot in your Subversion repository...
++#
++# 1. Customize the parameters below
++#
++# 2. This script should be called from your repository's post-commit
++# hook with the repository and revision as arguments. For example,
++# you could copy this script into your repository's &quot;hooks&quot; directory
++# and add something like the following to the &quot;post-commit&quot; script,
++# also in the repository's &quot;hooks&quot; directory:
++#
++# REPOS=&quot;$1&quot;
++# REV=&quot;$2&quot;
++# $REPOS/hooks/ciabot_svn.py &quot;$REPOS&quot; &quot;$REV&quot; &amp;
++#
++# Or, if you have multiple project hosted, you can add each
++# project's name to the commandline in that project's post-commit
++# hook:
++#
++# $REPOS/hooks/ciabot_svn.py &quot;$REPOS&quot; &quot;$REV&quot; &quot;ProjectName&quot; &amp;
++#
++############# There are some parameters for this script that you can customize:
++
++class config:
++ # Replace this with your project's name, or always provide a project
++ # name on the commandline.
++ #
++ # NOTE: This shouldn't be a long description of your project. Ideally
++ # it is a short identifier with no spaces, punctuation, or
++ # unnecessary capitalization. This will be used in URLs related
++ # to your project, as an internal identifier, and in IRC messages.
++ # If you want a longer name shown for your project on the web
++ # interface, please use the &quot;title&quot; metadata key rather than
++ # putting that here.
++ #
++ project = &quot;Mageia&quot;
++
++ # Subversion's normal directory hierarchy is powerful enough that
++ # it doesn't have special methods of specifying modules, tags, or
++ # branches like CVS does. Most projects do use a naming
++ # convention though that works similarly to CVS's modules, tags,
++ # and branches.
++ #
++ # This is a list of regular expressions that are tested against
++ # paths in the order specified. If a regex matches, the 'branch'
++ # and 'module' groups are stored and the matching section of the
++ # path is removed.
++ #
++ # Several common directory structure styles are below as defaults.
++ # Uncomment the ones you're using, or add your own regexes.
++ # Whitespace in the each regex are ignored.
++
++ pathRegexes = [
++ # r&quot;^ trunk/ (?P&lt;module&gt;[^/]+)/ &quot;,
++ # r&quot;^ (branches|tags)/ (?P&lt;branch&gt;[^/]+)/ &quot;,
++ # r&quot;^ (branches|tags)/ (?P&lt;module&gt;[^/]+)/ (?P&lt;branch&gt;[^/]+)/ &quot;,
++ ]
++
++ # If your repository is accessible over the web, put its base URL here
++ # and 'uri' attributes will be given to all &lt;file&gt; elements. This means
++ # that in CIA's online message viewer, each file in the tree will link
++ # directly to the file in your repository.
++ repositoryURI = None
++
++ # If your repository is accessible over the web via a tool like ViewVC
++ # that allows viewing information about a full revision, put a format string
++ # for its URL here. You can specify various substitution keys in the Python
++ # syntax: &quot;%(project)s&quot; is replaced by the project name, and likewise
++ # &quot;%(revision)s&quot; and &quot;%(author)s&quot; are replaced by the revision / author.
++ # The resulting URI is added to the data sent to CIA. After this, in CIA's
++ # online message viewer, the commit will link directly to the corresponding
++ # revision page.
++ revisionURI = None
++ # Example (works for ViewVC as used by SourceForge.net):
++ #revisionURI = &quot;https://svn.sourceforge.net/viewcvs.cgi/%(project)s?view=rev&amp;rev=%(revision)s&quot;
++
++ # This can be the http:// URI of the CIA server to deliver commits over
++ # XML-RPC, or it can be an email address to deliver using SMTP. The
++ # default here should work for most people. If you need to use e-mail
++ # instead, you can replace this with &quot;cia@cia.navi.cx&quot;
++ server = &quot;http://cia.navi.cx&quot;
++
++ # The SMTP server to use, only used if the CIA server above is an
++ # email address.
++ smtpServer = &quot;localhost&quot;
++
++ # The 'from' address to use. If you're delivering commits via email, set
++ # this to the address you would normally send email from on this host.
++ fromAddress = &quot;cia-user@localhost&quot;
++
++ # When nonzero, print the message to stdout instead of delivering it to CIA.
++ debug = 0
++
++
++############# Normally the rest of this won't need modification
++
++import sys, os, re, urllib, getopt
++
++class File:
++ &quot;&quot;&quot;A file in a Subversion repository. According to our current
++ configuration, this may have a module, branch, and URI in addition
++ to a path.&quot;&quot;&quot;
++
++ # Map svn's status letters to our action names
++ actionMap = {
++ 'U': 'modify',
++ 'A': 'add',
++ 'D': 'remove',
++ }
++
++ def __init__(self, fullPath, status=None):
++ self.fullPath = fullPath
++ self.path = fullPath
++ self.action = self.actionMap.get(status)
++
++ def getURI(self, repo):
++ &quot;&quot;&quot;Get the URI of this file, given the repository's URI. This
++ encodes the full path and joins it to the given URI.&quot;&quot;&quot;
++ quotedPath = urllib.quote(self.fullPath)
++ if quotedPath[0] == '/':
++ quotedPath = quotedPath[1:]
++ if repo[-1] != '/':
++ repo = repo + '/'
++ return repo + quotedPath
++
++ def makeTag(self, config):
++ &quot;&quot;&quot;Return an XML tag for this file, using the given config&quot;&quot;&quot;
++ attrs = {}
++
++ if config.repositoryURI is not None:
++ attrs['uri'] = self.getURI(config.repositoryURI)
++
++ if self.action:
++ attrs['action'] = self.action
++
++ attrString = ''.join([' %s=&quot;%s&quot;' % (key, escapeToXml(value,1))
++ for key, value in attrs.items()])
++ return &quot;&lt;file%s&gt;%s&lt;/file&gt;&quot; % (attrString, escapeToXml(self.path))
++
++
++class SvnClient:
++ &quot;&quot;&quot;A CIA client for Subversion repositories. Uses svnlook to
++ gather information&quot;&quot;&quot;
++ name = 'Python Subversion client for CIA'
++ version = '1.20'
++
++ def __init__(self, repository, revision, config):
++ self.repository = repository
++ self.revision = revision
++ self.config = config
++
++ def deliver(self, message):
++ if config.debug:
++ print message
++ else:
++ server = self.config.server
++ if server.startswith('http:') or server.startswith('https:'):
++ # Deliver over XML-RPC
++ import xmlrpclib
++ xmlrpclib.ServerProxy(server).hub.deliver(message)
++ else:
++ # Deliver over email
++ import smtplib
++ smtp = smtplib.SMTP(self.config.smtpServer)
++ smtp.sendmail(self.config.fromAddress, server,
++ &quot;From: %s\r\nTo: %s\r\n&quot;
++ &quot;Subject: DeliverXML\r\n\r\n%s&quot; %
++ (self.config.fromAddress, server, message))
++
++ def main(self):
++ self.collectData()
++ self.deliver(&quot;&lt;message&gt;&quot; +
++ self.makeGeneratorTag() +
++ self.makeSourceTag() +
++ self.makeBodyTag() +
++ &quot;&lt;/message&gt;&quot;)
++
++ def makeAttrTags(self, *names):
++ &quot;&quot;&quot;Given zero or more attribute names, generate XML elements for
++ those attributes only if they exist and are non-None.
++ &quot;&quot;&quot;
++ s = ''
++ for name in names:
++ if hasattr(self, name):
++ v = getattr(self, name)
++ if v is not None:
++ # Recent Pythons don't need this, but Python 2.1
++ # at least can't convert other types directly
++ # to Unicode. We have to take an intermediate step.
++ if type(v) not in (type(''), type(u'')):
++ v = str(v)
++
++ s += &quot;&lt;%s&gt;%s&lt;/%s&gt;&quot; % (name, escapeToXml(v), name)
++ return s
++
++ def makeGeneratorTag(self):
++ return &quot;&lt;generator&gt;%s&lt;/generator&gt;&quot; % self.makeAttrTags(
++ 'name',
++ 'version',
++ )
++
++ def makeSourceTag(self):
++ return &quot;&lt;source&gt;%s&lt;/source&gt;&quot; % self.makeAttrTags(
++ 'project',
++ 'module',
++ 'branch',
++ )
++
++ def makeBodyTag(self):
++ return &quot;&lt;body&gt;&lt;commit&gt;%s%s&lt;/commit&gt;&lt;/body&gt;&quot; % (
++ self.makeAttrTags(
++ 'revision',
++ 'author',
++ 'log',
++ 'diffLines',
++ 'url',
++ ),
++ self.makeFileTags(),
++ )
++
++ def makeFileTags(self):
++ &quot;&quot;&quot;Return XML tags for our file list&quot;&quot;&quot;
++ return &quot;&lt;files&gt;%s&lt;/files&gt;&quot; % ''.join([file.makeTag(self.config)
++ for file in self.files])
++
++ def svnlook(self, command):
++ &quot;&quot;&quot;Run the given svnlook command on our current repository and
++ revision, returning all output&quot;&quot;&quot;
++ # We have to set LC_ALL to force svnlook to give us UTF-8 output,
++ # then we explicitly slurp that into a unicode object.
++ return unicode(os.popen(
++ 'LC_ALL=&quot;en_US.UTF-8&quot; svnlook %s -r &quot;%s&quot; &quot;%s&quot;' %
++ (command, self.revision, self.repository)).read(),
++ 'utf-8', 'replace')
++
++ def collectData(self):
++ self.author = self.svnlook('author').strip()
++ self.project = self.config.project
++ self.log = self.svnlook('log')
++ self.diffLines = len(self.svnlook('diff').split('\n'))
++ self.files = self.collectFiles()
++ if self.config.revisionURI is not None:
++ self.url = self.config.revisionURI % self.__dict__
++ else:
++ self.url = None
++
++ def collectFiles(self):
++ # Extract all the files from the output of 'svnlook changed'
++ files = []
++ for line in self.svnlook('changed').split('\n'):
++ path = line[2:].strip()
++ if path:
++ status = line[0]
++ files.append(File(path, status))
++
++ # Try each of our several regexes. To be applied, the same
++ # regex must mach every file under consideration and they must
++ # all return the same results. If we find one matching regex,
++ # or we try all regexes without a match, we're done.
++ matchDict = None
++ for regex in self.config.pathRegexes:
++ matchDict = matchAgainstFiles(regex, files)
++ if matchDict is not None:
++ self.__dict__.update(matchDict)
++ break
++
++ return files
++
++
++def matchAgainstFiles(regex, files):
++ &quot;&quot;&quot;Try matching a regex against all File objects in the provided list.
++ If the regex returns the same matches for every file, the matches
++ are returned in a dict and the matched portions are filtered out.
++ If not, returns None.
++ &quot;&quot;&quot;
++ prevMatchDict = None
++ compiled = re.compile(regex, re.VERBOSE)
++ for f in files:
++
++ match = compiled.match(f.fullPath)
++ if not match:
++ # Give up, it must match every file
++ return None
++
++ matchDict = match.groupdict()
++ if prevMatchDict is not None and prevMatchDict != matchDict:
++ # Give up, we got conflicting matches
++ return None
++
++ prevMatchDict = matchDict
++
++ # If we got this far, the regex matched every file with
++ # the same results. Now filter the matched portion out of
++ # each file and store the matches we found.
++ for f in files:
++ f.path = compiled.sub('', f.fullPath)
++ return prevMatchDict
++
++
++def escapeToXml(text, isAttrib=0):
++ text = unicode(text)
++ text = text.replace(&quot;&amp;&quot;, &quot;&amp;amp;&quot;)
++ text = text.replace(&quot;&lt;&quot;, &quot;&amp;lt;&quot;)
++ text = text.replace(&quot;&gt;&quot;, &quot;&amp;gt;&quot;)
++ if isAttrib == 1:
++ text = text.replace(&quot;'&quot;, &quot;&amp;apos;&quot;)
++ text = text.replace(&quot;\&quot;&quot;, &quot;&amp;quot;&quot;)
++ return text
++
++
++def usage():
++ &quot;&quot;&quot;Print a short usage description of this script and exit&quot;&quot;&quot;
++ sys.stderr.write(&quot;Usage: %s [OPTIONS] REPOS-PATH REVISION [PROJECTNAME]\n&quot; %
++ sys.argv[0])
++
++
++def version():
++ &quot;&quot;&quot;Print out the version of this script&quot;&quot;&quot;
++ sys.stderr.write(&quot;%s %s\n&quot; % (sys.argv[0], SvnClient.version))
++
++
++def main():
++ try:
++ options = [ &quot;version&quot; ]
++ for key in config.__dict__:
++ if not key.startswith(&quot;_&quot;):
++ options.append(key + &quot;=&quot;);
++ opts, args = getopt.getopt(sys.argv[1:], &quot;&quot;, options)
++ except getopt.GetoptError:
++ usage()
++ sys.exit(2)
++
++ for o, a in opts:
++ if o == &quot;--version&quot;:
++ version()
++ sys.exit()
++ else:
++ # Everything else maps straight to a config key. Just have
++ # to remove the &quot;--&quot; prefix from the option name.
++ config.__dict__[o[2:]] = a
++
++ # Print a usage message when not enough parameters are provided.
++ if not len(args) in (2,3):
++ sys.stderr.write(&quot;%s: incorrect number of arguments\n&quot; % sys.argv[0])
++ usage();
++ sys.exit(2);
++
++ # If a project name was provided, override the default project name.
++ if len(args) == 3:
++ config.project = args[2]
++
++ # Go do the real work.
++ SvnClient(args[0], args[1], config).main()
++
++
++if __name__ == &quot;__main__&quot;:
++ main()
++
++### The End ###
+
+</pre></div>
+
+</body>
+</html> \ No newline at end of file