⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 svn_fs.py

📁 subversion-1.4.3-1.tar.gz 配置svn的源码
💻 PY
📖 第 1 页 / 共 2 页
字号:
            entry_props = 0 # ("... typically used only for working copy updates")            repos.svn_repos_dir_delta(old_root, old_path, '',                                      new_root, new_path,                                      e_ptr, e_baton, authz_cb,                                      text_deltas,                                      1, # directory                                      entry_props,                                      ignore_ancestry)            for path, kind, change in editor.deltas:                old_node = new_node = None                if change != Changeset.ADD:                    old_node = self.get_node(posixpath.join(old_path, path), old_rev)                if change != Changeset.DELETE:                    new_node = self.get_node(posixpath.join(new_path, path), new_rev)                else:                    kind = _kindmap[fs.check_path(old_root, old_node.path)]                yield  (old_node, new_node, kind, change)        else:            old_root = fs.revision_root(self.fs_ptr, old_rev)            new_root = fs.revision_root(self.fs_ptr, new_rev)            if fs.contents_changed(old_root, old_path, new_root, new_path):                yield (old_node, new_node, Node.FILE, Changeset.EDIT)class SubversionNode(Node):    def __init__(self, path, rev, authz, scope, fs_ptr):        self.authz = authz        self.scope = scope        if scope != '/':            self.scoped_path = scope + path        else:            self.scoped_path = path        self.fs_ptr = fs_ptr        self._requested_rev = rev        self.root = fs.revision_root(fs_ptr, rev)        node_type = fs.check_path(self.root, self.scoped_path)        if not node_type in _kindmap:            raise TracError, "No node at %s in revision %s" % (path, rev)        self.created_rev = fs.node_created_rev(self.root, self.scoped_path)        self.created_path = fs.node_created_path(self.root, self.scoped_path)        # Note: 'created_path' differs from 'path' if the last change was a copy,        #        and furthermore, 'path' might not exist at 'create_rev'.        #        The only guarantees are:        #          * this node exists at (path,rev)        #          * the node existed at (created_path,created_rev)        # TODO: check node id        self.rev = self.created_rev                Node.__init__(self, path, self.rev, _kindmap[node_type])    def get_content(self):        if self.isdir:            return None        return core.Stream(fs.file_contents(self.root, self.scoped_path))    def get_entries(self):        if self.isfile:            return        entries = fs.dir_entries(self.root, self.scoped_path)        for item in entries.keys():            path = '/'.join((self.path, item))            if not self.authz.has_permission(path):                continue            yield SubversionNode(path, self._requested_rev, self.authz,                                 self.scope, self.fs_ptr)    def get_history(self,limit=None):        newer = None # 'newer' is the previously seen history tuple        older = None # 'older' is the currently examined history tuple        for path, rev in _get_history(self.scoped_path, self.authz, self.fs_ptr,                                      0, self._requested_rev, limit):            if rev > 0 and path.startswith(self.scope):                older = (path[len(self.scope):], rev, Changeset.ADD)                if newer:                    change = newer[0] == older[0] and Changeset.EDIT or Changeset.COPY                    newer = (newer[0], newer[1], change)                    yield newer                newer = older        if newer:            yield newer#    def get_previous(self):#        # FIXME: redo it with fs.node_history    def get_properties(self):        props = fs.node_proplist(self.root, self.scoped_path)        for name,value in props.items():            props[name] = str(value) # Make sure the value is a proper string        return props    def get_content_length(self):        if self.isdir:            return None        return fs.file_length(self.root, self.scoped_path)    def get_content_type(self):        if self.isdir:            return None        return self._get_prop(core.SVN_PROP_MIME_TYPE)    def get_last_modified(self):        date = fs.revision_prop(self.fs_ptr, self.created_rev,                                core.SVN_PROP_REVISION_DATE)        return core.svn_time_from_cstring(date) / 1000000    def _get_prop(self, name):        return fs.node_prop(self.root, self.scoped_path, name)class SubversionChangeset(Changeset):    def __init__(self, rev, authz, scope, fs_ptr):        self.rev = rev        self.authz = authz        self.scope = scope        self.fs_ptr = fs_ptr        message = self._get_prop(core.SVN_PROP_REVISION_LOG)        author = self._get_prop(core.SVN_PROP_REVISION_AUTHOR)        date = self._get_prop(core.SVN_PROP_REVISION_DATE)        date = core.svn_time_from_cstring(date) / 1000000        Changeset.__init__(self, rev, message, author, date)    def get_changes(self):        root = fs.revision_root(self.fs_ptr, self.rev)        editor = repos.RevisionChangeCollector(self.fs_ptr, self.rev)        e_ptr, e_baton = delta.make_editor(editor)        repos.svn_repos_replay(root, e_ptr, e_baton)        idx = 0        copies, deletions = {}, {}        changes = []        for path, change in editor.changes.items():            if not self.authz.has_permission(path):                # FIXME: what about base_path?                continue            if not path.startswith(self.scope[1:]):                continue            base_path = None            if change.base_path:                if change.base_path.startswith(self.scope):                    base_path = change.base_path[len(self.scope):]                else:                    base_path = None            action = ''            if not change.path:                action = Changeset.DELETE                deletions[change.base_path] = idx            elif change.added:                if change.base_path and change.base_rev:                    action = Changeset.COPY                    copies[change.base_path] = idx                else:                    action = Changeset.ADD            else:                action = Changeset.EDIT            kind = _kindmap[change.item_kind]            path = path[len(self.scope) - 1:]            changes.append([path, kind, action, base_path, change.base_rev])            idx += 1        moves = []        for k,v in copies.items():            if k in deletions:                changes[v][2] = Changeset.MOVE                moves.append(deletions[k])        offset = 0        for i in moves:            del changes[i - offset]            offset += 1        for change in changes:            yield tuple(change)    def _get_prop(self, name):        return fs.revision_prop(self.fs_ptr, self.rev, name)## Delta editor for diffs between arbitrary nodes## Note 1: the 'copyfrom_path' and 'copyfrom_rev' information is not used#         because 'repos.svn_repos_dir_delta' *doesn't* provide it.## Note 2: the 'dir_baton' is the path of the parent directory#class DiffChangeEditor(delta.Editor):     def __init__(self):        self.deltas = []        # -- svn.delta.Editor callbacks    def open_root(self, base_revision, dir_pool):        return ('/', Changeset.EDIT)    def add_directory(self, path, dir_baton, copyfrom_path, copyfrom_rev, dir_pool):        self.deltas.append((path, Node.DIRECTORY, Changeset.ADD))        return (path, Changeset.ADD)    def open_directory(self, path, dir_baton, base_revision, dir_pool):        return (path, dir_baton[1])    def change_dir_prop(self, dir_baton, name, value, pool):        path, change = dir_baton        if change != Changeset.ADD:            self.deltas.append((path, Node.DIRECTORY, change))    def delete_entry(self, path, revision, dir_baton, pool):        self.deltas.append((path, None, Changeset.DELETE))    def add_file(self, path, dir_baton, copyfrom_path, copyfrom_revision, dir_pool):        self.deltas.append((path, Node.FILE, Changeset.ADD))    def open_file(self, path, dir_baton, dummy_rev, file_pool):        self.deltas.append((path, Node.FILE, Changeset.EDIT))class TracError(Exception):    def __init__(self, message, title=None, show_traceback=0):        Exception.__init__(self, message)        self.message = message        self.title = title        self.show_traceback = show_traceback

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -