mirror of
https://github.com/tahoe-lafs/tahoe-lafs.git
synced 2025-03-05 05:19:33 +00:00
add IDirectoryNode.get_child_at_path
This commit is contained in:
parent
9dc9f59a86
commit
9e42dda6a4
src/allmydata
@ -362,6 +362,20 @@ class ImmutableDirectoryNode:
|
|||||||
wk, we, rk, index = hashutil.generate_dirnode_keys_from_readkey(rk)
|
wk, we, rk, index = hashutil.generate_dirnode_keys_from_readkey(rk)
|
||||||
return "DIR-REFRESH:%s" % idlib.b2a(index)
|
return "DIR-REFRESH:%s" % idlib.b2a(index)
|
||||||
|
|
||||||
|
def get_child_at_path(self, path):
|
||||||
|
if not path:
|
||||||
|
return self
|
||||||
|
if isinstance(path, (str, unicode)):
|
||||||
|
path = path.split("/")
|
||||||
|
childname = path[0]
|
||||||
|
remaining_path = path[1:]
|
||||||
|
d = self.get(childname)
|
||||||
|
if remaining_path:
|
||||||
|
def _got(node):
|
||||||
|
return node.get_child_at_path(remaining_path)
|
||||||
|
d.addCallback(_got)
|
||||||
|
return d
|
||||||
|
|
||||||
class MutableDirectoryNode(ImmutableDirectoryNode):
|
class MutableDirectoryNode(ImmutableDirectoryNode):
|
||||||
implements(IDirectoryNode)
|
implements(IDirectoryNode)
|
||||||
|
|
||||||
|
@ -260,6 +260,17 @@ class IDirectoryNode(Interface):
|
|||||||
"""I return a Deferred that fires with a specific named child node,
|
"""I return a Deferred that fires with a specific named child node,
|
||||||
either an IFileNode or an IDirectoryNode."""
|
either an IFileNode or an IDirectoryNode."""
|
||||||
|
|
||||||
|
def get_child_at_path(path):
|
||||||
|
"""Transform a child path into an IDirectoryNode or IFileNode.
|
||||||
|
|
||||||
|
I perform a recursive series of 'get' operations to find the named
|
||||||
|
descendant node. I return a Deferred that fires with the node, or
|
||||||
|
errbacks with IndexError if the node could not be found.
|
||||||
|
|
||||||
|
The path can be either a single string (slash-separated) or a list of
|
||||||
|
path-name elements.
|
||||||
|
"""
|
||||||
|
|
||||||
def set_uri(name, child_uri):
|
def set_uri(name, child_uri):
|
||||||
"""I add a child (by URI) at the specific name. I return a Deferred
|
"""I add a child (by URI) at the specific name. I return a Deferred
|
||||||
that fires when the operation finishes.
|
that fires when the operation finishes.
|
||||||
|
@ -262,6 +262,21 @@ class Test(unittest.TestCase):
|
|||||||
d.addCallback(lambda res:
|
d.addCallback(lambda res:
|
||||||
self.failIf(res["baz"].is_mutable()))
|
self.failIf(res["baz"].is_mutable()))
|
||||||
|
|
||||||
|
d.addCallback(lambda res: rootnode.get_child_at_path("bar/file2"))
|
||||||
|
def _got_file2(res):
|
||||||
|
self.failUnless(isinstance(res, dirnode.FileNode))
|
||||||
|
self.failUnlessEqual(res.uri, file2)
|
||||||
|
d.addCallback(_got_file2)
|
||||||
|
|
||||||
|
d.addCallback(lambda res: rootnode.get_child_at_path(["bar", "file2"]))
|
||||||
|
d.addCallback(_got_file2)
|
||||||
|
|
||||||
|
d.addCallback(lambda res: self.bar_node.get_child_at_path(["file2"]))
|
||||||
|
d.addCallback(_got_file2)
|
||||||
|
|
||||||
|
d.addCallback(lambda res: self.bar_node.get_child_at_path([]))
|
||||||
|
d.addCallback(lambda res: self.failUnlessIdentical(res, self.bar_node))
|
||||||
|
|
||||||
# test the manifest
|
# test the manifest
|
||||||
d.addCallback(lambda res: self.rootnode.build_manifest())
|
d.addCallback(lambda res: self.rootnode.build_manifest())
|
||||||
def _check_manifest(manifest):
|
def _check_manifest(manifest):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user