1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
#!/usr/bin/env python
import sys, getopt, os, popen2
import pickle
from StringIO import StringIO
# Python 2.3 is required by PyRSS2Gen
py_version = sys.version_info
if sys.version_info[0:2] < (2,3):
sys.stderr.write("Error: Python 2.3 or higher required")
sys.exit(1)
import datetime
try:
import PyRSS2Gen
except ImportError:
sys.stderr.write("Please install PyRSS2Gen before running this script\n")
sys.stderr.write("PyRSS2Gen can be downloaded from: \n")
sys.stderr.write("http://www.dalkescientific.com/Python/PyRSS2Gen.html\n")
def usage():
print "Usage: svn2rss.py [-h|--help] [--svn-path] --revision <rev> "
print " --repos-path <path> "
print " --url <url> --rss-file <file>"
print " svn-path : path where svn binaries are installed"
print " url : link in the rss item that points to the"
print " viewcvs page for the revision"
print ""
print "Generates a RSS 2.0 file containing commit information."
print "Once the maximum number of items is reached, the oldest element"
print "is removed. The item title is the Revision number and the item"
print "description contains the author, date, log messages and changed"
print "paths."
if len(sys.argv) == 1:
usage()
sys.exit(2)
try:
opts, args = getopt.getopt(sys.argv[1:],"h", ["help", "svn-path=",
"revision=",
"repos-path=", "url=",
"rss-file="])
except getopt.GetoptError, msg:
print msg
sys.stderr.write(usage())
sys.exit(2)
for opt, arg in opts:
if opt in ("-h", "--help"):
usage()
sys.exit(0)
elif opt == "--svn-path":
svn_path = arg
elif opt == "--revision":
commit_rev = arg
elif opt == "--repos-path":
repos_path = arg
elif opt == "--url":
url = arg
elif opt == "--rss-file":
rss_file = arg
class SVN2RSS:
def __init__(self, svn_path, revision, repos_path, url, rss_file):
self.max_items = 20
self.svn_path = svn_path
self.revision = revision
self.repos_path = repos_path
self.url = url
self.rss_file = rss_file
self.rss_item_desc = self.make_rss_item_desc()
self.svnlook = os.path.join(self.svn_path, "svnlook")
(file, ext) = os.path.splitext(self.rss_file)
self.pickle_file = file + ".pickle"
self.rss_item = self.make_rss_item()
self.rss = self.make_rss()
def make_rss_item_desc(self):
cmd = "svnlook info -r " + self.revision + " " + self.repos_path
out, x, y = popen2.popen3(cmd)
cmd_out = out.readlines()
Author = "\nAuthor: " + cmd_out[0]
Date = "Date: " + cmd_out[1]
New_Revision = "Revision: " + self.revision
Log = "Log: " + cmd_out[3]
out.close()
x.close()
y.close()
cmd = "svnlook changed -r " + self.revision + " " + self.repos_path
out, x, y = popen2.popen3(cmd)
cmd_out = out.readlines()
changed_files = "Modified: \n"
for item in cmd_out:
changed_files = changed_files + item
item_desc = Author + Date + New_Revision + "\n" + \
Log + changed_files
out.close()
x.close()
y.close()
return item_desc
def pickle(self):
s = StringIO()
pickle.dump(self.rss, s)
f = open(self.pickle_file,"w")
f.write (s.getvalue())
f.close()
def make_rss_item(self):
""" Generate PyRSS2Gen Item from the commit info """
item_title = "Revision " + self.revision
item_link = url + "?rev=" + self.revision
rss_item = PyRSS2Gen.RSSItem(title = item_title,
link = item_link,
description = self.make_rss_item_desc(),
guid = PyRSS2Gen.Guid(item_link),
pubDate = datetime.datetime.now())
return rss_item
def make_rss(self):
""" Generate a PyRSS2Gen RSS2 object """
if os.path.exists(self.pickle_file):
f = open(self.pickle_file, "r")
rss = pickle.load(f)
f.close()
if len(rss.items) == self.max_items :
rss.items.pop()
rss.items.insert(0, self.rss_item)
else:
rss_item = self.rss_item
rss = PyRSS2Gen.RSS2(
title = "Foo's SVN Commits Feed",
link = "http://www.foo.com/project",
description = "The latest SVN commits",
lastBuildDate = datetime.datetime.now(),
items = [rss_item])
return rss
svn2rss = SVN2RSS(svn_path, commit_rev, repos_path, url, rss_file)
rss = svn2rss.rss
svn2rss.pickle()
rss.write_xml(open(rss_file, "w"))
|