Changeset 1785


Ignore:
Timestamp:
Dec 9, 2006 3:21:19 PM (12 years ago)
Author:
hazmat
Message:

a little more progress, setup properties for usage

File:
1 edited

Legend:

Unmodified
Added
Removed
  • ore.svnfs/trunk/src/ore/svnfs/svnfs.py

    r1783 r1785  
    11""" 
     2 
     3notes 
     4 
     5 - hardlinking seems problematic 
     6  
    27$Id$ 
    38""" 
    49 
    5 from ore.svn import SubversionContext, file, directory 
    610import fuse 
    711import logging 
    812import transaction 
     13 
     14from zope import component 
     15 
     16from ore.svn import SubversionContext, node, file, directory, property, interfaces 
    917 
    1018# Setup logging 
     
    1523log.addHandler( handler ) 
    1624 
    17  
     25def decode_node(  propsheet, value ) 
     26    revision, path = value 
     27    context = propsheet.node.getSVNContext() 
     28    try: # fetch from head 
     29        node = context.traverse( path ) 
     30    except KeyError: 
     31        rev = context.getRevision() 
     32        context.setRevision( rev ) 
     33        node = context.traverse( path ) 
     34        context.setRevision( revision )  
     35    return node 
     36 
     37def encode_node( value ) 
     38    if interfaces.ISubversionNode.providedBy( value ): 
     39        value = (str( value.getSVNContext().getRevision() ), value.svn_path) 
     40    elif isinstance( value, (tuple, list ) ): 
     41        pass 
     42    else: 
     43        raise SyntaxError("Invalid Node Pointer Value %r"%value) 
     44    return value    
     45     
     46class node_pointer( property.list_property ): 
     47 
     48    def __get__( self, propsheet, name ): 
     49        value = super( nodeproperty, self).__get__( propsheet, self.propname ) 
     50        if not value: 
     51            return value 
     52        node = self.decode( propsheet, value ) 
     53        return node 
     54 
     55    def __set__( self, propsheet, value ): 
     56        value = self.encode( value ) 
     57        super( node_pointer, self).__set__( propsheet, value ) 
     58         
     59class node_pointer_set( property.object_property ): 
     60 
     61    def __set__( self, propsheet, value ): 
     62        if not isinstance( value, (tuple, list )): 
     63            pass 
     64        nset = map( encode_node, value ) 
     65        super( node_pointer_set, self).__set__( propsheet, nset ) 
     66         
     67    def __get__( self, propsheet, name): 
     68        value = super( node_pointer_set ) 
     69        if not value: 
     70            return () 
     71        nset = map( decode_node, zip( value, [ propsheet ]*len(value ) ) ) 
     72        return nset 
     73             
     74         
     75class FilesystemPropertySheet( property.NodePropertySheet ): 
     76    attribute_map = { 'link_target' : ('node_pointer', 'fs:link_target'),  
     77                      'source_links' : ('node_set', 'fs:link_sources'), # links to this node from the link source pointers 
     78                      'mode' : ('int', 'fs:mode'), 
     79                      'inode' : ('int', 'fs:inode'),                       
     80                      'device' : ('int', 'fs:device'), 
     81                      'uid' : ('int', 'fs:uid'), 
     82                      'gid' : ('int', 'fs:gid'), 
     83                 } 
     84 
     85    type_map = {'node' : property.node_property, 
     86                'list' : property.list_property, 
     87                'object' : property.object_property, 
     88                'node_pointer' : node_pointer, 
     89                'int' : int_property, 
     90                'node_set' : node_pointer_set } 
     91 
     92    def setup3( klass ): 
     93        pass 
     94     
    1895class SubversionFile( object ): 
    1996 
Note: See TracChangeset for help on using the changeset viewer.