private string FormatBuildDetailsAndSummary() { string details = string.Empty; string buildCausesSummary = string.Empty; // get a copy of the reference to avoid a race condition BuildStatus projectStatus = Project.Status; BuildDetails lastBuild = Project.LastBuild; if (lastBuild != null) { // get a copy of the reference to avoid a race condition BuildCauses lastBuildCauses = lastBuild.Causes; if (lastBuildCauses != null) { if (projectStatus.IsInProgress) { TimeSpan progressts = lastBuild.EstimatedDuration; string timeleft = FormatEstimatedDuration(lastBuild); foreach (BuildCause cause in lastBuildCauses.Causes) { if (lastBuildCauses.HasUniqueCauses == false) { buildCausesSummary = JenkinsTrayResources.BuildDetails_Cause_MultipleSources; break; } switch (cause.Cause) { case BuildCauseEnum.SCM: { if (lastBuild.Users.Count == 0) { buildCausesSummary = JenkinsTrayResources.BuildDetails_Cause_SCM; } else if (lastBuild.Users.Count > 1) { buildCausesSummary = string.Format(JenkinsTrayResources.BuildDetails_Cause_SCM_Multiple, lastBuild.Users.Count); } else { buildCausesSummary = string.Format(JenkinsTrayResources.BuildDetails_Cause_SCM_Single, FormatUsers(lastBuild)); } } break; case BuildCauseEnum.User: { buildCausesSummary = string.Format(JenkinsTrayResources.BuildDetails_Cause_User, cause.Starter); } break; case BuildCauseEnum.RemoteHost: { buildCausesSummary = JenkinsTrayResources.BuildDetails_Cause_RemoteHost; } break; case BuildCauseEnum.Timer: { buildCausesSummary = JenkinsTrayResources.BuildDetails_Cause_Timer; } break; case BuildCauseEnum.UpstreamProject: { buildCausesSummary = JenkinsTrayResources.BuildDetails_Cause_UpstreamProject; } break; } } details = timeleft + buildCausesSummary; } else { if (projectStatus.Value == BuildStatusEnum.Successful) { details = FormatDuration(lastBuild); } else if (projectStatus.Value == BuildStatusEnum.Unstable) { details = projectStatus.Value.ToString() + "."; } else if (projectStatus.Value == BuildStatusEnum.Disabled) { details = string.Format("{0}. ", JenkinsTrayResources.BuildStatus_Disabled); } else { details = projectStatus.Value.ToString() + ". "; if (lastBuild.Users != null && !lastBuild.Users.IsEmpty) { details += string.Format(JenkinsTrayResources.BuildDetails_BrokenBy, FormatUsers(lastBuild)); } } } if (Project.Queue.InQueue) { if (!projectStatus.IsInProgress) { details += string.Format(JenkinsTrayResources.BuildDetails_InQueue_Why, Project.Queue.Why); } } if (projectStatus.IsStuck) { details = "Queued, possibly stuck. " + string.Format(JenkinsTrayResources.BuildDetails_InQueue_Why, Project.Queue.Why); } } } return(details); }
private BuildDetails GetBuildDetails(Credentials credentials, string buildUrl, bool ignoreUntrustedCertificate) { if (buildUrl == null) { return(null); } var url = NetUtils.ConcatUrls(buildUrl, "/api/xml", JenkinsService.buildDetailsFilter); if (logger.IsDebugEnabled) { logger.Debug("Getting build details from " + url); } var xmlStr = DownloadString(credentials, url, true, ignoreUntrustedCertificate); if (logger.IsTraceEnabled) { logger.Trace("XML: " + xmlStr); } var xml = new XmlDocument(); xml.LoadXml(xmlStr); var number = xml.SelectSingleNode("/*/number").InnerText; var fullDisplayName = xml.SelectSingleNode("/*/fullDisplayName").InnerText; var timestamp = xml.SelectSingleNode("/*/timestamp").InnerText; var estimatedDuration = xml.SelectSingleNode("/*/estimatedDuration").InnerText; var duration = xml.SelectSingleNode("/*/duration").InnerText; var xmlResult = xml.SelectSingleNode("/*/result"); var result = xmlResult == null ? string.Empty : xmlResult.InnerText; var userNodes = xml.SelectNodes("/*/culprit/fullName"); var ts = TimeSpan.FromSeconds(long.Parse(timestamp) / 1000); var date = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); date = date.Add(ts); var estimatedts = TimeSpan.FromSeconds(long.Parse(estimatedDuration) / 1000); var durationts = TimeSpan.FromSeconds(long.Parse(estimatedDuration) / 1000); Spring.Collections.Generic.ISet <string> users = new HashedSet <string>(); foreach (XmlNode userNode in userNodes) { var userName = StringUtils.ExtractUserName(userNode.InnerText); users.Add(userName); } var res = new BuildDetails(); BuildCauses.FillInBuildCauses(res, xml); res.Number = int.Parse(number); res.DisplayName = fullDisplayName; res.Time = date; res.EstimatedDuration = estimatedts; res.Duration = durationts; res.Result = BuildStatus.StringToBuildStatus(result); res.Users = users; ClaimService.FillInBuildDetails(res, xml); if (logger.IsDebugEnabled) { logger.Debug("Done getting build details"); } return(res); }