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.Instance.CommentFormat);
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;
}