示例#1
0
 public AbstractToolset(string baseDir)
 {
     this.cache      = new SourceCacheContext();
     this.repository = Repository.Factory.GetCoreV3("https://api.nuget.org/v3/index.json");
     this.resource   = repository.GetResource <FindPackageByIdResource>();
     this.baseDir    = baseDir;
 }
示例#2
0
 public RoslynToolset()
 {
     this.cache      = new SourceCacheContext();
     this.repository = Repository.Factory.GetCoreV3("https://api.nuget.org/v3/index.json");
     this.resource   = repository.GetResource <FindPackageByIdResource>();
     this.nugetDir   = Path.Combine(Path.GetDirectoryName(typeof(RoslynToolset).Assembly.Location), "roslyn");
 }
示例#3
0
        internal NuGetPackProvider(string name, string query, DirectoryInfo packageTempBasePath, int pageSize, bool runOnlyOnePage, bool includePreviewPacks)
        {
            Name             = name;
            _pageSize        = pageSize;
            _runOnlyOnePage  = runOnlyOnePage;
            _packageTempPath = Path.GetFullPath(Path.Combine(packageTempBasePath.FullName, DownloadedPacksDir, Name));
            _repository      = Repository.Factory.GetCoreV3(NuGetOrgFeed);
            ServiceIndexResourceV3            indexResource   = _repository.GetResource <ServiceIndexResourceV3>();
            IReadOnlyList <ServiceIndexEntry> searchResources = indexResource.GetServiceEntries("SearchQueryService");

            _downloadResource = _repository.GetResource <FindPackageByIdResource>();
            _includePreview   = includePreviewPacks;

            if (!searchResources.Any())
            {
                throw new Exception($"{NuGetOrgFeed} does not support search API (SearchQueryService)");
            }

            _searchUriFormat = $"{searchResources[0].Uri}?{query}&skip={{0}}&take={{1}}&prerelease={includePreviewPacks}&semVerLevel=2.0.0";

            if (Directory.Exists(_packageTempPath))
            {
                throw new Exception($"temp storage path for NuGet packages already exists: {_packageTempPath}");
            }
            else
            {
                Directory.CreateDirectory(_packageTempPath);
            }
        }
        /// <summary>
        /// Initializes a new <see cref="RemotePackageArchiveDownloader" /> class.
        /// </summary>
        /// <param name="resource">A <see cref="FindPackageByIdResource" /> resource.</param>
        /// <param name="packageIdentity">A package identity.</param>
        /// <param name="cacheContext">A source cache context.</param>
        /// <param name="logger">A logger.</param>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="resource" /> is <c>null</c>.</exception>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="packageIdentity" />
        /// is <c>null</c>.</exception>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="cacheContext" />
        /// is <c>null</c>.</exception>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="logger" /> is <c>null</c>.</exception>
        public RemotePackageArchiveDownloader(
            FindPackageByIdResource resource,
            PackageIdentity packageIdentity,
            SourceCacheContext cacheContext,
            ILogger logger)
        {
            if (resource == null)
            {
                throw new ArgumentNullException(nameof(resource));
            }

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

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

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

            _resource        = resource;
            _packageIdentity = packageIdentity;
            _cacheContext    = cacheContext;
            _logger          = logger;
            _packageReader   = new Lazy <PackageArchiveReader>(GetPackageReader);
        }
        /// <summary>
        /// Get all versions of a nuget package, sort by version in descending order
        /// </summary>
        /// <param name="resource">Resource</param>
        /// <param name="packageId">Package ID</param>
        /// <param name="includePrerelease">Include Prerelease</param>
        /// <param name="limit">Limit</param>
        /// <returns></returns>
        public static async Task <IList <NuGetVersion> > GetAllVersionsAsync(
            this FindPackageByIdResource resource,
            string packageId,
            bool includePrerelease = false,
            int?limit = null)
        {
            var logger            = NullLogger.Instance;
            var cancellationToken = CancellationToken.None;

            var cache = new SourceCacheContext
            {
                NoCache = true
            };

            var versions = await resource.GetAllVersionsAsync(
                packageId,
                cache,
                logger,
                cancellationToken);

            if (!includePrerelease)
            {
                versions = versions.Where(v => !v.IsPrerelease);
            }

            versions = versions.OrderByDescending(v => v.Version);

            if (limit.HasValue)
            {
                versions = versions.Take(limit.Value);
            }

            return(versions
                   .ToList());
        }
示例#6
0
        protected override void ExecuteCore()
        {
            NuGetVersion currentPackageVersion = new NuGetVersion(PackageVersion);
            NuGetVersion version = null;

            foreach (string nugetFeed in NugetFeeds)
            {
                SourceRepository           repository = Repository.Factory.GetCoreV3(nugetFeed);
                FindPackageByIdResource    resource   = repository.GetResource <FindPackageByIdResource>();
                SourceCacheContext         cache      = new SourceCacheContext();
                IEnumerable <NuGetVersion> versions   = resource.GetAllVersionsAsync(PackageId, cache, NullLogger.Instance, CancellationToken.None).Result;

                NuGetVersion packageVersion = versions?.Where(t => !t.IsPrerelease && t != currentPackageVersion).OrderByDescending(t => t.Version).FirstOrDefault();

                if (packageVersion != null)
                {
                    if ((version == null || packageVersion > version) && packageVersion.Version < currentPackageVersion.Version)
                    {
                        version = packageVersion;
                    }
                }
            }

            if (version == null)
            {
                throw new Exception(string.Format(Resources.BaselinePackageNotFound, PackageId, Environment.NewLine + string.Join(Environment.NewLine + " - ", NugetFeeds)));
            }

            LastStableVersion = version?.ToNormalizedString();
        }
示例#7
0
        /// <summary>
        /// Installs Packages on any project that uses the PackageReference method to reference packages.
        /// Uses the dotnet Cli
        /// </summary>
        /// <param name="packageName">The name of the package to install</param>
        /// <param name="messageLogger">An instance of <see cref="IMessageLogger"> to use in logging</param>
        internal async Task InstallPackagesOnDotNetCoreFrameworks(string packageName, IMessageLogger messageLogger, string projectTargetFramework)
        {
            ILogger           logger            = new Logger(this.messageLogger);
            CancellationToken cancellationToken = CancellationToken.None;

            FindPackageByIdResource resource = await this.SourceRepository.GetResourceAsync <FindPackageByIdResource>();

            NuGetFramework nuGetFramework = NuGetFramework.ParseFolder(projectTargetFramework?.Split('=')[1]);
            NuGetVersion   packageVersion = await GetPackageLatestNugetVersionAsync(packageName, this.SourceRepository, nuGetFramework.DotNetFrameworkName);

            using (MemoryStream packageStream = new MemoryStream())
            {
                await resource.CopyNupkgToStreamAsync(
                    packageName,
                    packageVersion,
                    packageStream,
                    new SourceCacheContext(),
                    logger,
                    cancellationToken);
            }

            ProjectItem checkIfItemExists = this.project.GetItems("PackageReference").FirstOrDefault(a => a.EvaluatedInclude.Contains(packageName));

            if (checkIfItemExists == null)
            {
                ProjectItem item = this.project.AddItem("PackageReference", packageName).FirstOrDefault();
                item.Xml.AddMetadata("Version", packageVersion.OriginalVersion, true);
                this.project.Save();
            }
        }
        public static async Task DownloadPackage(string packageId, string version, string packageLocation, string packageName, string feed)
        {
            ILogger           logger            = NullLogger.Instance;
            CancellationToken cancellationToken = CancellationToken.None;

            SourceCacheContext      cache      = new SourceCacheContext();
            SourceRepository        repository = Repository.Factory.GetCoreV3(feed);
            FindPackageByIdResource resource   = await repository.GetResourceAsync <FindPackageByIdResource>();

            NuGetVersion packageVersion = new NuGetVersion(version);

            using (MemoryStream packageStream = new MemoryStream()) {
                bool success = await resource.CopyNupkgToStreamAsync(
                    packageId,
                    packageVersion,
                    packageStream,
                    cache,
                    logger,
                    cancellationToken);

                var path = Path.Combine(packageLocation, packageName + ".nupkg");
                using (var fileStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None))
                {
                    packageStream.WriteTo(fileStream);
                }
            }
        }
示例#9
0
        private async Task <IEnumerable <string> > GetPackageFileListAsync(DefaultConfigUpdater defaultConfigUpdater, PackageUpdateResult packageUpdate, CancellationToken?cancellationToken = null)
        {
            string?link = defaultConfigUpdater.GetPackageLink(packageUpdate.PackageId);

            if (link == null)
            {
                // We don't know where nuget package should be extracted to.
                return(Enumerable.Empty <string>());
            }

            SourceCacheContext cache          = new SourceCacheContext();
            NuGetVersion       packageVersion = new NuGetVersion(packageUpdate.NewVersion);

            // We have to specify some cancellation token, if caller doesn't provide one
            CancellationTokenSource?ownedCancellationToken = cancellationToken == null ? new CancellationTokenSource() : null;

            // Stream that will receive the package bytes
            using MemoryStream packageStream = new MemoryStream();

            try
            {
                SourceRepository rep = Repository.Factory.GetCoreV3(_feed, FeedType.HttpV3);
                if (_credentials != null)
                {
                    rep.PackageSource.Credentials = _credentials;
                }

                FindPackageByIdResource resource = await rep.GetResourceAsync <FindPackageByIdResource>().ConfigureAwait(false);

                Trace.WriteLine($"Downloading package {packageUpdate.PackageId}-{packageUpdate.NewVersion} into memory.");

                bool downloadResult = await resource.CopyNupkgToStreamAsync(
                    packageUpdate.PackageId,
                    packageVersion,
                    packageStream,
                    cache,
                    NullLogger.Instance,
                    cancellationToken ?? ownedCancellationToken !.Token)
                                      .ConfigureAwait(false);

                if (!downloadResult)
                {
                    Trace.WriteLine($"There is an issue downloading nuget package: {packageUpdate.PackageId}");
                    return(Enumerable.Empty <string>());
                }

                Trace.WriteLine($"Downloading complete for package {packageUpdate.PackageId}.");
                return(GetNugetFileList(packageStream, link));
            }
            catch (Exception e)
            {
                Trace.WriteLine($"There is an issue downloading nuget package.");
                Trace.WriteLine(e.ToString());
                return(Enumerable.Empty <string>());
            }
            finally
            {
                ownedCancellationToken?.Dispose();
            }
        }
        /// <summary>
        /// Initializes a new <see cref="RemotePackageArchiveDownloader" /> class.
        /// </summary>
        /// <param name="source">A package source.</param>
        /// <param name="resource">A <see cref="FindPackageByIdResource" /> resource.</param>
        /// <param name="packageIdentity">A package identity.</param>
        /// <param name="cacheContext">A source cache context.</param>
        /// <param name="logger">A logger.</param>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="resource" /> is <c>null</c>.</exception>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="packageIdentity" />
        /// is <c>null</c>.</exception>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="cacheContext" />
        /// is <c>null</c>.</exception>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="logger" /> is <c>null</c>.</exception>
        public RemotePackageArchiveDownloader(
            string source,
            FindPackageByIdResource resource,
            PackageIdentity packageIdentity,
            SourceCacheContext cacheContext,
            ILogger logger)
        {
            if (resource == null)
            {
                throw new ArgumentNullException(nameof(resource));
            }

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

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

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

            _resource             = resource;
            _packageIdentity      = packageIdentity;
            _cacheContext         = cacheContext;
            _logger               = logger;
            _packageReader        = new Lazy <PackageArchiveReader>(GetPackageReader);
            _handleExceptionAsync = exception => Task.FromResult(false);
            Source = source;
        }
示例#11
0
        public static async Task DownloadPackageAsync()
        {
            // This code region is referenced by the NuGet docs. Please update the docs if you rename the region
            // or move it to a different file.
            #region DownloadPackage
            ILogger           logger            = NullLogger.Instance;
            CancellationToken cancellationToken = CancellationToken.None;

            SourceCacheContext      cache      = new SourceCacheContext();
            SourceRepository        repository = Repository.Factory.GetCoreV3("https://api.nuget.org/v3/index.json");
            FindPackageByIdResource resource   = await repository.GetResourceAsync <FindPackageByIdResource>();

            string       packageId      = "Newtonsoft.Json";
            NuGetVersion packageVersion = new NuGetVersion("12.0.1");
            using MemoryStream packageStream = new MemoryStream();

            await resource.CopyNupkgToStreamAsync(
                packageId,
                packageVersion,
                packageStream,
                cache,
                logger,
                cancellationToken);

            Console.WriteLine($"Downloaded package {packageId} {packageVersion}");

            using PackageArchiveReader packageReader = new PackageArchiveReader(packageStream);
            NuspecReader nuspecReader = await packageReader.GetNuspecReaderAsync(cancellationToken);

            Console.WriteLine($"Tags: {nuspecReader.GetTags()}");
            Console.WriteLine($"Description: {nuspecReader.GetDescription()}");
            #endregion
        }
示例#12
0
        public async Task DownloadPackageAsync(string packagename, string version)
        {
            ILogger           logger            = NullLogger.Instance;
            CancellationToken cancellationToken = CancellationToken.None;

            SourceCacheContext      cache      = new SourceCacheContext();
            SourceRepository        repository = Repository.Factory.GetCoreV3("https://api.nuget.org/v3/index.json");
            FindPackageByIdResource resource   = await repository.GetResourceAsync <FindPackageByIdResource>();

            string       packageId      = packagename;
            NuGetVersion packageVersion = new NuGetVersion(version);
            MemoryStream packageStream  = new MemoryStream();

            await resource.CopyNupkgToStreamAsync(
                packageId,
                packageVersion,
                packageStream,
                cache,
                logger,
                cancellationToken);

            Console.WriteLine($"Downloaded package {packageId} {packageVersion}");

            PackageArchiveReader packageReader = new PackageArchiveReader(packageStream);
            NuspecReader         nuspecReader  = await packageReader.GetNuspecReaderAsync(cancellationToken);

            Console.WriteLine($"Tags: {nuspecReader.GetTags()}");
            Console.WriteLine($"Description: {nuspecReader.GetDescription()}");
        }
示例#13
0
    private static async Task Run(Options options)
    {
        // Set up NuGet stuff
        sourceCache      = new();
        sourceRepository = Repository.Factory.GetCoreV3("https://api.nuget.org/v3/index.json");
        searchResource   = await sourceRepository.GetResourceAsync <PackageSearchResource>();

        updateResource = await sourceRepository.GetResourceAsync <PackageUpdateResource>();

        findByIdResource = await sourceRepository.GetResourceAsync <FindPackageByIdResource>();

        // Search for the nightly package IDs that were just built
        var localPackageIds = GetLocalNightlyPackageIds(options);

        // Search for the remotely published packages
        var remotePackageIds = await GetRemotePackageIds(options);

        // If there are differences, that means we removed/renmed something
        // In those cases, unist/deprecate all versions
        var toCompletelyUnlist = remotePackageIds.Except(localPackageIds).ToList();

        foreach (var packageId in toCompletelyUnlist)
        {
            await DeleteAllVersionsOfPackage(options, packageId);
        }

        // Now for each package that exists on remote, we want to unlish the nightly versions
        // These are packages that are both present locally and on remote
        var toUnlistNightly = localPackageIds.Intersect(remotePackageIds).ToList();

        foreach (var packageId in toUnlistNightly)
        {
            await DeleteAllNightlyVersionsOfPackage(options, packageId);
        }
    }
        public async Task <string> DownloadCoreToolsAsync()
        {
            //ID of the package to be looked
            string coreToolsId = "Microsoft.CrmSdk.CoreTools";

            string dir    = Path.GetDirectoryName(typeof(MyPluginControl).Assembly.Location).ToUpperInvariant();
            string folder = Path.GetFileNameWithoutExtension(typeof(MyPluginControl).Assembly.Location);

            dir = Path.Combine(dir, folder);
            Directory.CreateDirectory(dir);

            //Connect to the official package repository IPackageRepository
            ILogger            logger            = NullLogger.Instance;
            CancellationToken  cancellationToken = CancellationToken.None;
            SourceCacheContext cache             = new SourceCacheContext();

            SourceRepository      repository    = Repository.Factory.GetCoreV3(myPlugin.options.NuGetFeed);
            PackageSearchResource packageSearch = await repository.GetResourceAsync <PackageSearchResource>();

            FindPackageByIdResource findPackageById = await repository.GetResourceAsync <FindPackageByIdResource>();

            var metadata = (await packageSearch.SearchAsync(coreToolsId, new SearchFilter(false, SearchFilterType.IsLatestVersion), 0, 1, logger, cancellationToken)).FirstOrDefault();
            var version  = (await metadata.GetVersionsAsync()).Max(v => v.Version);

            System.Diagnostics.Debug.WriteLine($"Version {version}");
            using (MemoryStream packageStream = new MemoryStream())
            {
                if (!await findPackageById.CopyNupkgToStreamAsync(
                        coreToolsId,
                        version,
                        packageStream,
                        cache,
                        logger,
                        cancellationToken))
                {
                    return(string.Format(Resources.Culture, Resources.CORE_TOOLS_NOT_FOUND, coreToolsId, myPlugin.options.NuGetFeed));
                }



                using (PackageArchiveReader packageReader = new PackageArchiveReader(packageStream))
                {
                    foreach (var packageFile in await packageReader.GetFilesAsync(cancellationToken))
                    {
                        System.Diagnostics.Debug.WriteLine($"{packageFile} {Path.GetDirectoryName(packageFile)} {Path.GetFileName(Path.GetDirectoryName(packageFile))}");

                        if (Path.GetFileName(Path.GetDirectoryName(packageFile)) == "coretools")
                        {
                            using (var fileStream = File.OpenWrite(Path.Combine(dir, Path.GetFileName(packageFile))))
                                using (var stream = await packageReader.GetStreamAsync(packageFile, cancellationToken))
                                {
                                    await stream.CopyToAsync(fileStream);
                                }
                        }
                    }
                }
            }
            return(null);
        }
示例#15
0
        public async Task <string> DownloadPackageAsync(PackageId packageId,
                                                        NuGetVersion packageVersion = null,
                                                        PackageSourceLocation packageSourceLocation = null,
                                                        bool includePreview          = false,
                                                        DirectoryPath?downloadFolder = null)
        {
            CancellationToken cancellationToken = CancellationToken.None;

            if (_restoreActionConfig.Interactive)
            {
                DefaultCredentialServiceUtility.SetupDefaultCredentialService(_verboseLogger,
                                                                              _restoreActionConfig.Interactive);
            }

            (var source, var resolvedPackageVersion) = await GetPackageSourceAndVerion(packageId, packageVersion,
                                                                                       packageSourceLocation, includePreview);

            FindPackageByIdResource resource   = null;
            SourceRepository        repository = Repository.Factory.GetCoreV3(source);

            resource = await repository.GetResourceAsync <FindPackageByIdResource>(cancellationToken)
                       .ConfigureAwait(false);

            if (resource == null)
            {
                throw new NuGetPackageNotFoundException(
                          string.Format(LocalizableStrings.FailedToLoadNuGetSource, source.Source));
            }

            string nupkgPath = downloadFolder == null || !downloadFolder.HasValue
                ? Path.Combine(_packageInstallDir.Value, packageId.ToString(),
                               resolvedPackageVersion.ToNormalizedString(),
                               $"{packageId}.{resolvedPackageVersion.ToNormalizedString()}.nupkg")
                : Path.Combine(downloadFolder.Value.Value,
                               $"{packageId}.{resolvedPackageVersion.ToNormalizedString()}.nupkg");

            Directory.CreateDirectory(Path.GetDirectoryName(nupkgPath));
            using FileStream destinationStream = File.Create(nupkgPath);
            bool success = await resource.CopyNupkgToStreamAsync(
                packageId.ToString(),
                resolvedPackageVersion,
                destinationStream,
                _cacheSettings,
                _verboseLogger,
                cancellationToken);

            destinationStream.Close();

            if (!success)
            {
                throw new NuGetPackageInstallerException(
                          string.Format("Downloading {0} version {1} failed", packageId,
                                        packageVersion.ToNormalizedString()));
            }

            VerifySigning(nupkgPath);

            return(nupkgPath);
        }
示例#16
0
        public async Task LoadNuget()
        {
            SourceRepository repository = Repository.Factory.GetCoreV3("https://api.nuget.org/v3/index.json");

            packageSearch = await repository.GetResourceAsync <PackageSearchResource>();

            findPackageById = await repository.GetResourceAsync <FindPackageByIdResource>();
        }
示例#17
0
        public static async Task Main(string[] args)
        {
            if (args.Length < 2)
            {
                Console.WriteLine("Two arguments required: <local nuget directory> <remote nuget feed>");
                Environment.Exit(1);
            }
            // Local directory
            string localRepositoryPath = args[0];
            // Remote nuget feed
            string nugetFeedAddress = args[1];

            // Won't log a thing, sorry
            ILogger           logger            = NullLogger.Instance;
            CancellationToken cancellationToken = CancellationToken.None;

            // Setup our repos
            SourceCacheContext cache           = new SourceCacheContext();
            SourceRepository   localRepository = Repository.Factory.GetCoreV3(localRepositoryPath, FeedType.FileSystemV2);
            SourceRepository   nugetFeed       = Repository.Factory.GetCoreV3(nugetFeedAddress);

            // Get a package searcher by ID on remote
            FindPackageByIdResource remotePackageByIdResource =
                await nugetFeed.GetResourceAsync <FindPackageByIdResource>();

            // Get a local pacakges searcher on local
            FindLocalPackagesResource localPackagesResource =
                await localRepository.GetResourceAsync <FindLocalPackagesResource>();

            // List all local packages
            IEnumerable <LocalPackageInfo> localPacakges = localPackagesResource.GetPackages(logger, cancellationToken);

            //For each of them
            foreach (LocalPackageInfo packageInfo in localPacakges)
            {
                Console.WriteLine($"Found package {packageInfo.Nuspec.GetId()} {packageInfo.Nuspec.GetVersion()}");
                // Check if the package exists at that version on remote
                if (await remotePackageByIdResource.DoesPackageExistAsync(
                        packageInfo.Nuspec.GetId(),
                        packageInfo.Nuspec.GetVersion(),
                        cache,
                        logger,
                        cancellationToken))
                {
                    Console.WriteLine(
                        $"WARNING: Package {packageInfo.Nuspec.GetId()} already deployed at version {packageInfo.Nuspec.GetVersion()}");
                    // Set return code to 128 so CI can fail
                    Environment.ExitCode = 128;
                }
                else
                {
                    Console.WriteLine(
                        $"Package {packageInfo.Nuspec.GetId()} can be deployed at {packageInfo.Nuspec.GetVersion()}");
                }
            }
        }
示例#18
0
    public static async Task <IEnumerable <NuGetVersion> > GetPackageVersions(FindPackageByIdResource resource, string packageId)
    {
        IEnumerable <NuGetVersion> versions = await resource.GetAllVersionsAsync(
            packageId,
            Cache,
            NullLogger.Instance,
            CancellationToken.None);

        return(versions.ToArray());
    }
示例#19
0
        private async Task EnsureResource()
        {
            if (_findPackagesByIdResource == null)
            {
                _findPackagesByIdResource = await _sourceRepository.GetResourceAsync <FindPackageByIdResource>();

                _findPackagesByIdResource.Logger  = _logger;
                _findPackagesByIdResource.NoCache = _noCache;
            }
        }
        private async Task <NuspecModel> GetNuspec(string name, string version, string nuspecFilename,
                                                   FindPackageByIdResource resource)
        {
            var nuspecModel = new NuspecModel();

            if (nuspecFilename == null)
            {
                var packageVersion = new NuGetVersion(version);
                await using MemoryStream packageStream = new MemoryStream();
                await resource.CopyNupkgToStreamAsync(name, packageVersion, packageStream, _sourceCacheContext,
                                                      _logger, _cancellationToken);

                using PackageArchiveReader packageReader = new PackageArchiveReader(packageStream);
                nuspecModel.nuspecReader = await packageReader.GetNuspecReaderAsync(_cancellationToken);


                if (!_disableHashComputation)
                {
                    nuspecModel.hashBytes = ComputeSha215Hash(packageStream);
                }
            }
            else
            {
                await using (var xmlStream = _fileSystem.File.OpenRead(nuspecFilename))
                {
                    nuspecModel.nuspecReader = new NuspecReader(xmlStream);
                }

                // reference: https://docs.microsoft.com/en-us/nuget/reference/cli-reference/cli-ref-add
                // and: https://github.com/NuGet/Home/wiki/Nupkg-Metadata-File
                //  └─<packageID>
                //   └─<version>
                //    ├─<packageID>.<version>.nupkg
                //    ├─<packageID>.<version>.nupkg.sha512
                //    └─<packageID>.nuspec

                string shaFilename   = Path.ChangeExtension(nuspecFilename, version + _sha512Extension);
                string nupkgFilename = Path.ChangeExtension(nuspecFilename, version + _nupkgExtension);

                if (_fileSystem.File.Exists(shaFilename))
                {
                    string base64Hash = _fileSystem.File.ReadAllText(shaFilename);
                    nuspecModel.hashBytes = Convert.FromBase64String(base64Hash);
                }
                else if (!_disableHashComputation && _fileSystem.File.Exists(nupkgFilename))
                {
                    await using (var nupkgStream = _fileSystem.File.OpenRead(nupkgFilename))
                    {
                        nuspecModel.hashBytes = ComputeSha215Hash(nupkgStream);
                    }
                }
            }

            return(nuspecModel);
        }
        /// <summary>
        /// Accesses Nuget's registry via index.json file(entry point) and fetches latest package release versions
        /// </summary>
        /// <param name="packageName"></param>
        /// <returns>Latest version</returns>
        public async Task <IEnumerable <NuGetVersion> > GetPackageVersions(string packageName)
        {
            using (SourceCacheContext cache = new SourceCacheContext())
            {
                FindPackageByIdResource resource = await _nugetRepository.GetResourceAsync <FindPackageByIdResource>();

                IEnumerable <NuGetVersion> versions = await resource.GetAllVersionsAsync(packageName, cache, NullLogger.Instance, CancellationToken.None);

                return(versions);
            }
        }
 private void AddNuspecCache(FindPackageByIdResource resource)
 {
     // Link the nuspec cache to the new resource if it exists.
     if (_nuspecCache != null)
     {
         var localV3 = resource as LocalV3FindPackageByIdResource;
         if (localV3 != null)
         {
             localV3.NuspecCache = _nuspecCache;
         }
     }
 }
示例#23
0
        private IEnumerable <NuGetVersion> GetVersions(string packageId, string sourceUrl = "https://chocolatey.org/api/v2/")
        {
            NuGet.Common.ILogger logger            = NullLogger.Instance;
            CancellationToken    cancellationToken = CancellationToken.None;
            SourceCacheContext   cache             = new SourceCacheContext();
            PackageSource        ps             = new PackageSource(sourceUrl);
            var sourceRepository                = Repository.Factory.GetCoreV2(ps);
            FindPackageByIdResource    resource = sourceRepository.GetResourceAsync <FindPackageByIdResource>().GetAwaiter().GetResult();
            IEnumerable <NuGetVersion> versions = resource.GetAllVersionsAsync(packageId, cache, logger, cancellationToken).GetAwaiter().GetResult();

            return(versions);
        }
示例#24
0
    public static async Task <FindPackageByIdResource> GetPackageByIdResource(SourceRepository repository)
    {
        try
        {
            FindPackageByIdResource resource = await repository.GetResourceAsync <FindPackageByIdResource>();

            return(resource);
        }
        catch
        {
            return(null);
        }
    }
示例#25
0
        public async Task <object> DownloadCoreToolsAsync(string nugetSource)
        {
            //ID of the package to be looked
            string coreToolsId = "Microsoft.CrmSdk.CoreTools";

            string dir = GetToolDirectory();

            //Connect to the official package repository IPackageRepository
            ILogger            logger            = NullLogger.Instance;
            CancellationToken  cancellationToken = CancellationToken.None;
            SourceCacheContext cache             = new SourceCacheContext();

            SourceRepository      repository    = Repository.Factory.GetCoreV3(nugetSource);
            PackageSearchResource packageSearch = await repository.GetResourceAsync <PackageSearchResource>();

            FindPackageByIdResource findPackageById = await repository.GetResourceAsync <FindPackageByIdResource>();

            var metadata = (await packageSearch.SearchAsync(coreToolsId, new SearchFilter(false, SearchFilterType.IsLatestVersion), 0, 1, logger, cancellationToken)).FirstOrDefault();
            var version  = (await metadata.GetVersionsAsync()).Max(v => v.Version);

            using (MemoryStream packageStream = new MemoryStream())
            {
                if (!await findPackageById.CopyNupkgToStreamAsync(
                        coreToolsId,
                        version,
                        packageStream,
                        cache,
                        logger,
                        cancellationToken))
                {
                    return(string.Format(Resources.Culture, Resources.CORE_TOOLS_NOT_FOUND, coreToolsId, nugetSource));
                }

                using (PackageArchiveReader packageReader = new PackageArchiveReader(packageStream))
                {
                    foreach (var packageFile in await packageReader.GetFilesAsync(cancellationToken))
                    {
                        if (Path.GetFileName(Path.GetDirectoryName(packageFile)) == "coretools")
                        {
                            using (var fileStream = File.OpenWrite(Path.Combine(dir, Path.GetFileName(packageFile))))
                                using (var stream = await packageReader.GetStreamAsync(packageFile, cancellationToken))
                                {
                                    await stream.CopyToAsync(fileStream);
                                }
                        }
                    }
                }
            }
            return(GetSolutionPackagerVersion(dir));
        }
示例#26
0
        static async Task <HashSet <NuGetVersion> > GetVersionsAsync(FindPackageByIdResource findPackageById, string id, object consoleLock)
        {
            lock (consoleLock)
            {
                Console.WriteLine($"  Checking pushed versions of {id}...");
            }

            using var cacheContext = Helper.GetCacheContext();
            return((await findPackageById.GetAllVersionsAsync(
                        id,
                        cacheContext,
                        NullLogger.Instance, // new ConsoleLogger(),
                        CancellationToken.None)).ToHashSet());
        }
示例#27
0
        private void AddLocalV3ResourceOptions(FindPackageByIdResource resource)
        {
            var localV3 = resource as LocalV3FindPackageByIdResource;

            if (localV3 != null)
            {
                // Link the nuspec cache to the new resource if it exists.
                if (_packageFileCache != null)
                {
                    localV3.PackageFileCache = _packageFileCache;
                }

                localV3.IsFallbackFolder = _isFallbackFolderSource;
            }
        }
        private async Task EnsureResource()
        {
            if (_findPackagesByIdResource == null)
            {
                var resource = await _sourceRepository.GetResourceAsync <FindPackageByIdResource>();

                lock (_lock)
                {
                    if (_findPackagesByIdResource == null)
                    {
                        _findPackagesByIdResource = resource;
                    }
                }
            }
        }
        GetPackageVersionsAsync
        (
            string nuget_id
        )
        {
            FindPackageByIdResource resource = await repository.GetResourceAsync <FindPackageByIdResource>();

            IEnumerable <NuGetVersion> versions = await resource.GetAllVersionsAsync
                                                  (
                nuget_id,
                source_cache,
                logger,
                cancellationToken
                                                  );

            return(versions);
        }
示例#30
0
        private async Task <FindPackageByIdResource> GetFindPackageByIdResource()
        {
            if (_findPackageById == null)
            {
                _logger  = new NullLogger();
                _context = new SourceCacheContext()
                {
                    NoCache = true
                };

                var sourceUrl        = "https://api.nuget.org/v3/index.json";
                var sourceRepository = Repository.Factory.GetCoreV3(sourceUrl);
                _findPackageById = await sourceRepository.GetResourceAsync <FindPackageByIdResource>();
            }

            return(_findPackageById);
        }