Changeset 933 in tailor


Ignore:
Timestamp:
10/20/05 23:33:41 (8 years ago)
Author:
lele@…
Hash name:
20051020213341-7a6fb-a00122f770aab206ad9d16f7fd93e7c7870bc565
Message:

Use an incremental parser for svn log
This transforms the changesets_from_svnlog() function into a generator
that yields changesets as they are parsed out from XML, that is read
in chunks.

Location:
vcpx
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • vcpx/svn.py

    r897 r933  
    1818from config import ConfigurationError 
    1919 
    20 def changesets_from_svnlog(log, repository, module): 
    21     from xml.sax import parse 
    22     from xml.sax.handler import ContentHandler 
     20def changesets_from_svnlog(log, repository, module, chunksize=2**15): 
     21    from xml.sax import make_parser 
     22    from xml.sax.handler import ContentHandler, ErrorHandler 
    2323    from changes import ChangesetEntry, Changeset 
    2424    from datetime import datetime 
     
    183183            self.current_field.append(data) 
    184184 
     185    parser = make_parser() 
    185186    handler = SvnXMLLogHandler() 
    186     parse(log, handler) 
    187     return handler.changesets 
     187    parser.setContentHandler(handler) 
     188    parser.setErrorHandler(ErrorHandler()) 
     189 
     190    chunk = log.read(chunksize) 
     191    while chunk: 
     192        parser.feed(chunk) 
     193        for cs in handler.changesets: 
     194            yield cs 
     195        handler.changesets = [] 
     196        chunk = log.read(chunksize) 
     197    parser.close() 
     198    for cs in handler.changesets: 
     199        yield cs 
    188200 
    189201 
  • vcpx/tests/svn.py

    r900 r933  
    2525        log = self.getSvnLog('svn-simple_rename_test') 
    2626        csets = changesets_from_svnlog(log, 'file:///tmp/t/repo', '/trunk') 
    27         self.assertEqual(len(csets), 2) 
    28  
    29         cset = csets[0] 
     27 
     28        cset = csets.next() 
    3029        self.assertEqual(cset.author, 'lele') 
    3130        self.assertEqual(cset.date, datetime(2004,11,12,15,05,37,134366)) 
     
    4140        self.assertEqual(entry.action_kind, entry.ADDED) 
    4241 
    43         cset = csets[1] 
     42        cset = csets.next() 
    4443        self.assertEqual(cset.author, 'lele') 
    4544        self.assertEqual(cset.date, datetime(2004,11,12,15,06,04,193650)) 
     
    5251        self.assertEqual(entry.old_name, 'dir') 
    5352 
     53        self.assertRaises(StopIteration, csets.next) 
     54 
    5455    def testRenameOutBehaviour(self): 
    5556        """Verify svn log parser behaves correctly on renames out of scope""" 
     
    5758        log = self.getSvnLog('svn-rename_out_test') 
    5859        csets = changesets_from_svnlog(log, 'http://srv/svn/Shtoom', '/trunk') 
    59         self.assertEqual(len(csets), 1) 
    60  
    61         cset = csets[0] 
     60 
     61        cset = csets.next() 
    6262        self.assertEqual(cset.author, 'anthony') 
    6363        self.assertEqual(cset.date, datetime(2004,11,9,6,54,20,709243)) 
     
    6969        self.assertEqual(entry.action_kind, entry.DELETED) 
    7070 
     71        self.assertRaises(StopIteration, csets.next) 
     72 
    7173    def testCopyAndRename(self): 
    7274        """Verify svn log parser behaves correctly on copies""" 
    7375 
    7476        log = self.getSvnLog('svn-copy_and_rename_test') 
    75         csets = changesets_from_svnlog(log, 'file:///tmp/rep', '/test') 
     77        csets = list(changesets_from_svnlog(log, 'file:///tmp/rep', '/test')) 
    7678        self.assertEqual(len(csets), 4) 
    7779 
     
    111113        log = self.getSvnLog('svn-svn_r_event_test') 
    112114        csets = changesets_from_svnlog(log, 'file:///tmp/rep', '/trunk') 
    113         self.assertEqual(len(csets), 2) 
    114  
    115         cset = csets[1] 
     115 
     116        cset = csets.next() 
     117 
     118        cset = csets.next() 
    116119        self.assertEqual(cset.author, 'cmlenz') 
    117         self.assertEqual(cset.date, datetime(2005,3,21, 8,34,02,522947)) 
     120        self.assertEqual(cset.date, datetime(2005,3,21, 8,34, 2,522947)) 
    118121        self.assertEqual(len(cset.entries), 7) 
    119122 
     
    143146        self.assertEqual(entry.action_kind, entry.UPDATED) 
    144147 
     148        self.assertRaises(StopIteration, csets.next) 
     149 
    145150    def testTrackingRoot(self): 
    146151        """Verify we are able to track the root of the repository""" 
    147152 
    148153        log = self.getSvnLog('svn-svn_repos_root_test') 
    149         csets = changesets_from_svnlog(log, 'svn+ssh://caia/tmp/svn', '/') 
     154        csets = list(changesets_from_svnlog(log, 'svn+ssh://caia/tmp/svn', '/')) 
    150155        self.assertEqual(len(csets), 4) 
    151156 
     
    171176        csets = changesets_from_svnlog(log, 'http://srv/svn', '/py/dist') 
    172177 
    173         self.assertEqual(len(csets), 1) 
    174  
    175         cset = csets[0] 
     178        cset = csets.next() 
    176179        self.assertEqual(len(cset.entries), 3) 
    177180 
     
    188191        self.assertEqual(entry.name, 'py/documentation/test.txt') 
    189192        self.assertEqual(entry.action_kind, entry.UPDATED) 
     193 
     194        self.assertRaises(StopIteration, csets.next) 
    190195 
    191196    def testUnicode(self): 
     
    196201                                       '/branches/2.1') 
    197202 
    198         self.assertEqual(len(csets), 1) 
    199  
    200         log = csets[0].log 
     203        log = csets.next().log 
    201204        self.assertEqual(type(log), type(u'€')) 
    202205        self.assertEqual(len(log), 91) 
     
    204207        self.assertEqual(len(log.encode('ascii', 'ignore')), 90) 
    205208 
     209        self.assertRaises(StopIteration, csets.next) 
     210 
    206211    def testCopyAndReplace(self): 
    207212        """Verify the svn parser handle copy+replace""" 
     
    210215        csets = changesets_from_svnlog(log, 'http://srv/repos/trac', '/trunk') 
    211216 
    212         self.assertEqual(len(csets), 1) 
    213  
    214         cset = csets[0] 
     217        cset = csets.next() 
    215218        self.assertEqual(len(cset.entries), 7) 
    216219 
     
    243246                                       '/branches/SAMBA_4_0') 
    244247 
    245         self.assertEqual(len(csets), 1) 
    246  
    247         cset = csets[0] 
     248        cset = csets.next() 
    248249        self.assertEqual(len(cset.entries), 3) 
    249250 
     
    259260        self.assertEqual(entry.name, 'source/nsswitch/wb_common.c') 
    260261        self.assertEqual(entry.action_kind, entry.ADDED) 
     262 
     263    def testIncrementalParser(self): 
     264        """Verify that the svn log parser is effectively incremental""" 
     265 
     266        log = self.getSvnLog('svn-svn_repos_root_test') 
     267        csets = list(changesets_from_svnlog(log, 'svn+ssh://caia/tmp/svn', '/', 
     268                                            chunksize=100)) 
     269        self.assertEqual(len(csets), 4) 
Note: See TracChangeset for help on using the changeset viewer.