Rev 1269: Use svn_get_dir() to walk over directory contents. in http://people.samba.org/bzr/jelmer/bzr-svn/0.4
Jelmer Vernooij
jelmer at samba.org
Sun Jun 22 14:35:51 BST 2008
At http://people.samba.org/bzr/jelmer/bzr-svn/0.4
------------------------------------------------------------
revno: 1269
revision-id: jelmer at samba.org-20080622133550-ybfqafgay8gh1cei
parent: jelmer at samba.org-20080622133517-ant471fwmcdxgue2
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.4
timestamp: Sun 2008-06-22 15:35:50 +0200
message:
Use svn_get_dir() to walk over directory contents.
modified:
logwalker.py logwalker.py-20060621215743-c13fhfnyzh1xzwh2-1
=== modified file 'logwalker.py'
--- a/logwalker.py 2008-06-22 08:45:53 +0000
+++ b/logwalker.py 2008-06-22 13:35:50 +0000
@@ -23,7 +23,8 @@
from bzrlib.plugins.svn import changes, core
from bzrlib.plugins.svn.cache import CacheTable
from bzrlib.plugins.svn.core import SubversionException
-from bzrlib.plugins.svn.errors import ERR_FS_NO_SUCH_REVISION, ERR_FS_NOT_FOUND
+from bzrlib.plugins.svn.errors import ERR_FS_NO_SUCH_REVISION, ERR_FS_NOT_FOUND, ERR_FS_NOT_DIRECTORY
+from bzrlib.plugins.svn.ra import DIRENT_KIND
from bzrlib.plugins.svn.transport import SvnRaTransport
class lazy_dict(object):
@@ -389,67 +390,25 @@
assert isinstance(path, str), "invalid path"
path = path.strip("/")
conn = self._transport.connections.get(self._transport.get_svn_repos_root())
- try:
- ft = conn.check_path(path, revnum)
- if ft == core.NODE_FILE:
- return []
- assert ft == core.NODE_DIR
- finally:
- self._transport.connections.add(conn)
-
- class FileTreeLister(object):
- def change_prop(self, name, value): pass
- def close(self): pass
- def apply_textdelta(self, checksum=None): pass
-
-
- class DirTreeLister(object):
- def __init__(self, tree, path):
- self.tree = tree
- self.path = path
-
- def change_prop(self, name, value):
- pass
-
- def close(self):
- pass
-
- def add_directory(self, path, copyfrom_path=None, copyfrom_revnum=-1):
- """See Editor.add_directory()."""
- self.tree.files.append(urlutils.join(self.tree.base, path))
- return DirTreeLister(self.tree, path)
-
- def add_file(self, path, copyfrom_path=None, copyfrom_revnum=-1):
- self.tree.files.append(urlutils.join(self.tree.base, path))
- return FileTreeLister()
-
- class TreeLister(object):
- def __init__(self, base):
- self.files = []
- self.base = base
-
- def set_target_revision(self, rev):
- pass
-
- def open_root(self, revnum):
- """See Editor.open_root()."""
- return DirTreeLister(self, path)
-
- def close(self):
- pass
-
- def abort(self):
- pass
-
- editor = TreeLister(path)
- try:
- conn = self._transport.connections.get(urlutils.join(self._transport.get_svn_repos_root(), path))
- reporter = conn.do_update(revnum, "", True, editor)
- reporter.set_path("", revnum, True, None)
- reporter.finish()
- finally:
- self._transport.connections.add(conn)
- return editor.files
+ results = []
+ unchecked_dirs = set([path])
+ try:
+ while len(unchecked_dirs) > 0:
+ nextp = unchecked_dirs.pop()
+ try:
+ dirents = conn.get_dir(nextp, revnum, DIRENT_KIND)[0]
+ except SubversionException, (_, num):
+ if num == ERR_FS_NOT_DIRECTORY:
+ continue
+ raise
+ for k,v in dirents.items():
+ childp = urlutils.join(nextp, k)
+ if v['kind'] == core.NODE_DIR:
+ unchecked_dirs.add(childp)
+ results.append(childp)
+ finally:
+ self._transport.connections.add(conn)
+ return results
def get_previous(self, path, revnum):
"""Return path,revnum pair specified pair was derived from.
More information about the bazaar-commits
mailing list