public void Initialize(Project project, BuildDetails buildDetails)
        {
            this.project = project;
            this.buildDetails = buildDetails;

            buildNumberLabel.Text = buildDetails.Number.ToString();
            reasonMemoEdit.Select();
        }
        public static void FillInBuildDetails(BuildDetails res, XmlDocument xml)
        {
            XmlNode claimedNode = xml.SelectSingleNode("/*/action[claimed/text() = 'true']");
            if (claimedNode == null)
                return;

            var reasonNode = claimedNode.SelectSingleNode("reason");
            var claimedByNode = claimedNode.SelectSingleNode("claimedBy");

            ClaimDetails claimDetails = new ClaimDetails();
            claimDetails.User = claimedByNode.InnerText;
            claimDetails.Reason = reasonNode != null ? reasonNode.InnerText : "";
            res.ClaimDetails = claimDetails;
        }
        public void ClaimBuild(Project project, BuildDetails buildDetails, string reason, bool sticky)
        {
            string url = NetUtils.ConcatUrls(project.Url, buildDetails.Number.ToString(), "/claim/claim");
            var request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";

            // we don't want to follow redirections
            request.AllowAutoRedirect = false;

            var credentials = project.Server.Credentials;
            if (credentials != null)
                request.Credentials = new NetworkCredential(credentials.Username, credentials.Password);

            using (Stream postStream = request.GetRequestStream())
            {
                var claim = new ClaimDetailsDto
                {
                    Reason = reason,
                    Sticky = sticky
                };

                var stream = new MemoryStream();
                var serializer = new DataContractJsonSerializer(typeof(ClaimDetailsDto));
                serializer.WriteObject(stream, claim);
                string json = Encoding.UTF8.GetString(stream.ToArray());

                string postData = "json=" + HttpUtility.UrlEncode(json, Encoding.UTF8);
                using (var writer = new StreamWriter(postStream))
                {
                    writer.Write(postData);
                }
            }

            using (var response = (HttpWebResponse)request.GetResponse())
            {
                if (response.StatusCode != HttpStatusCode.Found && response.StatusCode != HttpStatusCode.OK)
                    throw new Exception("Received response code " + response.StatusCode);
            }

            string buildUrl = NetUtils.ConcatUrls(project.Url, buildDetails.Number.ToString(), "/api/xml", HudsonService.buildDetailsFilter);
            HudsonService.RemoveFromCache(buildUrl);
        }
Beispiel #4
0
 private string FormatUsers(BuildDetails details)
 {
     if (details == null)
         return "-";
     string res = StringUtils.Join(details.Users, HudsonTrayTrackerResources.BuildDetails_UserSeparator);
     return res;
 }
Beispiel #5
0
 private string FormatBuildDetails(BuildDetails details)
 {
     if (details == null)
         return "-";
     string res = string.Format(HudsonTrayTrackerResources.BuildDetails_Format_NumberDate,
            details.Number, details.Time.ToLocalTime());
     return res;
 }
        private BuildDetails GetBuildDetails(Credentials credentials, string buildUrl, bool ignoreUntrustedCertificate)
        {
            if (buildUrl == null)
                return null;

            String url = NetUtils.ConcatUrls(buildUrl, "/api/xml" , buildDetailsFilter);
            BuildDetails res = new BuildDetails();

            if (logger.IsDebugEnabled)
                logger.Debug("Getting build details from " + url);

            String xmlStr = DownloadString(credentials, url, true, ignoreUntrustedCertificate);

            if (logger.IsTraceEnabled)
                logger.Trace("XML: " + xmlStr);

            XmlDocument xml = new XmlDocument();
            xml.LoadXml(xmlStr);

            string number = xml.SelectSingleNode("/*/number").InnerText;
            string timestamp = xml.SelectSingleNode("/*/timestamp").InnerText;
            XmlNodeList userNodes = xml.SelectNodes("/*/culprit/fullName");
            XmlNodeList changeNodes = xml.SelectNodes("/*/changeSet/item");

            TimeSpan ts = TimeSpan.FromSeconds(long.Parse(timestamp) / 1000);
            DateTime date = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
            date = date.Add(ts);

            int count = changeNodes.Count;
            if (count == 0)
            {
                // No changes were introduced;
                res.FailureReason = "Server Issue / Other";
            }
            else
            {
                // New changeset casued broken build: retrieve a name of the last committer;
                XmlNode committerNode = changeNodes.Item(count - 1);
                XmlNodeList childNodes = committerNode.ChildNodes;
                foreach (XmlNode node in childNodes)
                {
                    if (node.Name == "author")
                        res.CommitterName = node.LastChild.InnerText;
                }
            }

            ISet<string> users = new HashedSet<string>();
            foreach (XmlNode userNode in userNodes)
            {
                string userName = StringUtils.ExtractUserName(userNode.InnerText);
                users.Add(userName);
            }

            res.Number = int.Parse(number);
            res.Time = date;
            res.Users = users;

            ClaimService.FillInBuildDetails(res, xml);

            if (logger.IsDebugEnabled)
                logger.Debug("Done getting build details");

            return res;
        }
 private string FormatLastFailureReason(BuildDetails details)
 {
     string res = null;
     if (details == null)
         return "-";
     if (details.FailureReason == "Server Issue / Other")
         res = string.Format(HudsonTrayTrackerResources.BuildFailureMsg_Server_Issue);
     else
         res = string.Format(HudsonTrayTrackerResources.BuildFailureMsg_New_Commit);
     return res;
 }
 public string FormatFailureUsers(BuildDetails details)
 {
     string res = null;
     if (details == null)
         return "-";
     if (details.FailureReason == "Server Issue / Other")
         res = StringUtils.Join(details.Users, HudsonTrayTrackerResources.BuildFailure_UserSeparator);
     else
         res = string.Format(HudsonTrayTrackerResources.BuildFailure_CommitterName, details.CommitterName);
     return res;
 }
Beispiel #9
0
        public static void FillInBuildCauses(BuildDetails res, XmlDocument xml)
        {
            XmlNodeList causes = xml.SelectNodes("/*/action/cause");
            res.Causes = new BuildCauses();
            res.Causes.HasUniqueCauses = null;
            BuildCauseEnum causeEnum = BuildCauseEnum.Unknown;

            foreach (XmlNode causeNode in causes)
            {
                string causeShortDesc = causeNode["shortDescription"].InnerText;
                BuildCause cause = new BuildCause();
                cause.ShortDescription = causeShortDesc;

                if (causeShortDesc.StartsWith("Started by user"))
                {
                    cause.Cause = BuildCauseEnum.User;
                    var userName = causeNode["userName"];
                    if (userName != null && userName.InnerText.Length > 0)
                    {
                        cause.Starter = userName.InnerText.ToString();
                    }
                    var userID = causeNode["userId"];
                    if (userID != null && userID.InnerText.Length > 0)
                    {
                        cause.UserID = userID.InnerText.ToString();
                    }
                }
                else if (causeShortDesc.StartsWith("Started by Timer", StringComparison.CurrentCultureIgnoreCase))
                {
                    cause.Cause = BuildCauseEnum.Timer;
                }
                else if (causeShortDesc.StartsWith("Started by Upstream Project", StringComparison.CurrentCultureIgnoreCase))
                {
                    cause.Cause = BuildCauseEnum.UpstreamProject;
                    var upstreamProject = causeNode["upstreamProject"];
                    if (upstreamProject != null && upstreamProject.InnerText.Length > 0)
                    {
                        cause.Starter = upstreamProject.InnerText.ToString();
                    }
                }
                else if (causeShortDesc.StartsWith("Started by an SCM change", StringComparison.CurrentCultureIgnoreCase))
                {
                    cause.Cause = BuildCauseEnum.SCM;
                }
                else if (causeShortDesc.StartsWith("Started by remote host", StringComparison.CurrentCultureIgnoreCase))
                {
                    cause.Cause = BuildCauseEnum.RemoteHost;
                    string startedBy = @"Started by remote host ";
                    string remoteHost = causeShortDesc.Remove(0, startedBy.Length);
                    int index = remoteHost.IndexOf(" with note: ");
                    cause.Starter = index > 0 ? remoteHost.Remove(index) : remoteHost;
                }
                else
                {
                    cause.Cause = BuildCauseEnum.Unknown;
                }
                if (res.Causes.HasUniqueCauses == null)
                {
                    causeEnum = cause.Cause;
                    res.Causes.HasUniqueCauses = true;
                }
                else
                {
                    if (cause.Cause != causeEnum)
                        res.Causes.HasUniqueCauses = false;
                }
                res.Causes.Causes.Add(cause);
            }
        }
Beispiel #10
0
            private string FormatEstimatedDuration(BuildDetails details)
            {
                if (details == null)
                    return string.Empty;
                string res = string.Empty;
                DateTime endtime = details.Time.Add(details.EstimatedDuration);
                TimeSpan timeleft = TimeSpan.FromTicks(endtime.Subtract(DateTime.UtcNow).Ticks);

                if (timeleft.TotalHours >= 1)
                {
                    res = string.Format(HudsonTrayTrackerResources.BuildDetails_EstimatedDuration_HHMM_Remaining,
                        timeleft.Days * 24 + timeleft.Hours, timeleft.Minutes);
                }
                else if (timeleft.TotalHours < -1)
                {
                    res = string.Format(HudsonTrayTrackerResources.BuildDetails_EstimatedDuration_HHMM_LongerThanUsual,
                        Math.Abs(timeleft.Days * 24 + timeleft.Hours), Math.Abs(timeleft.Minutes));
                }
                else if (timeleft.TotalHours < 0)
                {
                    res = string.Format(HudsonTrayTrackerResources.BuildDetails_EstimatedDuration_MM_LongerThanUsual,
                        Math.Abs(timeleft.Minutes));
                }
                else
                {
                    res = string.Format(HudsonTrayTrackerResources.BuildDetails_EstimatedDuration_MM_Remaining,
                        timeleft.Minutes);
                }
                return res;
            }
Beispiel #11
0
 private string FormatDuration(BuildDetails details)
 {
     if (details == null)
         return string.Empty;
     string res = string.Empty;
     if (details.Duration.TotalHours > 1)
     {
         res = string.Format(HudsonTrayTrackerResources.BuildDetails_Duration_HHMM,
             details.Duration.Days * 24 + details.Duration.Hours, details.Duration.Minutes);
     }
     else if (details.Duration.TotalMinutes < 1)
     {
         res = HudsonTrayTrackerResources.BuildDetails_Duration_0M;
     }
     else
     {
         res = string.Format(HudsonTrayTrackerResources.BuildDetails_Duration_MM,
             Math.Max(details.Duration.Minutes + (details.Duration.Seconds >= 30 ? 1 : 0), 1));
     }
     return res;
 }
Beispiel #12
0
            private string FormatBuildDetailsWithDisplayName(BuildDetails details)
            {
                if (details == null)
                    return "-";
                string shortDisplayName = details.DisplayName.Replace(Project.Name, string.Empty).Trim();

                string res = string.Empty;
                if (shortDisplayName.Equals(string.Concat("#", details.Number.ToString())))
                {
                    res = string.Format(HudsonTrayTrackerResources.BuildDetails_Format_NumberDate,
                           details.Number.ToString(), details.Time.ToLocalTime());
                }
                else
                {
                    res = string.Format(HudsonTrayTrackerResources.BuildDetails_Format_DisplayName_NumberDate,
                           shortDisplayName, details.Number.ToString(), details.Time.ToLocalTime());
                }
                return res;
            }
        private BuildDetails GetBuildDetails(Credentials credentials, string buildUrl, bool ignoreUntrustedCertificate)
        {
            if (buildUrl == null)
                return null;

            String url = NetUtils.ConcatUrls(buildUrl, "/api/xml");

            if (logger.IsDebugEnabled)
                logger.Debug("Getting build details from " + url);

            String xmlStr = DownloadString(credentials, url, true, ignoreUntrustedCertificate);

            if (logger.IsTraceEnabled)
                logger.Trace("XML: " + xmlStr);

            XmlDocument xml = new XmlDocument();
            xml.LoadXml(xmlStr);

            string number = xml.SelectSingleNode("/*/number").InnerText;
            string timestamp = xml.SelectSingleNode("/*/timestamp").InnerText;
            XmlNodeList userNodes = xml.SelectNodes("/*/culprit/fullName");

            TimeSpan ts = TimeSpan.FromSeconds(long.Parse(timestamp) / 1000);
            DateTime date = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
            date = date.Add(ts);

            ISet<string> users = new HashedSet<string>();
            foreach (XmlNode userNode in userNodes)
            {
                string userName = StringUtils.ExtractUserName(userNode.InnerText);
                users.Add(userName);
            }

            BuildDetails res = new BuildDetails();
            res.Number = int.Parse(number);
            res.Time = date;
            res.Users = users;

            ClaimService.FillInBuildDetails(res, xml);

            if (logger.IsDebugEnabled)
                logger.Debug("Done getting build details");

            return res;
        }