private List<MergeResultModel> MergeExecuteInternal(bool checkInIfSuccess) { var result = new List<MergeResultModel>(); var context = Context; var tfs = context.TeamProjectCollection; var versionControl = tfs.GetService<VersionControlServer>(); var workspace = _workspace; var changesetId = _changeset.ChangesetId; var changesetService = _changesetService; var changeset = changesetService.GetChangeset(changesetId); changeset.Changes = changesetService.GetChanges(changesetId); var mergeOption = _mergeOption; var workItemStore = tfs.GetService<WorkItemStore>(); var workItemIds = changeset.AssociatedWorkItems != null ? changeset.AssociatedWorkItems.Select(w => w.Id).ToList() : new List<int>(); var mergeInfos = _branches; var targetBranches = mergeInfos.Select(m => m.TargetBranch).ToArray(); var pendingChanges = GetChangesetPendingChanges(changeset.Changes); var mergeRelationships = GetMergeRelationships(pendingChanges, targetBranches, versionControl); var commentFormater = new CommentFormater(_settings.CommentFormat, _settings.BranchNameMatches); foreach (var mergeInfo in mergeInfos.Where(b => b.Checked)) { var mergeResultModel = new MergeResultModel { SourceChangesetId = changesetId, BranchInfo = mergeInfo, }; var mergeResult = MergeToBranch(mergeInfo, mergeOption, mergeRelationships, workspace); var targetPendingChanges = GetPendingChanges(mergeInfo.TargetPath, workspace); if (mergeResult == MergeResult.UnexpectedFileRestored) { workspace.Undo(targetPendingChanges.Select(pendingChange => new ItemSpec(pendingChange)).ToArray(), true); mergeResult = MergeByFile(changeset.Changes, mergeInfo.TargetBranch, mergeRelationships, mergeInfo.ChangesetVersionSpec, mergeOption, workspace); targetPendingChanges = GetPendingChangesByFile(mergeRelationships, mergeInfo.TargetBranch, workspace); } if (targetPendingChanges.Count == 0) { mergeResult = MergeResult.NothingMerge; } mergeResultModel.MergeResult = mergeResult; mergeResultModel.PendingChanges = targetPendingChanges; mergeResultModel.WorkItemIds = workItemIds; var trackMergeInfo = GetTrackMergeInfo(mergeInfo, changeset, versionControl); var comment = commentFormater.Format(trackMergeInfo, mergeInfo.TargetBranch, mergeOption); mergeResultModel.Comment = comment; result.Add(mergeResultModel); if (checkInIfSuccess && mergeResultModel.MergeResult == MergeResult.Merged) { var checkInResult = CheckIn(mergeResultModel.PendingChanges, comment, workspace, workItemIds, changeset.PolicyOverride, workItemStore); mergeResultModel.TagetChangesetId = checkInResult.ChangesetId; mergeResultModel.MergeResult = checkInResult.CheckinResult; } } return result; }