[MERGE] fixing bad Atom output from bzr-branchfeed
Benjamin D. Rister
bdr at decimus.net
Fri Jul 11 03:28:53 BST 2008
Hello,
In trying to set up RSS feeds for some of our repositories today, I
discovered that bzr-branchfeed was generating invalid Atom XML. I've
fixed all the problems I encountered in my use in the patch below,
also found at lp:~bdrister/bzr-branchfeed/bdr.dev.
Problems solved:
- Content strings not escaped/quoted as needed
- <id> element should be a URI
- </feed> tag missing
- <author> element not split into name/email components
- <generator> element invalid
Best,
br
--
Benjamin D. Rister
President
Decimus Software, Inc.
http://www.decimus.net/
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: bdr at decimus.net-20080711020537-4t9t261vgl45rvt4
# target_branch: lp:bzr-branchfeed
# testament_sha1: 5f1e0401b5ae2c8ee7d7d19ce615327f420530af
# timestamp: 2008-07-10 22:20:45 -0400
# source_branch: lp:bzr-branchfeed
# base_revision_id: robertc at robertcollins.net-20080710140633-\
# 0u8ggz1jvh526b0e
#
# Begin patch
=== modified file 'branch_feed.py'
--- branch_feed.py 2008-07-10 12:24:30 +0000
+++ branch_feed.py 2008-07-11 02:05:37 +0000
@@ -26,6 +26,10 @@
from bzrlib.branch import Branch
from bzrlib.osutils import format_date
+import re
+import urllib
+from xml.sax import saxutils
+
def install_hooks():
"""Install the BranchFeed hooks into bzrlib."""
@@ -53,9 +57,7 @@
<entry>
<title>$title</title>
<id>$id</id>
- <author>
- <name>$author</name>
- </author>
+ $authorblock
<updated>$updated</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
@@ -65,17 +67,28 @@
</entry>
"""
+ def author_block_for_committer(self, committer):
+ author_pattern = re.compile('([^<]*)<([^>]*)>\s*$')
+ author_match = author_pattern.match(committer)
+ if author_match:
+ name = saxutils.escape(author_match.group(1).strip())
+ email = saxutils.escape(author_match.group(2).strip())
+ return '<author><name>%s</name><email>%s</email></
author>' % (name,email)
+ else:
+ name = saxutils.escape(committer)
+ return '<author><name>%s</name></author>' % name
+
def generate_for_iterator(self, feed, revno_revision_iterator):
template = Template(self.ATOM_ITEM_TEMPLATE)
for revno, revision in self.iter_revisions():
feed += template.substitute({
- 'title':'revision %s' % revno,
- 'id':revision.revision_id,
- 'author':revision.committer,
+ 'title':saxutils.escape('revision %s' % revno),
+ 'id':'bzr://revid/%s' %
urllib.quote(revision.revision_id),
+
'authorblock':self.author_block_for_committer(revision.committer),
'updated':format_date(revision.timestamp,
revision.timezone or 0, 'utc', '%Y-%m-%dT%H:%M:
%SZ',
show_offset=False),
- 'content':revision.message,
+ 'content':saxutils.escape(revision.message),
})
return feed
@@ -96,7 +109,7 @@
<title>$title</title>
<id>$id</id>
<updated>$updated</updated>
- <generator uri="http://atonie.org/code/atomlog" />
+ <generator uri="https://launchpad.net/bzr-branchfeed">bzr-
branchfeed</generator>
"""
def __init__(self, branch, now=None):
@@ -135,6 +148,7 @@
show_offset=False)
})
feed = self.generate_for_iterator(feed, self.iter_revisions())
+ feed += '</feed>'
return feed.encode('utf8')
def update(self):
# Begin bundle
IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWXr39SsABhDfgERUV
////3Mg
Gg+////
wYAmPj166dAAAAAAAAAAAamkmjanqGgGnqeSABoAADQNABzAmJoMJkyZMjCYJppkYmAIY
Bqp6npPKepoA0NNGIaAyGmI00DTQNMg1MpqeiGgHpNAAB6gAAAyAA5gTE0GEyZMmRhME00yMTAEM
AVKITJoAAhM0mTTUwAk0elPEmjMNRsxhFseU8tbIy7ZhRQ60ByPVN1hCIQRhECASy6RyBxRhYp41
eGglRQmcobdlu2WZbpZTIgqfbfkxrhUyHl67K21wiw6oiZENFeR/r9t51e61n8f18R
+ptKFKUpRS
Rk7En+7TAsq76SbbOu4rxS0p4ANoDRECbKqSFNGuB2bCSVpAgl3Fwh+y2Boi9r0g8+w/
osz/1S0y
V7st5carNDXquNdFKKUKYW2w1escACwkY5sF/
EEH1sVAFwFwLYFkqCaCFIg1NCTNCkW25o6V3SRk
yZLeh1nO9IfTuT
+3slzqLUsnofX6ZFTXJSDaBlIIKQPIGHa0ICcBJIE3AfORKSGhHdvrY28OH/7T
njpp/bR9J7D1I8h2CNY801uRtR5Dw8UfHGtl2bLzvz7fg2ck0rFSRfE/CzhxW
+lzHQqdHMzMzMzY
x5+Y5gIMIIAcMwFCo6AAZAC0SA/
9ewyW5Da7Al47UlrOqiXvkvWKMq9GCdjLOnK9pwFBFBHTMo6I
1so0VYMjo7bVHOr5DuH2m7HjErWqOF
+zTSvr9AwMAoRtbMbbQrPrzH6URcu4I4ivMrcjGnVk41tt
dZaxSjczaGM6hXM4GDJDhwZzKjazttW7BGFjWt0jWymRwZ2pc
+8yjWjIlnDQyqcaIvvCZksFCKXK
Ri1sWXZcipao6JjNjiXszhG1jJM7Mo7F7wRemqnOUrirc1zmatLA4tKZVGKrnfoUTTjRsa2bFRyY
s6q9FdXBvUXnCpYy7a7EYV1XLTOqTBRr4Upv0YMEZCxGRVRQXutL9LO3YdeSGZYstxW12jO4sqNq
adBdom2tZYM4s2DTwYu265aNvlMFqa7jRLG9bgLTfM7S2LSXLFW5i3MjSzLV7Wo9iMU5b672LisW
rb9Qztsptu1FrW7RY1MvU2Q0M8yrmRw5Zpn03UvvktqLhitttEambVfsUtZKsWTQddzcpbazsqrO
thaTLNCxgoxZmDIqKrrZVks45sNIit2VmcWZffOaKqr2dlzOLZNDdu2NShbvbG5nLmhsfzOY3SPu
jmjdy1YZ
+COOpGxFulc1OSxdsfJGXktcuep1amZya2DQsfdHcns58vj7unLNQzQpOJqhZJLy3gNs
TJoJo+rPhz3z7WqCwofzcyWHbQVUFCg/zZG42/
iVaBRY3lGbzpKUlKKUWihZPdX1mT4D5mwtMCoy
nssYYLLFVxU37sIuEeBu2L9yUpRFKUP/rytz/
f73llPir9KfwzngT2N5NJSkS1Km27h1UUpRM/m2
fLzXh6HueT2Kva8nY9b6XsHweTK1P05e9t26HGHOJfHn1QfkdRckXyZ9MRl6sUmQteu32
+x6Xut/
16la0/S//1GgfXfrpylex0dbo9Kx2rVVFjuYPS+xxd5TvlFSlZRUpWUVlL35DFt
+6O193j60YjEo
fm95ZTr+URvc2tqeSxyVcVyx6y11u2T8WR7FV7I/
PPlbykoTpSSwR16bSsuOT1PJ6opwyphSimWh
K97Y965wcrH93Ba3N7tGDm/w63KGh5NJMq00L2yNgUq6eP8YtP8CO7/
lFnxHIR0+XryVfIp4eixg
lnsuvuLutvt+fDY62R71+bC
+zBZod690ZEefoPobBnKFDu0UjcUbi2J6ebS3ODPxEZs37bLbYjdN
KRZvKOjrfqjzcWb6/v+935fPqdU/sdnCmgmwj
+rTmpJu7anVN1W8ZA7h8Uzw7KGESM6IwJYdl9DL
17Viyzrdy1V4Oi1a7ljo8Xgq97K9vtpS5Yzjx8u/w+ZLIs
+LgPUfEvOzBVFntRpLtiOvl1UiMMdG
+epOjH
+U856RdPzRd6EWpPUHgjEbbUsCnb3OMFIt8XipmP8fXs10DCVRgOn4Dqj0nnQXSTT2U2CK
9pyiW8du4/HtLjAyJDI1pDL+pnrI/
rvReZ7pOZSe2VRrkuRR7Uc4nlM1470vJa8aGNIYGZOex5H9
zWZL5Kfl5JlNSMJxyRjDZ66TRBas1HUaB5ZDLmkfX3o0SLjzFcJEU0q0oVStE/RFITL
+KnfQaGlf
ikccYmUv2TZEi2cfzLSqO
+0sl9CVoRQnj19nTuR8xrHoKaEd5XClSYpD6FbILfnSlKJnUSsSisPM
sJva8jKsdxwy7eRzPQTvXjrk5MrQFpqz4mIoausneiyv2aoxaK1sKVk4LPqLHULal0e0RSSO5Iwt
ljYyzcXEd7R8Nh6T2mUuNlSXFN+jNvljTCi106vlR9i/oy9Ye1mmIUoPJH1Sw40GjJZ/
T72prPwK
EM10zGkUKeCOG/dSUXJ/rN1Wo3DDySFTxRmJfixRkoUMIlmZX8Bt2ecwK0EUp
+Sc09Kck0JgPgNp
iWRQ6lpZmuNkTWMDsR1BlxFZLh6f+I4WfPRM8TQTRWVhjQl8i57t64eyfhrMn
+Wxm0zQ94jIG+Si
MyNRPin6zV80UkhVFydEc0YaBvy6cpLpO3Kaj1ErFShgi1HZNd9sYHwn/RdyRThQkHr39Ss=
More information about the bazaar
mailing list