private static List <VersionInfo> GetVersions(
            FindLocalPackagesResource localResource,
            LocalPackageInfo package,
            SearchFilter filter,
            ILogger log,
            CancellationToken token)
        {
            token.ThrowIfCancellationRequested();

            // apply the filters to the version list returned
            var versions = localResource.FindPackagesById(package.Identity.Id, log, token)
                           .Where(v => filter.IncludePrerelease || !v.Identity.Version.IsPrerelease)
                           .Select(p => new VersionInfo(p.Identity.Version, downloadCount: 0))
                           .OrderByDescending(v => v.Version, VersionComparer.Default)
                           .ToList();

            // Add in the current package if it does not already exist
            if (!versions.Any(v => v.Version == package.Identity.Version))
            {
                var packageVersionInfo = new VersionInfo(package.Identity.Version, downloadCount: 0)
                {
                    PackageSearchMetadata = new LocalPackageSearchMetadata(package)
                };

                versions.Add(packageVersionInfo);
            }

            return(versions);
        }
Ejemplo n.º 2
0
        public override Task <DownloadResourceResult> GetDownloadResourceResultAsync(
            PackageIdentity identity,
            ISettings settings,
            ILogger logger,
            CancellationToken token)
        {
            // Find the package from the local folder
            LocalPackageInfo packageInfo = null;

            var sourcePackage = identity as SourcePackageDependencyInfo;

            if (sourcePackage?.DownloadUri != null)
            {
                // Get the package directly if the full path is known
                packageInfo = _localResource.GetPackage(sourcePackage.DownloadUri, logger, token);
            }
            else
            {
                // Search for the local package
                packageInfo = _localResource.GetPackage(identity, logger, token);
            }

            if (packageInfo != null)
            {
                var stream = File.OpenRead(packageInfo.Path);
                return(Task.FromResult(new DownloadResourceResult(stream, packageInfo.GetReader())));
            }
            else
            {
                return(Task.FromResult(new DownloadResourceResult(DownloadResourceResultStatus.NotFound)));
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Retrieve all packages of an id from a v2 folder.
        /// </summary>
        /// <param name="root">Nupkg folder directory path.</param>
        /// <param name="identity">Package id and version.</param>
        public static LocalPackageInfo GetPackageV2(string root, PackageIdentity identity, ILogger log)
        {
            if (root == null)
            {
                throw new ArgumentNullException(nameof(root));
            }

            if (identity == null)
            {
                throw new ArgumentNullException(nameof(identity));
            }

            if (log == null)
            {
                throw new ArgumentNullException(nameof(log));
            }

            // Verify the root path is a valid path.
            var rootDirInfo = GetAndVerifyRootDirectory(root);

            // Search directories starting with the top directory for any package matching the identity
            // If multiple packages are found in the same directory that match (ex: 1.0, 1.0.0.0)
            // then favor the exact non-normalized match. If no exact match is found take the first
            // using the file system sort order. This is to match the legacy nuget 2.8.x behavior.
            foreach (var directoryList in GetNupkgsFromFlatFolderChunked(rootDirInfo, log))
            {
                LocalPackageInfo fallbackMatch = null;

                // Check for any files that are in the form packageId.version.nupkg
                foreach (var file in directoryList.Where(file => IsPossiblePackageMatch(file, identity)))
                {
                    var package = GetPackageFromNupkg(file);

                    if (identity.Equals(package.Identity))
                    {
                        if (StringComparer.OrdinalIgnoreCase.Equals(
                                identity.Version.ToString(),
                                package.Identity.Version.ToString()))
                        {
                            // Take an exact match immediately
                            return(package);
                        }
                        else if (fallbackMatch == null)
                        {
                            // This matches the identity, but there may be an exact match still
                            fallbackMatch = package;
                        }
                    }
                }

                if (fallbackMatch != null)
                {
                    // Use the fallback match if an exact match was not found
                    return(fallbackMatch);
                }
            }

            // Not found
            return(null);
        }
Ejemplo n.º 4
0
        public override Task <DownloadResourceResult> GetDownloadResourceResultAsync(
            PackageIdentity identity,
            PackageDownloadContext downloadContext,
            string globalPackagesFolder,
            ILogger logger,
            CancellationToken token)
        {
            if (identity == null)
            {
                throw new ArgumentNullException(nameof(identity));
            }

            if (logger == null)
            {
                throw new ArgumentNullException(nameof(logger));
            }

            var stopwatch = Stopwatch.StartNew();

            try
            {
                // Find the package from the local folder
                LocalPackageInfo packageInfo = null;

                var sourcePackage = identity as SourcePackageDependencyInfo;

                if (sourcePackage?.DownloadUri != null)
                {
                    // Get the package directly if the full path is known
                    packageInfo = _localResource.GetPackage(sourcePackage.DownloadUri, logger, token);
                }
                else
                {
                    // Search for the local package
                    packageInfo = _localResource.GetPackage(identity, logger, token);
                }

                if (packageInfo != null)
                {
                    var stream = File.OpenRead(packageInfo.Path);
                    return(Task.FromResult(new DownloadResourceResult(stream, packageInfo.GetReader(), _localResource.Root)));
                }
                else
                {
                    return(Task.FromResult(new DownloadResourceResult(DownloadResourceResultStatus.NotFound)));
                }
            }
            finally
            {
                ProtocolDiagnostics.RaiseEvent(new ProtocolDiagnosticResourceEvent(
                                                   _source,
                                                   resourceType: nameof(DownloadResource),
                                                   type: nameof(LocalDownloadResource),
                                                   method: nameof(GetDownloadResourceResultAsync),
                                                   stopwatch.Elapsed));
            }
        }
        public LocalPackageSearchMetadata(LocalPackageInfo package)
        {
            if (package == null)
            {
                throw new ArgumentNullException(nameof(package));
            }

            _package = package;
            _nuspec  = package.Nuspec;
        }
        private IPackageSearchMetadata CreatePackageSearchResult(
            LocalPackageInfo package,
            SearchFilter filter,
            ILogger log,
            CancellationToken cancellationToken)
        {
            var metadata = new LocalPackageSearchMetadata(package);

            return(metadata
                   .WithVersions(() => GetVersions(_localResource, package, filter, log, CancellationToken.None)));
        }
        private IReadOnlyList <LocalPackageInfo> GetPackageInfosCore(string id, ILogger logger)
        {
            var result = new List <LocalPackageInfo>();

            // packages\{packageId}.{version}.nupkg
            var nupkgFiles = LocalFolderUtility.GetNupkgsFromFlatFolder(_source, logger)
                             .Where(path => LocalFolderUtility.IsPossiblePackageMatch(path, id));

            foreach (var nupkgInfo in nupkgFiles)
            {
                using (var stream = nupkgInfo.OpenRead())
                    using (var packageReader = new PackageArchiveReader(stream))
                    {
                        NuspecReader reader;
                        try
                        {
                            reader = new NuspecReader(packageReader.GetNuspec());
                        }
                        catch (XmlException ex)
                        {
                            var message = string.Format(CultureInfo.CurrentCulture, Strings.Protocol_PackageMetadataError, nupkgInfo.Name, _source);

                            throw new FatalProtocolException(message, ex);
                        }
                        catch (PackagingException ex)
                        {
                            var message = string.Format(CultureInfo.CurrentCulture, Strings.Protocol_PackageMetadataError, nupkgInfo.Name, _source);

                            throw new FatalProtocolException(message, ex);
                        }

                        var identity = reader.GetIdentity();

                        if (string.Equals(identity.Id, id, StringComparison.OrdinalIgnoreCase))
                        {
                            var cachePackage = new LocalPackageInfo(
                                identity,
                                nupkgInfo.FullName,
                                nupkgInfo.LastWriteTimeUtc,
                                new Lazy <NuspecReader>(() => reader),
                                new Func <PackageReaderBase>(() => new PackageArchiveReader(nupkgInfo.FullName))
                                );

                            result.Add(cachePackage);
                        }
                    }
            }

            return(result);
        }
Ejemplo n.º 8
0
        /// <summary>
        /// Convert a package into a PackageDependencyInfo
        /// </summary>
        private SourcePackageDependencyInfo CreateDependencyInfo(LocalPackageInfo package, NuGetFramework projectFramework)
        {
            // Take only the dependency group valid for the project TFM
            var group        = NuGetFrameworkUtility.GetNearest <PackageDependencyGroup>(package.Nuspec.GetDependencyGroups(), projectFramework);
            var dependencies = group?.Packages ?? Enumerable.Empty <PackageDependency>();

            var result = new SourcePackageDependencyInfo(
                package.Identity,
                dependencies,
                listed: true,
                source: _source,
                downloadUri: UriUtility.CreateSourceUri(package.Path, UriKind.Absolute),
                packageHash: null);

            return(result);
        }
Ejemplo n.º 9
0
        /// <summary>
        /// Return the package nupkg from a packages.config folder sub directory.
        /// </summary>
        /// <param name="dir">Package directory in the format id.version</param>
        private static LocalPackageInfo GetPackagesConfigFolderPackage(DirectoryInfo dir)
        {
            LocalPackageInfo result = null;

            var nupkgPath = Path.Combine(
                dir.FullName,
                $"{dir.Name}{PackagingCoreConstants.NupkgExtension}");

            var nupkgFile = new FileInfo(nupkgPath);

            if (nupkgFile.Exists)
            {
                result = GetPackageFromNupkg(nupkgFile);
            }

            return(result);
        }
Ejemplo n.º 10
0
        /// <summary>
        /// Return the package nupkg from a packages.config folder sub directory.
        /// </summary>
        /// <param name="dir">Package directory in the format id.version</param>
        private static LocalPackageInfo GetPackagesConfigFolderPackage(DirectoryInfo dir, ILogger log)
        {
            LocalPackageInfo result = null;

            var nupkgPath = Path.Combine(
                dir.FullName,
                $"{dir.Name}{PackagingCoreConstants.NupkgExtension}");

            var nupkgFile = CreateFileInfoIfValidOrNull(nupkgPath, log);

            if (nupkgFile != null && nupkgFile.Exists)
            {
                result = GetPackageFromNupkg(nupkgFile);
            }

            return(result);
        }
        /// <summary>
        /// Search Id, Tags, and Description to match the legacy local search behavior.
        /// </summary>
        private static bool ContainsAnyTerm(string[] terms, LocalPackageInfo package)
        {
            var id          = package.Identity.Id;
            var tags        = package.Nuspec.GetTags();
            var description = package.Nuspec.GetDescription();

            foreach (var term in terms)
            {
                if (ContainsTerm(term, id) ||
                    ContainsTerm(term, tags) ||
                    ContainsTerm(term, description))
                {
                    return(true);
                }
            }

            return(false);
        }
Ejemplo n.º 12
0
        public override Task <DownloadResourceResult> GetDownloadResourceResultAsync(
            PackageIdentity identity,
            PackageDownloadContext downloadContext,
            string globalPackagesFolder,
            ILogger logger,
            CancellationToken token)
        {
            if (identity == null)
            {
                throw new ArgumentNullException(nameof(identity));
            }

            if (logger == null)
            {
                throw new ArgumentNullException(nameof(logger));
            }

            // Find the package from the local folder
            LocalPackageInfo packageInfo = null;

            var sourcePackage = identity as SourcePackageDependencyInfo;

            if (sourcePackage?.DownloadUri != null)
            {
                // Get the package directly if the full path is known
                packageInfo = _localResource.GetPackage(sourcePackage.DownloadUri, logger, token);
            }
            else
            {
                // Search for the local package
                packageInfo = _localResource.GetPackage(identity, logger, token);
            }

            if (packageInfo != null)
            {
                var stream = File.OpenRead(packageInfo.Path);
                return(Task.FromResult(new DownloadResourceResult(stream, packageInfo.GetReader(), _localResource.Root)));
            }
            else
            {
                return(Task.FromResult(new DownloadResourceResult(DownloadResourceResultStatus.NotFound)));
            }
        }
        /// <summary>
        /// Returns a distinct set of elements using the comparer specified. This implementation will pick the last occurrence
        /// of each element instead of picking the first. This method assumes that similar items occur in order.
        /// </summary>
        private static IEnumerable <LocalPackageInfo> CollapseToHighestVersion(IEnumerable <LocalPackageInfo> source)
        {
            bool             first = true;
            bool             maxElementHasValue = false;
            LocalPackageInfo previousElement    = null;
            LocalPackageInfo maxElement         = null;

            foreach (LocalPackageInfo element in source)
            {
                // If we're starting a new group then return the max element from the last group
                if (!first && !StringComparer.OrdinalIgnoreCase.Equals(element.Identity.Id, previousElement.Identity.Id))
                {
                    yield return(maxElement);

                    // Reset the max element
                    maxElementHasValue = false;
                }

                // If the current max element has a value and is bigger or doesn't have a value then update the max
                if (!maxElementHasValue ||
                    (maxElementHasValue &&
                     VersionComparer.VersionRelease.Compare(maxElement.Identity.Version, element.Identity.Version) < 0))
                {
                    maxElement         = element;
                    maxElementHasValue = true;
                }

                previousElement = element;
                first           = false;
            }

            if (!first)
            {
                yield return(maxElement);
            }

            yield break;
        }
        private static IReadOnlyList <LocalPackageInfo> GetPackagesCore(string root)
        {
            var rootDirInfo = LocalFolderUtility.GetAndVerifyRootDirectory(root);

            if (!rootDirInfo.Exists)
            {
                return(new List <LocalPackageInfo>());
            }

            var files       = rootDirInfo.GetFiles("*" + PackagingCoreConstants.NupkgExtension, SearchOption.TopDirectoryOnly);
            var directories = rootDirInfo.GetDirectories("*", SearchOption.TopDirectoryOnly);

            // Find all packages that have both a nupkg and a directory
            var validSet = new HashSet <string>(directories.Select(dir => dir.Name), StringComparer.OrdinalIgnoreCase);

            validSet.IntersectWith(files.Select(file => Path.GetFileNameWithoutExtension(file.Name)));

            var result = new List <LocalPackageInfo>(validSet.Count);

            foreach (var name in validSet)
            {
                var nuspec    = GetNuspec(rootDirInfo, name);
                var nupkgPath = Path.Combine(rootDirInfo.FullName, $"{name}{PackagingCoreConstants.NupkgExtension}");

                var localPackage = new LocalPackageInfo(
                    nuspec.GetIdentity(),
                    nupkgPath,
                    DateTime.UtcNow,
                    new Lazy <NuspecReader>(() => nuspec),
                    useFolder: true
                    );

                result.Add(localPackage);
            }

            return(result);
        }
Ejemplo n.º 15
0
 private static IPackageSearchMetadata GetPackageMetadata(LocalPackageInfo package) => new LocalPackageSearchMetadata(package);