Improve behaviour of 'tahoe ls' for unknown objects, addressing kevan's comments
authordavid-sarah <david-sarah@jacaranda.org>
Sat, 20 Feb 2010 06:13:13 +0000 (22:13 -0800)
committerdavid-sarah <david-sarah@jacaranda.org>
Sat, 20 Feb 2010 06:13:13 +0000 (22:13 -0800)
src/allmydata/scripts/cli.py
src/allmydata/scripts/common.py
src/allmydata/scripts/tahoe_ls.py

index 1ac6ad0e1fd60f31ce48bb5291648af239b6751b..c2efe9d3b8564d9d61d7bb3b8301724ab88f1eee 100644 (file)
@@ -85,7 +85,29 @@ class ListOptions(VDriveOptions):
     def parseArgs(self, where=""):
         self.where = where
 
-    longdesc = """List the contents of some portion of the grid."""
+    longdesc = """
+    List the contents of some portion of the grid.
+
+    When the -l or --long option is used, each line is shown in the
+    following format:
+
+    drwx <size> <date/time> <name in this directory>
+
+    where each of the letters on the left may be replaced by '-'.
+    If 'd' is present, it indicates that the object is a directory.
+    If the 'd' is replaced by a '?', the object type is unknown.
+    'rwx' is a Unix-like permissions mask: if the mask includes 'w',
+    then the object is writable through its link in this directory.
+    The 'x' is a legacy of Unix filesystems. In Tahoe it is used
+    only to indicate that the contents of a directory can be listed.
+
+    Directories have no size, so their size field is shown as '-'.
+    Otherwise the size of the file, when known, is given in bytes.
+    The size of mutable files or unknown objects is shown as '?'.
+
+    The date/time shows when this link in the Tahoe filesystem was
+    last modified.
+    """
 
 class GetOptions(VDriveOptions):
     def parseArgs(self, arg1, arg2=None):
index 7b6f78aafbeb95f16d38046bfb720acfd89fce4d..0ee7a3d01428fa16cf301d1efd6c34e2faf8022d 100644 (file)
@@ -139,11 +139,15 @@ def get_alias(aliases, path, default):
     # raised.
     path = path.strip()
     if uri.has_uri_prefix(path):
-        # The only way to get a sub-path is to use URI:blah:./foo, and we
-        # strip out the :./ sequence.
+        # We used to require "URI:blah:./foo" in order to get a subpath,
+        # stripping out the ":./" sequence. We still allow that for compatibility,
+        # but now also allow just "URI:blah/foo".
         sep = path.find(":./")
         if sep != -1:
             return path[:sep], path[sep+3:]
+        sep = path.find("/")
+        if sep != -1:
+            return path[:sep], path[sep+1:]
         return path, ""
     colon = path.find(":")
     if colon == -1:
index a169d82b0ecedefb8127c70eab48ead97e89531c..bb204ddcc55d312a666d9d672b6549cc5702190b 100644 (file)
@@ -55,7 +55,7 @@ def list(options):
     children = {}
     if nodetype == "dirnode":
         children = d['children']
-    elif nodetype == "filenode":
+    else:
         childname = path.split("/")[-1]
         children = {childname: (nodetype, d)}
         if "metadata" not in d:
@@ -67,6 +67,7 @@ def list(options):
     # maxwidth so we can format them tightly. Size, filename, and URI are the
     # variable-width ones.
     rows = []
+    has_unknowns = False
 
     for name in childnames:
         name = unicode(name)
@@ -101,11 +102,12 @@ def list(options):
             classify = "/"
         elif childtype == "filenode":
             t0 = "-"
-            size = str(child[1]['size'])
+            size = str(child[1].get("size", "?"))
             classify = ""
             if rw_uri:
                 classify = "*"
         else:
+            has_unknowns = True
             t0 = "?"
             size = "?"
             classify = "?"
@@ -161,6 +163,10 @@ def list(options):
     for row in rows:
         print >>stdout, (fmt % tuple(row)).rstrip()
 
+    if has_unknowns:
+        print >>stderr, "\nThis listing included unknown objects. Using a webapi server that supports" \
+                        "\na later version of Tahoe may help."
+
     return 0
 
 # error cases that need improvement: