Exemple #1
0
def resolve_latest(motif_list, pm):
    out = []
    grouped_packages = {}
    group_package_identifiers_by_name(pm.list_installed_packages().keys(),
                                      pkgmap=grouped_packages)
    group_package_identifiers_by_name(pm.list_available_packages().keys(),
                                      pkgmap=grouped_packages)

    for motif in motif_list:
        pi = None
        if PackageIdentifier.is_valid_identifier(motif):
            pi = PackageIdentifier.parse(motif)
            if pi.name not in grouped_packages or pi not in grouped_packages[
                    pi.name]:
                # Unknwon package
                pi = None
        elif motif in grouped_packages:
            # Get latest of the sorted list
            pi = grouped_packages[motif][-1]

        # Check if package identifier has been found
        if pi is None:
            raise InvalidPackageNameException(motif)

        out.append(pi)

    return out
Exemple #2
0
def find_manifest(pi, mfmap, ignore_unknown=False):
    """
    Return the Manifest from the given map from its PackageIdentifier.
    If the given PackageIdentifier is *latest*, then return the highest version of the package.
    """
    if not isinstance(mfmap, dict):
        raise ValueError()
    if is_latest_package(pi):
        pi = find_latest_version(pi, mfmap.keys(), ignore_unknown=True)
    if pi in mfmap:
        return mfmap[pi]
    if not ignore_unknown:
        raise InvalidPackageNameException(pi)
Exemple #3
0
def find_latest_version(pi_or_name, pilist, ignore_unknown=False):
    """
    Use given package name to return the PackageIdentifier with the highest version
    """
    out = None
    piname = pi_or_name.name if isinstance(
        pi_or_name, PackageIdentifier) else str(pi_or_name)
    for pi in [pi for pi in pilist if pi.name == piname]:
        if out is None or pi > out:
            out = pi
    if out is None and not ignore_unknown:
        raise InvalidPackageNameException(pi_or_name)
    return out
Exemple #4
0
    def execute(self, args, uargs):
        wm = self.get_workspacemanager()
        logger = wm.logger

        pfname = wm.current_profile_name
        profile = wm.get_profile(pfname)

        profile_pkg_map = profile.pkg_map
        grouped_packagesmap = group_package_identifiers_by_name(wm.list_installed_packages())
        grouped_packagesmap = group_package_identifiers_by_name(wm.list_available_packages(), pkgmap=grouped_packagesmap)

        update_pilist = []

        motiflist = args.packages if args.packages is not None else profile_pkg_map.keys()
        for motif in motiflist:
            pi = None
            if PackageIdentifier.is_valid_identifier(motif):
                # User force specific version
                candidate = PackageIdentifier.parse(motif)
                if candidate.name in grouped_packagesmap:
                    if candidate in grouped_packagesmap[candidate.name]:
                        pi = candidate
            elif motif in grouped_packagesmap:
                # Get latest version
                pi = grouped_packagesmap[motif][-1]

            if pi is None:
                # Unknown package identifier
                raise InvalidPackageNameException(motif)

            if pi is not None and pi not in update_pilist:
                # Get PI in profile
                previous_pi = PackageIdentifier(pi.name, profile_pkg_map[pi.name]) if pi.name in profile_pkg_map else None
                if previous_pi is None:
                    # Package not in profile yet, add it
                    if wm.print_with_confirm("Do you want to add package {pi}?".format(pi=pi)):
                        update_pilist.append(pi)
                elif previous_pi != pi:
                    # Package already in profile with a different version, update it
                    if wm.print_with_confirm("Do you want to update package {pi.name} from {oldpi.version} to {pi.version}?".format(pi=pi, oldpi=previous_pi)):
                        update_pilist.append(pi)
                else:
                    # Package already in profile with same version, do nothing
                    pass

        if len(update_pilist) == 0:
            logger.print_default("Nothing to do")
        else:
            profile.add_packages(update_pilist)
            wm.update_profile(profile)
            wm.provision_profile(profile)
Exemple #5
0
 def build_packages_environment(self, items: list, ipmap=None):
     """
     Get the env vars declared by given packages
     @param items: a list of InstalledPackage or PackageIdentifier
     """
     ipmap = ipmap or self.list_installed_packages()
     out = Environment()
     for item in items:
         ip = None
         if isinstance(item, InstalledPackage):
             ip = item
         elif isinstance(item, PackageIdentifier):
             ip = None
             if is_latest_package(item):
                 ip = find_manifest(item, ipmap)
             else:
                 ip = ipmap.get(item)
             if ip is None:
                 raise InvalidPackageNameException(item)
         else:
             raise InvalidPackageNameException(item)
         vr = VariableResolver(ip, ipmap.values())
         out.append(ip.build_environment(vr=vr.resolve))
     return out
Exemple #6
0
 def parse(pis: str):
     if not PackageIdentifier.is_valid_identifier(pis):
         raise InvalidPackageNameException(pis)
     split = pis.partition(PackageIdentifier.SEPARATOR)
     return PackageIdentifier(split[0], split[2])