arvados.commands.ls
1# Copyright (C) The Arvados Authors. All rights reserved. 2# 3# SPDX-License-Identifier: Apache-2.0 4 5from __future__ import print_function 6from __future__ import division 7 8import argparse 9import collections 10import logging 11import re 12import sys 13 14import arvados 15import arvados.commands._util as arv_cmd 16 17from arvados._version import __version__ 18 19FileInfo = collections.namedtuple('FileInfo', ['stream_name', 'name', 'size']) 20 21def parse_args(args): 22 parser = argparse.ArgumentParser( 23 description='List contents of a manifest', 24 parents=[arv_cmd.retry_opt]) 25 26 parser.add_argument('locator', type=str, 27 help="""Collection UUID or locator, optionally with a subdir path.""") 28 parser.add_argument('-s', action='store_true', 29 help="""List file sizes, in KiB.""") 30 parser.add_argument('--version', action='version', 31 version="%s %s" % (sys.argv[0], __version__), 32 help='Print version and exit.') 33 34 return parser.parse_args(args) 35 36def size_formatter(coll_file): 37 return "{:>10}".format((coll_file.size + 1023) // 1024) 38 39def name_formatter(coll_file): 40 return "{}/{}".format(coll_file.stream_name, coll_file.name) 41 42def main(args, stdout, stderr, api_client=None, logger=None): 43 args = parse_args(args) 44 45 if api_client is None: 46 api_client = arvados.api('v1', num_retries=args.retries) 47 48 if logger is None: 49 logger = logging.getLogger('arvados.arv-ls') 50 51 try: 52 r = re.search(r'^(.*?)(/.*)?$', args.locator) 53 collection = r.group(1) 54 get_prefix = r.group(2) 55 56 cr = arvados.CollectionReader(collection, api_client=api_client, 57 num_retries=args.retries) 58 if get_prefix: 59 if get_prefix[-1] == '/': 60 get_prefix = get_prefix[:-1] 61 stream_name = '.' + get_prefix 62 reader = cr.find(stream_name) 63 if not (isinstance(reader, arvados.CollectionReader) or 64 isinstance(reader, arvados.collection.Subcollection)): 65 logger.error("'{}' is not a subdirectory".format(get_prefix)) 66 return 1 67 else: 68 stream_name = '.' 69 reader = cr 70 except (arvados.errors.ApiError, 71 arvados.errors.ArgumentError, 72 arvados.errors.NotFoundError) as error: 73 logger.error("error fetching collection: {}".format(error)) 74 return 1 75 76 formatters = [] 77 if args.s: 78 formatters.append(size_formatter) 79 formatters.append(name_formatter) 80 81 for f in files_in_collection(reader, stream_name): 82 print(*(info_func(f) for info_func in formatters), file=stdout) 83 84 return 0 85 86def files_in_collection(c, stream_name='.'): 87 # Sort first by file type, then alphabetically by file path. 88 for i in sorted(c.keys(), 89 key=lambda k: ( 90 isinstance(c[k], arvados.collection.Subcollection), 91 k.upper())): 92 if isinstance(c[i], arvados.arvfile.ArvadosFile): 93 yield FileInfo(stream_name=stream_name, 94 name=i, 95 size=c[i].size()) 96 elif isinstance(c[i], arvados.collection.Subcollection): 97 for f in files_in_collection(c[i], "{}/{}".format(stream_name, i)): 98 yield f
class
FileInfo(builtins.tuple):
FileInfo(stream_name, name, size)
Inherited Members
- builtins.tuple
- index
- count
def
parse_args(args):
22def parse_args(args): 23 parser = argparse.ArgumentParser( 24 description='List contents of a manifest', 25 parents=[arv_cmd.retry_opt]) 26 27 parser.add_argument('locator', type=str, 28 help="""Collection UUID or locator, optionally with a subdir path.""") 29 parser.add_argument('-s', action='store_true', 30 help="""List file sizes, in KiB.""") 31 parser.add_argument('--version', action='version', 32 version="%s %s" % (sys.argv[0], __version__), 33 help='Print version and exit.') 34 35 return parser.parse_args(args)
def
size_formatter(coll_file):
def
name_formatter(coll_file):
def
main(args, stdout, stderr, api_client=None, logger=None):
43def main(args, stdout, stderr, api_client=None, logger=None): 44 args = parse_args(args) 45 46 if api_client is None: 47 api_client = arvados.api('v1', num_retries=args.retries) 48 49 if logger is None: 50 logger = logging.getLogger('arvados.arv-ls') 51 52 try: 53 r = re.search(r'^(.*?)(/.*)?$', args.locator) 54 collection = r.group(1) 55 get_prefix = r.group(2) 56 57 cr = arvados.CollectionReader(collection, api_client=api_client, 58 num_retries=args.retries) 59 if get_prefix: 60 if get_prefix[-1] == '/': 61 get_prefix = get_prefix[:-1] 62 stream_name = '.' + get_prefix 63 reader = cr.find(stream_name) 64 if not (isinstance(reader, arvados.CollectionReader) or 65 isinstance(reader, arvados.collection.Subcollection)): 66 logger.error("'{}' is not a subdirectory".format(get_prefix)) 67 return 1 68 else: 69 stream_name = '.' 70 reader = cr 71 except (arvados.errors.ApiError, 72 arvados.errors.ArgumentError, 73 arvados.errors.NotFoundError) as error: 74 logger.error("error fetching collection: {}".format(error)) 75 return 1 76 77 formatters = [] 78 if args.s: 79 formatters.append(size_formatter) 80 formatters.append(name_formatter) 81 82 for f in files_in_collection(reader, stream_name): 83 print(*(info_func(f) for info_func in formatters), file=stdout) 84 85 return 0
def
files_in_collection(c, stream_name='.'):
87def files_in_collection(c, stream_name='.'): 88 # Sort first by file type, then alphabetically by file path. 89 for i in sorted(c.keys(), 90 key=lambda k: ( 91 isinstance(c[k], arvados.collection.Subcollection), 92 k.upper())): 93 if isinstance(c[i], arvados.arvfile.ArvadosFile): 94 yield FileInfo(stream_name=stream_name, 95 name=i, 96 size=c[i].size()) 97 elif isinstance(c[i], arvados.collection.Subcollection): 98 for f in files_in_collection(c[i], "{}/{}".format(stream_name, i)): 99 yield f