Ejemplo n.º 1
0
        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
            });
        }
Ejemplo n.º 2
0
        // 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);
        }
Ejemplo n.º 3
0
        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);
        }