diff --git a/.gitattributes b/.gitattributes index 64cd3f1e..b785a74c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2,6 +2,7 @@ *.snk binary *.bin binary *.png binary +*.docx binary src/Verify/EmptyFiles/* binary diff --git a/docs/diff-tool.md b/docs/diff-tool.md index 31a631b2..cca9f83a 100644 --- a/docs/diff-tool.md +++ b/docs/diff-tool.md @@ -146,6 +146,7 @@ Non-MDI tools are preferred since it allows [DiffEngineTray](tray.md) to track a * Supports auto-refresh: True * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_BeyondCompare` * Supported binaries: .7z, .bcpkg, .bin, .bmp, .bz, .bz2, .cab, .chm, .deb, .ear, .gif, .gz, .ico, .img, .iso, .iso, .jar, .jpeg, .jpg, .kmz, .nupkg, .pdf, .png, .rar, .rpm, .rtf, .svg, .swm, .tar, .tbz, .tbz2, .tbz2, .tgz, .tif, .tiff, .war, .webp, .wim, .xlsx, .xz, .zip, .zipx @@ -216,6 +217,7 @@ DiffTools.UseOrder(DiffTool.BeyondCompare); * Supports auto-refresh: True * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_DeltaWalker` * Supported binaries: .bmp, .bz2, .doc, .docx, .ear, .gif, .gz, .htm, .html, .ico, .j2k, .jar, .jp2, .jpg, .pbm, .pct, .pdf, .pgm, .pic, .pict, .png, .pnm, .ppm, .ppt, .psd, .rtf, .svg, .tar, .tbz2, .tgz, .tif, .xls, .xlsx, .zip @@ -268,6 +270,7 @@ DiffTools.UseOrder(DiffTool.DeltaWalker); * Supports auto-refresh: True * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_Diffinity` * Supported binaries: .svg @@ -302,6 +305,7 @@ DiffTools.UseOrder(DiffTool.Diffinity); * Supports auto-refresh: True * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_ExamDiff` * Supported binaries: .bin, .svg @@ -342,6 +346,7 @@ DiffTools.UseOrder(DiffTool.ExamDiff); * Supports auto-refresh: False * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_Guiffy` * Supported binaries: .bmp, .gif, .jpeg, .jpg, .png, .svg, .wbmp @@ -397,6 +402,7 @@ DiffTools.UseOrder(DiffTool.Guiffy); * Supports auto-refresh: True * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_Kaleidoscope` * Supported binaries: .bin, .bmp, .gif, .ico, .jpeg, .jpg, .png, .svg, .tif, .tiff @@ -428,6 +434,7 @@ DiffTools.UseOrder(DiffTool.Kaleidoscope); * Supports auto-refresh: False * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_KDiff3` * Supported binaries: .svg @@ -476,6 +483,45 @@ DiffTools.UseOrder(DiffTool.KDiff3); * `/Applications/kdiff3.app/Contents/MacOS/kdiff3` * `%PATH%kdiff3` +### [MsWordDiff](https://github.com/SimonCropp/MsWordDiff) + + * Cost: Free + * Is MDI: False + * Supports auto-refresh: False + * Supports text files: False + * Use shell execute: False + * Create no window: True + * Environment variable for custom install location: `DiffEngine_MsWordDiff` + * Supported binaries: .doc, .docx + +#### Tool order: + +Use [tool order](diff-tool.order.md) to prioritise MsWordDiff over other tools. + +``` +DiffTools.UseOrder(DiffTool.MsWordDiff); +``` + +#### Notes: + + * Install via `dotnet tool install -g MsWordDiff` + * Requires Microsoft Word to be installed + * Uses Word's built-in document comparison feature + +#### Windows settings: + + * Example target on left arguments: + ``` + "targetFile.txt" "tempFile.txt" + ``` + * Example target on right arguments: + ``` + "tempFile.txt" "targetFile.txt" + ``` + * Scanned paths: + * `%USERPROFILE%\.dotnet\tools\diffword.exe` + * `%PATH%diffword.exe` + ### [Neovim](https://neovim.io/) * Cost: Free with option to sponsor @@ -483,6 +529,7 @@ DiffTools.UseOrder(DiffTool.KDiff3); * Supports auto-refresh: False * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_Neovim` * Supported binaries: .svg @@ -545,6 +592,7 @@ DiffTools.UseOrder(DiffTool.Neovim); * Supports auto-refresh: False * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_P4Merge` * Supported binaries: .bmp, .gif, .jpeg, .jpg, .pbm, .pgm, .png, .ppm, .svg, .tif, .tiff, .xbm, .xpm @@ -630,6 +678,7 @@ DiffTools.UseOrder(DiffTool.P4Merge); * Supports auto-refresh: True * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_Rider` * Supported binaries: .svg @@ -698,6 +747,7 @@ DiffTools.UseOrder(DiffTool.Rider); * Supports auto-refresh: False * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_TkDiff` * Supported binaries: .svg @@ -730,6 +780,7 @@ DiffTools.UseOrder(DiffTool.TkDiff); * Supports auto-refresh: False * Supports text files: False * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_TortoiseGitIDiff` * Supported binaries: .bmp, .gif, .ico, .jpeg, .jpg, .png, .tif, .tiff @@ -764,6 +815,7 @@ DiffTools.UseOrder(DiffTool.TortoiseGitIDiff); * Supports auto-refresh: False * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_TortoiseGitMerge` * Supported binaries: .bin, .svg @@ -798,6 +850,7 @@ DiffTools.UseOrder(DiffTool.TortoiseGitMerge); * Supports auto-refresh: False * Supports text files: False * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_TortoiseIDiff` * Supported binaries: .bmp, .gif, .ico, .jpeg, .jpg, .png, .tif, .tiff @@ -832,6 +885,7 @@ DiffTools.UseOrder(DiffTool.TortoiseIDiff); * Supports auto-refresh: False * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_TortoiseMerge` * Supported binaries: .svg @@ -866,6 +920,7 @@ DiffTools.UseOrder(DiffTool.TortoiseMerge); * Supports auto-refresh: True * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_Vim` * Supported binaries: .svg @@ -922,6 +977,7 @@ DiffTools.UseOrder(DiffTool.Vim); * Supports auto-refresh: True * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_WinMerge` * Supported binaries: .bin, .bmp, .bw, .cut, .dds, .exr, .g3, .gif, .hdp, .hdr, .ico, .iff, .j2c, .j2k, .jif, .jng, .jp2, .jpe, .jpeg, .jpg, .jxr, .koa, .lbm, .mng, .pbm, .pcd, .pct, .pcx, .pfm, .pgm, .pic, .pict, .png, .ppm, .psd, .ras, .rgb, .rgba, .sgi, .svg, .targa, .tga, .tif, .tiff, .wap, .wbm, .wbmp, .wdp, .webp, .xbm, .xpm @@ -969,6 +1025,7 @@ DiffTools.UseOrder(DiffTool.WinMerge); * Supports auto-refresh: True * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_AraxisMerge` * Supported binaries: .bmp, .dib, .emf, .gif, .j2c, .j2k, .jif, .jp2, .jpc, .jpeg, .jpg, .jpx, .pbm, .pcx, .pgm, .png, .ppm, .ras, .svg, .tga, .tif, .tiff, .wmf @@ -1024,6 +1081,7 @@ DiffTools.UseOrder(DiffTool.AraxisMerge); * Supports auto-refresh: True * Supports text files: True * Use shell execute: False + * Create no window: False * Environment variable for custom install location: `DiffEngine_Cursor` * Supported binaries: .bin, .svg @@ -1089,6 +1147,7 @@ DiffTools.UseOrder(DiffTool.Cursor); * Supports auto-refresh: False * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_Meld` * Supported binaries: .svg @@ -1155,6 +1214,7 @@ DiffTools.UseOrder(DiffTool.Meld); * Supports auto-refresh: False * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_SublimeMerge` * Supported binaries: .svg @@ -1220,6 +1280,7 @@ DiffTools.UseOrder(DiffTool.SublimeMerge); * Supports auto-refresh: True * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_VisualStudio` * Supported binaries: .svg @@ -1263,6 +1324,7 @@ DiffTools.UseOrder(DiffTool.VisualStudio); * Supports auto-refresh: True * Supports text files: True * Use shell execute: False + * Create no window: False * Environment variable for custom install location: `DiffEngine_VisualStudioCode` * Supported binaries: .bin, .svg diff --git a/docs/diff-tool.order.md b/docs/diff-tool.order.md index 1da3b73e..28dd9283 100644 --- a/docs/diff-tool.order.md +++ b/docs/diff-tool.order.md @@ -10,29 +10,30 @@ To change this file edit the source file and then run MarkdownSnippets. ## Default - * **[BeyondCompare](/docs/diff-tool.md#beyondcompare)** Win/OSX/Linux (Cost: Paid) - * **[P4Merge](/docs/diff-tool.md#p4merge)** Win/OSX/Linux (Cost: Free) + * **[BeyondCompare](/docs/diff-tool.md#beyondcompare)** Windows/OSX/Linux (Cost: Paid) + * **[P4Merge](/docs/diff-tool.md#p4merge)** Windows/OSX/Linux (Cost: Free) * **[Kaleidoscope](/docs/diff-tool.md#kaleidoscope)** OSX (Cost: Paid) - * **[DeltaWalker](/docs/diff-tool.md#deltawalker)** Win/OSX (Cost: Paid) - * **[WinMerge](/docs/diff-tool.md#winmerge)** Win (Cost: Free with option to donate) - * **[TortoiseGitMerge](/docs/diff-tool.md#tortoisegitmerge)** Win (Cost: Free) - * **[TortoiseGitIDiff](/docs/diff-tool.md#tortoisegitidiff)** Win (Cost: Free) - * **[TortoiseMerge](/docs/diff-tool.md#tortoisemerge)** Win (Cost: Free) - * **[TortoiseIDiff](/docs/diff-tool.md#tortoiseidiff)** Win (Cost: Free) - * **[KDiff3](/docs/diff-tool.md#kdiff3)** Win/OSX (Cost: Free) + * **[DeltaWalker](/docs/diff-tool.md#deltawalker)** Windows/OSX (Cost: Paid) + * **[WinMerge](/docs/diff-tool.md#winmerge)** Windows (Cost: Free with option to donate) + * **[TortoiseGitMerge](/docs/diff-tool.md#tortoisegitmerge)** Windows (Cost: Free) + * **[TortoiseGitIDiff](/docs/diff-tool.md#tortoisegitidiff)** Windows (Cost: Free) + * **[TortoiseMerge](/docs/diff-tool.md#tortoisemerge)** Windows (Cost: Free) + * **[TortoiseIDiff](/docs/diff-tool.md#tortoiseidiff)** Windows (Cost: Free) + * **[KDiff3](/docs/diff-tool.md#kdiff3)** Windows/OSX (Cost: Free) * **[TkDiff](/docs/diff-tool.md#tkdiff)** OSX (Cost: Free) - * **[Guiffy](/docs/diff-tool.md#guiffy)** Win/OSX (Cost: Paid) - * **[ExamDiff](/docs/diff-tool.md#examdiff)** Win (Cost: Paid) - * **[Diffinity](/docs/diff-tool.md#diffinity)** Win (Cost: Free with option to donate) - * **[Rider](/docs/diff-tool.md#rider)** Win/OSX/Linux (Cost: Paid with free option for OSS) - * **[Vim](/docs/diff-tool.md#vim)** Win/OSX (Cost: Free with option to donate) - * **[Neovim](/docs/diff-tool.md#neovim)** Win/OSX/Linux (Cost: Free with option to sponsor) - * **[AraxisMerge](/docs/diff-tool.md#araxismerge)** Win/OSX (Cost: Paid) - * **[Meld](/docs/diff-tool.md#meld)** Win/OSX/Linux (Cost: Free) - * **[SublimeMerge](/docs/diff-tool.md#sublimemerge)** Win/OSX/Linux (Cost: Paid) - * **[VisualStudioCode](/docs/diff-tool.md#visualstudiocode)** Win/OSX/Linux (Cost: Free) - * **[Cursor](/docs/diff-tool.md#cursor)** Win/OSX/Linux (Cost: Free and Paid) - * **[VisualStudio](/docs/diff-tool.md#visualstudio)** Win (Cost: Paid and free options) + * **[Guiffy](/docs/diff-tool.md#guiffy)** Windows/OSX (Cost: Paid) + * **[ExamDiff](/docs/diff-tool.md#examdiff)** Windows (Cost: Paid) + * **[Diffinity](/docs/diff-tool.md#diffinity)** Windows (Cost: Free with option to donate) + * **[Rider](/docs/diff-tool.md#rider)** Windows/OSX/Linux (Cost: Paid with free option for OSS) + * **[Vim](/docs/diff-tool.md#vim)** Windows/OSX (Cost: Free with option to donate) + * **[Neovim](/docs/diff-tool.md#neovim)** Windows/OSX/Linux (Cost: Free with option to sponsor) + * **[AraxisMerge](/docs/diff-tool.md#araxismerge)** Windows/OSX (Cost: Paid) + * **[Meld](/docs/diff-tool.md#meld)** Windows/OSX/Linux (Cost: Free) + * **[SublimeMerge](/docs/diff-tool.md#sublimemerge)** Windows/OSX/Linux (Cost: Paid) + * **[VisualStudioCode](/docs/diff-tool.md#visualstudiocode)** Windows/OSX/Linux (Cost: Free) + * **[Cursor](/docs/diff-tool.md#cursor)** Windows/OSX/Linux (Cost: Free and Paid) + * **[VisualStudio](/docs/diff-tool.md#visualstudio)** Windows (Cost: Paid and free options) + * **[MsWordDiff](/docs/diff-tool.md#msworddiff)** Windows (Cost: Free) ## Custom order @@ -52,5 +53,5 @@ For example `VisualStudio,Meld` will result in VisualStudio then Meld then all o ```cs DiffTools.UseOrder(DiffTool.VisualStudio, DiffTool.AraxisMerge); ``` -snippet source | anchor +snippet source | anchor diff --git a/readme.md b/readme.md index 7a6a4ce9..0d4f1b8c 100644 --- a/readme.md +++ b/readme.md @@ -63,29 +63,30 @@ DiffEngine manages launching and cleanup of diff tools. It is designed to be use ## [Supported Tools](/docs/diff-tool.md#supported-tools) - * **[BeyondCompare](/docs/diff-tool.md#beyondcompare)** Win/OSX/Linux (Cost: Paid) - * **[P4Merge](/docs/diff-tool.md#p4merge)** Win/OSX/Linux (Cost: Free) + * **[BeyondCompare](/docs/diff-tool.md#beyondcompare)** Windows/OSX/Linux (Cost: Paid) + * **[P4Merge](/docs/diff-tool.md#p4merge)** Windows/OSX/Linux (Cost: Free) * **[Kaleidoscope](/docs/diff-tool.md#kaleidoscope)** OSX (Cost: Paid) - * **[DeltaWalker](/docs/diff-tool.md#deltawalker)** Win/OSX (Cost: Paid) - * **[WinMerge](/docs/diff-tool.md#winmerge)** Win (Cost: Free with option to donate) - * **[TortoiseGitMerge](/docs/diff-tool.md#tortoisegitmerge)** Win (Cost: Free) - * **[TortoiseGitIDiff](/docs/diff-tool.md#tortoisegitidiff)** Win (Cost: Free) - * **[TortoiseMerge](/docs/diff-tool.md#tortoisemerge)** Win (Cost: Free) - * **[TortoiseIDiff](/docs/diff-tool.md#tortoiseidiff)** Win (Cost: Free) - * **[KDiff3](/docs/diff-tool.md#kdiff3)** Win/OSX (Cost: Free) + * **[DeltaWalker](/docs/diff-tool.md#deltawalker)** Windows/OSX (Cost: Paid) + * **[WinMerge](/docs/diff-tool.md#winmerge)** Windows (Cost: Free with option to donate) + * **[TortoiseGitMerge](/docs/diff-tool.md#tortoisegitmerge)** Windows (Cost: Free) + * **[TortoiseGitIDiff](/docs/diff-tool.md#tortoisegitidiff)** Windows (Cost: Free) + * **[TortoiseMerge](/docs/diff-tool.md#tortoisemerge)** Windows (Cost: Free) + * **[TortoiseIDiff](/docs/diff-tool.md#tortoiseidiff)** Windows (Cost: Free) + * **[KDiff3](/docs/diff-tool.md#kdiff3)** Windows/OSX (Cost: Free) * **[TkDiff](/docs/diff-tool.md#tkdiff)** OSX (Cost: Free) - * **[Guiffy](/docs/diff-tool.md#guiffy)** Win/OSX (Cost: Paid) - * **[ExamDiff](/docs/diff-tool.md#examdiff)** Win (Cost: Paid) - * **[Diffinity](/docs/diff-tool.md#diffinity)** Win (Cost: Free with option to donate) - * **[Rider](/docs/diff-tool.md#rider)** Win/OSX/Linux (Cost: Paid with free option for OSS) - * **[Vim](/docs/diff-tool.md#vim)** Win/OSX (Cost: Free with option to donate) - * **[Neovim](/docs/diff-tool.md#neovim)** Win/OSX/Linux (Cost: Free with option to sponsor) - * **[AraxisMerge](/docs/diff-tool.md#araxismerge)** Win/OSX (Cost: Paid) - * **[Meld](/docs/diff-tool.md#meld)** Win/OSX/Linux (Cost: Free) - * **[SublimeMerge](/docs/diff-tool.md#sublimemerge)** Win/OSX/Linux (Cost: Paid) - * **[VisualStudioCode](/docs/diff-tool.md#visualstudiocode)** Win/OSX/Linux (Cost: Free) - * **[Cursor](/docs/diff-tool.md#cursor)** Win/OSX/Linux (Cost: Free and Paid) - * **[VisualStudio](/docs/diff-tool.md#visualstudio)** Win (Cost: Paid and free options) + * **[Guiffy](/docs/diff-tool.md#guiffy)** Windows/OSX (Cost: Paid) + * **[ExamDiff](/docs/diff-tool.md#examdiff)** Windows (Cost: Paid) + * **[Diffinity](/docs/diff-tool.md#diffinity)** Windows (Cost: Free with option to donate) + * **[Rider](/docs/diff-tool.md#rider)** Windows/OSX/Linux (Cost: Paid with free option for OSS) + * **[Vim](/docs/diff-tool.md#vim)** Windows/OSX (Cost: Free with option to donate) + * **[Neovim](/docs/diff-tool.md#neovim)** Windows/OSX/Linux (Cost: Free with option to sponsor) + * **[AraxisMerge](/docs/diff-tool.md#araxismerge)** Windows/OSX (Cost: Paid) + * **[Meld](/docs/diff-tool.md#meld)** Windows/OSX/Linux (Cost: Free) + * **[SublimeMerge](/docs/diff-tool.md#sublimemerge)** Windows/OSX/Linux (Cost: Paid) + * **[VisualStudioCode](/docs/diff-tool.md#visualstudiocode)** Windows/OSX/Linux (Cost: Free) + * **[Cursor](/docs/diff-tool.md#cursor)** Windows/OSX/Linux (Cost: Free and Paid) + * **[VisualStudio](/docs/diff-tool.md#visualstudio)** Windows (Cost: Paid and free options) + * **[MsWordDiff](/docs/diff-tool.md#msworddiff)** Windows (Cost: Free) ## Launching a tool diff --git a/src/DiffEngine.Tests/DefinitionsTest.cs b/src/DiffEngine.Tests/DefinitionsTest.cs index 17299cd0..2eb9a7d0 100644 --- a/src/DiffEngine.Tests/DefinitionsTest.cs +++ b/src/DiffEngine.Tests/DefinitionsTest.cs @@ -46,7 +46,7 @@ static string GetOsSupport(OsSupport osSupport) var builder = new StringBuilder(); if (osSupport.Windows != null) { - builder.Append("Win/"); + builder.Append("Windows/"); } if (osSupport.Osx != null) @@ -125,6 +125,7 @@ static void AddTool(StreamWriter writer, Definition tool) * Supports auto-refresh: {tool.AutoRefresh} * Supports text files: {tool.SupportsText} * Use shell execute: {tool.UseShellExecute} + * Create no window: {tool.CreateNoWindow} * Environment variable for custom install location: `DiffEngine_{tool.Tool}` """); diff --git a/src/DiffEngine.Tests/DiffToolsTest.cs b/src/DiffEngine.Tests/DiffToolsTest.cs index d69997be..da3589f4 100644 --- a/src/DiffEngine.Tests/DiffToolsTest.cs +++ b/src/DiffEngine.Tests/DiffToolsTest.cs @@ -112,6 +112,12 @@ static async Task AddToolAndLaunch() } /** + [Fact] + public Task LaunchSpecificDocxDiff() => + DiffRunner.LaunchAsync(DiffTool.MsWordDiff, + Path.Combine(SourceDirectory, "input.temp.docx"), + Path.Combine(SourceDirectory, "input.target.docx")); + [Fact] public Task LaunchSpecificBinaryDiff() => DiffRunner.LaunchAsync(DiffTool.VisualStudioCode, diff --git a/src/DiffEngine.Tests/defaultOrder.include.md b/src/DiffEngine.Tests/defaultOrder.include.md index f2656296..aa79ab74 100644 --- a/src/DiffEngine.Tests/defaultOrder.include.md +++ b/src/DiffEngine.Tests/defaultOrder.include.md @@ -1,23 +1,24 @@ - * **[BeyondCompare](/docs/diff-tool.md#beyondcompare)** Win/OSX/Linux (Cost: Paid) - * **[P4Merge](/docs/diff-tool.md#p4merge)** Win/OSX/Linux (Cost: Free) + * **[BeyondCompare](/docs/diff-tool.md#beyondcompare)** Windows/OSX/Linux (Cost: Paid) + * **[P4Merge](/docs/diff-tool.md#p4merge)** Windows/OSX/Linux (Cost: Free) * **[Kaleidoscope](/docs/diff-tool.md#kaleidoscope)** OSX (Cost: Paid) - * **[DeltaWalker](/docs/diff-tool.md#deltawalker)** Win/OSX (Cost: Paid) - * **[WinMerge](/docs/diff-tool.md#winmerge)** Win (Cost: Free with option to donate) - * **[TortoiseGitMerge](/docs/diff-tool.md#tortoisegitmerge)** Win (Cost: Free) - * **[TortoiseGitIDiff](/docs/diff-tool.md#tortoisegitidiff)** Win (Cost: Free) - * **[TortoiseMerge](/docs/diff-tool.md#tortoisemerge)** Win (Cost: Free) - * **[TortoiseIDiff](/docs/diff-tool.md#tortoiseidiff)** Win (Cost: Free) - * **[KDiff3](/docs/diff-tool.md#kdiff3)** Win/OSX (Cost: Free) + * **[DeltaWalker](/docs/diff-tool.md#deltawalker)** Windows/OSX (Cost: Paid) + * **[WinMerge](/docs/diff-tool.md#winmerge)** Windows (Cost: Free with option to donate) + * **[TortoiseGitMerge](/docs/diff-tool.md#tortoisegitmerge)** Windows (Cost: Free) + * **[TortoiseGitIDiff](/docs/diff-tool.md#tortoisegitidiff)** Windows (Cost: Free) + * **[TortoiseMerge](/docs/diff-tool.md#tortoisemerge)** Windows (Cost: Free) + * **[TortoiseIDiff](/docs/diff-tool.md#tortoiseidiff)** Windows (Cost: Free) + * **[KDiff3](/docs/diff-tool.md#kdiff3)** Windows/OSX (Cost: Free) * **[TkDiff](/docs/diff-tool.md#tkdiff)** OSX (Cost: Free) - * **[Guiffy](/docs/diff-tool.md#guiffy)** Win/OSX (Cost: Paid) - * **[ExamDiff](/docs/diff-tool.md#examdiff)** Win (Cost: Paid) - * **[Diffinity](/docs/diff-tool.md#diffinity)** Win (Cost: Free with option to donate) - * **[Rider](/docs/diff-tool.md#rider)** Win/OSX/Linux (Cost: Paid with free option for OSS) - * **[Vim](/docs/diff-tool.md#vim)** Win/OSX (Cost: Free with option to donate) - * **[Neovim](/docs/diff-tool.md#neovim)** Win/OSX/Linux (Cost: Free with option to sponsor) - * **[AraxisMerge](/docs/diff-tool.md#araxismerge)** Win/OSX (Cost: Paid) - * **[Meld](/docs/diff-tool.md#meld)** Win/OSX/Linux (Cost: Free) - * **[SublimeMerge](/docs/diff-tool.md#sublimemerge)** Win/OSX/Linux (Cost: Paid) - * **[VisualStudioCode](/docs/diff-tool.md#visualstudiocode)** Win/OSX/Linux (Cost: Free) - * **[Cursor](/docs/diff-tool.md#cursor)** Win/OSX/Linux (Cost: Free and Paid) - * **[VisualStudio](/docs/diff-tool.md#visualstudio)** Win (Cost: Paid and free options) + * **[Guiffy](/docs/diff-tool.md#guiffy)** Windows/OSX (Cost: Paid) + * **[ExamDiff](/docs/diff-tool.md#examdiff)** Windows (Cost: Paid) + * **[Diffinity](/docs/diff-tool.md#diffinity)** Windows (Cost: Free with option to donate) + * **[Rider](/docs/diff-tool.md#rider)** Windows/OSX/Linux (Cost: Paid with free option for OSS) + * **[Vim](/docs/diff-tool.md#vim)** Windows/OSX (Cost: Free with option to donate) + * **[Neovim](/docs/diff-tool.md#neovim)** Windows/OSX/Linux (Cost: Free with option to sponsor) + * **[AraxisMerge](/docs/diff-tool.md#araxismerge)** Windows/OSX (Cost: Paid) + * **[Meld](/docs/diff-tool.md#meld)** Windows/OSX/Linux (Cost: Free) + * **[SublimeMerge](/docs/diff-tool.md#sublimemerge)** Windows/OSX/Linux (Cost: Paid) + * **[VisualStudioCode](/docs/diff-tool.md#visualstudiocode)** Windows/OSX/Linux (Cost: Free) + * **[Cursor](/docs/diff-tool.md#cursor)** Windows/OSX/Linux (Cost: Free and Paid) + * **[VisualStudio](/docs/diff-tool.md#visualstudio)** Windows (Cost: Paid and free options) + * **[MsWordDiff](/docs/diff-tool.md#msworddiff)** Windows (Cost: Free) diff --git a/src/DiffEngine.Tests/diffToolList.include.md b/src/DiffEngine.Tests/diffToolList.include.md index f2656296..aa79ab74 100644 --- a/src/DiffEngine.Tests/diffToolList.include.md +++ b/src/DiffEngine.Tests/diffToolList.include.md @@ -1,23 +1,24 @@ - * **[BeyondCompare](/docs/diff-tool.md#beyondcompare)** Win/OSX/Linux (Cost: Paid) - * **[P4Merge](/docs/diff-tool.md#p4merge)** Win/OSX/Linux (Cost: Free) + * **[BeyondCompare](/docs/diff-tool.md#beyondcompare)** Windows/OSX/Linux (Cost: Paid) + * **[P4Merge](/docs/diff-tool.md#p4merge)** Windows/OSX/Linux (Cost: Free) * **[Kaleidoscope](/docs/diff-tool.md#kaleidoscope)** OSX (Cost: Paid) - * **[DeltaWalker](/docs/diff-tool.md#deltawalker)** Win/OSX (Cost: Paid) - * **[WinMerge](/docs/diff-tool.md#winmerge)** Win (Cost: Free with option to donate) - * **[TortoiseGitMerge](/docs/diff-tool.md#tortoisegitmerge)** Win (Cost: Free) - * **[TortoiseGitIDiff](/docs/diff-tool.md#tortoisegitidiff)** Win (Cost: Free) - * **[TortoiseMerge](/docs/diff-tool.md#tortoisemerge)** Win (Cost: Free) - * **[TortoiseIDiff](/docs/diff-tool.md#tortoiseidiff)** Win (Cost: Free) - * **[KDiff3](/docs/diff-tool.md#kdiff3)** Win/OSX (Cost: Free) + * **[DeltaWalker](/docs/diff-tool.md#deltawalker)** Windows/OSX (Cost: Paid) + * **[WinMerge](/docs/diff-tool.md#winmerge)** Windows (Cost: Free with option to donate) + * **[TortoiseGitMerge](/docs/diff-tool.md#tortoisegitmerge)** Windows (Cost: Free) + * **[TortoiseGitIDiff](/docs/diff-tool.md#tortoisegitidiff)** Windows (Cost: Free) + * **[TortoiseMerge](/docs/diff-tool.md#tortoisemerge)** Windows (Cost: Free) + * **[TortoiseIDiff](/docs/diff-tool.md#tortoiseidiff)** Windows (Cost: Free) + * **[KDiff3](/docs/diff-tool.md#kdiff3)** Windows/OSX (Cost: Free) * **[TkDiff](/docs/diff-tool.md#tkdiff)** OSX (Cost: Free) - * **[Guiffy](/docs/diff-tool.md#guiffy)** Win/OSX (Cost: Paid) - * **[ExamDiff](/docs/diff-tool.md#examdiff)** Win (Cost: Paid) - * **[Diffinity](/docs/diff-tool.md#diffinity)** Win (Cost: Free with option to donate) - * **[Rider](/docs/diff-tool.md#rider)** Win/OSX/Linux (Cost: Paid with free option for OSS) - * **[Vim](/docs/diff-tool.md#vim)** Win/OSX (Cost: Free with option to donate) - * **[Neovim](/docs/diff-tool.md#neovim)** Win/OSX/Linux (Cost: Free with option to sponsor) - * **[AraxisMerge](/docs/diff-tool.md#araxismerge)** Win/OSX (Cost: Paid) - * **[Meld](/docs/diff-tool.md#meld)** Win/OSX/Linux (Cost: Free) - * **[SublimeMerge](/docs/diff-tool.md#sublimemerge)** Win/OSX/Linux (Cost: Paid) - * **[VisualStudioCode](/docs/diff-tool.md#visualstudiocode)** Win/OSX/Linux (Cost: Free) - * **[Cursor](/docs/diff-tool.md#cursor)** Win/OSX/Linux (Cost: Free and Paid) - * **[VisualStudio](/docs/diff-tool.md#visualstudio)** Win (Cost: Paid and free options) + * **[Guiffy](/docs/diff-tool.md#guiffy)** Windows/OSX (Cost: Paid) + * **[ExamDiff](/docs/diff-tool.md#examdiff)** Windows (Cost: Paid) + * **[Diffinity](/docs/diff-tool.md#diffinity)** Windows (Cost: Free with option to donate) + * **[Rider](/docs/diff-tool.md#rider)** Windows/OSX/Linux (Cost: Paid with free option for OSS) + * **[Vim](/docs/diff-tool.md#vim)** Windows/OSX (Cost: Free with option to donate) + * **[Neovim](/docs/diff-tool.md#neovim)** Windows/OSX/Linux (Cost: Free with option to sponsor) + * **[AraxisMerge](/docs/diff-tool.md#araxismerge)** Windows/OSX (Cost: Paid) + * **[Meld](/docs/diff-tool.md#meld)** Windows/OSX/Linux (Cost: Free) + * **[SublimeMerge](/docs/diff-tool.md#sublimemerge)** Windows/OSX/Linux (Cost: Paid) + * **[VisualStudioCode](/docs/diff-tool.md#visualstudiocode)** Windows/OSX/Linux (Cost: Free) + * **[Cursor](/docs/diff-tool.md#cursor)** Windows/OSX/Linux (Cost: Free and Paid) + * **[VisualStudio](/docs/diff-tool.md#visualstudio)** Windows (Cost: Paid and free options) + * **[MsWordDiff](/docs/diff-tool.md#msworddiff)** Windows (Cost: Free) diff --git a/src/DiffEngine.Tests/diffTools.include.md b/src/DiffEngine.Tests/diffTools.include.md index bde50656..14a8d20f 100644 --- a/src/DiffEngine.Tests/diffTools.include.md +++ b/src/DiffEngine.Tests/diffTools.include.md @@ -11,6 +11,7 @@ Non-MDI tools are preferred since it allows [DiffEngineTray](tray.md) to track a * Supports auto-refresh: True * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_BeyondCompare` * Supported binaries: .7z, .bcpkg, .bin, .bmp, .bz, .bz2, .cab, .chm, .deb, .ear, .gif, .gz, .ico, .img, .iso, .iso, .jar, .jpeg, .jpg, .kmz, .nupkg, .pdf, .png, .rar, .rpm, .rtf, .svg, .swm, .tar, .tbz, .tbz2, .tbz2, .tgz, .tif, .tiff, .war, .webp, .wim, .xlsx, .xz, .zip, .zipx @@ -81,6 +82,7 @@ DiffTools.UseOrder(DiffTool.BeyondCompare); * Supports auto-refresh: True * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_DeltaWalker` * Supported binaries: .bmp, .bz2, .doc, .docx, .ear, .gif, .gz, .htm, .html, .ico, .j2k, .jar, .jp2, .jpg, .pbm, .pct, .pdf, .pgm, .pic, .pict, .png, .pnm, .ppm, .ppt, .psd, .rtf, .svg, .tar, .tbz2, .tgz, .tif, .xls, .xlsx, .zip @@ -133,6 +135,7 @@ DiffTools.UseOrder(DiffTool.DeltaWalker); * Supports auto-refresh: True * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_Diffinity` * Supported binaries: .svg @@ -167,6 +170,7 @@ DiffTools.UseOrder(DiffTool.Diffinity); * Supports auto-refresh: True * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_ExamDiff` * Supported binaries: .bin, .svg @@ -207,6 +211,7 @@ DiffTools.UseOrder(DiffTool.ExamDiff); * Supports auto-refresh: False * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_Guiffy` * Supported binaries: .bmp, .gif, .jpeg, .jpg, .png, .svg, .wbmp @@ -262,6 +267,7 @@ DiffTools.UseOrder(DiffTool.Guiffy); * Supports auto-refresh: True * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_Kaleidoscope` * Supported binaries: .bin, .bmp, .gif, .ico, .jpeg, .jpg, .png, .svg, .tif, .tiff @@ -293,6 +299,7 @@ DiffTools.UseOrder(DiffTool.Kaleidoscope); * Supports auto-refresh: False * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_KDiff3` * Supported binaries: .svg @@ -341,6 +348,45 @@ DiffTools.UseOrder(DiffTool.KDiff3); * `/Applications/kdiff3.app/Contents/MacOS/kdiff3` * `%PATH%kdiff3` +### [MsWordDiff](https://github.com/SimonCropp/MsWordDiff) + + * Cost: Free + * Is MDI: False + * Supports auto-refresh: False + * Supports text files: False + * Use shell execute: False + * Create no window: True + * Environment variable for custom install location: `DiffEngine_MsWordDiff` + * Supported binaries: .doc, .docx + +#### Tool order: + +Use [tool order](diff-tool.order.md) to prioritise MsWordDiff over other tools. + +``` +DiffTools.UseOrder(DiffTool.MsWordDiff); +``` + +#### Notes: + + * Install via `dotnet tool install -g MsWordDiff` + * Requires Microsoft Word to be installed + * Uses Word's built-in document comparison feature + +#### Windows settings: + + * Example target on left arguments: + ``` + "targetFile.txt" "tempFile.txt" + ``` + * Example target on right arguments: + ``` + "tempFile.txt" "targetFile.txt" + ``` + * Scanned paths: + * `%USERPROFILE%\.dotnet\tools\diffword.exe` + * `%PATH%diffword.exe` + ### [Neovim](https://neovim.io/) * Cost: Free with option to sponsor @@ -348,6 +394,7 @@ DiffTools.UseOrder(DiffTool.KDiff3); * Supports auto-refresh: False * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_Neovim` * Supported binaries: .svg @@ -410,6 +457,7 @@ DiffTools.UseOrder(DiffTool.Neovim); * Supports auto-refresh: False * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_P4Merge` * Supported binaries: .bmp, .gif, .jpeg, .jpg, .pbm, .pgm, .png, .ppm, .svg, .tif, .tiff, .xbm, .xpm @@ -495,6 +543,7 @@ DiffTools.UseOrder(DiffTool.P4Merge); * Supports auto-refresh: True * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_Rider` * Supported binaries: .svg @@ -563,6 +612,7 @@ DiffTools.UseOrder(DiffTool.Rider); * Supports auto-refresh: False * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_TkDiff` * Supported binaries: .svg @@ -595,6 +645,7 @@ DiffTools.UseOrder(DiffTool.TkDiff); * Supports auto-refresh: False * Supports text files: False * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_TortoiseGitIDiff` * Supported binaries: .bmp, .gif, .ico, .jpeg, .jpg, .png, .tif, .tiff @@ -629,6 +680,7 @@ DiffTools.UseOrder(DiffTool.TortoiseGitIDiff); * Supports auto-refresh: False * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_TortoiseGitMerge` * Supported binaries: .bin, .svg @@ -663,6 +715,7 @@ DiffTools.UseOrder(DiffTool.TortoiseGitMerge); * Supports auto-refresh: False * Supports text files: False * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_TortoiseIDiff` * Supported binaries: .bmp, .gif, .ico, .jpeg, .jpg, .png, .tif, .tiff @@ -697,6 +750,7 @@ DiffTools.UseOrder(DiffTool.TortoiseIDiff); * Supports auto-refresh: False * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_TortoiseMerge` * Supported binaries: .svg @@ -731,6 +785,7 @@ DiffTools.UseOrder(DiffTool.TortoiseMerge); * Supports auto-refresh: True * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_Vim` * Supported binaries: .svg @@ -787,6 +842,7 @@ DiffTools.UseOrder(DiffTool.Vim); * Supports auto-refresh: True * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_WinMerge` * Supported binaries: .bin, .bmp, .bw, .cut, .dds, .exr, .g3, .gif, .hdp, .hdr, .ico, .iff, .j2c, .j2k, .jif, .jng, .jp2, .jpe, .jpeg, .jpg, .jxr, .koa, .lbm, .mng, .pbm, .pcd, .pct, .pcx, .pfm, .pgm, .pic, .pict, .png, .ppm, .psd, .ras, .rgb, .rgba, .sgi, .svg, .targa, .tga, .tif, .tiff, .wap, .wbm, .wbmp, .wdp, .webp, .xbm, .xpm @@ -834,6 +890,7 @@ DiffTools.UseOrder(DiffTool.WinMerge); * Supports auto-refresh: True * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_AraxisMerge` * Supported binaries: .bmp, .dib, .emf, .gif, .j2c, .j2k, .jif, .jp2, .jpc, .jpeg, .jpg, .jpx, .pbm, .pcx, .pgm, .png, .ppm, .ras, .svg, .tga, .tif, .tiff, .wmf @@ -889,6 +946,7 @@ DiffTools.UseOrder(DiffTool.AraxisMerge); * Supports auto-refresh: True * Supports text files: True * Use shell execute: False + * Create no window: False * Environment variable for custom install location: `DiffEngine_Cursor` * Supported binaries: .bin, .svg @@ -954,6 +1012,7 @@ DiffTools.UseOrder(DiffTool.Cursor); * Supports auto-refresh: False * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_Meld` * Supported binaries: .svg @@ -1020,6 +1079,7 @@ DiffTools.UseOrder(DiffTool.Meld); * Supports auto-refresh: False * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_SublimeMerge` * Supported binaries: .svg @@ -1085,6 +1145,7 @@ DiffTools.UseOrder(DiffTool.SublimeMerge); * Supports auto-refresh: True * Supports text files: True * Use shell execute: True + * Create no window: False * Environment variable for custom install location: `DiffEngine_VisualStudio` * Supported binaries: .svg @@ -1128,6 +1189,7 @@ DiffTools.UseOrder(DiffTool.VisualStudio); * Supports auto-refresh: True * Supports text files: True * Use shell execute: False + * Create no window: False * Environment variable for custom install location: `DiffEngine_VisualStudioCode` * Supported binaries: .bin, .svg diff --git a/src/DiffEngine.Tests/input.target.docx b/src/DiffEngine.Tests/input.target.docx new file mode 100644 index 00000000..ebc44358 Binary files /dev/null and b/src/DiffEngine.Tests/input.target.docx differ diff --git a/src/DiffEngine.Tests/input.temp.docx b/src/DiffEngine.Tests/input.temp.docx new file mode 100644 index 00000000..0e1d74a6 Binary files /dev/null and b/src/DiffEngine.Tests/input.temp.docx differ diff --git a/src/DiffEngine/Definition.cs b/src/DiffEngine/Definition.cs index f05ebf1d..f0c617b1 100644 --- a/src/DiffEngine/Definition.cs +++ b/src/DiffEngine/Definition.cs @@ -11,4 +11,5 @@ public record Definition( string Cost, OsSupport OsSupport, bool UseShellExecute = true, + bool CreateNoWindow = false, string? Notes = null); \ No newline at end of file diff --git a/src/DiffEngine/Definitions.cs b/src/DiffEngine/Definitions.cs index 5127fb74..0bf37d99 100644 --- a/src/DiffEngine/Definitions.cs +++ b/src/DiffEngine/Definitions.cs @@ -29,6 +29,7 @@ static Definitions() => Implementation.SublimeMerge(), Implementation.VisualStudioCode(), Implementation.Cursor(), - Implementation.VisualStudio() + Implementation.VisualStudio(), + Implementation.MsWordDiff() ]; } \ No newline at end of file diff --git a/src/DiffEngine/DiffRunner.cs b/src/DiffEngine/DiffRunner.cs index d3621de9..082e1d84 100644 --- a/src/DiffEngine/DiffRunner.cs +++ b/src/DiffEngine/DiffRunner.cs @@ -244,7 +244,8 @@ static int LaunchProcess(ResolvedTool tool, string arguments) // Given the full exe path is known we dont need UseShellExecute https://stackoverflow.com/a/5255335 // however UseShellExecute allows the test running to not block when the difftool is launched // https://github.com/VerifyTests/Verify/issues/1229 - UseShellExecute = tool.UseShellExecute + UseShellExecute = tool.UseShellExecute, + CreateNoWindow = tool.CreateNoWindow }; try { diff --git a/src/DiffEngine/DiffTool.cs b/src/DiffEngine/DiffTool.cs index 13301ec0..322a1b57 100644 --- a/src/DiffEngine/DiffTool.cs +++ b/src/DiffEngine/DiffTool.cs @@ -24,5 +24,6 @@ public enum DiffTool SublimeMerge, VisualStudioCode, VisualStudio, - Cursor + Cursor, + MsWordDiff } \ No newline at end of file diff --git a/src/DiffEngine/DiffTools_Add.cs b/src/DiffEngine/DiffTools_Add.cs index d06a8066..2b7f2474 100644 --- a/src/DiffEngine/DiffTools_Add.cs +++ b/src/DiffEngine/DiffTools_Add.cs @@ -9,6 +9,7 @@ public static partial class DiffTools bool? supportsText = null, bool? requiresTarget = null, bool? useShellExecute = true, + bool? createNoWindow = null, LaunchArguments? launchArguments = null, string? exePath = null, IEnumerable? binaryExtensions = null) @@ -28,26 +29,27 @@ public static partial class DiffTools useShellExecute ?? existing.UseShellExecute, launchArguments ?? existing.LaunchArguments, exePath ?? existing.ExePath, - binaryExtensions ?? existing.BinaryExtensions); + binaryExtensions ?? existing.BinaryExtensions, + createNoWindow ?? existing.CreateNoWindow); } public static ResolvedTool? AddTool(string name, bool autoRefresh, bool isMdi, bool supportsText, bool requiresTarget, bool useShellExecute, IEnumerable binaryExtensions, OsSupport osSupport) => - AddTool(name, null, autoRefresh, isMdi, supportsText, requiresTarget, binaryExtensions, osSupport, useShellExecute); + AddTool(name, null, autoRefresh, isMdi, supportsText, requiresTarget, binaryExtensions, osSupport, useShellExecute, createNoWindow: false); - public static ResolvedTool? AddTool(string name, bool autoRefresh, bool isMdi, bool supportsText, bool requiresTarget, bool useShellExecute, LaunchArguments launchArguments, string exePath, IEnumerable binaryExtensions) => - AddInner(name, null, autoRefresh, isMdi, supportsText, requiresTarget, binaryExtensions, exePath, launchArguments, useShellExecute); + public static ResolvedTool? AddTool(string name, bool autoRefresh, bool isMdi, bool supportsText, bool requiresTarget, bool useShellExecute, LaunchArguments launchArguments, string exePath, IEnumerable binaryExtensions, bool createNoWindow = false) => + AddInner(name, null, autoRefresh, isMdi, supportsText, requiresTarget, binaryExtensions, exePath, launchArguments, useShellExecute, createNoWindow); - static ResolvedTool? AddTool(string name, DiffTool? diffTool, bool autoRefresh, bool isMdi, bool supportsText, bool requiresTarget, IEnumerable binaryExtensions, OsSupport osSupport, bool useShellExecute) + static ResolvedTool? AddTool(string name, DiffTool? diffTool, bool autoRefresh, bool isMdi, bool supportsText, bool requiresTarget, IEnumerable binaryExtensions, OsSupport osSupport, bool useShellExecute, bool createNoWindow) { if (!OsSettingsResolver.Resolve(name, osSupport, out var exePath, out var launchArguments)) { return null; } - return AddInner(name, diffTool, autoRefresh, isMdi, supportsText, requiresTarget, binaryExtensions, exePath, launchArguments, useShellExecute); + return AddInner(name, diffTool, autoRefresh, isMdi, supportsText, requiresTarget, binaryExtensions, exePath, launchArguments, useShellExecute, createNoWindow); } - static ResolvedTool? AddInner(string name, DiffTool? diffTool, bool autoRefresh, bool isMdi, bool supportsText, bool requiresTarget, IEnumerable binaries, string exePath, LaunchArguments launchArguments, bool useShellExecute) + static ResolvedTool? AddInner(string name, DiffTool? diffTool, bool autoRefresh, bool isMdi, bool supportsText, bool requiresTarget, IEnumerable binaries, string exePath, LaunchArguments launchArguments, bool useShellExecute, bool createNoWindow) { Guard.AgainstEmpty(name, nameof(name)); if (resolved.Any(_ => _.Name == name)) @@ -70,7 +72,8 @@ public static partial class DiffTools binaries.ToList(), requiresTarget, supportsText, - useShellExecute); + useShellExecute, + createNoWindow); AddResolvedToolAtStart(tool); @@ -107,7 +110,8 @@ static void InitTools(bool throwForNoTool, IEnumerable order) definition.RequiresTarget, definition.BinaryExtensions, definition.OsSupport, - definition.UseShellExecute); + definition.UseShellExecute, + definition.CreateNoWindow); } custom.Reverse(); diff --git a/src/DiffEngine/Implementation/MsWordDiff.cs b/src/DiffEngine/Implementation/MsWordDiff.cs new file mode 100644 index 00000000..58951630 --- /dev/null +++ b/src/DiffEngine/Implementation/MsWordDiff.cs @@ -0,0 +1,35 @@ +static partial class Implementation +{ + public static Definition MsWordDiff() + { + var launchArguments = new LaunchArguments( + Left: (temp, target) => $"\"{target}\" \"{temp}\"", + Right: (temp, target) => $"\"{temp}\" \"{target}\""); + + return new( + Tool: DiffTool.MsWordDiff, + Url: "https://github.com/SimonCropp/MsWordDiff", + AutoRefresh: false, + IsMdi: false, + SupportsText: false, + RequiresTarget: true, + BinaryExtensions: + [ + ".docx", + ".doc" + ], + Cost: "Free", + OsSupport: new( + Windows: new( + "diffword.exe", + launchArguments, + @"%USERPROFILE%\.dotnet\tools\")), + UseShellExecute: false, + CreateNoWindow: true, + Notes: """ + * Install via `dotnet tool install -g MsWordDiff` + * Requires Microsoft Word to be installed + * Uses Word's built-in document comparison feature + """); + } +} diff --git a/src/DiffEngine/ResolvedTool.cs b/src/DiffEngine/ResolvedTool.cs index ca67d9eb..535b1d65 100644 --- a/src/DiffEngine/ResolvedTool.cs +++ b/src/DiffEngine/ResolvedTool.cs @@ -23,8 +23,8 @@ public string GetArguments(string tempFile, string targetFile) return LaunchArguments.Right(tempFile, targetFile); } - public ResolvedTool(string name, string exePath, LaunchArguments launchArguments, bool isMdi, bool autoRefresh, IReadOnlyCollection binaryExtensions, bool requiresTarget, bool supportsText, bool useShellExecute) : - this(name, null, exePath, launchArguments, isMdi, autoRefresh, binaryExtensions, requiresTarget, supportsText, useShellExecute) + public ResolvedTool(string name, string exePath, LaunchArguments launchArguments, bool isMdi, bool autoRefresh, IReadOnlyCollection binaryExtensions, bool requiresTarget, bool supportsText, bool useShellExecute, bool createNoWindow = false) : + this(name, null, exePath, launchArguments, isMdi, autoRefresh, binaryExtensions, requiresTarget, supportsText, useShellExecute, createNoWindow) { } @@ -38,7 +38,8 @@ public ResolvedTool( IReadOnlyCollection binaryExtensions, bool requiresTarget, bool supportsText, - bool useShellExecute) + bool useShellExecute, + bool createNoWindow = false) { Guard.FileExists(exePath, nameof(exePath)); Guard.AgainstEmpty(name, nameof(name)); @@ -61,6 +62,7 @@ Extensions must begin with a period. RequiresTarget = requiresTarget; SupportsText = supportsText; UseShellExecute = useShellExecute; + CreateNoWindow = createNoWindow; } public string Name { get; init; } @@ -73,4 +75,5 @@ Extensions must begin with a period. public bool RequiresTarget { get; init; } public bool SupportsText { get; init; } public bool UseShellExecute { get; init; } + public bool CreateNoWindow { get; init; } } \ No newline at end of file diff --git a/src/Directory.Build.props b/src/Directory.Build.props index d4d6bec0..bae85037 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -2,7 +2,7 @@ CS1591;CS0649;NU1608;NU1109 - 17.0.2 + 18.0.0 1.0.0 Testing, Snapshot, Diff, Compare Launches diff tools based on file extensions. Designed to be consumed by snapshot testing libraries.