<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;D0IEQnwyfip7ImA9WxNUFkg.&quot;"><id>tag:blogger.com,1999:blog-26229238</id><updated>2009-11-07T20:45:03.296-08:00</updated><title>Team Foundation Server observations bucket</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://teamfoundation.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://teamfoundation.blogspot.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>eugenez</name><uri>http://www.blogger.com/profile/09637949643994709456</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>167</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/teamfoundation" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry gd:etag="W/&quot;DkEMRX0zfCp7ImA9WxNUFUo.&quot;"><id>tag:blogger.com,1999:blog-26229238.post-3064308430542047168</id><published>2009-11-06T22:18:00.001-08:00</published><updated>2009-11-06T22:18:04.384-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-06T22:18:04.384-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="VS2008" /><category scheme="http://www.blogger.com/atom/ns#" term="code analysis" /><category scheme="http://www.blogger.com/atom/ns#" term="check-in policy" /><category scheme="http://www.blogger.com/atom/ns#" term="TFS2008" /><title>StyleCop checkin policy updated for StyleCop 4.3.2.1</title><content type="html">&lt;p&gt;StyleCop check-in policy was updated for the &lt;a href="http://code.msdn.microsoft.com/sourceanalysis/Release/ProjectReleases.aspx?ReleaseId=1425"&gt;latest build of StyleCop available (&lt;strong&gt;4.3.2.1&lt;/strong&gt;)&lt;/a&gt;. The only change in this drop is newer StyleCop reference assemblies.  &lt;p&gt;Version 1.2.2 of the policy is available as &lt;a href="http://www.attrice.info/downloads/StyleCopCheckinPolicy_1.2.2.msi"&gt;&lt;strong&gt;MSI installer&lt;/strong&gt;&lt;/a&gt; (available &lt;strong&gt;AS IS&lt;/strong&gt;).  &lt;p&gt;&lt;strong&gt;Related posts:&lt;/strong&gt;&lt;br&gt;- &lt;a href="http://teamfoundation.blogspot.com/2009/07/updated-stylecop-checkin-policy-v121.html"&gt;Updated StyleCop Checkin Policy (v1.2.1&lt;/a&gt;)&lt;br&gt;- &lt;a href="http://teamfoundation.blogspot.com/2008/10/stylecop-43-checkin-policy-version-12.html"&gt;StyleCop 4.3 Checkin Policy version 1.2&lt;/a&gt;&lt;br&gt;- &lt;a href="http://teamfoundation.blogspot.com/2008/09/stylecop-43-checkin-policy-available.html"&gt;StyleCop 4.3 Checkin Policy available&lt;/a&gt;&lt;br&gt;- &lt;a href="http://teamfoundation.blogspot.com/2008/08/get-new-version-of-stylecop-while-it-is.html"&gt;Get New Version Of StyleCop&lt;/a&gt;&lt;br&gt;- &lt;a href="http://teamfoundation.blogspot.com/2008/07/stylecop-confusion-cleared.html"&gt;StyleCop Confusion Cleared&lt;/a&gt;&lt;br&gt;- &lt;a href="http://teamfoundation.blogspot.com/2008/05/source-analysis-for-c-checkin-policy.html"&gt;Source Analysis For C# Checkin Policy&lt;/a&gt;&lt;br&gt;- &lt;a href="http://teamfoundation.blogspot.com/2008/06/source-analysis-for-c-custom-rules-and.html"&gt;Source Analysis For C#: Custom Rules And More&lt;/a&gt;&lt;br&gt;- &lt;a href="http://teamfoundation.blogspot.com/2008/05/beautify-your-c-code-with-microsoft.html"&gt;Beautify Your Code With Microsoft Source Analysis&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26229238-3064308430542047168?l=teamfoundation.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/teamfoundation/~4/rYHsqnhLj4U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://teamfoundation.blogspot.com/feeds/3064308430542047168/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=26229238&amp;postID=3064308430542047168" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/3064308430542047168?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/3064308430542047168?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/teamfoundation/~3/rYHsqnhLj4U/stylecop-checkin-policy-updated-for.html" title="StyleCop checkin policy updated for StyleCop 4.3.2.1" /><author><name>eugenez</name><uri>http://www.blogger.com/profile/09637949643994709456</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04453434800404773243" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://teamfoundation.blogspot.com/2009/11/stylecop-checkin-policy-updated-for.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8HQ3Y-cSp7ImA9WxNTFEQ.&quot;"><id>tag:blogger.com,1999:blog-26229238.post-2330902410250662739</id><published>2009-08-17T00:07:00.001-07:00</published><updated>2009-08-17T00:07:12.859-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-17T00:07:12.859-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="VS2008" /><category scheme="http://www.blogger.com/atom/ns#" term="check-in policy" /><category scheme="http://www.blogger.com/atom/ns#" term="TFS2008" /><title>Disposing of checkin policy</title><content type="html">&lt;p&gt;Recently while I was fixing up &lt;a href="http://teamfoundation.blogspot.com/2009/07/updated-stylecop-checkin-policy-v121.html" target="_blank"&gt;&lt;strong&gt;StyleCop checkin policy&lt;/strong&gt;&lt;/a&gt;, I came across one small not-so-obvious snippet of knowledge worthwhile to share. &lt;/p&gt; &lt;p&gt;Any custom checkin policy inherits from &lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.teamfoundation.versioncontrol.client.policybase(VS.80).aspx" target="_blank"&gt;PolicyBase&lt;/a&gt;&lt;/strong&gt;, which in turn implements &lt;strong&gt;IDisposable&lt;/strong&gt;. Meaning – if you need to clean up after yourself in your custom policy, &lt;strong&gt;Dispose&lt;/strong&gt; method is the place for that.&lt;/p&gt; &lt;p&gt;So in StyleCop policy, I do a lot of Visual Studio related stuff and thus I thought I’d dispose of VS extensibility objects in Dispose method.&lt;/p&gt; &lt;p&gt;And here where non-obvious stuff starts. The policy is loaded in either of those cases:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Project Source Control configuration (through menu Team-&amp;gt;Team Project Settings-&amp;gt;Source Control)&lt;/li&gt; &lt;li&gt;Right-clicking in Solution Explorer and invoking “Check In…” menu&lt;/li&gt; &lt;li&gt;Invoking “View Pending Changes” toolwindow &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;While the first case is not very interesting (no pending changes will be evaluated in configuration), two other cases are important. &lt;/p&gt; &lt;p&gt;In case of “Check In …”, “Check In” modal window is displayed (the policy is loaded), and when window is closed, custom policy class is unloaded and Dispose called. However, in case of “View Pending Changes” toolwindow the policy is loaded once when window is first created, and Dispose will be called only when Visual Studio is closed or TFS server connection is closed. That means you probably should not hold on any expensive resources until Dispose.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26229238-2330902410250662739?l=teamfoundation.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/teamfoundation/~4/H7vXjWRwE88" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://teamfoundation.blogspot.com/feeds/2330902410250662739/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=26229238&amp;postID=2330902410250662739" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/2330902410250662739?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/2330902410250662739?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/teamfoundation/~3/H7vXjWRwE88/disposing-of-checkin-policy.html" title="Disposing of checkin policy" /><author><name>eugenez</name><uri>http://www.blogger.com/profile/09637949643994709456</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04453434800404773243" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://teamfoundation.blogspot.com/2009/08/disposing-of-checkin-policy.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMDSXY9eCp7ImA9WxNTEEs.&quot;"><id>tag:blogger.com,1999:blog-26229238.post-9092473057671236629</id><published>2009-08-12T00:51:00.001-07:00</published><updated>2009-08-12T00:51:18.860-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-12T00:51:18.860-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="CodePlex" /><category scheme="http://www.blogger.com/atom/ns#" term="VS2008" /><category scheme="http://www.blogger.com/atom/ns#" term="check-in policy" /><category scheme="http://www.blogger.com/atom/ns#" term="TFS" /><category scheme="http://www.blogger.com/atom/ns#" term="TFS2008" /><title>New check-in policy for VSS fans: keywords expanded</title><content type="html">&lt;p&gt;One of the much-talked-about missing features of TFS is the keyword expansion feature. You know, the ability to place the template in the beginning of every single file and then have every revision tracked in the body of the file (in addition to tracking in source control history, that is).&lt;/p&gt; &lt;p&gt;Personally, I am not a huge fan of the feature – mostly because the usefulness of the feature limited by the following factors&lt;/p&gt; &lt;ol&gt; &lt;li&gt;The comments to check in still have to be detailed (if the comments are crappy, you get a lot of garbage in the file that adds nothing)  &lt;li&gt;If the file gets branched a lot, the revision history tend to get muddy and not to reflect the branching history very adequately  &lt;li&gt;If the code churn is great, you might get 100 lines of code adorned with 400 lines of revisions history (yes, I actually seen this) &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;So I am of the opinion that all of the above is the function of source control and if your source control is not good enough for tracking history of changes – that ain’t good source control :) However, for some folks ability to have history of changes contained in the same file outweighs the disadvantages. And these folks were pretty vocal, so vocal that &lt;a href="http://blogs.msdn.com/buckh" target="_blank"&gt;Buck Hodges&lt;/a&gt; stopped one stop short of writing actual solution and provided the &lt;a href="http://blogs.msdn.com/buckh/archive/2007/07/07/keyword-expansion-in-tfs.aspx" target="_blank"&gt;verbal recipe&lt;/a&gt; for writing one, using check-in policy as a workaround (since keywords expansion is not making it into official product).&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;And voila! Two years after this post was published, there appears &lt;a href="http://blog.kalmbach-software.de/2009/07/24/tfs-automatically-insert-check-in-comments-into-source-code/" target="_blank"&gt;&lt;strong&gt;TFS keyword expansion checkin&lt;/strong&gt;&lt;/a&gt; policy, written by &lt;a href="http://blog.kalmbach-software.de/" target="_blank"&gt;&lt;strong&gt;Jochen Kalmbach&lt;/strong&gt;&lt;/a&gt;. Jochen also published the policy on &lt;a href="http://www.codeplex.com" target="_blank"&gt;CodePlex&lt;/a&gt; site, under the name of &lt;a href="http://logsubstpol.codeplex.com/" target="_blank"&gt;&lt;strong&gt;LogSubstPol&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;I did a short test drive of the policy, and it does work as advertised, in three simple steps:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Install&lt;/strong&gt; the policy (currently using batch script)  &lt;li&gt;&lt;strong&gt;Add&lt;/strong&gt; the policy to your Team project and &lt;strong&gt;configure&lt;/strong&gt; the format of the keywords string  &lt;li&gt;&lt;strong&gt;Add&amp;nbsp; keyword ($log$ etc.) monikers&lt;/strong&gt; to the file modified prior to check in &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Once all of that done (and steps 1 &amp;amp; 2 are once per project, step 3 once per file step), as you check in you will see the revision history being updated and checked in as part of the file.&lt;/p&gt; &lt;p&gt;While the policy is awesome, there are few things to be aware of. &lt;/p&gt; &lt;ul&gt; &lt;li&gt;As the policy requires you to supply the comment, it effectively replaces “Changeset Comments Policy”, so if you have it defined for Team project you might want to remove it  &lt;li&gt;Configuration dialog for the policy is somewhat complex, so read the documentation first (&lt;a href="http://logsubstpol.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=31345#DownloadId=78619" target="_blank"&gt;supplied PDF&lt;/a&gt; is real good)  &lt;li&gt;If you evaluate the policy but decide not to check in, due to limitations of the checkin policy mechanism the keywords in the file will get expanded anyway  &lt;li&gt;As the files are updated by the policy, VS will display the message “The file has been modified outside of the source editor” (as policy touches it right before check in). That again may be limitation of the checkin policy mechanism for keyword expansion (but perhaps can be mitigated with some creative VSX tweaking) &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;But regardless of these small thingies, the policy is mighty useful and it fills the big gap for those accustomed to keyword expansion. Big kudos to &lt;a href="http://blog.kalmbach-software.de/" target="_blank"&gt;&lt;strong&gt;Jochen&lt;/strong&gt;&lt;/a&gt; for creating the policy!&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/eugenez/archive/2009/08/12/new-check-in-policy-for-vss-fans-keywords-expanded.aspx" target="_blank"&gt;Mirror from MSDN blog&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26229238-9092473057671236629?l=teamfoundation.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/teamfoundation/~4/jfI5trtOI0A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://teamfoundation.blogspot.com/feeds/9092473057671236629/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=26229238&amp;postID=9092473057671236629" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/9092473057671236629?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/9092473057671236629?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/teamfoundation/~3/jfI5trtOI0A/new-check-in-policy-for-vss-fans.html" title="New check-in policy for VSS fans: keywords expanded" /><author><name>eugenez</name><uri>http://www.blogger.com/profile/09637949643994709456</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04453434800404773243" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://teamfoundation.blogspot.com/2009/08/new-check-in-policy-for-vss-fans.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4MRXg8eip7ImA9WxJbFU0.&quot;"><id>tag:blogger.com,1999:blog-26229238.post-2137623964818082691</id><published>2009-07-25T00:29:00.001-07:00</published><updated>2009-07-25T00:29:44.672-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-25T00:29:44.672-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="VS2008" /><category scheme="http://www.blogger.com/atom/ns#" term="code analysis" /><category scheme="http://www.blogger.com/atom/ns#" term="check-in policy" /><category scheme="http://www.blogger.com/atom/ns#" term="StyleCop" /><category scheme="http://www.blogger.com/atom/ns#" term="TFS2008" /><title>Updated StyleCop Checkin Policy (v1.2.1)</title><content type="html">&lt;p&gt;After countless nugdes I have updated StyleCop check-in policy for &lt;a href="http://code.msdn.microsoft.com/sourceanalysis/Release/ProjectReleases.aspx?ReleaseId=1425" target="_blank"&gt;newest build of StyleCop available (&lt;strong&gt;4.3.1.3&lt;/strong&gt;)&lt;/a&gt;. While at it, I was able to incorporate a few bug fixes and add improvements.&lt;/p&gt; &lt;p&gt;Version 1.2.1 of the policy is available as &lt;a href="http://www.attrice.info/downloads/StyleCopCheckinPolicy_1.2.1.msi" target="_blank"&gt;&lt;strong&gt;MSI installer&lt;/strong&gt;&lt;/a&gt; or as &lt;a href="http://www.attrice.info/downloads/StyleCopCheckinPolicy_1.2.1.zip" target="_blank"&gt;&lt;strong&gt;zipped source code&lt;/strong&gt;&lt;/a&gt; (available &lt;strong&gt;AS IS&lt;/strong&gt;).&lt;/p&gt; &lt;p&gt;Bugs fixed are:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Solution containing projects with same Name is not evaluated correctly (keying schema is now by Project VS object instead of Name)  &lt;li&gt;Same file appearing in different projects causes policy exception  &lt;li&gt;C# web site projects are now supported&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;For the last two items, huge thanks to &lt;a href="http://clem-it.blogspot.com/" target="_blank"&gt;&lt;strong&gt;Clement Bouillier&lt;/strong&gt;&lt;/a&gt; for bringing them to my attention.&lt;/p&gt; &lt;p&gt;Additionally, I have added pretty neat feature (in my opinion) to improve the navigation for the errors found by the policy. When policy is evaluated, now any violation found is added both to &lt;strong&gt;Checkin&lt;/strong&gt; dialog and to Visual Studio &lt;strong&gt;Error List&lt;/strong&gt; pane. Thus you can review the violations in the form similar to non-policy StyleCop violations. Additionally, clicking on policy violation either in Checkin window or Error List pane now will bring up the file and the line the violation is found in.&lt;/p&gt; &lt;p&gt;Policy violations are cleared from Error List pane when the policy is re-evaluated or on project build.&lt;/p&gt; &lt;p&gt;If you encounter any issue with the new drop, please make sure to leave a comment (and I promise to handle the issues promptly this time).&lt;/p&gt; &lt;p&gt;And while at StyleCop topick, I’d like to point to an excellent project driven by &lt;a href="http://blogs.conchango.com/howardvanrooijen/" target="_blank"&gt;Howard Van Rooijen&lt;/a&gt; – &lt;a href="http://stylecopforresharper.codeplex.com/" target="_blank"&gt;&lt;strong&gt;StyleCop integration with ReSharper&lt;/strong&gt;&lt;/a&gt;. If you use both, make sure you get the latest drop from Codeplex.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Related posts:&lt;/strong&gt;&lt;br&gt;- &lt;a href="http://teamfoundation.blogspot.com/2008/10/stylecop-43-checkin-policy-version-12.html" target="_blank"&gt;StyleCop 4.3 Checkin Policy version 1.2&lt;/a&gt;&lt;br&gt;- &lt;a href="http://teamfoundation.blogspot.com/2008/09/stylecop-43-checkin-policy-available.html" target="_blank"&gt;StyleCop 4.3 Checkin Policy available&lt;/a&gt;&lt;br&gt;- &lt;a href="http://teamfoundation.blogspot.com/2008/08/get-new-version-of-stylecop-while-it-is.html" target="_blank"&gt;Get New Version Of StyleCop&lt;/a&gt;&lt;br&gt;- &lt;a href="http://teamfoundation.blogspot.com/2008/07/stylecop-confusion-cleared.html" target="_blank"&gt;StyleCop Confusion Cleared&lt;/a&gt;&lt;br&gt;- &lt;a href="http://teamfoundation.blogspot.com/2008/05/source-analysis-for-c-checkin-policy.html" target="_blank"&gt;Source Analysis For C# Checkin Policy&lt;/a&gt;&lt;br&gt;- &lt;a href="http://teamfoundation.blogspot.com/2008/06/source-analysis-for-c-custom-rules-and.html" target="_blank"&gt;Source Analysis For C#: Custom Rules And More&lt;/a&gt;&lt;br&gt;- &lt;a href="http://teamfoundation.blogspot.com/2008/05/beautify-your-c-code-with-microsoft.html" target="_blank"&gt;Beautify Your Code With Microsoft Source Analysis&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26229238-2137623964818082691?l=teamfoundation.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/teamfoundation/~4/QgpX9n5g9D4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://teamfoundation.blogspot.com/feeds/2137623964818082691/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=26229238&amp;postID=2137623964818082691" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/2137623964818082691?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/2137623964818082691?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/teamfoundation/~3/QgpX9n5g9D4/updated-stylecop-checkin-policy-v121.html" title="Updated StyleCop Checkin Policy (v1.2.1)" /><author><name>eugenez</name><uri>http://www.blogger.com/profile/09637949643994709456</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04453434800404773243" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://teamfoundation.blogspot.com/2009/07/updated-stylecop-checkin-policy-v121.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEICQno5eyp7ImA9WxJSGU4.&quot;"><id>tag:blogger.com,1999:blog-26229238.post-3967915725744411906</id><published>2009-05-09T23:20:00.001-07:00</published><updated>2009-05-09T23:22:43.423-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-09T23:22:43.423-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="WIT" /><category scheme="http://www.blogger.com/atom/ns#" term="TFS" /><title>Work Item customization tidbits: custom controls (part 14 of X)</title><content type="html">&lt;p&gt;In &lt;a href="http://blogs.msdn.com/eugenez/archive/2009/04/12/work-item-customization-tidbits-part-12-of-x.aspx"&gt;one of my previous posts&lt;/a&gt; I mentioned that I consider custom controls in WI one of the most complex types of customization to implement. Since I got asked related question let me expand on the topic.&lt;/p&gt; &lt;p&gt;Custom work item controls provide a way to implement truly specialized behavior for WI, by writing managed class conforming to well-known interface. Sometimes it may be very tempting to write the logic in C# instead of learning intricacies of WIT XML syntax (and sometimes there is no alternative).&lt;/p&gt; &lt;p&gt;Why is this type of customization so complex? Because you have to code, integrate, test &amp;amp; deploy additional component, and that in a way different from other WIT customizations in XML. And not only that - consider the following important drawbacks custom control has:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Additional version of the control needs to be implemented if you want to support the same logic in Web UI as in Visual Studio environment  &lt;li&gt;Custom control is not supported when editing WI in Excel (or MS Project)  &lt;li&gt;Custom control assembly needs to be deployed on every client machine (or on Web server if the custom control targets Web UI) &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;All of the above means that custom WIT control should be implemented only when you have absolutely no other answer to outstanding business requirement.&lt;/p&gt; &lt;p&gt;For further information there is &lt;a href="http://ognjenbajic.com/blog/2007/09/custom-work-item-controls.html"&gt;extensive summary article&lt;/a&gt; on the topic by Ognjen Bajic. Another &lt;a href="http://msmvps.com/blogs/vstsblog/archive/2007/08/29/creating-a-separate-work-item-form-layout-for-web-access.aspx"&gt;interesting article by Neno Loje&lt;/a&gt; provides additional details on customizing Work Item types depending on the client (WinForms or Web), which is very relevant for custom controls.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Related posts: &lt;/strong&gt;&lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2009/05/work-item-customization-tidbits-limits.html"&gt;limits of complexity (part 13)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://blogs.msdn.com/eugenez/archive/2009/04/12/work-item-customization-tidbits-part-12-of-x.aspx" mce_href="http://teamfoundation.blogspot.com/2009/04/work-item-customization-tidbits-part-12.html"&gt;estimate the effort (part 12)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/09/work-item-customization-tidbits_23.html" mce_href="http://teamfoundation.blogspot.com/2008/09/work-item-customization-tidbits_23.html"&gt;customization and global lists (part 11)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/09/work-item-customization-tidbits.html" mce_href="http://teamfoundation.blogspot.com/2008/09/work-item-customization-tidbits.html"&gt;customization process (part 10)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/09/work-item-customization-tidbits-tools.html" mce_href="http://teamfoundation.blogspot.com/2008/09/work-item-customization-tidbits-tools.html"&gt;customization tools (part 9)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/07/work-item-customization-tidbits-special.html" mce_href="http://teamfoundation.blogspot.com/2008/07/work-item-customization-tidbits-special.html"&gt;special fields (part 8)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/07/work-item-customization-fields.html" mce_href="http://teamfoundation.blogspot.com/2008/07/work-item-customization-fields.html"&gt;fields maintenance (part 7)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/07/work-item-customization-tidbits-global.html" mce_href="http://teamfoundation.blogspot.com/2008/07/work-item-customization-tidbits-global.html"&gt;global lists (part 6)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/06/work-item-customization-tidbits-system.html" mce_href="http://teamfoundation.blogspot.com/2008/06/work-item-customization-tidbits-system.html"&gt;system fields (part 5)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/06/work-item-customization-tidbits-user.html" mce_href="http://teamfoundation.blogspot.com/2008/06/work-item-customization-tidbits-user.html"&gt;user interface (part 4)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/06/work-item-customization-tidbits-state.html" mce_href="http://teamfoundation.blogspot.com/2008/06/work-item-customization-tidbits-state.html"&gt;state transitions (part 3)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/06/work-item-customization-tidbits.html" mce_href="http://teamfoundation.blogspot.com/2008/06/work-item-customization-tidbits.html"&gt;conditional field behavior (part 2)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/05/work-item-customization-tidbits-part-1.html" mce_href="http://teamfoundation.blogspot.com/2008/05/work-item-customization-tidbits-part-1.html"&gt;fields definition (part 1)&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/eugenez/archive/2009/05/10/work-item-customization-tidbits-custom-controls-part-14-of-x.aspx"&gt;Mirror from MSDN blog&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26229238-3967915725744411906?l=teamfoundation.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/teamfoundation/~4/PV5_8jKL-7U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://teamfoundation.blogspot.com/feeds/3967915725744411906/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=26229238&amp;postID=3967915725744411906" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/3967915725744411906?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/3967915725744411906?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/teamfoundation/~3/PV5_8jKL-7U/work-item-customization-tidbits-custom.html" title="Work Item customization tidbits: custom controls (part 14 of X)" /><author><name>eugenez</name><uri>http://www.blogger.com/profile/09637949643994709456</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04453434800404773243" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://teamfoundation.blogspot.com/2009/05/work-item-customization-tidbits-custom.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUQCR3czfCp7ImA9WxJSFko.&quot;"><id>tag:blogger.com,1999:blog-26229238.post-8527947409172473054</id><published>2009-05-06T23:19:00.001-07:00</published><updated>2009-05-06T23:22:46.984-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-06T23:22:46.984-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="WIT" /><category scheme="http://www.blogger.com/atom/ns#" term="Best practices" /><category scheme="http://www.blogger.com/atom/ns#" term="TFS" /><title>Work Item customization tidbits: limits of complexity (part 13 of X)</title><content type="html">&lt;p&gt;Today I’d like to talk about WIT customization recommendations that will mostly become applicable as your custom Work Item types increase in complexity.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Keep the number of custom fields limited (per TFS server)&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;One can have a maximum of 1024 fields defined per Team Foundation Server (as every field is represented by a column in SQL Server table, the limitation is that of maximum number of columns per table in SQL Server). That means that if you &lt;a href="http://teamfoundation.blogspot.com/2008/05/work-item-customization-tidbits-part-1.html"&gt;define new fields&lt;/a&gt; (FIELD with the distinct &lt;em&gt;refname&lt;/em&gt; attribute) per WIT, you can easily hit this limit after creating a few complex Work Item types. Once the limit is reached, you have to deal with &lt;a href="http://teamfoundation.blogspot.com/2008/07/work-item-customization-fields.html"&gt;fields maintenance&lt;/a&gt; chores (you must delete some of the fields, and to delete them the fields must not be used in any WIT) – not a lot of fun when what you actually tried to achieve was to create new template.&lt;/p&gt; &lt;p&gt;How do you prevent this problem from occurring? Reuse is the key here – remember that even though it may look like you define a new field per Work Item type, fields are (precious) server resource; and even if the same field is used in WI you can specify different behavior for the same field in a different WIT.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Keep the number of rules limited (per Work Item Type)&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;While you can create multiple rules in WIT, be aware that rules not only affect maintenance complexity (you have to make it work ;), but also affect the performance. So your users may experience less than stellar performance when they create or modify work items. And there is an additional consideration which I will expand upon in the next section, which is called&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Keep the number of WI types small (per Team project)&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;While there is no hard limit on the number of WIT you can create in one Team project, there is technology limitation (SQL Server again!) on how much complexity one may have per project, with numeric complexity index in this case being defined as &lt;em&gt;[Number of rules in WIT] x [Number of WIT in project]. &lt;/em&gt;When you have too many WIT (or few of very complex ones) you may hit a limitation of maximum size of columns in SQL Server statement (65,535). It turns out all rules you define in WIT in Team project are eventually represented as part of real complex SQL statement used for WI validation when changing its data (read more techy details in &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/tfsworkitemtracking/thread/6d74ee4a-7349-44ff-82ca-1e08b1e90c6f"&gt;this forum post&lt;/a&gt; by &lt;a href="http://blogs.msdn.com/amitgh"&gt;Amit Ghosh&lt;/a&gt;)&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Keep the number of reportable fields small (per TFS server)&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;If you are not planning on including the fields into SQL Reporting reports, do not mark fields reportable just for the heck of it, since the reportable fields will propagate into TFS data warehouse and that would add extra in terms of performance and space on your TFS data layer.&lt;/p&gt; &lt;p&gt;By the way, to really understand how reporting in TFS works (and how it fits in a big picture) read &lt;a href="http://weblogs.asp.net/vblasberg/archive/2008/06/04/tfs-reporting-architecture-notes.aspx"&gt;this excellent post&lt;/a&gt; from Vince Blasberg.&lt;/p&gt;&lt;p&gt;In conclusion, I’d like to highlight once more the importance of having &lt;a href="http://teamfoundation.blogspot.com/2008/09/work-item-customization-tidbits.html"&gt;test environment&lt;/a&gt; whereto you deploy the potential WIT changes prior to production rollout. Consider the situation where you have just deployed new WIT to a Team project, and as a result the users cannot update any WI in the project. Not a happy place to be, is it?&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Related posts: &lt;/strong&gt;&lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2009/04/work-item-customization-tidbits-part-12.html"&gt;estimate the effort (part 12)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/09/work-item-customization-tidbits_23.html"&gt;customization and global lists (part 11)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/09/work-item-customization-tidbits.html"&gt;customization process (part 10)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/09/work-item-customization-tidbits-tools.html"&gt;customization tools (part 9)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/07/work-item-customization-tidbits-special.html"&gt;special fields (part 8)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/07/work-item-customization-fields.html"&gt;fields maintenance (part 7)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/07/work-item-customization-tidbits-global.html"&gt;global lists (part 6)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/06/work-item-customization-tidbits-system.html"&gt;system fields (part 5)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/06/work-item-customization-tidbits-user.html"&gt;user interface (part 4)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/06/work-item-customization-tidbits-state.html"&gt;state transitions (part 3)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/06/work-item-customization-tidbits.html"&gt;conditional field behavior (part 2)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/05/work-item-customization-tidbits-part-1.html"&gt;fields definition (part 1)&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/eugenez/archive/2009/05/07/work-item-customization-tidbits-limits-of-complexity-part-13-of-x.aspx"&gt;Mirror on MSDN blog&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26229238-8527947409172473054?l=teamfoundation.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/teamfoundation/~4/3Kt6vi8AXG4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://teamfoundation.blogspot.com/feeds/8527947409172473054/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=26229238&amp;postID=8527947409172473054" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/8527947409172473054?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/8527947409172473054?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/teamfoundation/~3/3Kt6vi8AXG4/work-item-customization-tidbits-limits.html" title="Work Item customization tidbits: limits of complexity (part 13 of X)" /><author><name>eugenez</name><uri>http://www.blogger.com/profile/09637949643994709456</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04453434800404773243" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://teamfoundation.blogspot.com/2009/05/work-item-customization-tidbits-limits.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MDQnw4eip7ImA9WxJSEkk.&quot;"><id>tag:blogger.com,1999:blog-26229238.post-7928290233887367301</id><published>2009-05-01T22:17:00.001-07:00</published><updated>2009-05-01T22:17:53.232-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-01T22:17:53.232-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MSBuild" /><title>MSBuild UsingTask gotchas</title><content type="html">&lt;p&gt;One significant drawback of MSBuild &lt;em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/t41tzex2.aspx"&gt;&lt;strong&gt;UsingTask&lt;/strong&gt;&lt;/a&gt;&lt;/em&gt; element is that you must specify exactly the task name you are importing. That is if the assembly you are importing contains 200 tasks, you will have to import them explicitly one by one. And since you probably do not want to do that in every project you author, usually these 200 tasks will be defined in separate project file that can be imported whenever the tasks are needed.&lt;/p&gt; &lt;p&gt;While there is no workaround for specifying the task name, there is another, somewhat easier way to make sure that the tasks are available to your projects without explicitly importing tasks project file. &lt;/p&gt; &lt;p&gt;Let’s suppose that you have created MSBuild project file that contains &lt;em&gt;UsingTask&lt;/em&gt; statements for all custom tasks you want to have available in your projects. Then if you rename this project file to have &lt;em&gt;.tasks &lt;/em&gt;extension and place it in .NET framework folder (e.g. &lt;em&gt;C:\WINDOWS\Microsoft.NET\Framework\v3.5&lt;/em&gt; folder for .NET 3.5), the tasks defined there will be available in any project using that version of MSBuild &lt;em&gt;&lt;strong&gt;without&lt;/strong&gt;&lt;/em&gt; explicit import statement.&lt;/p&gt; &lt;p&gt;This is the mechanism used to make tasks shipped with MSBuild by default available to all projects (look into &lt;em&gt;Microsoft.Common.tasks&lt;/em&gt; file to see these tasks defined there). No magick required!&lt;/p&gt; &lt;p&gt;By the way, looking into Microsoft.Common.tasks file imparts two additional pieces of wisdom (to quote):&lt;/p&gt; &lt;p&gt;“&lt;em&gt;NOTE: Listing a &amp;lt;UsingTask&amp;gt; tag in a *.tasks file like this one rather than in a project or targets file can give a significant &lt;strong&gt;performance advantage&lt;/strong&gt; in a large build, because every time a &amp;lt;UsingTask&amp;gt; tag is encountered, it will cause the task to be rediscovered next time the task is used.&lt;/em&gt;”&lt;/p&gt; &lt;p&gt;Another useful comment relates to the way the tasks are defined in &lt;em&gt;UsingTask&lt;/em&gt; – you can either specify fully-qualified task name (including namespaces) or a short one; however, (again, quote from Microsoft.Common.tasks file):&lt;/p&gt; &lt;p&gt;“&lt;em&gt;NOTE: Using the fully qualified class name in a &amp;lt;UsingTask&amp;gt; tag is faster than using a partially qualified name.&lt;/em&gt;”&lt;/p&gt; &lt;p&gt;In addition to performance win, you will also be able to disambiguate the task used. For example, both &lt;a href="http://www.codeplex.com/sdctasks"&gt;&lt;strong&gt;SDC tasks&lt;/strong&gt;&lt;/a&gt; and &lt;a href="http://msbuildtasks.tigris.org/"&gt;&lt;strong&gt;MSBuild Community tasks&lt;/strong&gt;&lt;/a&gt; packages define a bunch of tasks that differ only by name. In such cases you will have to be explicit both in &lt;em&gt;UsingTask&lt;/em&gt; statement and when using the imported task:&lt;/p&gt; &lt;div style="font-size: 10pt; background: white; color: black; font-family: courier new"&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: green"&gt; Import SDC Sleep task &lt;/span&gt;&lt;span style="color: blue"&gt;--&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;UsingTask&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;AssemblyFile&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Microsoft.Sdc.Tasks.dll&lt;/span&gt;"&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red"&gt;TaskName&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Microsoft.Sdc.Tasks.Sleep&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: green"&gt; Import MSBuild Community Sleep task &lt;/span&gt;&lt;span style="color: blue"&gt;--&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;UsingTask&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;AssemblyFile&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;MSBuild.Community.Tasks.dll&lt;/span&gt;"&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red"&gt;TaskName&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;MSBuild.Community.Tasks.Sleep&lt;/span&gt;"&lt;span style="color: blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: green"&gt; Use SDC Sleep task, full name to disambiguate &lt;/span&gt;&lt;span style="color: blue"&gt;--&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Target&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;Name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Sleep&lt;/span&gt;"&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Microsoft.Sdc.Tasks.Sleep&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;SleepTimeout&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;1&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Target&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;em&gt;&lt;a href="http://blogs.msdn.com/eugenez/archive/2009/05/02/msbuild-usingtask-gotchas.aspx"&gt;Mirror from MSDN blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26229238-7928290233887367301?l=teamfoundation.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/teamfoundation/~4/6qC-hFPSAME" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://teamfoundation.blogspot.com/feeds/7928290233887367301/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=26229238&amp;postID=7928290233887367301" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/7928290233887367301?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/7928290233887367301?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/teamfoundation/~3/6qC-hFPSAME/msbuild-usingtask-gotchas.html" title="MSBuild UsingTask gotchas" /><author><name>eugenez</name><uri>http://www.blogger.com/profile/09637949643994709456</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04453434800404773243" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://teamfoundation.blogspot.com/2009/05/msbuild-usingtask-gotchas.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMASXc6eSp7ImA9WxJTFk4.&quot;"><id>tag:blogger.com,1999:blog-26229238.post-6230877899571962111</id><published>2009-04-24T22:12:00.001-07:00</published><updated>2009-04-24T22:14:08.911-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-24T22:14:08.911-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="version control" /><category scheme="http://www.blogger.com/atom/ns#" term="TFS" /><title>Branching off renamed trunk</title><content type="html">&lt;p&gt;Recently I got asked a small but unobvious branching question. Suppose you have a folder named &lt;strong&gt;FolderName&lt;/strong&gt;, and for some reason you have renamed it to &lt;strong&gt;NewFolderName&lt;/strong&gt;. All is well, but now you decided you want to create a branch from that folder, and to branch from the version prior to renaming.&lt;/p&gt; &lt;p&gt;Due to the reasons detailed in &lt;a href="http://teamfoundation.blogspot.com/2007/06/move-caveats-i-like-to-move-it-move-it.html"&gt;&lt;strong&gt;my older post&lt;/strong&gt;&lt;/a&gt;, you will not be able to use branching UI for the operation. The only way to achieve that is to use &lt;em&gt;tf&lt;/em&gt; command-line client &lt;a href="http://msdn.microsoft.com/en-us/library/d73s8b27(VS.80).aspx"&gt;&lt;strong&gt;branch&lt;/strong&gt;&lt;/a&gt; command where you will explicitly specify version you branch from and the folder name at that revision &lt;/p&gt; &lt;div style="font-weight: bold; color: white; font-family: courier; background-color: black"&gt;&lt;pre&gt;&lt;p&gt;tf branch /Project/FolderName /Project/Branch /version:C123&lt;/p&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Typical mistake people make is to use current item name, &lt;em&gt;NewFolderName &lt;/em&gt;instead of the name that existed in the past(i.e. &lt;em&gt;FolderName &lt;/em&gt;at the time of changeset 123).&lt;/p&gt;&lt;p&gt;&lt;a href="http://blogs.msdn.com/eugenez/archive/2009/04/25/branching-off-renamed-trunk.aspx"&gt;&lt;strong&gt;Mirrored from MSDN blog&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26229238-6230877899571962111?l=teamfoundation.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/teamfoundation/~4/b8HzQ4g7a3A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://teamfoundation.blogspot.com/feeds/6230877899571962111/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=26229238&amp;postID=6230877899571962111" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/6230877899571962111?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/6230877899571962111?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/teamfoundation/~3/b8HzQ4g7a3A/branching-off-renamed-trunk.html" title="Branching off renamed trunk" /><author><name>eugenez</name><uri>http://www.blogger.com/profile/09637949643994709456</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04453434800404773243" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://teamfoundation.blogspot.com/2009/04/branching-off-renamed-trunk.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08MQ3Y8eyp7ImA9WxJSFko.&quot;"><id>tag:blogger.com,1999:blog-26229238.post-915582575569862660</id><published>2009-04-11T23:23:00.001-07:00</published><updated>2009-05-06T22:58:02.873-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-06T22:58:02.873-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="WIT" /><category scheme="http://www.blogger.com/atom/ns#" term="TFS" /><title>Work Item customization tidbits: estimating the effort (part 12 of X)</title><content type="html">&lt;p style="font-size: 10px"&gt;My apologies for a long silence on the subject of the series (due to several &lt;a href="http://teamfoundation.blogspot.com/2009/03/moving-on.html"&gt;recent events&lt;/a&gt;) but hopefully now am back on the track and I have a long back log :)&lt;/p&gt; &lt;p&gt;In my &lt;a href="#posts"&gt;&lt;strong&gt;previous posts&lt;/strong&gt;&lt;/a&gt; I have discussed various bits that are important know before taking on Work Item types customization. Today I’d like to talk more about approaching the whole process.&lt;/p&gt; &lt;p&gt;I would like to advocate a conservative approach, since in most organizations (at least in my experience) there are limited resources dedicated to customization, users support and maintenance of Work Item types. &lt;/p&gt; &lt;p&gt;The easiest way to jump-start the customization process is to use one of the existing templates; I’d recommend stock templates coming with TFS (MSF or CMMI); however, nowadays there are other decent templates available (for example, &lt;a href="http://www.scrumforteamsystem.com/en/default.aspx"&gt;Conchango Scrum&lt;/a&gt; is well known and widely used). At the very least, that provides you with minimum work item logic implemented in professional manner.&lt;/p&gt; &lt;p&gt;To understand the customization effort required, it is helpful to review the following: &lt;/p&gt; &lt;p&gt;1. Detail new data fields to be added to those existing in Work Item type; note if existing fields rules need to be modified&lt;/p&gt; &lt;p&gt;2. Identify the work item state lifecycle desired and how it compares with the existing one for Work Item type (mostly paying attention to the flow rather than to the states names). &lt;/p&gt; &lt;p&gt;3. For your new custom fields, see if there is any special logic to be implemented viz.&amp;nbsp; &lt;/p&gt; &lt;ul&gt; &lt;li&gt;Whether field rules are to be scoped by user/group  &lt;li&gt;Whether field rules are to be scoped for different states  &lt;li&gt;Whether field needs to be associated with static/dynamic list of values &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Once you create mapping table of the desired vs. existing fields, these data may be used to estimate the complexity of the development &amp;amp; maintenance. I have tried to compile (somewhat biased) complexity list of elementary field customization task (ordered by the simplest to the most demanding):&lt;/p&gt; &lt;p&gt;i. &lt;strong&gt;New data field&lt;/strong&gt;. Simplest customization possible both from the point of implementation and subsequent maintenance. May require additional effort if the field is to be reported on (since the integration into reports will be required)&lt;/p&gt; &lt;p&gt;ii. &lt;strong&gt;Data field with lists of values (&lt;a href="http://teamfoundation.blogspot.com/2008/07/work-item-customization-tidbits-global.html"&gt;local or global lists&lt;/a&gt;)&lt;/strong&gt;. For static (i.e. rarely updated) lists of values (such as priorities), both the implementation and maintenance are fairly simple. However, if the lists content is dynamic (such as customers), make sure you plan for maintenance and, more importantly, do not make any assumption as to list content in fields’ rules.&lt;/p&gt; &lt;p&gt;iii. &lt;strong&gt;Data field with &lt;a href="http://teamfoundation.blogspot.com/2008/06/work-item-customization-tidbits.html"&gt;static rules logic&lt;/a&gt; (no dependency on state/user)&lt;/strong&gt;. Since rules implemented may be pretty complex, the scenario is as complex as you made it from the point of implementation complexity. And depending on how well you test the implementation, maintenance may range from nightmare to none.&lt;/p&gt; &lt;p&gt;vi. &lt;strong&gt;Data field with rules logic dependent on &lt;a href="http://teamfoundation.blogspot.com/2008/06/work-item-customization-tidbits-state.html"&gt;state transitions&lt;/a&gt;&lt;/strong&gt;. When rules are defined include dependency states lifecycle, that generally means that you need to put extra effort into testing (for large states chart the effort may be very significant) and require regression testing when the state lifecycle is modified.&lt;/p&gt; &lt;p&gt;v. &lt;strong&gt;Data field with logic dependent on user/group&lt;/strong&gt;. When rules are scoped to specific groups (rarely to users in corporate environment), the complexity of environment may have a bearing on WIT. Namely, in Active Directory environment with multiple levels of inclusion between groups it might not be easy to diagnose why your rules function incorrectly (either from the point of being too loose or too restrictive). Extra maintenance may well be expected.&lt;/p&gt; &lt;p&gt;vi. &lt;strong&gt;Data field with custom controls.&lt;/strong&gt; When your data field in addition to rules expressed in WI Type definition has logic defined in custom control assembly, you have just added extra dimension on implementation, testing and maintenance. That becomes even more complex task if the custom control should work for Web interface &lt;/p&gt; &lt;p&gt;Once you identified the work to be executed, you will be able to plan effort required for implementation, testing, deployment and maintenance.&lt;/p&gt; &lt;p&gt;In conclusion, I’d like to highlight two very important principles which when followed will prevent a plethora of issues: a) never deploy to production before deploying to &lt;a href="http://teamfoundation.blogspot.com/2008/09/work-item-customization-tidbits.html"&gt;&lt;strong&gt;test environment&lt;/strong&gt;&lt;/a&gt; and b) plan and execute the whole WI Types customization process as if it was an ordinary software development effort. &lt;a name="posts"&gt;&amp;nbsp;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;Related posts: &lt;/strong&gt;&lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/09/work-item-customization-tidbits_23.html"&gt;customization and global lists (part 11)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/09/work-item-customization-tidbits.html"&gt;customization process (part 10)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/09/work-item-customization-tidbits-tools.html"&gt;customization tools (part 9)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/07/work-item-customization-tidbits-special.html"&gt;special fields (part 8)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/07/work-item-customization-fields.html"&gt;fields maintenance (part 7)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/07/work-item-customization-tidbits-global.html"&gt;global lists (part 6)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/06/work-item-customization-tidbits-system.html"&gt;system fields (part 5)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/06/work-item-customization-tidbits-user.html"&gt;user interface (part 4)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/06/work-item-customization-tidbits-state.html"&gt;state transitions (part 3)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/06/work-item-customization-tidbits.html"&gt;conditional field behavior (part 2)&lt;/a&gt; &lt;br&gt;- Work Item Customization: &lt;a href="http://teamfoundation.blogspot.com/2008/05/work-item-customization-tidbits-part-1.html"&gt;fields definition (part 1)&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://blogs.msdn.com/eugenez/archive/2009/04/12/work-item-customization-tidbits-part-12-of-x.aspx" target="_blank"&gt;Mirror from MSDN blog&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26229238-915582575569862660?l=teamfoundation.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/teamfoundation/~4/Iy49o3Kh6Go" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://teamfoundation.blogspot.com/feeds/915582575569862660/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=26229238&amp;postID=915582575569862660" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/915582575569862660?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/915582575569862660?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/teamfoundation/~3/Iy49o3Kh6Go/work-item-customization-tidbits-part-12.html" title="Work Item customization tidbits: estimating the effort (part 12 of X)" /><author><name>eugenez</name><uri>http://www.blogger.com/profile/09637949643994709456</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04453434800404773243" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://teamfoundation.blogspot.com/2009/04/work-item-customization-tidbits-part-12.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUHQnk6eSp7ImA9WxVbFkk.&quot;"><id>tag:blogger.com,1999:blog-26229238.post-931187093780925075</id><published>2009-04-01T20:17:00.001-07:00</published><updated>2009-04-01T20:17:13.711-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-01T20:17:13.711-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="WIT" /><category scheme="http://www.blogger.com/atom/ns#" term="TFS" /><title>TFS Administrator chores – space offender strikes again!</title><content type="html">&lt;p&gt;&lt;/p&gt; &lt;p&gt;In &lt;a href="http://teamfoundation.blogspot.com/2009/03/tfs-administrator-chores-dealing-with.html" target="_blank"&gt;my previous post&lt;/a&gt; I talked about management of large files in TFS version control database. Today I’d like to talk about what you can do to optimize space management in work item tracking database. &lt;/p&gt; &lt;p&gt;As you know, it is possible to add file attachments to Work Item, with the maximum attachment size of 2Mb (by default); but most people who use attachments with WI change that limit to something larger (&lt;a href="http://msdn.microsoft.com/en-us/library/ms400780.aspx" target="_blank"&gt;this MSDN article&lt;/a&gt; details how to change the maximum attachment size), since default frequently does not suffice for video captures and such.&lt;/p&gt; &lt;p&gt;Which naturally brings us to the question – if the maximum size set, say, to 32 Mb, how could one prevent misuse of the attachment feature?&lt;/p&gt; &lt;p&gt;There is nothing in Team Explorer UI to help you with figuring out the size of the added attachment; and nothing to prevent a user from adding however many large attachments (if they are not greater than maximum size). That leaves you with user education as a form of prevention; and to report the usage it is possible to run raw SQL on the relational database (all of the below queries are strictly AS IS etc.):&lt;/p&gt; &lt;div style="font-size: 10pt; background: white; color: black; font-family: courier new"&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: green"&gt;-- Query WIT database&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;USE &lt;/span&gt;TfsWorkItemTracking;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;SELECT &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green"&gt;-- parent work item &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID &lt;span style="color: blue"&gt;AS &lt;/span&gt;WorkItemID, &lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green"&gt;-- name of the attachment file&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; OriginalName &lt;span style="color: blue"&gt;AS &lt;/span&gt;AttachementName, &lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green"&gt;-- attachment comment &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Comment, &lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green"&gt;-- file size&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Length] &lt;span style="color: blue"&gt;AS &lt;/span&gt;[Size], &lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green"&gt;-- whether attachment was deleted&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;CASE WHEN &lt;/span&gt;RemovedDate = &lt;span style="color: #a31515"&gt;'01/01/9999' &lt;/span&gt;&lt;span style="color: blue"&gt;THEN &lt;/span&gt;0 &lt;/pre&gt;&lt;pre style="margin: 0px"&gt;              &lt;span style="color: blue"&gt;ELSE &lt;/span&gt;1 &lt;span style="color: blue"&gt;END AS &lt;/span&gt;Deleted &lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;FROM &lt;/span&gt;WorkItemFiles&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;WHERE &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green"&gt;-- File attachments only&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FldID = 50&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green"&gt;-- return only large files&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;AND&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[Length] &amp;gt; @LargeFile &lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;The query will give you the list of WI with large attachments, so you could figure out whether this feature is used in a sensible way.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;If you look at the query closely, you’ll notice that the attachment in the database can be removed from WI and still exist in the database. What does that mean, say you? Whereas with version control one can delete item (where the item still will be in DB) and then destroy it (where item will be purged from DB), there is no such feature with Work Item attachments.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;It turns out when you delete attachment from Work Item, the actual content is never deleted from database unless you do it manually. There is even helpful but incredibly well-hidden and vague article in MSDN on the subject, titled “&lt;a href="http://msdn.microsoft.com/en-us/library/ms400706.aspx" target="_blank"&gt;&lt;strong&gt;How to: Delete Orphaned Files Permanently&lt;/strong&gt;&lt;/a&gt;”.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;That means even if you have managed to delete large attachments from WI, your job to recover the space is still half-done, and you need to actually delete the attachment content from the database.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The query below will enumerate all orphaned (deleted from Work Items, but still in DB) attachments, whereas subsequent query can be used to actually purge the deleted items from the database.&lt;/p&gt;&lt;br /&gt;&lt;div style="font-size: 10pt; background: white; color: black; font-family: courier new"&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: green"&gt;-- Query for all orphaned attachments&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;SELECT &lt;/span&gt;WorkItems.ID &lt;span style="color: blue"&gt;AS &lt;/span&gt;WorkItemID, &lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WorkItems.OriginalName &lt;span style="color: blue"&gt;AS &lt;/span&gt;AttachementName,&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WorkItems.Comment &lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;FROM &lt;/span&gt;TfsWorkItemTrackingAttachments.dbo.Attachments Attachements, &lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TfsWorkItemTracking.dbo.WorkItemFiles WorkItems&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;WHERE &lt;/span&gt;Attachements.FileGuid = WorkItems.FilePath &lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;AND &lt;/span&gt;WorkItems.RemovedDate &amp;lt;&amp;gt; &lt;span style="color: #a31515"&gt;'01/01/9999'&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;AND &lt;/span&gt;WorkItems.FldID = 50&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;br /&gt;&lt;div style="font-size: 10pt; background: white; color: black; font-family: courier new"&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: green"&gt;-- When absolutely sure - delete the orphans&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;DELETE &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;FROM &lt;/span&gt;TfsWorkItemTrackingAttachments.dbo.Attachments&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: green"&gt;-- join to WIT tables to identify orphans&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;WHERE &lt;/span&gt;FileGuid &lt;span style="color: blue"&gt;IN &lt;/span&gt;(&lt;span style="color: blue"&gt;SELECT &lt;/span&gt;FilePath &lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;FROM &lt;/span&gt;TfsWorkItemTracking.dbo.WorkItemFiles&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;WHERE &lt;/span&gt;RemovedDate &amp;lt;&amp;gt; &lt;span style="color: #a31515"&gt;'01/01/9999'&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;AND &lt;/span&gt;FldID = 50)&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Purging orphans seems to me a good candidate for the recurring job (not sure why it is not part of core TFS setup).&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://blogs.msdn.com/eugenez/archive/2009/04/02/tfs-administrator-chores-space-offender-strikes-again.aspx"&gt;Mirrored from MSDN blog&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26229238-931187093780925075?l=teamfoundation.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/teamfoundation/~4/mBQ30fdehO0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://teamfoundation.blogspot.com/feeds/931187093780925075/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=26229238&amp;postID=931187093780925075" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/931187093780925075?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/931187093780925075?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/teamfoundation/~3/mBQ30fdehO0/tfs-administrator-chores-space-offender.html" title="TFS Administrator chores – space offender strikes again!" /><author><name>eugenez</name><uri>http://www.blogger.com/profile/09637949643994709456</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04453434800404773243" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://teamfoundation.blogspot.com/2009/04/tfs-administrator-chores-space-offender.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUESHs6fCp7ImA9WxVbFUg.&quot;"><id>tag:blogger.com,1999:blog-26229238.post-9168027457883308865</id><published>2009-03-28T22:15:00.001-07:00</published><updated>2009-03-31T19:50:09.514-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-31T19:50:09.514-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="version control" /><category scheme="http://www.blogger.com/atom/ns#" term="TFS" /><title>TFS Administrator chores – dealing with the space offender</title><content type="html">&lt;p&gt;&lt;/p&gt; &lt;p&gt;These are the days of cheap storage - but even the cheap storage may run out. And running Team Foundation Server storing artifacts in its (multiple) databases may use up your space rack faster than you might have expected (and if you want to know what to expect, refer to &lt;a href="http://blogs.msdn.com/buckh/archive/2006/02/22/tfs_size_estimation.aspx" target="_blank"&gt;&lt;strong&gt;this classical post&lt;/strong&gt;&lt;/a&gt; by Buck Hodges on database size calculations).&lt;/p&gt; &lt;p&gt;If that happens, the most probable culprit is version control database (TfsVersionControl) – in other words, all these files that people check in into version control. The size of the file matters because TFS stores difference only for each new revision of “small” files but for the “large” files every new revision gets full-blown copy (by default TFS considers the file to be large if it is over 16 Mb - read more on that topic in my &lt;a href="http://teamfoundation.blogspot.com/2007/06/maximum-size-of-file-under-source.html" target="_blank"&gt;&lt;strong&gt;previous post&lt;/strong&gt;&lt;/a&gt;).&lt;/p&gt; &lt;p&gt;There are several ways of making sure that your users do not fill up your version control with memory dumps, images of installation CDs and such. Mind you – I am not saying that large files do not belong to version control; I am saying that the addition of large files should be a) conscious step and b) “revisionless” (i.e. with no versioning). &lt;/p&gt; &lt;p&gt;Myself, I have been always ambivalent about storing large binary thingies in source control – on one hand, you get all content in one place (which is mighty convenient for builds etc.), on the other hand, many users will probably check in the content that does not belong in source control. So here is my hit list of&amp;nbsp; measures to deal with large files in version control&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Educate your user&lt;/strong&gt; – make sure your average user understands that DVD ISO added to version control ends up being transmitted and stored in the database; perhaps what the user is looking for is file server, not version control  &lt;li&gt;&lt;strong&gt;Make user aware of his actions&lt;/strong&gt; – it is possible to write check-in policy that would alert the user at the time of check-in, that the files being checked in are large and perhaps should not be in version control. And then, even if the user decides to override the policy you may run report on policy overrides  &lt;li&gt;&lt;strong&gt;Monitor your storage&lt;/strong&gt; – if high level prevention and low level prevention fail, you can query the database to identify the offending files. The query below (with usual caveats – it is AS IS etc.) will give you a list of large files in the database (it will not take into account the summary size of all versions, only the latest version): &lt;/li&gt;&lt;/ul&gt; &lt;div style="font-size: 10pt; background: white; color: black; font-family: courier new"&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;DECLARE &lt;/span&gt;@LargeFile &lt;span style="color: blue"&gt;int&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: green"&gt;-- return files larger than 16 Mb&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;SET &lt;/span&gt;@LargeFile = 16 * 1024 * 1024; &lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;USE &lt;/span&gt;TfsVersionControl; –– &lt;span style="color: green"&gt;use source control DB &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;SELECT &lt;/span&gt;&lt;span style="color: green"&gt;-- item path &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Versions.ParentPath + Versions.ChildItem &lt;span style="color: blue"&gt;AS &lt;/span&gt;ItemPath,&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green"&gt;-- size of latest version in DB &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Files.CompressedLength &lt;span style="color: blue"&gt;AS &lt;/span&gt;DatabaseSize, &lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green"&gt;-- size of original file&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Files.FileLength &lt;span style="color: blue"&gt;AS &lt;/span&gt;[Size], &lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green"&gt;-- whether item deleted&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;CASE WHEN &lt;/span&gt;Versions.DeletionId = 0 &lt;span style="color: blue"&gt;THEN &lt;/span&gt;0 &lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;ELSE &lt;/span&gt;1 &lt;span style="color: blue"&gt;END AS &lt;/span&gt;Deleted &lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;FROM &lt;/span&gt;tbl_File Files, tbl_Version Versions&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;WHERE &lt;/span&gt;&lt;span style="color: green"&gt;-- get item latest version &lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Versions.VersionTo = 2147483647 &lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green"&gt;-- join to table with sizes&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;AND &lt;/span&gt;Versions.FileId = Files.FileId &lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green"&gt;-- return only large files&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;AND &lt;/span&gt;Files.CompressedLength &amp;gt; @LargeFile &lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;ORDER BY &lt;/span&gt;ItemPath;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;I would be happy to hear your &lt;strike&gt;horror&lt;/strike&gt; stories of the application of the above query; mine was nothing more than a bunch of ISO images checked in :)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;em&gt;Thanks for reviewing the query go to &lt;/em&gt;&lt;a href="http://blogs.msdn.com/chandrur/" target="_blank"&gt;&lt;em&gt;Chandru Ramakrishnan&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://blogs.msdn.com/eugenez/archive/2009/03/29/tfs-administrator-chores-dealing-with-the-space-offender.aspx" target="_blank"&gt;Mirrored from MSDN blog&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26229238-9168027457883308865?l=teamfoundation.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/teamfoundation/~4/xDjVdzCShF0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://teamfoundation.blogspot.com/feeds/9168027457883308865/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=26229238&amp;postID=9168027457883308865" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/9168027457883308865?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/9168027457883308865?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/teamfoundation/~3/xDjVdzCShF0/tfs-administrator-chores-dealing-with.html" title="TFS Administrator chores – dealing with the space offender" /><author><name>eugenez</name><uri>http://www.blogger.com/profile/09637949643994709456</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04453434800404773243" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://teamfoundation.blogspot.com/2009/03/tfs-administrator-chores-dealing-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIDSH85fyp7ImA9WxVbE00.&quot;"><id>tag:blogger.com,1999:blog-26229238.post-3100880091167123192</id><published>2009-03-28T22:12:00.001-07:00</published><updated>2009-03-28T22:12:59.127-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-28T22:12:59.127-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Misc" /><title>Moving on</title><content type="html">&lt;p&gt;As you might now, from November ‘08 I am working at Microsoft, and as every MS employee I am now entitled to Community Server powered blog at &lt;a href="http://blogs.msdn.com" target="_blank"&gt;&lt;strong&gt;blogs.msdn.com&lt;/strong&gt;&lt;/a&gt; (mine is &lt;a href="http://blogs.msdn.com/eugenez"&gt;&lt;strong&gt;http://blogs.msdn.com/eugenez&lt;/strong&gt;&lt;/a&gt;).&lt;/p&gt; &lt;p&gt;Though &lt;a href="http://www.blogger.com" target="_blank"&gt;Blogger&lt;/a&gt; is a convenient platform, Community Server is ways better, and thus I will be making MSDN my new [blog] home. So update your reader with &lt;a href="http://blogs.msdn.com/eugenez/rss.xml" target="_blank"&gt;&lt;strong&gt;the new feed&lt;/strong&gt;&lt;/a&gt;! But if you don’t – do not worry, I will be mirroring TFS related posts here.&lt;/p&gt; &lt;p&gt;See you around!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26229238-3100880091167123192?l=teamfoundation.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/teamfoundation/~4/ENGhzQQecvQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://teamfoundation.blogspot.com/feeds/3100880091167123192/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=26229238&amp;postID=3100880091167123192" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/3100880091167123192?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/3100880091167123192?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/teamfoundation/~3/ENGhzQQecvQ/moving-on.html" title="Moving on" /><author><name>eugenez</name><uri>http://www.blogger.com/profile/09637949643994709456</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04453434800404773243" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://teamfoundation.blogspot.com/2009/03/moving-on.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUFQ3gyeyp7ImA9WxVbE00.&quot;"><id>tag:blogger.com,1999:blog-26229238.post-5611172361636665501</id><published>2009-03-28T22:06:00.001-07:00</published><updated>2009-03-28T22:06:52.693-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-28T22:06:52.693-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="TFS" /><category scheme="http://www.blogger.com/atom/ns#" term="Misc" /><title>Something good to read</title><content type="html">&lt;p&gt;This is a short post to let you know that there is one new blog of note that you should add to your RSS reader. Welcome (back) Richard Berg, blogging about TFS,&amp;nbsp; PowerShell and more at &lt;a href="http://www.richardberg.net/blog" target="_blank"&gt;&lt;strong&gt;http://www.richardberg.net/blog&lt;/strong&gt;&lt;/a&gt;. Until recently, Richard &lt;a href="http://blogs.msdn.com/richardb/" target="_blank"&gt;used to work at Microsoft&lt;/a&gt;, and if you ever asked a question at MSDN TFS Version Control forum, you probably had it answered&amp;nbsp; by Richard. &lt;/p&gt; &lt;p&gt;His new blog already has a whole lot of information about TFS PowerShell cmdlets, so stay tuned for more!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26229238-5611172361636665501?l=teamfoundation.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/teamfoundation/~4/zNb6-ZHw7Nk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://teamfoundation.blogspot.com/feeds/5611172361636665501/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=26229238&amp;postID=5611172361636665501" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/5611172361636665501?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/5611172361636665501?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/teamfoundation/~3/zNb6-ZHw7Nk/something-good-to-read.html" title="Something good to read" /><author><name>eugenez</name><uri>http://www.blogger.com/profile/09637949643994709456</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04453434800404773243" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://teamfoundation.blogspot.com/2009/03/something-good-to-read.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUHSHs4eip7ImA9WxVXE04.&quot;"><id>tag:blogger.com,1999:blog-26229238.post-3696459066607527245</id><published>2009-02-10T23:43:00.001-08:00</published><updated>2009-02-10T23:43:59.532-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-10T23:43:59.532-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="TFS" /><category scheme="http://www.blogger.com/atom/ns#" term="code review" /><title>TFS Code Review Tools digest</title><content type="html">&lt;p&gt;If you are interested in getting most out of your TFS toolset, an &lt;a href="http://jb-brown.blogspot.com/2009/01/team-system-code-review-presentation.html" target="_blank"&gt;extensive summary presentation on Code Review tools in TFS domain&lt;/a&gt; is available from &lt;a href="http://jb-brown.blogspot.com" target="_blank"&gt;JB Brown&lt;/a&gt;. I had a pleasure of watching the presentation in person, and it covers most alternatives available.&lt;/p&gt; &lt;p&gt;For those who do not know, JB Brown is the original author and main contributor for &lt;a href="http://www.codeplex.com/TeamReview" target="_blank"&gt;TeamReview project&lt;/a&gt;. TeamReview allows performing collaborative code reviews using less than traditional approach (see a &lt;a href="http://dotnet.org.za/willy/archive/2008/08/26/a-quick-look-at-teamreview.aspx" target="_blank"&gt;good intro post&lt;/a&gt; on how it works by Willy-Peter Schaub ), where you can actually replay the steps performed in code review (and it stores the code review comments using TFS work items).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26229238-3696459066607527245?l=teamfoundation.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/teamfoundation/~4/ZRFIOqDEKJc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://teamfoundation.blogspot.com/feeds/3696459066607527245/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=26229238&amp;postID=3696459066607527245" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/3696459066607527245?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/3696459066607527245?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/teamfoundation/~3/ZRFIOqDEKJc/tfs-code-review-tools-digest.html" title="TFS Code Review Tools digest" /><author><name>eugenez</name><uri>http://www.blogger.com/profile/09637949643994709456</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04453434800404773243" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://teamfoundation.blogspot.com/2009/02/tfs-code-review-tools-digest.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8ARn48fip7ImA9WxVXEkg.&quot;"><id>tag:blogger.com,1999:blog-26229238.post-6938398140546874417</id><published>2009-02-10T00:00:00.001-08:00</published><updated>2009-02-10T00:00:47.076-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-10T00:00:47.076-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="TFS" /><category scheme="http://www.blogger.com/atom/ns#" term="Misc" /><title>Is TFS FDA compliant? Is anything?</title><content type="html">&lt;p&gt;I received an interesting comment to my previous post on &lt;a href="http://teamfoundation.blogspot.com/2009/01/word-on-securing-intellectual-property.html" target="_blank"&gt;securing intellectual property&lt;/a&gt;, the question being whether TFS meets the requirement of FDA compliance. &lt;/p&gt; &lt;p&gt;Let’s think about it for a second. What kind of software is FDA concerned with? Software used in or with medical devices, which obviously does not include TFS or say, Visual Studio compiler.&lt;/p&gt; &lt;p&gt;But FDA does recognize the importance of tools used &lt;em&gt;in process&lt;/em&gt; of development of medical software. As part of FDA software validation process (as described in &lt;a href="http://www.fda.gov/cdrh/comp/guidance/938.html#_Toc517237945" target="_blank"&gt;General Principles of Software Validation&lt;/a&gt; document), the tools of trade needs to be validated as well:&lt;/p&gt; &lt;p&gt;&lt;em&gt;Software tools are frequently used to design, build, and test the software that goes into an automated medical device. Many other commercial software applications, such as word processors, spreadsheets, databases, and flowcharting software are used to implement the quality system. All of these applications are subject to the requirement for software validation, but the validation approach used for each application can vary widely.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;So you will say – you still have to do that validation whatever it might be (and if you have any past experience with medical software, you are probably not too excited about the prospect). Not exactly – because one has to draw a line somewhere. &lt;/p&gt; &lt;p&gt;Do you have to validate OS you use for development? C++ compiler you are using? That surely would be too much work, and FDA recognizes that, defining that the degree of validation for off-the-shelf software applications used in quality process depends – depends on risk posed by the specific software usage,&amp;nbsp; role of the software in the process, vendor supplied information etc. (for more details, have a look at “&lt;a href="http://www.fda.gov/cdrh/comp/guidance/938.html#_Toc517237968" target="_blank"&gt;Validation of off-the-shelf software and automated equipment&lt;/a&gt;”)&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;While I do not mean that your regulatory guys do not earn their bread and butter, the whole standard thing seems to be a little bit overrated. FDA is not that much of a boogeyman – for example, one of the principles of software validation document mentioned above is “least burdensome approach”. Meaning that the quality of the software is not necessarily measured by the weight of the documents you produce :).&lt;/p&gt; &lt;p&gt;And getting back to initial question – does TFS meet FDA compliance criteria? Yes it does, but specifics differ depending on TFS place in software development process and on how your regulatory read FDA documentation (with the latter usually being responsible for most grief; that’s why I recommend reading FDA guidelines yourself – to get magic out of the process and ask the educated questions).&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;And if anything, FDA documents are probably making much more sense than some unregulated documents I came across.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26229238-6938398140546874417?l=teamfoundation.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/teamfoundation/~4/-6WIPVsFYc0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://teamfoundation.blogspot.com/feeds/6938398140546874417/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=26229238&amp;postID=6938398140546874417" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/6938398140546874417?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/6938398140546874417?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/teamfoundation/~3/-6WIPVsFYc0/is-tfs-fda-compliant-is-anything.html" title="Is TFS FDA compliant? Is anything?" /><author><name>eugenez</name><uri>http://www.blogger.com/profile/09637949643994709456</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04453434800404773243" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://teamfoundation.blogspot.com/2009/02/is-tfs-fda-compliant-is-anything.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQARH8_fyp7ImA9WxVRFU8.&quot;"><id>tag:blogger.com,1999:blog-26229238.post-7648851707164589551</id><published>2009-01-20T23:52:00.001-08:00</published><updated>2009-01-20T23:52:25.147-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-20T23:52:25.147-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Misc" /><title>Word on securing intellectual property</title><content type="html">&lt;p&gt;Do you care about &lt;em&gt;your&lt;/em&gt; intellectual property? I am sure that the answer is yes. Now how about related question – are you doing anything to make sure that &lt;em&gt;your&lt;/em&gt; intellectual property stays &lt;em&gt;yours&lt;/em&gt;?&lt;/p&gt; &lt;p&gt;Even if you answered yes to the last question, it is not easy to cover all aspects of the problem. Some of more detailed questions you might want to answer:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Can you establish that certain code is yours in the face of possible legal action?  &lt;li&gt;Can you establish the fact that reasonable precautions were undertaken to secure the source code?  &lt;li&gt;How do you make sure that your proprietary code is not leaking into public domain?&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;* - If you have additional compliance to worry about (such as FDA), additional questions may need to be answered. &lt;/p&gt; &lt;p&gt;There are some small things you have to do proactively to make sure you are covered from the legal perspective. While I am not an expert in law, I do have couple of them to offer for your consideration:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Start adding copyright notices in your source code (such tools as &lt;a href="http://code.msdn.microsoft.com/sourceanalysis" target="_blank"&gt;&lt;strong&gt;StyleCop&lt;/strong&gt;&lt;/a&gt; can help you with enforcing this practice)  &lt;li&gt;While term “reasonable precautions” has a lot of legal nuances, at the very least that means that source code never leaves the premises (think about the situation where the developer uses source code at client’s site as a shortcut to fixing the problem) &lt;li&gt;If you have sensitive information as part of your source code repository (such as proprietary algorithms), you may have to be more restrictive; that is to make sure that the access to such information is granted only on “need-to-know” basis&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;If you happen to have any hard earned advice on the matter, please share it in the comment.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26229238-7648851707164589551?l=teamfoundation.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/teamfoundation/~4/Us_kTVzVQZ8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://teamfoundation.blogspot.com/feeds/7648851707164589551/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=26229238&amp;postID=7648851707164589551" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/7648851707164589551?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/7648851707164589551?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/teamfoundation/~3/Us_kTVzVQZ8/word-on-securing-intellectual-property.html" title="Word on securing intellectual property" /><author><name>eugenez</name><uri>http://www.blogger.com/profile/09637949643994709456</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04453434800404773243" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://teamfoundation.blogspot.com/2009/01/word-on-securing-intellectual-property.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4EQ389cSp7ImA9WxVSF0w.&quot;"><id>tag:blogger.com,1999:blog-26229238.post-9067771926163858637</id><published>2009-01-11T16:08:00.001-08:00</published><updated>2009-01-11T16:08:22.169-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-11T16:08:22.169-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="migration" /><category scheme="http://www.blogger.com/atom/ns#" term="TFS" /><category scheme="http://www.blogger.com/atom/ns#" term="HP Quality Center" /><title>HP Quality Center connector is available</title><content type="html">&lt;p&gt;If your organization owns both TFS and Quality Center, and you have to work with both, I bet you asked yourself: “What if two could be magically synchronized?” (without even mentioning the idea of moving QC artifacts into TFS :) &lt;/p&gt; &lt;p&gt;So today you can get the bit responsible for the magick from Microsoft itself – &lt;a href="http://blogs.msdn.com/jimlamb/archive/2009/01/06/tfs-2008-hp-quality-center-connector-december-pre-release.aspx" target="_blank"&gt;read all&lt;/a&gt; about &lt;a href="http://blogs.msdn.com/jimlamb/archive/2009/01/06/tfs-2008-hp-quality-center-connector-december-pre-release.aspx" target="_blank"&gt;&lt;strong&gt;HP Quality Center Connector &lt;/strong&gt;&lt;/a&gt;at &lt;a href="http://blogs.msdn.com/jimlamb" target="_blank"&gt;Jim Lamb’s blog&lt;/a&gt;. And since it is pre-release you have a golden chance to use it and let MS know if they missed something &lt;em&gt;you&lt;/em&gt;’d absolutely require.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26229238-9067771926163858637?l=teamfoundation.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/teamfoundation/~4/8O261VW0q5g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://teamfoundation.blogspot.com/feeds/9067771926163858637/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=26229238&amp;postID=9067771926163858637" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/9067771926163858637?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/9067771926163858637?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/teamfoundation/~3/8O261VW0q5g/hp-quality-center-connector-is.html" title="HP Quality Center connector is available" /><author><name>eugenez</name><uri>http://www.blogger.com/profile/09637949643994709456</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04453434800404773243" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://teamfoundation.blogspot.com/2009/01/hp-quality-center-connector-is.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUYCRH4-eip7ImA9WxRaGU0.&quot;"><id>tag:blogger.com,1999:blog-26229238.post-6578494257651300948</id><published>2008-12-21T15:46:00.001-08:00</published><updated>2008-12-21T15:46:05.052-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-21T15:46:05.052-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="CodePlex" /><category scheme="http://www.blogger.com/atom/ns#" term="TFS" /><category scheme="http://www.blogger.com/atom/ns#" term="branching" /><title>Holiday release of branching guide for TFS</title><content type="html">&lt;p&gt;In case you missed &lt;a href="http://blogs.msdn.com/jeffbe/archive/2008/12/21/tfs-branching-guide-2-0-published.aspx" target="_blank"&gt;the full announcement&lt;/a&gt; (at &lt;a href="http://blogs.msdn.com/jeffbe" target="_blank"&gt;Jeff Beehler’s blog&lt;/a&gt;), I’d put a line about it too. &lt;/p&gt; &lt;p&gt;&lt;a href="http://www.codeplex.com/TFSBranchingGuideII" target="_blank"&gt;New version of TFS Branching Guide&lt;/a&gt; is released at &lt;a href="http://www.codeplex.com" target="_blank"&gt;CodePlex&lt;/a&gt;! In addition to what Jeff already blogged about,&amp;nbsp; three highlights of this version are (in my opinion):&lt;/p&gt; &lt;ul&gt; &lt;li&gt;It provides new content (especially in main and scenario sections) based on real-world TFS implementations  &lt;li&gt;It breaks the content into easily consumable parts (my favorite are Q&amp;amp;A and scenarios), thus opening the way for more updates in the future  &lt;li&gt;There is change of the direction in v2 for how to handle community involvement. V2 document is purported to be a “live” document – that is community is welcome to contribute into this document (this is part of the reason why it is released in several distinct sub-documents). The way to contribute or influence the document is to use CodePlex infrastructure and file work item for it (make sure to specify the section of the document) &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Also at this note, I would like to wish everybody &lt;strong&gt;Merry Xmas&lt;/strong&gt;, &lt;strong&gt;Happy New Year&lt;/strong&gt;, &lt;a href="http://en.wikipedia.org/wiki/Festivus" target="_blank"&gt;&lt;strong&gt;Festivus&lt;/strong&gt;&lt;/a&gt; and happy holidays at large! See you in 2009!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26229238-6578494257651300948?l=teamfoundation.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/teamfoundation/~4/DZfXSzoywlM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://teamfoundation.blogspot.com/feeds/6578494257651300948/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=26229238&amp;postID=6578494257651300948" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/6578494257651300948?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/6578494257651300948?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/teamfoundation/~3/DZfXSzoywlM/holiday-release-of-branching-guide-for.html" title="Holiday release of branching guide for TFS" /><author><name>eugenez</name><uri>http://www.blogger.com/profile/09637949643994709456</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04453434800404773243" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://teamfoundation.blogspot.com/2008/12/holiday-release-of-branching-guide-for.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEMRH4-fCp7ImA9WxRaE08.&quot;"><id>tag:blogger.com,1999:blog-26229238.post-2176497908996066052</id><published>2008-12-14T21:58:00.001-08:00</published><updated>2008-12-14T21:58:05.054-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-14T21:58:05.054-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SCM" /><category scheme="http://www.blogger.com/atom/ns#" term="Misc" /><title>Word about task-driven configuration management</title><content type="html">&lt;p&gt;Recently I read an &lt;a href="http://manageware.wordpress.com/2008/07/29/task-work-item-configuration-management-vs-file-version-based-cm/"&gt;interesting post&lt;/a&gt; that attempts to explain how configuration management process has evolved from “file-based” into “task-based”; and am writing mine as some of the opinions expressed there are arguable.&lt;/p&gt; &lt;p&gt;First of all, the concept of task/feature/change request artifact associated with the changes to code is not new; first commercial CM system, &lt;a href="http://en.wikipedia.org/wiki/AllFusion_Harvest_Change_Manager"&gt;CCC Harvest&lt;/a&gt; (dating from mid-70s) already employed this concept; and &lt;a href="http://www3.ca.com/solutions/Product.aspx?ID=255"&gt;the current version&lt;/a&gt; of the software is still built around such artifacts. Thus the idea of configuration management process driven by the change artifacts rather than by the changes in code files is every bit as traditional.&lt;/p&gt; &lt;p&gt;Another misconception is that configuration management using files-based version control alone is simplistic as compared with task-driven CM. Branch/merge model, labels (snapshots etc.), concurrent check out and other concepts that are file-based provide for pretty flexible environment, and many of the tasks attributed to task-driven tools are achievable (as illustrated, for example, by &lt;a href="http://www.perforce.com"&gt;Perforce&lt;/a&gt;).&amp;nbsp; &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;But it is certainly intriguing how nowadays for most CM tools the integration with meta-data artifacts other than files (however they are called - tasks, CRs, defects etc.) became one of the most important and requested features.&lt;/p&gt; &lt;p&gt;Personally, I have a theory that tasks-driven approach become more popular due to the changes in the way software development is done. While task-driven process was available for years, usually it was an integral part of a rigidly formal structure. The distance between defect filed by the customer support and developer who handled the bug was huge and involved multiple tiers, and smaller shops just did not have the resources required for such multi-tier formalized setup.&lt;/p&gt; &lt;p&gt;But in recent years, development become more and more “agile” (for the lack of better term), and the “path” between code and related artifacts become significantly shorter. And the process itself changed as well – perhaps that’s why the tools that worked well for enterprise in the past (CCC Harvest or IBM Rational ClearCase/ClearQuest) find it increasingly difficult to compete with less formal and more flexible competitors. Microsoft Team Foundation Server is a good example of the tool that can fit into enterprise environment but is still sufficiently agile to be a valid choice for less formal one. &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;There are some things in TFS that you can achieve by using work items in conjunction with source controlled files:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Associate work items with checked in files (and enforce the association using check-in policy); that way every set of checked in files has bug, task, change request etc. aligned with it  &lt;li&gt;Establish what work items are contained in specific build (based on changesets contained, work item – changeset associations and build labels)&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;However, there are things that are not available (out of the box), for example&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Merge changed files from branch to branch based on work items  &lt;li&gt;Get file versions based on work items (f.e. get me versions associated with bug fixes X, Y and Z)  &lt;li&gt;Partition file revisions according to the work items state&lt;/li&gt;&lt;/ul&gt; &lt;p&gt; &lt;p&gt;Important as they are, the missing features hardly pose insurmountable obstacle in TFS adoption (of course, unless you hit some political snags along the way – you know, of the kind “if X is not supported exactly in the way I want it, we are not buying it”). If you believe otherwise, I would be very interested to hear about it.&lt;/p&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26229238-2176497908996066052?l=teamfoundation.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/teamfoundation/~4/rWgIIjCFiS0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://teamfoundation.blogspot.com/feeds/2176497908996066052/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=26229238&amp;postID=2176497908996066052" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/2176497908996066052?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/2176497908996066052?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/teamfoundation/~3/rWgIIjCFiS0/word-about-task-driven-configuration.html" title="Word about task-driven configuration management" /><author><name>eugenez</name><uri>http://www.blogger.com/profile/09637949643994709456</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04453434800404773243" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://teamfoundation.blogspot.com/2008/12/word-about-task-driven-configuration.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEENSHY5eCp7ImA9WxRbGEQ.&quot;"><id>tag:blogger.com,1999:blog-26229238.post-3947021123537034453</id><published>2008-12-09T23:04:00.001-08:00</published><updated>2008-12-09T23:04:59.820-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-09T23:04:59.820-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="version control" /><category scheme="http://www.blogger.com/atom/ns#" term="Misc" /><title>Do you get Git?</title><content type="html">&lt;p&gt;In the spirit of providing links instead of content, here is another link – &lt;a href="http://whygitisbetterthanx.com/" target="_blank"&gt;comparison of Git with other source control systems&lt;/a&gt; popular in OSS world.&lt;/p&gt; &lt;p&gt;And if you do not know what &lt;a href="http://en.wikipedia.org/wiki/Git_(software)" target="_blank"&gt;&lt;strong&gt;Git&lt;/strong&gt;&lt;/a&gt; is, it is well worth a look (perhaps that comparison will excite you enough to have a look).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26229238-3947021123537034453?l=teamfoundation.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/teamfoundation/~4/Zt1Eopn9Vzs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://teamfoundation.blogspot.com/feeds/3947021123537034453/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=26229238&amp;postID=3947021123537034453" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/3947021123537034453?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/3947021123537034453?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/teamfoundation/~3/Zt1Eopn9Vzs/do-you-get-git.html" title="Do you get Git?" /><author><name>eugenez</name><uri>http://www.blogger.com/profile/09637949643994709456</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04453434800404773243" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://teamfoundation.blogspot.com/2008/12/do-you-get-git.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04HRX0yeSp7ImA9WxRbGEQ.&quot;"><id>tag:blogger.com,1999:blog-26229238.post-8763932340210116315</id><published>2008-12-09T22:52:00.001-08:00</published><updated>2008-12-09T22:52:14.391-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-09T22:52:14.391-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="TFS" /><title>Everything you wanted to know about locks in TFS</title><content type="html">&lt;p&gt;I rarely point to links, trying to stick to content instead, but this time I’ll redirect you to an &lt;a href="http://blogs.msdn.com/phkelley/archive/2008/11/12/everything-you-ever-wanted-to-know-about-locks.aspx" target="_blank"&gt;excellent post&lt;/a&gt; by &lt;a href="http://blogs.msdn.com/phkelley" target="_blank"&gt;Philip Kelley&lt;/a&gt;, a developer on TFS VC team. The article nicely summarizes many little known facts related to locking in TFS, such as why locks are not retained in shelvesets, how lock on folder differs from recursive lock on every file and so on.&amp;nbsp; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26229238-8763932340210116315?l=teamfoundation.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/teamfoundation/~4/PpwR9aTR_m4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://teamfoundation.blogspot.com/feeds/8763932340210116315/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=26229238&amp;postID=8763932340210116315" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/8763932340210116315?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/8763932340210116315?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/teamfoundation/~3/PpwR9aTR_m4/everything-you-wanted-to-know-about.html" title="Everything you wanted to know about locks in TFS" /><author><name>eugenez</name><uri>http://www.blogger.com/profile/09637949643994709456</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04453434800404773243" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://teamfoundation.blogspot.com/2008/12/everything-you-wanted-to-know-about.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UAQX0_fCp7ImA9WxRbEk0.&quot;"><id>tag:blogger.com,1999:blog-26229238.post-5173144637389602387</id><published>2008-12-01T23:00:00.001-08:00</published><updated>2008-12-01T23:00:40.344-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-01T23:00:40.344-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="VS2008" /><category scheme="http://www.blogger.com/atom/ns#" term="VS" /><category scheme="http://www.blogger.com/atom/ns#" term="unit test" /><title>Case of never ending unit tests</title><content type="html">&lt;p&gt;Couple of days ago I came across very weird issue on my new box – unit tests that were started (either from within Visual Studio or using MSTest command-line) would never complete. Test run would just hang pending forever.&lt;/p&gt; &lt;p&gt;Since I was running latest and greatest VS2008 with SP1, I have started blaming permissions first, and then new Windows bugs (since I was running Windows 7 build), and that did not help (does it ever?).&lt;/p&gt; &lt;p&gt;As it turned out, the problem was my &lt;em&gt;computer name&lt;/em&gt;. It was all &lt;em&gt;lower case &lt;/em&gt;(upper case does not exhibit the problem), and somehow that prevented unit tests run from ever completing (even without any TFS stuff – just plain unit tests). The workaround is to change the computer name (either using Computer-&amp;gt;Properties, or by tweaking the registry if you cannot do it [for example, when computer is joined to a domain]). The steps are described in &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/vststest/thread/fd6f2128-e248-4336-b8be-1eb5480e3de8/" target="_blank"&gt;this helpful MSDN post&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Thanks for the workaround go to &lt;a href="http://blogs.msdn.com/edhintz/" target="_blank"&gt;Ed Hintz&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26229238-5173144637389602387?l=teamfoundation.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/teamfoundation/~4/NuA1g4WIfyQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://teamfoundation.blogspot.com/feeds/5173144637389602387/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=26229238&amp;postID=5173144637389602387" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/5173144637389602387?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/5173144637389602387?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/teamfoundation/~3/NuA1g4WIfyQ/case-of-never-ending-unit-tests.html" title="Case of never ending unit tests" /><author><name>eugenez</name><uri>http://www.blogger.com/profile/09637949643994709456</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04453434800404773243" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://teamfoundation.blogspot.com/2008/12/case-of-never-ending-unit-tests.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0AEQXo6eyp7ImA9WxRUEkg.&quot;"><id>tag:blogger.com,1999:blog-26229238.post-6307198999382395360</id><published>2008-11-20T23:15:00.001-08:00</published><updated>2008-11-20T23:15:00.413-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-20T23:15:00.413-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="VS2008" /><category scheme="http://www.blogger.com/atom/ns#" term="Misc" /><category scheme="http://www.blogger.com/atom/ns#" term="VSTS" /><title>Case of duplicate VSMDI files – resolved?</title><content type="html">&lt;p&gt;&lt;/p&gt; &lt;p&gt;If you are using VSMDI files, chances are you know what I am talking about. You get all your test lists defined, tests running, sun is shining and suddenly, out of nowhere second and then third VSMDI files get created.&lt;/p&gt; &lt;p&gt;The problem is pretty irritating one, as can be witnessed by some &lt;a href="http://social.msdn.microsoft.com/forums/en-US/vststest/thread/4641bb37-920f-4c9a-a203-9c5f05095b97/" target="_blank"&gt;angry posts&lt;/a&gt; at MSDN. The problem also seems to be a complicated one because it can happen in multiple scenarios, and some of those scenarios are not readily reproducible. The reproducible scenarios are:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;The solution with VSMDI file is not under version control, but VSMDI file is read-only. When Visual Studio needs to change it, new file (with suffix 1, 2 etc.) is created&lt;/li&gt; &lt;li&gt;The solution with VSMDI file is under version control, and VSMDI file is checked out with exclusive lock. When Visual Studio needs to change it, automatic check out is attempted and fails, and new file (with suffix 1, 2 etc.) is created&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Other scenarios appear to involve Test List editor tool window, and not reproducible in 100% of cases.&lt;/p&gt; &lt;p&gt;So you’d say – that’s all very interesting, but how about fixing that? There are several ways to go about it.&lt;/p&gt; &lt;p&gt;First of all, scenarios involving read-only VSMDI files should be easily fixed (by removing r/o flag). In case of source controlled solution, there is &lt;a href="http://support.microsoft.com/kb/957358" target="_blank"&gt;&lt;strong&gt;KB support article 957358 &lt;/strong&gt;&lt;/a&gt;detailing steps to avoid that.&lt;/p&gt; &lt;p&gt;Secondly, there is piece of advice that I really like (courtesy of &lt;a href="http://teamsystemrocks.com/blogs/chris_menegays_weblog/" target="_blank"&gt;Chris Menegay&lt;/a&gt;) – always modify VSMDI files by double-clicking the file in Solution Explorer (and not by using Test List editor etc.). From my experience, it appeared to work magically.&lt;/p&gt; &lt;p&gt;And lastly, most of these scenarios are fixed in Visual Studio 2008 SP1. If you have installed service pack, and still observe duplicated files appearing, folks at MS would be every interested to know about it. Leave a comment or drop me a line.&lt;/p&gt; &lt;p&gt;In next version of Visual Studio, VS 2010, the pain associated with VSMDI files should go away as there is a whole lot of changes in the way testing is done.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26229238-6307198999382395360?l=teamfoundation.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/teamfoundation/~4/rX3kb_RXLes" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://teamfoundation.blogspot.com/feeds/6307198999382395360/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=26229238&amp;postID=6307198999382395360" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/6307198999382395360?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/6307198999382395360?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/teamfoundation/~3/rX3kb_RXLes/case-of-duplicate-vsmdi-files-resolved.html" title="Case of duplicate VSMDI files – resolved?" /><author><name>eugenez</name><uri>http://www.blogger.com/profile/09637949643994709456</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04453434800404773243" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://teamfoundation.blogspot.com/2008/11/case-of-duplicate-vsmdi-files-resolved.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4NSX04eip7ImA9WxRUEEo.&quot;"><id>tag:blogger.com,1999:blog-26229238.post-658944928876225617</id><published>2008-11-18T22:59:00.001-08:00</published><updated>2008-11-18T22:59:58.332-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-18T22:59:58.332-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="VS" /><category scheme="http://www.blogger.com/atom/ns#" term="StyleCop" /><title>StyleCop November news</title><content type="html">&lt;p&gt;Just a couple of interesting and very useful articles related to StyleCop.&lt;/p&gt; &lt;p&gt;First, &lt;a href="http://blogs.msdn.com/sourceanalysis" target="_blank"&gt;Jason Allor&lt;/a&gt; writes about how to &lt;a href="http://blogs.msdn.com/sourceanalysis/archive/2008/11/11/introducing-stylecop-on-legacy-projects.aspx" target="_blank"&gt;gradually integrate StyleCop into legacy projects&lt;/a&gt;. The biggest problem with StyleCop (and FxCop for that matter) when you start enforcing rules on legacy projects, is what to do about all legacy code that is not compliant. Well, for StyleCop there is an easy way out (since it operates on source code files) - it is possible to edit C# project file and so all legacy files are ignored during the analysis. &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Another interesting project from &lt;a href="http://blogs.conchango.com/howardvanrooijen" target="_blank"&gt;Howard van Rooijen&lt;/a&gt; is &lt;a href="http://blogs.conchango.com/howardvanrooijen/archive/2008/11/06/new-release-of-stylecop-for-resharper.aspx" target="_blank"&gt;integration of StyleCop with ReSharper&lt;/a&gt;. Not only it displays StyleCop warnings the same way it does ReSharper warnings, it also provides automated correction options. I am not a big fan of automatic fixes for static code analysis issues (since there should be some thinking involved in most cases), but with StyleCop kind of warnings this is very useful. Not many people fancy removing spaces or changing indentation manually – unless you get paid by the hour that is :)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26229238-658944928876225617?l=teamfoundation.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/teamfoundation/~4/4SPD-xtT2Yo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://teamfoundation.blogspot.com/feeds/658944928876225617/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=26229238&amp;postID=658944928876225617" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/658944928876225617?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/658944928876225617?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/teamfoundation/~3/4SPD-xtT2Yo/stylecop-november-news.html" title="StyleCop November news" /><author><name>eugenez</name><uri>http://www.blogger.com/profile/09637949643994709456</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04453434800404773243" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://teamfoundation.blogspot.com/2008/11/stylecop-november-news.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQARHk8eSp7ImA9WxRUEEo.&quot;"><id>tag:blogger.com,1999:blog-26229238.post-7149136776462840184</id><published>2008-11-18T22:32:00.001-08:00</published><updated>2008-11-18T22:32:25.771-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-18T22:32:25.771-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Lab Manager" /><category scheme="http://www.blogger.com/atom/ns#" term="VS2010" /><title>Get ready for Lab Management</title><content type="html">&lt;p&gt;I was going to write about it for a while, but got swamped &lt;a href="http://teamfoundation.blogspot.com/2008/11/changing-colors.html" target="_blank"&gt;with relocation and such&lt;/a&gt;. But luckily, somebody else written a post summing it up nicely, so I can just put up the link :)&lt;/p&gt; &lt;p&gt;So here – the technology I wanted to write about is something absolutely new that is coming with Visual Studio Team System 2010. &lt;strong&gt;Lab Management &lt;/strong&gt;is going to change the way you do the testing in the enterprise, and it is one technology you might want to follow closely.&lt;/p&gt; &lt;p&gt;Think about all the time and effort you could save if you could manage groups of Virtual Machines at once, create new VMs on the fly, and establish association between bug and problem VM image (and since the image will be exactly in the same state as at the time of the bug occurrence, you will get yourself a repro right at your fingertips).&lt;/p&gt; &lt;p&gt;There are alternative products on the market (such as &lt;a href="http://www.vmware.com/products/labmanager/" target="_blank"&gt;VMWare Lab Manager&lt;/a&gt;), however the potential strength of MS offering is in the integration between Lab Manager, Hyper-V and Team Foundation Server (and the product will also provide integration with VMWare ESX offering in addition to Hyper-V).&lt;/p&gt; &lt;p&gt;To read more about why Lab Manager idea is an awesome one and what’s coming, read &lt;a href="http://blogs.technet.com/virtualization/archive/2008/11/12/visual-studio-2010-lab-management-uses-virtualization.aspx" target="_blank"&gt;&lt;strong&gt;this post&lt;/strong&gt;&lt;/a&gt; at &lt;a href="http://blogs.technet.com/virtualization" target="_blank"&gt;Microsoft Visualization Team&lt;/a&gt; blog. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26229238-7149136776462840184?l=teamfoundation.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/teamfoundation/~4/AKiQcx91DDI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://teamfoundation.blogspot.com/feeds/7149136776462840184/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=26229238&amp;postID=7149136776462840184" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/7149136776462840184?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/26229238/posts/default/7149136776462840184?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/teamfoundation/~3/AKiQcx91DDI/get-ready-for-lab-management.html" title="Get ready for Lab Management" /><author><name>eugenez</name><uri>http://www.blogger.com/profile/09637949643994709456</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04453434800404773243" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://teamfoundation.blogspot.com/2008/11/get-ready-for-lab-management.html</feedburner:origLink></entry></feed>
