public async Task<string> DownloadReleasePackage(ReleaseInfo releaseInfo, Action<int> downloadProgressCallback,
     CancellationToken cancellationToken) {
     var destination = Path.Combine(Path.GetTempPath(), releaseInfo.Filename);
     if (File.Exists(destination)) {
         File.Delete(destination);
         Thread.Sleep(100);
     }
     using (var webClient = new WebClient()) {
         webClient.Headers.Add("Accept", "application/octet-stream");
         if (downloadProgressCallback != null) {
             webClient.DownloadProgressChanged += (sender, args) => downloadProgressCallback(args.ProgressPercentage);
         }
         cancellationToken.Register(webClient.CancelAsync);
         await webClient.DownloadFileTaskAsync(releaseInfo.DownloadUrl, destination);
     }
     return destination;
 }
        public async Task<IReadOnlyCollection<ReleaseInfo>> GetReleaseInfosAsync() {
            var github = new GitHubClient(new ProductHeaderValue(_clientName));
            var result = new List<ReleaseInfo>();
            foreach (var release in await github.Repository.Release.GetAll(_repositoryOwner, _repositoryName)) {
                var r = new ReleaseInfo {
                    Name = String.IsNullOrWhiteSpace(release.Name) ? release.TagName : release.Name,
                    ReleaseNotes = release.Body,
                    PublishedAt = release.PublishedAt,
                    CreatedAt = release.CreatedAt,
                    HtmlUrl = release.HtmlUrl,
                    TagName = release.TagName,
                    IsPrerelease = release.Prerelease,
                };

                var assets = await github.Repository.Release.GetAllAssets(_repositoryOwner, _repositoryName, release.Id);
                var asset = assets.FirstOrDefault(a => a.Name.EndsWith(".msi"));
                if (asset != null) {
                    r.Filename = asset.Name;
                    r.DownloadUrl = asset.Url;
                }

                var match = Regex.Match(r.TagName, @"^v(?<major>\d+)\.(?<minor>\d+)(\.(?<patch>\d+))?$");
                if (match.Success) {
                    int major, minor, patch;
                    Int32.TryParse(match.Groups["major"].Value, out major);
                    Int32.TryParse(match.Groups["minor"].Value, out minor);
                    if (Int32.TryParse(match.Groups["patch"].Value, out patch)) {
                        r.Version = new Version(major, minor, patch);
                    } else {
                        r.Version = new Version(major, minor);
                    }
                }
                result.Add(r);
            }
            return result;
        }
 public Task<string> DownloadReleaseAsync(ReleaseInfo releaseInfo, Action<int> downloadProgressCallback,
     CancellationToken cancellationToken) {
     return _reader.DownloadReleasePackage(releaseInfo, downloadProgressCallback, cancellationToken);
 }
 public Task<string> DownloadReleasePackage(ReleaseInfo releaseInfo, Action<int> downloadProgressCallback,
     CancellationToken cancellationToken)
 {
     throw new NotImplementedException();
 }