public async Task <IEnumerable <JsonPatchOperation> > Process(IMigrationContext migrationContext, IBatchMigrationContext batchContext, WorkItem sourceWorkItem, WorkItem targetWorkItem) { IList <JsonPatchOperation> jsonPatchOperations = new List <JsonPatchOperation>(); if (sourceWorkItem.Relations == null) { return(jsonPatchOperations); } IList <WorkItemRelation> sourceWorkItemLinkRelations = GetWorkItemLinkRelations(migrationContext, sourceWorkItem.Relations); if (sourceWorkItemLinkRelations.Any()) { foreach (WorkItemRelation sourceWorkItemLinkRelation in sourceWorkItemLinkRelations) { int linkedSourceId = ClientHelpers.GetWorkItemIdFromApiEndpoint(sourceWorkItemLinkRelation.Url); int targetWorkItemId = targetWorkItem.Id.Value; int linkedTargetId; if (!migrationContext.SourceToTargetIds.TryGetValue(linkedSourceId, out linkedTargetId)) { continue; } string comment = MigrationHelpers.GetCommentFromAttributes(sourceWorkItemLinkRelation); WorkItemLink newWorkItemLink = new WorkItemLink(linkedTargetId, sourceWorkItemLinkRelation.Rel, false, false, comment, 0); JsonPatchOperation workItemLinkAddOperation = MigrationHelpers.GetWorkItemLinkAddOperation(migrationContext, newWorkItemLink); jsonPatchOperations.Add(workItemLinkAddOperation); } } return(jsonPatchOperations); }
public async Task Preprocess(IMigrationContext migrationContext, IBatchMigrationContext batchContext, IList <WorkItem> sourceWorkItems, IList <WorkItem> targetWorkItems) { var linkedWorkItemArtifactUrls = new HashSet <string>(); foreach (WorkItem sourceWorkItem in sourceWorkItems) { var relations = GetWorkItemLinkRelations(migrationContext, sourceWorkItem.Relations); var linkedIds = relations.Select(r => ClientHelpers.GetWorkItemIdFromApiEndpoint(r.Url)); var uris = linkedIds.Where(id => !migrationContext.SourceToTargetIds.ContainsKey(id)).Select(id => ClientHelpers.GetWorkItemApiEndpoint(migrationContext.Config.SourceConnection.Account, id)); linkedWorkItemArtifactUrls.AddRange(uris); } await linkedWorkItemArtifactUrls.Batch(Constants.BatchSize).ForEachAsync(migrationContext.Config.Parallelism, async(workItemArtifactUris, batchId) => { Logger.LogTrace(LogDestination.File, $"Finding linked work items on target for batch {batchId}"); var results = await ClientHelpers.QueryArtifactUriToGetIdsFromUris(migrationContext.TargetClient.WorkItemTrackingHttpClient, workItemArtifactUris); foreach (var result in results.ArtifactUrisQueryResult) { if (result.Value != null) { if (result.Value.Count() == 1) { var sourceId = ClientHelpers.GetWorkItemIdFromApiEndpoint(result.Key); var targetId = result.Value.First().Id; migrationContext.SourceToTargetIds[sourceId] = targetId; } } } Logger.LogTrace(LogDestination.File, $"Finished finding linked work items on target for batch {batchId}"); }); }
public void GetWorkItemIdFromApiEndpoint_ReturnsCorrectResultWhenEndpointContainsIdFollowedBySlashAtEnd() { string endpointUri = "https://dev.azure.com/account/_apis/wit/workItems/3543/"; int expected = 3543; int actual = ClientHelpers.GetWorkItemIdFromApiEndpoint(endpointUri); Assert.AreEqual(expected, actual); }
public void GetWorkItemIdFromApiEndpoint_ReturnsCorrectResultWhenEndpointContainsQueryString() { string endpointUri = "https://dev.azure.com/account/_apis/wit/workItems/3543?bypassRules=True&suppressNotifications=True&api-version=4.0"; int expected = 3543; int actual = ClientHelpers.GetWorkItemIdFromApiEndpoint(endpointUri); Assert.AreEqual(expected, actual); }
public void GetWorkItemIdFromApiEndpoint_ReturnsCorrectResultWhenEndpointContainsIdAtEnd() { string endpointUri = "https://aaaaaa.visualstudio.com/_apis/wit/workItems/3543"; int expected = 3543; int actual = ClientHelpers.GetWorkItemIdFromApiEndpoint(endpointUri); Assert.AreEqual(expected, actual); }