private async Task <JObject> FetchBuildDetailsManagingVersionUpdateAsync(AppVeyorBuildInfo buildDetails, CancellationToken cancellationToken)
        {
            try
            {
                return(JObject.Parse(await GetResponseAsync(_httpClientAppVeyor, buildDetails.AppVeyorBuildReportUrl, cancellationToken).ConfigureAwait(false)));
            }
            catch
            {
                var buildHistoryUrl = buildDetails.BaseApiUrl + "/history?recordsNumber=1&startBuildId=" + (int.Parse(buildDetails.BuildId) + 1);
                var builds          = JObject.Parse(await GetResponseAsync(_httpClientAppVeyor, buildHistoryUrl, cancellationToken).ConfigureAwait(false));

                var version = builds["builds"][0]["version"].ToObject <string>();
                buildDetails.Id = version;
                buildDetails.AppVeyorBuildReportUrl = buildDetails.BaseApiUrl + "/build/" + version;
                buildDetails.Url = buildDetails.BaseWebUrl + version;

                return(JObject.Parse(await GetResponseAsync(_httpClientAppVeyor, buildDetails.AppVeyorBuildReportUrl, cancellationToken).ConfigureAwait(false)));
            }
        }
        private void UpdateDescription(AppVeyorBuildInfo buildDetails, CancellationToken cancellationToken)
        {
            var buildDetailsParsed = ThreadHelper.JoinableTaskFactory.Run(() => FetchBuildDetailsManagingVersionUpdateAsync(buildDetails, cancellationToken));

            if (buildDetailsParsed == null)
            {
                return;
            }

            var buildData        = buildDetailsParsed["build"];
            var buildDescription = buildData["jobs"].Last();

            var status = buildDescription["status"].ToObject <string>();

            buildDetails.Status = ParseBuildStatus(status);

            buildDetails.ChangeProgressCounter();
            if (!buildDetails.IsRunning)
            {
                buildDetails.Duration = GetBuildDuration(buildData);
            }

            int testCount = buildDescription["testsCount"].ToObject <int>();

            if (testCount != 0)
            {
                int failedTestCount  = buildDescription["failedTestsCount"].ToObject <int>();
                int skippedTestCount = testCount - buildDescription["passedTestsCount"].ToObject <int>();
                var testResults      = testCount + " tests";
                if (failedTestCount != 0 || skippedTestCount != 0)
                {
                    testResults += string.Format(" ( {0} failed, {1} skipped )", failedTestCount, skippedTestCount);
                }

                buildDetails.TestsResultText = testResults;
            }
        }
 private static void UpdateDisplay(IObserver <BuildInfo> observer, AppVeyorBuildInfo build)
 {
     build.UpdateDescription();
     observer.OnNext(build);
 }