Skip to content

Commit f88c424

Browse files
authored
fix: handling of last line without newline in hunks (#1907)
Motivation: Some editors (depending on editor configuration) change the last line of a file by adding a missing newline. But in order to keep diffs at a minimum, it's sometimes advisable to not include this change into the commit. This should be possible by discarding the hunk with this change. Now it is possible to discard (or stage/unstage) such a change. Previously discarding such a change was ignored, when there were other changes in the same file.
1 parent 1e0dbcd commit f88c424

File tree

1 file changed

+23
-15
lines changed

1 file changed

+23
-15
lines changed

src/Models/DiffResult.cs

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ public void GenerateNewPatchFromSelection(Change change, string fileBlobGuid, Te
176176
var line = Lines[i];
177177
if (line.Type != TextDiffLineType.Added)
178178
continue;
179-
writer.WriteLine($"+{line.Content}");
179+
WriteLine(writer, '+', line);
180180
}
181181
}
182182

@@ -257,16 +257,16 @@ public void GeneratePatchFromSelection(Change change, string fileTreeGuid, TextD
257257
else if (line.Type == TextDiffLineType.Added)
258258
{
259259
if (revert)
260-
writer.WriteLine($" {line.Content}");
260+
WriteLine(writer, ' ', line);
261261
}
262262
else if (line.Type == TextDiffLineType.Deleted)
263263
{
264264
if (!revert)
265-
writer.WriteLine($" {line.Content}");
265+
WriteLine(writer, ' ', line);
266266
}
267267
else if (line.Type == TextDiffLineType.Normal)
268268
{
269-
writer.WriteLine($" {line.Content}");
269+
WriteLine(writer, ' ', line);
270270
}
271271
}
272272
}
@@ -282,15 +282,15 @@ public void GeneratePatchFromSelection(Change change, string fileTreeGuid, TextD
282282
}
283283
else if (line.Type == TextDiffLineType.Normal)
284284
{
285-
writer.WriteLine($" {line.Content}");
285+
WriteLine(writer, ' ', line);
286286
}
287287
else if (line.Type == TextDiffLineType.Added)
288288
{
289-
writer.WriteLine($"+{line.Content}");
289+
WriteLine(writer, '+', line);
290290
}
291291
else if (line.Type == TextDiffLineType.Deleted)
292292
{
293-
writer.WriteLine($"-{line.Content}");
293+
WriteLine(writer, '-', line);
294294
}
295295
}
296296

@@ -380,16 +380,16 @@ public void GeneratePatchFromSelectionSingleSide(Change change, string fileTreeG
380380
else if (line.Type == TextDiffLineType.Added)
381381
{
382382
if (revert)
383-
writer.WriteLine($" {line.Content}");
383+
WriteLine(writer, ' ', line);
384384
}
385385
else if (line.Type == TextDiffLineType.Deleted)
386386
{
387387
if (!revert)
388-
writer.WriteLine($" {line.Content}");
388+
WriteLine(writer, ' ', line);
389389
}
390390
else if (line.Type == TextDiffLineType.Normal)
391391
{
392-
writer.WriteLine($" {line.Content}");
392+
WriteLine(writer, ' ', line);
393393
}
394394
}
395395
}
@@ -405,15 +405,15 @@ public void GeneratePatchFromSelectionSingleSide(Change change, string fileTreeG
405405
}
406406
else if (line.Type == TextDiffLineType.Normal)
407407
{
408-
writer.WriteLine($" {line.Content}");
408+
WriteLine(writer, ' ', line);
409409
}
410410
else if (line.Type == TextDiffLineType.Added)
411411
{
412412
if (isOldSide)
413413
{
414414
if (revert)
415415
{
416-
writer.WriteLine($" {line.Content}");
416+
WriteLine(writer, ' ', line);
417417
}
418418
else
419419
{
@@ -422,20 +422,20 @@ public void GeneratePatchFromSelectionSingleSide(Change change, string fileTreeG
422422
}
423423
else
424424
{
425-
writer.WriteLine($"+{line.Content}");
425+
WriteLine(writer, '+', line);
426426
}
427427
}
428428
else if (line.Type == TextDiffLineType.Deleted)
429429
{
430430
if (isOldSide)
431431
{
432-
writer.WriteLine($"-{line.Content}");
432+
WriteLine(writer, '-', line);
433433
}
434434
else
435435
{
436436
if (!revert)
437437
{
438-
writer.WriteLine($" {line.Content}");
438+
WriteLine(writer, ' ', line);
439439
}
440440
else
441441
{
@@ -598,6 +598,14 @@ private bool ProcessIndicatorForPatchSingleSide(StreamWriter writer, TextDiffLin
598598
return true;
599599
}
600600

601+
private static void WriteLine(StreamWriter writer, char prefix, TextDiffLine line)
602+
{
603+
writer.WriteLine($"{prefix}{line.Content}");
604+
605+
if (line.NoNewLineEndOfFile)
606+
writer.WriteLine("\\ No newline at end of file");
607+
}
608+
601609
[GeneratedRegex(@"^@@ \-(\d+),?\d* \+(\d+),?\d* @@")]
602610
private static partial Regex REG_INDICATOR();
603611
}

0 commit comments

Comments
 (0)