Exemplo n.º 1
0
        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)..];
Exemplo n.º 2
0
        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);
        }