Ejemplo n.º 1
0
    def _upload_recipe(self, ref, conanfile, retry, retry_wait, policy, remote,
                       remotes):
        prep = self._preparator.prepare_recipe(ref, conanfile, remote, remotes,
                                               policy)

        if policy == UPLOAD_POLICY_SKIP:
            return ref

        files_to_upload, deleted, cache_files, conanfile_path, t1, current_remote_name, layout = prep
        if files_to_upload or deleted:
            self._remote_manager.upload_recipe(ref, files_to_upload, deleted,
                                               remote, retry, retry_wait)
            msg = "\rUploaded conan recipe '%s' to '%s': %s" % (
                str(ref), remote.name, remote.url)
            self._output.info(left_justify_message(msg))
        else:
            self._output.info("Recipe is up to date, upload skipped")
        duration = time.time() - t1
        log_recipe_upload(ref, duration, cache_files, remote.name)
        self._hook_manager.execute("post_upload_recipe",
                                   conanfile_path=conanfile_path,
                                   reference=ref,
                                   remote=remote)

        # The recipe wasn't in the registry or it has changed the revision field only
        if not current_remote_name:
            with layout.update_metadata() as metadata:
                metadata.recipe.remote = remote.name

        return ref
Ejemplo n.º 2
0
 def upload_package_index(index_pref):
     index, pref = index_pref
     try:
         up_msg = "\rUploading package %d/%d: %s to '%s'" % (index + 1, total,
                                                             str(pref.id),
                                                             p_remote.name)
         self._output.info(left_justify_message(up_msg))
         self._upload_package(pref, retry, retry_wait, integrity_check, policy, p_remote)
         upload_recorder.add_package(pref, p_remote.name, p_remote.url)
     except BaseException as pkg_exc:
         trace = traceback.format_exc()
         return pkg_exc, pref, trace
Ejemplo n.º 3
0
    def _upload_ref(self, conanfile, ref, prefs, retry, retry_wait, integrity_check, policy,
                    recipe_remote, upload_recorder, remotes):
        """ Uploads the recipes and binaries identified by ref
        """
        assert (ref.revision is not None), "Cannot upload a recipe without RREV"
        conanfile_path = self._cache.package_layout(ref).conanfile()
        # FIXME: I think it makes no sense to specify a remote to "pre_upload"
        # FIXME: because the recipe can have one and the package a different one
        self._hook_manager.execute("pre_upload", conanfile_path=conanfile_path,
                                   reference=ref, remote=recipe_remote)
        msg = "\rUploading %s to remote '%s'" % (str(ref), recipe_remote.name)
        self._output.info(left_justify_message(msg))
        self._upload_recipe(ref, conanfile, retry, retry_wait, policy, recipe_remote, remotes)
        upload_recorder.add_recipe(ref, recipe_remote.name, recipe_remote.url)

        # Now the binaries
        if prefs:
            total = len(prefs)
            p_remote = recipe_remote

            def upload_package_index(index_pref):
                index, pref = index_pref
                try:
                    up_msg = "\rUploading package %d/%d: %s to '%s'" % (index + 1, total,
                                                                        str(pref.id),
                                                                        p_remote.name)
                    self._output.info(left_justify_message(up_msg))
                    self._upload_package(pref, retry, retry_wait, integrity_check, policy, p_remote)
                    upload_recorder.add_package(pref, p_remote.name, p_remote.url)
                except BaseException as pkg_exc:
                    trace = traceback.format_exc()
                    return pkg_exc, pref, trace

            def upload_package_callback(ret):
                package_exceptions = [r for r in ret if r is not None]
                self._exceptions_list.extend(package_exceptions)
                if not package_exceptions:
                    # FIXME: I think it makes no sense to specify a remote to "post_upload"
                    # FIXME: because the recipe can have one and the package a different one
                    self._hook_manager.execute("post_upload", conanfile_path=conanfile_path,
                                               reference=ref, remote=recipe_remote)

            # This doesn't wait for the packages to end, so the function returns
            # and the "pool entry" for the recipe is released
            self._upload_thread_pool.map_async(upload_package_index,
                                               [(index, pref) for index, pref
                                                in enumerate(prefs)],
                                               callback=upload_package_callback)
        else:
            # FIXME: I think it makes no sense to specify a remote to "post_upload"
            # FIXME: because the recipe can have one and the package a different one
            self._hook_manager.execute("post_upload", conanfile_path=conanfile_path, reference=ref,
                                       remote=recipe_remote)
Ejemplo n.º 4
0
 def upload_package_index(index_pref):
     try:
         index, pref = index_pref
         up_msg = "\rUploading package %d/%d: %s to '%s'" % (
             index + 1, total, str(pref.id), p_remote.name)
         self._output.info(left_justify_message(up_msg))
         self._upload_package(pref, retry, retry_wait,
                              integrity_check, policy, p_remote)
         upload_recorder.add_package(pref, p_remote.name,
                                     p_remote.url)
         return conanfile_path, ref, recipe_remote, None
     except ConanException as exc:
         return None, None, None, exc
Ejemplo n.º 5
0
 def _upload_recipe_end_msg(self, ref, remote):
     msg = "\rUploaded conan recipe '%s' to '%s'" % (str(ref), remote.name)
     url = remote.url.replace("https://api.bintray.com/conan", "https://bintray.com")
     msg += ": %s" % url
     self._output.info(left_justify_message(msg))
Ejemplo n.º 6
0
    def _upload_recipe(self, ref, conanfile, retry, retry_wait, policy, remote,
                       remotes):
        layout = self._cache.package_layout(ref)
        current_remote_name = layout.load_metadata().recipe.remote

        if remote.name != current_remote_name:
            retrieve_exports_sources(self._remote_manager, self._cache,
                                     conanfile, ref, remotes)

        conanfile_path = layout.conanfile()
        self._hook_manager.execute("pre_upload_recipe",
                                   conanfile_path=conanfile_path,
                                   reference=ref,
                                   remote=remote)

        t1 = time.time()
        cache_files = self._compress_recipe_files(layout, ref)

        with layout.update_metadata() as metadata:
            metadata.recipe.checksums = calc_files_checksum(cache_files)

        local_manifest = FileTreeManifest.loads(
            load(cache_files["conanmanifest.txt"]))

        remote_manifest = None
        if policy != UPLOAD_POLICY_FORCE:
            # Check SCM data for auto fields
            if hasattr(conanfile,
                       "scm") and (conanfile.scm.get("url") == "auto"
                                   or conanfile.scm.get("revision") == "auto"
                                   or conanfile.scm.get("type") is None
                                   or conanfile.scm.get("url") is None
                                   or conanfile.scm.get("revision") is None):
                raise ConanException(
                    "The recipe contains invalid data in the 'scm' attribute"
                    " (some 'auto' values or missing fields 'type', 'url' or"
                    " 'revision'). Use '--force' to ignore this error or export"
                    " again the recipe ('conan export' or 'conan create') to"
                    " fix these issues.")

            remote_manifest = self._check_recipe_date(ref, remote,
                                                      local_manifest)
        if policy == UPLOAD_POLICY_SKIP:
            return ref

        files_to_upload, deleted = self._recipe_files_to_upload(
            ref, policy, cache_files, remote, remote_manifest, local_manifest)

        if files_to_upload or deleted:
            self._remote_manager.upload_recipe(ref, files_to_upload, deleted,
                                               remote, retry, retry_wait)
            msg = "\rUploaded conan recipe '%s' to '%s': %s" % (
                str(ref), remote.name, remote.url)
            self._output.info(left_justify_message(msg))
        else:
            self._output.info("Recipe is up to date, upload skipped")
        duration = time.time() - t1
        log_recipe_upload(ref, duration, cache_files, remote.name)
        self._hook_manager.execute("post_upload_recipe",
                                   conanfile_path=conanfile_path,
                                   reference=ref,
                                   remote=remote)

        # The recipe wasn't in the registry or it has changed the revision field only
        if not current_remote_name:
            with layout.update_metadata() as metadata:
                metadata.recipe.remote = remote.name

        return ref