Пример #1
0
 def do_open(self, rev='HEAD'):
     self.fs = SvnRepositoryFilesystem(svnurl, rev)
Пример #2
0
class SvnFS(PathFs):

    def __init__(self, svnurl, root=''):
        super(SvnFS, self).__init__(root)
        self.svnurl = svnurl
        self.openfiles = weakref.WeakValueDictionary()
        self.creationtimes = {}
        self.do_open()

    def do_open(self, rev='HEAD'):
        self.fs = SvnRepositoryFilesystem(svnurl, rev)

    def do_commit(self, msg):
        rev = self.fs.commit(msg)
        if rev is None:
            print '* no changes.'
        else:
            print '* checked in revision %d.' % (rev,)
        self.do_open()

    def do_status(self, path=''):
        print '* status'
        result = []
        if path and not path.endswith('/'):
            path += '/'
        for delta in self.fs._compute_deltas():
            if delta.path.startswith(path):
                if delta.oldrev is None:
                    c = 'A'
                elif delta.newrev is None:
                    c = 'D'
                else:
                    c = 'M'
                result.append('    %s  %s\n' % (c, delta.path[len(path):]))
        return ''.join(result)

    def getattr(self, path):
        stat = self.fs.stat(path)
        if stat['svn:entry:kind'] == 'dir':
            s = S_IFDIR
            mode = 0777
        else:
            s = S_IFREG
            mode = 0666
        try:
            time = pysvn.date.decode(stat['svn:entry:committed-date'])
        except KeyError:
            try:
                time = self.creationtimes[path]
            except KeyError:
                time = self.creationtimes[path] = now()
        return self.mkattr(path,
                           size    = stat.get('svn:entry:size', 0),
                           st_kind = s,
                           mode    = mode,
                           time    = time)

    def setattr(self, path, mode, uid, gid, size, atime, mtime):
        if size is not None:
            data = self.fs.read(path)
            if size < len(data):
                self.fs.write(path, data[:size])
            elif size > len(data):
                self.fs.write(path, data + '\x00' * (size - len(data)))

    def listdir(self, path):
        for name in self.fs.listdir(path):
            kind = self.fs.check_path(posixpath.join(path, name))
            if kind == 'dir':
                yield name, TYPE_DIR
            else:
                yield name, TYPE_REG

    def check_path(self, path):
        kind = self.fs.check_path(path)
        return kind is not None

    def open(self, path, mode):
        try:
            of = self.openfiles[path]
        except KeyError:
            of = self.openfiles[path] = OpenFile(self.fs.read(path))
        return of, FOPEN_KEEP_CACHE

    def modified(self, path):
        try:
            of = self.openfiles[path]
        except KeyError:
            pass
        else:
            self.fs.write(path, of.f.getvalue())

    def mknod_path(self, path, mode):
        self.fs.add(path)

    def mkdir_path(self, path, mode):
        self.fs.mkdir(path)

    def unlink_path(self, path):
        self.fs.unlink(path)

    def rmdir_path(self, path):
        self.fs.rmdir(path)

    def rename_path(self, oldpath, newpath):
        kind = self.fs.check_path(oldpath)
        if kind is None:
            return False
        self.fs.move(oldpath, newpath, kind)
        return True

    def getxattrs(self, path):
        return XAttrs(self, path)