X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/c820bfc91be7635739bad0857ba3a385d1334b6a..2f52a6e7d9945f51d33b047466c4d927d494bb32:/sdk/python/arvados/commands/ls.py diff --git a/sdk/python/arvados/commands/ls.py b/sdk/python/arvados/commands/ls.py index 918ce5eac0..c6ca0855f7 100755 --- a/sdk/python/arvados/commands/ls.py +++ b/sdk/python/arvados/commands/ls.py @@ -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