Author: breser
Date: Thu Dec 20 22:03:18 2012
New Revision: 1424731

URL: http://svn.apache.org/viewvc?rev=1424731&view=rev
Log:
Add support for getting the files changed not just the dirs from svnpubsub.

* tools/server-side/svnpubsub/svnpubsub/client.py
  (XMLStreamHandler.__init__): Add parent and attrs members.
  (XMLStreamHandler.startElement): Save the attributes for each element and 
    set the parent attribute for dirs_changed and changed.
  (XMLStreamHandler.endElement): Unset the parent member, handle path elements
    for both dirs_changed and changed, and remove attrs saved perviously.
  (Revision.__init__): Initialize changed member.
* tools/server-side/svnpubsub/svnpubsub/server.py
  (Revision.__init__): Init changed member.
  (Revision.render_commit): Add support for output changed member as XML.
* tools/server-side/svnpubsub/svnpubsub/commit-hook.py
  (svncmd_changed): New function to retrieve changed paths.
  (main): Fill changed member.


Modified:
    subversion/trunk/tools/server-side/svnpubsub/commit-hook.py
    subversion/trunk/tools/server-side/svnpubsub/svnpubsub/client.py
    subversion/trunk/tools/server-side/svnpubsub/svnpubsub/server.py

Modified: subversion/trunk/tools/server-side/svnpubsub/commit-hook.py
URL: 
http://svn.apache.org/viewvc/subversion/trunk/tools/server-side/svnpubsub/commit-hook.py?rev=1424731&r1=1424730&r2=1424731&view=diff
==============================================================================
--- subversion/trunk/tools/server-side/svnpubsub/commit-hook.py (original)
+++ subversion/trunk/tools/server-side/svnpubsub/commit-hook.py Thu Dec 20 
22:03:18 2012
@@ -59,6 +59,19 @@ def svncmd_dirs(repo, revision):
         dirs.append(line.strip())
     return dirs
 
+def svncmd_changed(repo, revision):
+    cmd = "%s changed -r %s %s" % (SVNLOOK, revision, repo)
+    p = svncmd(cmd)
+    changed = {} 
+    while True:
+        line = p.stdout.readline()
+        if not line:
+            break
+        line = line.strip()
+        (flags, filename) = (line[0:3], line[4:])
+        changed[filename] = {'flags': flags} 
+    return changed
+
 def do_put(body):
     opener = urllib2.build_opener(urllib2.HTTPHandler)
     request = urllib2.Request("http://%s:%d/dirs-changed"; %(HOST, PORT), 
data=body)
@@ -72,12 +85,14 @@ def main(repo, revision):
     i = svncmd_info(repo, revision)
     data = {'revision': int(revision),
             'dirs_changed': [],
+            'changed': {},
             'repos': svncmd_uuid(repo),
             'author': i['author'],
             'log': i['log'],
             'date': i['date'],
             }
     data['dirs_changed'].extend(svncmd_dirs(repo, revision))
+    data['changed'].update(svncmd_changed(repo, revision))
     body = json.dumps(data)
     #print body
     do_put(body)

Modified: subversion/trunk/tools/server-side/svnpubsub/svnpubsub/client.py
URL: 
http://svn.apache.org/viewvc/subversion/trunk/tools/server-side/svnpubsub/svnpubsub/client.py?rev=1424731&r1=1424730&r2=1424731&view=diff
==============================================================================
--- subversion/trunk/tools/server-side/svnpubsub/svnpubsub/client.py (original)
+++ subversion/trunk/tools/server-side/svnpubsub/svnpubsub/client.py Thu Dec 20 
22:03:18 2012
@@ -119,10 +119,15 @@ class XMLStreamHandler(xml.sax.handler.C
 
     self.rev = None
     self.chars = ''
+    self.parent = None
+    self.attrs = [ ] 
 
   def startElement(self, name, attrs):
+    self.attrs = attrs
     if name == 'commit':
       self.rev = Revision(attrs['repository'], int(attrs['revision']))
+    elif name == "dirs_changed" or name == "changed":
+      self.parent = name
     # No other elements to worry about.
 
   def characters(self, data):
@@ -134,10 +139,15 @@ class XMLStreamHandler(xml.sax.handler.C
       self.rev = None
     elif name == 'stillalive':
       self.event_callback('ping')
+    elif name == self.parent:
+      self.parent = None
     elif self.chars and self.rev:
       value = self.chars.strip()
-      if name == 'path':
+      if self.parent == 'dirs_changed' and name == 'path':
         self.rev.dirs_changed.append(value.decode('unicode_escape'))
+      elif self.parent == 'changed' and name == 'path':
+        path = value.decode('unicode_escape')
+        self.rev.changed[path] = dict(p for p in self.attrs.items())
       elif name == 'author':
         self.rev.author = value.decode('unicode_escape')
       elif name == 'date':
@@ -147,6 +157,8 @@ class XMLStreamHandler(xml.sax.handler.C
 
     # Toss out any accumulated characters for this element.
     self.chars = ''
+    # Toss out the saved attributes for this element.
+    self.attrs = [ ]
 
 
 class Revision(object):
@@ -154,6 +166,7 @@ class Revision(object):
     self.uuid = uuid
     self.rev = rev
     self.dirs_changed = [ ]
+    self.changed = { } 
     self.author = None
     self.date = None
     self.log = None

Modified: subversion/trunk/tools/server-side/svnpubsub/svnpubsub/server.py
URL: 
http://svn.apache.org/viewvc/subversion/trunk/tools/server-side/svnpubsub/svnpubsub/server.py?rev=1424731&r1=1424730&r2=1424731&view=diff
==============================================================================
--- subversion/trunk/tools/server-side/svnpubsub/svnpubsub/server.py (original)
+++ subversion/trunk/tools/server-side/svnpubsub/svnpubsub/server.py Thu Dec 20 
22:03:18 2012
@@ -79,6 +79,7 @@ class Revision:
         self.rev = r.get('revision')
         self.repos = r.get('repos')
         self.dirs_changed = r.get('dirs_changed')
+        self.changed = r.get('changed')
         self.author = r.get('author')
         self.log = r.get('log')
         self.date = r.get('date')
@@ -88,6 +89,7 @@ class Revision:
             return json.dumps({'commit': {'repository': self.repos,
                                           'revision': self.rev,
                                           'dirs_changed': self.dirs_changed,
+                                          'changed': self.changed,
                                           'author': self.author,
                                           'log': self.log,
                                           'date': self.date}}) +","
@@ -100,6 +102,11 @@ class Revision:
             for p in self.dirs_changed:
                 x = ET.SubElement(d, 'path')
                 x.text = p.encode('unicode_escape')
+            ch = ET.SubElement(c, 'changed')
+            for chp in self.changed.keys():
+                x = ET.SubElement(ch, 'path', self.changed[chp])
+                x.text = chp.encode('unicode_escape')
+
             str = ET.tostring(c, 'UTF-8') + "\n"
             return str[39:]
         else:


Reply via email to