Пример #1
0
        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}");
            });
        }
        private async Task <IList <WorkItemMigrationState> > FilterWorkItemIds(IValidationContext context, WorkItemTrackingHttpClient client, IDictionary <int, string> workItems)
        {
            // call GetWorkItemIdsForArtifactUrisAsync for target client to get the mapping of artifacturis and ids
            // do a check to see if any of them have already been migrated
            var artifactUris = workItems.Select(a => a.Value).ToList();
            var result       = await ClientHelpers.QueryArtifactUriToGetIdsFromUris(client, artifactUris);

            IList <WorkItemMigrationState> workItemStateList = new List <WorkItemMigrationState>();

            //check if any of the workitems have been migrated before
            foreach (var workItem in workItems)
            {
                try
                {
                    if (ClientHelpers.GetMigratedWorkItemId(result, workItem, out int id))
                    {
                        workItemStateList.Add(new WorkItemMigrationState {
                            SourceId = workItem.Key, TargetId = id, MigrationState = WorkItemMigrationState.State.Existing
                        });
                    }
                    else
                    {
                        workItemStateList.Add(new WorkItemMigrationState {
                            SourceId = workItem.Key, MigrationState = WorkItemMigrationState.State.Create
                        });
                    }
                }
                catch (Exception e)
                {
                    //edge case where we find more than one workitems in the target for the workitem
                    Logger.LogError(LogDestination.File, e, e.Message);
                    //Add this workitem to notmigratedworkitem list
                    workItemStateList.Add(new WorkItemMigrationState {
                        SourceId = workItem.Key, MigrationState = WorkItemMigrationState.State.Error
                    });
                }
            }

            return(workItemStateList);
        }