{"id":3953,"date":"2006-04-06T10:00:00","date_gmt":"2006-04-06T10:00:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/buckh\/2006\/04\/06\/how-to-compare-diff-trees-at-different-versions-using-the-api\/"},"modified":"2006-04-06T10:00:00","modified_gmt":"2006-04-06T10:00:00","slug":"how-to-compare-diff-trees-at-different-versions-using-the-api","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/buckh\/how-to-compare-diff-trees-at-different-versions-using-the-api\/","title":{"rendered":"How to compare (diff) trees at different versions using the API"},"content":{"rendered":"<p><P>Recently the question of how to compare files and folders came up.&nbsp;&nbsp;TFS version 1 doesn&#8217;t have&nbsp;the project difference type of functionality that was available in VSS.&nbsp; So if you want to write your own, this code sample will help you with the calls to get the information you&#8217;ll want to display.<\/P>\n<P>The code shows two different approaches to getting the information.&nbsp; The first approach is to use the <FONT face=\"Courier New\">GetExtendedItem()<\/FONT> method that Source Control Explorer uses to get much of&nbsp;its information (SCE also uses <FONT face=\"Courier New\">QueryPendingSets()<\/FONT> to be able show the other users with pending changes on an item, but I didn&#8217;t put that in here).&nbsp; Using <FONT face=\"Courier New\">GetExtendedItem()<\/FONT>, you can determine what is different between what&#8217;s in your workspace and&nbsp;the latest in the repository.<\/P>\n<P>The second approach uses a pair of calls to <FONT face=\"Courier New\">GetItems()<\/FONT>.&nbsp; While it won&#8217;t show you whether you or others have pending changes, it will show you the differences between two arbitrary versions of the tree.&nbsp; If you want pending change information, you can use <FONT face=\"Courier New\">GetPendingChanges()<\/FONT> and&nbsp;connect the information with what <FONT face=\"Courier New\">GetItems()<\/FONT> returns.&nbsp; You can connect the two sets of data using the item ID in the <FONT face=\"Courier New\">PendingChange<\/FONT> and <FONT face=\"Courier New\">Item<\/FONT> objects, as I have done in the code in order to tell which items are common between the two versions.<\/P>\n<P>This code also shows how to diff two items.&nbsp; The code below uses the <FONT face=\"Courier New\">Item<\/FONT> object to construct a <FONT face=\"Courier New\">DiffItemVersionedFile<\/FONT>, but there are also <FONT face=\"Courier New\">DiffItemLocalFile<\/FONT>, <FONT face=\"Courier New\">DiffItemPendingChangeBase<\/FONT>, and <FONT face=\"Courier New\">DiffItemShelvedChange<\/FONT> classes.&nbsp; While the code produces a text diff, the comments contain details on how to launch an external diff viewer, which is actually simpler than producing a text diff.<\/P>\n<P>If you are just getting started with the version control API, you&#8217;ll want to start with the <A href=\"http:\/\/blogs.msdn.com\/buckh\/archive\/2006\/03\/15\/552288.aspx\">basic example<\/A>.&nbsp; You may also want to look at the example showing <A href=\"http:\/\/blogs.msdn.com\/buckh\/archive\/2005\/10\/26\/485458.aspx\">how to display sizes and dates of files in the server<\/A> and <A href=\"http:\/\/blogs.msdn.com\/buckh\/archive\/2005\/10\/25\/484854.aspx\">how to display the labels on a file<\/A>.<\/P>\n<P>I&#8217;ve also attached a zip file containing the VS solution for this example.&nbsp; You may need to adjust the project references in order to build the solution.&nbsp; If you haven&#8217;t already done so, you can <A href=\"http:\/\/blogs.msdn.com\/buckh\/archive\/2006\/01\/12\/511886.aspx\">add the TFS assemblies to the .NET tab in the VS Add Reference dialog<\/A>.<\/P>\n<P>You can find the current documentation of the TFS API in the Visual Studio SDK as mentioned <A href=\"http:\/\/blogs.msdn.com\/buckh\/archive\/2005\/12\/09\/502179.aspx\">here<\/A> (the current release is Visual Studio 2005 SDK \u2013 March 2006 CTP for v2).<\/P>\n<DIV><SPAN>using<\/SPAN>&nbsp;System; <BR><SPAN>using<\/SPAN>&nbsp;System.Collections.Generic; <BR><SPAN>using<\/SPAN>&nbsp;System.Diagnostics; <BR><SPAN>using<\/SPAN>&nbsp;System.IO; <BR><SPAN>using<\/SPAN>&nbsp;System.Text; <BR><SPAN>using<\/SPAN>&nbsp;Microsoft.TeamFoundation; <BR><SPAN>using<\/SPAN>&nbsp;Microsoft.TeamFoundation.Client; <BR><SPAN>using<\/SPAN>&nbsp;Microsoft.TeamFoundation.VersionControl.Client; <BR><SPAN>using<\/SPAN>&nbsp;Microsoft.TeamFoundation.VersionControl.Common; <BR><BR><SPAN>namespace<\/SPAN>&nbsp;ProjectDiff <BR>{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>class<\/SPAN>&nbsp;Program <BR>&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>static<\/SPAN>&nbsp;<SPAN>void<\/SPAN>&nbsp;Main(<SPAN>string<\/SPAN>[]&nbsp;args) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;Figure&nbsp;out&nbsp;the&nbsp;workspace&nbsp;information&nbsp;based&nbsp;on&nbsp;the&nbsp;local&nbsp;cache.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WorkspaceInfo&nbsp;wsInfo&nbsp;=&nbsp;Workstation.Current.GetLocalWorkspaceInfo(Environment.CurrentDirectory); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>if<\/SPAN>&nbsp;(wsInfo&nbsp;==&nbsp;<SPAN>null<\/SPAN>) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Error.WriteLine(<SPAN>&#8220;The&nbsp;current&nbsp;directory&nbsp;is&nbsp;not&nbsp;mapped.&#8221;<\/SPAN>); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Environment.Exit(<SPAN>1<\/SPAN>); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;Now&nbsp;we&nbsp;can&nbsp;get&nbsp;to&nbsp;the&nbsp;workspace.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TeamFoundationServer&nbsp;tfs&nbsp;=&nbsp;<SPAN>new<\/SPAN>&nbsp;TeamFoundationServer(wsInfo.ServerUri.AbsoluteUri); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Workspace&nbsp;workspace&nbsp;=&nbsp;wsInfo.GetWorkspace(tfs); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>try<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;Display&nbsp;the&nbsp;differences&nbsp;for&nbsp;the&nbsp;current&nbsp;directory&nbsp;and&nbsp;all&nbsp;of&nbsp;its&nbsp;descendants<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;(fully&nbsp;recursive).<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>if<\/SPAN>&nbsp;(args.Length&nbsp;==&nbsp;<SPAN>0<\/SPAN>) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;Display&nbsp;the&nbsp;differences&nbsp;between&nbsp;what&#8217;s&nbsp;in&nbsp;the&nbsp;workspace&nbsp;compared&nbsp;to&nbsp;latest.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DisplayCurrentDiff(workspace); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>else<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;Display&nbsp;the&nbsp;differences&nbsp;between&nbsp;the&nbsp;two&nbsp;specified&nbsp;versions.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>if<\/SPAN>&nbsp;(args.Length&nbsp;!=&nbsp;<SPAN>2<\/SPAN>) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Error.WriteLine(<SPAN>&#8220;Usage:&nbsp;projectdiff&nbsp;&lt;versionspec&gt;&nbsp;&lt;versionspec&gt;&#8221;<\/SPAN>); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Error.WriteLine(<SPAN>&#8220;Example:&nbsp;projectdiff&nbsp;D04\/06\/06&nbsp;T&#8221;<\/SPAN>); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Error.WriteLine(<SPAN>&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;compare&nbsp;midnight&nbsp;April&nbsp;6,&nbsp;2006&nbsp;and&nbsp;latest&#8221;<\/SPAN>); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Error.WriteLine(<SPAN>&#8220;Example:&nbsp;projectdiff&nbsp;W&nbsp;T&#8221;<\/SPAN>); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Error.WriteLine(<SPAN>&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;compare&nbsp;what&#8217;s&nbsp;in&nbsp;the&nbsp;workspace&nbsp;to&nbsp;latest&#8221;<\/SPAN>); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Environment.Exit(<SPAN>1<\/SPAN>); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;Parse&nbsp;the&nbsp;<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VersionSpec&nbsp;version1&nbsp;=&nbsp;ParseVersionSpec(args[<SPAN>0<\/SPAN>],&nbsp;workspace); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VersionSpec&nbsp;version2&nbsp;=&nbsp;ParseVersionSpec(args[<SPAN>1<\/SPAN>],&nbsp;workspace); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DisplayVersionDiff(workspace,&nbsp;version1,&nbsp;version2); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>catch<\/SPAN>&nbsp;(TeamFoundationServerException&nbsp;e) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;If&nbsp;something&nbsp;goes&nbsp;wrong,&nbsp;such&nbsp;as&nbsp;not&nbsp;having&nbsp;access&nbsp;to&nbsp;the&nbsp;server,&nbsp;display<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;the&nbsp;appropriate&nbsp;error&nbsp;message.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Error.WriteLine(e.Message); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Environment.Exit(<SPAN>1<\/SPAN>); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;This&nbsp;approach&nbsp;uses&nbsp;the&nbsp;same&nbsp;call&nbsp;that&nbsp;Source&nbsp;Control&nbsp;Explorer&nbsp;uses.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>static<\/SPAN>&nbsp;<SPAN>void<\/SPAN>&nbsp;DisplayCurrentDiff(Workspace&nbsp;workspace) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;Let&#8217;s&nbsp;get&nbsp;a&nbsp;list&nbsp;of&nbsp;the&nbsp;files&nbsp;and&nbsp;folders&nbsp;from&nbsp;the&nbsp;server.&nbsp;&nbsp;The&nbsp;ExtendedItem<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;contains&nbsp;information&nbsp;about&nbsp;which&nbsp;version&nbsp;is&nbsp;in&nbsp;the&nbsp;workspace&nbsp;and&nbsp;the&nbsp;latest&nbsp;version<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;on&nbsp;the&nbsp;server.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;You&nbsp;would&nbsp;want&nbsp;to&nbsp;use&nbsp;this&nbsp;approach&nbsp;if&nbsp;you&nbsp;wanted&nbsp;to&nbsp;display&nbsp;the&nbsp;type&nbsp;of<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;information&nbsp;available&nbsp;in&nbsp;the&nbsp;Source&nbsp;Control&nbsp;Explorer.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ItemSpec[]&nbsp;querySpec&nbsp;=&nbsp;<SPAN>new<\/SPAN>&nbsp;ItemSpec[]&nbsp;{&nbsp;<SPAN>new<\/SPAN>&nbsp;ItemSpec(Environment.CurrentDirectory, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RecursionType.Full)&nbsp;}; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExtendedItem[]&nbsp;items&nbsp;=&nbsp;workspace.GetExtendedItems(querySpec,&nbsp;DeletedState.NonDeleted, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ItemType.Any)[<SPAN>0<\/SPAN>]; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;Now&nbsp;let&#8217;s&nbsp;display&nbsp;what&nbsp;we&nbsp;know&nbsp;about&nbsp;each&nbsp;item.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DisplayHeader(<SPAN>&#8220;Files&nbsp;and&nbsp;folders&nbsp;that&nbsp;are&nbsp;at&nbsp;the&nbsp;latest&nbsp;versions:&#8221;<\/SPAN>); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>foreach<\/SPAN>&nbsp;(ExtendedItem&nbsp;item&nbsp;<SPAN>in<\/SPAN>&nbsp;items) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>if<\/SPAN>&nbsp;(item.IsLatest) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DisplayExtendedItem(item,&nbsp;workspace); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DisplayHeader(<SPAN>&#8220;Files&nbsp;and&nbsp;folders&nbsp;that&nbsp;are&nbsp;out&nbsp;of&nbsp;date:&#8221;<\/SPAN>); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>foreach<\/SPAN>&nbsp;(ExtendedItem&nbsp;item&nbsp;<SPAN>in<\/SPAN>&nbsp;items) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>if<\/SPAN>&nbsp;(item.IsInWorkspace&nbsp;&amp;&amp;&nbsp;!item.IsLatest) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DisplayExtendedItem(item,&nbsp;workspace); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DisplayHeader(<SPAN>&#8220;Files&nbsp;and&nbsp;folders&nbsp;not&nbsp;in&nbsp;the&nbsp;workspace:&#8221;<\/SPAN>); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>foreach<\/SPAN>&nbsp;(ExtendedItem&nbsp;item&nbsp;<SPAN>in<\/SPAN>&nbsp;items) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>if<\/SPAN>&nbsp;(!item.IsInWorkspace) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DisplayExtendedItem(item,&nbsp;workspace); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;Displays&nbsp;change&nbsp;and&nbsp;path&nbsp;information&nbsp;from&nbsp;the&nbsp;ExtendedItem.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>static<\/SPAN>&nbsp;<SPAN>void<\/SPAN>&nbsp;DisplayExtendedItem(ExtendedItem&nbsp;item,&nbsp;Workspace&nbsp;workspace) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Write(<SPAN>&#8221;&nbsp;&nbsp;&#8220;<\/SPAN>); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;Indicate&nbsp;whether&nbsp;someone&nbsp;else&nbsp;has&nbsp;a&nbsp;pending&nbsp;change&nbsp;on&nbsp;this&nbsp;file&nbsp;or&nbsp;folder.&nbsp;&nbsp;The<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;ExtendedItem&nbsp;doesn&#8217;t&nbsp;contain&nbsp;the&nbsp;list&nbsp;of&nbsp;users&nbsp;with&nbsp;pending&nbsp;changes&nbsp;on&nbsp;this&nbsp;file.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;For&nbsp;that&nbsp;information,&nbsp;we&#8217;d&nbsp;need&nbsp;to&nbsp;call&nbsp;QueryPendingSets()&nbsp;in&nbsp;addition&nbsp;to&nbsp;<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;GetExtendedItems()&nbsp;and&nbsp;join&nbsp;the&nbsp;two&nbsp;together&nbsp;via&nbsp;the&nbsp;item&nbsp;ID.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>if<\/SPAN>&nbsp;(item.HasOtherPendingChange) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Write(<SPAN>&#8220;^&nbsp;&#8220;<\/SPAN>); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;Show&nbsp;the&nbsp;lock&nbsp;information&nbsp;if&nbsp;someone&nbsp;has&nbsp;locked&nbsp;the&nbsp;file&nbsp;or&nbsp;folder.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>if<\/SPAN>&nbsp;(item.LockStatus&nbsp;!=&nbsp;LockLevel.None) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Write(<SPAN>&#8220;[{0},{1}]&nbsp;&#8220;<\/SPAN>,&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PendingChange.GetLocalizedStringForLockLevel(item.LockStatus), <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item.LockOwner); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;If&nbsp;there&nbsp;is&nbsp;a&nbsp;change&nbsp;pending&nbsp;on&nbsp;the&nbsp;item&nbsp;in&nbsp;the&nbsp;current&nbsp;workspace,&nbsp;display&nbsp;it.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>if<\/SPAN>&nbsp;(item.ChangeType&nbsp;!=&nbsp;ChangeType.None) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Write(<SPAN>&#8220;({0})&nbsp;&#8220;<\/SPAN>,&nbsp;PendingChange.GetLocalizedStringForChangeType(item.ChangeType)); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;Display&nbsp;the&nbsp;local&nbsp;path.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>if<\/SPAN>&nbsp;(!item.IsInWorkspace) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;Get&nbsp;the&nbsp;mapping&nbsp;so&nbsp;that&nbsp;we&nbsp;can&nbsp;determine&nbsp;its&nbsp;local&nbsp;path&nbsp;or&nbsp;that&nbsp;it&nbsp;is&nbsp;cloaked.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WorkingFolder&nbsp;wf&nbsp;=&nbsp;workspace.TryGetWorkingFolderForServerItem(item.TargetServerItem); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;Let&#8217;s&nbsp;skip&nbsp;cloaked&nbsp;items,&nbsp;since&nbsp;the&nbsp;user&nbsp;doesn&#8217;t&nbsp;want&nbsp;them.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>if<\/SPAN>&nbsp;(!wf.IsCloaked) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(wf.LocalItem); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>else<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(item.LocalItem); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;This&nbsp;approach&nbsp;compares&nbsp;two&nbsp;different&nbsp;versions&nbsp;of&nbsp;the&nbsp;tree.&nbsp;&nbsp;When&nbsp;version1&nbsp;is&nbsp;W<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;(the&nbsp;workspace&nbsp;version&nbsp;spec)&nbsp;and&nbsp;version2&nbsp;is&nbsp;T&nbsp;(tip\/latest),&nbsp;the&nbsp;results&nbsp;will&nbsp;be<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;be&nbsp;equivalent&nbsp;to&nbsp;the&nbsp;other&nbsp;approach&nbsp;(we&nbsp;get&nbsp;some&nbsp;different&nbsp;properties).<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>static<\/SPAN>&nbsp;<SPAN>void<\/SPAN>&nbsp;DisplayVersionDiff(Workspace&nbsp;workspace,&nbsp;VersionSpec&nbsp;version1, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VersionSpec&nbsp;version2) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;We&nbsp;need&nbsp;the&nbsp;list&nbsp;of&nbsp;items&nbsp;at&nbsp;the&nbsp;specified&nbsp;versions.&nbsp;&nbsp;This&nbsp;call&nbsp;only&nbsp;gets<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;information&nbsp;about&nbsp;the&nbsp;versions&nbsp;that&nbsp;have&nbsp;been&nbsp;checked&nbsp;in&nbsp;and&nbsp;does&nbsp;not&nbsp;include<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;any&nbsp;pending&nbsp;changes.&nbsp;&nbsp;As&nbsp;a&nbsp;result,&nbsp;it&nbsp;does&nbsp;not&nbsp;return&nbsp;pending&nbsp;adds,&nbsp;branches,<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;and&nbsp;undeletes.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ItemSet&nbsp;itemSet1&nbsp;=&nbsp;workspace.VersionControlServer.GetItems(Environment.CurrentDirectory, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;version1,&nbsp;RecursionType.Full); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ItemSet&nbsp;itemSet2&nbsp;=&nbsp;workspace.VersionControlServer.GetItems(Environment.CurrentDirectory, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;version2,&nbsp;RecursionType.Full); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Item[]&nbsp;items1&nbsp;=&nbsp;itemSet1.Items; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Item[]&nbsp;items2&nbsp;=&nbsp;itemSet2.Items; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;Build&nbsp;hash&nbsp;tables&nbsp;of&nbsp;the&nbsp;items&nbsp;so&nbsp;that&nbsp;we&nbsp;can&nbsp;quickly&nbsp;determine&nbsp;which&nbsp;items<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;are&nbsp;common.&nbsp;&nbsp;Every&nbsp;item&nbsp;in&nbsp;the&nbsp;repository&nbsp;is&nbsp;assigned&nbsp;a&nbsp;unique&nbsp;item&nbsp;ID.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;The&nbsp;item&nbsp;ID&nbsp;never&nbsp;changes,&nbsp;even&nbsp;though&nbsp;the&nbsp;item&#8217;s&nbsp;path&nbsp;(item.ServerItem)&nbsp;may<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;change&nbsp;due&nbsp;to&nbsp;being&nbsp;renamed&nbsp;or&nbsp;moved.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dictionary&lt;<SPAN>int<\/SPAN>,&nbsp;Item&gt;&nbsp;itemHash1&nbsp;=&nbsp;CreateHash(items1); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dictionary&lt;<SPAN>int<\/SPAN>,&nbsp;Item&gt;&nbsp;itemHash2&nbsp;=&nbsp;CreateHash(items2); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;Show&nbsp;items&nbsp;that&nbsp;are&nbsp;the&nbsp;same.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DisplayHeader(<SPAN>&#8220;Same:&#8221;<\/SPAN>); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>foreach<\/SPAN>&nbsp;(Item&nbsp;item&nbsp;<SPAN>in<\/SPAN>&nbsp;itemHash1.Values) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Item&nbsp;item2; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>if<\/SPAN>&nbsp;(itemHash2.TryGetValue(item.ItemId,&nbsp;<SPAN>out<\/SPAN>&nbsp;item2)&nbsp;&amp;&amp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item2.ChangesetId&nbsp;==&nbsp;item.ChangesetId) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(<SPAN>&#8221;&nbsp;&nbsp;&#8220;<\/SPAN>&nbsp;+&nbsp;item2.ServerItem); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;Show&nbsp;items&nbsp;that&nbsp;differ.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DisplayHeader(<SPAN>&#8220;Different:&#8221;<\/SPAN>); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>foreach<\/SPAN>&nbsp;(Item&nbsp;item&nbsp;<SPAN>in<\/SPAN>&nbsp;itemHash1.Values) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Item&nbsp;item2; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>if<\/SPAN>&nbsp;(itemHash2.TryGetValue(item.ItemId,&nbsp;<SPAN>out<\/SPAN>&nbsp;item2)&nbsp;&amp;&amp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item2.ChangesetId&nbsp;!=&nbsp;item.ChangesetId) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;Figure&nbsp;out&nbsp;what&nbsp;changed.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>bool<\/SPAN>&nbsp;showDiff&nbsp;=&nbsp;<SPAN>false<\/SPAN>; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>if<\/SPAN>&nbsp;(item.ItemType&nbsp;==&nbsp;ItemType.File&nbsp;&amp;&amp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;!EqualFileContents(item,&nbsp;item2)) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Write(<SPAN>&#8216;e&#8217;<\/SPAN>); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showDiff&nbsp;=&nbsp;<SPAN>true<\/SPAN>; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>else<\/SPAN>&nbsp;<SPAN>if<\/SPAN>&nbsp;(item.Encoding&nbsp;!=&nbsp;item2.Encoding) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Write(<SPAN>&#8216;n&#8217;<\/SPAN>); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>else<\/SPAN>&nbsp;<SPAN>if<\/SPAN>&nbsp;(item.DeletionId&nbsp;!=&nbsp;item2.DeletionId) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Write(<SPAN>&#8216;d&#8217;<\/SPAN>); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>else<\/SPAN>&nbsp;<SPAN>if<\/SPAN>&nbsp;(item.ServerItem&nbsp;!=&nbsp;item2.ServerItem) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;Note&nbsp;that&nbsp;we&nbsp;used&nbsp;a&nbsp;case-sensitive&nbsp;comparison&nbsp;in&nbsp;order&nbsp;to&nbsp;catch<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;renames&nbsp;where&nbsp;only&nbsp;the&nbsp;case&nbsp;changed.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Write(<SPAN>&#8216;r&#8217;<\/SPAN>); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(<SPAN>&#8221;&nbsp;{0}&#8221;<\/SPAN>,&nbsp;item2.ServerItem); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>if<\/SPAN>&nbsp;(showDiff) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DiffFiles(item,&nbsp;item2); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;Show&nbsp;items&nbsp;only&nbsp;in&nbsp;the&nbsp;first&nbsp;version.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DisplayHeader(<SPAN>&#8220;Only&nbsp;in&nbsp;&#8220;<\/SPAN>&nbsp;+&nbsp;version1.DisplayString&nbsp;+&nbsp;<SPAN>&#8220;:&#8221;<\/SPAN>); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DisplayOnlyInFirst(itemHash1,&nbsp;itemHash2); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;Show&nbsp;items&nbsp;only&nbsp;in&nbsp;the&nbsp;second&nbsp;version.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DisplayHeader(<SPAN>&#8220;Only&nbsp;in&nbsp;&#8220;<\/SPAN>&nbsp;+&nbsp;version2.DisplayString&nbsp;+&nbsp;<SPAN>&#8220;:&#8221;<\/SPAN>); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DisplayOnlyInFirst(itemHash2,&nbsp;itemHash1); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;Fill&nbsp;in&nbsp;the&nbsp;workspace&nbsp;name&nbsp;if&nbsp;it&nbsp;is&nbsp;null.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>static<\/SPAN>&nbsp;VersionSpec&nbsp;ParseVersionSpec(String&nbsp;spec,&nbsp;Workspace&nbsp;workspace) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;user&nbsp;=&nbsp;workspace.VersionControlServer.TeamFoundationServer.AuthenticatedUserName; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VersionSpec&nbsp;version&nbsp;=&nbsp;VersionSpec.ParseSingleSpec(spec,&nbsp;user); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;If&nbsp;the&nbsp;user&nbsp;happened&nbsp;to&nbsp;specify&nbsp;only&nbsp;W&nbsp;for&nbsp;the&nbsp;workspace&nbsp;spec,&nbsp;we&#8217;ll&nbsp;have&nbsp;to<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;fill&nbsp;in&nbsp;the&nbsp;workspace&nbsp;here&nbsp;(the&nbsp;parse&nbsp;method&nbsp;doesn&#8217;t&nbsp;know&nbsp;it).<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WorkspaceVersionSpec&nbsp;wvs&nbsp;=&nbsp;version&nbsp;<SPAN>as<\/SPAN>&nbsp;WorkspaceVersionSpec; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>if<\/SPAN>&nbsp;(wvs&nbsp;!=&nbsp;<SPAN>null<\/SPAN>&nbsp;&amp;&amp;&nbsp;wvs.Name&nbsp;==&nbsp;<SPAN>null<\/SPAN>) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wvs.Name&nbsp;=&nbsp;workspace.Name; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>return<\/SPAN>&nbsp;version; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;Creates&nbsp;a&nbsp;hash&nbsp;table&nbsp;of&nbsp;the&nbsp;files&nbsp;and&nbsp;folders.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>static<\/SPAN>&nbsp;Dictionary&lt;<SPAN>int<\/SPAN>,&nbsp;Item&gt;&nbsp;CreateHash(Item[]&nbsp;items) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dictionary&lt;<SPAN>int<\/SPAN>,&nbsp;Item&gt;&nbsp;itemHash&nbsp;=&nbsp;<SPAN>new<\/SPAN>&nbsp;Dictionary&lt;<SPAN>int<\/SPAN>,&nbsp;Item&gt;(); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>foreach<\/SPAN>&nbsp;(Item&nbsp;item&nbsp;<SPAN>in<\/SPAN>&nbsp;items) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;itemHash.Add(item.ItemId,&nbsp;item); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>return<\/SPAN>&nbsp;itemHash; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;Displays&nbsp;files&nbsp;and&nbsp;folders&nbsp;that&nbsp;are&nbsp;only&nbsp;in&nbsp;the&nbsp;first&nbsp;hash&nbsp;table.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>static<\/SPAN>&nbsp;<SPAN>void<\/SPAN>&nbsp;DisplayOnlyInFirst(Dictionary&lt;<SPAN>int<\/SPAN>,&nbsp;Item&gt;&nbsp;itemHash1, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dictionary&lt;<SPAN>int<\/SPAN>,&nbsp;Item&gt;&nbsp;itemHash2) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>foreach<\/SPAN>&nbsp;(Item&nbsp;item&nbsp;<SPAN>in<\/SPAN>&nbsp;itemHash1.Values) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>if<\/SPAN>&nbsp;(!itemHash2.ContainsKey(item.ItemId)) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(<SPAN>&#8221;&nbsp;&nbsp;&#8220;<\/SPAN>&nbsp;+&nbsp;item.ServerItem); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;Returns&nbsp;true&nbsp;if&nbsp;the&nbsp;contents&nbsp;of&nbsp;the&nbsp;two&nbsp;versions&nbsp;of&nbsp;the&nbsp;file&nbsp;are&nbsp;the&nbsp;same.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>static<\/SPAN>&nbsp;<SPAN>bool<\/SPAN>&nbsp;EqualFileContents(Item&nbsp;item1,&nbsp;Item&nbsp;item2) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>if<\/SPAN>&nbsp;(item1.ContentLength&nbsp;!=&nbsp;item2.ContentLength) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>return<\/SPAN>&nbsp;<SPAN>false<\/SPAN>; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;If&nbsp;the&nbsp;two&nbsp;hash&nbsp;values&nbsp;have&nbsp;different&nbsp;lengths&nbsp;or&nbsp;both&nbsp;have&nbsp;a&nbsp;length&nbsp;of&nbsp;zero,<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;the&nbsp;files&nbsp;are&nbsp;not&nbsp;the&nbsp;same.&nbsp;&nbsp;The&nbsp;only&nbsp;time&nbsp;this&nbsp;would&nbsp;happen&nbsp;would&nbsp;be&nbsp;for<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;files&nbsp;uploaded&nbsp;by&nbsp;clients&nbsp;that&nbsp;have&nbsp;FIPS&nbsp;enforcement&nbsp;enabled&nbsp;(rare).<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;Those&nbsp;clients&nbsp;can&#8217;t&nbsp;compute&nbsp;the&nbsp;MD5&nbsp;hash,&nbsp;so&nbsp;it&nbsp;has&nbsp;a&nbsp;length&nbsp;of&nbsp;zero&nbsp;in&nbsp;that<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;case.&nbsp;&nbsp;To&nbsp;do&nbsp;this&nbsp;right&nbsp;with&nbsp;FIPS,&nbsp;the&nbsp;code&nbsp;would&nbsp;need&nbsp;to&nbsp;compare&nbsp;file<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;contents&nbsp;(call&nbsp;item.DownloadFile()).<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;For&nbsp;information&nbsp;on&nbsp;FIPS&nbsp;enforcement&nbsp;and&nbsp;MD5,&nbsp;see&nbsp;the&nbsp;following&nbsp;link.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;http:\/\/blogs.msdn.com\/shawnfa\/archive\/2005\/05\/16\/417975.aspx<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>if<\/SPAN>&nbsp;(item1.HashValue.Length&nbsp;!=&nbsp;item2.HashValue.Length&nbsp;|| <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item1.HashValue.Length&nbsp;==&nbsp;<SPAN>0<\/SPAN>) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>return<\/SPAN>&nbsp;<SPAN>false<\/SPAN>; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>for<\/SPAN>&nbsp;(<SPAN>int<\/SPAN>&nbsp;i&nbsp;=&nbsp;<SPAN>0<\/SPAN>;&nbsp;i&nbsp;&lt;&nbsp;item1.HashValue.Length;&nbsp;i++) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>if<\/SPAN>&nbsp;(item1.HashValue[i]&nbsp;!=&nbsp;item2.HashValue[i]) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>return<\/SPAN>&nbsp;<SPAN>false<\/SPAN>; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>return<\/SPAN>&nbsp;<SPAN>true<\/SPAN>; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;Display&nbsp;the&nbsp;differences&nbsp;between&nbsp;the&nbsp;two&nbsp;file&nbsp;versions.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>static<\/SPAN>&nbsp;<SPAN>void<\/SPAN>&nbsp;DiffFiles(Item&nbsp;item1,&nbsp;Item&nbsp;item2) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>if<\/SPAN>&nbsp;(item1.ItemType&nbsp;!=&nbsp;ItemType.File) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>return<\/SPAN>; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DiffItemVersionedFile&nbsp;diffItem1&nbsp;=&nbsp;<SPAN>new<\/SPAN>&nbsp;DiffItemVersionedFile(item1,&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>new<\/SPAN>&nbsp;ChangesetVersionSpec(item1.ChangesetId)); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DiffItemVersionedFile&nbsp;diffItem2&nbsp;=&nbsp;<SPAN>new<\/SPAN>&nbsp;DiffItemVersionedFile(item2,&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>new<\/SPAN>&nbsp;ChangesetVersionSpec(item2.ChangesetId)); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;Here&nbsp;we&nbsp;set&nbsp;up&nbsp;the&nbsp;options&nbsp;to&nbsp;show&nbsp;the&nbsp;diffs&nbsp;in&nbsp;the&nbsp;console&nbsp;with&nbsp;the&nbsp;unified&nbsp;diff<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;format.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;If&nbsp;you&nbsp;simply&nbsp;want&nbsp;to&nbsp;launch&nbsp;the&nbsp;external&nbsp;diff&nbsp;viewer,&nbsp;rather&nbsp;than&nbsp;get&nbsp;a&nbsp;text&nbsp;diff,<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;you&nbsp;just&nbsp;need&nbsp;to&nbsp;set&nbsp;UseThirdPartyTool&nbsp;to&nbsp;true.&nbsp;&nbsp;You&nbsp;don&#8217;t&nbsp;need&nbsp;to&nbsp;set&nbsp;any&nbsp;of&nbsp;the<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;other&nbsp;properties&nbsp;to&nbsp;use&nbsp;the&nbsp;external&nbsp;tool.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DiffOptions&nbsp;options&nbsp;=&nbsp;<SPAN>new<\/SPAN>&nbsp;DiffOptions(); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options.UseThirdPartyTool&nbsp;=&nbsp;<SPAN>false<\/SPAN>; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;These&nbsp;settings&nbsp;are&nbsp;just&nbsp;for&nbsp;the&nbsp;text&nbsp;diff&nbsp;(not&nbsp;needed&nbsp;for&nbsp;an&nbsp;external&nbsp;tool).<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options.Flags&nbsp;=&nbsp;DiffOptionFlags.EnablePreambleHandling&nbsp;|&nbsp;DiffOptionFlags.IgnoreWhiteSpace; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options.OutputType&nbsp;=&nbsp;DiffOutputType.Unified; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options.TargetEncoding&nbsp;=&nbsp;Console.OutputEncoding; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options.SourceEncoding&nbsp;=&nbsp;Console.OutputEncoding; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options.StreamWriter&nbsp;=&nbsp;<SPAN>new<\/SPAN>&nbsp;StreamWriter(Console.OpenStandardOutput(),&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.OutputEncoding); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options.StreamWriter.AutoFlush&nbsp;=&nbsp;<SPAN>true<\/SPAN>; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;The&nbsp;last&nbsp;parameter&nbsp;indicates&nbsp;whether&nbsp;the&nbsp;code&nbsp;should&nbsp;block&nbsp;until&nbsp;the&nbsp;external&nbsp;diff<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>\/\/&nbsp;viewer&nbsp;exits.&nbsp;&nbsp;Set&nbsp;it&nbsp;to&nbsp;false&nbsp;if&nbsp;you&nbsp;are&nbsp;calling&nbsp;this&nbsp;from&nbsp;a&nbsp;GUI&nbsp;app.<\/SPAN> <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Difference.DiffFiles(item1.VersionControlServer,&nbsp;diffItem1,&nbsp;diffItem2, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options,&nbsp;item1.ServerItem,&nbsp;<SPAN>true<\/SPAN>); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>static<\/SPAN>&nbsp;<SPAN>void<\/SPAN>&nbsp;DisplayHeader(String&nbsp;header) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(String.Empty.PadLeft(<SPAN>80<\/SPAN>,&nbsp;<SPAN>&#8216;=&#8217;<\/SPAN>)); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(header); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR>} <BR><\/DIV><\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/39\/2019\/03\/ProjectDiff.zip\">ProjectDiff.zip<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Recently the question of how to compare files and folders came up.&nbsp;&nbsp;TFS version 1 doesn&#8217;t have&nbsp;the project difference type of functionality that was available in VSS.&nbsp; So if you want to write your own, this code sample will help you with the calls to get the information you&#8217;ll want to display. The code shows two [&hellip;]<\/p>\n","protected":false},"author":94,"featured_media":10268,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[6,8,15],"class_list":["post-3953","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-source-control","tag-team-foundation","tag-tfs-api"],"acf":[],"blog_post_summary":"<p>Recently the question of how to compare files and folders came up.&nbsp;&nbsp;TFS version 1 doesn&#8217;t have&nbsp;the project difference type of functionality that was available in VSS.&nbsp; So if you want to write your own, this code sample will help you with the calls to get the information you&#8217;ll want to display. The code shows two [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/buckh\/wp-json\/wp\/v2\/posts\/3953","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/buckh\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/buckh\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/buckh\/wp-json\/wp\/v2\/users\/94"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/buckh\/wp-json\/wp\/v2\/comments?post=3953"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/buckh\/wp-json\/wp\/v2\/posts\/3953\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/buckh\/wp-json\/wp\/v2\/media\/10268"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/buckh\/wp-json\/wp\/v2\/media?parent=3953"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/buckh\/wp-json\/wp\/v2\/categories?post=3953"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/buckh\/wp-json\/wp\/v2\/tags?post=3953"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}