private MatchResult match(DiffRefs diffRefs, DiffToolInfo difftoolInfo) { FullContextDiffProvider provider = new FullContextDiffProvider(_gitRepository); FullContextDiff context = provider.GetFullContextDiff(diffRefs.LeftSHA, diffRefs.RightSHA, difftoolInfo.Left?.FileName ?? null, difftoolInfo.Right?.FileName ?? null); Debug.Assert(context.Left.Count == context.Right.Count); bool isCurrentSideLeft = difftoolInfo.IsLeftSideCurrent; DiffToolInfo.Side currentSide = isCurrentSideLeft ? difftoolInfo.Left.Value : difftoolInfo.Right.Value; SparsedList <string> firstList = isCurrentSideLeft ? context.Left : context.Right; SparsedList <string> secondList = isCurrentSideLeft ? context.Right : context.Left; SparsedListIterator <string> itFirst = SparsedListUtils.FindNth(firstList.Begin(), currentSide.LineNumber - 1); SparsedListIterator <string> itSecond = SparsedListUtils.Advance(secondList.Begin(), itFirst.Position); return(new MatchResult { LeftLineNumber = isCurrentSideLeft ? currentSide.LineNumber : itSecond.LineNumber + 1, RightLineNumber = isCurrentSideLeft ? itSecond.LineNumber + 1 : currentSide.LineNumber }); }
// isRightSideContext is true when linenumber corresponds to the right side (sha2). // linenumber is one-based private DiffContext createDiffContext(int linenumber, bool isRightSideContext, FullContextDiff context, ContextDepth depth) { int startLineNumber = Math.Max(1, linenumber - depth.Up); int endLineNumber = linenumber + depth.Down; SparsedListIterator <string> itLeft = context.Left.Begin(); SparsedListIterator <string> itRight = context.Right.Begin(); if (isRightSideContext) { itRight = SparsedListUtils.FindNth(itRight, startLineNumber - 1); itLeft = SparsedListUtils.Advance(itLeft, itRight.Position); } else { itLeft = SparsedListUtils.FindNth(itLeft, startLineNumber - 1); itRight = SparsedListUtils.Advance(itRight, itLeft.Position); } DiffContext diffContext = new DiffContext { Lines = new List <DiffContext.Line>() }; int iContextLine = 0; while (true) { int?leftLineNumber = itLeft.LineNumber != null ? itLeft.LineNumber + 1 : null; int?rightLineNumber = itRight.LineNumber != null ? itRight.LineNumber + 1 : null; DiffContext.Line line = getLineContext(leftLineNumber, rightLineNumber, itLeft.Current, itRight.Current); diffContext.Lines.Add(line); if ((leftLineNumber.HasValue && !isRightSideContext && leftLineNumber == linenumber) || (rightLineNumber.HasValue && isRightSideContext && rightLineNumber == linenumber)) { // zero-based index of a selected line in DiffContext.Lines diffContext.SelectedIndex = iContextLine; } if ((leftLineNumber.HasValue && !isRightSideContext && leftLineNumber >= endLineNumber) || (rightLineNumber.HasValue && isRightSideContext && rightLineNumber >= endLineNumber)) { // we've just reached a line that should not be included in the context break; } if (!itLeft.Next() || !itRight.Next()) { // we've just reached the end break; } ++iContextLine; } return(diffContext); }
private int?getOppositeLine(DiffRefs refs, bool isLeftSide, string leftFileName, string rightFileName, int lineNumber) { FullContextDiff context = _git.FullContextDiffProvider.GetFullContextDiff( refs.LeftSHA, refs.RightSHA, leftFileName, rightFileName); Debug.Assert(context.Left.Count == context.Right.Count); SparsedList <string> currentList = isLeftSide ? context.Left : context.Right; SparsedList <string> oppositeList = isLeftSide ? context.Right : context.Left; SparsedListIterator <string> itCurrentList = SparsedListUtils.FindNth(currentList.Begin(), lineNumber - 1); SparsedListIterator <string> itOppositeList = SparsedListUtils.Advance(oppositeList.Begin(), itCurrentList.Position); return(itOppositeList.GetLineNumber() == null ? new int?() : itOppositeList.GetLineNumber().Value + 1); }