bool FileFilter(JsonElement file)
        {
            string GetFilenameSuffix()
            {
                if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
                {
                    return(".gz");
                }
                if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
                {
                    return(".pkg");
                }
                if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
                {
                    return(".exe");
                }
                throw new PlatformNotSupportedException();
            }

            return(file.GetProperty("rid").GetString() == _platformIdentifier.GetPlatform() &&
                   file.GetProperty("name").ToString().EndsWith(GetFilenameSuffix()));
        }
Пример #2
0
        public async Task Acquire(string version)
        {
            var channelVersion = ParseChannelVersion(version);
            var platform       = _platformIdentifier.GetPlatform();

            using var releasesResponse = await JsonDocument.ParseAsync(await _httpClient.GetStreamAsync(ReleaseIndex));

            var channel = releasesResponse.RootElement.GetProperty("releases-index").EnumerateArray()
                          .First(x => x.GetProperty("channel-version").GetString() == channelVersion);

            var channelJson = channel.GetProperty("releases.json").GetString();

            using var channelResponse = await JsonDocument.ParseAsync(await _httpClient.GetStreamAsync(channelJson));

            var file = channelResponse
                       .RootElement.GetProperty("releases").EnumerateArray()
                       .SelectMany(x =>
            {
                IEnumerable <JsonElement> GetSdks()
                {
                    yield return(x.GetProperty("sdk"));

                    if (x.TryGetProperty("sdks", out var sdks))
                    {
                        foreach (var y in sdks.EnumerateArray())
                        {
                            yield return(y);
                        }
                    }
                }

                return(GetSdks());
            })
                       .First(x => x.GetProperty("version").GetString() == version)
                       .GetProperty("files")
                       .EnumerateArray()
                       .First(x => x.GetProperty("rid").GetString() == platform);

            var name         = file.GetProperty("name").GetString();
            var installerUrl = file.GetProperty("url").GetString();
            var fileHash     = file.GetProperty("hash").GetString();

            var filePath = Path.Combine(Path.GetTempPath(), name);

            using var installerStream = await _httpClient.GetStreamAsync(installerUrl);

            using var fileStream = new FileStream(filePath, FileMode.Create);
            var progress = new Progress <long>();

            var lastReportedBytesMbs = 0;

            progress.ProgressChanged += (sender, totalBytes) =>
            {
                var currentBytesMbs = (int)Math.Floor(totalBytes / Math.Pow(2, 20));
                if (currentBytesMbs <= lastReportedBytesMbs)
                {
                    return;
                }
                lastReportedBytesMbs = currentBytesMbs;
                _textWriter.SetCursorPosition(0, Console.CursorTop);
                _textWriter.Write($"Downloading: {currentBytesMbs}MB");
            };
            await CopyToWithProgress(installerStream, fileStream, progress);

            CheckHash(filePath, fileHash);

            _installerLauncher.Launch(filePath);
        }