Changeset 932 in tailor


Ignore:
Timestamp:
10/20/05 23:29:35 (8 years ago)
Author:
lele@…
Hash name:
20051020212935-7a6fb-ac338d99f0cbd94c04e3e003c1ec7ce26670fa7d
Message:

Use an incremental parser for darcs changes
Now the changesets_from_darcschanges() function is a generator, and does
not reorder changeset by date, which was wrong and useless.

Location:
vcpx
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • vcpx/darcs.py

    r894 r932  
    2323""" 
    2424 
    25 def changesets_from_darcschanges(changes, unidiff=False, repodir=None): 
     25def changesets_from_darcschanges(changes, unidiff=False, repodir=None, 
     26                                 chunksize=2**15): 
    2627    """ 
    2728    Parse XML output of ``darcs changes``. 
     
    3435 
    3536    csets = changesets_from_darcschanges_unsafe(changes, unidiff, 
    36                                                 repodir) 
     37                                                repodir, chunksize) 
    3738    for cs in csets: 
    3839        cs.tags = None 
    39     return csets 
    40  
    41  
    42 def changesets_from_darcschanges_unsafe(changes, unidiff=False, repodir=None): 
     40        yield cs 
     41 
     42def changesets_from_darcschanges_unsafe(changes, unidiff=False, repodir=None, 
     43                                        chunksize=2**15): 
    4344    """ 
    4445    Do the real work of parsing the change log, including tags. 
     
    5354    changesets_from_darcschanges. 
    5455    """ 
    55     from xml.sax import parse 
    56     from xml.sax.handler import ContentHandler 
     56    from xml.sax import make_parser 
     57    from xml.sax.handler import ContentHandler, ErrorHandler 
    5758    from changes import ChangesetEntry, Changeset 
    5859    from datetime import datetime 
     
    142143            self.current_field.append(data) 
    143144 
    144  
     145    parser = make_parser() 
    145146    handler = DarcsXMLChangesHandler() 
    146     parse(changes, handler) 
    147     changesets = handler.changesets 
    148  
    149     # sort changeset by date 
    150     changesets.sort(lambda x, y: cmp(x.date, y.date)) 
    151  
    152     return changesets 
    153  
     147    parser.setContentHandler(handler) 
     148    parser.setErrorHandler(ErrorHandler()) 
     149 
     150    chunk = changes.read(chunksize) 
     151    while chunk: 
     152        parser.feed(chunk) 
     153        for cs in handler.changesets: 
     154            yield cs 
     155        handler.changesets = [] 
     156        chunk = changes.read(chunksize) 
     157    parser.close() 
     158    for cs in handler.changesets: 
     159        yield cs 
    154160 
    155161class DarcsWorkingDir(UpdatableSourceWorkingDir,SyncronizableTargetWorkingDir): 
     
    184190                         l == 'No remote changes to pull in!\n'): 
    185191            l = output.readline() 
    186  
    187         changesets = [] 
    188192 
    189193        if l <> 'No remote changes to pull in!\n': 
     
    239243                          "propagate tags from darcs." % name 
    240244                else: 
    241                     changesets.append(cset) 
     245                    yield cset 
    242246 
    243247                while not l.strip(): 
    244248                    l = output.readline() 
    245  
    246         return changesets 
    247249 
    248250    def _applyChangeset(self, changeset): 
     
    303305        last = changesets_from_darcschanges(changes.execute(stdout=PIPE)[0]) 
    304306        if last: 
    305             changeset.entries.extend(last[0].entries) 
     307            changeset.entries.extend(last.next().entries) 
    306308 
    307309        return conflicts 
     
    335337            initial = True 
    336338            cmd = self.repository.command("changes", "--xml-output", 
    337                                           "--repo", self.repository.repository) 
     339                                          "--repo", self.repository.repository, 
     340                                           "--reverse") 
    338341            changes = ExternalCommand(command=cmd) 
    339342            output = changes.execute(stdout=PIPE, stderr=STDOUT)[0] 
     
    346349 
    347350            csets = changesets_from_darcschanges(output) 
    348             changeset = csets[0] 
     351            changeset = csets.next() 
    349352 
    350353            revision = 'hash %s' % changeset.darcs_hash 
     
    407410        last = changesets_from_darcschanges(output) 
    408411 
    409         return last[0] 
     412        return last.next() 
    410413 
    411414 
     
    636639        """ 
    637640        cmd = self.repository.command("changes", "--from-match=not name ^TAG", 
    638                                       "--xml-output") 
     641                                      "--xml-output", "--reverse") 
    639642        changes =  ExternalCommand(cwd=self.basedir, command=cmd) 
    640643        output = changes.execute(stdout=PIPE, stderr=STDOUT)[0] 
  • vcpx/tests/darcs.py

    r882 r932  
    5050        csets = changesets_from_darcschanges(log) 
    5151 
    52         self.assertEqual(len(csets), 2) 
     52        cset = csets.next() 
     53        self.assertEqual(cset.revision, 
     54                         "Fix the CVS parser to omit already seen changesets") 
     55        self.assertEqual(cset.author, "lele@nautilus.homeip.net") 
     56        self.assertEqual(cset.date, datetime(2004, 7, 16, 12, 37, 37)) 
     57        self.assertEqual(cset.log, 
     58                         "Fix the CVS parser to omit already seen changesets\n" 
     59                         "For some unknown reasons....") 
     60        entry = cset.entries[0] 
     61        self.assertEqual(entry.name, 'vcpx/cvs.py') 
     62        self.assertEqual(entry.action_kind, entry.UPDATED) 
    5363 
    54         cset = csets[0] 
     64        cset = csets.next() 
    5565        self.assertEqual(cset.revision, 
    5666                         "Svn log parser with test") 
     
    7383        self.assertEqual(entry.action_kind, entry.ADDED) 
    7484 
    75         cset = csets[1] 
    76         self.assertEqual(cset.revision, 
    77                          "Fix the CVS parser to omit already seen changesets") 
    78         self.assertEqual(cset.author, "lele@nautilus.homeip.net") 
    79         self.assertEqual(cset.date, datetime(2004, 7, 16, 12, 37, 37)) 
    80         self.assertEqual(cset.log, 
    81                          "Fix the CVS parser to omit already seen changesets\n" 
    82                          "For some unknown reasons....") 
    83         entry = cset.entries[0] 
    84         self.assertEqual(entry.name, 'vcpx/cvs.py') 
    85         self.assertEqual(entry.action_kind, entry.UPDATED) 
    86  
    8785    def testOnTailorOwnRepo(self): 
    8886        """Verify fetching unidiff of a darcs patch""" 
     
    9694                                             unidiff=True, 
    9795                                             repodir=getcwd()) 
    98         unidiff = csets[0].unidiff 
     96        unidiff = csets.next().unidiff 
    9997        head = unidiff.split('\n')[0] 
    10098        self.assertEqual(head, 'Thu Jun  9 22:17:11 CEST 2005  zooko@zooko.com') 
     
    146144        log = StringIO(self.ALL_ACTIONS_TEST) 
    147145 
    148         csets = changesets_from_darcschanges(log) 
     146        csets = list(changesets_from_darcschanges(log)) 
    149147 
    150148        self.assertEqual(len(csets), 4) 
     
    188186        self.assertEqual(entry.name, 'a.txt') 
    189187        self.assertEqual(entry.action_kind, entry.UPDATED) 
     188 
     189    def testIncrementalParser(self): 
     190        """Verify that the parser is effectively incremental""" 
     191 
     192        log = StringIO(self.ALL_ACTIONS_TEST) 
     193 
     194        csets = list(changesets_from_darcschanges(log, chunksize=100)) 
     195        self.assertEqual(len(csets), 4) 
Note: See TracChangeset for help on using the changeset viewer.