Changeset 103 in tailor


Ignore:
Timestamp:
07/17/04 03:04:43 (9 years ago)
Author:
lele@…
Hash name:
20040717010443-de980-014ad4d864952411584d8404bb31f04e36cf7e11
Message:

Added some tests against darcs changes xml parser

Location:
vcpx
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • vcpx/darcs.py

    r102 r103  
    8181 
    8282 
     83def changesets_from_darcschanges(changes): 
     84    from xml.sax import parseString 
     85    from xml.sax.handler import ContentHandler 
     86    from changes import ChangesetEntry, Changeset 
     87    from datetime import datetime 
     88 
     89    class DarcsXMLChangesHandler(ContentHandler): 
     90        def __init__(self): 
     91            self.changesets = [] 
     92            self.current = None 
     93            self.current_field = [] 
     94 
     95        def startElement(self, name, attributes): 
     96            if name == 'patch': 
     97                self.current = {} 
     98                self.current['author'] = attributes['author'] 
     99                date = attributes['date'] 
     100                # 20040619130027 
     101                y = int(date[:4]) 
     102                m = int(date[4:6]) 
     103                d = int(date[6:8]) 
     104                hh = int(date[8:10]) 
     105                mm = int(date[10:12]) 
     106                ss = int(date[12:14]) 
     107                timestamp = datetime(y, m, d, hh, mm, ss) 
     108                self.current['date'] = timestamp 
     109                self.current['comment'] = '' 
     110                self.current['entries'] = [] 
     111            elif name in ['name', 'comment', 
     112                          'add_file', 'add_directory', 
     113                          'modify_file', 'remove_file']: 
     114                self.current_field = [] 
     115            elif name == 'move': 
     116                self.old_name = attributes['from'] 
     117                self.new_name = attributes['to'] 
     118 
     119        def endElement(self, name): 
     120            if name == 'patch': 
     121                # Sort the paths to make tests easier 
     122                self.current['entries'].sort() 
     123                self.changesets.append(Changeset(self.current['name'], 
     124                                                 self.current['date'], 
     125                                                 self.current['author'], 
     126                                                 self.current['comment'], 
     127                                                 self.current['entries'])) 
     128                self.current = None 
     129            elif name in ['name', 'comment']: 
     130                self.current[name] = ''.join(self.current_field) 
     131            elif name == 'move': 
     132                entry = ChangesetEntry(self.new_name) 
     133                entry.action_kind = entry.RENAMED 
     134                entry.old_name = self.old_name 
     135                self.current['entries'].append(entry) 
     136            elif name in ['add_file', 'add_directory', 
     137                          'modify_file', 'remove_file']: 
     138                entry = ChangesetEntry(''.join(self.current_field)) 
     139                entry.action_kind = { 'add_file': entry.ADDED, 
     140                                      'add_directory': entry.ADDED, 
     141                                      'modify_file': entry.UPDATED, 
     142                                      'remove_file': entry.DELETED, 
     143                                      'rename_file': entry.RENAMED 
     144                                    }[name] 
     145 
     146                self.current['entries'].append(entry) 
     147 
     148        def characters(self, data): 
     149            self.current_field.append(data) 
     150 
     151    handler = DarcsXMLChangesHandler() 
     152    parseString(changes.getvalue(), handler) 
     153 
     154    changesets = handler.changesets 
     155     
     156    # sort changeset by date 
     157    changesets.sort(lambda x, y: cmp(x.date, y.date)) 
     158 
     159    return changesets 
     160 
     161     
    83162class DarcsWorkingDir(UpdatableSourceWorkingDir,SyncronizableTargetWorkingDir): 
    84163    """ 
     
    109188        changes = c(output=True, patch=sincerev) 
    110189 
    111         changesets = self.__parseDarcsChanges(changes) 
    112  
    113         # sort changeset by date 
    114         changesets.sort(lambda x, y: cmp(x.date, y.date)) 
     190        changesets = changesets_from_darcschanges(changes) 
    115191 
    116192        return changesets 
    117      
    118     def __parseDarcsChanges(self, changes): 
    119         from xml.sax import parseString 
    120         from xml.sax.handler import ContentHandler 
    121         from changes import ChangesetEntry, Changeset 
    122         from datetime import datetime 
    123          
    124         class DarcsXMLChangesHandler(ContentHandler): 
    125             def __init__(self): 
    126                 self.changesets = [] 
    127                 self.current = None 
    128                 self.current_field = [] 
    129  
    130             def startElement(self, name, attributes): 
    131                 if name == 'patch': 
    132                     self.current = {} 
    133                     self.current['author'] = attributes['author'] 
    134                     date = attributes['date'] 
    135                     # 20040619130027 
    136                     y = int(date[:4]) 
    137                     m = int(date[4:6]) 
    138                     d = int(date[6:8]) 
    139                     hh = int(date[8:10]) 
    140                     mm = int(date[10:12]) 
    141                     ss = int(date[12:14]) 
    142                     timestamp = datetime(y, m, d, hh, mm, ss) 
    143                     self.current['date'] = timestamp 
    144                     self.current['comment'] = '' 
    145                     self.current['entries'] = [] 
    146                 elif name in ['name', 'comment', 
    147                               'add_file', 'add_directory', 
    148                               'modify_file', 'remove_file']: 
    149                     self.current_field = [] 
    150                 elif name == 'path': 
    151                     self.current_field = [] 
    152                     if attributes.has_key('copyfrom-path'): 
    153                         self.current_path_action = ( 
    154                             attributes['action'], 
    155                             attributes['copyfrom-path'][1:], # make it relative 
    156                             attributes['copyfrom-rev']) 
    157                     else: 
    158                         self.current_path_action = attributes['action'] 
    159                 elif name == 'move': 
    160                     self.old_name = attributes['from'] 
    161                     self.new_name = attributes['to'] 
    162                      
    163             def endElement(self, name): 
    164                 if name == 'patch': 
    165                     # Sort the paths to make tests easier 
    166                     self.current['entries'].sort() 
    167                     self.changesets.append(Changeset(self.current['name'], 
    168                                                      self.current['date'], 
    169                                                      self.current['author'], 
    170                                                      self.current['comment'], 
    171                                                      self.current['entries'])) 
    172                     self.current = None 
    173                 elif name in ['name', 'comment']: 
    174                     self.current[name] = ''.join(self.current_field) 
    175                 elif name == 'move': 
    176                     entry = ChangesetEntry(self.new_name) 
    177                     entry.action_kind = entry.RENAMED 
    178                     entry.old_name = self.old_name 
    179                     self.current['entries'].append(entry) 
    180                 elif name in ['add_file', 'add_directory', 
    181                               'modify_file', 'remove_file']: 
    182                     entry = ChangesetEntry(''.join(self.current_field)) 
    183                     entry.action_kind = { 'add_file': entry.ADDED, 
    184                                           'add_directory': entry.ADDED, 
    185                                           'modify_file': entry.UPDATED, 
    186                                           'remove_file': entry.DELETED, 
    187                                           'rename_file': entry.RENAMED 
    188                                         }[name] 
    189  
    190                     self.current['entries'].append(entry) 
    191  
    192             def characters(self, data): 
    193                 self.current_field.append(data) 
    194          
    195         handler = DarcsXMLChangesHandler() 
    196         parseString(changes.getvalue(), handler) 
    197         return handler.changesets 
    198          
     193             
    199194    def _applyChangeset(self, root, changeset, logger=None): 
    200195        """ 
     
    225220        c = DarcsLastChange(working_dir=wdir) 
    226221        changes = c(output=True) 
    227         last = self.__parseDarcsChanges(c(output=True)) 
     222        last = changesets_from_darcschanges(c(output=True)) 
    228223         
    229224        return last[0].revision 
  • vcpx/tests/__init__.py

    r73 r103  
    88from cvsps import * 
    99from cvs import * 
     10from darcs import * 
    1011 
    1112SystemCommand.VERBOSE = False 
Note: See TracChangeset for help on using the changeset viewer.