Example #1
0
        private void LookThroughDependencies(NugetFeedPackage nugetFeedPackage, StringBuilder csprojString, NugetFeedPackage[] nugetFeedPackages, string spacing)
        {
            foreach (var nugetPackage in nugetFeedPackage.Dependencies)
            {
                var nugetFeedPackageDependency = nugetFeedPackages.SingleOrDefault(p => nugetPackage.Id == p.Id);
                if (nugetFeedPackageDependency != null)
                {
                    NugetVersion dependencyVersion2;
                    NugetVersion nugetFeedPackageVersion2;
                    try
                    {
                        dependencyVersion2       = NugetVersion.FromString(nugetPackage.Version);
                        nugetFeedPackageVersion2 = NugetVersion.FromString(nugetFeedPackageDependency.Version);
                    }
                    catch (FormatException)
                    {
                        continue;
                    }

                    if (dependencyVersion2.Prerelease || dependencyVersion2 != nugetFeedPackageVersion2)
                    {
                        csprojString.AppendLine($"{spacing}{nugetPackage.Id} {nugetPackage.Version} => {nugetFeedPackageDependency.Version}" + (dependencyVersion2.Prerelease ? " [PRERELEASE]" : ""));
                        // recursive call
                        LookThroughDependencies(nugetFeedPackageDependency, csprojString, nugetFeedPackages, "    " + spacing);
                    }
                }
            }
        }
    private void UpdateProjectNugetPackage(Project foundProject)
    {
        var  reader = new FileReaderContext(foundProject);
        bool found  = reader.TryGetPackageVersion(NugetPackage, out string packageVersion);

        if (found && !NugetVersion.Equals(packageVersion))
        {
            var writer = new FileWriterContext(foundProject);
            writer.UpdateNugetPackage(NugetPackage, NugetVersion);
        }
    }
Example #3
0
        private async Task <NugetVersion> GetLatestVersionAndSourceInfoAsync(string packageName, bool includePreRelease)
        {
            NugetVersion currentNugetVersion = null;

            foreach (var sourceInfo in sourceInfos)
            {
                WriteLineIfVerbose($"Searching for '{packageName}' on '{sourceInfo.Source.Name}'...");
                NugetVersion latestNugetVersion;
                try
                {
                    latestNugetVersion = await sourceInfo.GetPackageAsync(packageName, null, includePreRelease);
                }
                catch (Exception ex)
                {
                    WriteLine($"Error when getting '{packageName}'. Source used: '{sourceInfo.Source.Name}'.");
                    WriteLineIfVerbose($"Error details: {ex.ToString()}'.");
                    return(null);
                }
                if (latestNugetVersion == null)
                {
                    WriteLineIfVerbose($"Could not get a version for '{packageName}' on '{sourceInfo.Source.Name}'.");
                    continue;
                }
                else
                {
                    WriteLineIfVerbose($"Found version '{latestNugetVersion.Version}' for '{packageName}' on '{sourceInfo.Source.Name}'.");
                }
                if (currentNugetVersion == null || latestNugetVersion.Version > currentNugetVersion.Version)
                {
                    currentNugetVersion = latestNugetVersion;
                }
            }
            if (currentNugetVersion == null)
            {
                WriteLine($"Package '{packageName}' not found. Sources used:");
                foreach (var source in sourceInfos.Select(p => p.Source))
                {
                    WriteLine($" - {source.Name}: {source.Source}");
                }
                return(null);
            }
            WriteLineIfVerbose($"Latest version for '{packageName}' is '{currentNugetVersion.Version}' from '{currentNugetVersion.SourceInfo.Source.Name}'.");
            return(currentNugetVersion);
        }
Example #4
0
            public async Task <NugetVersion> GetPackageAsync(string packageName, SemanticVersion packageVersion, bool includePreRelease)
            {
                var currentFeed = await GetFeedAsync();

                if (currentFeed == null)
                {
                    WriteLine("Current feed is null. Returning.");
                    return(null);
                }
                var searchQueryServiceUrl = currentFeed.Resources.FirstOrDefault(r => r.Type == "SearchQueryService")?.Id;

                if (searchQueryServiceUrl == null)
                {
                    searchQueryServiceUrl = currentFeed.Resources.FirstOrDefault(r => r.Type == "SearchQueryService/3.0.0-rc")?.Id;
                }
                string serviceUrl;
                bool   supportsQueryById;

                if (searchQueryServiceUrl == null)
                {
                    searchQueryServiceUrl = currentFeed.Resources.FirstOrDefault(r => r.Type == "SearchQueryService/3.0.0-beta")?.Id; //vsts is still in this version
                    if (searchQueryServiceUrl == null)
                    {
                        WriteLine("Nuget server does not offer a search query service we can work with.");
                        return(null);
                    }
                    serviceUrl        = $"{searchQueryServiceUrl}?q={packageName}{(includePreRelease ? "&prerelease=true" : "")}";
                    supportsQueryById = false;
                }
                else
                {
                    serviceUrl        = $"{searchQueryServiceUrl}?q=packageid:{packageName}{(includePreRelease ? "&prerelease=true" : "")}";
                    supportsQueryById = true;
                }
                var serviceResponse = await HttpClient.GetAsync(serviceUrl);

                if (!serviceResponse.IsSuccessStatusCode)
                {
                    WriteLine($"Could not get service details from '{serviceUrl}'.");
                    WriteLineIfVerbose($"Got status code: '{(int)serviceResponse.StatusCode}' ({serviceResponse.StatusCode}).");
                    throw new Exception($"Could not get service details from '{serviceUrl}'.");
                }
                var serviceContent = await serviceResponse.Content.ReadAsStringAsync();

                var service = await Task.Factory.StartNew(() => JsonConvert.DeserializeObject <Service>(serviceContent));

                var serviceData = supportsQueryById
                    ? service.Data.FirstOrDefault()
                    : service.Data.FirstOrDefault(sd => string.Compare(sd.Id, packageName, true) == 0);
                var latest = serviceData?.Version;

                if (latest == null)
                {
                    WriteLineIfVerbose($"There was no package info for '{packageName}' on '{Source.Name}'.");
                    return(null);
                }
                WriteLineIfVerbose($"Found package '{packageName}' with latest version {latest}.");
                var currentSemanticVersion = SemanticVersion.Parse(latest);

                if (packageVersion != null)
                {
                    var versionExists = serviceData.Versions.Any(v => v.Version == packageVersion.ToString());
                    if (versionExists)
                    {
                        currentSemanticVersion = packageVersion;
                    }
                    else
                    {
                        WriteLineIfVerbose($"Version '{packageVersion.ToString()}' was not found for '{packageName}' on '{Source.Name}'.");
                        return(null);
                    }
                }
                var nugetVersion = new NugetVersion(currentSemanticVersion, this, serviceData.Id);

                return(nugetVersion);
            }
Example #5
0
        public IActionResult ListUpdates(string nugetFeed, string[] projectFilter = null, string searchFilter = null)
        {
            projectFilter = projectFilter ?? new string[0];
            searchFilter  = (searchFilter ?? "").ToLowerInvariant();
            if (ViewBag.HasConfig = BaseProvider.ConfigProvider.HasConfig())
            {
                var nugetFeedTask = Task.Run(() =>
                {
                    var nugetReader = new NugetFeedReader(nugetFeed);
                    nugetReader.FetchPackages();
                    nugetReader.FilterToLatestPackages();
                    return(nugetReader.GetCurrentCollection().ToArray());
                });

                Task <Tuple <IProjectReference, Dictionary <Tuple <IProjectFile, IProjectInformation>, NugetDependency[]> > > FetchAllNugetDependencies(IProjectSource projectSource, IProjectReference project)
                {
                    return(Task.Run(() =>
                    {
                        try
                        {
                            var nugetDep = projectSource.GetAllNugetDependencies(project, false);
                            return new Tuple <IProjectReference, Dictionary <Tuple <IProjectFile, IProjectInformation>, NugetDependency[]> >(project, nugetDep);
                        }
                        catch (Exception ex)
                        {
                            throw new Exception("Failed for project: " + project.GetName(), ex);
                        }
                    }));
                }

                BaseProvider.InitializeProjectSource();
                var source      = BaseProvider.ProjectSource;
                var projectTask = Task.Run(() =>
                {
                    var projects = source.GetAllProjects(false);
                    if (!string.IsNullOrWhiteSpace(searchFilter))
                    {
                        projects = projects.Where(x => x.GetName().ToLowerInvariant().Contains(searchFilter)).ToArray();
                    }
                    if (projectFilter.Length > 0)
                    {
                        projects = projects.Where(x => projectFilter.Contains(x.GetName())).ToArray();
                    }
                    var tasks = projects.Select(project => FetchAllNugetDependencies(source, project)).ToList();
                    Task.WhenAll(tasks).Wait();
                    return(tasks.Select(x => x.Result).ToArray());
                });
                nugetFeedTask.Wait();
                projectTask.Wait();
                var resultString = new StringBuilder();
                foreach (var project in projectTask.Result)
                {
                    var projectReference = project.Item1;
                    var projectString    = new StringBuilder();
                    foreach (var nugetDependencies in project.Item2)
                    {
                        var csprojString = new StringBuilder();
                        foreach (var nugetDependency in nugetDependencies.Value)
                        {
                            var nugetFeedPackage = nugetFeedTask.Result.SingleOrDefault(nfp => nfp.Id == nugetDependency.Id);
                            if (nugetFeedPackage == null)
                            {
                                continue;
                            }

                            /*var projects = source.GetAllProjects(false);
                             * foreach (var reference in projects)
                             * {
                             *  var definitions = source.GetAllNugetDefinitions(reference, false);
                             *  foreach (var keyValuePair in definitions)
                             *  {
                             *      keyValuePair.Value.Id ==
                             *  }
                             * }*/
                            NugetVersion dependencyVersion;
                            try
                            {
                                dependencyVersion = NugetVersion.FromString(nugetDependency.Version);
                            }
                            catch (FormatException)
                            {
                                csprojString.AppendLine($":{nugetDependency.Id} ERROR: Invalid format [dependency] {nugetDependency.Version}");
                                continue;
                            }

                            NugetVersion nugetFeedPackageVersion;
                            try
                            {
                                nugetFeedPackageVersion = NugetVersion.FromString(nugetFeedPackage.Version);
                            }
                            catch (FormatException)
                            {
                                csprojString.AppendLine($":{nugetDependency.Id} ERROR: Invalid format [nugetFeed] {nugetFeedPackage.Version}");
                                continue;
                            }

                            if (dependencyVersion.Prerelease || dependencyVersion != nugetFeedPackageVersion)
                            {
                                csprojString.AppendLine($"{nugetDependency.Id} {nugetDependency.Version} => {nugetFeedPackage.Version}" + (dependencyVersion.Prerelease ? " [PRERELEASE]" : ""));
                                LookThroughDependencies(nugetFeedPackage, csprojString, nugetFeedTask.Result, "    - ");
                            }
                        }

                        if (csprojString.Length > 0)
                        {
                            projectString.AppendLine("Csproj: " + nugetDependencies.Key.Item2.CsprojFilePath);
                            projectString.AppendLine("    " + csprojString.ToString().Replace("\n", "\n    ").TrimEnd());
                        }
                    }

                    var str = projectString.ToString();
                    if (str.Length > 0)
                    {
                        resultString.AppendLine(projectReference.GetName());
                        resultString.AppendLine("    " + projectString.ToString().Replace("\n", "\n    ").TrimEnd());
                        resultString.AppendLine();
                    }
                }

                return(Content(resultString.ToString()));
            }

            return(Content("Missing config/setup"));
        }