Skip to content
This repository was archived by the owner on Feb 12, 2025. It is now read-only.

Commit 13b0e7f

Browse files
committed
The multi source control must split and recombine SourceControlData for sub source control blocks to work properly.
1 parent 88b1f17 commit 13b0e7f

File tree

2 files changed

+83
-0
lines changed

2 files changed

+83
-0
lines changed

project/UnitTests/Core/SourceControl/MultiSourceControlTest.cs

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
using System;
22
using System.Collections;
3+
using System.Collections.Generic;
34
using Exortech.NetReflector;
45
using NMock;
56
using NUnit.Framework;
67
using ThoughtWorks.CruiseControl.Core;
78
using ThoughtWorks.CruiseControl.Core.Sourcecontrol;
9+
using ThoughtWorks.CruiseControl.Remote;
810

911
namespace ThoughtWorks.CruiseControl.UnitTests.Core.Sourcecontrol
1012
{
@@ -136,6 +138,68 @@ private DynamicMock CreateModificationsSourceControlMock(Modification[] mods, In
136138
return mock;
137139
}
138140

141+
private class MockSourceControl : ISourceControl
142+
{
143+
public Modification[] GetModifications(IIntegrationResult from, IIntegrationResult to)
144+
{
145+
Assert.AreEqual("first", from.SourceControlData[0].Value, "SourceControlData[0].Value");
146+
147+
to.SourceControlData.Clear();
148+
to.SourceControlData.Add(from.SourceControlData[0]);
149+
150+
return new Modification[] { };
151+
}
152+
153+
public void LabelSourceControl(IIntegrationResult result) { }
154+
public void GetSource(IIntegrationResult result) { }
155+
public void Initialize(IProject project) { }
156+
public void Purge(IProject project) { }
157+
}
158+
159+
160+
[Test]
161+
public void PassesIndividualSourceDataAndCombines()
162+
{
163+
IntegrationResult from = IntegrationResultMother.CreateSuccessful(DateTime.Now);
164+
IntegrationResult to = IntegrationResultMother.CreateSuccessful(DateTime.Now.AddDays(10));
165+
166+
string scValue = null;
167+
List<NameValuePair> list = new List<NameValuePair>();
168+
169+
list.Add(new NameValuePair("name0", "first"));
170+
scValue = XmlConversionUtil.ConvertObjectToXml(list);
171+
from.SourceControlData.Add(new NameValuePair("sc0", scValue));
172+
list.Clear();
173+
174+
list.Add(new NameValuePair("name1", "first"));
175+
list.Add(new NameValuePair("name2", "first"));
176+
scValue = XmlConversionUtil.ConvertObjectToXml(list);
177+
from.SourceControlData.Add(new NameValuePair("sc1", scValue));
178+
list.Clear();
179+
180+
List<ISourceControl> sourceControls = new List<ISourceControl>();
181+
sourceControls.Add(new MockSourceControl());
182+
sourceControls.Add(new MockSourceControl());
183+
184+
MultiSourceControl multiSourceControl = new MultiSourceControl();
185+
multiSourceControl.SourceControls = sourceControls.ToArray();
186+
187+
//// EXECUTE
188+
ArrayList returnedMods = new ArrayList(multiSourceControl.GetModifications(from, to));
189+
190+
//// VERIFY
191+
Assert.AreEqual(from.SourceControlData.Count, to.SourceControlData.Count, "SourceControlData.Count");
192+
193+
list.Add(new NameValuePair("name0", "first"));
194+
Assert.AreEqual(XmlConversionUtil.ConvertObjectToXml(list), to.SourceControlData[0].Value, "SourceControlData[0].Value");
195+
list.Clear();
196+
Assert.AreEqual("sc0", to.SourceControlData[0].Name, "SourceControlData[0].Name");
197+
198+
list.Add(new NameValuePair("name1", "first"));
199+
Assert.AreEqual(XmlConversionUtil.ConvertObjectToXml(list), to.SourceControlData[1].Value, "SourceControlData[1].Value");
200+
list.Clear();
201+
Assert.AreEqual("sc1", to.SourceControlData[1].Name, "SourceControlData[1].Name");
202+
}
139203

140204
[Test]
141205
public void IfRequireChangesFromAllTrueAndAllSourceControlHasModificationsThenReturnMods()

project/core/sourcecontrol/MultiSourceControl.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.Collections.Generic;
22
using Exortech.NetReflector;
33
using ThoughtWorks.CruiseControl.Core.Tasks;
4+
using ThoughtWorks.CruiseControl.Remote;
45
using ThoughtWorks.CruiseControl.Remote.Parameters;
56
using System.Xml;
67

@@ -115,10 +116,23 @@ public ISourceControl[] SourceControls
115116
/// <remarks></remarks>
116117
public override Modification[] GetModifications(IIntegrationResult from, IIntegrationResult to)
117118
{
119+
List<NameValuePair> originalSourceControlData = new List<NameValuePair>();
120+
List<NameValuePair> finalSourceControlData = new List<NameValuePair>();
121+
originalSourceControlData.AddRange(from.SourceControlData);
122+
118123
var modificationSet = new Dictionary<Modification, bool>();
124+
int sourceControlDataIndex = 0;
119125
foreach (ISourceControl sourceControl in SourceControls)
120126
{
127+
from.SourceControlData.Clear();
128+
if (sourceControlDataIndex < originalSourceControlData.Count)
129+
from.SourceControlData.AddRange((List<NameValuePair>)(XmlConversionUtil.ConvertXmlToObject(from.SourceControlData.GetType(), originalSourceControlData[sourceControlDataIndex].Value)));
130+
to.SourceControlData.Clear();
131+
121132
Modification[] mods = sourceControl.GetModifications(from, to);
133+
134+
finalSourceControlData.Add(new NameValuePair(string.Format("sc{0:d}", sourceControlDataIndex), XmlConversionUtil.ConvertObjectToXml(to.SourceControlData)));
135+
122136
if (mods != null && mods.Length > 0)
123137
{
124138
foreach (var mod in mods)
@@ -131,8 +145,13 @@ public override Modification[] GetModifications(IIntegrationResult from, IIntegr
131145
modificationSet.Clear();
132146
break;
133147
}
148+
149+
sourceControlDataIndex++;
134150
}
135151

152+
to.SourceControlData.Clear();
153+
to.SourceControlData.AddRange(finalSourceControlData);
154+
136155
var modArray = new Modification[modificationSet.Count];
137156
modificationSet.Keys.CopyTo(modArray, 0);
138157
return modArray;

0 commit comments

Comments
 (0)