public async Task <List <string> > ExtractAsync(string destinationDirectoryAbsolutePath, [NotNull] SnapRelease snapRelease, IAsyncPackageCoreReader asyncPackageCoreReader, CancellationToken cancellationToken = default) { if (destinationDirectoryAbsolutePath == null) { throw new ArgumentNullException(nameof(destinationDirectoryAbsolutePath)); } if (snapRelease == null) { throw new ArgumentNullException(nameof(snapRelease)); } if (asyncPackageCoreReader == null) { throw new ArgumentNullException(nameof(asyncPackageCoreReader)); } var snapApp = await _snapPack.GetSnapAppAsync(asyncPackageCoreReader, cancellationToken); var coreRunExeFilename = _snapEmbeddedResources.GetCoreRunExeFilenameForSnapApp(snapApp); var extractedFiles = new List <string>(); _snapFilesystem.DirectoryCreateIfNotExists(destinationDirectoryAbsolutePath); var files = !snapRelease.IsFull ? snapRelease .New .Concat(snapRelease.Modified) .OrderBy(x => x.NuspecTargetPath, new OrdinalIgnoreCaseComparer()) .ToList() : snapRelease.Files; foreach (var checksum in files) { var isSnapRootTargetItem = checksum.NuspecTargetPath.StartsWith(SnapConstants.NuspecAssetsTargetPath); string dstFilename; if (isSnapRootTargetItem) { dstFilename = _snapFilesystem.PathCombine(destinationDirectoryAbsolutePath, checksum.Filename); if (checksum.Filename == coreRunExeFilename) { dstFilename = _snapFilesystem.PathCombine( _snapFilesystem.DirectoryGetParent(destinationDirectoryAbsolutePath), checksum.Filename); } } else { var targetPath = checksum.NuspecTargetPath[(SnapConstants.NuspecRootTargetPath.Length + 1)..];
public async Task <SnapApp> UpdateAsync(string baseDirectory, SnapRelease snapRelease, SnapChannel snapChannel, ISnapProgressSource snapProgressSource = null, ILog logger = null, CancellationToken cancellationToken = default) { if (baseDirectory == null) { throw new ArgumentNullException(nameof(baseDirectory)); } if (snapRelease == null) { throw new ArgumentNullException(nameof(snapRelease)); } if (snapChannel == null) { throw new ArgumentNullException(nameof(snapChannel)); } if (!_snapOs.Filesystem.DirectoryExists(baseDirectory)) { logger?.Error($"Base directory does not exist: {baseDirectory}"); return(null); } var nupkgAbsoluteFilename = _snapOs.Filesystem.PathCombine(baseDirectory, "packages", snapRelease.Filename); if (!_snapOs.Filesystem.FileExists(nupkgAbsoluteFilename)) { logger?.Error($"Unable to apply full update because the nupkg does not exist: {nupkgAbsoluteFilename}"); return(null); } snapProgressSource?.Raise(0); logger?.Debug("Attempting to get snap app details from nupkg"); var nupkgFileStream = _snapOs.Filesystem.FileRead(nupkgAbsoluteFilename); using var packageArchiveReader = new PackageArchiveReader(nupkgFileStream); var snapApp = await _snapPack.GetSnapAppAsync(packageArchiveReader, cancellationToken); if (!snapApp.IsFull) { logger?.Error($"You can only update from a full nupkg. Snap id: {snapApp.Id}. Filename: {nupkgAbsoluteFilename}"); return(null); } snapApp.SetCurrentChannel(snapChannel.Name); logger?.Info($"Updating snap id: {snapApp.Id}. Version: {snapApp.Version}. "); var appDirectory = GetApplicationDirectory(baseDirectory, snapApp.Version); snapProgressSource?.Raise(10); if (_snapOs.Filesystem.DirectoryExists(appDirectory)) { _snapOs.KillAllProcessesInsideDirectory(appDirectory); logger?.Info($"Deleting existing app directory: {appDirectory}"); await _snapOs.Filesystem.DirectoryDeleteAsync(appDirectory); } logger?.Info($"Creating app directory: {appDirectory}"); _snapOs.Filesystem.DirectoryCreate(appDirectory); var packagesDirectory = GetPackagesDirectory(baseDirectory); if (!_snapOs.Filesystem.DirectoryExists(packagesDirectory)) { logger?.Error($"Packages directory does not exist: {packagesDirectory}"); return(null); } snapProgressSource?.Raise(30); logger?.Info($"Extracting nupkg to app directory: {appDirectory}"); var extractedFiles = await _snapExtractor.ExtractAsync(appDirectory, snapRelease, packageArchiveReader, cancellationToken); if (!extractedFiles.Any()) { logger?.Error($"Unknown error when attempting to extract nupkg: {nupkgAbsoluteFilename}"); return(null); } snapProgressSource?.Raise(90); logger?.Info("Performing post install tasks"); var nuspecReader = await packageArchiveReader.GetNuspecReaderAsync(cancellationToken); await InvokePostInstall(snapApp, nuspecReader, baseDirectory, appDirectory, snapApp.Version, false, logger, cancellationToken); logger?.Info("Post install tasks completed"); snapProgressSource?.Raise(100); return(snapApp); }