Esempio n. 1
0
        public async Task <LocalPackageInfo> InstallPackageAsync(LocalPackageInfo info, bool force)
        {
            var files = new List <LocalPackageInfo.InstalledFileInfo>();

            foreach (var file in info.Files.Where(f => !f.RegistryFile.Ignore))
            {
                var directory = Path.GetDirectoryName(file.Path);
                if (!_fs.Directory.Exists(directory))
                {
                    Directory.CreateDirectory(directory);
                }
                var fileResult = new LocalPackageInfo.InstalledFileInfo
                {
                    Path         = file.Path,
                    RegistryFile = file.RegistryFile
                };
                using var response = await _http.GetAsync(file.RegistryFile.Url).ConfigureAwait(false);

                response.EnsureSuccessStatusCode();
                var content = await response.Content.ReadAsStringAsync();

                var lines = content.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
                var hash  = Hashing.GetHash(lines);
                if (!force && hash != file.RegistryFile.Hash.Value)
                {
                    throw new PackageInstallationException($"Hash mismatch between registry file '{file.RegistryFile.Filename}' ({file.RegistryFile.Hash.Value}) and downloaded file '{file.RegistryFile.Url}' ({hash})");
                }
                _fs.File.WriteAllText(file.Path, content);
                fileResult.Status = LocalPackageInfo.FileStatus.Installed;
                files.Add(fileResult);
            }
            return(new LocalPackageInfo
            {
                InstallFolder = info.InstallFolder,
                Files = files.ToArray()
            });
        }
Esempio n. 2
0
        private async Task <LocalPackageInfo.InstalledFileInfo> GetPackageFileInfo(string installPath, RegistryFile file)
        {
            var filePath = Path.Combine(installPath, file.Filename);
            var fileInfo = new LocalPackageInfo.InstalledFileInfo
            {
                Path         = filePath,
                RegistryFile = file
            };

            if (_fs.File.Exists(filePath))
            {
                var hash = await Hashing.GetHashAsync(_fs, filePath);

                if (file.Hash.Type != Hashing.Type)
                {
                    throw new InvalidOperationException($"Unsupported hash type: {file.Hash.Type}");
                }
                if (hash == file.Hash.Value)
                {
                    fileInfo.Status = LocalPackageInfo.FileStatus.Installed;
                }
                else
                {
                    fileInfo.Status = LocalPackageInfo.FileStatus.HashMismatch;
                }
            }
            else if (file.Ignore)
            {
                fileInfo.Status = LocalPackageInfo.FileStatus.Ignored;
            }
            else
            {
                fileInfo.Status = LocalPackageInfo.FileStatus.NotInstalled;
            }
            return(fileInfo);
        }