示例#1
0
        public VersionFolderPathContext(
            PackageIdentity package,
            string packagesDirectory,
            bool isLowercasePackagesDirectory,
            ILogger logger,
            PackageSaveMode packageSaveMode,
            XmlDocFileSaveMode xmlDocFileSaveMode)
        {
            if (package == null)
            {
                throw new ArgumentNullException(nameof(package));
            }

            if (string.IsNullOrEmpty(packagesDirectory))
            {
                throw new ArgumentException(string.Format(
                                                CultureInfo.CurrentCulture,
                                                Strings.StringCannotBeNullOrEmpty,
                                                nameof(packagesDirectory)));
            }

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

            Package                      = package;
            PackagesDirectory            = packagesDirectory;
            IsLowercasePackagesDirectory = isLowercasePackagesDirectory;
            Logger             = logger;
            PackageSaveMode    = packageSaveMode;
            XmlDocFileSaveMode = xmlDocFileSaveMode;
        }
        public override void AddPackage(IPackage package)
        {
            if (PackageSaveMode.HasFlag(PackageSaveModes.Nuspec))
            {
                // Starting from 2.1, we save the nuspec file into the subdirectory with the name as <packageId>.<version>
                // for example, for jQuery version 1.0, it will be "jQuery.1.0\\jQuery.1.0.nuspec"
                string   packageFilePath = GetManifestFilePath(package.Id, package.Version);
                Manifest manifest        = Manifest.Create(package);

                // The IPackage object doesn't carry the References information.
                // Thus we set the References for the manifest to the set of all valid assembly references
                manifest.Metadata.ReferenceSets = package.AssemblyReferences
                                                  .GroupBy(f => f.TargetFramework)
                                                  .Select(
                    g => new ManifestReferenceSet
                {
                    TargetFramework = g.Key == null ? null : VersionUtility.GetFrameworkString(g.Key),
                    References      = g.Select(p => new ManifestReference {
                        File = p.Name
                    }).ToList()
                })
                                                  .ToList();

                FileSystem.AddFileWithCheck(packageFilePath, manifest.Save);
            }

            if (PackageSaveMode.HasFlag(PackageSaveModes.Nupkg))
            {
                string packageFilePath = GetPackageFilePath(package);

                FileSystem.AddFileWithCheck(packageFilePath, package.GetStream);
            }
        }
示例#3
0
        /// <summary>
        /// Determines if a package is installed based on the provided package save mode.
        /// </summary>
        /// <param name="packageIdentity">A package identity.</param>
        /// <param name="packageSaveMode">A package save mode.</param>
        /// <returns>A flag indicating whether or not the package is installed.</returns>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="packageIdentity" />
        /// is <c>null</c>.</exception>
        public bool PackageExists(PackageIdentity packageIdentity, PackageSaveMode packageSaveMode)
        {
            if (packageIdentity == null)
            {
                throw new ArgumentNullException(nameof(packageIdentity));
            }

            var packageExists  = !string.IsNullOrEmpty(GetInstalledPackageFilePath(packageIdentity));
            var manifestExists = !string.IsNullOrEmpty(GetInstalledManifestFilePath(packageIdentity));

            if (!packageExists)
            {
                packageExists |= !string.IsNullOrEmpty(GetPackageDownloadMarkerFilePath(packageIdentity));
            }

            // A package must have either a nupkg or a nuspec to be valid
            var result = packageExists || manifestExists;

            // Verify nupkg present if specified
            if ((packageSaveMode & PackageSaveMode.Nupkg) == PackageSaveMode.Nupkg)
            {
                result &= packageExists;
            }

            // Verify nuspec present if specified
            if ((packageSaveMode & PackageSaveMode.Nuspec) == PackageSaveMode.Nuspec)
            {
                result &= manifestExists;
            }

            return(result);
        }
        /// <summary>
        /// Create a v3 folder of nupkgs
        /// </summary>
        public static async Task CreateFolderFeedV3(string root, PackageSaveMode saveMode, params string[] nupkgPaths)
        {
            var pathResolver = new VersionFolderPathResolver(root);

            foreach (var file in nupkgPaths)
            {
                PackageIdentity identity = null;

                using (var reader = new PackageArchiveReader(File.OpenRead(file)))
                {
                    identity = reader.GetIdentity();
                }

                if (!File.Exists(pathResolver.GetHashPath(identity.Id, identity.Version)))
                {
                    using (var fileStream = File.OpenRead(file))
                    {
                        await PackageExtractor.InstallFromSourceAsync(
                            identity,
                            (stream) => fileStream.CopyToAsync(stream, 4096, CancellationToken.None),
                            new VersionFolderPathResolver(root),
                            new PackageExtractionContext(
                                saveMode,
                                XmlDocFileSaveMode.None,
                                NullLogger.Instance,
                                signedPackageVerifier : null),
                            CancellationToken.None);
                    }
                }
            }
        }
        public VersionFolderPathContext(
            PackageIdentity package,
            string packagesDirectory,
            ILogger logger,
            bool fixNuspecIdCasing,
            PackageSaveMode packageSaveMode,
            bool normalizeFileNames,
            XmlDocFileSaveMode xmlDocFileSaveMode)
        {
            if (package == null)
            {
                throw new ArgumentNullException(nameof(package));
            }

            if (string.IsNullOrEmpty(packagesDirectory))
            {
                throw new ArgumentException(string.Format(
                                                CultureInfo.CurrentCulture,
                                                Strings.StringCannotBeNullOrEmpty,
                                                nameof(packagesDirectory)));
            }

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

            Package            = package;
            PackagesDirectory  = packagesDirectory;
            Logger             = logger;
            FixNuspecIdCasing  = fixNuspecIdCasing;
            PackageSaveMode    = packageSaveMode;
            NormalizeFileNames = normalizeFileNames;
            XmlDocFileSaveMode = xmlDocFileSaveMode;
        }
示例#6
0
        void PackageHelper_IsPackageFile_False(string file, PackageSaveMode packageSaveMode)
        {
            // Arrange & Act
            var isPackageFile = PackageHelper.IsPackageFile(file, packageSaveMode);

            // Assert
            Assert.False(isPackageFile);
        }
示例#7
0
        public void IsPackageFile_ReturnsFalseForNonPackageFile(string file, PackageSaveMode packageSaveMode)
        {
            // Arrange & Act
            var isPackageFile = PackageHelper.IsPackageFile(file, packageSaveMode);

            // Assert
            Assert.False(isPackageFile);
        }
        /// <summary>
        /// Create a v3 folder of nupkgs
        /// </summary>
        public static async Task CreateFolderFeedV3(string root, PackageSaveMode saveMode, params SimpleTestPackageContext[] contexts)
        {
            using (var tempRoot = TestDirectory.Create())
            {
                CreatePackages(tempRoot, contexts);

                await CreateFolderFeedV3(root, saveMode, Directory.GetFiles(tempRoot));
            }
        }
 public static async Task <IEnumerable <string> > GetPackageFilesAsync(
     this IAsyncPackageCoreReader packageReader,
     PackageSaveMode packageSaveMode,
     CancellationToken cancellationToken)
 {
     return((await packageReader
             .GetFilesAsync(cancellationToken))
            .Where(file => PackageHelper.IsPackageFile(file, packageSaveMode)));
 }
        public async Task PackageExists_PackageIdentityPackageSaveMode_ReturnsTrueIfDefaultv3Installed(
            PackageSaveMode packageSaveMode)
        {
            using (var test = new FolderNuGetProjectTest())
            {
                await test.InstallAsync(packageSaveMode);

                Assert.True(test.Project.PackageExists(test.PackageIdentity, PackageSaveMode.Defaultv3));
            }
        }
 public PackageExtractionContext(
     PackageSaveMode packageSaveMode,
     XmlDocFileSaveMode xmlDocFileSaveMode,
     ILogger logger,
     IPackageSignatureVerifier signedPackageVerifier)
 {
     Logger                = logger ?? throw new ArgumentNullException(nameof(logger));
     PackageSaveMode       = packageSaveMode;
     XmlDocFileSaveMode    = xmlDocFileSaveMode;
     SignedPackageVerifier = signedPackageVerifier;
 }
示例#12
0
 public PackageExtractionContext(
     PackageSaveMode packageSaveMode,
     XmlDocFileSaveMode xmlDocFileSaveMode,
     ClientPolicyContext clientPolicyContext,
     ILogger logger)
 {
     Logger              = logger ?? throw new ArgumentNullException(nameof(logger));
     PackageSaveMode     = packageSaveMode;
     XmlDocFileSaveMode  = xmlDocFileSaveMode;
     ClientPolicyContext = clientPolicyContext;
 }
示例#13
0
        /// <summary>
        /// Determines if a package is installed based on the provided package save mode.
        /// </summary>
        /// <param name="packageIdentity">A package identity.</param>
        /// <param name="packageSaveMode">A package save mode.</param>
        /// <returns>A flag indicating whether or not the package is installed.</returns>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="packageIdentity" />
        /// is <c>null</c>.</exception>
        public bool PackageExists(PackageIdentity packageIdentity, PackageSaveMode packageSaveMode)
        {
            if (packageIdentity == null)
            {
                throw new ArgumentNullException(nameof(packageIdentity));
            }

            var nupkgPath  = GetInstalledPackageFilePath(packageIdentity);
            var nuspecPath = GetInstalledManifestFilePath(packageIdentity);

            var packageExists  = !string.IsNullOrEmpty(nupkgPath);
            var manifestExists = !string.IsNullOrEmpty(nuspecPath);

            // When using -ExcludeVersion check that the actual package version matches.
            if (!PackagePathResolver.UseSideBySidePaths)
            {
                if (packageExists)
                {
                    using (var reader = new PackageArchiveReader(nupkgPath))
                    {
                        packageExists = packageIdentity.Equals(reader.NuspecReader.GetIdentity());
                    }
                }

                if (manifestExists)
                {
                    var reader = new NuspecReader(nuspecPath);
                    packageExists = packageIdentity.Equals(reader.GetIdentity());
                }
            }

            if (!packageExists)
            {
                packageExists |= !string.IsNullOrEmpty(GetPackageDownloadMarkerFilePath(packageIdentity));
            }

            // A package must have either a nupkg or a nuspec to be valid
            var result = packageExists || manifestExists;

            // Verify nupkg present if specified
            if ((packageSaveMode & PackageSaveMode.Nupkg) == PackageSaveMode.Nupkg)
            {
                result &= packageExists;
            }

            // Verify nuspec present if specified
            if ((packageSaveMode & PackageSaveMode.Nuspec) == PackageSaveMode.Nuspec)
            {
                result &= manifestExists;
            }

            return(result);
        }
 public PackageExtractionTelemetryEvent(
     PackageSaveMode packageSaveMode,
     NuGetOperationStatus status,
     ExtractionSource extractionSource,
     PackageIdentity packageId) :
     base(EventName, new Dictionary <string, object>
 {
     { nameof(Status), status },
     { nameof(ExtractionSource), extractionSource },
     { nameof(PackageSaveMode), packageSaveMode }
 })
 {
     AddPiiData(nameof(PackageId), packageId.ToString());
 }
示例#15
0
 public VersionFolderPathContext(
     PackageIdentity package,
     string packagesDirectory,
     ILogger logger,
     PackageSaveMode packageSaveMode,
     XmlDocFileSaveMode xmlDocFileSaveMode) : this(
         package,
         packagesDirectory,
         isLowercasePackagesDirectory : true,
         logger : logger,
         packageSaveMode : packageSaveMode,
         xmlDocFileSaveMode : xmlDocFileSaveMode)
 {
 }
            internal async Task InstallAsync(PackageSaveMode packageSaveMode)
            {
                using (var result = GetDownloadResourceResult(Package))
                {
                    var projectContext = new TestNuGetProjectContext();

                    projectContext.PackageExtractionContext.PackageSaveMode = packageSaveMode;

                    await Project.InstallPackageAsync(
                        PackageIdentity,
                        result,
                        projectContext,
                        CancellationToken.None);
                }
            }
        private static async Task <IEnumerable <string> > CopySatelliteFilesAsync(
            PackageReaderBase packageReader,
            PackagePathResolver packagePathResolver,
            PackageSaveMode packageSaveMode,
            PackageExtractionContext packageExtractionContext,
            CancellationToken token)
        {
            if (packageReader == null)
            {
                throw new ArgumentNullException(nameof(packageReader));
            }

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

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

            await VerifyPackageSignatureAsync(packageReader.GetIdentity(), packageExtractionContext, packageReader, token);

            var satelliteFilesCopied = Enumerable.Empty <string>();

            var result = await PackageHelper.GetSatelliteFilesAsync(packageReader, packagePathResolver, token);

            var runtimePackageDirectory = result.Item1;
            var satelliteFiles          = result.Item2
                                          .Where(file => PackageHelper.IsPackageFile(file, packageSaveMode))
                                          .ToList();

            if (satelliteFiles.Count > 0)
            {
                var packageFileExtractor = new PackageFileExtractor(satelliteFiles, packageExtractionContext.XmlDocFileSaveMode);

                // Now, add all the satellite files collected from the package to the runtime package folder(s)
                satelliteFilesCopied = await packageReader.CopyFilesAsync(
                    runtimePackageDirectory,
                    satelliteFiles,
                    packageFileExtractor.ExtractPackageFile,
                    packageExtractionContext.Logger,
                    token);
            }

            return(satelliteFilesCopied);
        }
示例#18
0
        public async Task GetPackageFilesAsync_ReturnsFiles(PackageSaveMode packageSaveMode)
        {
            var packageFiles = (await PackageReaderExtensions.GetPackageFilesAsync(
                                    _coreReader.Object,
                                    packageSaveMode,
                                    CancellationToken.None)).ToArray();

            Assert.Equal(new[]
            {
                "b",
                "/c/a.nuspec",
                @"\c/a.nuspec",
                "/c/d",
                @"\c\d"
            }, packageFiles);
        }
示例#19
0
 public PackageExtractionTelemetryEvent(
     PackageSaveMode packageSaveMode,
     NuGetOperationStatus status,
     ExtractionSource extractionSource,
     PackageIdentity packageId = null) :
     base(EventName, new Dictionary <string, object>
 {
     { nameof(Status), status },
     { nameof(ExtractionSource), extractionSource },
     { nameof(PackageSaveMode), packageSaveMode }
 })
 {
     if (packageId != null)
     {
         LogPackageIdentity(packageId);
     }
 }
示例#20
0
        private static IEnumerable <string> CopySatelliteFiles(
            PackageReaderBase packageReader,
            PackagePathResolver packagePathResolver,
            PackageSaveMode packageSaveMode,
            PackageExtractionContext packageExtractionContext,
            CancellationToken token)
        {
            if (packageReader == null)
            {
                throw new ArgumentNullException(nameof(packageReader));
            }

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

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

            var satelliteFilesCopied = Enumerable.Empty <string>();

            string runtimePackageDirectory;
            var    satelliteFiles = PackageHelper
                                    .GetSatelliteFiles(packageReader, packagePathResolver, out runtimePackageDirectory)
                                    .Where(file => PackageHelper.IsPackageFile(file, packageSaveMode))
                                    .ToList();

            if (satelliteFiles.Count > 0)
            {
                var packageFileExtractor = new PackageFileExtractor(satelliteFiles, packageExtractionContext.XmlDocFileSaveMode);

                // Now, add all the satellite files collected from the package to the runtime package folder(s)
                satelliteFilesCopied = packageReader.CopyFiles(
                    runtimePackageDirectory,
                    satelliteFiles,
                    packageFileExtractor.ExtractPackageFile,
                    packageExtractionContext.Logger,
                    token);
            }

            return(satelliteFilesCopied);
        }
        /// <summary>
        /// This returns all the installed package files (does not include satellite files)
        /// </summary>
        public static IEnumerable <ZipFilePair> GetInstalledPackageFiles(
            PackageArchiveReader packageReader,
            PackageIdentity packageIdentity,
            PackagePathResolver packagePathResolver,
            PackageSaveMode packageSaveMode)
        {
            var installedPackageFiles = Enumerable.Empty <ZipFilePair>();

            var packageDirectory = packagePathResolver.GetInstalledPath(packageIdentity);

            if (!string.IsNullOrEmpty(packageDirectory))
            {
                var packageFiles = packageReader.GetPackageFiles(packageSaveMode);
                var entries      = packageReader.EnumeratePackageEntries(packageFiles, packageDirectory);
                installedPackageFiles = entries.Where(e => e.IsInstalled());
            }

            return(installedPackageFiles.ToList());
        }
        public static Tuple <string, IEnumerable <ZipFilePair> > GetInstalledSatelliteFiles(
            PackageArchiveReader packageReader,
            PackagePathResolver packagePathResolver,
            PackageSaveMode packageSaveMode)
        {
            var    installedSatelliteFiles = Enumerable.Empty <ZipFilePair>();
            string runtimePackageDirectory;
            var    satelliteFiles = GetSatelliteFiles(packageReader, packagePathResolver, out runtimePackageDirectory);

            if (satelliteFiles.Any())
            {
                var satelliteFileEntries = packageReader.EnumeratePackageEntries(
                    satelliteFiles.Where(f => IsPackageFile(f, packageSaveMode)),
                    runtimePackageDirectory);
                installedSatelliteFiles = satelliteFileEntries.Where(e => e.IsInstalled());
            }

            return(new Tuple <string, IEnumerable <ZipFilePair> >(runtimePackageDirectory, installedSatelliteFiles.ToList()));
        }
        /// <summary>
        /// This returns all the installed package files (does not include satellite files)
        /// </summary>
        public static async Task <IEnumerable <ZipFilePair> > GetInstalledPackageFilesAsync(
            PackageArchiveReader packageReader,
            PackageIdentity packageIdentity,
            PackagePathResolver packagePathResolver,
            PackageSaveMode packageSaveMode,
            CancellationToken cancellationToken)
        {
            var installedPackageFiles = Enumerable.Empty <ZipFilePair>();

            var packageDirectory = packagePathResolver.GetInstalledPath(packageIdentity);

            if (!string.IsNullOrEmpty(packageDirectory))
            {
                var packageFiles = await packageReader.GetPackageFilesAsync(packageSaveMode, cancellationToken);

                var entries = packageReader.EnumeratePackageEntries(packageFiles, packageDirectory);
                installedPackageFiles = entries.Where(e => e.IsInstalled());
            }

            return(installedPackageFiles.ToList());
        }
        public override void AddPackage(IPackage package)
        {
            string packageFilePath = GetPackageFilePath(package);

            if (PackageSaveMode.HasFlag(PackageSaveModes.Nuspec))
            {
                string   manifestFilePath = GetManifestFilePath(package.Id, package.Version);
                Manifest manifest         = Manifest.Create(package);
                manifest.Metadata.ReferenceSets = Enumerable.ToList <ManifestReferenceSet>(Enumerable.Select <IGrouping <FrameworkName, IPackageAssemblyReference>, ManifestReferenceSet>(Enumerable.GroupBy <IPackageAssemblyReference, FrameworkName>(package.AssemblyReferences, (Func <IPackageAssemblyReference, FrameworkName>)(f => f.TargetFramework)), (Func <IGrouping <FrameworkName, IPackageAssemblyReference>, ManifestReferenceSet>)(g => new ManifestReferenceSet()
                {
                    TargetFramework = g.Key == (FrameworkName)null ? (string)null : VersionUtility.GetFrameworkString(g.Key),
                    References      = Enumerable.ToList <ManifestReference>(Enumerable.Select <IPackageAssemblyReference, ManifestReference>((IEnumerable <IPackageAssemblyReference>)g, (Func <IPackageAssemblyReference, ManifestReference>)(p => new ManifestReference()
                    {
                        File = p.Name
                    })))
                })));
                FileSystem.AddFileWithCheck(manifestFilePath, manifest.Save);
            }

            FileSystem.AddFileWithCheck(packageFilePath, package.GetStream);
        }
        public static bool IsPackageFile(string packageFileName, PackageSaveMode packageSaveMode)
        {
            if (String.IsNullOrEmpty(packageFileName) ||
                String.IsNullOrEmpty(Path.GetFileName(packageFileName)))
            {
                // This is to ignore archive entries that are not really files
                return(false);
            }

            if (IsManifest(packageFileName))
            {
                return((packageSaveMode & PackageSaveMode.Nuspec) == PackageSaveMode.Nuspec);
            }

            if ((packageSaveMode & PackageSaveMode.Files) == PackageSaveMode.Files)
            {
                return(!ExcludePaths.Any(p => packageFileName.StartsWith(p, StringComparison.OrdinalIgnoreCase)) &&
                       !packageFileName.EndsWith(ExcludeExtension, StringComparison.OrdinalIgnoreCase));
            }

            return(false);
        }
示例#26
0
        public bool PackageExists(PackageIdentity packageIdentity, PackageSaveMode packageSaveMode)
        {
            var packageExists  = !string.IsNullOrEmpty(GetInstalledPackageFilePath(packageIdentity));
            var manifestExists = !string.IsNullOrEmpty(GetInstalledManifestFilePath(packageIdentity));

            // A package must have either a nupkg or a nuspec to be valid
            var result = packageExists || manifestExists;

            // Verify nupkg present if specified
            if ((packageSaveMode & PackageSaveMode.Nupkg) == PackageSaveMode.Nupkg)
            {
                result &= packageExists;
            }

            // Verify nuspec present if specified
            if ((packageSaveMode & PackageSaveMode.Nuspec) == PackageSaveMode.Nuspec)
            {
                result &= manifestExists;
            }

            return(result);
        }
        public static async Task <Tuple <string, IEnumerable <ZipFilePair> > > GetInstalledSatelliteFilesAsync(
            PackageArchiveReader packageReader,
            PackagePathResolver packagePathResolver,
            PackageSaveMode packageSaveMode,
            CancellationToken cancellationToken)
        {
            var installedSatelliteFiles = Enumerable.Empty <ZipFilePair>();

            var result = await GetSatelliteFilesAsync(packageReader, packagePathResolver, cancellationToken);

            var runtimePackageDirectory = result.Item1;
            var satelliteFiles          = result.Item2;

            if (satelliteFiles.Any())
            {
                var satelliteFileEntries = packageReader.EnumeratePackageEntries(
                    satelliteFiles.Where(f => IsPackageFile(f, packageSaveMode)),
                    runtimePackageDirectory);
                installedSatelliteFiles = satelliteFileEntries.Where(e => e.IsInstalled());
            }

            return(new Tuple <string, IEnumerable <ZipFilePair> >(runtimePackageDirectory, installedSatelliteFiles.ToList()));
        }
示例#28
0
        public static async Task <IEnumerable <string> > CopySatelliteFilesAsync(
            PackageIdentity packageIdentity,
            PackagePathResolver packagePathResolver,
            PackageSaveMode packageSaveMode,
            PackageExtractionContext packageExtractionContext,
            CancellationToken token)
        {
            if (packageIdentity == null)
            {
                throw new ArgumentNullException(nameof(packageIdentity));
            }

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

            var satelliteFilesCopied = Enumerable.Empty <string>();

            var nupkgFilePath = packagePathResolver.GetInstalledPackageFilePath(packageIdentity);

            if (File.Exists(nupkgFilePath))
            {
                using (var packageReader = new PackageArchiveReader(nupkgFilePath))
                {
                    return(await CopySatelliteFilesAsync(
                               packageReader,
                               packagePathResolver,
                               packageSaveMode,
                               packageExtractionContext,
                               token));
                }
            }

            return(satelliteFilesCopied);
        }
示例#29
0
        public override void AddPackage(IPackage package)
        {
            string packageFilePath = GetPackageFilePath(package);

            FileSystem.AddFileWithCheck(packageFilePath, package.GetStream);
            // allow the file to finish being written
            Thread.Sleep(200);
            if (PackageSaveMode.HasFlag(PackageSaveModes.Nuspec))
            {
                // don't trust the package metadata to be complete - extract from the downloaded nupkg
                var      zipPackage       = new OptimizedZipPackage(FileSystem, packageFilePath);
                string   manifestFilePath = GetManifestFilePath(package.Id, package.Version);
                Manifest manifest         = Manifest.Create(zipPackage);
                manifest.Metadata.ReferenceSets = Enumerable.ToList <ManifestReferenceSet>(Enumerable.Select <IGrouping <FrameworkName, IPackageAssemblyReference>, ManifestReferenceSet>(Enumerable.GroupBy <IPackageAssemblyReference, FrameworkName>(package.AssemblyReferences, (Func <IPackageAssemblyReference, FrameworkName>)(f => f.TargetFramework)), (Func <IGrouping <FrameworkName, IPackageAssemblyReference>, ManifestReferenceSet>)(g => new ManifestReferenceSet()
                {
                    TargetFramework = g.Key == (FrameworkName)null ? (string)null : VersionUtility.GetFrameworkString(g.Key),
                    References      = Enumerable.ToList <ManifestReference>(Enumerable.Select <IPackageAssemblyReference, ManifestReference>((IEnumerable <IPackageAssemblyReference>)g, (Func <IPackageAssemblyReference, ManifestReference>)(p => new ManifestReference()
                    {
                        File = p.Name
                    })))
                })));
                FileSystem.AddFileWithCheck(manifestFilePath, manifest.Save);
            }
        }
        /// <summary>
        /// Create a v3 folder of nupkgs
        /// </summary>
        public static async Task CreateFolderFeedV3(string root, PackageSaveMode saveMode, params PackageIdentity[] packages)
        {
            var contexts = packages.Select(p => new SimpleTestPackageContext(p)).ToArray();

            await CreateFolderFeedV3(root, saveMode, contexts);
        }