7824: Now a subdirectory can be asked to be listed. Also, enhanced error message...
authorLucas Di Pentima <lucas@curoverse.com>
Mon, 3 Apr 2017 21:16:08 +0000 (18:16 -0300)
committerLucas Di Pentima <lucas@curoverse.com>
Mon, 3 Apr 2017 21:16:08 +0000 (18:16 -0300)
sdk/python/arvados/commands/ls.py

index 918ce5eac09ba4e5edb54002d938ec3780eecf0a..c6ca0855f70098359f7648694fd807150497cb3e 100755 (executable)
@@ -5,6 +5,7 @@ from __future__ import print_function
 import argparse
 import collections
 import logging
+import re
 import sys
 
 import arvados
@@ -20,7 +21,7 @@ def parse_args(args):
         parents=[arv_cmd.retry_opt])
 
     parser.add_argument('locator', type=str,
-                        help="""Collection UUID or locator""")
+                        help="""Collection UUID or locator, optionally with a subdir path.""")
     parser.add_argument('-s', action='store_true',
                         help="""List file sizes, in KiB.""")
     parser.add_argument('--version', action='version',
@@ -45,9 +46,26 @@ def main(args, stdout, stderr, api_client=None, logger=None):
         logger = logging.getLogger('arvados.arv-ls')
 
     try:
-        cr = arvados.CollectionReader(args.locator, api_client=api_client,
+        r = re.search(r'^(.*?)(/.*)?$', args.locator)
+        collection = r.group(1)
+        get_prefix = r.group(2)
+
+        cr = arvados.CollectionReader(collection, api_client=api_client,
                                       num_retries=args.retries)
-    except (arvados.errors.ArgumentError,
+        if get_prefix:
+            if get_prefix[-1] == '/':
+                get_prefix = get_prefix[:-1]
+            stream_name = '.' + get_prefix
+            reader = cr.find(stream_name)
+            if not (isinstance(reader, arvados.CollectionReader) or
+                    isinstance(reader, arvados.collection.Subcollection)):
+                logger.error("'{}' is not a subdirectory".format(get_prefix))
+                return 1
+        else:
+            stream_name = '.'
+            reader = cr
+    except (arvados.errors.ApiError,
+            arvados.errors.ArgumentError,
             arvados.errors.NotFoundError) as error:
         logger.error("error fetching collection: {}".format(error))
         return 1
@@ -57,7 +75,7 @@ def main(args, stdout, stderr, api_client=None, logger=None):
         formatters.append(size_formatter)
     formatters.append(name_formatter)
 
-    for f in files_in_collection(cr):
+    for f in files_in_collection(reader, stream_name):
         print(*(info_func(f) for info_func in formatters), file=stdout)
 
     return 0