private static void InstallNugetPackageForSpecifiedVersion(IProject project, IVsPackageInstaller vsPackageInstaller, string packageId, string version)
 {
     vsPackageInstaller.InstallPackage(
         ServiceMatrixOverrides.GetNugetFeedServiceBaseAddress() ?? "All",
         project.As <EnvDTE.Project>(),
         packageId,
         version,
         false);
 }
        private static void InstallLatestNugetPackage(IProject project, IVsPackageInstallerServices vsPackageInstallerServices, IVsPackageInstaller vsPackageInstaller, string packageId, int?majorVersion)
        {
            // lookup latest version for the given major (or null), and install that
            var latestVersion = GetLatestVersionForMajor(packageId, majorVersion);

            vsPackageInstaller.InstallPackage(
                ServiceMatrixOverrides.GetNugetFeedServiceBaseAddress() ?? "All",
                project.As <EnvDTE.Project>(),
                packageId,
                latestVersion,
                false);

            // Call the installed packages to get the version that was just installed and cache the version.
            // Packages are needed in case latestVersion is null,
            var installedPackages = vsPackageInstallerServices.GetInstalledPackages();

            NugetPackageVersionManager.UpdateCache(packageId, majorVersion, installedPackages);
        }
        static string GetNugetFeedServiceBaseAddress()
        {
            var overrideFeed = ServiceMatrixOverrides.GetNugetFeedServiceBaseAddress();

            return(string.IsNullOrWhiteSpace(overrideFeed) ? officialNugetFeed : overrideFeed.Trim());
        }
        static string GetLatestVersionForMajor(string packageId, int?majorVersion)
        {
            // first check for overrides
            var overridenPackageVersion = ServiceMatrixOverrides.GetNugetPackageVersion(packageId);

            if (!string.IsNullOrEmpty(overridenPackageVersion))
            {
                return(overridenPackageVersion);
            }

            // if no major is given, use latest
            if (!majorVersion.HasValue)
            {
                return(null);
            }

            using (var client = new WebClient())
            {
                client.BaseAddress = GetNugetFeedServiceBaseAddress();

                var query =
                    string.Format(
                        CultureInfo.InvariantCulture,
                        @"Packages()?$filter=Id eq '{0}' and startswith(Version,'{1}.')&$orderby=Version desc",
                        packageId,
                        majorVersion.Value);

                string resultString;
                try
                {
                    resultString = client.DownloadString(query);
                }
                catch (WebException e)
                {
                    tracer.Trace(TraceEventType.Warning, e, "Could not retrieve result from feed for package {0}", packageId);
                    return(null);
                }

                if (string.IsNullOrWhiteSpace(resultString))
                {
                    tracer.Trace(TraceEventType.Warning, null, "Retrieved empty result from feed for package {0}", packageId);
                    return(null);
                }

                XElement xmlElement;
                try
                {
                    xmlElement = XElement.Parse(resultString);
                }
                catch (XmlException e)
                {
                    tracer.Trace(TraceEventType.Warning, e, "Retrieved invalid result from feed for package {0}", packageId);
                    return(null);
                }

                var versionElementName = XName.Get("Version", "http://schemas.microsoft.com/ado/2007/08/dataservices");

                var versions =
                    xmlElement
                    .Descendants(versionElementName)
                    .Select(e => new { e.Value, Version = ParseVersion(e.Value) })
                    .OrderByDescending(v => v.Version);
                var version = versions.FirstOrDefault(v => v.Version != null);

                return(version != null ? version.Value : null);
            }
        }