Skip to content

Commit f6dc65d

Browse files
authored
Merge pull request #11 from pkgdiff-dev/fix/release-notes-lookups
Fix release notes that stay empty after a repository change, rel_ tags and npm author parsing
2 parents 537657a + 0705d9d commit f6dc65d

3 files changed

Lines changed: 27 additions & 5 deletions

File tree

‎src/backend/PkgDiff.Application/Services/PackageCacheService.cs‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,11 +233,27 @@ private async Task<PackageMetadata> BuildMetadataFromCache(CachedPackage cached,
233233
};
234234
}
235235

236+
private async Task ForgetEmptyReleaseNotesAsync(int cachedPackageId, string registry, string packageId)
237+
{
238+
var emptyNotes = (await _unitOfWork.CachedReleaseNotes
239+
.FindAsync(rn => rn.CachedPackageId == cachedPackageId && rn.IsEmpty && rn.ReleaseNotesSource != null))
240+
.ToList();
241+
if (emptyNotes.Count == 0)
242+
return;
243+
244+
foreach (var note in emptyNotes)
245+
note.ReleaseNotesSource = null;
246+
await _unitOfWork.SaveChangesAsync();
247+
248+
_jobs.Enqueue<IPackageAnalysisService>(service => service.ScrapePackageReleaseNotesAsync(packageId, registry));
249+
}
250+
236251
private async Task SaveFreshMetadataToCache(
237252
CachedPackage? cached, PackageMetadata metadata, string registry, string packageId)
238253
{
239254
var registryId = await ResolveRegistryIdAsync(registry);
240255

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

274292
await _unitOfWork.SaveChangesAsync();
275293

294+
if (repositoryChanged)
295+
await ForgetEmptyReleaseNotesAsync(cached.Id, registry.ToLowerInvariant(), packageId);
296+
276297
var latestVersion = metadata.LatestVersion ?? string.Empty;
277298
var latestPublished = metadata.Versions.FirstOrDefault(v => v.Version == latestVersion)?.PublishedDate;
278299
await _liveUpdates.RecordLatestVersionAsync(cached, registry, latestVersion, latestPublished, authoritative: true);

‎src/backend/PkgDiff.Infrastructure/Services/GitHubScraperService.cs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,7 @@ private static IEnumerable<string> TagCandidates(string? packageId, string versi
336336
}
337337
yield return $"release-{version}";
338338
yield return $"release/{version}";
339+
yield return $"rel_{version.Replace('.', '_')}";
339340
}
340341

341342
[System.Text.RegularExpressions.GeneratedRegex(@"^[vV]?\d")]

‎src/backend/PkgDiff.Infrastructure/Services/NpmService.cs‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ private class NpmAuthorConverter : JsonConverter<NpmAuthor>
265265
var propName = reader.GetString();
266266
reader.Read();
267267
if (propName == "name") author.Name = reader.GetString();
268-
else reader.Skip();
268+
else reader.TrySkip();
269269
}
270270
}
271271
return author;
@@ -299,7 +299,7 @@ private class NpmRepositoryConverter : JsonConverter<NpmRepository>
299299
return new NpmRepository { Url = reader.GetString() };
300300
if (reader.TokenType != JsonTokenType.StartObject)
301301
{
302-
reader.Skip();
302+
reader.TrySkip();
303303
return null;
304304
}
305305

@@ -312,7 +312,7 @@ private class NpmRepositoryConverter : JsonConverter<NpmRepository>
312312
reader.Read();
313313
var value = reader.TokenType == JsonTokenType.String ? reader.GetString() : null;
314314
if (reader.TokenType is JsonTokenType.StartObject or JsonTokenType.StartArray)
315-
reader.Skip();
315+
reader.TrySkip();
316316
switch (propName)
317317
{
318318
case "type": repository.Type = value; break;
@@ -349,11 +349,11 @@ private class LooseStringConverter : JsonConverter<string?>
349349
if (reader.TokenType == JsonTokenType.String)
350350
first ??= reader.GetString();
351351
else if (reader.TokenType is JsonTokenType.StartObject or JsonTokenType.StartArray)
352-
reader.Skip();
352+
reader.TrySkip();
353353
}
354354
return first;
355355
case JsonTokenType.StartObject:
356-
reader.Skip();
356+
reader.TrySkip();
357357
return null;
358358
default:
359359
return null;

0 commit comments

Comments
 (0)