private async Task ProcessAsset(Octokit.ReleaseAsset releaseAsset, string branch, int updateId)
        {
            var operatingSystem = Parser.ParseOS(releaseAsset.Name);

            if (!operatingSystem.HasValue)
            {
                return;
            }

            var runtime   = Parser.ParseRuntime(releaseAsset.Name);
            var arch      = Parser.ParseArchitecture(releaseAsset.Name);
            var installer = Parser.ParseInstaller(releaseAsset.Name);

            // Calculate the hash of the zip file.
            var    releaseZip = Path.Combine(_config.DataDirectory, branch.ToString().ToLower(), releaseAsset.Name);
            string releaseHash;

            if (!File.Exists(releaseZip))
            {
                Directory.CreateDirectory(Path.GetDirectoryName(releaseZip));

                using var fileStream     = File.OpenWrite(releaseZip);
                using var artifactStream = await _httpClient.GetStreamAsync(releaseAsset.BrowserDownloadUrl);

                await artifactStream.CopyToAsync(fileStream);
            }

            using (var stream = File.OpenRead(releaseZip))
                using (var sha = SHA256.Create())
                {
                    releaseHash = BitConverter.ToString(sha.ComputeHash(stream)).Replace("-", "").ToLower();
                }

            File.Delete(releaseZip);

            // Add to database.
            var updateFile = new UpdateFileEntity
            {
                UpdateId        = updateId,
                OperatingSystem = operatingSystem.Value,
                Architecture    = arch,
                Runtime         = runtime,
                Filename        = releaseAsset.Name,
                Url             = releaseAsset.BrowserDownloadUrl,
                Hash            = releaseHash,
                Installer       = installer
            };

            await _updateFileService.Insert(updateFile).ConfigureAwait(false);
        }
        private async Task ProcessFile(AzureFile file, string branch, int updateId)
        {
            _logger.LogDebug("Processing {0}", file.Path);

            // Detect target operating system.
            var operatingSystem = Parser.ParseOS(file.Path);

            if (!operatingSystem.HasValue)
            {
                return;
            }

            _logger.LogDebug("Got os {0}", operatingSystem);

            // Detect runtime / arch
            var runtime = Parser.ParseRuntime(file.Path);

            _logger.LogDebug("Got runtime {0}", runtime);

            var arch = Parser.ParseArchitecture(file.Path);

            _logger.LogDebug("Got arch {0}", arch);

            var installer = Parser.ParseInstaller(file.Path);

            _logger.LogDebug("Got installer {0}", installer);

            // Calculate the hash of the zip file.
            var    releaseFileName = Path.GetFileName(file.Path);
            var    releaseZip      = Path.Combine(_config.DataDirectory, branch, releaseFileName);
            string releaseHash;

            if (!File.Exists(releaseZip))
            {
                Directory.CreateDirectory(Path.GetDirectoryName(releaseZip));

                using var fileStream     = File.OpenWrite(releaseZip);
                using var artifactStream = await _httpClient.GetStreamAsync(file.Url).ConfigureAwait(false);

                await artifactStream.CopyToAsync(fileStream).ConfigureAwait(false);
            }

            using (var stream = File.OpenRead(releaseZip))
            {
                using var sha = SHA256.Create();
                releaseHash   = BitConverter.ToString(sha.ComputeHash(stream)).Replace("-", "").ToLower();
            }

            File.Delete(releaseZip);

            // Add to database.
            var updateFile = new UpdateFileEntity
            {
                UpdateId        = updateId,
                OperatingSystem = operatingSystem.Value,
                Architecture    = arch,
                Runtime         = runtime,
                Filename        = releaseFileName,
                Url             = file.Url,
                Hash            = releaseHash,
                Installer       = installer
            };

            await _updateFileService.Insert(updateFile).ConfigureAwait(false);
        }