{"id":3693,"date":"2006-08-12T00:15:00","date_gmt":"2006-08-12T00:15:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/buckh\/2006\/08\/12\/getting-changeset-objects-from-associated-work-items\/"},"modified":"2006-08-12T00:15:00","modified_gmt":"2006-08-12T00:15:00","slug":"getting-changeset-objects-from-associated-work-items","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/buckh\/getting-changeset-objects-from-associated-work-items\/","title":{"rendered":"Getting Changeset objects from associated work items"},"content":{"rendered":"<p>On internal mailing list, someone asked how to do this, and I thought it&#8217;s worth sharing.&nbsp; You can get a <font face=\"Courier New\">Changeset<\/font> object using its artifact&nbsp;URI (aka link) via <font face=\"Courier New\">VersionControlServer.ArtifactProvider<\/font>.&nbsp; Here&rsquo;s how that would look like, based on modifying code from James Manning&rsquo;s blog post<a href=\"http:\/\/blogs.msdn.com\/jmanning\/archive\/2005\/09\/21\/472524.aspx\">http:\/\/blogs.msdn.com\/jmanning\/archive\/2005\/09\/21\/472524.aspx<\/a>.&nbsp; Added\/changed lines are hightlighted.<\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" color=\"blue\" size=\"2\"><span>using<\/span><\/font><font face=\"Courier New\" size=\"2\"><span> System;<br><\/span><\/font><font face=\"Courier New\" color=\"blue\" size=\"2\"><span>using<\/span><\/font><font face=\"Courier New\" size=\"2\"><span> System.Collections.Generic;<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" color=\"blue\" size=\"2\"><span>using<\/span><\/font><font face=\"Courier New\" size=\"2\"><span> Microsoft.TeamFoundation.Client;<br><\/span><\/font><font face=\"Courier New\" color=\"blue\" size=\"2\"><span>using<\/span><\/font><font face=\"Courier New\" size=\"2\"><span> Microsoft.TeamFoundation.WorkItemTracking.Client;<br><\/span><\/font><font face=\"Courier New\" color=\"blue\" size=\"2\"><span>using<\/span><\/font><font face=\"Courier New\" size=\"2\"><span> Microsoft.TeamFoundation;<br><\/span><\/font><b><font face=\"Courier New\" size=\"2\"><span>using Microsoft.TeamFoundation.VersionControl.Client;<\/span><\/font><\/b><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" color=\"blue\" size=\"2\"><span>class<\/span><\/font><font face=\"Courier New\" size=\"2\"><span> <font color=\"teal\"><span>ChangesetsFromWorkItems<br><\/span><\/font><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>{<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp; <font color=\"blue\"><span>static<\/span><\/font> <font color=\"blue\"><span>void<\/span><\/font> Main(<font color=\"blue\"><span>string<\/span><\/font>[] args)<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp; {<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=\"blue\"><span>if<\/span><\/font> (args.Length &lt; 2)<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=\"teal\"><span>Console<\/span><\/font>.Error.Write(<font color=\"maroon\"><span>&#8220;Usage: ChangesetsFromWorkItems &lt;server&gt; &lt;workitemid&gt; [workitemid&#8230;]&#8221;<\/span><\/font>);<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=\"teal\"><span>Environment<\/span><\/font>.Exit(1);<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=\"teal\"><span>TeamFoundationServer<\/span><\/font> server = <font color=\"teal\"><span>TeamFoundationServerFactory<\/span><\/font>.GetServer(args[0]);<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span><font color=\"teal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WorkItemStore<\/span><\/font> wiStore = (<font color=\"teal\"><span>WorkItemStore<\/span><\/font>)server.GetService(<font color=\"blue\"><span>typeof<\/span><\/font>(<font color=\"teal\"><span>WorkItemStore<\/span><\/font>));<br><\/span><\/font><b><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>VersionControlServer vcs = (VersionControlServer) server.GetService(typeof(VersionControlServer));<\/span><\/span><\/font><\/b><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=\"blue\"><span>int<\/span><\/font> workItemId;<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=\"blue\"><span>for<\/span><\/font> (<font color=\"blue\"><span>int<\/span><\/font> i = 1; i &lt; args.Length; i++)<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=\"blue\"><span>if<\/span><\/font> (!<font color=\"blue\"><span>int<\/span><\/font>.TryParse(args[i], <font color=\"blue\"><span>out<\/span><\/font> workItemId))<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=\"teal\"><span>Console<\/span><\/font>.Error.WriteLine(<font color=\"maroon\"><span>&#8220;ignoring unparseable argument {0}&#8221;<\/span><\/font>, args[i]);<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=\"blue\"><span>continue<\/span><\/font>;<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=\"teal\"><span>WorkItem<\/span><\/font> workItem = wiStore.GetWorkItem(workItemId);<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=\"teal\"><span>List<\/span><\/font><span>&lt;<font color=\"blue\"><span>Changeset<\/span><\/font>&gt; associatedChangesets = <font color=\"blue\"><span>new<\/span><\/font> <font color=\"teal\"><span>List<\/span><\/font>&lt;<font color=\"blue\"><span>Changeset<\/span><\/font>&gt;();<br><\/span><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=\"blue\"><span>foreach<\/span><\/font> (<font color=\"teal\"><span>Link<\/span><\/font> link <font color=\"blue\"><span>in<\/span><\/font> workItem.Links)<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=\"teal\"><span>ExternalLink<\/span><\/font> extLink = link <font color=\"blue\"><span>as<\/span><\/font> <font color=\"teal\"><span>ExternalLink<\/span><\/font>;<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=\"blue\"><span>if<\/span><\/font> (extLink != <font color=\"blue\"><span>null<\/span><\/font>)<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=\"teal\"><span>ArtifactId<\/span><\/font> artifact = <font color=\"teal\"><span>LinkingUtilities<\/span><\/font>.DecodeUri(extLink.LinkedArtifactUri);<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=\"blue\"><span>if<\/span><\/font> (<font color=\"teal\"><span>String<\/span><\/font>.Equals(artifact.ArtifactType, <font color=\"maroon\"><span>&#8220;Changeset&#8221;<\/span><\/font>, <font color=\"teal\"><span>StringComparison<\/span><\/font>.Ordinal))<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>\/\/ Convert the artifact URI to Changeset object.<br><\/span><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>associatedChangesets.Add(vcs.ArtifactProvider.GetChangeset(new Uri(extLink.LinkedArtifactUri);<br><\/span><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/span><\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>\/\/ Do something with the changesets.&nbsp; Changes property is an array, each Change<br><\/span><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/ has an Item object, each Item object has a path, download method, etc.<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>&nbsp;&nbsp;&nbsp; }<br><\/span><\/font><font face=\"Courier New\" size=\"2\"><span>}<\/span><\/font><\/p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>On internal mailing list, someone asked how to do this, and I thought it&#8217;s worth sharing.&nbsp; You can get a Changeset object using its artifact&nbsp;URI (aka link) via VersionControlServer.ArtifactProvider.&nbsp; Here&rsquo;s how that would look like, based on modifying code from James Manning&rsquo;s blog posthttp:\/\/blogs.msdn.com\/jmanning\/archive\/2005\/09\/21\/472524.aspx.&nbsp; Added\/changed lines are hightlighted. using System;using System.Collections.Generic; using Microsoft.TeamFoundation.Client;using Microsoft.TeamFoundation.WorkItemTracking.Client;using Microsoft.TeamFoundation;using [&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-3693","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>On internal mailing list, someone asked how to do this, and I thought it&#8217;s worth sharing.&nbsp; You can get a Changeset object using its artifact&nbsp;URI (aka link) via VersionControlServer.ArtifactProvider.&nbsp; Here&rsquo;s how that would look like, based on modifying code from James Manning&rsquo;s blog posthttp:\/\/blogs.msdn.com\/jmanning\/archive\/2005\/09\/21\/472524.aspx.&nbsp; Added\/changed lines are hightlighted. using System;using System.Collections.Generic; using Microsoft.TeamFoundation.Client;using Microsoft.TeamFoundation.WorkItemTracking.Client;using Microsoft.TeamFoundation;using [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/buckh\/wp-json\/wp\/v2\/posts\/3693","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=3693"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/buckh\/wp-json\/wp\/v2\/posts\/3693\/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=3693"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/buckh\/wp-json\/wp\/v2\/categories?post=3693"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/buckh\/wp-json\/wp\/v2\/tags?post=3693"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}