def create_rpm_installer(target, config, python_spec='python'): rpm_prefix = config['rpm']['prefix'] index = conda.api.get_index() matches = Resolve(index).get_pkgs(MatchSpec(python_spec)) if not matches: raise RuntimeError('No python found in the channels.') # Pick the latest Python match. pkg_info = sorted(matches)[-1].info dist_name = '{}-{}-{}'.format(pkg_info['name'], pkg_info['version'], pkg_info['build']) pkg_cache = os.path.join(target, 'SOURCES') if not conda_install.is_fetched(pkg_cache, dist_name): print('Fetching {}'.format(dist_name)) conda.fetch.fetch_pkg(pkg_info, pkg_cache) installer_source = os.path.join(os.path.dirname(__file__), 'install.py') installer_target = os.path.join(pkg_cache, 'install.py') shutil.copyfile(installer_source, installer_target) spec_dir = os.path.join(target, 'SPECS') if not os.path.exists(spec_dir): os.makedirs(spec_dir) specfile = os.path.join(spec_dir, '{}-installer.spec'.format(rpm_prefix)) with open(specfile, 'w') as fh: fh.write(generate.render_installer(pkg_info, config))
def create_rpmbuild_for_env(pkgs, target, config): rpm_prefix = config['rpm']['prefix'] pkg_cache = os.path.join(target, 'SOURCES') pkg_names = set(pkg for _, pkg in pkgs) if os.path.exists(target): # The environment we want to deploy already exists. We should # just double check that there aren't already packages in there which # we need to remove before we install anything new. linked = conda_install.linked(target) for pkg in linked: if pkg not in pkg_names: conda_install.unlink(target, pkg) else: linked = [] if set(linked) == pkg_names: # We don't need to re-link everything - it is already as expected. # The downside is that we are not verifying that each package is # installed correctly. return spec_dir = os.path.join(target, 'SPECS') if not os.path.exists(spec_dir): os.makedirs(spec_dir) for source, pkg in pkgs: index = conda.fetch.fetch_index([source], use_cache=False) pkg_index = {pkg_info['fn']: pkg_info for pkg_info in index.values()} tar_name = pkg + '.tar.bz2' pkg_info = pkg_index.get(tar_name, None) if pkg_info is None: raise ValueError('Distribution {} is no longer available ' 'in the channel {}.'.format(tar_name, source)) if not conda_install.is_fetched(pkg_cache, pkg): print('Fetching {}'.format(pkg)) conda.fetch.fetch_pkg(pkg_info, pkg_cache) spec_path = os.path.join(spec_dir, '{}-pkg-{}.spec'.format(rpm_prefix, pkg)) if not os.path.exists(spec_path): spec = generate.render_dist_spec(os.path.join(pkg_cache, tar_name), config) with open(spec_path, 'w') as fh: fh.write(spec)
def create_rpmbuild_for_env(pkgs, target, config): rpm_prefix = config['rpm']['prefix'] pkg_cache = os.path.join(target, 'SOURCES') pkg_names = set(pkg for _, pkg in pkgs) if os.path.exists(target): # The environment we want to deploy already exists. We should # just double check that there aren't already packages in there which # we need to remove before we install anything new. linked = conda_install.linked(target) for pkg in linked: if pkg not in pkg_names: conda_install.unlink(target, pkg) else: linked = [] if set(linked) == pkg_names: # We don't need to re-link everything - it is already as expected. # The downside is that we are not verifying that each package is # installed correctly. return spec_dir = os.path.join(target, 'SPECS') if not os.path.exists(spec_dir): os.makedirs(spec_dir) for source, pkg in pkgs: index = conda.fetch.fetch_index([source], use_cache=False) pkg_index = {pkg_info['fn']: pkg_info for pkg_info in index.values()} tar_name = pkg + '.tar.bz2' pkg_info = pkg_index.get(tar_name, None) if pkg_info is None: raise ValueError('Distribution {} is no longer available ' 'in the channel {}.'.format(tar_name, source)) dist_name = pkg if not conda_install.is_fetched(pkg_cache, dist_name): print('Fetching {}'.format(dist_name)) conda.fetch.fetch_pkg(pkg_info, pkg_cache) spec_path = os.path.join(spec_dir, '{}-pkg-{}.spec'.format(rpm_prefix, pkg)) if not os.path.exists(spec_path): spec = generate.render_dist_spec(os.path.join(pkg_cache, tar_name), config) with open(spec_path, 'w') as fh: fh.write(spec)