public LoadString ( |
||
resourceUri | ||
cancellationToken | CancellationToken | |
return | Task |
async Task UpdateMetadata(Storage storage, string version, CancellationToken cancellationToken) { Uri resourceUri = new Uri(storage.BaseAddress, "index.json"); HashSet<NuGetVersion> versions = GetVersions(await storage.LoadString(resourceUri, cancellationToken)); versions.Add(NuGetVersion.Parse(version)); List<NuGetVersion> result = new List<NuGetVersion>(versions); result.Sort(); await storage.Save(resourceUri, CreateContent(result.Select((v) => v.ToString())), cancellationToken); }
public static async Task<DateTime?> GetCatalogProperty(Storage storage, string propertyName, CancellationToken cancellationToken) { var json = await storage.LoadString(storage.ResolveUri("index.json"), cancellationToken); if (json != null) { var obj = JObject.Parse(json); JToken token; if (obj.TryGetValue(propertyName, out token)) { return token.ToObject<DateTime>().ToUniversalTime(); } } return null; }
async Task UpdateMetadata(Storage storage, Action<HashSet<NuGetVersion>> updateAction, CancellationToken cancellationToken) { string relativeAddress = "index.json"; var resourceUri = new Uri(storage.BaseAddress, relativeAddress); HashSet<NuGetVersion> versions = GetVersions(await storage.LoadString(resourceUri, cancellationToken)); updateAction(versions); List<NuGetVersion> result = new List<NuGetVersion>(versions); if (result.Any()) { // Store versions (sorted) result.Sort(); await storage.Save(resourceUri, CreateContent(result.Select((v) => v.ToString())), cancellationToken); } else { // Remove versions file if no versions are present if (storage.Exists(relativeAddress)) { await storage.Delete(resourceUri, cancellationToken); } } }
public static async Task<SortedList<DateTime, IList<PackageIdentity>>> GetDeletedPackages(Storage auditingStorage, HttpClient client, string source, DateTime since, int top = 100) { var result = new SortedList<DateTime, IList<PackageIdentity>>(); // Get all audit blobs (based on their filename which starts with a date that can be parsed) // NOTE we're getting more files than needed (to account for a time difference between servers) var minimumFileTime = since.AddMinutes(-15); var auditRecordUris = (await auditingStorage.List(CancellationToken.None)) .Where(recordUri => FilterDeletedPackage(minimumFileTime, recordUri)); foreach (var auditRecordUri in auditRecordUris) { var contents = await auditingStorage.LoadString(auditRecordUri, CancellationToken.None); if (!string.IsNullOrEmpty(contents)) { string packageId; string packageVersion; DateTime? deletedOn; try { var auditRecord = JObject.Parse(contents); var recordPart = (JObject)auditRecord.GetValue("Record", StringComparison.OrdinalIgnoreCase); packageId = recordPart.GetValue("Id", StringComparison.OrdinalIgnoreCase).ToString(); packageVersion = recordPart.GetValue("Version", StringComparison.OrdinalIgnoreCase).ToString(); var actorPart = (JObject)auditRecord.GetValue("Actor", StringComparison.OrdinalIgnoreCase); deletedOn = actorPart.GetValue("TimestampUtc", StringComparison.OrdinalIgnoreCase).Value<DateTime>(); } catch (JsonReaderException) { Trace.TraceWarning("Audit record at {0} contains invalid JSON.", auditRecordUri); continue; } catch (NullReferenceException) { Trace.TraceWarning("Audit record at {0} does not contain required JSON properties to perform a package delete.", auditRecordUri); continue; } if (!string.IsNullOrEmpty(packageId) && !string.IsNullOrEmpty(packageVersion) && deletedOn > since) { // Mark the package "deleted" IList<PackageIdentity> packages; if (!result.TryGetValue(deletedOn.Value, out packages)) { packages = new List<PackageIdentity>(); result.Add(deletedOn.Value, packages); } packages.Add(new PackageIdentity(packageId, packageVersion)); } } } return result; }