{"id":3893,"date":"2006-05-01T21:28:00","date_gmt":"2006-05-01T21:28:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/buckh\/2006\/05\/01\/compare-the-content-changes-in-a-shelveset-with-any-checked-in-version\/"},"modified":"2006-05-01T21:28:00","modified_gmt":"2006-05-01T21:28:00","slug":"compare-the-content-changes-in-a-shelveset-with-any-checked-in-version","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/buckh\/compare-the-content-changes-in-a-shelveset-with-any-checked-in-version\/","title":{"rendered":"Compare the content changes in a shelveset with any checked-in version"},"content":{"rendered":"<p>I wrote this snippet recently to compare the edited files in a shelveset with an arbitrary checked-in version of the same files.&nbsp; It&#8217;s another example of how to use the API to show differences.&nbsp; See <a href=\"http:\/\/blogs.msdn.com\/buckh\/archive\/2006\/04\/06\/project_diff.aspx\">How to compare (diff) trees at different versions using the API<\/a> for a different example of comparing checked-in files.<\/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\"><font color=\"#003399\">basic example<\/font><\/a>.<\/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.Text; <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; <\/p>\n<p><span>namespace<\/span>&nbsp;DiffShelveset <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>if<\/span>&nbsp;(args.Length&nbsp;!=&nbsp;<span>2<\/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;This&nbsp;command&nbsp;shows&nbsp;the&nbsp;differences&nbsp;between&nbsp;the&nbsp;shelved&nbsp;edits&#8221;<\/span>); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Error.WriteLine(<span>&#8220;and&nbsp;the&nbsp;specified&nbsp;version&nbsp;of&nbsp;the&nbsp;same&nbsp;files.&#8221;<\/span>); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Error.WriteLine(<span>&#8221;&nbsp;&nbsp;Usage:&nbsp;diffshelveset&nbsp;shelvset[;shelvesetOwner]&nbsp;versionSpec&#8221;<\/span>); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Error.WriteLine(<span>&#8221;&nbsp;&nbsp;Example:&nbsp;diffshelveset&nbsp;BugFix;Alice&nbsp;C123&#8243;<\/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;} <\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>\/\/&nbsp;Determine&nbsp;the&nbsp;server&nbsp;by&nbsp;using&nbsp;the&nbsp;local&nbsp;workspace&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;part&nbsp;of&nbsp;a&nbsp;workspace.&#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;} <\/p>\n<p>&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;VersionControlServer&nbsp;versionControl&nbsp;=&nbsp;(VersionControlServer)&nbsp;tfs.GetService(<span>typeof<\/span>(VersionControlServer)); <\/p>\n<p>&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;DiffShelvedChanges(versionControl,&nbsp;args[<span>0<\/span>],&nbsp;args[<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;&nbsp;&nbsp;&nbsp;&nbsp;<span>catch<\/span>&nbsp;(VersionControlException&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;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;} <\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>static<\/span>&nbsp;<span>void<\/span>&nbsp;DiffShelvedChanges(VersionControlServer&nbsp;versionControl, <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;String&nbsp;shevlesetArg,&nbsp;String&nbsp;versionArg) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>\/\/&nbsp;A&nbsp;TeamFoundationServer&nbsp;object&nbsp;is&nbsp;always&nbsp;the&nbsp;&#8220;parent&#8221;&nbsp;of&nbsp;a&nbsp;VersionControlServer<\/span> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>\/\/&nbsp;object.<\/span> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TeamFoundationServer&nbsp;tfs&nbsp;=&nbsp;versionControl.TeamFoundationServer; <\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>\/\/&nbsp;The&nbsp;shelvesetName;shelvesetOwner&nbsp;format&nbsp;is&nbsp;exactly&nbsp;the&nbsp;same&nbsp;as<\/span> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>\/\/&nbsp;workspaceName;workspaceOwner,&nbsp;so&nbsp;the&nbsp;same&nbsp;class&nbsp;is&nbsp;used&nbsp;for&nbsp;parsing&nbsp;both.<\/span> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;shelvesetName,&nbsp;shelvesetOwner; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WorkspaceSpec.Parse(shevlesetArg,&nbsp;RepositoryConstants.AuthenticatedUser, <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;<span>out<\/span>&nbsp;shelvesetName,&nbsp;<span>out<\/span>&nbsp;shelvesetOwner); <\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>\/\/&nbsp;To&nbsp;improve&nbsp;performance,&nbsp;the&nbsp;PendingChange&nbsp;objects&nbsp;do&nbsp;not&nbsp;normally&nbsp;contain&nbsp;the&nbsp;URLs&nbsp;for<\/span> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>\/\/&nbsp;downloading&nbsp;the&nbsp;file&nbsp;content.&nbsp;&nbsp;In&nbsp;this&nbsp;case,&nbsp;we&nbsp;know&nbsp;that&nbsp;we&nbsp;are&nbsp;going&nbsp;to&nbsp;be&nbsp;downloading<\/span> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>\/\/&nbsp;the&nbsp;file&nbsp;contents,&nbsp;so&nbsp;we&nbsp;set&nbsp;the&nbsp;last&nbsp;parameter&nbsp;to&nbsp;true.&nbsp;&nbsp;Since&nbsp;we&nbsp;want&nbsp;all&nbsp;changes&nbsp;in<\/span> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>\/\/&nbsp;the&nbsp;shelveset,&nbsp;we&nbsp;specify&nbsp;null&nbsp;for&nbsp;the&nbsp;ItemSpecs.<\/span> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PendingSet[]&nbsp;pendingSets&nbsp;=&nbsp;versionControl.QueryShelvedChanges(shelvesetName,&nbsp;shelvesetOwner, <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;&nbsp;&nbsp;&nbsp;<span>null<\/span>,&nbsp;<span>true<\/span>); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>if<\/span>&nbsp;(pendingSets.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;Console.Error.WriteLine(<span>&#8220;No&nbsp;shelveset&nbsp;matched.&#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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>else<\/span>&nbsp;<span>if<\/span>&nbsp;(pendingSets.Length&nbsp;&gt;&nbsp;<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Error.WriteLine(<span>&#8220;More&nbsp;than&nbsp;one&nbsp;shelveset&nbsp;matched.&#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;} <\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PendingChange[]&nbsp;shelvedChanges&nbsp;=&nbsp;pendingSets[<span>0<\/span>].PendingChanges; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>if<\/span>&nbsp;(shelvedChanges.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;Console.Error.WriteLine(<span>&#8220;You&nbsp;don&#8217;t&nbsp;have&nbsp;permission&nbsp;to&nbsp;any&nbsp;of&nbsp;the&nbsp;files&nbsp;involved.&#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;} <\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>\/\/&nbsp;Convert&nbsp;the&nbsp;string&nbsp;argument&nbsp;into&nbsp;a&nbsp;ChangesetVersionSpec,&nbsp;LabelVersionSpec,&nbsp;DateVersionSpec,<\/span> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>\/\/&nbsp;or&nbsp;WorkspaceVersionSpec&nbsp;(all&nbsp;derive&nbsp;from&nbsp;the&nbsp;abstract&nbsp;VersionSpec&nbsp;class).<\/span> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VersionSpec&nbsp;versionSpec&nbsp;=&nbsp;VersionSpec.ParseSingleSpec(versionArg, <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;RepositoryConstants.AuthenticatedUser); <\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>\/\/&nbsp;Now&nbsp;we&nbsp;can&nbsp;diff&nbsp;each&nbsp;change&nbsp;against&nbsp;the&nbsp;version&nbsp;specified.<\/span> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>foreach<\/span>&nbsp;(PendingChange&nbsp;shelvedChange&nbsp;<span>in<\/span>&nbsp;shelvedChanges) <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;We&nbsp;only&nbsp;want&nbsp;files&nbsp;that&nbsp;are&nbsp;being&nbsp;edited,&nbsp;but&nbsp;there&#8217;s&nbsp;nothing&nbsp;to&nbsp;diff&nbsp;if&nbsp;<\/span> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>\/\/&nbsp;the&nbsp;file&nbsp;is&nbsp;guaranteed&nbsp;not&nbsp;to&nbsp;exist&nbsp;at&nbsp;a&nbsp;different&nbsp;version.<\/span> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>if<\/span>&nbsp;(shelvedChange.ItemType&nbsp;!=&nbsp;ItemType.File&nbsp;|| <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;!shelvedChange.IsEdit&nbsp;||&nbsp;shelvedChange.IsAdd&nbsp;||&nbsp;shelvedChange.IsBranch) <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>continue<\/span>; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DiffItemShelvedChange&nbsp;diffChange&nbsp;=&nbsp;<span>new<\/span>&nbsp;DiffItemShelvedChange(shelvesetName, <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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shelvedChange); <\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>\/\/&nbsp;We&nbsp;could&nbsp;have&nbsp;directly&nbsp;created&nbsp;a&nbsp;DiffItemVersionedFile,&nbsp;however&nbsp;it&nbsp;wouldn&#8217;t<\/span> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>\/\/&nbsp;take&nbsp;into&nbsp;account&nbsp;the&nbsp;fact&nbsp;that&nbsp;the&nbsp;file&nbsp;may&nbsp;have&nbsp;had&nbsp;a&nbsp;different&nbsp;name.<\/span> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>\/\/&nbsp;The&nbsp;CreateTargetDiffItem()&nbsp;will&nbsp;take&nbsp;care&nbsp;of&nbsp;all&nbsp;the&nbsp;arcane&nbsp;details,&nbsp;whereas<\/span> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>\/\/&nbsp;the&nbsp;constructor&nbsp;assumes&nbsp;you&nbsp;are&nbsp;specifying&nbsp;exactly&nbsp;what&nbsp;you&nbsp;want.<\/span> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IDiffItem&nbsp;diffVersion&nbsp;=&nbsp;Difference.CreateTargetDiffItem(versionControl, <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;&nbsp;shelvedChange, <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;&nbsp;versionSpec); <\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>\/\/&nbsp;Since&nbsp;the&nbsp;VisualDiff*()&nbsp;methods&nbsp;do&nbsp;not&nbsp;block,&nbsp;we&nbsp;call&nbsp;the&nbsp;more&nbsp;specific<\/span> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>\/\/&nbsp;method&nbsp;so&nbsp;that&nbsp;we&nbsp;can&nbsp;have&nbsp;the&nbsp;call&nbsp;block&nbsp;until&nbsp;the&nbsp;external&nbsp;tool&nbsp;exits.<\/span> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>\/\/&nbsp;If&nbsp;you&nbsp;want&nbsp;to&nbsp;see&nbsp;an&nbsp;example&nbsp;of&nbsp;producing&nbsp;textual&nbsp;diff&nbsp;output&nbsp;instead,<\/span> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>\/\/&nbsp;see&nbsp;the&nbsp;diff&nbsp;call&nbsp;in<\/span> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>\/\/&nbsp;http:\/\/blogs.msdn.com\/buckh\/archive\/2006\/04\/06\/project_diff.aspx.<\/span> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DiffOptions&nbsp;diffOpts&nbsp;=&nbsp;<span>new<\/span>&nbsp;DiffOptions(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diffOpts.UseThirdPartyTool&nbsp;=&nbsp;<span>true<\/span>; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Difference.DiffFiles(versionControl,&nbsp;diffVersion,&nbsp;diffChange,&nbsp;diffOpts, <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;String.Empty,&nbsp;<span>true<\/span>); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br>&nbsp;&nbsp;&nbsp;&nbsp;} <br>} <br><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I wrote this snippet recently to compare the edited files in a shelveset with an arbitrary checked-in version of the same files.&nbsp; It&#8217;s another example of how to use the API to show differences.&nbsp; See How to compare (diff) trees at different versions using the API for a different example of comparing checked-in files. If [&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-3893","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>I wrote this snippet recently to compare the edited files in a shelveset with an arbitrary checked-in version of the same files.&nbsp; It&#8217;s another example of how to use the API to show differences.&nbsp; See How to compare (diff) trees at different versions using the API for a different example of comparing checked-in files. If [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/buckh\/wp-json\/wp\/v2\/posts\/3893","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=3893"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/buckh\/wp-json\/wp\/v2\/posts\/3893\/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=3893"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/buckh\/wp-json\/wp\/v2\/categories?post=3893"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/buckh\/wp-json\/wp\/v2\/tags?post=3893"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}