|
| 1 | +Imports System.Management.Automation |
| 2 | +Imports System.Text.RegularExpressions |
| 3 | +Imports Microsoft.TeamFoundation.WorkItemTracking.Client |
| 4 | + |
| 5 | +<Cmdlet(VerbsCommon.Get, "UnlinkedChanges")> |
| 6 | +Public Class GetUnlinkedChanges |
| 7 | + Inherits PSCmdlet |
| 8 | + |
| 9 | + <Parameter(Mandatory:=True, |
| 10 | + ValueFromPipelineByPropertyName:=True, |
| 11 | + ValueFromPipeline:=True, |
| 12 | + Position:=0, |
| 13 | + ParameterSetName:="URL", |
| 14 | + HelpMessage:="The URL of the TFS collection to access.")> |
| 15 | + Property ServerURL As Uri |
| 16 | + |
| 17 | + <Parameter(Mandatory:=True, |
| 18 | + ValueFromPipelineByPropertyName:=True, |
| 19 | + ValueFromPipeline:=True, |
| 20 | + Position:=0, |
| 21 | + ParameterSetName:="Collection", |
| 22 | + HelpMessage:="The TFS collection to use.")> |
| 23 | + Property TFSCollection As TFSCollection |
| 24 | + |
| 25 | + '<Parameter(Mandatory:=True, |
| 26 | + ' ValueFromPipelineByPropertyName:=True, |
| 27 | + ' ValueFromPipeline:=True, |
| 28 | + ' Position:=1, |
| 29 | + ' HelpMessage:="The IDs of the work items to retrieve changed files from.")> |
| 30 | + 'Property WorkItemIDs As Integer() |
| 31 | + |
| 32 | + Protected Overrides Sub BeginProcessing() |
| 33 | + MyBase.BeginProcessing() |
| 34 | + Select Case True |
| 35 | + |
| 36 | + Case TFSCollection IsNot Nothing |
| 37 | + 'we are good |
| 38 | + Case TFSCollection Is Nothing AndAlso ServerURL IsNot Nothing |
| 39 | + |
| 40 | + TFSCollection = GetTFSCollection(ServerURL) |
| 41 | + |
| 42 | + End Select |
| 43 | + |
| 44 | + End Sub |
| 45 | + |
| 46 | + Protected Overrides Sub ProcessRecord() |
| 47 | + MyBase.ProcessRecord() |
| 48 | + |
| 49 | + 'Dim changesetRegex As New Regex("vstfs:///VersionControl/Changeset/(\d+)", RegexOptions.Compiled) |
| 50 | + 'Dim changesetLinks = links.Where(Function(l) changesetRegex.IsMatch(l.LinkedArtifactUri)) |
| 51 | + |
| 52 | + 'Dim changesets = changesetLinks.Select(Function(c) vcs.GetChangeset(CInt(changesetRegex.Match(c.LinkedArtifactUri).Groups(1).Value))).DistinctBy(Function(c) c.ChangesetId) |
| 53 | + |
| 54 | + 'Dim changes = changesets.SelectMany(Function(cs) cs.Changes) |
| 55 | + |
| 56 | + 'Dim byItem = From c In changes Group By ServerPath = c.Item.ServerItem Into ItemChanges = Group |
| 57 | + ' Select New FileChangeInfo With {.ServerPath = ServerPath, .Changes = ItemChanges, .LastCheckin = ItemChanges.Max(Function(c) c.Item.CheckinDate)} |
| 58 | + |
| 59 | + 'For Each item In byItem |
| 60 | + |
| 61 | + ' For Each ch In item.Changes.OrderByDescending(Function(c) c.Item.CheckinDate) |
| 62 | + ' WriteObject(item) |
| 63 | + ' Next |
| 64 | + 'Next |
| 65 | + |
| 66 | + ' service.QueryHistory("$/TeamProject/", VersionSpec.Latest, 0, RecursionType.Full, userName, null, null, Int32.MaxValue, True, False) |
| 67 | + ' .Cast<Changeset>() |
| 68 | + '.Where(cs=>cs.AssociatedWorkItems.Length==0) |
| 69 | + |
| 70 | + WriteObject(TFSCollection.ProjectCollection.Name) |
| 71 | + |
| 72 | + End Sub |
| 73 | +End Class |
0 commit comments