Пример #1
0
 /// <summary>
 /// Create the file directly without loading the previous file.
 /// </summary>
 public async Task CreateAsync(PackageSets index)
 {
     using (var timer = PerfEntryWrapper.CreateModifyTimer(File, Context))
     {
         // Create updated index
         var json    = CreateJson(index);
         var isEmpty = (index.Packages.Index.Count < 1) && (index.Symbols.Index.Count < 1);
         await SaveAsync(json, isEmpty);
     }
 }
Пример #2
0
        private async Task CreateIndexAsync(string id, SortedSet <NuGetVersion> versions)
        {
            // Update index
            var indexFile = _context.Source.Get(GetIndexUri(id));

            using (var timer = PerfEntryWrapper.CreateModifyTimer(indexFile, _context.PerfTracker))
            {
                var indexJson = CreateIndexJson(versions);
                await indexFile.Write(indexJson, _context.Log, _context.Token);
            }
        }
Пример #3
0
        /// <summary>
        /// Remove packages from index and remove details pages if they exist.
        /// </summary>
        private async Task RemovePackagesFromIndexAsync(string packageId, HashSet <NuGetVersion> versions)
        {
            // Retrieve index
            var rootUri  = GetIndexUri(packageId);
            var rootFile = _context.Source.Get(rootUri);

            using (var timer = PerfEntryWrapper.CreateModifyTimer(rootFile, _context))
            {
                var modified = false;

                var packages = new List <JObject>();
                var json     = await rootFile.GetJsonOrNull(_context.Log, _context.Token);

                if (json != null)
                {
                    // Get all entries
                    packages = await GetPackageDetails(json);

                    foreach (var entry in packages.ToArray())
                    {
                        var version = GetPackageVersion(entry);

                        if (versions.Contains(version))
                        {
                            modified = true;
                            packages.Remove(entry);

                            // delete details page
                            DeletePackagePage(new PackageIdentity(packageId, version));
                        }
                    }
                }

                if (modified)
                {
                    if (packages.Count > 0)
                    {
                        // Create index
                        var newIndexJson = await CreateIndexAsync(rootUri, packages);

                        // Write
                        await rootFile.Write(newIndexJson, _context.Log, _context.Token);
                    }
                    else
                    {
                        // This package id been completely removed
                        rootFile.Delete(_context.Log, _context.Token);
                    }
                }
            }
        }
Пример #4
0
        /// <summary>
        /// Create a package details page for a package id/version.
        /// </summary>
        private async Task CreatePackagePageAsync(PackageInput package)
        {
            // Create package page
            var packageUri  = GetPackageUri(package.Identity);
            var packageFile = _context.Source.Get(packageUri);

            using (var timer = PerfEntryWrapper.CreateModifyTimer(packageFile, _context))
            {
                var packageJson = await CreatePackageBlobAsync(package);

                // Write package page
                await packageFile.Write(packageJson, _context.Log, _context.Token);
            }
        }
Пример #5
0
        private async Task CreatePackageIndexAsync(string packageId, List <PackageInput> packageInputs)
        {
            // Retrieve index
            var rootUri  = GetIndexUri(packageId);
            var rootFile = _context.Source.Get(rootUri);

            using (var timer = PerfEntryWrapper.CreateModifyTimer(rootFile, _context))
            {
                var packages = new List <JObject>();
                var json     = await rootFile.GetJsonOrNull(_context.Log, _context.Token);

                if (json != null)
                {
                    // Get all entries
                    packages = await GetPackageDetails(json);
                }

                // Remove any duplicates from the file
                var newPackageVersions = new HashSet <NuGetVersion>(packageInputs.Select(e => e.Identity.Version));

                foreach (var existingPackage in packages.ToArray())
                {
                    var existingVersion = GetPackageVersion(existingPackage);

                    if (newPackageVersions.Contains(existingVersion))
                    {
                        packages.Remove(existingPackage);
                        _context.Log.LogWarning($"Removed duplicate registration entry for: {new PackageIdentity(packageId, existingVersion)}");
                    }
                }

                // Add package entries
                foreach (var package in packageInputs)
                {
                    // Add entry
                    var newEntry = CreateItem(package);
                    packages.Add(newEntry);
                }

                // Create index
                var newIndexJson = await CreateIndexAsync(rootUri, packages);

                // Write
                await rootFile.Write(newIndexJson, _context.Log, _context.Token);
            }
        }
Пример #6
0
        /// <summary>
        /// Create the file directly without loading the previous file.
        /// </summary>
        public async Task CreateAsync(IEnumerable <string> packageIds)
        {
            using (var timer = PerfEntryWrapper.CreateModifyTimer(RootIndexFile, _context.PerfTracker))
            {
                var ids = new SortedSet <string>(packageIds, StringComparer.OrdinalIgnoreCase);

                // Create a new file using the full set of package ids.
                // There is no need to read the existing file.
                var json = await GetEmptyTemplate();

                var data = new JArray(ids.Take(MaxResults));
                json["data"]      = data;
                json["totalHits"] = data.Count;

                var formatted = JsonLDTokenComparer.Format(json, recurse: false);
                await RootIndexFile.Write(formatted, _context.Log, _context.Token);
            }
        }
Пример #7
0
        public async Task ApplyOperationsAsync(SleetOperations changeContext)
        {
            var file = RootIndexFile;

            using (var timer = PerfEntryWrapper.CreateModifyTimer(file, _context))
            {
                var json = await file.GetJson(_context.Log, _context.Token);

                // Read existing entries
                // Modified packages will be rebuilt, other entries will be left as-is.
                var data = GetData(json);

                foreach (var packageId in changeContext.GetChangedIds())
                {
                    // Remove the existing entry if it exists
                    if (data.ContainsKey(packageId))
                    {
                        data.Remove(packageId);
                    }

                    var packages = await changeContext.UpdatedIndex.Packages.GetPackagesByIdAsync(packageId);

                    var versions = new SortedSet <NuGetVersion>(packages.Select(e => e.Version));

                    // If no versions exist then there is no extra work needed.
                    if (versions.Count > 0)
                    {
                        // Rebuild the new entry
                        var newEntry = await CreatePackageEntry(packageId, versions);

                        data.Add(packageId, newEntry);
                    }
                }

                json = await CreatePage(data);

                // Write the result
                await file.Write(json, _context.Log, _context.Token);
            }
        }