# -*- coding: utf-8 -*- # ----------------------------------------------------------------------------- # Copyright (c) 2016, Anaconda, Inc. All rights reserved. # # Licensed under the terms of the BSD 3-Clause License. # The full license is in the file LICENSE.txt, distributed with this software. # ----------------------------------------------------------------------------- """Commands related to the downloads section.""" from __future__ import absolute_import, print_function import sys from anaconda_project.internal.cli.project_load import load_project from anaconda_project import project_ops from anaconda_project.internal.cli import console_utils from anaconda_project.prepare import prepare_without_interaction from anaconda_project.provide import PROVIDE_MODE_CHECK def add_download(project_dir, env_spec_name, filename_variable, download_url, filename, hash_algorithm, hash_value): """Add an item to the downloads section.""" project = load_project(project_dir) if (hash_algorithm or hash_value) and not bool(hash_algorithm and hash_value): print("Error: mutually dependant parameters: --hash-algorithm and --hash-value.", file=sys.stderr) return 1 status = project_ops.add_download(project, env_spec_name=env_spec_name, env_var=filename_variable, url=download_url, filename=filename, hash_algorithm=hash_algorithm, hash_value=hash_value) if status: print(status.status_description) print("Added %s to the project file." % download_url) return 0 else: console_utils.print_status_errors(status) return 1 def remove_download(project_dir, env_spec_name, filename_variable): """Remove a download requirement from project and from file system.""" project = load_project(project_dir) # we can remove a download even if prepare fails, so disable # printing errors in the frontend. with project.null_frontend(): result = prepare_without_interaction(project, env_spec_name=env_spec_name, mode=PROVIDE_MODE_CHECK) status = project_ops.remove_download(project, env_spec_name=env_spec_name, env_var=filename_variable, prepare_result=result) if status: print(status.status_description) print("Removed {} from the project file.".format(filename_variable)) return 0 else: console_utils.print_status_errors(status) return 1 def list_downloads(project_dir, env_spec_name): """List the downloads present in project.""" project = load_project(project_dir) if console_utils.print_project_problems(project): return 1 if project.downloads(env_spec_name): print("Downloads for project: {}\n".format(project_dir)) console_utils.print_names_and_descriptions(project.download_requirements(env_spec_name), name_attr='title') else: print("No downloads found in project.") return 0 def main_add(args): """Start the download command and return exit status code.""" return add_download(args.directory, args.env_spec, args.filename_variable, args.download_url, args.filename, args.hash_algorithm, args.hash_value) def main_remove(args): """Start the remove download command and return exit status code.""" return remove_download(args.directory, args.env_spec, args.filename_variable) def main_list(args): """Start the list download command and return exit status code.""" return list_downloads(args.directory, args.env_spec)