#!/usr/bin/env python # # entry.py: module to parse '.svn/entries' file # # Subversion is a tool for revision control. # See http://subversion.tigris.org for more information. # # ==================================================================== # Copyright (c) 2000-2004 CollabNet. All rights reserved. # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms # are also available at http://subversion.tigris.org/license-1.html. # If newer versions of this license are posted there, you may use a # newer version instead, at your option. # ###################################################################### # # Usage: # # Just call svn_entry.get_entries(path), where PATH is exact path # to an 'entries' file. You'll get back a hash of svn_entry # objects keyed by name. # # Each object contains a hash 'atts' that you can examine: name, # kind, revision, ancestor. Other optional keys *might* be # present, such as prop-time, text-time, add, delete, conflict. import xml.parsers.expat # you may need to install this package class svn_entry: "An object that represents an entry from an 'entries' file." def __init__(self, attributes): # constructor self.atts = attributes def prettyprint(self): print " Entryname:", self.atts['name'] print " Kind:", self.atts['kind'] print " Revision:", self.atts['revision'] print " Ancestor:", self.atts['ancestor'] print " all atts:", self.atts print class svn_entryparser: "A class to parse an 'entries' file." def __init__(self): # constructor self.entry_dict = {} self.parser = xml.parsers.expat.ParserCreate() self.parser.StartElementHandler = self.handle_start_tag def handle_start_tag(self, name, attrs): "Expat callback that receives a new open-tag." if attrs.has_key('name'): entry = svn_entry(attrs) # create new entry object # Derive missing values if not entry.atts.has_key('kind'): entry.atts['kind'] = 'file' # default kind if none mentioned if not entry.atts.has_key('revision'): if self.entry_dict.has_key(""): parent = self.entry_dict[""] entry.atts['revision'] = parent.atts['revision'] if not entry.atts.has_key('ancestor'): if self.entry_dict.has_key(""): parent = self.entry_dict[""] entry.atts['ancestor'] = parent.atts['ancestor'] + '/' \ + entry.atts['name'] self.entry_dict[attrs['name']] = entry # store the new entry # The main exported routine def get_entries(path): "Parse the entries file at PATH and return a list of svn_entry objects." entryparser = svn_entryparser() # make a parser instance fp = open(path, 'r') entryparser.parser.ParseFile(fp) fp.close() return entryparser.entry_dict ### End of file.