Ejemplo n.º 1
0
        public void GetInstalledPackages(string name, string requiredVersion, string minimumVersion, string maximumVersion, Request request)
        {
            request.Debug("Calling '{0}::GetInstalledPackages({1},{2},{3},{4})'", ProviderName, name, requiredVersion, minimumVersion, maximumVersion);
            VersionIdentifier required = string.IsNullOrEmpty(requiredVersion) ? null : new VersionIdentifier(requiredVersion);
            VersionIdentifier minimum  = string.IsNullOrEmpty(minimumVersion) ? null : new VersionIdentifier(minimumVersion);
            VersionIdentifier maximum  = string.IsNullOrEmpty(maximumVersion) ? null : new VersionIdentifier(maximumVersion);

            foreach (var install in PythonInstall.FindEnvironments(request))
            {
                if (string.IsNullOrEmpty(name) || name == "Python")
                {
                    install.YieldSelf(request);
                }
                foreach (var package in install.FindInstalledPackages(name, requiredVersion, request))
                {
                    if ((required == null || required.Compare(package.version) == 0) &&
                        (minimum == null || minimum.Compare(package.version) <= 0) &&
                        (maximum == null || maximum.Compare(package.version) >= 0))
                    {
                        package.YieldSelf(request);
                    }
                }
            }
        }
Ejemplo n.º 2
0
        public void InstallPackage(string fastPackageReference, Request request)
        {
            request.Debug("Calling '{0}::InstallPackage' '{1}'", ProviderName, fastPackageReference);
            var package = PythonPackage.FromFastReference(fastPackageReference, request);

            if (package is PythonInstall)
            {
                ((PythonInstall)package).Install(request);
                return;
            }
            bool retried = false;

retry:
            List <PythonInstall> usableinstalls   = new List <PythonInstall>();
            List <PythonInstall> unusableinstalls = new List <PythonInstall>();

            foreach (var candidateinstall in PythonInstall.FindEnvironments(request))
            {
                if (package.CanInstall(candidateinstall, request))
                {
                    usableinstalls.Add(candidateinstall);
                }
                else
                {
                    unusableinstalls.Add(candidateinstall);
                }
            }
            if (usableinstalls.Count == 1)
            {
                package.Install(usableinstalls[0], request);
            }
            else if (usableinstalls.Count == 0)
            {
                // Need to install a Python
                if (retried)
                {
                    request.Error(ErrorCategory.NotImplemented, package.name, "Failed to install a Python interpreter");
                    return;
                }

                List <PythonPackage> candidate_pythons = new List <PythonPackage>(
                    PythonWebsite.Search("Python", null, null, null, true, request));
                candidate_pythons.Sort(new PackageVersionComparer());

                bool installed = false;

                for (int i = candidate_pythons.Count - 1; i >= 0; i--)
                {
                    if (Environment.Is64BitOperatingSystem &&
                        ((PythonInstall)candidate_pythons[i]).CanInstall(true, request) &&
                        package.CanInstall((PythonInstall)candidate_pythons[i], true, request))
                    {
                        ((PythonInstall)candidate_pythons[i]).Install(true, request);
                        installed = true;
                        break;
                    }
                    else if (((PythonInstall)candidate_pythons[i]).CanInstall(false, request) &&
                             package.CanInstall((PythonInstall)candidate_pythons[i], true, request))
                    {
                        ((PythonInstall)candidate_pythons[i]).Install(false, request);
                        installed = true;
                        break;
                    }
                }

                if (installed)
                {
                    retried = true;
                    goto retry;
                }
                else
                {
                    request.Error(ErrorCategory.NotImplemented, package.name, "Couldn't find a Python interpreter to install for this");
                    return;
                }
            }
            else if (usableinstalls.Count > 1)
            {
                if (request.GetOptionValue("Force") == "True")
                {
                    PythonInstall greatest = usableinstalls[0];
                    foreach (var candidate in usableinstalls)
                    {
                        if (candidate.version.Compare(greatest.version) > 0)
                        {
                            greatest = candidate;
                        }
                    }
                    package.Install(greatest, request);
                }
                else
                {
                    request.Warning("Multiple installed Python interpreters could satisfy this request:");
                    foreach (var install in usableinstalls)
                    {
                        request.Warning("  Python version '{0}' at '{1}'", install.version, install.exe_path);
                    }
                    request.Warning("Please select a Python to install to, using e.g. -PythonVersion 3.2 or -PythonLocation c:\\python32\\python.exe");
                    request.Error(ErrorCategory.NotSpecified, package.name, "Not enough information to select a Python interpreter for the install");
                }
            }
        }