def inspect_objects(packages, prefix=sys.prefix, groupby='package'): installed = _installed(prefix) output_string = "" for pkg in packages: if pkg == untracked_package: dist = untracked_package elif pkg not in installed: raise ValueError("Package %s is not installed in %s" % (pkg, prefix)) else: dist = installed[pkg] output_string += _underlined_text(pkg) if not sys.platform.startswith('darwin'): sys.exit("Error: conda inspect objects is only implemented in OS X") if dist == untracked_package: obj_files = get_untracked_obj_files(prefix) else: obj_files = get_package_obj_files(dist, prefix) info = [] for f in obj_files: f_info = {} path = join(prefix, f) f_info['filetype'] = human_filetype(path) f_info['rpath'] = ':'.join(get_rpaths(path)) f_info['filename'] = f info.append(f_info) output_string += print_object_info(info, groupby) if hasattr(output_string, 'decode'): output_string = output_string.decode('utf-8') return output_string
def determine_package_nature(pkg, prefix, subdir, bldpkgs_dir, output_folder, channel_urls): dsos = [] run_exports = None lib_prefix = pkg.name.startswith('lib') codefiles = get_package_obj_files(pkg, prefix) dsos = [f for f in codefiles for ext in ('.dylib', '.so', '.dll') if ext in f] # we don't care about the actual run_exports value, just whether or not run_exports are present. We can use channeldata # and it'll be a more reliable source (no disk race condition nonsense) _, _, channeldata = get_build_index(subdir=subdir, bldpkgs_dir=bldpkgs_dir, output_folder=output_folder, channel_urls=channel_urls, debug=False, verbose=False, clear_cache=False) channel_used = pkg.channel channeldata = channeldata.get(channel_used) if channeldata and pkg.name in channeldata['packages']: run_exports = channeldata['packages'][pkg.name].get('run_exports', {}) else: for pkgs_dir in pkgs_dirs: test_folder = os.path.join(pkgs_dir, pkg.dist_name) test_filename = os.path.join(pkgs_dir, pkg.fn) if os.path.exists(test_folder): run_exports = get_run_exports(test_folder) break elif os.path.isfile(test_filename): run_exports = get_run_exports(test_filename) break return (dsos, run_exports, lib_prefix)
def inspect_linkages(packages, prefix=sys.prefix, untracked=False, all_packages=False, show_files=False, groupby="package"): pkgmap = {} installed = _installed(prefix) if not packages and not untracked and not all_packages: raise ValueError("At least one package or --untracked or --all must be provided") if all_packages: packages = sorted(installed.keys()) if untracked: packages.append(untracked_package) for pkg in packages: if pkg == untracked_package: dist = untracked_package elif pkg not in installed: sys.exit("Package %s is not installed in %s" % (pkg, prefix)) else: dist = installed[pkg] if not sys.platform.startswith(('linux', 'darwin')): sys.exit("Error: conda inspect linkages is only implemented in Linux and OS X") if dist == untracked_package: obj_files = get_untracked_obj_files(prefix) else: obj_files = get_package_obj_files(dist, prefix) linkages = get_linkages(obj_files, prefix) depmap = defaultdict(list) pkgmap[pkg] = depmap depmap['not found'] = [] depmap['system'] = [] for binary in linkages: for lib, path in linkages[binary]: path = replace_path(binary, path, prefix) if path not in {'', 'not found'} else path if path.startswith(prefix): deps = list(which_package(path)) if len(deps) > 1: deps_str = [str(dep) for dep in deps] get_logger(__name__).warn("Warning: %s comes from multiple " "packages: %s", path, comma_join(deps_str)) if not deps: if exists(path): depmap['untracked'].append((lib, path.split(prefix + '/', 1)[-1], binary)) else: depmap['not found'].append((lib, path.split(prefix + '/', 1)[-1], binary)) for d in deps: depmap[d].append((lib, path.split(prefix + '/', 1)[-1], binary)) elif path == 'not found': depmap['not found'].append((lib, path, binary)) else: depmap['system'].append((lib, path, binary)) output_string = "" if groupby == 'package': for pkg in packages: output_string += _underlined_text(pkg) output_string += print_linkages(pkgmap[pkg], show_files=show_files) elif groupby == 'dependency': # {pkg: {dep: [files]}} -> {dep: {pkg: [files]}} inverted_map = defaultdict(lambda: defaultdict(list)) for pkg in pkgmap: for dep in pkgmap[pkg]: if pkgmap[pkg][dep]: inverted_map[dep][pkg] = pkgmap[pkg][dep] # print system and not found last k = sorted(set(inverted_map.keys()) - {'system', 'not found'}) for dep in k + ['system', 'not found']: output_string += _underlined_text(dep) output_string += print_linkages(inverted_map[dep], show_files=show_files) else: raise ValueError("Unrecognized groupby: %s" % groupby) if hasattr(output_string, 'decode'): output_string = output_string.decode('utf-8') return output_string
def inspect_linkages(packages, prefix=sys.prefix, untracked=False, all_packages=False, show_files=False, groupby="package", sysroot=""): pkgmap = {} installed = _installed(prefix) if not packages and not untracked and not all_packages: raise ValueError( "At least one package or --untracked or --all must be provided") if all_packages: packages = sorted(installed.keys()) if untracked: packages.append(untracked_package) for pkg in ensure_list(packages): if pkg == untracked_package: dist = untracked_package elif pkg not in installed: sys.exit("Package %s is not installed in %s" % (pkg, prefix)) else: dist = installed[pkg] if not sys.platform.startswith(('linux', 'darwin')): sys.exit( "Error: conda inspect linkages is only implemented in Linux and OS X" ) if dist == untracked_package: obj_files = get_untracked_obj_files(prefix) else: obj_files = get_package_obj_files(dist, prefix) linkages = get_linkages(obj_files, prefix, sysroot) depmap = defaultdict(list) pkgmap[pkg] = depmap depmap['not found'] = [] depmap['system'] = [] for binary in linkages: for lib, path in linkages[binary]: path = replace_path(binary, path, prefix) if path not in { '', 'not found' } else path if path.startswith(prefix): in_prefix_path = re.sub('^' + prefix + '/', '', path) deps = list(which_package(in_prefix_path, prefix)) if len(deps) > 1: deps_str = [str(dep) for dep in deps] get_logger(__name__).warn( "Warning: %s comes from multiple " "packages: %s", path, comma_join(deps_str)) if not deps: if exists(path): depmap['untracked'].append( (lib, path.split(prefix + '/', 1)[-1], binary)) else: depmap['not found'].append( (lib, path.split(prefix + '/', 1)[-1], binary)) for d in deps: depmap[d].append((lib, path.split(prefix + '/', 1)[-1], binary)) elif path == 'not found': depmap['not found'].append((lib, path, binary)) else: depmap['system'].append((lib, path, binary)) output_string = "" if groupby == 'package': for pkg in packages: output_string += _underlined_text(pkg) output_string += print_linkages(pkgmap[pkg], show_files=show_files) elif groupby == 'dependency': # {pkg: {dep: [files]}} -> {dep: {pkg: [files]}} inverted_map = defaultdict(lambda: defaultdict(list)) for pkg in pkgmap: for dep in pkgmap[pkg]: if pkgmap[pkg][dep]: inverted_map[dep][pkg] = pkgmap[pkg][dep] # print system and not found last k = sorted(set(inverted_map.keys()) - {'system', 'not found'}) for dep in k + ['system', 'not found']: output_string += _underlined_text(dep) output_string += print_linkages(inverted_map[dep], show_files=show_files) else: raise ValueError("Unrecognized groupby: %s" % groupby) if hasattr(output_string, 'decode'): output_string = output_string.decode('utf-8') return output_string