def list_templates(cfg, template_types, filters, offline_only): """ List templates with the applied filters """ first_run(cfg) filters = [f for f in filters if f is not None] if not filters: filters = ['.*'] if filters != ['.*']: click.echo('Providers matching any of {}: {}' .format(filters, [d.name for d in utils.get_depot_configs(cfg.pros_cfg, filters)])) result = utils.get_available_templates(cfg.pros_cfg, template_types=template_types, filters=filters, offline_only=offline_only) table = sum( [[(i.version, d.depot.config.name, 'online' if d.online else '', 'offline' if d.offline else '') for d in ds] for i, ds in result[TemplateTypes.kernel].items()], []) if TemplateTypes.kernel in template_types: if not cfg.machine_output: click.echo('Available kernels:') click.echo(tabulate.tabulate(table, headers=['Version', 'Depot', 'Online', 'Offline'])) else: table = [{ 'version': e[0], 'depot': e[1], 'online': e[2] == 'online', 'offline': e[3] == 'offline' } for e in table] click.echo(json.dumps(table))
def list_templates(cfg, template_types, filters, offline_only): """ List templates with the applied filters """ first_run(cfg) filters = [f for f in filters if f is not None] if not filters: filters = ['.*'] if filters != ['.*']: click.echo('Providers matching any of {}: {}'.format( filters, [d.name for d in utils.get_depot_configs(cfg.pros_cfg, filters)])) result = utils.get_available_templates(cfg.pros_cfg, template_types=template_types, filters=filters, offline_only=offline_only) table = sum( [[(i.version, d.depot.config.name, 'online' if d.online else '', 'offline' if d.offline else '') for d in ds] for i, ds in result[TemplateTypes.kernel].items()], []) if TemplateTypes.kernel in template_types: if not cfg.machine_output: click.echo('Available kernels:') click.echo( tabulate.tabulate( table, headers=['Version', 'Depot', 'Online', 'Offline'])) else: table = [{ 'version': e[0], 'depot': e[1], 'online': e[2] == 'online', 'offline': e[3] == 'offline' } for e in table] click.echo(json.dumps(table))
def list_templates(cfg, template_types, filters, offline_only): """ List templates with the applied filters. The first item is guaranteed to be the latest overall template """ first_run(cfg) filters = [f for f in filters if f is not None] if not filters: filters = ['.*'] if filters != ['.*']: click.echo('Providers matching any of {}: {}'.format( filters, [d.name for d in utils.get_depot_configs(cfg.pros_cfg, filters)])) result = utils.get_available_templates(cfg.pros_cfg, template_types=template_types, filters=filters, offline_only=offline_only) if TemplateTypes.kernel in template_types: table = sum( [[(i.version, d.depot.config.name, 'online' if d.online else '', 'offline' if d.offline else '') for d in ds] for i, ds in result[TemplateTypes.kernel].items()], []) table = sorted(table, key=lambda v: semver.Version(v[0]), reverse=True) if not cfg.machine_output: click.echo('Available kernels:') click.echo( tabulate.tabulate( table, headers=['Version', 'Depot', 'Online', 'Offline'])) else: table = [{ 'version': e[0], 'depot': e[1], 'online': e[2] == 'online', 'offline': e[3] == 'offline' } for e in table] click.echo(json.dumps(table)) if TemplateTypes.library in template_types: table = sum( [[(i.name, i.version, d.depot.config.name, 'online' if d.online else '', 'offline' if d.offline else '') for d in ds] for i, ds in result[TemplateTypes.library].items()], []) if not cfg.machine_output: click.echo('Available libraries:') click.echo( tabulate.tabulate(table, headers=[ 'Library', 'Version', 'Depot', 'Online', 'Offline' ])) else: table = [{ 'library': e[0], 'version': e[1], 'depot': e[2], 'online': e[3] == 'online', 'offline': e[4] == 'offline' } for e in table] click.echo(json.dumps(table))
def download(cfg, name, version, depot, no_check): """ Download a template with the specified parameters. If the arguments are `download latest` or `download latest kernel`, the latest kernel will be downloaded """ first_run(cfg) if name.lower() == 'kernel': name = 'kernel' elif name == 'latest': name = 'kernel' if version == 'kernel': version = 'latest' if version == 'latest' or depot == 'auto' or not no_check: click.echo('Fetching online listing to verify available templates.') listing = utils.get_available_templates(pros_cfg=cfg.pros_cfg, template_types=[utils.TemplateTypes.kernel if name == 'kernel' else utils.TemplateTypes.library]) listing = listing.get(utils.TemplateTypes.kernel if name == 'kernel' else utils.TemplateTypes.library) listing = {i: d for (i, d) in listing.items() if i.name == name} if len(listing) == 0: click.echo('No templates were found with the name {}'.format(name)) click.get_current_context().abort() sys.exit() if not depot == 'auto': if depot not in [d.depot.config.name for ds in listing.values() for d in ds]: click.echo('No templates for {} were found on {}'.format(name, depot)) click.get_current_context().abort() sys.exit() listing = {i: [d for d in ds if d.depot.config.name == depot] for i, ds in listing.items() if depot in [d.depot.config.name for d in ds]} # listing now filtered for depots, if applicable if version == 'latest': identifier, descriptors = OrderedDict( sorted(listing.items(), key=lambda kvp: semver.Version(kvp[0].version))).popitem() click.echo('Resolved {} {} to {} {}'.format(name, version, identifier.name, identifier.version)) else: if version not in [i.version for (i, d) in listing.items()]: click.echo('No templates for {} were found with the version {}'.format(name, version)) click.get_current_context().abort() sys.exit() identifier, descriptors = [(i, d) for (i, d) in listing.items() if i.version == version][0] # identifier is now selected... if len(descriptors) == 0: click.echo('No templates for {} were found with the version {}'.format(name, version)) click.get_current_context().abort() sys.exit() if len(descriptors) > 1: if name == 'kernel' and depot == 'auto' and 'pros-mainline' in [desc.depot.config.name for desc in descriptors]: descriptor = [desc for desc in descriptors if desc.depot.config.name == 'pros-mainline'] else: click.echo('Multiple depots for {}-{} were found. Please specify a depot: '. format(identifier.name, identifier.version)) options_table = sorted([(descriptors.index(desc), desc.depot.config.name) for desc in descriptors], key=lambda l: l[1]) click.echo(tabulate.tabulate(options_table, headers=['', 'Depot'])) result = click.prompt('Which depot?', default=options_table[0][1], type=click.Choice( [str(i) for (i, n) in options_table] + [n for (i, n) in options_table])) if result in [str(i) for (i, n) in options_table]: descriptor = [d for d in descriptors if d.depot.config.name == options_table[int(result)][1]][0] else: descriptor = [d for d in descriptors if d.depot.config.name == result][0] elif depot == 'auto' or descriptors[0].depot.config.name == depot: descriptor = descriptors[0] else: click.echo('Could not find a depot to download {} {}'.format(name, version)) click.get_current_context().abort() sys.exit() else: identifier = providers.Identifier(name=name, version=version) descriptor = utils.TemplateDescriptor(depot=utils.get_depot(utils.get_depot_config(name=depot, pros_cfg=cfg.pros_cfg)), offline=False, online=True) click.echo('Downloading {} {} from {} using {}'.format(identifier.name, identifier.version, descriptor.depot.config.name, descriptor.depot.registrar)) descriptor.depot.download(identifier) if identifier.name == 'kernel': click.echo('''To create a new PROS project with this kernel, run `pros conduct new <folder> {0} {1}`, or to upgrade an existing project, run `pros conduct upgrade <folder> {0} {1}''' .format(identifier.version, identifier.depot))
def download(cfg, name, version, depot, no_check): """ Download a template with the specified parameters. If the arguments are `download latest` or `download latest kernel`, the latest kernel will be downloaded """ first_run(cfg) if name.lower() == 'kernel': name = 'kernel' elif name == 'latest': name = 'kernel' if version == 'kernel': version = 'latest' if version == 'latest' or depot == 'auto' or not no_check: click.echo('Fetching online listing to verify available templates.') listing = utils.get_available_templates(pros_cfg=cfg.pros_cfg, template_types=[utils.TemplateTypes.kernel if name == 'kernel' else utils.TemplateTypes.library]) listing = listing.get(utils.TemplateTypes.kernel if name == 'kernel' else utils.TemplateTypes.library) listing = {i: d for (i, d) in listing.items() if i.name == name} if len(listing) == 0: click.echo('No templates were found with the name {}'.format(name)) click.get_current_context().abort() sys.exit() if not depot == 'auto': if depot not in [d.depot.config.name for ds in listing.values() for d in ds]: click.echo('No templates for {} were found on {}'.format(name, depot)) click.get_current_context().abort() sys.exit() listing = {i: [d for d in ds if d.depot.config.name == depot] for i, ds in listing.items() if depot in [d.depot.config.name for d in ds]} # listing now filtered for depots, if applicable if version == 'latest': identifier, descriptors = OrderedDict(sorted(listing.items(), key=lambda kvp: semver.Version(kvp[0].version))).popitem() click.echo('Resolved {} {} to {} {}'.format(name, version, identifier.name, identifier.version)) else: if version not in [i.version for (i, d) in listing.items()]: click.echo('No templates for {} were found with the version {}'.format(name, version)) click.get_current_context().abort() sys.exit() identifier, descriptors = [(i, d) for (i, d) in listing.items() if i.version == version][0] # identifier is now selected... if len(descriptors) == 0: click.echo('No templates for {} were found with the version {}'.format(name, version)) click.get_current_context().abort() sys.exit() if len(descriptors) > 1: if name == 'kernel' and depot == 'auto' and 'pros-mainline' in [desc.depot.config.name for desc in descriptors]: descriptor = [desc for desc in descriptors if desc.depot.config.name == 'pros-mainline'] else: click.echo('Multiple depots for {}-{} were found. Please specify a depot: '. format(identifier.name, identifier.version)) options_table = sorted([(descriptors.index(desc), desc.depot.config.name) for desc in descriptors], key=lambda l: l[1]) click.echo(tabulate.tabulate(options_table, headers=['', 'Depot'])) result = click.prompt('Which depot?', default=options_table[0][1], type=click.Choice( [str(i) for (i, n) in options_table] + [n for (i, n) in options_table])) if result in [str(i) for (i, n) in options_table]: descriptor = [d for d in descriptors if d.depot.config.name == options_table[int(result)][1]][0] else: descriptor = [d for d in descriptors if d.depot.config.name == result][0] elif depot == 'auto' or descriptors[0].depot.config.name == depot: descriptor = descriptors[0] else: click.echo('Could not find a depot to download {} {}'.format(name, version)) click.get_current_context().abort() sys.exit() else: identifier = providers.Identifier(name=name, version=version) descriptor = utils.TemplateDescriptor(depot=utils.get_depot(utils.get_depot_config(name=depot, pros_cfg=cfg.pros_cfg)), offline=False, online=True) click.echo('Downloading {} {} from {} using {}'.format(identifier.name, identifier.version, descriptor.depot.config.name, descriptor.depot.registrar)) descriptor.depot.download(identifier) if identifier.name == 'kernel': click.echo('''To create a new PROS project with this kernel, run `pros conduct new <folder> {0} {1}`, or to upgrade an existing project, run `pros conduct upgrade <folder> {0} {1}''' .format(identifier.version, identifier.depot))