public static Chunk FromNewFile([NotNull] VsrModule module, [NotNull] string fileText, int selectionPosition, int selectionLength, bool reset, [NotNull] byte[] filePreamble, [NotNull] Encoding fileContentEncoding) { var result = new Chunk { _startLine = 0 }; int currentPos = 0; string gitEol = module.GetEffectiveSetting("core.eol"); string eol; if (gitEol == "crlf") { eol = "\r\n"; } else if (gitEol == "native") { eol = Environment.NewLine; } else { eol = "\n"; } int eolLength = eol.Length; string[] lines = fileText.Split(new[] { eol }, StringSplitOptions.None); int i = 0; while (i < lines.Length) { string line = lines[i]; string preamble = i == 0 ? new string(fileContentEncoding.GetChars(filePreamble)) : string.Empty; var patchLine = new PatchLine((reset ? "-" : "+") + preamble + line); // do not refactor, there are no breakpoints condition in VS Express if (currentPos <= selectionPosition + selectionLength && currentPos + line.Length >= selectionPosition) { patchLine.Selected = true; } if (i == lines.Length - 1) { if (line != string.Empty) { result.CurrentSubChunk.IsNoNewLineAtTheEnd = VsrModule.NoNewLineAtTheEnd; result.AddDiffLine(patchLine, reset); if (reset && patchLine.Selected) { // if the last line is selected to be reset and there is no new line at the end of file // then we also have to remove the last not selected line in order to add it right again with the "No newline.." indicator PatchLine lastNotSelectedLine = result.CurrentSubChunk.RemovedLines.LastOrDefault(l => !l.Selected); if (lastNotSelectedLine != null) { lastNotSelectedLine.Selected = true; PatchLine clonedLine = lastNotSelectedLine.Clone(); clonedLine.SetOperation("+"); result.CurrentSubChunk.AddedLines.Add(clonedLine); } result.CurrentSubChunk.WasNoNewLineAtTheEnd = VsrModule.NoNewLineAtTheEnd; } } } else { result.AddDiffLine(patchLine, reset); } currentPos += line.Length + eolLength; i++; } return(result); }