In diesem Beispiel wollen wir eine Custom Checkin Policy erstellen die prüft, ob beim Checkin ein Kommentar min einer bestimmten Mindestlänge angegeben wurde. Es gibt ja bereits mit den Powertools eine Policy die prüft, ob überhaupt ein Kommentar angegeben wurde, aber wir wollen auch zu einem gewissen Maße prüfen, ob der Kommentar auch sinnvoll ist indem wir eine Mindestlänge erwarten. Zur Erstellung dieser Policy gehen wir als folgendermaßen vor:
1.) Wir erstellen ein neues ClassLibrary Projekt in Visual Studio
2.) Wir fügen eine Referenz zur Microsoft.Teafoundation.VersionControl.Client.dll hinzu. Diese findet man unter ReferenceAssemblies im VS DIE Ordner, also z.B. C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ReferenceAssemblies\v2.0\Microsoft.TeamFoundation.VersionControl.Client.dll
3.) Wir leiten unsere Klasse von PolicyBase ab und lassen Stubs generieren. Der Zwischenstand sieht dann so aus:
![clip_image002[4] clip_image002[4]](http://www.artiso.com/ProBlog/content/binary/Windows-Live-Writer/7f6e31deaad6_2D6/clip_image002%5B4%5D_thumb.jpg)
4.) Wir setzen nun die Properties mit entsprechenden Werten, z.B.
public override string Description
{
get
{
return "Will check if the checkin comment is at least 10 letters long.";
}
}
public override bool Edit(IPolicyEditArgs policyEditArgs)
{
return true;
}
public override PolicyFailure[] Evaluate()
{
throw new NotImplementedException();
}
public override string Type
{
get
{
return "Changeset Comments Length Policy";
}
}
public override string TypeDescription
{
get
{
return "This policy will require users to provide checkin comments of a minimum length.";
}
}
Wichtig sind hier vor allem Type und Type Description da diese bei der Auswahl der Policy angezeigt werden.
5.) Nun wollen wir die Evaluate-Methode implementieren. Diese wird vor dem Checkin ausgeführt und liefert mögliche Verletzungen der Policy zurück. Nur wenn keine Verletzungen gemeldet werden, wird der Checkin ausgeführt. Da wir hier den Checkin Comment prüfen wollen, brauchen wir Zugriff auf das Changeset. Dazu brauchen wir zuerst ein Feld das den Checkin enthält:
private IPendingCheckin currentPendingCheckin;
6.) Nun überschreiben wir die Initialize-Methode und setzen hier unser currentPendingCheckin:
public override void Initialize(IPendingCheckin pendingCheckin)
{
base.Initialize(pendingCheckin);
currentPendingCheckin = pendingCheckin;
}
7.) Anschließend implementieren wir unsere Validierungslogik in der Evaluate-Methode:
public override PolicyFailure[] Evaluate()
{
var failures = new List<PolicyFailure>();
if (currentPendingCheckin.PendingChanges.Comment.Length < 10)
{
failures.Add(new PolicyFailure("Checkin Comment is too short, at least 10 letters are required", this));
}
return failures.ToArray();
}
8.) Dann folgt noch ein wichtiger Schritt, wir müssen die Klasse serialisierbar machen
[Serializable]
public class CheckinCommentLengthPolicy : PolicyBase
9.) Nun kompilieren wir die Solution und kopieren die DLL in einen lokalen Ordner. Anschließend tragen wir in der Registry unter „HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\10.0\TeamFoundation\SourceControl\Checkin Policies“ einen neuen String Value ein dem wir den Pfad zu unserer Assembly übergeben. Der angegebene Pfad in der Registry ist dabei für x64 Systeme angegeben. Bei c86 Systemen lautet der passende Pfad „HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\TeamFoundation\SourceControl\Checkin Policies“.
![clip_image004[4] clip_image004[4]](http://www.artiso.com/ProBlog/content/binary/Windows-Live-Writer/7f6e31deaad6_2D6/clip_image004%5B4%5D_thumb.jpg)
10.) Nun starten wir Visual Studio neu und aktivieren die neue Checkin Policy. Dazu klicken wir im Team-Explorer mit der rechten Maustaste auf das Team-Projekt dann unter Team Project Settings / Source Control und dort wechseln wir dann auf den Reiter „Check-in Policy“. Über den Button Add können wir unsere Policy auswählen und hinzufügen.
![clip_image006[4] clip_image006[4]](http://www.artiso.com/ProBlog/content/binary/Windows-Live-Writer/7f6e31deaad6_2D6/clip_image006%5B4%5D_thumb.jpg)
11.) Nun können wir einen Eincheckvorgang vornehmen und wir werden sehen, wenn wir einen leere checkin Comment angeben oder einen zu kurzen, erhalten wir eine Meldung.
![clip_image008[4] clip_image008[4]](http://www.artiso.com/ProBlog/content/binary/Windows-Live-Writer/7f6e31deaad6_2D6/clip_image008%5B4%5D_thumb.jpg)
Nun wollen wir die Anzahl der Mindestzeichen noch konfigurierbar machen. Dazu erweitern wir unsere Policy.
1.) Zunächst fügen wir einen Winforms-Dialog hinzu der für die Eingabe des Wertes dient.
![clip_image010[4] clip_image010[4]](http://www.artiso.com/ProBlog/content/binary/Windows-Live-Writer/7f6e31deaad6_2D6/clip_image010%5B4%5D_thumb.jpg)
2.) Im Code definieren wir ein public field über das wir die Anzahl übergeben bzw. auslesen können.
public partial class CheckinCommentLengthConfigDialog : Form
{
public int MinimumCommentLength;
public CheckinCommentLengthConfigDialog()
{
InitializeComponent();
}
private void btnOK_Click(object sender, EventArgs e)
{
MinimumCommentLength = (int)this.numericUpDown1.Value;
}
private void CheckinCommentLengthConfigDialog_Load(object sender, EventArgs e)
{
this.numericUpDown1.Value = MinimumCommentLength;
}
}
3.) Im Code unserer Policy fügen wir ein private field hinzu in dem wir den Wert speichern können und verwenden diesen in unserer Evaluate Methode. Zusätzlich geben wir im Property CanEdit den Wert true zurück. Und wir implementieren die Edit-Methode so, dass hier unser Formular aufgerufen wird:
public override bool Edit(IPolicyEditArgs policyEditArgs)
{
using (CheckinCommentLengthConfigDialog dialog = new CheckinCommentLengthConfigDialog())
{
dialog.MinimumCommentLength = minimumCommentLength;
if (dialog.ShowDialog() == DialogResult.OK)
{
minimumCommentLength = dialog.MinimumCommentLength;
return true;
}
return false;
}
}
public override bool CanEdit
{
get
{
return true;
}
}
4.) Nach dem Kompilieren können wir dann die DLL an den Ort kopieren den wir in der Registry eingetragen haben (bei mir c:\temp). Damit diese Date überschrieben werden kann, müssen wir Visual Studio beenden. Nun können wir für unsere Policy den Edit-Dialog aufrufen:
![clip_image012[4] clip_image012[4]](http://www.artiso.com/ProBlog/content/binary/Windows-Live-Writer/7f6e31deaad6_2D6/clip_image012%5B4%5D_thumb.jpg)
Nun wollen wir das Deployment unserer Policy nov vereinfachen. Aktuell wäre es so, dass auf jedem Rechner auf dem die Policy geprüft werden soll die DLL kopiert und der entsprechende Registry-Eintrag vorgenommen werden muss. Das ist natürlich nicht besonders elegant. Wir müssen die Policy zwar auf jedem Rechner installieren, da sonst die Policy immer als verletzt gilt, aber die Installation können wir durch den Einsatz von VSIX deutlich einfacher machen.
1.) Zunächst müssen wir das Visual Studio SDK herunterladen und installieren. Der Download für die SP1-Version befindet sich unter http://www.microsoft.com/downloads/en/details.aspx?FamilyID=21307C23-F0FF-4EF2-A0A4-DCA54DDB1E21
2.) Dann fügen wir ein neues Projekt zu unserer Solution hinzu und wählen die Vorlage VSIX Project
![clip_image014[4] clip_image014[4]](http://www.artiso.com/ProBlog/content/binary/Windows-Live-Writer/7f6e31deaad6_2D6/clip_image014%5B4%5D_thumb.jpg)
3.) Im Manifest des VSIX Projektes tragen wir nun die entsprechenden Werte ein und fügen unser Policy-Projekt als MEF Component im Bereich Content hinzu.
![clip_image016[4] clip_image016[4]](http://www.artiso.com/ProBlog/content/binary/Windows-Live-Writer/7f6e31deaad6_2D6/clip_image016%5B4%5D_thumb.jpg)
4.) Damit unser Eintrag in der Registry noch hinzugefügt wird, fügen wir noch eine Text-Datei mit dem Namen „Policies.pkgdef“ hinzu und schreiben dort folgenden Inhalt rein:
[$RootKey$\TeamFoundation\SourceControl\Checkin Policies]
"artisoCheckinPolicies"="$PackageFolder$\artisoCheckinPolicies.dll"
5.) Wichtig ist noch, dass wir bei der pkgdef-Datei in den Eigenschaften „Include in VSIX“ auf True stellen.
![clip_image018[4] clip_image018[4]](http://www.artiso.com/ProBlog/content/binary/Windows-Live-Writer/7f6e31deaad6_2D6/clip_image018%5B4%5D_thumb.jpg)
6.) Nun kompilieren wir unsere Solution. Wenn alles fehlerfrei erstellt wird, bereinigen wir zunächst unsere manuellen Einstellungen, d.h. wir entfernen zunächst die Policy auf unserem Team-Projekt. Anschließen löschen wir die DLL und die Registry-Einträge die wir im ersten Teil angelegt haben. Dazu müssen wir zuvor Visual Studio wieder beenden. Nach dem Entfernen sollte die Policy in der Liste der verfügbaren Checkin Policies nicht mehr erscheinen. Aus dem Output unseres Setup-Projektes können wir nun die vsix-Datei starten und die Policy installieren.
![clip_image020[4] clip_image020[4]](http://www.artiso.com/ProBlog/content/binary/Windows-Live-Writer/7f6e31deaad6_2D6/clip_image020%5B4%5D_thumb.jpg)
7.) Danach sollte sich die Policy genauso aktivieren lassen wie zuvor.