Have you ever worked on a team where a developer went on vacation without checking in an important change? Ever known someone that kept a file checked out over multiple days (or weeks) and lost their work because of hard drive (or other) failure? Having seen the effect of such mishaps, I decided to implement a simple utility that will automatically shelve each developer's check outs to the Team Foundation Server.
If you are not familiar with shelving, it's a feature in TFS that will store pending changes on the server without checking them in. Shelving is very useful in many scenerios, but it is especially useful to me for prevention and insurance.
The utility is a dead simple console application that is configured to run as a log off script on each developer's computer. You could also configure it as a scheduled task. It connects to the TFS server, determines what the user has checked out on that computer and shelves the changes on the server. The full utility is available on CodePlex here, but I thought some of you might find it useful to see the essential shelving code.
string tfsServer = "tfs.contoso.com";
string shelfSetName = "AutoShelve";
// Connect to the Team Foundation Server
TeamFoundationServer tfs = TeamFoundationServerFactory.GetServer(tfsServer);
// Get the Version Control Server
VersionControlServer vcs = (VersionControlServer)tfs.GetService(typeof(VersionControlServer));
// Get the list of workspaces for the current user
Workspace[] workspaces = vcs.QueryWorkspaces(
null,
tfs.AuthenticatedUserName,
null);
// Enumerate each workspace and
// determine if there are any pending changes
foreach (Workspace ws in workspaces)
{
// You can only shelve what is on this computer!
if (System.Environment.MachineName.ToUpper(CultureInfo.InvariantCulture) != ws.Computer.ToUpper(CultureInfo.InvariantCulture))
{
// Continue to next workspace
continue;
}
// Get the changes in this workspace
PendingChange[] changes = ws.GetPendingChanges();
// If there are any pending changes,
// shelve them
if (changes.Length > 0)
{
// Create a shelveset
Shelveset set = new Shelveset(
vcs,
shelfSetName,
tfs.AuthenticatedUserName);
// Shelve the changes
ws.Shelve(
set,
changes,
ShelvingOptions.Replace);
}
}
TFS AutoShelve is a very simple utlity that is quite powerful in practice--especially the first time it saves your backside.