Skip to content

Commit

Permalink
Merge pull request #35 from benoit808/master
Browse files Browse the repository at this point in the history
Fix for cc.net
  • Loading branch information
lprichar committed Jun 19, 2014
2 parents 427cff4 + da35d11 commit 8138c2d
Show file tree
Hide file tree
Showing 3 changed files with 112 additions and 16 deletions.
80 changes: 73 additions & 7 deletions CruiseControlNetServices/CruiseControlNetBuildStatus.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ public static string ParseCruiseControlDateToId(string date)
if (priorToDot == null) return null;
return Regex.Replace(priorToDot, "[^0-9]", "");
}
public CruiseControlNetBuildStatus(XElement projectElem)

public CruiseControlNetBuildStatus(XElement projectElem, XElement modifications)
{
Name = BuildDefinitionId = projectElem.AttributeValue("name");

Expand All @@ -67,14 +67,26 @@ public CruiseControlNetBuildStatus(XElement projectElem)
BuildStatusEnum = ToBuildStatusEnum(projectElem.AttributeValueOrDefault("activity"), projectElem.AttributeValueOrDefault("lastBuildStatus"));
StartedTime = GetStartedTime(buildStatusInfo, BuildStatusEnum, lastBuildTime);
FinishedTime = GetFinishedTime(buildStatusInfo, BuildStatusEnum, lastBuildTime);
Comment = null;
RequestedBy = GetRequestedBy(projectElem);
Comment = GetComment(projectElem, modifications);
RequestedBy = GetRequestedBy(projectElem, modifications);

var webUrl = projectElem.AttributeValueOrDefault("webUrl");
string lastBuildTimeAsId = ParseCruiseControlDateToId(lastBuildTimeStr);
Url = string.Format("{0}/server/local/project/{1}/build/log{2}.xml/ViewBuildReport.aspx", webUrl, Name, lastBuildTimeAsId);
string lastBuildNumber = projectElem.AttributeValueOrDefault("lastBuildLabel");
Url = string.Format("{0}/server/local/project/{1}/build/log{2}Lbuild.{3}.xml/ViewBuildReport.aspx", webUrl, Name, lastBuildTimeAsId, lastBuildNumber);
BuildId = GetBuildIdOrDefault(projectElem, lastBuildTimeAsId);


if (BuildStatusEnum == SirenOfShame.Lib.Watcher.BuildStatusEnum.InProgress)
{
Comment = "Building...";
RequestedBy = null;
}
else if (BuildStatusEnum == SirenOfShame.Lib.Watcher.BuildStatusEnum.Broken)
{
Url = string.Format("{0}/server/local/project/{1}/build/log{2}.xml/ViewBuildReport.aspx", webUrl, Name, lastBuildTimeAsId);
BuildId = lastBuildTimeAsId;
}

buildStatusInfo.LastBuildStatusEnum = BuildStatusEnum;
}

Expand All @@ -85,8 +97,62 @@ private string GetBuildIdOrDefault(XElement projectElem, string defaultVal)
return lastBuildLabel;
}

private string GetRequestedBy(XElement projectElem)
private string GetComment(XElement projectElem, XElement modifications)
{
try
{
if (modifications != null)
{
IEnumerable<XElement> modificationEnum = modifications.Elements("modification");
HashSet<string> comments = new HashSet<string>();
foreach (XElement modification in modificationEnum)
{
XElement commentElement = modification.Element("comment");
if (commentElement != null)
{
comments.Add(commentElement.Value);
}
}

string commentToReturn = string.Empty;
foreach (string comment in comments)
{
commentToReturn += comment;
}

return commentToReturn;
}
}
catch (Exception)
{
// Swallow and return null
return null;
}

return null;
}

private string GetRequestedBy(XElement projectElem, XElement modifications)
{
try
{
if (modifications != null)
{
IEnumerable<XElement> modificationEnum = modifications.Elements("modification");
XElement firstModification = modificationEnum.First();
XElement usernameElement = firstModification.Element("user");
if (usernameElement != null)
{
return usernameElement.Value;
}
}
}
catch (Exception)
{
// Swallow and return null
return null;
}

var messages = projectElem.Element("messages");
if (messages == null) return null;
var breakers = messages.Elements("message").FirstOrDefault(i => i.Attribute("kind") != null && i.Attribute("kind").Value == "Breakers");
Expand Down
36 changes: 33 additions & 3 deletions CruiseControlNetServices/CruiseControlNetService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using SirenOfShame.Lib.Exceptions;
using SirenOfShame.Lib.Settings;
using SirenOfShame.Lib.Watcher;
using SirenOfShame.Lib.Helpers;
using log4net;

namespace CruiseControlNetServices
Expand Down Expand Up @@ -75,9 +76,38 @@ private IEnumerable<CruiseControlNetBuildStatus> GetBuildStatuses(string rootUrl
var url = new Uri(rootUrl + "/XmlStatusReport.aspx");
var doc = DownloadXml(url.ToString(), userName, password);
if (doc.Root == null) throw new Exception("Could not get project list");
var projectElems = doc.Root.Elements("Project");
var buildStatuses = projectElems.Select(projectElem => new CruiseControlNetBuildStatus(projectElem));
return buildStatuses;
IEnumerable<XElement> projectElems = doc.Root.Elements("Project");

List<CruiseControlNetBuildStatus> results = new List<CruiseControlNetBuildStatus>();
if (projectElems != null)
{
foreach (XElement projectElem in projectElems)
{
try
{
var name = projectElem.AttributeValue("name");
var lastBuildTimeStr = projectElem.AttributeValueOrDefault("lastBuildTime");
string parsedBuildTime = CruiseControlNetBuildStatus.ParseCruiseControlDateToId(lastBuildTimeStr);
string lastBuildNumber = projectElem.AttributeValueOrDefault("lastBuildLabel");
string lastBuildStatus = projectElem.AttributeValueOrDefault("lastBuildStatus");

var XMLUrl = lastBuildStatus != null && lastBuildStatus.Equals("Success") ?
string.Format("{0}/server/local/project/{1}/build/log{2}Lbuild.{3}.xml/XmlBuildLog.aspx", rootUrl, name, parsedBuildTime, lastBuildNumber) :
string.Format("{0}/server/local/project/{1}/build/log{2}.xml/XmlBuildLog.aspx", rootUrl, name, parsedBuildTime);

var buildLog = DownloadXml(XMLUrl.ToString(), userName, password);
XElement buildLogModificationElems = buildLog.Root == null ? null : buildLog.Root.Element("modifications");

results.Add(new CruiseControlNetBuildStatus(projectElem, buildLogModificationElems));
}
catch (Exception ex)
{
// Swallow
}
}
}

return results;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public void CruiseControlNetBuildStatus_BrokenWithAuthor()
buildDefinitionSetting.Id = "BuildDefinitionId";
XElement projectElement = document.Root.Element("Project");
CruiseControlNetBuildStatus.ClearCache();
CruiseControlNetBuildStatus buildStatus = new CruiseControlNetBuildStatus(projectElement);
CruiseControlNetBuildStatus buildStatus = new CruiseControlNetBuildStatus(projectElement, null);

Assert.AreEqual(BuildStatusEnum.Broken, buildStatus.BuildStatusEnum);
Assert.AreEqual("Lee", buildStatus.RequestedBy);
Expand All @@ -54,7 +54,7 @@ public void CruiseControlNetBuildStatus_InProgress()
buildDefinitionSetting.Id = "BuildDefinitionId";
XElement projectElement = document.Root.Element("Project");
CruiseControlNetBuildStatus.ClearCache();
CruiseControlNetBuildStatus buildStatus = new CruiseControlNetBuildStatus(projectElement);
CruiseControlNetBuildStatus buildStatus = new CruiseControlNetBuildStatus(projectElement, null);

Assert.AreEqual(BuildStatusEnum.InProgress, buildStatus.BuildStatusEnum);
Assert.AreEqual("CruiseControlNetProj1", buildStatus.BuildDefinitionId);
Expand All @@ -80,8 +80,8 @@ public void CruiseControlNetBuildStatus_ChangesToInProgress()
XElement notInProgressStatusProjectElement = notInProgressStatus.Root.Element("Project");
XElement inProgressStatusProjectElement = inProgressStatus.Root.Element("Project");
CruiseControlNetBuildStatus.ClearCache();
new CruiseControlNetBuildStatus(notInProgressStatusProjectElement);
CruiseControlNetBuildStatus buildStatus = new CruiseControlNetBuildStatus(inProgressStatusProjectElement);
new CruiseControlNetBuildStatus(notInProgressStatusProjectElement, null);
CruiseControlNetBuildStatus buildStatus = new CruiseControlNetBuildStatus(inProgressStatusProjectElement, null);

Assert.AreEqual(BuildStatusEnum.InProgress, buildStatus.BuildStatusEnum);
Assert.AreEqual("CruiseControlNetProj1", buildStatus.BuildDefinitionId);
Expand All @@ -104,8 +104,8 @@ public void CruiseControlNetBuildStatus_TwoBackToBackNotStartedBuilds_StartedTim
buildDefinitionSetting.Id = "BuildDefinitionId";
XElement projectElement = document.Root.Element("Project");
CruiseControlNetBuildStatus.ClearCache();
new CruiseControlNetBuildStatus(projectElement);
CruiseControlNetBuildStatus buildStatus = new CruiseControlNetBuildStatus(projectElement);
new CruiseControlNetBuildStatus(projectElement, null);
CruiseControlNetBuildStatus buildStatus = new CruiseControlNetBuildStatus(projectElement, null);

Assert.AreEqual(BuildStatusEnum.Unknown, buildStatus.BuildStatusEnum);
Assert.AreEqual("CruiseControlNetProj1", buildStatus.BuildDefinitionId);
Expand Down

0 comments on commit 8138c2d

Please sign in to comment.