def search_packages(self, reference=None, remote_name=None, query=None, outdated=False): """ Return the single information saved in conan.vars about all the packages or the packages which match with a pattern Attributes: pattern = string to match packages remote = search on another origin to get packages info packages_pattern = String query with binary packages properties: "arch=x86 AND os=Windows" """ if remote_name: remote = self._registry.remote(remote_name) packages_props = self._remote_manager.search_packages(remote, reference, query) ordered_packages = OrderedDict(sorted(packages_props.items())) manifest = self._remote_manager.get_conan_manifest(reference, remote) recipe_hash = manifest.summary_hash else: searcher = DiskSearchManager(self._client_cache) packages_props = searcher.search_packages(reference, query) ordered_packages = OrderedDict(sorted(packages_props.items())) try: recipe_hash = self._client_cache.load_manifest(reference).summary_hash except IOError: # It could not exist in local recipe_hash = None if outdated and recipe_hash: ordered_packages = filter_outdated(ordered_packages, recipe_hash) return ordered_packages, reference, recipe_hash, query
def search_packages(self, reference=None, remote=None, packages_query=None, outdated=False): """ Return the single information saved in conan.vars about all the packages or the packages which match with a pattern Attributes: pattern = string to match packages remote = search on another origin to get packages info packages_pattern = String query with binary packages properties: "arch=x86 AND os=Windows" """ packages_props = self._get_search_adapter(remote).search_packages( reference, packages_query) ordered_packages = OrderedDict(sorted(packages_props.items())) if remote: remote_proxy = ConanProxy(self._client_cache, self._user_io, self._remote_manager, remote) remote = remote_proxy.registry.remote(remote) manifest = self._remote_manager.get_conan_digest(reference, remote) recipe_hash = manifest.summary_hash else: try: recipe_hash = self._client_cache.load_manifest( reference).summary_hash except IOError: # It could not exist in local recipe_hash = None if outdated and recipe_hash: ordered_packages = filter_outdated(ordered_packages, recipe_hash) return ordered_packages, reference, recipe_hash, packages_query
def _search_packages_in_all(self, ref=None, query=None, outdated=False): references = OrderedDict() # We have to check if there is a remote called "all" # Deprecate: 2.0 can remove this check if 'all' not in self._remotes: for remote in self._remotes.values(): try: packages_props = self._remote_manager.search_packages( remote, ref, query) if packages_props: ordered_packages = OrderedDict( sorted(packages_props.items())) manifest, _ = self._remote_manager.get_recipe_manifest( ref, remote) recipe_hash = manifest.summary_hash if outdated and recipe_hash: ordered_packages = filter_outdated( ordered_packages, recipe_hash) references[remote.name] = self.remote_ref( ordered_packages, recipe_hash) except NotFoundException: continue return references return self._search_packages_in('all', ref, query, outdated)
def remove(self, pattern, remote, src=None, build_ids=None, package_ids_filter=None, force=False, packages_query=None, outdated=False): """ Remove local/remote conans, package folders, etc. @param src: Remove src folder @param pattern: it could be OpenCV* or OpenCV or a ConanFileReference @param build_ids: Lists with ids or empty for all. (Its a filter) @param package_ids_filter: Lists with ids or empty for all. (Its a filter) @param force: if True, it will be deleted without requesting anything @param packages_query: Only if src is a reference. Query settings and options """ if remote and (build_ids is not None or src): raise ConanException("Remotes don't have 'build' or 'src' folder, just packages") if remote: remote = self._registry.remote(remote) references = self._remote_manager.search_recipes(remote, pattern) else: disk_search = DiskSearchManager(self._client_cache) references = disk_search.search_recipes(pattern) if not references: self._user_io.out.warn("No package recipe matches '%s'" % str(pattern)) return deleted_refs = [] for reference in references: assert isinstance(reference, ConanFileReference) package_ids = package_ids_filter if packages_query or outdated: # search packages if remote: packages = self._remote_manager.search_packages(remote, reference, packages_query) else: packages = disk_search.search_packages(reference, packages_query) if outdated: if remote: recipe_hash = self._remote_proxy.get_conan_manifest(reference).summary_hash else: recipe_hash = self._client_cache.load_manifest(reference).summary_hash packages = filter_outdated(packages, recipe_hash) if package_ids_filter: package_ids = [p for p in packages if p in package_ids_filter] else: package_ids = list(packages.keys()) if not package_ids: self._user_io.out.warn("No matching packages to remove for %s" % str(reference)) continue if self._ask_permission(reference, src, build_ids, package_ids, force): deleted_refs.append(reference) if remote: self._remote_remove(reference, package_ids, remote) else: deleted_refs.append(reference) self._local_remove(reference, src, build_ids, package_ids) if not remote: self._client_cache.delete_empty_dirs(deleted_refs)
def _search_packages_in(self, remote_name, ref=None, query=None, outdated=False): remote = self._registry.remotes.get(remote_name) packages_props = self._remote_manager.search_packages(remote, ref, query) ordered_packages = OrderedDict(sorted(packages_props.items())) manifest = self._remote_manager.get_conan_manifest(ref, remote) recipe_hash = manifest.summary_hash if outdated and recipe_hash: ordered_packages = filter_outdated(ordered_packages, recipe_hash) references = OrderedDict() references[remote.name] = self.remote_ref(ordered_packages, recipe_hash) return references
def _search_packages_in_local(self, ref=None, query=None, outdated=False): packages_props = search_packages(self._cache, ref, query) ordered_packages = OrderedDict(sorted(packages_props.items())) try: recipe_hash = self._cache.package_layout(ref).load_manifest().summary_hash except IOError: # It could not exist in local recipe_hash = None if outdated and recipe_hash: ordered_packages = filter_outdated(ordered_packages, recipe_hash) references = OrderedDict() references[None] = self.remote_ref(ordered_packages, recipe_hash) return references
def _search_packages_in_local(self, ref=None, query=None, outdated=False): package_layout = self._cache.package_layout(ref, short_paths=None) packages_props = search_packages(package_layout, query) ordered_packages = OrderedDict(sorted(packages_props.items())) try: recipe_hash = package_layout.recipe_manifest().summary_hash except IOError: # It could not exist in local recipe_hash = None if outdated: ordered_packages = filter_outdated(ordered_packages, recipe_hash) elif self._cache.config.revisions_enabled: # With revisions, by default filter the packages not belonging to the recipe # unless outdated is specified. metadata = package_layout.load_metadata() ordered_packages = filter_by_revision(metadata, ordered_packages) references = OrderedDict() references[None] = self.remote_ref(ordered_packages, recipe_hash) return references
def remove(self, pattern, remote, src=None, build_ids=None, package_ids_filter=None, force=False, packages_query=None, outdated=False): """ Remove local/remote conans, package folders, etc. @param src: Remove src folder @param pattern: it could be OpenCV* or OpenCV or a ConanFileReference @param build_ids: Lists with ids or empty for all. (Its a filter) @param package_ids_filter: Lists with ids or empty for all. (Its a filter) @param force: if True, it will be deleted without requesting anything @param packages_query: Only if src is a reference. Query settings and options """ if remote and (build_ids is not None or src): raise ConanException( "Remotes don't have 'build' or 'src' folder, just packages") if remote: remote = self._registry.remote(remote) references = self._remote_manager.search_recipes(remote, pattern) else: references = search_recipes(self._client_cache, pattern) if not references: self._user_io.out.warn("No package recipe matches '%s'" % str(pattern)) return deleted_refs = [] for reference in references: assert isinstance(reference, ConanFileReference) package_ids = package_ids_filter if packages_query or outdated: # search packages if remote: packages = self._remote_manager.search_packages( remote, reference, packages_query) else: packages = search_packages(self._client_cache, reference, packages_query) if outdated: if remote: recipe_hash = self._remote_manager.get_conan_manifest( reference, remote).summary_hash else: recipe_hash = self._client_cache.load_manifest( reference).summary_hash packages = filter_outdated(packages, recipe_hash) if package_ids_filter: package_ids = [ p for p in packages if p in package_ids_filter ] else: package_ids = list(packages.keys()) if not package_ids: self._user_io.out.warn( "No matching packages to remove for %s" % str(reference)) continue if self._ask_permission(reference, src, build_ids, package_ids, force): deleted_refs.append(reference) if remote: self._remote_remove(reference, package_ids, remote) else: deleted_refs.append(reference) self._local_remove(reference, src, build_ids, package_ids) if not remote: self._client_cache.delete_empty_dirs(deleted_refs)
def remove(self, pattern, remote_name, src=None, build_ids=None, package_ids_filter=None, force=False, packages_query=None, outdated=False): """ Remove local/remote conans, package folders, etc. @param src: Remove src folder @param pattern: it could be OpenCV* or OpenCV or a ConanFileReference @param build_ids: Lists with ids or empty for all. (Its a filter) @param package_ids_filter: Lists with ids or empty for all. (Its a filter) @param force: if True, it will be deleted without requesting anything @param packages_query: Only if src is a reference. Query settings and options """ if remote_name and (build_ids is not None or src): raise ConanException( "Remotes don't have 'build' or 'src' folder, just packages") is_reference = check_valid_ref(pattern) input_ref = ConanFileReference.loads(pattern) if is_reference else None if not input_ref and packages_query is not None: raise ConanException( "query parameter only allowed with a valid recipe " "reference as the search pattern.") if input_ref and package_ids_filter and not input_ref.revision: for package_id in package_ids_filter: if "#" in package_id: raise ConanException( "Specify a recipe revision if you specify a package " "revision") if remote_name: remote = self._remotes[remote_name] if input_ref: if not self._cache.config.revisions_enabled and input_ref.revision: raise ConanException( "Revisions not enabled in the client, cannot remove " "revisions in the server") refs = [input_ref] else: refs = self._remote_manager.search_recipes(remote, pattern) else: if input_ref: refs = [] if self._cache.installed_as_editable(input_ref): raise ConanException( self._message_removing_editable(input_ref)) if not self._cache.package_layout(input_ref).recipe_exists(): raise RecipeNotFoundException( input_ref, print_rev=self._cache.config.revisions_enabled) refs.append(input_ref) else: refs = search_recipes(self._cache, pattern) if not refs: self._user_io.out.warn("No package recipe matches '%s'" % str(pattern)) return if input_ref and not input_ref.revision: # Ignore revisions for deleting if the input was not with a revision # (Removing all the recipe revisions from a reference) refs = [r.copy_clear_rev() for r in refs] deleted_refs = [] for ref in refs: assert isinstance(ref, ConanFileReference) package_layout = self._cache.package_layout(ref) package_ids = package_ids_filter if packages_query or outdated: # search packages if remote_name: packages = self._remote_manager.search_packages( remote, ref, packages_query) else: packages = search_packages(package_layout, packages_query) if outdated: if remote_name: manifest, ref = self._remote_manager.get_recipe_manifest( ref, remote) recipe_hash = manifest.summary_hash else: recipe_hash = package_layout.recipe_manifest( ).summary_hash packages = filter_outdated(packages, recipe_hash) if package_ids_filter: package_ids = [ p for p in packages if p in package_ids_filter ] else: package_ids = list(packages.keys()) if not package_ids: self._user_io.out.warn( "No matching packages to remove for %s" % ref.full_str()) continue if self._ask_permission(ref, src, build_ids, package_ids, force): try: if remote_name: self._remote_remove(ref, package_ids, remote) else: self._local_remove(ref, src, build_ids, package_ids) except NotFoundException: # If we didn't specify a pattern but a concrete ref, fail if there is no # ref to remove if input_ref: raise else: deleted_refs.append(ref) if not remote_name: self._cache.delete_empty_dirs(deleted_refs)