Merge branch 'master' of git://github.com/dustin/buildbot
[buildbot.git] / contrib / svnpoller.py
blobba0f174d4d7ed571be4ad1927b8ff1ec3b8610b0
1 #!/usr/bin/python
2 """
3 svn.py
4 Script for BuildBot to monitor a remote Subversion repository.
5 Copyright (C) 2006 John Pye
6 """
7 # This script is free software; you can redistribute it and/or
8 # modify it under the terms of the GNU Lesser General Public
9 # License as published by the Free Software Foundation; either
10 # version 2.1 of the License, or (at your option) any later version.
12 # This library is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 # Lesser General Public License for more details.
17 # You should have received a copy of the GNU Lesser General Public
18 # License along with this library; if not, write to the Free Software
19 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
20 # USA
22 import commands
23 import xml.dom.minidom
24 import ConfigParser
25 import os.path
26 import codecs
28 # change these settings to match your project
29 svnurl = "https://pse.cheme.cmu.edu/svn/ascend/code/trunk"
30 statefilename = "~/changemonitor/config.ini"
31 buildmaster = "buildbot.example.org:9989" # connects to a PBChangeSource
33 xml1 = commands.getoutput(
34 "svn log --non-interactive --verbose --xml --limit=1 " + svnurl)
35 #print "XML\n-----------\n"+xml1+"\n\n"
37 try:
38 doc = xml.dom.minidom.parseString(xml1)
39 el = doc.getElementsByTagName("logentry")[0]
40 revision = el.getAttribute("revision")
41 author = "".join([t.data for t in el.getElementsByTagName(
42 "author")[0].childNodes])
43 comments = "".join([t.data for t in el.getElementsByTagName(
44 "msg")[0].childNodes])
46 pathlist = el.getElementsByTagName("paths")[0]
47 paths = []
48 for p in pathlist.getElementsByTagName("path"):
49 paths.append("".join([t.data for t in p.childNodes]))
50 #print "PATHS"
51 #print paths
52 except xml.parsers.expat.ExpatError, e:
53 print "FAILED TO PARSE 'svn log' XML:"
54 print str(e)
55 print "----"
56 print "RECEIVED TEXT:"
57 print xml1
58 import sys
59 sys.exit(1)
61 fname = statefilename
62 fname = os.path.expanduser(fname)
63 ini = ConfigParser.SafeConfigParser()
65 try:
66 ini.read(fname)
67 except:
68 print "Creating changemonitor config.ini:", fname
69 ini.add_section("CurrentRevision")
70 ini.set("CurrentRevision", -1)
72 try:
73 lastrevision = ini.get("CurrentRevision", "changeset")
74 except ConfigParser.NoOptionError:
75 print "NO OPTION FOUND"
76 lastrevision = -1
77 except ConfigParser.NoSectionError:
78 print "NO SECTION FOUND"
79 lastrevision = -1
81 if lastrevision != revision:
83 #comments = codecs.encodings.unicode_escape.encode(comments)
84 cmd = "buildbot sendchange --master="+buildmaster+" --branch=trunk \
85 --revision=\""+revision+"\" --username=\""+author+"\" --comments=\""+\
86 comments+"\" "+" ".join(paths)
88 #print cmd
89 res = commands.getoutput(cmd)
91 print "SUBMITTING NEW REVISION", revision
92 if not ini.has_section("CurrentRevision"):
93 ini.add_section("CurrentRevision")
94 try:
95 ini.set("CurrentRevision", "changeset", revision)
96 f = open(fname, "w")
97 ini.write(f)
98 #print "WROTE CHANGES TO",fname
99 except:
100 print "FAILED TO RECORD INI FILE"