Example #1
0
class _GitFileStorer(object):
    PROXY_PROPERTIES = set(['closed', 'encoding', 'errors', 'mode', 'name',
                            'newlines', 'softspace'])
    PROXY_METHODS = ('__iter__', 'flush', 'fileno', 'isatty', 'next', 'read',
                     'readline', 'readlines', 'xreadlines', 'seek', 'tell',
                     'truncate', 'write', 'writelines')
    
    def __init__(self, backend, filename, mode):
        self._filename = filename
        self._lockfilename = '%s.lock' % self._filename
        fd = backend.open(self._lockfilename)
        self._file = BytesIO(fd['data'])
        self._closed = False
        for method in self.PROXY_METHODS:
            setattr(self, method, getattr(self._file, method))

    def abort(self):
        if self._closed:
            return
        self._file.close()
        del self._file
        self._file.remove({'__filename': self._lockfilename})
        self._closed = True
        
    def close(self):
        if self._closed:
            return
        self._file.close()
        self._file.update({'__filename':self._lockfilename},{'$set':{'__filename':self._file}})
        self.abort()

    def __getattr__(self, name):
        """Proxy property calls to the underlying file."""
        if name in self.PROXY_PROPERTIES:
            return getattr(self._file, name)
        raise AttributeError(name)