// 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); } int iContextLine = 0; int selectedIndex = 0; List <DiffContext.Line> lines = new List <DiffContext.Line>(); while (true) { int?leftLineNumber = itLeft.GetLineNumber() != null?itLeft.GetLineNumber() + 1 : null; int?rightLineNumber = itRight.GetLineNumber() != null?itRight.GetLineNumber() + 1 : null; DiffContext.Line line = getLineContext(leftLineNumber, rightLineNumber, itLeft.GetCurrent(), itRight.GetCurrent()); lines.Add(line); if ((leftLineNumber.HasValue && !isRightSideContext && leftLineNumber == linenumber) || (rightLineNumber.HasValue && isRightSideContext && rightLineNumber == linenumber)) { // zero-based index of a selected line in DiffContext.Lines 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(new DiffContext(lines, selectedIndex)); }
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); }
/// <summary> /// Finds an N-th non-null item, where N is passed in 'index' argument /// </summary> public static SparsedListIterator <T> FindNth <T>(SparsedListIterator <T> iterator, int index) where T : class { int skipped = 0; while (true) { if (iterator.GetLineNumber().HasValue) { if (skipped == index) { break; } skipped++; } if (!iterator.Next()) { break; } } return(iterator); }