📄 svn_fs.py
字号:
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 + -