Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 61 additions & 12 deletions src/Commands/Diff.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,10 @@ public partial class Diff : Command
private const string PREFIX_LFS_DEL = "-version https://git-lfs.github.com/spec/";
private const string PREFIX_LFS_MODIFY = " version https://git-lfs.github.com/spec/";

public Diff(string repo, Models.DiffOption opt, int unified, bool ignoreWhitespace)
public Diff(string repo, Models.DiffOption opt, int unified, bool ignoreWhitespace, bool ignoreCase = false)
{
_result.TextDiff = new Models.TextDiff();
_ignoreCase = ignoreCase;

WorkingDirectory = repo;
Context = repo;
Expand All @@ -32,7 +33,7 @@ public Diff(string repo, Models.DiffOption opt, int unified, bool ignoreWhitespa
if (Models.DiffOption.IgnoreCRAtEOL)
builder.Append("--ignore-cr-at-eol ");
if (ignoreWhitespace)
builder.Append("--ignore-space-change ");
builder.Append("--ignore-all-space --ignore-blank-lines ");
builder.Append("--unified=").Append(unified).Append(' ');
builder.Append(opt.ToString());

Expand Down Expand Up @@ -245,14 +246,61 @@ private bool ParseLFSChange(string line)

private void ProcessInlineHighlights()
{
if (_deleted.Count > 0)
// Git has no `--ignore-case` option for `diff`, so case-insensitivity is
// handled here. Within a balanced block (equal number of removed/added
// lines, which is how a re-casing shows up) any pair that differs only by
// letter casing is turned into a context (unchanged) line; the remaining
// real changes keep their normal removed/added rendering.
if (_ignoreCase && _deleted.Count > 0 && _deleted.Count == _added.Count)
{
if (_added.Count == _deleted.Count)
var pendingDeleted = new List<Models.TextDiffLine>();
var pendingAdded = new List<Models.TextDiffLine>();

for (int i = 0; i < _deleted.Count; i++)
{
for (int i = _added.Count - 1; i >= 0; i--)
var del = _deleted[i];
var add = _added[i];

if (del.Content.Equals(add.Content, StringComparison.OrdinalIgnoreCase))
{
// Emit any preceding real change first so line order is preserved.
FlushBlock(pendingDeleted, pendingAdded);

_result.TextDiff.DeletedLines--;
_result.TextDiff.AddedLines--;
_result.TextDiff.Lines.Add(new Models.TextDiffLine(
Models.TextDiffLineType.Normal,
add.Content,
add.RawContent,
del.OldLineNumber,
add.NewLineNumber));
}
else
{
var left = _deleted[i];
var right = _added[i];
pendingDeleted.Add(del);
pendingAdded.Add(add);
}
}

FlushBlock(pendingDeleted, pendingAdded);
_deleted.Clear();
_added.Clear();
return;
}

FlushBlock(_deleted, _added);
}

private void FlushBlock(List<Models.TextDiffLine> deleted, List<Models.TextDiffLine> added)
{
if (deleted.Count > 0)
{
if (added.Count == deleted.Count)
{
for (int i = added.Count - 1; i >= 0; i--)
{
var left = deleted[i];
var right = added[i];

if (left.Content.Length > 1024 || right.Content.Length > 1024)
continue;
Expand All @@ -272,14 +320,14 @@ private void ProcessInlineHighlights()
}
}

_result.TextDiff.Lines.AddRange(_deleted);
_deleted.Clear();
_result.TextDiff.Lines.AddRange(deleted);
deleted.Clear();
}

if (_added.Count > 0)
if (added.Count > 0)
{
_result.TextDiff.Lines.AddRange(_added);
_added.Clear();
_result.TextDiff.Lines.AddRange(added);
added.Clear();
}
}

Expand All @@ -289,5 +337,6 @@ private void ProcessInlineHighlights()
private Models.TextDiffLine _last = null;
private int _oldLine = 0;
private int _newLine = 0;
private readonly bool _ignoreCase = false;
}
}
3 changes: 3 additions & 0 deletions src/Resources/Locales/de_DE.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,9 @@ $1, $2, … Werte der Eingabe-Steuerelemente</x:String>
<x:String x:Key="Text.Diff.Binary" xml:space="preserve">BINÄRER VERGLEICH</x:String>
<x:String x:Key="Text.Diff.FileModeChanged" xml:space="preserve">Dateimodus geändert</x:String>
<x:String x:Key="Text.Diff.First" xml:space="preserve">Erster Unterschied</x:String>
<x:String x:Key="Text.Diff.HideCaseOnlyFiles" xml:space="preserve">Dateien mit reinen Groß-/Kleinschreibungsänderungen ausblenden</x:String>
<x:String x:Key="Text.Diff.HideWhitespaceOnlyFiles" xml:space="preserve">Dateien mit reinen Leerzeichen-Änderungen ausblenden</x:String>
<x:String x:Key="Text.Diff.IgnoreCase" xml:space="preserve">Groß-/Kleinschreibung ignorieren</x:String>
<x:String x:Key="Text.Diff.IgnoreWhitespace" xml:space="preserve">Ignoriere Leerzeichen-Änderungen</x:String>
<x:String x:Key="Text.Diff.Image.Blend" xml:space="preserve">ÜBEREINANDER</x:String>
<x:String x:Key="Text.Diff.Image.Difference" xml:space="preserve">DIFFERENZ</x:String>
Expand Down
3 changes: 3 additions & 0 deletions src/Resources/Locales/en_US.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,9 @@
<x:String x:Key="Text.Diff.Binary" xml:space="preserve">BINARY DIFF</x:String>
<x:String x:Key="Text.Diff.FileModeChanged" xml:space="preserve">File Mode Changed</x:String>
<x:String x:Key="Text.Diff.First" xml:space="preserve">First Difference</x:String>
<x:String x:Key="Text.Diff.HideCaseOnlyFiles" xml:space="preserve">Hide Files With Only Case Changes</x:String>
<x:String x:Key="Text.Diff.HideWhitespaceOnlyFiles" xml:space="preserve">Hide Files With Only Whitespace Changes</x:String>
<x:String x:Key="Text.Diff.IgnoreCase" xml:space="preserve">Ignore Case Changes</x:String>
<x:String x:Key="Text.Diff.IgnoreWhitespace" xml:space="preserve">Ignore Whitespace Changes</x:String>
<x:String x:Key="Text.Diff.Image.Blend" xml:space="preserve">BLEND</x:String>
<x:String x:Key="Text.Diff.Image.Difference" xml:space="preserve">DIFFERENCE</x:String>
Expand Down
3 changes: 3 additions & 0 deletions src/Resources/Locales/es_ES.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -363,6 +363,9 @@
<x:String x:Key="Text.Diff.Binary" xml:space="preserve">DIFERENCIA BINARIA</x:String>
<x:String x:Key="Text.Diff.FileModeChanged" xml:space="preserve">Modo de Archivo Cambiado</x:String>
<x:String x:Key="Text.Diff.First" xml:space="preserve">Primera Diferencia</x:String>
<x:String x:Key="Text.Diff.HideCaseOnlyFiles" xml:space="preserve">Ocultar Archivos con Solo Cambios de Mayúsculas/Minúsculas</x:String>
<x:String x:Key="Text.Diff.HideWhitespaceOnlyFiles" xml:space="preserve">Ocultar Archivos con Solo Cambios de Espacios en Blanco</x:String>
<x:String x:Key="Text.Diff.IgnoreCase" xml:space="preserve">Ignorar Cambios de Mayúsculas/Minúsculas</x:String>
<x:String x:Key="Text.Diff.IgnoreWhitespace" xml:space="preserve">Ignorar Cambio de Espacios en Blanco</x:String>
<x:String x:Key="Text.Diff.Image.Blend" xml:space="preserve">MEZCLAR</x:String>
<x:String x:Key="Text.Diff.Image.Difference" xml:space="preserve">DIFERENCIA</x:String>
Expand Down
3 changes: 3 additions & 0 deletions src/Resources/Locales/fr_FR.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -363,6 +363,9 @@
<x:String x:Key="Text.Diff.Binary" xml:space="preserve">DIFF BINAIRE</x:String>
<x:String x:Key="Text.Diff.FileModeChanged" xml:space="preserve">Mode de fichier changé</x:String>
<x:String x:Key="Text.Diff.First" xml:space="preserve">Première différence</x:String>
<x:String x:Key="Text.Diff.HideCaseOnlyFiles" xml:space="preserve">Masquer les fichiers ne contenant que des changements de casse</x:String>
<x:String x:Key="Text.Diff.HideWhitespaceOnlyFiles" xml:space="preserve">Masquer les fichiers ne contenant que des changements d'espaces</x:String>
<x:String x:Key="Text.Diff.IgnoreCase" xml:space="preserve">Ignorer les changements de casse</x:String>
<x:String x:Key="Text.Diff.IgnoreWhitespace" xml:space="preserve">Ignorer les changements d'espaces</x:String>
<x:String x:Key="Text.Diff.Image.Blend" xml:space="preserve">FUSIONNER</x:String>
<x:String x:Key="Text.Diff.Image.Difference" xml:space="preserve">DIFFÉRENCE</x:String>
Expand Down
5 changes: 4 additions & 1 deletion src/Resources/Locales/he_IL.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -363,7 +363,10 @@
<x:String x:Key="Text.Diff.Binary" xml:space="preserve">DIFF בינארי</x:String>
<x:String x:Key="Text.Diff.FileModeChanged" xml:space="preserve">הרשאות הקובץ שונו</x:String>
<x:String x:Key="Text.Diff.First" xml:space="preserve">ההבדל הראשון</x:String>
<x:String x:Key="Text.Diff.IgnoreWhitespace" xml:space="preserve">התעלמות משינויי Whitespace</x:String>
<x:String x:Key="Text.Diff.HideCaseOnlyFiles" xml:space="preserve">הסתרת קבצים עם שינויי רישיות בלבד</x:String>
<x:String x:Key="Text.Diff.HideWhitespaceOnlyFiles" xml:space="preserve">הסתרת קבצים עם שינויי רווחים בלבד</x:String>
<x:String x:Key="Text.Diff.IgnoreCase" xml:space="preserve">התעלמות משינויי רישיות</x:String>
<x:String x:Key="Text.Diff.IgnoreWhitespace" xml:space="preserve">התעלמות משינויי רווחים</x:String>
<x:String x:Key="Text.Diff.Image.Blend" xml:space="preserve">מיזוג</x:String>
<x:String x:Key="Text.Diff.Image.Difference" xml:space="preserve">הבדל</x:String>
<x:String x:Key="Text.Diff.Image.SideBySide" xml:space="preserve">זה לצד זה</x:String>
Expand Down
3 changes: 3 additions & 0 deletions src/Resources/Locales/id_ID.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,9 @@
<x:String x:Key="Text.Diff.Binary" xml:space="preserve">DIFF BINARY</x:String>
<x:String x:Key="Text.Diff.FileModeChanged" xml:space="preserve">Mode Berkas Berubah</x:String>
<x:String x:Key="Text.Diff.First" xml:space="preserve">Perbedaan Pertama</x:String>
<x:String x:Key="Text.Diff.HideCaseOnlyFiles" xml:space="preserve">Sembunyikan Berkas yang Hanya Memiliki Perubahan Huruf Besar/Kecil</x:String>
<x:String x:Key="Text.Diff.HideWhitespaceOnlyFiles" xml:space="preserve">Sembunyikan Berkas yang Hanya Memiliki Perubahan Whitespace</x:String>
<x:String x:Key="Text.Diff.IgnoreCase" xml:space="preserve">Abaikan Perubahan Huruf Besar/Kecil</x:String>
<x:String x:Key="Text.Diff.IgnoreWhitespace" xml:space="preserve">Abaikan Perubahan Whitespace</x:String>
<x:String x:Key="Text.Diff.Image.Blend" xml:space="preserve">BLEND</x:String>
<x:String x:Key="Text.Diff.Image.Difference" xml:space="preserve">DIFFERENCE</x:String>
Expand Down
3 changes: 3 additions & 0 deletions src/Resources/Locales/it_IT.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -337,6 +337,9 @@ ${pure_files:N} Come ${files:N}, ma senza cartelle</x:String>
<x:String x:Key="Text.Diff.Binary" xml:space="preserve">DIFF BINARIO</x:String>
<x:String x:Key="Text.Diff.FileModeChanged" xml:space="preserve">Modalità File Modificata</x:String>
<x:String x:Key="Text.Diff.First" xml:space="preserve">Prima differenza</x:String>
<x:String x:Key="Text.Diff.HideCaseOnlyFiles" xml:space="preserve">Nascondi i file con sole modifiche di maiuscole/minuscole</x:String>
<x:String x:Key="Text.Diff.HideWhitespaceOnlyFiles" xml:space="preserve">Nascondi i file con sole modifiche agli spazi</x:String>
<x:String x:Key="Text.Diff.IgnoreCase" xml:space="preserve">Ignora le modifiche di maiuscole/minuscole</x:String>
<x:String x:Key="Text.Diff.IgnoreWhitespace" xml:space="preserve">Ignora Modifiche agli Spazi</x:String>
<x:String x:Key="Text.Diff.Image.Blend" xml:space="preserve">FUSIONE</x:String>
<x:String x:Key="Text.Diff.Image.Difference" xml:space="preserve">DIFFERENZA</x:String>
Expand Down
3 changes: 3 additions & 0 deletions src/Resources/Locales/ja_JP.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,9 @@
<x:String x:Key="Text.Diff.Binary" xml:space="preserve">バイナリの差分</x:String>
<x:String x:Key="Text.Diff.FileModeChanged" xml:space="preserve">ファイルモードが変更されました</x:String>
<x:String x:Key="Text.Diff.First" xml:space="preserve">最初の差分</x:String>
<x:String x:Key="Text.Diff.HideCaseOnlyFiles" xml:space="preserve">大文字と小文字の変更のみのファイルを非表示</x:String>
<x:String x:Key="Text.Diff.HideWhitespaceOnlyFiles" xml:space="preserve">空白文字の変更のみのファイルを非表示</x:String>
<x:String x:Key="Text.Diff.IgnoreCase" xml:space="preserve">大文字と小文字の変更を無視</x:String>
<x:String x:Key="Text.Diff.IgnoreWhitespace" xml:space="preserve">空白文字の変更を無視</x:String>
<x:String x:Key="Text.Diff.Image.Blend" xml:space="preserve">ブレンド</x:String>
<x:String x:Key="Text.Diff.Image.Difference" xml:space="preserve">色差</x:String>
Expand Down
3 changes: 3 additions & 0 deletions src/Resources/Locales/ko_KR.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,9 @@
<x:String x:Key="Text.Diff.Binary" xml:space="preserve">바이너리 비교</x:String>
<x:String x:Key="Text.Diff.FileModeChanged" xml:space="preserve">파일 모드 변경됨</x:String>
<x:String x:Key="Text.Diff.First" xml:space="preserve">첫 번째 차이점</x:String>
<x:String x:Key="Text.Diff.HideCaseOnlyFiles" xml:space="preserve">대소문자만 변경된 파일 숨기기</x:String>
<x:String x:Key="Text.Diff.HideWhitespaceOnlyFiles" xml:space="preserve">공백만 변경된 파일 숨기기</x:String>
<x:String x:Key="Text.Diff.IgnoreCase" xml:space="preserve">대소문자 변경 무시</x:String>
<x:String x:Key="Text.Diff.IgnoreWhitespace" xml:space="preserve">공백 변경 사항 무시</x:String>
<x:String x:Key="Text.Diff.Image.Blend" xml:space="preserve">혼합</x:String>
<x:String x:Key="Text.Diff.Image.Difference" xml:space="preserve">차이점</x:String>
Expand Down
3 changes: 3 additions & 0 deletions src/Resources/Locales/pt_BR.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,9 @@
<x:String x:Key="Text.DeleteTag.WithRemote" xml:space="preserve">Excluir dos repositórios remotos</x:String>
<x:String x:Key="Text.Diff.Binary" xml:space="preserve">DIFERENÇA BINÁRIA</x:String>
<x:String x:Key="Text.Diff.FileModeChanged" xml:space="preserve">Modo de Arquivo Alterado</x:String>
<x:String x:Key="Text.Diff.HideCaseOnlyFiles" xml:space="preserve">Esconder arquivos com apenas mudanças de maiúsculas/minúsculas</x:String>
<x:String x:Key="Text.Diff.HideWhitespaceOnlyFiles" xml:space="preserve">Esconder arquivos com apenas mudanças de espaço em branco</x:String>
<x:String x:Key="Text.Diff.IgnoreCase" xml:space="preserve">Ignorar mudanças de maiúsculas/minúsculas</x:String>
<x:String x:Key="Text.Diff.IgnoreWhitespace" xml:space="preserve">Ignorar mudanças de espaço em branco</x:String>
<x:String x:Key="Text.Diff.LFS" xml:space="preserve">MUDANÇA DE OBJETO LFS</x:String>
<x:String x:Key="Text.Diff.Next" xml:space="preserve">Próxima Diferença</x:String>
Expand Down
3 changes: 3 additions & 0 deletions src/Resources/Locales/ru_RU.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,9 @@
<x:String x:Key="Text.Diff.Binary" xml:space="preserve">СРАВНЕНИЕ БИНАРНИКОВ</x:String>
<x:String x:Key="Text.Diff.FileModeChanged" xml:space="preserve">Режим файла изменён</x:String>
<x:String x:Key="Text.Diff.First" xml:space="preserve">Первое сравнение</x:String>
<x:String x:Key="Text.Diff.HideCaseOnlyFiles" xml:space="preserve">Скрыть файлы, содержащие только изменения регистра</x:String>
<x:String x:Key="Text.Diff.HideWhitespaceOnlyFiles" xml:space="preserve">Скрыть файлы, содержащие только изменения пробелов</x:String>
<x:String x:Key="Text.Diff.IgnoreCase" xml:space="preserve">Игнорировать изменения регистра</x:String>
<x:String x:Key="Text.Diff.IgnoreWhitespace" xml:space="preserve">Игнорировать изменения пробелов</x:String>
<x:String x:Key="Text.Diff.Image.Blend" xml:space="preserve">СМЕСЬ</x:String>
<x:String x:Key="Text.Diff.Image.Difference" xml:space="preserve">СРАВНЕНИЕ</x:String>
Expand Down
3 changes: 3 additions & 0 deletions src/Resources/Locales/ta_IN.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,9 @@
<x:String x:Key="Text.Diff.Binary" xml:space="preserve">இருமம் வேறுபாடு</x:String>
<x:String x:Key="Text.Diff.FileModeChanged" xml:space="preserve">கோப்பு முறை மாற்றப்பட்டது</x:String>
<x:String x:Key="Text.Diff.First" xml:space="preserve">முதல் வேறுபாடு</x:String>
<x:String x:Key="Text.Diff.HideCaseOnlyFiles" xml:space="preserve">பெரிய/சிறிய எழுத்து மாற்றங்கள் மட்டுமே உள்ள கோப்புகளை மறை</x:String>
<x:String x:Key="Text.Diff.HideWhitespaceOnlyFiles" xml:space="preserve">வெள்ளைவெளி மாற்றங்கள் மட்டுமே உள்ள கோப்புகளை மறை</x:String>
<x:String x:Key="Text.Diff.IgnoreCase" xml:space="preserve">பெரிய/சிறிய எழுத்து மாற்றங்களைப் புறக்கணி</x:String>
<x:String x:Key="Text.Diff.IgnoreWhitespace" xml:space="preserve">வெள்ளைவெளி மாற்றத்தை புறக்கணி</x:String>
<x:String x:Key="Text.Diff.Last" xml:space="preserve">கடைசி வேறுபாடு</x:String>
<x:String x:Key="Text.Diff.LFS" xml:space="preserve">பெகோஅ பொருள் மாற்றம்</x:String>
Expand Down
3 changes: 3 additions & 0 deletions src/Resources/Locales/uk_UA.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,9 @@
<x:String x:Key="Text.Diff.Binary" xml:space="preserve">РІЗНИЦЯ ДЛЯ БІНАРНИХ ФАЙЛІВ</x:String>
<x:String x:Key="Text.Diff.FileModeChanged" xml:space="preserve">Змінено режим файлу</x:String>
<x:String x:Key="Text.Diff.First" xml:space="preserve">Перша відмінність</x:String>
<x:String x:Key="Text.Diff.HideCaseOnlyFiles" xml:space="preserve">Приховати файли, що містять лише зміни регістру</x:String>
<x:String x:Key="Text.Diff.HideWhitespaceOnlyFiles" xml:space="preserve">Приховати файли, що містять лише зміни пробілів</x:String>
<x:String x:Key="Text.Diff.IgnoreCase" xml:space="preserve">Ігнорувати зміни регістру</x:String>
<x:String x:Key="Text.Diff.IgnoreWhitespace" xml:space="preserve">Ігнорувати зміни пробілів</x:String>
<x:String x:Key="Text.Diff.Last" xml:space="preserve">Остання відмінність</x:String>
<x:String x:Key="Text.Diff.LFS" xml:space="preserve">ЗМІНА ОБ'ЄКТА LFS</x:String>
Expand Down
3 changes: 3 additions & 0 deletions src/Resources/Locales/zh_CN.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,9 @@
<x:String x:Key="Text.Diff.Binary" xml:space="preserve">二进制文件</x:String>
<x:String x:Key="Text.Diff.FileModeChanged" xml:space="preserve">文件权限已变化</x:String>
<x:String x:Key="Text.Diff.First" xml:space="preserve">首个差异</x:String>
<x:String x:Key="Text.Diff.HideCaseOnlyFiles" xml:space="preserve">隐藏仅有大小写变化的文件</x:String>
<x:String x:Key="Text.Diff.HideWhitespaceOnlyFiles" xml:space="preserve">隐藏仅有空白符号变化的文件</x:String>
<x:String x:Key="Text.Diff.IgnoreCase" xml:space="preserve">忽略大小写变化</x:String>
<x:String x:Key="Text.Diff.IgnoreWhitespace" xml:space="preserve">忽略空白符号变化</x:String>
<x:String x:Key="Text.Diff.Image.Blend" xml:space="preserve">混合对比</x:String>
<x:String x:Key="Text.Diff.Image.Difference" xml:space="preserve">差异比较</x:String>
Expand Down
Loading