CruiseControl.Net is a port of famous CruiseControl – Continuous Intagration Server. In our firm we use remote Visual Source Safe Server via VSSConnect. And I write Sourcecontrol Plugin CruiseControl.Net. This plugin should only “Get Latest Version”
After some googling I found interface ISourceControl.
Here result plugin code:
using System;
using System.Collections.Generic;
using System.Text;
using ThoughtWorks.CruiseControl.Core;
using ThoughtWorks.CruiseControl.Core.Util;
using Exortech.NetReflector;
using System.Diagnostics;
using System.IO;
using log4net;
using log4net.Core;
namespace ThoughtWorks.CruiseControl.vssprovider {
[ReflectorType("VSSConnectPlugin")]
public class VSSConnectPlugin : ISourceControl {
private readonly ILog logger = LogManager.GetLogger(typeof(MyVssPlugin));
#region public members
[ReflectorProperty("args", Required = true)]
public string Arguments {
get {
return _arguments;
}
set {
_arguments = value;
}
}
[ReflectorProperty("vsslog", Required = true)]
public string VSSLogFile {
get {
return _vsslogFileName;
}
set {
_vsslogFileName = value;
}
}
#endregion
#region private members
string _arguments = "";
string _vsslogFileName = "";
#endregion
#region ISourceControl Members
/// Get Modification from vcs. because vssconnect command line doesn't
/// support this function, get code
public Modification[] GetModifications(IIntegrationResult from, IIntegrationResult to) {
Modification[] modificationArray = null;
try {
ProcessStartInfo processStartInfo = new ProcessStartInfo("vssc", Arguments);
processStartInfo.RedirectStandardOutput = true;
processStartInfo.UseShellExecute = false;
Process process = new Process();
process.StartInfo = processStartInfo;
process.Start();
StreamReader streamReader = process.StandardOutput;
string resultString = streamReader.ReadToEnd();
return vssoutputparser.Parse(resultString);
}
catch {
if (((IntegrationResult)to).BuildCondition !=
ThoughtWorks.CruiseControl.Remote.BuildCondition.ForceBuild) {
((IntegrationResult)to).BuildCondition =
ThoughtWorks.CruiseControl.Remote.BuildCondition.NoBuild;
((IntegrationResult)from).BuildCondition =
ThoughtWorks.CruiseControl.Remote.BuildCondition.NoBuild;
}
modificationArray = new Modification[0];
}
return modificationArray;
}
public void GetSource(IIntegrationResult result) {
}
public void Initialize(IProject project) {
}
public void LabelSourceControl(IIntegrationResult result) {
}
public void Purge(IProject project) {
}
#endregion
}
}
using System;
using System.Collections.Generic;
using System.Text;
using ThoughtWorks.CruiseControl.Core;
using ThoughtWorks.CruiseControl.Core.Util;
namespace ThoughtWorks.CruiseControl.vssprovider {
public class vssoutputparser {
public static Modification[] Parse(string inStr) {
List listOfModifiedFile = new List();
string[] strArray = inStr.Split(new char[] { '\n', '\r' },
StringSplitOptions.RemoveEmptyEntries);
foreach (string str in strArray) {
if (str.ToUpper().Contains("Replacing".ToUpper())) {
string fname = str.ToUpper().Replace("Replacing".ToUpper(), "").Trim();
listOfModifiedFile.Add(fname);
}
}
Modification[] modificationArray = new Modification[listOfModifiedFile.Count];
for (int i = 0; i < modificationArray.Length; i++) {
modificationArray[i] = new Modification();
int slashPosition = listOfModifiedFile[i].LastIndexOf("\\");
if (slashPosition != -1) {
modificationArray[i].FileName =
listOfModifiedFile[i].Substring(slashPosition + 1,
listOfModifiedFile[i].Length - slashPosition - 1);
modificationArray[i].FolderName =
listOfModifiedFile[i].Substring(0, slashPosition + 1);
}
else {
modificationArray[i].FileName = listOfModifiedFile[i];
modificationArray[i].FolderName = "";
}
modificationArray[i].ChangeNumber = 0;
modificationArray[i].Type = "modified";
modificationArray[i].Version = "0";
}
return modificationArray;
}
}
}
using in cruisecontrol config file
<sourcecontrol type="VSSConnectPlugin">
<args>/s:ghttp://XX.XXX.XX.XXX:XXXX/lpath:XXXXXXXXXXXXXXXX
/cmd:getproject /user:"XXXXXXXXXX" /pw:XXXXXXXXX/sspath:$/XXXXXXXXXr</args>
<vsslog>XXXXXXXXXXX</vsslog>
</sourcecontrol>