Work Item’ların eski hallerine ulaşmak

Herhangi bir WI’ın History alanına bakarak her türlü tarihsel bilgiye ulaşmak tabii ki mümkün, ne değişmiş nasıl değişmiş hepsi yazıyor. Ama bunlar alan alan yazıyor. Şöyle derli toplu görsek bir arada desen yok. Sağlamasını yapar gibi elle toplamak lazım. Halbüsü kaynak kod kontrolü altındaki dosyalara yaptığımız gibi “Get Specific…” deyip tarih verebilsek ne güzel olacak değil mi?

Her ne kadar bunun yutmaya hazır çiğnenmiş bir lokması olmasa da biraz kod yazmaya razı olanlar için bir çözüm var. Ewald Hoffman adında bir muhterem bunu anlatmış. Ben de aşağıda dilim döndüğünce Türkçeleştirmeye çalıştım. Bir de TFS 2010 a uyarlamak için 1-2 satır değiştirdim.

Adım1: Team Explorer’dan “Add Query” komutu ile yeni bir Work Item sorgusu oluşturup koşulları, kolonları istediğimiz gibi ayarlıyoruz.

Adım2: Bu sorguyu sunuya kaydetmek yerine “Save As…” diyerekten bir dosyaya kaydediyoruz.

Adım3: Kaydettiğimiz sorgu dosyasını notepad ile açarak içinden sorgu metnini aynen alıyoruz.

Adım4: Visual Studio açıp yeni bir c# konsol uygulaması oluşturuyoruz.

Adım5: Program.cs dosyasını aşağıdaki gibi değiştiriyoruz.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.WorkItemTracking.Client;
using System.Net;
using System.Windows.Forms;

namespace WIT_TimeTravel
{
class Program
{
[STAThread()]
static void Main(string[] args)
{
StringBuilder clipboardText = new StringBuilder();
bool titlesPrinted = false;

string tfsServer = @”http://myServer:8080/tfs”;
Uri tfsServerUri = new Uri(tfsServer);
string queryText = @”SELECT [System.Id], [System.WorkItemType], [System.Title], [System.AssignedTo], [System.State], [System.CreatedDate], [System.ChangedDate]
FROM WorkItems
WHERE [System.TeamProject] = ‘BudgetRight’
AND  [System.AssignedTo] = ‘EMRE TOPTANCI’
ORDER BY [System.ChangedDate] desc
ASOF ’08/07/2010′”; // Eski kayıtlara ulaşmamızı sağlayan satır burası

using (var tfs = new TfsTeamProjectCollection(tfsServerUri, CredentialCache.DefaultCredentials))
{
var store = (WorkItemStore)tfs.GetService(typeof(WorkItemStore));
var wiCollection = store.Query(queryText);
foreach (WorkItem wi in wiCollection)
{
if (!titlesPrinted)
{
titlesPrinted = true;
foreach (FieldDefinition field in wiCollection.DisplayFields)
{
clipboardText.Append(field.Name);
clipboardText.Append(“\t”);
}
clipboardText.AppendLine();
}
foreach (FieldDefinition field in wiCollection.DisplayFields)
{
clipboardText.Append(wi.Fields[field.Name].Value);
clipboardText.Append(“\t”);
}
clipboardText.AppendLine();
}
}
if (clipboardText.Length > 0)
{
Clipboard.SetText(clipboardText.ToString(), TextDataFormat.Text);
MessageBox.Show(“Sonuçlar clipboard’a kopyalandı”);
}
else
{
MessageBox.Show(“Sorgudan sonuç dönmedi”);
}

}
}
}

Adım6: Derleyicinin şarlamalarını düzeltmek için şu 4 referansı projemize ekliyoruz.

  1. Microsoft.TeamFoundation.Client
  2. Microsoft.TeamFoundation.Common
  3. Microsoft.TeamFoundation.WorkItemTracking.Client
  4. System.Windows.Forms

Adım7: Bu kodun içerisindeki sunucu adını kendi sunucumuz ile değiştiriyoruz. Sorgu metnini dosyadan aldığımız sorgu ile değiştiriyoruz. En sonundaki ASOF ifadesine dikkat ediyoruz, zira WI’ların eski hallerine ulaşmamızı sağlayan kilit nokta orası.

Adım8: Derleyip çalıştırıyoruz.

Hiçbir aksilik olmazsa program çalışıp, istediğimiz sorgunun belirtilen tarihe ait sonuçlarını clipboard’a yerleştiriyor. Daha sonra artık Excel’e mi yapıştırırsınız, notepad’e mi, o sizin bileceğiniz iş…

Tabii ki bu sadece verinin çekilmesini gösteren bir örnek ama bu örneğe dayanak kullanışlı araçlar üretilebilir.

e-mre

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.WorkItemTracking.Client;
using System.Net;
using System.Windows.Forms;namespace WIT_TimeTravel
{
class Program
{
[STAThread()]
static void Main(string[] args)
{
StringBuilder clipboardText = new StringBuilder();
bool titlesPrinted = false;

string tfsServer = @”http://tfs.anadolu.corp:8080/tfs”;
Uri tfsServerUri = new Uri(tfsServer);
string queryText = @”SELECT [System.Id], [System.WorkItemType], [System.Title], [System.AssignedTo], [System.State], [System.CreatedDate], [System.ChangedDate]
FROM WorkItems
WHERE [System.TeamProject] = ‘BudgetRight’
AND  [System.WorkItemType] = ‘Review’
AND  [System.State] <> ”
AND  [System.AssignedTo] = ‘EMRE TOPTANCI’
ORDER BY [System.ChangedDate] desc
ASOF ’08/07/2010′”; // Eski kayıtlara ulaşmamızı sağlayan satır burası

using (var tfs = new TfsTeamProjectCollection(tfsServerUri, CredentialCache.DefaultCredentials))
{
var store = (WorkItemStore)tfs.GetService(typeof(WorkItemStore));
var wiCollection = store.Query(queryText);
foreach (WorkItem wi in wiCollection)
{
if (!titlesPrinted)
{
titlesPrinted = true;
foreach (FieldDefinition field in wiCollection.DisplayFields)
{
clipboardText.Append(field.Name);
clipboardText.Append(“\t”);
}
clipboardText.AppendLine();
}
foreach (FieldDefinition field in wiCollection.DisplayFields)
{
clipboardText.Append(wi.Fields[field.Name].Value);
clipboardText.Append(“\t”);
}
clipboardText.AppendLine();
}
}
if (clipboardText.Length > 0)
{
Clipboard.SetText(clipboardText.ToString(), TextDataFormat.Text);
MessageBox.Show(“Sonuçlar clipboard’a kopyalandı”);
}
else
{
MessageBox.Show(“Sorgudan sonuç dönmedi”);
}

}
}
}

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s