protected override async Task <bool> OnUpgrade(ZipArchive archive) { var archiveEntries = archive.Entries.ToArray(); foreach (var zipArchiveEntry in archiveEntries) { if (zipArchiveEntry.Name != "save_log.json" || zipArchiveEntry.FullName.Contains("-backup-")) { continue; } SaveLogEntry[] saveLogs; await using (var saveLogStream = zipArchiveEntry.Open()) saveLogs = await JsonSerializer.DeserializeAsync <SaveLogEntry[]>(saveLogStream); var changelogEntries = new ChangelogEntry[saveLogs.Length]; for (var i = 0; i < saveLogs.Length; i++) { changelogEntries[i] = new ChangelogEntry { Username = saveLogs[i].Username, ComputerName = saveLogs[i].ComputerName, Time = saveLogs[i].Time, Type = saveLogs[i].AutoSave == true ? ChangelogItemType.AutoSave : ChangelogItemType.Save }; } var basePath = zipArchiveEntry.FullName.Replace(zipArchiveEntry.Name, ""); var changelogEntry = archive.CreateEntry(basePath + "changelog.json"); await using (var saveLogStream = changelogEntry.Open()) { await JsonSerializer.SerializeAsync(saveLogStream, changelogEntries); } zipArchiveEntry.Delete(); } var fileVersionFile = archiveEntries.FirstOrDefault(f => f.FullName == "file_version"); fileVersionFile?.Delete(); return(true); }
public void SyncChangelogs() { var imageLock = GetImageLock(); _logger.LogInformation("Updating the package cache..."); _aptGetService.Update(); // Download the packages. _logger.LogInformation("Downloading the debs..."); var debFolder = Path.Combine(_workspaceConfig.RootDirectory, ".debs"); debFolder.EnsureDirectoryExists(); _aptGetService.Download(imageLock.InstalledPackages.ToDictionary(x => x.Key, x => x.Value.Version), debFolder); var tmpChangelogDirectory = Path.Combine(_workspaceConfig.RootDirectory, ".tmp-changelog"); tmpChangelogDirectory.CleanOrCreateDirectory(); var tmpExtractionDirectory = Path.Combine(tmpChangelogDirectory, "tmp"); Directory.CreateDirectory(tmpExtractionDirectory); foreach (var package in imageLock.InstalledPackages.Keys) { var installedPackage = imageLock.InstalledPackages[package]; var debFile = Path.Combine(debFolder, $"{package}_{installedPackage.Version.Version.Replace(":", "%3a")}_{installedPackage.Version.Architecture}.deb"); if (!File.Exists(debFile)) { throw new Exception($"The deb file {debFile} doesn't exist."); } _logger.LogInformation("Extracting: {package}", imageLock.InstalledPackages[package].Version.ToCommandParameter(package)); _dpkgService.Extract(debFile, tmpExtractionDirectory, false); } _logger.LogInformation("Finding changelogs..."); var docsDirectory = Path.Combine(tmpExtractionDirectory, "usr", "share", "doc"); var changelogEntries = new List <ChangelogEntry>(); foreach (var packageDirectoryPath in Directory.GetDirectories(docsDirectory)) { var packageDirectoryName = Path.GetFileName(packageDirectoryPath); _logger.LogInformation("Finding changelog for {package}...", packageDirectoryName); string FindChangelog(string baseName) { var debianName = baseName + ".Debian"; if (File.Exists(debianName)) { return(debianName); } debianName += ".gz"; if (File.Exists(debianName)) { return(debianName); } if (File.Exists(baseName)) { return(baseName); } baseName += ".gz"; if (File.Exists(baseName)) { return(baseName); } return(null); } var changelogPath = FindChangelog(Path.Combine(packageDirectoryPath, "changelog")); if (string.IsNullOrEmpty(changelogPath)) { _logger.LogWarning("Couldn't find changelog in {package} doc directory.", packageDirectoryName); continue; } var changelogEntry = new ChangelogEntry(); changelogEntry.MD5 = _processRunner.ReadShell($"md5sum {changelogPath.Quoted()}"); changelogEntry.MD5 = changelogEntry.MD5.Substring(0, changelogEntry.MD5.IndexOf(" ", StringComparison.Ordinal)); changelogEntry.SourcePackage = _processRunner.ReadShell($"dpkg-parsechangelog -S Source -l {changelogPath.Quoted()}").TrimEnd(Environment.NewLine.ToCharArray()); var existing = changelogEntries.SingleOrDefault(x => x.MD5 == changelogEntry.MD5 && x.SourcePackage == changelogEntry.SourcePackage); if (existing != null) { _logger.LogWarning("Changelog already exists for {packge} via {sourcePackage}", packageDirectoryName, changelogEntry.SourcePackage); continue; } var destination = Path.Combine(tmpChangelogDirectory, changelogEntry.SourcePackage); _processRunner.RunShell($"dpkg-parsechangelog -S Changes --all -l {changelogPath.Quoted()} > {destination.Quoted()}"); _logger.LogInformation("Saved changelog for {package}.", packageDirectoryName); } if (Directory.Exists(tmpExtractionDirectory)) { Directory.Delete(tmpExtractionDirectory, true); } var changelogDirectory = Path.Combine(_workspaceConfig.RootDirectory, "changelogs"); if (Directory.Exists(changelogDirectory)) { Directory.Delete(changelogDirectory, true); } Directory.Move(tmpChangelogDirectory, changelogDirectory); _logger.LogInformation("Done!"); }