Exemple #1
0
    def _create_property_table(self, element):
        labels = []
        values = []

        # Description
        if element.description is not None:
            labels.append("Description:")
            values.append(element.description)

        # Documentation
        if element.documentation is not None:
            labels.append("Documentation:")
            values.append(element.documentation)

        # Tags
        tag_count = len(element.all_tags)
        if tag_count > 0:
            labels.append("Tag{s}:".format(s=("s" if tag_count > 1 else "")))
            values.append(self._get_tags(element))

        # Release date
        if element.date is not None:
            labels.append("Release date:")
            values.append(element.date)

        # Count included packages
        dependency_count = len(element.depends_packages)

        # For Availables Packages
        if isinstance(element, AvailablePackage):
            # Sources
            remote_count = len(element.remotes)
            if remote_count > 0:
                labels.append(
                    "Source{s}:".format(s=("s" if remote_count > 1 else "")))
                values.append(",".join(remote.alias
                                       for remote in element.remotes))

            if dependency_count == 0:
                # Size
                labels.append("Size:")
                values.append(sizeof_fmt(element.size))
        # For Installed Packages
        elif isinstance(element, InstalledPackage):
            # Folder
            labels.append("Folder:")
            values.append(element.folder)

        # Included packages
        if dependency_count > 0:
            labels.append("Included Package{s}:".format(
                s=("s" if dependency_count > 1 else "")))
            values.append("\n".join(
                self._get_cpis(cpis) for cpis in element.depends_packages))

        return map(self.tm.LABEL, labels), values
Exemple #2
0
 def __check_cache_folder_size(self):
     # Check if it has been checked recently
     if self.is_file_outdated(self.download_cache_folder):
         # Compute the folder total size
         totalsize = fs_compute_total_size(self.download_cache_folder)
         if totalsize > LeafConstants.CACHE_SIZE_MAX:
             # Display a message
             self.logger.print_error(
                 "You can save {size} by cleaning the leaf cache folder".
                 format(size=sizeof_fmt(totalsize)))
             self.print_hints(
                 "to clean the cache, you can run: 'rm -r {folder}'".format(
                     folder=self.download_cache_folder))
             # Update the mtime
             self.download_cache_folder.touch()
Exemple #3
0
 def __check_cache_folder_size(self):
     # Check if it has been checked recently
     if self.is_file_outdated(self.download_cache_folder):
         # Compute the folder total size
         totalsize = fs_compute_total_size(self.download_cache_folder)
         if totalsize > LeafConstants.CACHE_SIZE_MAX:
             # Display a message
             self.logger.print_error(
                 "You can save {size} by cleaning the leaf cache folder".
                 format(size=sizeof_fmt(totalsize)))
             self.print_hints(
                 "to clean the cache, you can run: 'rm -r {folder}'".format(
                     folder=self.download_cache_folder))
             # Clean the cache
             if not LeafSettings.NON_INTERACTIVE.as_boolean(
             ) and LeafSettings.CACHE_AUTOCLEAN.as_boolean():
                 if self.print_with_confirm(
                         question="Do you want to clean the cache?"):
                     shutil.rmtree(str(self.download_cache_folder))
             # Update the mtime
             self.download_cache_folder.touch()
Exemple #4
0
    def install_packages(self,
                         pilist: list,
                         env: Environment = None,
                         keep_folder_on_error: bool = False):
        """
        Compute dependency tree, check compatibility, download from remotes and extract needed packages
        @return: InstalledPackage list
        """
        with self.application_lock.acquire():
            prereq_install_folder = None
            ipmap = self.list_installed_packages()
            apmap = self.list_available_packages()
            out = []

            # Build env to resolve dynamic dependencies
            if env is None:
                env = Environment.build(self.build_builtin_environment(),
                                        self.build_user_environment())

            try:
                ap_to_install = DependencyUtils.install(pilist,
                                                        apmap,
                                                        ipmap,
                                                        env=env)

                # Check leaf min version
                min_version = check_leaf_min_version(ap_to_install)
                if min_version:
                    raise LeafOutOfDateException(
                        "You need to upgrade leaf to v{version} to install {text}"
                        .format(version=min_version,
                                text=", ".join([
                                    str(ap.identifier) for ap in ap_to_install
                                ])))

                # Check nothing to do
                if len(ap_to_install) == 0:
                    self.logger.print_default("All packages are installed")
                else:
                    # Check available size
                    download_totalsize = 0
                    for ap in ap_to_install:
                        if ap.size is not None:
                            download_totalsize += ap.size
                    fs_check_free_space(self.download_cache_folder,
                                        download_totalsize)

                    # Confirm
                    text = ", ".join(
                        [str(ap.identifier) for ap in ap_to_install])
                    self.logger.print_quiet(
                        "Packages to install: {packages}".format(
                            packages=text))
                    if download_totalsize > 0:
                        self.logger.print_default(
                            "Total size:", sizeof_fmt(download_totalsize))
                    self.print_with_confirm(raise_on_decline=True)

                    # Install prereq
                    prereq_to_install = DependencyUtils.prereq(pilist,
                                                               apmap,
                                                               ipmap,
                                                               env=env)

                    if len(prereq_to_install) > 0:
                        self.logger.print_default("Check required packages")
                        prereq_install_folder = mkdir_tmp_leaf_dir()
                        self.install_prereq(
                            [p.identifier for p in prereq_to_install],
                            prereq_install_folder,
                            apmap=apmap,
                            env=env)

                    # Download ap list
                    self.logger.print_default(
                        "Downloading {size} package(s)".format(
                            size=len(ap_to_install)))
                    la_to_install = []
                    for ap in ap_to_install:
                        la_to_install.append(self.__download_ap(ap))

                    # Check the extracted size
                    extracted_totalsize = 0
                    for la in la_to_install:
                        if la.final_size is not None:
                            extracted_totalsize += la.final_size
                        else:
                            extracted_totalsize += la.get_total_size()
                    fs_check_free_space(self.install_folder,
                                        extracted_totalsize)

                    # Extract la list
                    for la in la_to_install:
                        self.logger.print_default(
                            "[{current}/{total}] Installing {la.identifier}".
                            format(current=(len(out) + 1),
                                   total=len(la_to_install),
                                   la=la))
                        ip = self.__extract_artifact(
                            la,
                            env,
                            self.install_folder,
                            ipmap=ipmap,
                            keep_folder_on_error=keep_folder_on_error)
                        out.append(ip)

            finally:
                if not keep_folder_on_error and prereq_install_folder is not None:
                    self.logger.print_verbose(
                        "Remove prereq root folder {folder}".format(
                            folder=prereq_install_folder))
                    rmtree_force(prereq_install_folder)

            return out
Exemple #5
0
 def __init__(self, folder: Path, freespace: int, neededspace: int):
     LeafException.__init__(
         self, "Not enough space in folder {folder}, missing {size}".format(
             folder=folder, size=sizeof_fmt(neededspace - freespace)))
Exemple #6
0
    def install_packages(self,
                         items: list,
                         env: Environment = None,
                         keep_folder_on_error: bool = False):
        """
        Compute dependency tree, check compatibility, download from remotes and extract needed packages
        @return: InstalledPackage list
        """
        with self.application_lock.acquire():
            ipmap = self.list_installed_packages()
            apmap = self.list_available_packages()
            pilist = []
            for item in items:
                if isinstance(item, PackageIdentifier):
                    # Package identifier is given
                    pilist.append(item)
                elif PackageIdentifier.is_valid_identifier(item):
                    # Package identifier string given
                    pilist.append(PackageIdentifier.parse(item))
                else:
                    # If leaf artifacts are given, add/replace identifiers of available packages
                    la = LeafArtifact(Path(item))
                    pilist.append(la.identifier)
                    apmap[la.identifier] = la
            out = []

            # Build env to resolve dynamic dependencies
            if env is None:
                env = Environment.build(self.build_builtin_environment(),
                                        self.build_user_environment())

            ap_to_install = DependencyUtils.install(pilist,
                                                    apmap,
                                                    ipmap,
                                                    env=env)

            # Check leaf min version
            min_version = check_leaf_min_version(ap_to_install)
            if min_version:
                raise LeafOutOfDateException(
                    "You need to upgrade leaf to v{version} to install {text}".
                    format(version=min_version,
                           text=", ".join(
                               [str(ap.identifier) for ap in ap_to_install])))

            # Check nothing to do
            if len(ap_to_install) == 0:
                self.logger.print_default("All packages are installed")
            else:
                # Check available size
                download_totalsize = 0
                download_count = 0
                for ap in [
                        ap for ap in ap_to_install
                        if isinstance(ap, AvailablePackage)
                ]:
                    download_count += 1
                    if ap.size is not None:
                        download_totalsize += ap.size
                fs_check_free_space(self.download_cache_folder,
                                    download_totalsize)

                # Confirm
                text = ", ".join([str(ap.identifier) for ap in ap_to_install])
                self.logger.print_quiet(
                    "Packages to install: {packages}".format(packages=text))
                if download_totalsize > 0:
                    self.logger.print_default("Total size:",
                                              sizeof_fmt(download_totalsize))
                self.print_with_confirm(raise_on_decline=True)

                # Install prereq
                prereq_to_install = DependencyUtils.prereq(
                    [ap.identifier for ap in ap_to_install],
                    apmap,
                    ipmap,
                    env=env)

                if len(prereq_to_install) > 0:
                    try:
                        self.__install_prereq(
                            prereq_to_install,
                            ipmap,
                            env=env,
                            keep_folder_on_error=keep_folder_on_error)
                    except BaseException as e:
                        raise PrereqException(e)

                # Download ap list
                self.logger.print_default(
                    "Downloading {size} package(s)".format(
                        size=download_count))
                la_to_install = []
                for mf in ap_to_install:
                    if isinstance(mf, AvailablePackage):
                        la_to_install.append(self.__download_ap(mf))
                    elif isinstance(mf, LeafArtifact):
                        la_to_install.append(mf)

                # Check the extracted size
                extracted_totalsize = 0
                for la in la_to_install:
                    if la.final_size is not None:
                        extracted_totalsize += la.final_size
                    else:
                        extracted_totalsize += la.get_total_size()
                fs_check_free_space(self.install_folder, extracted_totalsize)

                # Extract la list
                for la in la_to_install:
                    self.logger.print_default(
                        "[{current}/{total}] Installing {la.identifier}".
                        format(current=(len(out) + 1),
                               total=len(la_to_install),
                               la=la))
                    ip = self.__extract_artifact(
                        la,
                        env,
                        ipmap,
                        keep_folder_on_error=keep_folder_on_error)
                    out.append(ip)

            return out
Exemple #7
0
 def testsizeof_fmt(self):
     self.assertEqual(sizeof_fmt(0), "0 bytes")
     self.assertEqual(sizeof_fmt(1), "1 byte")
     self.assertEqual(sizeof_fmt(123789), "121 kB")
     self.assertEqual(sizeof_fmt(456123789), "435.0 MB")