So it's a nice little bit of code to connect to tfs, get the changes and then pull the names in from active directory with a max of 1 attempt per distinct userID.
//imports:
//Microsoft.TeamFoundation.Client
//Microsoft.TeamFoundation.VersionControl.Client
//System.DirectoryServices
void Main()
{
Uri tfs08Uri= new Uri("http://tfs.yourtfs.com:8080"); //TODO:this will be specific to your query
using(var tfsPc=new TfsTeamProjectCollection(tfs08Uri))
{
var vcs=tfsPc.GetService<Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer>();
var gtpm=vcs.GetItem("$/yourServerPath"); //TODO:this will be specific to your query
var pendings=vcs.QueryPendingSets(new[]{gtpm.ServerItem}, RecursionType.Full,null,null);
var pendingQuery=pendings.Where(p=>p.PendingChanges
.Any(pc=>pc.CreationDate>DateTime.Today.AddMonths(-2)))
.OrderByDescending(p=>p.PendingChanges.Max(d=>d.CreationDate));
var q= from pq in pendingQuery
from pc in pq.PendingChanges
where pc.FileName.EndsWith(".refresh")==false
select new{pq.OwnerName,pq.Computer,pc.ServerItem,pc.CreationDate,pc.FileName};
var users=q.Select(u=>u.OwnerName).Distinct();
var joinedQuery= from pc in q
join l in lookup(users).ToList() on pc.OwnerName equals l.Key into luLeft
from lu in luLeft.DefaultIfEmpty()
select new {Name=lu.Value??pc.OwnerName,pc.FileName,pc.ServerItem,pc.CreationDate,pc.Computer,pc.OwnerName};
joinedQuery.Dump();
}
}
public static IEnumerable<KeyValuePair<string,string>> lookup(IEnumerable<string> ids)
{
using(var de=new System.DirectoryServices.DirectoryEntry())
{
var customPath="LDAP://DC=corp,DC=yourdomain,DC=com"; //TODO:this will be specific to your ActiveDirectory
de.Path=customPath;
de.AuthenticationType= System.DirectoryServices.AuthenticationTypes.Secure;
using(var deSearch=new System.DirectoryServices.DirectorySearcher())
{
deSearch.SearchRoot=de;
var found=new Dictionary<string,string>( StringComparer.CurrentCultureIgnoreCase);
foreach(var ownerName in ids)
{
if(found.ContainsKey(ownerName))
yield return found.First(k=>k.Key==ownerName);
deSearch.Filter="(&(objectClass=user)(SAMAccountName="+ownerName+"))";
string value;
try
{
var me=deSearch.FindOne();
value= me.Properties["name"][0].ToString();
//value.Dump();
}
catch(Exception)
{
value= null;
}
found.Add(ownerName,value);
yield return new KeyValuePair<string,string>(ownerName,value);
}
}
}
}
//references:
//%windir%\Microsoft.Net\Framework\v4.0.30319\System.DirectoryServices.dll
//%ProgramFiles%\Microsoft Visual Studio 10.0\Common7\IDE\ReferenceAssemblies\v2.0\Microsoft.TeamFoundation.Common.dll
//%ProgramFiles%\Microsoft Visual Studio 10.0\Common7\IDE\ReferenceAssemblies\v2.0\Microsoft.TeamFoundation.Client.dll
//%ProgramFiles%\Microsoft Visual Studio 10.0\Common7\IDE\ReferenceAssemblies\v2.0\Microsoft.TeamFoundation.VersionControl.Common.dll
//%ProgramFiles%\Microsoft Visual Studio 10.0\Common7\IDE\ReferenceAssemblies\v2.0\Microsoft.TeamFoundation.VersionControl.Client.dll
Done in LinqPad
Extra snippets/remnants leftover for anyone interested:
//var exclusionList=new [] {"*.suo","*.gpstate","svn","_svn",".svn","*Resharper*"};
// vcs.GetItems("$/yourServerSpec/*.suo/", Microsoft.TeamFoundation.VersionControl.Client.RecursionType.Full).Items //TODO: this will be specific to your query
// .Select(i=>i.ServerItem).Distinct().Dump();
//var workspaces=vcs.QueryWorkspaces(null,null,null).Where(w=>w.IsLocal==false & w.LastAccessDate>DateTime.Now.AddDays(-15)).Where(w=>w.Folders.Any(f=> f.ServerItem.StartsWith("$/PST")));
//workspaces.OrderByDescending(w=>w.LastAccessDate).Dump(1);
// var checkins=vcs.GetBranchHistory(new ItemSpec[]{new ItemSpec( gtpm.ServerItem, RecursionType.Full)},VersionSpec.Latest);
// checkins.Count().Dump();

Great !
ReplyDeleteHow use LinqPad using TeamFoundationClient?
Who are Gurus about TFS now ? Eugene , Richard Berg, Tarun Arora, ... not updates in his blogs :'(
IMHO, the more complete unit test like this:
Create Team Project
Create WorkSpace
Mapping local folder for Workspace
Include files in Source Control (in those Workspace and TeamProject)
Check Out file
Check In file
Create Branch
View History
Merge
View History (Branchs, Merges, Changes..)
Delete Branch
Delete Mappings
Delete WorkSpace
Delete Team Project