Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions src/backend/PkgDiff.Application/Services/PackageCacheService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -233,11 +233,27 @@ private async Task<PackageMetadata> BuildMetadataFromCache(CachedPackage cached,
};
}

private async Task ForgetEmptyReleaseNotesAsync(int cachedPackageId, string registry, string packageId)
{
var emptyNotes = (await _unitOfWork.CachedReleaseNotes
.FindAsync(rn => rn.CachedPackageId == cachedPackageId && rn.IsEmpty && rn.ReleaseNotesSource != null))
.ToList();
if (emptyNotes.Count == 0)
return;

foreach (var note in emptyNotes)
note.ReleaseNotesSource = null;
await _unitOfWork.SaveChangesAsync();

_jobs.Enqueue<IPackageAnalysisService>(service => service.ScrapePackageReleaseNotesAsync(packageId, registry));
}

private async Task SaveFreshMetadataToCache(
CachedPackage? cached, PackageMetadata metadata, string registry, string packageId)
{
var registryId = await ResolveRegistryIdAsync(registry);

var repositoryChanged = false;
if (cached == null)
{
cached = new CachedPackage
Expand All @@ -263,6 +279,8 @@ private async Task SaveFreshMetadataToCache(
cached.Authors = metadata.Authors;
cached.IconUrl = metadata.IconUrl;
cached.ProjectUrl = metadata.ProjectUrl;
repositoryChanged = metadata.GitHubRepositoryUrl != null
&& !string.Equals(metadata.GitHubRepositoryUrl, cached.GitHubRepositoryUrl, StringComparison.OrdinalIgnoreCase);
// A repository found while scraping release notes is kept when the registry names none
cached.GitHubRepositoryUrl = metadata.GitHubRepositoryUrl ?? cached.GitHubRepositoryUrl;
cached.AllVersionsJson = JsonSerializer.Serialize(metadata.Versions.Select(v => v.Version));
Expand All @@ -273,6 +291,9 @@ private async Task SaveFreshMetadataToCache(

await _unitOfWork.SaveChangesAsync();

if (repositoryChanged)
await ForgetEmptyReleaseNotesAsync(cached.Id, registry.ToLowerInvariant(), packageId);

var latestVersion = metadata.LatestVersion ?? string.Empty;
var latestPublished = metadata.Versions.FirstOrDefault(v => v.Version == latestVersion)?.PublishedDate;
await _liveUpdates.RecordLatestVersionAsync(cached, registry, latestVersion, latestPublished, authoritative: true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,7 @@ private static IEnumerable<string> TagCandidates(string? packageId, string versi
}
yield return $"release-{version}";
yield return $"release/{version}";
yield return $"rel_{version.Replace('.', '_')}";
}

[System.Text.RegularExpressions.GeneratedRegex(@"^[vV]?\d")]
Expand Down
10 changes: 5 additions & 5 deletions src/backend/PkgDiff.Infrastructure/Services/NpmService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,7 @@ private class NpmAuthorConverter : JsonConverter<NpmAuthor>
var propName = reader.GetString();
reader.Read();
if (propName == "name") author.Name = reader.GetString();
else reader.Skip();
else reader.TrySkip();
}
}
return author;
Expand Down Expand Up @@ -299,7 +299,7 @@ private class NpmRepositoryConverter : JsonConverter<NpmRepository>
return new NpmRepository { Url = reader.GetString() };
if (reader.TokenType != JsonTokenType.StartObject)
{
reader.Skip();
reader.TrySkip();
return null;
}

Expand All @@ -312,7 +312,7 @@ private class NpmRepositoryConverter : JsonConverter<NpmRepository>
reader.Read();
var value = reader.TokenType == JsonTokenType.String ? reader.GetString() : null;
if (reader.TokenType is JsonTokenType.StartObject or JsonTokenType.StartArray)
reader.Skip();
reader.TrySkip();
switch (propName)
{
case "type": repository.Type = value; break;
Expand Down Expand Up @@ -349,11 +349,11 @@ private class LooseStringConverter : JsonConverter<string?>
if (reader.TokenType == JsonTokenType.String)
first ??= reader.GetString();
else if (reader.TokenType is JsonTokenType.StartObject or JsonTokenType.StartArray)
reader.Skip();
reader.TrySkip();
}
return first;
case JsonTokenType.StartObject:
reader.Skip();
reader.TrySkip();
return null;
default:
return null;
Expand Down