Beispiel #1
0
    def _collects_refs_to_upload(self, package_id, reference_or_pattern,
                                 confirm):
        """ validate inputs and compute the refs (without revisions) to be uploaded
        """
        if package_id and not check_valid_ref(reference_or_pattern,
                                              strict_mode=False):
            raise ConanException(
                "-p parameter only allowed with a valid recipe reference, "
                "not with a pattern")

        if package_id or check_valid_ref(reference_or_pattern):
            # Upload package
            ref = ConanFileReference.loads(reference_or_pattern)
            if ref.revision and not self._cache.config.revisions_enabled:
                raise ConanException(
                    "Revisions not enabled in the client, specify a "
                    "reference without revision")
            refs = [
                ref,
            ]
            confirm = True
        else:
            refs = search_recipes(self._cache, reference_or_pattern)
            if not refs:
                raise NotFoundException(
                    ("No packages found matching pattern '%s'" %
                     reference_or_pattern))
        return refs, confirm
Beispiel #2
0
    def test_conanfileref(self):
        ref = ConanFileReference.loads("package/1.0@user/channel")
        self.assertTrue(check_valid_ref(ref, allow_pattern=False))
        self.assertTrue(check_valid_ref(ref, allow_pattern=True))

        ref_pattern = ConanFileReference.loads("package/*@user/channel")
        self.assertFalse(check_valid_ref(ref_pattern, allow_pattern=False))
        self.assertTrue(check_valid_ref(ref_pattern, allow_pattern=True))
Beispiel #3
0
    def test_string(self):
        self.assertTrue(
            check_valid_ref("package/1.0@user/channel", allow_pattern=False))
        self.assertTrue(
            check_valid_ref("package/1.0@user/channel", allow_pattern=True))

        self.assertFalse(
            check_valid_ref("package/*@user/channel", allow_pattern=False))
        self.assertTrue(
            check_valid_ref("package/1.0@user/channel", allow_pattern=True))
Beispiel #4
0
    def _load_data(self, ref, settings, options):
        parser = self._parse_layout_file(ref, settings, options)

        # Build a convenient data structure
        data = OrderedDict()
        folders = {}
        for section in parser.sections():
            reference, section_name = section.rsplit(":", 1) if ':' in section else (None, section)

            if section_name in EditableLayout.folders:
                items = [k for k, _ in parser.items(section)] or [""]
                if len(items) > 1:
                    raise ConanException("'%s' with more than one value in layout file: %s"
                                         % (section_name, self._filepath))
                folders.setdefault(reference, {})[section_name] = self._work_on_item(items[0])
                continue

            if section_name not in EditableLayout.cpp_info_dirs:
                raise ConanException("Wrong cpp_info field '%s' in layout file: %s"
                                     % (section_name, self._filepath))
            if reference:
                if not check_valid_ref(reference):
                    raise ConanException("Wrong package reference '%s' in layout file: %s"
                                         % (reference, self._filepath))
                else:
                    r = ConanFileReference.loads(reference, validate=True)
                    if r.revision:
                        raise ConanException("Don't provide revision in Editable layouts")

            data.setdefault(reference, {})[section_name] =\
                [self._work_on_item(k) for k, _ in parser.items(section)]
        return data, folders
Beispiel #5
0
    def test_only_user_channel(self):
        tmp = get_reference_fields("user/channel", user_channel_input=True)
        self.assertEqual(tmp, (None, None, "user", "channel", None))

        tmp = get_reference_fields("user", user_channel_input=True)
        self.assertEqual(tmp, (None, None, "user", None, None))

        tmp = get_reference_fields("/channel", user_channel_input=True)
        self.assertEqual(tmp, (None, None, None, "channel", None))

        ref_pattern = ConanFileReference.loads("package/*@user/channel")
        self.assertFalse(check_valid_ref(ref_pattern, strict_mode=False))
Beispiel #6
0
    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)
Beispiel #7
0
    def upload(self,
               recorder,
               reference_or_pattern,
               package_id=None,
               all_packages=None,
               confirm=False,
               retry=0,
               retry_wait=0,
               integrity_check=False,
               policy=None,
               remote_name=None,
               query=None):
        """If package_id is provided, conan_reference_or_pattern is a ConanFileReference"""

        if package_id and not check_valid_ref(reference_or_pattern,
                                              allow_pattern=False):
            raise ConanException(
                "-p parameter only allowed with a valid recipe reference, "
                "not with a pattern")
        t1 = time.time()
        if package_id or check_valid_ref(reference_or_pattern,
                                         allow_pattern=False):
            # Upload package
            ref = ConanFileReference.loads(reference_or_pattern)
            references = [
                ref,
            ]
            confirm = True
        else:
            references = search_recipes(self._client_cache,
                                        reference_or_pattern)
            if not references:
                raise NotFoundException(
                    ("No packages found matching pattern '%s'" %
                     reference_or_pattern))

        for conan_ref in references:
            upload = True
            if not confirm:
                msg = "Are you sure you want to upload '%s'?" % str(conan_ref)
                upload = self._user_io.request_boolean(msg)
            if upload:
                try:
                    conanfile_path = self._client_cache.conanfile(conan_ref)
                    conan_file = self._loader.load_class(conanfile_path)
                except NotFoundException:
                    raise NotFoundException(
                        ("There is no local conanfile exported as %s" %
                         str(conan_ref)))
                if all_packages:
                    packages_ids = self._client_cache.conan_packages(conan_ref)
                elif query:
                    packages = search_packages(self._client_cache, conan_ref,
                                               query)
                    packages_ids = list(packages.keys())
                elif package_id:
                    packages_ids = [
                        package_id,
                    ]
                else:
                    packages_ids = []
                self._upload(conan_file, conan_ref, packages_ids, retry,
                             retry_wait, integrity_check, policy, remote_name,
                             recorder)

        logger.debug("UPLOAD: Time manager upload: %f" % (time.time() - t1))
Beispiel #8
0
 def test_incomplete_refs(self):
     self.assertTrue(check_valid_ref("package/1.0", strict_mode=False))
     self.assertFalse(check_valid_ref("package/1.0"))
     self.assertFalse(check_valid_ref("package/1.0@user"))
     self.assertFalse(check_valid_ref("package/1.0@/channel"))
     self.assertFalse(check_valid_ref("lib@#rev"))
Beispiel #9
0
 def test_string(self):
     self.assertTrue(check_valid_ref("package/1.0@user/channel"))
     self.assertTrue(check_valid_ref("package/1.0@user/channel"))
Beispiel #10
0
    def test_string(self):
        self.assertTrue(check_valid_ref("package/1.0@user/channel"))
        self.assertTrue(check_valid_ref("package/1.0@user/channel"))
        self.assertTrue(check_valid_ref("package/[*]@user/channel"))
        self.assertTrue(check_valid_ref("package/[>1.0]@user/channel"))
        self.assertTrue(check_valid_ref("package/[1.*]@user/channel"))

        # Patterns are invalid
        self.assertFalse(check_valid_ref("package/*@user/channel"))
        self.assertFalse(check_valid_ref("package/1.0@user/*"))
        self.assertFalse(check_valid_ref("package/1.0@user/chan*"))
        self.assertFalse(check_valid_ref("package/[>1.0]@user/chan*"))
        self.assertFalse(check_valid_ref("*/1.0@user/channel"))
        self.assertFalse(check_valid_ref("package*/1.0@user/channel"))

        # * pattern is valid in non stric_mode
        self.assertTrue(
            check_valid_ref("package/*@user/channel", strict_mode=False))
        self.assertTrue(check_valid_ref("package/*@user/*", strict_mode=False))

        # But other patterns are not valid in non stric_mode
        self.assertFalse(
            check_valid_ref("package/1.0@user/chan*", strict_mode=False))