Example #1
0
        private void AddPackageSource(List <Lazy <INuGetResourceProvider> > providers, PackageSource packageSource)
        {
            SourceRepository sourceRepository = new SourceRepository(packageSource, providers);

            try
            {
                PackageMetadataResource packageMetadataResource = sourceRepository.GetResource <PackageMetadataResource>();
                MetadataResourceList.Add(packageMetadataResource);
            }
            catch (Exception e)
            {
                Console.WriteLine("Error loading NuGet Package Meta Data Resource resoure for url: " + packageSource.SourceUri);
                if (e.InnerException != null)
                {
                    Console.WriteLine(e.InnerException.Message);
                }
            }
            try
            {
                DependencyInfoResource dependencyInfoResource = sourceRepository.GetResource <DependencyInfoResource>();
                DependencyInfoResourceList.Add(dependencyInfoResource);
                Console.WriteLine("Succesfully added dependency info resource: " + sourceRepository.PackageSource.SourceUri);
            }
            catch (Exception e)
            {
                Console.WriteLine("Error loading NuGet Dependency Resource resoure for url: " + packageSource.SourceUri);
                if (e.InnerException != null)
                {
                    Console.WriteLine(e.InnerException.Message);
                }
            }
        }
Example #2
0
        private async Task GetPackageDependenciesAsync(PackageIdentity package,
                                                       NuGetFramework framework,
                                                       SourceCacheContext cacheContext,
                                                       ILogger logger,
                                                       IEnumerable <SourceRepository> repositories,
                                                       ISet <SourcePackageDependencyInfo> availablePackages)
        {
            if (availablePackages.Contains(package))
            {
                return;
            }

            foreach (SourceRepository sourceRepository in repositories)
            {
                DependencyInfoResource dependencyInfoResource = await sourceRepository.GetResourceAsync <DependencyInfoResource>();

                SourcePackageDependencyInfo dependencyInfo = await dependencyInfoResource.ResolvePackage(
                    package, framework, cacheContext, logger, CancellationToken.None);

                if (dependencyInfo == null)
                {
                    continue;
                }

                availablePackages.Add(dependencyInfo);
                foreach (PackageDependency dependency in dependencyInfo.Dependencies)
                {
                    await GetPackageDependenciesAsync(
                        new PackageIdentity(dependency.Id, dependency.VersionRange.MinVersion),
                        framework, cacheContext, logger, repositories, availablePackages);
                }
            }
        }
Example #3
0
        static async Task<IEnumerable<SourcePackageDependencyInfo>> GetDependencyInfoAsync(
            DependencyInfoResource dependencyInfoResource,
            IEnumerable<PackageIdentity> packages,
            NuGetFramework projectFramework)
        {
            try
            {
                var result = new HashSet<SourcePackageDependencyInfo>(PackageIdentity.Comparer);
                foreach (var package in packages)
                {
                    var dependencyInfo = await dependencyInfoResource.ResolvePackage(
                        package,
                        projectFramework,
                        NullSourceCacheContext.Instance,
                        NullLogger.Instance,
                        CancellationToken.None);
                    if (dependencyInfo != null)
                    {
                        result.Add(dependencyInfo);
                    }
                }

                return result;
            }
            catch (NuGetProtocolException)
            {
                return null;
            }
        }
Example #4
0
        static IEnumerable <string> FindAssemblyReferences(
            NuGetFramework projectFramework,
            DependencyInfoResource dependencyResource,
            FindLocalPackagesResource localPackageResource,
            SourceCacheContext cacheContext,
            string packageId)
        {
            var packageInfo = localPackageResource.FindPackagesById(packageId, NullLogger.Instance, CancellationToken.None).FirstOrDefault();

            if (packageInfo == null)
            {
                yield break;
            }
            using (var reader = packageInfo.GetReader())
            {
                var nearestFramework = reader.GetReferenceItems().GetNearest(projectFramework);
                if (nearestFramework != null)
                {
                    foreach (var assembly in nearestFramework.Items)
                    {
                        yield return(Path.GetFileName(assembly));
                    }
                }
            }

            var dependencyInfo = dependencyResource.ResolvePackage(packageInfo.Identity, projectFramework, cacheContext, NullLogger.Instance, CancellationToken.None).Result;

            foreach (var dependency in dependencyInfo.Dependencies)
            {
                foreach (var reference in FindAssemblyReferences(projectFramework, dependencyResource, localPackageResource, cacheContext, dependency.Id))
                {
                    yield return(reference);
                }
            }
        }
        GetDependencies
        (
            string id,
            string version
        )
        {
            DependencyInfoResource resource = await repository.GetResourceAsync <DependencyInfoResource>(CancellationToken.None);

            SourcePackageDependencyInfo package = await resource.ResolvePackage
                                                  (
                new PackageIdentity(id, new NuGetVersion(version)),
                NuGetFramework.AnyFramework,
                source_cache,
                logger,
                cancellationToken
                                                  );

            if (package == null)
            {
                throw new InvalidOperationException("Could not locate dependency!");
            }

            //System.Collections.Concurrent.ConcurrentBag<string> dependency_collection;
            //dependency_collection = new System.Collections.Concurrent.ConcurrentBag<string>();

            Graph <string, string> dependency_graph = new Graph <string, string>();

            foreach (var dependency in package.Dependencies)
            {
                Node <string> dependency_node = new Node <string>()
                {
                };
                //dependency_collection.Add(dependency.Id + " " + dependency.VersionRange.MinVersion);
            }

            await Task.WhenAll
            (
                package.Dependencies.Select
                (
                    async(d) =>
            {
                var rec = await GetDependencies
                          (
                    d.Id,
                    d.VersionRange.MinVersion.ToNormalizedString()
                          );

                foreach (string s in rec)
                {
                    dependency_collection.Add(s);
                }
            }
                )
            );

            return(dependency_collection);
        }
Example #6
0
        public override async Task <Tuple <bool, INuGetResource> > TryCreate(SourceRepository source, CancellationToken token)
        {
            DependencyInfoResource DependencyInfoResourceV2 = null;
            var v2repo = await GetRepository(source, token);

            if (v2repo != null)
            {
                DependencyInfoResourceV2 = new DependencyInfoResourceV2(v2repo, source);
            }

            return(Tuple.Create <bool, INuGetResource>(DependencyInfoResourceV2 != null, DependencyInfoResourceV2));
        }
Example #7
0
        public ProjectReaderNugetDependencyDecorator(IProjectReader @base,
                                                     PackageMetadataResource metadataProvider,
                                                     DependencyInfoResource dependencyResolver,
                                                     SourceCacheContext cacheContext,
                                                     ILogger logger)
        {
            _base               = @base ?? throw new ArgumentNullException(nameof(@base));
            _metadataProvider   = metadataProvider ?? throw new ArgumentNullException(nameof(metadataProvider));
            _dependencyResolver = dependencyResolver ?? throw new ArgumentNullException(nameof(dependencyResolver));
            _cacheContext       = cacheContext ?? throw new ArgumentNullException(nameof(cacheContext));
            _logger             = logger ?? throw new ArgumentNullException(nameof(logger));

            _cancellationToken = CancellationToken.None;
        }
        public override async Task<Tuple<bool, INuGetResource>> TryCreate(SourceRepository source, CancellationToken token)
        {
            DependencyInfoResource curResource = null;

            if (await source.GetResourceAsync<ServiceIndexResourceV3>(token) != null)
            {
                var httpSourceResource = await source.GetResourceAsync<HttpSourceResource>(token);
                var regResource = await source.GetResourceAsync<RegistrationResourceV3>(token);

                // construct a new resource
                curResource = new DependencyInfoResourceV3(httpSourceResource.HttpSource, regResource, source);
            }

            return new Tuple<bool, INuGetResource>(curResource != null, curResource);
        }
Example #9
0
        static IEnumerable<string> FindAssemblyReferences(
            NuGetFramework projectFramework,
            DependencyInfoResource dependencyResource,
            FindLocalPackagesResource localPackageResource,
            SourceCacheContext cacheContext,
            string packageId)
        {
            var packageInfo = localPackageResource.FindPackagesById(packageId, NullLogger.Instance, CancellationToken.None).FirstOrDefault();
            if (packageInfo == null) yield break;
            using (var reader = packageInfo.GetReader())
            {
                var assemblyReferences = reader.GetReferenceItems().GetNearest(projectFramework);
                if (assemblyReferences != null)
                {
                    foreach (var assembly in assemblyReferences.Items)
                    {
                        yield return Path.GetFileName(assembly);
                    }
                }

                var buildReferences = reader.GetBuildItems().GetNearest(projectFramework);
                if (buildReferences != null)
                {
                    var buildProperties = buildReferences.Items.FirstOrDefault(item => Path.GetExtension(item) == PropertyExtension);
                    if (buildProperties != null)
                    {
                        using (var propertyStream = reader.GetStream(buildProperties))
                        using (var propertyReader = XmlReader.Create(propertyStream))
                        {
                            while (propertyReader.ReadToFollowing(ReferenceElement))
                            {
                                var assemblyName = propertyReader.GetAttribute(IncludeAttribute);
                                yield return Path.ChangeExtension(assemblyName, DllExtension);
                            }
                        }
                    }
                }
            }

            var dependencyInfo = dependencyResource.ResolvePackage(packageInfo.Identity, projectFramework, cacheContext, NullLogger.Instance, CancellationToken.None).Result;
            foreach (var dependency in dependencyInfo.Dependencies)
            {
                foreach (var reference in FindAssemblyReferences(projectFramework, dependencyResource, localPackageResource, cacheContext, dependency.Id))
                {
                    yield return reference;
                }
            }
        }
        public override async Task <Tuple <bool, INuGetResource> > TryCreate(SourceRepository source, CancellationToken token)
        {
            DependencyInfoResource DependencyInfoResourceV2 = null;

            if (FeedTypeUtility.GetFeedType(source.PackageSource) == FeedType.FileSystem)
            {
                var v2repo = await GetRepository(source, token);

                if (v2repo != null)
                {
                    DependencyInfoResourceV2 = new DependencyInfoResourceV2(v2repo, source);
                }
            }

            return(Tuple.Create <bool, INuGetResource>(DependencyInfoResourceV2 != null, DependencyInfoResourceV2));
        }
Example #11
0
        public async Task <NuGetPackageFilterResult> FilterAsync(SourceRepository repository, IPackageSearchMetadata package, CancellationToken cancellationToken)
        {
            if (!dependencies.Any())
            {
                return(NuGetPackageFilterResult.Ok);
            }

            DependencyInfoResource resource = await repository.GetResourceAsync <DependencyInfoResource>();

            if (resource == null)
            {
                return(NuGetPackageFilterResult.NotCompatible);
            }

            NuGetPackageFilterResult result = NuGetPackageFilterResult.Ok;

            foreach (NuGetFramework framework in frameworks)
            {
                SourcePackageDependencyInfo dependencyInfo = await resource.ResolvePackage(package.Identity, framework, new SourceCacheContext(), nuGetLogger, cancellationToken);

                if (dependencyInfo != null)
                {
                    // Dependency filtering:
                    // - When incompatible dependency version is found there is a chance that previous version has the right one.
                    // - When all dependencies are missing, don't even try previous versions.
                    foreach (var dependency in dependencies)
                    {
                        PackageDependency packageDependency = dependencyInfo.Dependencies.FirstOrDefault(p => string.Equals(p.Id, dependency.Id, StringComparison.CurrentCultureIgnoreCase));
                        if (packageDependency == null)
                        {
                            log.Info($"Package '{package.Identity}' skipped: missing dependency '{dependency.Id}'.");
                            result = NuGetPackageFilterResult.NotCompatible;
                        }

                        if (dependency.Version != null && !packageDependency.VersionRange.Satisfies(new NuGetVersion(dependency.Version)))
                        {
                            log.Info($"Package '{package.Identity}' skipped: not compatible version '{dependency.Version}' on dependency '{dependency.Id}'.");
                            return(NuGetPackageFilterResult.NotCompatibleVersion);
                        }
                    }

                    return(result);
                }
            }

            return(NuGetPackageFilterResult.NotCompatible);
        }
        public override async Task <Tuple <bool, INuGetResource> > TryCreate(SourceRepository source, CancellationToken token)
        {
            DependencyInfoResource resource = null;

            if (await source.GetFeedType(token) == FeedType.HttpV2)
            {
                var serviceDocument = await source.GetResourceAsync <ODataServiceDocumentResourceV2>(token);

                var httpSource = await source.GetResourceAsync <HttpSourceResource>(token);

                var parser = new V2FeedParser(httpSource.HttpSource, serviceDocument.BaseAddress, source.PackageSource.Source);

                resource = new DependencyInfoResourceV2Feed(parser, source);
            }

            return(new Tuple <bool, INuGetResource>(resource != null, resource));
        }
Example #13
0
        /// <summary>
        /// Call the DependencyInfoResource safely
        /// </summary>
        private async Task <List <SourcePackageDependencyInfo> > GatherPackageFromSourceAsync(
            string packageId,
            NuGetVersion version,
            DependencyInfoResource resource,
            NuGetFramework targetFramework,
            bool ignoreExceptions,
            CancellationToken token)
        {
            token.ThrowIfCancellationRequested();

            var results = new List <SourcePackageDependencyInfo>();

            try
            {
                // Call the dependecy info resource
                if (version == null)
                {
                    // find all versions of a package
                    var packages = await resource.ResolvePackages(packageId, targetFramework, _context.ResolutionContext.SourceCacheContext, _context.Log, token);

                    results.AddRange(packages);
                }
                else
                {
                    // find a single package id and version
                    var identity = new PackageIdentity(packageId, version);
                    var package  = await resource.ResolvePackage(identity, targetFramework, _context.ResolutionContext.SourceCacheContext, _context.Log, token);

                    if (package != null)
                    {
                        results.Add(package);
                    }
                }
            }
            catch
            {
                // Secondary sources should not stop the gather process. They are often invalid
                // such as scenarios where a UNC is offline.
                if (!ignoreExceptions)
                {
                    throw;
                }
            }

            return(results);
        }
Example #14
0
        private async Task EnsureDependencyProvider(CancellationToken cancellationToken)
        {
            if (_dependencyInfoResource == null)
            {
                try
                {
                    await _dependencyInfoSemaphore.WaitAsync(cancellationToken);

                    if (_dependencyInfoResource == null)
                    {
                        _dependencyInfoResource = await SourceRepository.GetResourceAsync <DependencyInfoResource>();
                    }
                }
                finally
                {
                    _dependencyInfoSemaphore.Release();
                }
            }
        }
Example #15
0
        public async Task <string> GetLatestVersionAsync(string packageId)
        {
            using (SourceCacheContext cacheContext = new SourceCacheContext())
            {
                IEnumerable <SourceRepository> repositories = _sourceRepositoryProvider.GetRepositories();

                foreach (var repo in repositories)
                {
                    DependencyInfoResource dependencyInfoResource      = repo.GetResource <DependencyInfoResource>();
                    IEnumerable <SourcePackageDependencyInfo> packages = await dependencyInfoResource.ResolvePackages(packageId, _nuGetFramework, cacheContext, _logger, CancellationToken.None);

                    if (packages != null && packages.Count() > 0)
                    {
                        SourcePackageDependencyInfo version = packages.Where(p => p.Listed && !p.Version.IsPrerelease).OrderByDescending(x => x.Version).First();
                        return(version.Version.ToNormalizedString());
                    }
                }
                return(null);
            }
        }
Example #16
0
        private static async Task <NuGetVersion> GetLatestMatchingVersion(string packageId, NuGetFramework currentFramework, VersionRange versionRange, SourceRepository sourceRepository, ILogger logger)
        {
            try
            {
                DependencyInfoResource dependencyInfoResource = await sourceRepository.GetResourceAsync <DependencyInfoResource>();

                var dependencyInfo = await dependencyInfoResource.ResolvePackages(
                    packageId, NullSourceCacheContext.Instance, logger, CancellationToken.None);

                return(dependencyInfo
                       .Select(x => x.Identity.Version)
                       .Where(x => x != null && (versionRange == null || versionRange.Satisfies(x)))
                       .DefaultIfEmpty()
                       .Max());
            }
            catch (Exception ex)
            {
                Trace.TraceWarning($"Could not get latest version for package {packageId} from source {sourceRepository}: {ex.Message}");
                return(null);
            }
        }
Example #17
0
        private async Task <NuGetVersion> GetLatestMatchingVersion(SourceRepository sourceRepository, ILogger logger)
        {
            try
            {
                DependencyInfoResource dependencyInfoResource = await sourceRepository.GetResourceAsync <DependencyInfoResource>();

                IEnumerable <SourcePackageDependencyInfo> dependencyInfo = await dependencyInfoResource.ResolvePackages(
                    _packageId, _currentFramework, logger, CancellationToken.None);

                return(dependencyInfo
                       .Select(x => x.Version)
                       .Where(x => x != null && (_versionRange == null || _versionRange.Satisfies(x)))
                       .DefaultIfEmpty()
                       .Max());
            }
            catch (Exception ex)
            {
                Trace.Warning($"Could not get latest version for package {_packageId} from source {sourceRepository}: {ex.Message}");
                return(null);
            }
        }
Example #18
0
        private async Task GetPackageDependencies(PackageIdentity package,
                                                  NuGetFramework framework,
                                                  SourceCacheContext cacheContext,
                                                  SourceRepository repository,
                                                  DependencyInfoResource dependencyInfoResource,
                                                  ISet <SourcePackageDependencyInfo> availablePackages,
                                                  ILogger logger)
        {
            if (availablePackages.Contains(package))
            {
                return;
            }

            var dependencyInfo = await dependencyInfoResource.ResolvePackage(
                package,
                framework,
                cacheContext,
                logger,
                CancellationToken.None);

            if (dependencyInfo == null)
            {
                return;
            }

            availablePackages.Add(dependencyInfo);
            foreach (var dependency in dependencyInfo.Dependencies)
            {
                await GetPackageDependencies(
                    new PackageIdentity(
                        dependency.Id,
                        dependency.VersionRange.MinVersion),
                    framework,
                    cacheContext,
                    repository,
                    dependencyInfoResource,
                    availablePackages, logger);
            }
        }
Example #19
0
        private async Task <TemplatePackage> GetLatestTemplatePackage(string packageId, string frameworkVersion, IAbsoluteDirectoryPath templateRepositoryPath)
        {
            ISettings settings = Settings.LoadSpecificSettings(root: null, this.appEnvironment.NuGetConfigFilePath.ToString());

            var nugetFramework           = NuGetFramework.ParseFolder(frameworkVersion);
            var sourceRepositoryProvider = new SourceRepositoryProvider(new PackageSourceProvider(settings), Repository.Provider.GetCoreV3());

            using (var cacheContext = new SourceCacheContext())
            {
                IEnumerable <SourceRepository> repositories = sourceRepositoryProvider.GetRepositories();
                var availablePackages = new HashSet <SourcePackageDependencyInfo>(PackageIdentityComparer.Default);

                foreach (SourceRepository sourceRepository in repositories)
                {
                    DependencyInfoResource dependencyInfoResource = await sourceRepository.GetResourceAsync <DependencyInfoResource>().ConfigureAwait(false);

                    IEnumerable <SourcePackageDependencyInfo> dependencyInfo = await dependencyInfoResource.ResolvePackages(
                        packageId,
                        nugetFramework,
                        cacheContext,
                        NullLogger.Instance,
                        CancellationToken.None).ConfigureAwait(false);

                    if (dependencyInfo == null)
                    {
                        continue;
                    }

                    availablePackages.AddRange(dependencyInfo);
                }

                var resolverContext = new PackageResolverContext(
                    DependencyBehavior.Highest,
                    new[] { packageId },
                    Enumerable.Empty <string>(),
                    Enumerable.Empty <PackageReference>(),
                    Enumerable.Empty <PackageIdentity>(),
                    availablePackages,
                    sourceRepositoryProvider.GetRepositories().Select(s => s.PackageSource),
                    NullLogger.Instance);

                var resolver = new PackageResolver();

                SourcePackageDependencyInfo packageToInstall = resolver.Resolve(resolverContext, CancellationToken.None)
                                                               .Select(p => availablePackages.Single(x => PackageIdentityComparer.Default.Equals(x, p)))
                                                               .FirstOrDefault();

                var packagePathResolver = new PackagePathResolver(SettingsUtility.GetGlobalPackagesFolder(settings));

                var packageExtractionContext = new PackageExtractionContext(
                    PackageSaveMode.Defaultv3,
                    XmlDocFileSaveMode.None,
                    ClientPolicyContext.GetClientPolicy(settings, NullLogger.Instance),
                    NullLogger.Instance);

                string            installedPath = packagePathResolver.GetInstalledPath(packageToInstall);
                PackageReaderBase packageReader;

                if (installedPath == null && packageToInstall != null)
                {
                    DownloadResource downloadResource = await packageToInstall.Source.GetResourceAsync <DownloadResource>(CancellationToken.None).ConfigureAwait(false);

                    DownloadResourceResult downloadResult = await downloadResource.GetDownloadResourceResultAsync(
                        packageToInstall,
                        new PackageDownloadContext(cacheContext),
                        SettingsUtility.GetGlobalPackagesFolder(settings),
                        NullLogger.Instance,
                        CancellationToken.None).ConfigureAwait(false);

                    await PackageExtractor.ExtractPackageAsync(
                        downloadResult.PackageSource,
                        downloadResult.PackageStream,
                        packagePathResolver,
                        packageExtractionContext,
                        CancellationToken.None).ConfigureAwait(false);

                    packageReader = downloadResult.PackageReader;
                }
                else
                {
                    packageReader = new PackageFolderReader(installedPath);
                }

                PackageIdentity identity = await packageReader.GetIdentityAsync(CancellationToken.None).ConfigureAwait(false);

                var templatePackageMetaData = new TemplatePackage
                {
                    PackageId = identity.Id,
                    Version   = identity.Version.OriginalVersion,
                    TemplateRepositoryPath = templateRepositoryPath.ToString(),
                };

                foreach (FrameworkSpecificGroup contentItem in packageReader.GetContentItems())
                {
                    foreach (string item in contentItem.Items)
                    {
                        templatePackageMetaData.Templates.Add(new Template {
                            NestedFilePath = item
                        });
                    }
                }

                var packageFileExtractor = new PackageFileExtractor(
                    templatePackageMetaData.Templates.Select(template => template.NestedFilePath),
                    XmlDocFileSaveMode.None);

                await packageReader.CopyFilesAsync(
                    templatePackageMetaData.InstalltionPath,
                    templatePackageMetaData.Templates.Select(template => template.NestedFilePath),
                    packageFileExtractor.ExtractPackageFile,
                    NullLogger.Instance,
                    CancellationToken.None).ConfigureAwait(false);

                return(templatePackageMetaData);
            }
        }
Example #20
0
 public SourceResource(SourceRepository source, DependencyInfoResource resource)
 {
     Source   = source;
     Resource = resource;
 }
Example #21
0
        private async Task InitializeResourcesAsync(CancellationToken token)
        {
            var currentSource = string.Empty;

            try
            {
                // get the dependency info resources for each repo
                // primary and all may share the same resources
                var getResourceTasks = new List <Task>();

                var allSources = new List <SourceRepository>();

                allSources.AddRange(_context.PrimarySources);
                allSources.Add(_context.PackagesFolderSource);
                allSources.AddRange(_context.AllSources);

                var depResources = new Dictionary <SourceRepository, Task <DependencyInfoResource> >();
                foreach (var source in allSources)
                {
                    if (!depResources.ContainsKey(source))
                    {
                        var task = Task.Run(async() => await source.GetResourceAsync <DependencyInfoResource>(token));

                        depResources.Add(source, task);

                        // Limit the number of tasks to MaxThreads by awaiting each time we hit the limit
                        while (getResourceTasks.Count >= MaxDegreeOfParallelism)
                        {
                            var finishedTask = await Task.WhenAny(getResourceTasks);

                            getResourceTasks.Remove(finishedTask);
                        }
                    }
                }

                var uniquePrimarySources = new HashSet <Configuration.PackageSource>();

                // a resource may be null, if it is exclude this source from the gather
                foreach (var source in _context.PrimarySources)
                {
                    if (uniquePrimarySources.Add(source.PackageSource))
                    {
                        var resource = await depResources[source];

                        if (source != null && !_primaryResources.Any(sourceResource => sourceResource.Source.PackageSource.Equals(source)))
                        {
                            _primaryResources.Add(new SourceResource(source, resource));
                        }
                    }
                }

                // All sources - for fallback
                var uniqueAllSources = new HashSet <Configuration.PackageSource>();

                foreach (var source in allSources)
                {
                    if (uniqueAllSources.Add(source.PackageSource))
                    {
                        //var resource = await depResources[source];
                        var resource = depResources[source];

                        if (source != null && !_allResources.Any(sourceResource => sourceResource.Source.PackageSource.Equals(source)))
                        {
                            currentSource = source.PackageSource.Source;
                            _allResources.Add(new SourceResource(source, resource.Result));
                        }
                    }
                }


                // Installed packages resource
                _packagesFolderResource = await _context.PackagesFolderSource.GetResourceAsync <DependencyInfoResource>(token);
            }
            catch (Exception ex) when(ex is System.Net.Http.HttpRequestException || ex is OperationCanceledException ||
                                      ex is InvalidOperationException || ex is TaskCanceledException || ex is AggregateException)
            {
                string message = String.Format(Strings.ExceptionWhenTryingToAddSource, ex.GetType().ToString(), currentSource);

                throw new InvalidOperationException(message, ex);
            }
        }
        /// <summary>
        /// Returns package dependency info for the given package identities in the given resource. It returns null if any protocol errors occur.
        /// For example, the feed is not accessible.
        /// </summary>
        /// <param name="packageIdentities">A collection of <see cref="PackageIdentity"/> to get info for.</param>
        /// <param name="nuGetFramework">Framework for determining the dependency groups of packages</param>
        /// <param name="dependencyInfoResource">The resource to fetch dependency info from. Could be http/file feed/global packages folder/solution packages folder.</param>
        /// <param name="sourceCacheContext">Caching context. Only really applicable when the dependency info resource is http based.</param>
        /// <param name="includeUnresolved">Whether to include unresolved packages in the list. If true, the unresolved packages will have an empty dependencies collection.</param>
        /// <param name="logger">logger</param>
        /// <param name="cancellationToken">cancellation token</param>
        /// <returns>A collection of <see cref="PackageDependencyInfo"/>, null if a protocol exception happens.  </returns>
        public static async Task <IEnumerable <PackageDependencyInfo> > GetDependencyInfoForPackageIdentitiesAsync(IEnumerable <PackageIdentity> packageIdentities,
                                                                                                                   NuGetFramework nuGetFramework,
                                                                                                                   DependencyInfoResource dependencyInfoResource,
                                                                                                                   SourceCacheContext sourceCacheContext,
                                                                                                                   bool includeUnresolved,
                                                                                                                   ILogger logger,
                                                                                                                   CancellationToken cancellationToken)
        {
            try
            {
                cancellationToken.ThrowIfCancellationRequested();

                var results = new HashSet <PackageDependencyInfo>(PackageIdentity.Comparer);
                foreach (var package in packageIdentities)
                {
                    var packageDependencyInfo = await dependencyInfoResource.ResolvePackage(
                        package,
                        nuGetFramework,
                        sourceCacheContext,
                        logger,
                        cancellationToken);

                    if (packageDependencyInfo != null)
                    {
                        results.Add(packageDependencyInfo);
                    }
                    else if (includeUnresolved)
                    {
                        results.Add(new PackageDependencyInfo(package, null));
                    }
                }

                return(results);
            }
            catch (NuGetProtocolException e)
            {
                logger.LogWarning(e.ToString());
                return(null);
            }
        }
        private async Task <PluginPackage> GetLatestTemplatePackage(string packageId, string frameworkVersion, IAbsoluteDirectoryPath pluginRepositoryPath)
        {
            var       nugetFramework           = NuGetFramework.ParseFolder(frameworkVersion);
            ISettings settings                 = Settings.LoadSpecificSettings(root: null, this.appEnvironment.NuGetConfigFilePath.ToString());
            var       sourceRepositoryProvider = new SourceRepositoryProvider(new PackageSourceProvider(settings), Repository.Provider.GetCoreV3());

            var packageMetaDataList = new List <PluginPackage>();

            using (var cacheContext = new SourceCacheContext())
            {
                IEnumerable <SourceRepository> repositories = sourceRepositoryProvider.GetRepositories();
                var availablePackages = new HashSet <SourcePackageDependencyInfo>(PackageIdentityComparer.Default);

                foreach (SourceRepository sourceRepository in repositories)
                {
                    DependencyInfoResource dependencyInfoResource = await sourceRepository.GetResourceAsync <DependencyInfoResource>().ConfigureAwait(false);

                    IEnumerable <SourcePackageDependencyInfo> dependencyInfo = await dependencyInfoResource.ResolvePackages(
                        packageId,
                        nugetFramework,
                        cacheContext,
                        NullLogger.Instance,
                        CancellationToken.None).ConfigureAwait(false);

                    if (dependencyInfo == null)
                    {
                        continue;
                    }

                    availablePackages.AddRange(dependencyInfo);
                }

                var resolverContext = new PackageResolverContext(
                    DependencyBehavior.Highest,
                    new[] { packageId },
                    Enumerable.Empty <string>(),
                    Enumerable.Empty <PackageReference>(),
                    Enumerable.Empty <PackageIdentity>(),
                    availablePackages,
                    sourceRepositoryProvider.GetRepositories().Select(s => s.PackageSource),
                    NullLogger.Instance);

                var resolver = new PackageResolver();

                try
                {
                    SourcePackageDependencyInfo packageToInstall = resolver
                                                                   .Resolve(resolverContext, CancellationToken.None).Select(p =>
                                                                                                                            availablePackages.Single(x => PackageIdentityComparer.Default.Equals(x, p)))
                                                                   .FirstOrDefault();

                    var packagePathResolver = new PackagePathResolver(SettingsUtility.GetGlobalPackagesFolder(settings));

                    var packageExtractionContext = new PackageExtractionContext(
                        PackageSaveMode.Defaultv3,
                        XmlDocFileSaveMode.None,
                        ClientPolicyContext.GetClientPolicy(settings, NullLogger.Instance),
                        NullLogger.Instance);

                    var               frameworkReducer = new FrameworkReducer();
                    string            installedPath    = packagePathResolver.GetInstalledPath(packageToInstall);
                    PackageReaderBase packageReader;

                    if (installedPath == null && packageToInstall != null)
                    {
                        DownloadResource downloadResource = await packageToInstall.Source
                                                            .GetResourceAsync <DownloadResource>(CancellationToken.None).ConfigureAwait(false);

                        DownloadResourceResult downloadResult = await downloadResource.GetDownloadResourceResultAsync(
                            packageToInstall,
                            new PackageDownloadContext(cacheContext),
                            SettingsUtility.GetGlobalPackagesFolder(settings),
                            NullLogger.Instance,
                            CancellationToken.None).ConfigureAwait(false);

                        await PackageExtractor.ExtractPackageAsync(
                            downloadResult.PackageSource,
                            downloadResult.PackageStream,
                            packagePathResolver,
                            packageExtractionContext,
                            CancellationToken.None).ConfigureAwait(false);

                        packageReader = downloadResult.PackageReader;
                    }
                    else
                    {
                        packageReader = new PackageFolderReader(installedPath);
                    }

                    PackageIdentity identity = await packageReader.GetIdentityAsync(CancellationToken.None).ConfigureAwait(false);

                    var packageMetaData = new PluginPackage
                    {
                        Name           = identity.Id,
                        Version        = identity.Version.OriginalVersion,
                        RepositoryPath = pluginRepositoryPath,
                    };

                    foreach (FrameworkSpecificGroup contentItem in await packageReader.GetContentItemsAsync(CancellationToken.None).ConfigureAwait(false))
                    {
                        packageMetaData.Plugins.AddRange(contentItem.Items);
                    }

                    var packageFileExtractor = new PackageFileExtractor(
                        packageMetaData.Plugins,
                        XmlDocFileSaveMode.None);

                    await packageReader.CopyFilesAsync(
                        packageMetaData.PluginPath.ToString(),
                        packageMetaData.Plugins,
                        packageFileExtractor.ExtractPackageFile,
                        NullLogger.Instance,
                        CancellationToken.None).ConfigureAwait(false);

                    foreach (IAbsoluteFilePath file in packageMetaData.PluginPath.GetChildDirectoryWithName("content").ChildrenFilesPath)
                    {
                        File.Copy(file.ToString(), Path.Join(packageMetaData.PluginPath.ToString(), file.FileName), overwrite: true);
                    }

                    packageMetaData.Plugins.Clear();

                    foreach (IAbsoluteFilePath file in packageMetaData.PluginPath.ChildrenFilesPath)
                    {
                        packageMetaData.Plugins.Add(file.GetRelativePathFrom(packageMetaData.PluginPath).ToString());
                    }

                    Directory.Delete(packageMetaData.PluginPath.GetChildDirectoryWithName("content").ToString(), recursive: true);

                    packageMetaDataList.Add(packageMetaData);
                }
                catch (NuGetResolverConstraintException exception)
                {
                    string foo = exception.Message;
                }
            }

            return(packageMetaDataList.FirstOrDefault());
        }