From 1e5f07685e35e736d3eabdc53daecab2d6ea35ec Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Wed, 17 Dec 2025 10:09:55 +1100 Subject: [PATCH 1/5] . --- src/DiffEngine.Tests/defaultOrder.include.md | 1 + src/DiffEngine.Tests/diffToolList.include.md | 1 + src/DiffEngine.Tests/diffTools.include.md | 38 ++++++++++++++++++++ src/DiffEngine/Definitions.cs | 3 +- src/DiffEngine/DiffTool.cs | 3 +- src/DiffEngine/Implementation/MsWordDiff.cs | 34 ++++++++++++++++++ 6 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 src/DiffEngine/Implementation/MsWordDiff.cs diff --git a/src/DiffEngine.Tests/defaultOrder.include.md b/src/DiffEngine.Tests/defaultOrder.include.md index f2656296..d94ea253 100644 --- a/src/DiffEngine.Tests/defaultOrder.include.md +++ b/src/DiffEngine.Tests/defaultOrder.include.md @@ -21,3 +21,4 @@ * **[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) + * **[MsWordDiff](/docs/diff-tool.md#msworddiff)** Win (Cost: Free) diff --git a/src/DiffEngine.Tests/diffToolList.include.md b/src/DiffEngine.Tests/diffToolList.include.md index f2656296..d94ea253 100644 --- a/src/DiffEngine.Tests/diffToolList.include.md +++ b/src/DiffEngine.Tests/diffToolList.include.md @@ -21,3 +21,4 @@ * **[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) + * **[MsWordDiff](/docs/diff-tool.md#msworddiff)** Win (Cost: Free) diff --git a/src/DiffEngine.Tests/diffTools.include.md b/src/DiffEngine.Tests/diffTools.include.md index bde50656..b345e738 100644 --- a/src/DiffEngine.Tests/diffTools.include.md +++ b/src/DiffEngine.Tests/diffTools.include.md @@ -341,6 +341,44 @@ 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: 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 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/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/Implementation/MsWordDiff.cs b/src/DiffEngine/Implementation/MsWordDiff.cs new file mode 100644 index 00000000..aa8aee4c --- /dev/null +++ b/src/DiffEngine/Implementation/MsWordDiff.cs @@ -0,0 +1,34 @@ +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, + UseShellExecute: true, + RequiresTarget: true, + Cost: "Free", + BinaryExtensions: + [ + ".docx", + ".doc" + ], + OsSupport: new( + Windows: new( + "diffword.exe", + launchArguments, + @"%USERPROFILE%\.dotnet\tools\")), + Notes: """ + * Install via `dotnet tool install -g MsWordDiff` + * Requires Microsoft Word to be installed + * Uses Word's built-in document comparison feature + """); + } +} From 41af0744a84f4c34ea162ad867eb865ad45d1988 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Wed, 17 Dec 2025 10:18:36 +1100 Subject: [PATCH 2/5] . --- .gitattributes | 1 + docs/diff-tool.md | 38 +++++++++++++++++++++++++ docs/diff-tool.order.md | 5 ++-- readme.md | 3 +- src/DiffEngine.Tests/DiffToolsTest.cs | 6 ++++ src/DiffEngine.Tests/input.target.docx | Bin 0 -> 35124 bytes src/DiffEngine.Tests/input.temp.docx | Bin 0 -> 34936 bytes 7 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 src/DiffEngine.Tests/input.target.docx create mode 100644 src/DiffEngine.Tests/input.temp.docx 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..b77d1a77 100644 --- a/docs/diff-tool.md +++ b/docs/diff-tool.md @@ -476,6 +476,44 @@ 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: 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 diff --git a/docs/diff-tool.order.md b/docs/diff-tool.order.md index 1da3b73e..667a31f9 100644 --- a/docs/diff-tool.order.md +++ b/docs/diff-tool.order.md @@ -32,7 +32,8 @@ To change this file edit the source file and then run MarkdownSnippets. * **[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) + * **[VisualStudio](/docs/diff-tool.md#visualstudio)** Win (Cost: Paid and free options) + * **[MsWordDiff](/docs/diff-tool.md#msworddiff)** Win (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..49d0a36d 100644 --- a/readme.md +++ b/readme.md @@ -85,7 +85,8 @@ DiffEngine manages launching and cleanup of diff tools. It is designed to be use * **[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) + * **[VisualStudio](/docs/diff-tool.md#visualstudio)** Win (Cost: Paid and free options) + * **[MsWordDiff](/docs/diff-tool.md#msworddiff)** Win (Cost: Free) ## Launching a tool diff --git a/src/DiffEngine.Tests/DiffToolsTest.cs b/src/DiffEngine.Tests/DiffToolsTest.cs index d69997be..4a52abd2 100644 --- a/src/DiffEngine.Tests/DiffToolsTest.cs +++ b/src/DiffEngine.Tests/DiffToolsTest.cs @@ -110,6 +110,12 @@ static async Task AddToolAndLaunch() #endregion } + + [Fact] + public Task LaunchSpecificDocxDiff() => + DiffRunner.LaunchAsync(DiffTool.MsWordDiff, + Path.Combine(SourceDirectory, "input.temp.docx"), + Path.Combine(SourceDirectory, "input.target.docx")); /** [Fact] diff --git a/src/DiffEngine.Tests/input.target.docx b/src/DiffEngine.Tests/input.target.docx new file mode 100644 index 0000000000000000000000000000000000000000..ebc4435881247b914eb1d23358b97f20d1154cc5 GIT binary patch literal 35124 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 NfdgDFFoS;|{eL0!TV((M literal 0 HcmV?d00001 diff --git a/src/DiffEngine.Tests/input.temp.docx b/src/DiffEngine.Tests/input.temp.docx new file mode 100644 index 0000000000000000000000000000000000000000..0e1d74a613aa92066d5977c9dc5481c43b23876c GIT binary patch literal 34936 zcmeFYWmFwaw=KM3<8B)#xVyW%W&<0S;O_3h-QC^YA-FriJrGEOLm;>WxIFKBzVDtp z?)i29o>QZxdUUNCC2RJqo~s+I2!z1_zyS~d00224uPxao7775sga-hy0SM4~l8z2; z<_>P3Al^>qt_Cb#_I6~&Fwk^`0O;;-9#l6_+Zryq+WL?PU+7s8xy-h76q3_8K+Q`xboiz12xzcd-t zEzWG8R(;Ln#f(cUYlC9#$r}G0-C6K$^C2KsDNn2uF9z&C-rhb4Ica;gU&`~oQ+Ng{? zoJB&{;7dk0WJp6U75GHx%_Z+BDy=YO|1pyh?|0>%ltgVV+WM)8)r+CL9L>7rMWFGr_Ew8|MJt(LC-8X%u{`r!f7<_6!F7Hm&~yIAlm&~ahp@k$iN(= zp<6_czVknUa=|QsyRUT!jG6u(GJmFfK&6eiaic7KGWOd@P%<7PPEN1GALvwP7>-QP zeNQzJN*VDy<_1TJ^>SR3mihmz!gdY4h>nSTD^T4o2_o@=9P%2_Cf|-;i}z$xPlVg` zy%fa-y!+qV8xR2gKS2B;iLm41{f^2zMv>n^{K>`K&XtwrpX2|4_rEb>|5Mj%lLz0y ziz0Rr@)EMptGYReU!uZlI=_X#0gs?3uY|p|ZnO6KBDB5^ZE$QXJH5D+GVkM>E91VK zYH&%Iu7Miei@5q|IIQ>F;{`|y>nUURT6Ow?l5=op@iIjzPd^nBqXUYbBZNzOh|HWF zz}{z&y4$Znwx*z;TQ;R?Dam)%Si8>*;4I8yUs<)0)ANO|7MAV{C+Yf15P)PM+LXb` zoR~1Q(`+yTIZ5f{h_j);Wg@g=W2MebGO0x(yzE&x@hR!A7>x>JLM%dzVtw|r(8tn! zJ&Zme5aqcb*J=H<=SY-mAb$N$W&bxmxMsE%_OSo}GoN>&dmj`}M;9|zGe=W*`*)`M zhvLqJZ5_Ax+P~wizllAVcv=Qhtv)AhTaZt#DzR+l6&|;Kg43ShAhBhPA(W5*sq^hE zV2+$#Cx9v`Pe55fy|8Iyd~eS?MX3Dk&s?{Tf`hdx4U_MZ`dsRVBAuBrd5`Pz`|F6y z<>RF0=w|2C=GeYtX6udT!_k7bn}pHF%+YItSq5mb<}1IXaYvt}>Z!Ts7moZz9Z3Fc za;Fh>4#bi@=XS#^d8D=9Xtc9|zIv$ODtNS&$+(AX%Aus0c5u{lyD%=s3Mvn?a3P^W zRdt~ogyQZ4{0@ZSv5{SR+ z3pPXz%@Wxm3f?YgVpqO(Mh)vdo{c%vzZ128qC7b)?*D7$GvB(^$dHfVK z`CRHgh>I!L<|VjXOg24jiOR8d_zY|X=C2F-CL$HMrK8)S_sd3BqkFCu6^2L?&|S#t z&8rA|fG!D1L;EI$p`5@%SDT-X;#jJed-~){Aacf=l<0_tmYP^@n`&2>7CC#dY zP|k}B7|R%OxKiXs^f5%f;cUkNQk+DA(>gH`kF!fSw-Ld!*Pzy4*7Gb{G`>NDOCK6b zhdScGk6dQ;6{=|Iez*mncFbxcW$2AyP87v}h=+hzSn)CRSGfx>{;34N%+d$8d~B|$ zUStGlS-YN*Ibw#`YaxbW#d-2kWG+Xe8eu~umewC-!}C{mt_Wp^7*6ruC6j*WL}Q|4 z7uT4`?ggq8d+Qp<9h_!|IC;-%)I^#(Yg{Ir+GGv6eRZTvTq3m&-K*U^H8seRW$zK+ zj|`@QM#WM6Q_%SvBc!7+jE)&*B(tox@)QXBX6*lo=ZIG_0slD`bHE+82YS5$)s3$^eab8l2UH4xfI2i|mYpaOGP}Hn{3yVc>FriXr)lT=a|&auy4y)T&5V$xs-H7A&Ot3YhXvSf&(V$0BNUJ$^gogw@{dX z+EA>ujM1j4_CucgZq^BWA1L%U+}yAJilgh{SUFqVSM4b3Enm8*mg(bF2` zJUIn@ZyCL+t+pi$Ds;HLUP&&On(7kB#4dGfM=$mAgDg03DO&}42cBggbtKaq6bnwa z83Y_1xp7Nf2<&NJeZcY?XgpF$%>&exBmRIYiPPpzlRT**7rgvRd<6WC-iy|w=Slf# zY|sv=)aY7IyTct*XtoiuL==8Har(;ENX+^`F`*dC!r5F{B2(MR4kVT*Hm9;g)E;%_ z$O?2C!j`f&`6G?5KuOKN-kqWe^n*t*A{w_#Dq|v~6x|xIeSCshn5ZW9)kht=>H%7# zxE^JxL^=;QJqQ>aw2Ey(kO;F{T^A!h%Szvq!s}mJ@k}58>0Xc`z9Q zU?JbAq(an&yHv@=YfbepkBT~pUDbqQ>xcp~*wF{>Fh%=Co4@{?$S&XS99&AG{vNcx z?f(Y&+P$x`KSjD8puap(XvpNh0l-sVY1 zr0OWa>INamgo+d=dw62WnUi_A5k{|@pn#$U(|A%<9VrRq%5wxsFaa_sdeHge$1bF( zN~qC)HN%})<(IeWMnu2Li=F>aCnILVQTKHq5aam-g~ltL`f+p!Ku4uZb8N5MkrD$} z**)S8!}^mkFJQ@7J=8-ssqOv~y4uAb4N2KHjr|SK&yA>|v^r#IH{0Ef?BX{xy5J%S z_~`X=YcJsUrvrMID8&I4Dt72K4Wa!^nn&|Qsd|(yZ7jtl&^DVPw!BS$51#xcW1&Op zpfHyDDb`J&!&EIZj9}8(B7FMsrP1rwYKhnxiF;`jUNF3mL$(lp4bsv&tnX|ibL3q? zs6St;9dbwIZ*(9cV!fNv&U}&nvc* zZGWTFdg}PT^puHSp?(0PW3L*}XVraxo0lyTFokpj{q7(ZFM-)0}r6vbL-QuAmM0T_SROB?*d5HRCS+6|yuB#(YXZ z?J^#;aP%?xuI3iOBdSb8UB{xLY`}{{rq|sV0CHL_4EPopje>X50;LV>YAFJ9Pk8}I z4zh(;LQ{3$c2~+&ianK`oj1^4kLF*Pgh?lnTu5i65=VrJzw9qrIl~K_zHM;*<}oym z4tP^W=Pj&HVP`g{)Na-X!K~F`e2?<~TSHZUFpr2-Xn^7*x`6rTL5Asz;a3@^w7j36 zw_gLXRem%E*3;Q7@Y4n{c_YuT?vsCX8~D=57dNZT7S~L4lE$yp+r*2W@V2a~R|uyH zO7d>{2&WLlj){-@y%AemWo!tlsXcg-(kt3DReSoB=xJ zD>iv`VyFUnXBFcWp#vfY7E5@9%dO_*kHO?`E5sjF^=Cypb5%CgsRF)P7yydu1O`SeQ}BKj|aa@s-DHjlhvDJ_QPM@Ji2Pk zGvxpH33I?O{alBnk_lqItb-Ysl!@`QLs5!50R0^4%)#OO3j@Q8Qb0B*X;IpLl82HL}Ss^sT49OyS&om^u+jFmHW@$J6xVVw?kC&JDQ$Jxf7MHR zc}39-z#>>@n;v-Z@k<<6rSr>7&=qp{bfdd&U8afg=C=pv7A*CVn-hvV$#M39q6Gg2 zh?mUySzqc8me=TvWuWk^3~>8@99DnwXsp_*<^j7$5XG_L*?pk=Dx_hs6md(eMa@%YOC;#Us(60YlW zxAyks`t@~tj-XPTTlO@aMeC09nJ5#X8Q_YXo=*BTijtozLms!{nw=Upe=^#r=Evde zt+64M3$aS$Mc28|^J~JuJvVG0bCeI+<^G~ax+O0w)w%}gYlvv^ws6Vzv(g6X!f#iZ z?ln6ZbEj^Os=w24Laf2+&^Aa@2+7ayRz+X1h28lP z0D%4I*ne$ar+H4{IeyOYS(>-Gc>rt&pFJoM!{KsvAO}-D<$^j2>3a> zBjHD#NT&7D2l}`K-b+L_s^7RwA&;S}F@t5l={$%{VLQXM&Rr1itxWX3B-%YU;B|Idk+?eL6h9=$gWW1fJ{hXlwcc0PpVictNJZ$fEKXP^G3PlgO zNA^clg9)?JFk)|z_dxMabNYdP5wxBXJ>=P7P&OfP;{0`UWZCi8rn;~_t9q<1c(crY zXxsPaKpSrMISR@%X2Fd+u1xz+G}PxnoX3nZKtZzI3~t5nzBtrlfQ+O@Dp(`#@GMe%@2hi$49EooGtc6x9+R4f+Ce(I3=OWD|7puxINDhexV| zr9LAf&^0+fGXR!6Um?<6aZ9l0sCB}J$-cJFj%D#Bcp#5IoZtC z1J-8OPU8ENu?81Tg{Ev&Yp*~5E=t9$E;sf>)H0+fYbSQKjU?HgkM500hq-w2TNWf` zdQ_-<-W?RQ2ew|mP$V}zsvJca;%VK+U0zS>U|Ze1yDFRC7F+E1q&^{PTa%BQKNjg5 zyNI>?7@K1Vu*Ny1x(>G5r~1{e&%!4(m4(5A{=KJ+>@CRO(dGiz6|daYmkd@enskm=j4erc7an+&RvyLzMsV~$y9SKu_#~1u0TYy`ahEA8;apDmcoM*JN zeYOnMZ^1v?9Nvv{j74>`B$1_j*3J7brI!@A<0~K29pFOdFIvxD7qcDtfx{gS%x4YR z;vZ*})>)5MnAMlQX|XOxnA4oeGOm!o6;-=U2Ka5ji3t`%%|k}#mHW7F{)&Ib2(NeO ze_B7A)PeJjYO90KFVklA`dCz=O`2-nc%fijX&oP25!;ZXIfbnxw&nj2U4Am$P<-BH z+udc^=VSj_&1E1U`!_7ZLxa}Grr~7ZUF@B|Cq{VQ6~=oP1(>e?m}-3pJb#0GF+KgPCRpg$*;n^)0#!BkT$}*^q7`>! z@7aC8TUOiheDK6u6-(I9?B*;IX1T=v>(wLRnnfZJG+p!!L;1n@;Y5Qte>k_4X>m$gkxD_ zX6I}GevMm5YsQULL~dhO2lQi=&pS>3H0Igz7xpVhpx;kVswhF$LdmQOdFf;n$0R+r zo^=zrF4^*0xqxBclSP`0pRs>)%O($>x&Q(E$qza?)Hx~M{0WP0lb=1Jq`XQ{XyS3~ z1|3lYF*#qc8E);}2}VC9D_nZIQ>h_@dLGQO9l|hb_EOJizO`^GCw|twubi~)fEnJ5 zzCqmM&LAAH`%|CvpjSmTo-WT*WT) ziSM&i6n=@;nhiwy>|kgogd12BR&HDC(H`rDs3jp`L3BBKjUa zzbjt{cpymF8rCv<2G{U68Z)Re2 zEc!O`H3g&T_u#}t9=xKbE?%sZZn%n<&i4tl5vsWg3KZe>vnb1UD+XL#)Rj-ah5p8M z*y?EvTWU3+YWo$19!=6)nLAEE!qF~`x;N~+mSk0WDV)k41)>XZ0{{W)HDtpoN>eS@ zYFr7wRheofq<1>R)?)Ve%R1A?Z22~TPMh7^cu&6xPxhv9$+fGpyuNHKrOwKTm72zm z8{Q+)HmqSxbxdz9895QWc+_JkaWh}LTsc01JfBk*D20(_ub%fqv}36=Q^|j*3|}H# zteNh|r0$<@){@Q75F?^3;*W4q!>o@95SKS<$+*f9N}V#X>?@!j?2*N(`Y9prUFu-L zTXRJVQHOEdoq)|C~>~yqr2?b;a{!j`QK=)_zs-ieTKy1`!b>%7`JNg3FGVSq9oxk zN}|(-e`Ys}uUB1%houy293HqRDaR|po$y%!&dLN0)O@fOiFdPbjd3n5{HPmGsr+2( zL|o;WtNj*;EYFWZBf)OBt6`5heA1hU4N$ae?qHgm!OYw#9^8%XPq;*=)rHO(!^2LG zjLJM%>MV*()1&*aa+k8Y)Ad2)?zW_@@UhX{_=~L+I?Y;nlZIq#%?xiaPOOW1bvVwf zxa^>N_GG(2V-pv?64AtOPACs1$Aj}SQMQ#=jZGd6e3b$6-)l{#-usV-Qs0R%lw+)z z!#gkUv*Tz{R4%ReR2SVwZsBnY;4p3g$P(~|xTuu11d+MTTQ1E()+WPAnE&U#;bx&k$5{W=hi8~CrYO%T&^la8#X!-gFB zyj;boddd!6uF&Ot3oai!WaV6_Wf0Ngd|J`CZ7>XzMfZDQx&~AZ zs-|RhHu#m-Bo`Ep;J{&+>bY?$o7BTeI7@nQ@p@?B(KvF?LJSTOYI9 zuze`VDvl+$*6Zi?`}JY9*5K3m1*_c{9yV`Th1QC4BkA_H+MW;Zf12$JY#M#oQ*!F^ zNPu*&QWc?`BBx_fw?@vwVxmOxsUS-G7E$1M z^=aLdVujkEK5rZM4R6*t{hCj}rSE|^Mb0HpHZngdGJgmmcXf->GytLw%xr_A^7xF9Fi=h2Xw8+`D5WIDl_SF~UAwLSr?I(!>u&Y7v9%$4 zEZE|uJ?xwXQ#ey8XH)Zbp`NQBkIFJNM}oW53Qhp2J_W+F5)@Z9Xr?CV@d>ffRHxU0 z^(DXRu3^#RQ+N^VopXOQ$+W^;Kh2Y2f|ah6>B4weg70cRTj${USV<{A=GujhpN-f& z6cfVvV{;`zO>~f4&USjrol;GFU+`;J;eBxhY`?4r=*$tj%k4Sl*U6NMgmicjOP~AOYW1 z)@7S#pKHATy*fhrkL3+HAYl!MUKj)b{IkDr|7Ht&b2DpWR%?4>OLKM>OKS^Rc^N)_ z<2XPF;QpUF-taLnd~Hp4OaY<3t`hw0ZDpxy3KHz}ga@|&uurN&Cw`qJCR=8o;qyXN}VeI-{g1^AAs z<$h&PU8N5llkhF0_wB_uEkn@F1xWbf+qU7qXV`65cP_~3CH|w||8x4E5%_-{0rE$f zf4v_t{Zqj|m=HsF1wbJX%QY4bh9F=w=ub2j4M$**C}dg%0-&I+fz-iH|#Rrl(be zUfz=>2?xuo{sdcokN2OWQ9W>BptwB&m(@VRM__&27haj07b09QNIE<00EQ-eCk)8U zNcbKKMMNn>(qdWXzR)7ux+2dq|4ZN}R4l9Ay@(GMi9v99d>BxuoRPQ%s61X{+aZ~w z6F`(_D49%EaYVcn7?j>X4HdeVUr?^bFSp`I?7DEKvDhMB8}81%6TiY%w&%$s$!!t` zfoMXz5^4A@?b~SUe*k#;jAvut9c3R&OBAvBaDZq$*6zuPvebO(2n&;R$#Sccat0w- zy5rk1f{;T=7|Q6QBd?<-Pk?(AZnae?dVXV09PbA>BSmNdsSss19*;xyS^kbggy5@r z@tW7h*T&M=ZR6EKbZBiSC^(qfd4nR1ui3-q9NF`D6=8_?Rf<9aZp3-)T$xx9?-Lzd zlwccbdy5tm9+KK%ETsCH?Epc_PoE#h4ifp%cvqk>kJ%3OSYHT;)qH+O;kNH(=hV5W z8QavkD;~{m( zxx>>Ev1%=tv%VSAo?XWla+1YJ8)`DJc#wEB#g!`vls0a?xg629gcSTF_>W%sB9r?F z0tOMC1)EvkZLIzwI0Q+Nllg8PxP7bXLI)c-5Ubjk21HKR)pAB<4OPC|_ByP)f8FuB zKfnJT2#*Gk24N;H$PklXVopoe;0#J&D>1u&1Z%u5&xz^$J}yY^kHHAaTl3phqZh2G zc0Kl}?TYIy%Y}gX-|&1!#*ASbr%N1btNUokCV^RDQ_|lrIY(qG?3!0J^-v0C1A_y4 z+WJ_|QWfn3B??W?mga~=X@?L#>UIFj%sk46tpvVl2Em?nT!=iQ)3F6YW754D{^2}I z3_&aVQb?qetF~cW3C%ic1WRKum{Bbii0ddnp~*fZ{zw%`-gQ(68^4&GPJByuJ;Dmb zPWQoITS|iH*8t~XHxyF*eonYI0}Y84f(s;h0CFx5^OpiQg$=gkglbCSbsu@j@<(w9 zo*h7uVlfbwcozUYPsVc3{|RaMhU|PK43_)k<6JRT$|<`UJ5LsFz7Sa!C8$;}m?I;U z3O|E1{#cw_><64QgaTe^KoBc52E;vFcTyV|#=H3=N7p1RoY+!@y^};9OFNY#ec;n8 zVaAFVKCg5htuUU|r@wG)^fU&_nrsR|*}4xocoY~ErBe!t-=tD)yc<3S5Nag{II*2f za3t3e;&%R}o-(ygGRVzAf+C{;O5sL^FQ4q>ixrjzA3J5tecKNy<{=@Kv!c?LT+4>m z;rCQ7ORQ{-p+HUj((vollx7zX-G)BdeQ`=7F;xZLk4(WHF5H;qH8t;-$pja{IyKyK zDbjwWY}X>eO<|}ifs=_=??xRJfGuZTl=Waf4MEvT{}-|1dy^6%sG54ixQput&;-lM zPH<6!OJ_J;2|~xx16a7oM;5%Pn-Fr=%5{Yzn2wH_-BMoEYH)3eU^^~W^Rpg%D>UnMsBGSAGQ z{+cuD+-YS0Nuh!NR*~qzlR1$L3qvU|!ym+t3%9}S5_3Dh5fp|m~c9SaR82UI>Ty5VOLEes{ zBY6f=6dy!A0Lh~ABF9-Y|I7s*eBSMtgyP!e))rUwv)CngDikw@Qo_X(&cJA9NoO>r zDrpmGgocl5i1t2<4ZjQlq8MEboivI4-AobMn1~Q@KK@SXeXY2o2Ak_i4T9eOr48%r z2%}p>MQXi5fMYWOx4%~yKbeyMz&tQa`oY-Wg>8?d79)`PjKC7uit#6&Q;u&*J9uJ< z!BL*puWeB&)V3Cgx-AArIHQ)%r%eI3Z0F+J%5eAdE1-bT z-^DTX*_thyDN|+d4w3|9glpB=ZB;sj! zl>sU{nyU167;|dIG&)4JLj`h*>vZDAz%%Wpoz+1XG@q{Kj^)05 z!RqX?jimeVBD`n+GxJY}`_ZLlD)Py0hc!^H)9FY(y7y{sI-2(n+}GBz_(Zoxw3?2e z&Ei;dW&OW*6nkB@JltS4qzu_qVGimqpLBiu#5^!?+G@cHtzHzkcS>6qE?%;lD znJ1n##K-T6)`JDAu;TP&&8L?xdL0KV@(8j>GkGuh0rtU!E7)km9LvL>|9Wz6z+>CE z5}br`rw@{yrUtPMKpQRbdO+b>XmFw)vH%u2Si+cBiny898Q3m)Xxt%i3(({f-jK9l z_7!GbbrKc;grkyI1&D_z2jY9cbux9v9D)|sRu}bx)WhO&n&1iF@;Hl!$!fFHjD{+A zhGG1{-Q5e(#}7B*3pdjax9|$L@`7NKLxqK4MqWe2RRgRiFl?;=aE%bWy>R%;@aQFj zbS>3hT)xm@2%#ziabY6#6LKENpBF-|UmMd&@Or*CdNH;Aq`kSN|)Pn#YRzQ!2a1$>#0xiaV zd1SjBxD?y}8a}XLm~T=xke-Luhuf?2>T}soqTV2mx)PR$Uz*|0s^MW6W}{B(En1Bs zWI^Tv)z^5*ZSkfH@f)3S-Bu?3o!Al57%Dsgr)yfn?P9!UI#$Ne-bv7mfzZG#yeDy; zi7O*&H0z-v$D<6NzxaPqv@e3a`?JlFsp#HrxjRzDVI~glqBXrlE|JIF9lj&zj z5{A14_K!;8Y4O*j;R9imRNej%@-!Ecznns@CcryRB64pamy_OThVA1`qyTvYXQ|&E zMM{~wB$*R5Yo)t0JE4;*;jA?2rK*tIRm$Y>Ckc9>tc*$bN+L_hXE<@q_@)4)R;sk=okE4s84~i?RgTcY@-n@-1>JmH`S! za^Ur?$gPGbM`Mnt4ylAZP=GCctCiz30(J?4J|?21>MC)tDlTPV5Ie|fYLr6YeJp~F zyM{!vUa3TpE}>hfCH{s1OO1g6^lrYE>4M}jh3?pqlh{la@rP{={!}(+Aeu-CDE#yS zY6{U?NrRgr(L~(b917?yYNL=x;9z8Km9?)jEddIZ8pkS?FcqO1%m+8K43Ui*c-;if2g)RENpwq@IWsQEu?)8d5L*+-T`gX_O7}EI&3Kt(C6ia=ERo*?q~ysq zI!v6tkLA%0=D+g3Li~t1#ViUb`0XxYL}L$Opg^Ao{7C|qv*%NVl8U&|B*R;xa3{Q) zcjX&PN!Bh4Lssz@o2b%FlQh?RqlLy*hY&fby@ z^F$IytyyRQx=TP-$Ri6;jNV7eQD@A)B-KoHw3#xgu#y1i&8;zc)GZU zL_lIva@6zziH-gnlvDATy$+Q&T2(uoF>vyW+|gLBDU^*CoII@1>ntOLXwOs3;7$Pp%F>P8{&xMz8em~Wm-M2{C3LP^`jY(yhGT7Df%@{`s6HvP4 z(4B$2O>S1Bou*Lk=*3-&QjG4?zz6FuS-(WCTmjCUbipP}DZJ%VuYWMce$_`m*Ip6& zXv#RxnKj^98vE)&_55J`2K}X9f}{u1{*6k5EvXu&$SE4s!rX3z*Qo;2;`PSC#sLlN zqv*rNay->*VV9s3kEW!Jw*G3OWX~A&t%hue$j@0zdCR1U6yc{&*aAz) zmwF^})<`Oum{T|OO$OJB{-vh=qSea3(?e_$luTT1m#3cS>|MAaLoD|$*eISvk;?I# zL#-w~trYGD(7@l%ecdrwEVcm(9STfi#jJ;&I~*M(#LDAagKV|^>{l6I+Rfmffa6sd zMb1NCyK)bYgs+Yrz6%ad(2Q`>g4%FIl!%3ovXe1N@=?S?UKv2lzfy9)vdz-5kt)6yQR;A+gZd*mD{Jz<%1=HJrd1v@w57MYDet| zS$2ZGZd#{%P!iyHZq!(nc;mWEby2t)=mC!Ci%v3<-5yGcBH*c&Z`1sofyu*M ztr2pp-kKd+NxL&*6e+m0M*gcA+>C$$dM9X_41=E9xSNUq5OqI%lG}QbaNPdvfxF6w zmU!G=fwB@DQBzJN5`n1`j9FU!Ii2>d+de|fMQSl=2o6W7lj$e&z~2gV2tm=O)O@Q1?n8t#pfiS&<6W2 zVN@<>EUiqldtq>{5cCB7hIDf-26?M{fKxP5toTtMmv->UY+Zv+M#$Q8xS0~eg0O?p zl{BUoIY>|$q?foYXM_1$RamvvG)N%s#(3p)Ya*AyTG(p(A>3XsLFRl*j;c#BM{549 z?&)>GjwS1^>+>I%*3fQM>vEVmVZ+O|F?cSyD44lJ48kUJLb+}?eN)uANXVqGgB^hC z&LyD?yPI98d@=~UR7E_h_}^r;N#;oTM#GLsg-9wIYF{ZR;z&VO$d= zAFs{FNOl@fcaC~@&XmKU-i0E;fBs|fV{$J^>94t-_mQi38SyUv# zf2>gD<)qXA04U=3d@RCy@B%;{5hV70f^t=pl>pR#B|d(?fUy);76$;D5|IBI!@gf5 zI?3s{0sv^k|LjoXj+JHr012(UlsLr8@H|g3mS{X{+ELExk^2I^cM-ndQ@Ef^JM z%GlTd=7JE83MMEIo{R{W!nBA?mv)nnQBKEpExOqKOfGtVJ%2s9cwss_!b0Y{_(1+^ zq9odPvz86B6y>id{8s@hD|VWAITsEdyc(bV61!@uYxp_8C){ed`~RxH$jZz_0fj_I zO&YORzGrd&mA&PJ%$>?rS(tFh#z!Ezs-+xg zTGAVmxLYj+XEY78C{v4q8e1+S2Bxvd0X~Wpz`Kk*1@qi%b{dGj)d!J0I6WP$jK(B{ zJkxZHI4fXf;r8M`JHE>=dU)Jw(`%h{TFGK~wa zD#8Ac9Xo_LtzFqTSQ=9_3i-Gy3F}HLBoK7ZNQ}?GSvaIA&Nw%3LSaq~IcfeNM?L_P z1rKWHZD5vNOwPu780raPsoDTcXn-5s7lI zgpkc+RW^##;qQ%}pWE-_?a^(EG}*32ZA~HKGA!cM=ZVU3ODLn|e^URN$n`RTXQb+X zpQ03jv{OCmCG@mmIo$1;A{8W#p&g1b|5)=G^(=x^6#2T{OD6YgQAAKzFhdz;k#1$- zuMtFh`ruGA1XI}z2#eTwnm}i>V-p7^gA=7wxjs|--S2K3m1^d`yX+0|!ZvWwxhQYj zU{rcTJ5XpDSsk@HRVLJ`5<}Ff{;yV2I>Y0ck+OUmC90!8V@n}4JTz}IMbd_31YIJX zA_{62A&f2>XuYo`#WpIpP2U|c4JpMZP&!ToEX_0T61thZc2_eKjP$Ca#wYZ}ku)r^ zeh_SKh+zd^IdGRx@F~)4Z&Z6!!xM~IY9&s-slgD*xCiFsnbcN=GI^WCsU$m@h6_<1 zr(3Z=`@qGD(258#dUwvp&K?bYcUTbr({h;tb!EF0rJHc_rg8tISEWLk8V|9dfJZDv zMU!;B0i%Guq&+;`PmTHF$9J#QU?YPlg2WSD8sG8ru6;z#R zHBnHG5*8h%C zeM}tokCGwA!`|NJp=#aM80o8#7lxH&_}l_pJ@2HN-}_=SAdYa`%^b+Y+Z3ZDr3J1&3H9- zICrqeI6wL<~YoQ6JFv@5{4K)3gN8ph;jr_$ZpeWQ~JU3-5RF%NG}pPFMrP zAA2`eorls|3I+ZqF{a|I8|_=Q!GloLF>dbdc%*g2F$55x^I$>vPrA!WW1E9WjX+|OI$ok@nupDTsmeL0zW7^nR!Ry{HNO49Uok(rO{(p2705Knb{ zg9#<6D#V%*QTJDX6--g$Yh}x;nlCs=5)ZcM`EPtYv)8^tw|L>tLTF?s@8JxnjxsKl zn@SLbK8_)IgYR?xgcOyPcmyH1Qh=Gs&6ZkAHKlpo(gw)zKvc1GydFoCT5`X>sod#8 z0jcQwGsd^GZm9{FyMOCeTmz?RA`!V;74a3-&}m|btgJF9`73DrL#pp;(x{>m}OhZ&{g#ltkh#mKp zlwX3sLu1uvC{40x)88d?uIO-EMmjK0BJATlZKrFLF`qB zA^mDASP+b7>5_%2ts2p{ins2Y6!QC&K>WBv%7x1`#`@t1`cD^SZOKmi`jtDcL)gkr z?@cif(->4xgkdR3Or)off}FCIxv8n2IJLoOG-=0%VHdn!v5S>$K7Q`zWm?5N{WK5HK_7iJxIyayKT@wN|is7sJM%4wvA4>UDq-YWsFZi z-2wiu6PTPHoxF0LE?kf?m6}YS5*qLxq6S6s)8#rZ4)gi@@G80hSR=PrAGnrSG@JsDdT@tUaG&hJiSIIC(wTX`uJ{S!f2f7V}5Wb?AUL=ysXIk zPwRuqMkqqRqcFf%@k6R03OH0qC?#ht_YpuAuG^{iPd;x?uCkgPhSHXb2>)D7nkCn1 z@X09`Zf@4_1|F;r9{LfAy3U`$CG zDu~Q^MZK^LQRL}GPCYuB^D>k=T?8NzEHluMU^2GK++rE<;3xK+*>Gsg=_0lB6Tt-C zZ(nO@^!Z7udo9PXt&{4i1?6UoqU}aRpZ*w3ePQm{JnvcNH0R!{MlX!6XsLo!e=JvPdo2C7uaX>YNrH{DQRf&+FS&s9VR zVqw={1f5BH?01fDX7BbprnJuwtQ^5y%@6s5;Q9NA?AEfe z-~YA%+mDITo7ADs-`$!@?n_lm?L8Q?PtRF;C}$6R%Ug`!U8NQ>l_vS6$A@0d-J}_5 zZIU+4_s3!g?LZ{Y$x7&DuLiwxBwo=u#Pz!k>_#avcTn`<5&Z#@H^+Ls+o?GM6PGf#hLRe$hI|77ntH*d=_VPqdNDGSb3YU~~PHMuCyz=%mSg=vg{oEU$s%X4_m!Z?pe{@eQ zqIMVAdXbRM0c#NJ-}0{9rXop?WUc;OL9+LqrPq+o)p`nkTlfqv%GKB`8ICSQ$U9jm zOt&RW#M3IhVeE&~@!4)GrvW1dV_d?XUtf0Q57s(*Gi656Dx&Xzoh9zZxAml>T+}TI z!mFRDZ#{~J484e6>pJ!95hHh@SF~)Gk>UhxS>}l;S3KYb3;gJptq$E&D|0Z0{B2n4 zzIQRW8ARxF2Qj2f!n_y@O1eM6^UAz-Q6YV~x@q9%o4orw))#zqc6;-3SRU-$cMqP- zk0`yBwvYM%A6*R!^<@yQtOKX{l)IaL>A;ry7E!J#^`=|2>W-0kA-;n{)gSNUZ_Itv zl$9-(HfzEAx9HSTrb;w~FUCtgnp`6659E(3F;M@Yjz< z=AR09@Bd!X1|}9MRvK#G=2lsN2e-7zFm@>jrdpVrTxH>b$j+^uo~IzBe4qCH{^!%r zwdxKhOhmeS0EYC^^(vn^2N9W7|&0 zwr$(Cx??*X+a3GceeQejIj8Ua{)68hqiXDhXV%(#%~dt4=3LLj?c#7b*|#L|)fu&0 zsXu){Wvp6ORls($P5h1NmWKro81_-2N+<*LDudT$$`%6{!D+Dj7bZB7Q7!MD+zH4t zJ3kkI!;@9do^l?nB(O%svW#CQWxsF|;m6=SCWT9zRB!=$xW~?Jo(~o&uCB8CV+I14 z%v3D`+s@XdWtVps!W8@a+0D}&diU493j#%^J4KmXko_C?m=P3pX?Y*pcpbMJm+_oY zQQj)r3%2I0yn?*c1_H&6)Uc|`N+V`0@T7ow-14fbs=K?pPIX4ls-5+jzNR#B^6Ygi zkEs3v78<$k%iG(*QbJ&5tK%sR3wV__?ch{?+|aa^s{306oALGQ{GqPv2TI2FI_oKC zF$(W39bZ3zZ&iw%QWJUpy(C$(o=cr3(iO5@UgtBWFdF*?-nk}nW>n1JW3jdx{42O3lUP~=@=LqUNu@QoCnnf^%v;OO^~n- zWM<#mAN5x&k^J+nSq~y+k6Y3^`$+i!Y%7R2G#er|K-_Q|GFSu2WYUKEhjpGEK*C zQ;G0#;l-=lNbDtv&@2=8*669y20u^Y;HWSLFjtu~z|Uo7ybtKfeZKBW1oZEa6{mcq z2SP!*__x)srov6o3zL)ZBla|77Z5q)O5?1InPRE?jzdFJlqDQ%xLLRMwoE?796jNsIbF`d|vTWo@d(C#R|;k3rdL#LqDbN^~pjh%1n0sioPJkzC7?m(Y>P z_U_VigdW5!@4SmuN(G+0e0+Sm?`%~n50KIU|KTz~Jk!oT(K5RWi71b}N>?J4Y@o7C&}!R-js?tVH>S`LIh(Z;%qd_3 zwAICuB-y7Y>SF;mNmBVhq@SGXn82@>n*LQge8?c!7ti}to@iw5(RCqh8Y{kfL`_H4 z6N!4E1EgtoUF;(;R<=zt4Db)j^HBP^{RTkXmf}lkVB_$=PQ@URq<&wwL z4mZ#>{(4(lDwx!IX0c5LX<}0(x>PB=Bh?no+D-!&&7H?(5VmINVV|hLtUzf&8EU* zyUb9z8Vn5@umE^el4DW`UTO9x*z4#nmwJ3#1=}hotT$JF+?kCQ>W@+~6>BO`0OBdk zIB~mOFMp~!T)%w2D8^ldKNu{GL1OsK!-EquGJ#nPi)>g<<_v-+9$&b>zu&aa1=&a$ z(j34=f4uvB-@WBCXu^U}UhZpn8g2!Ao`0GOdq!4T8j@1qp-YAm7u~TTU?z>2l9idc z=MI?SDM=@n3YQ8LDNIryzgyK*IfL2*T_ z=pms!2$~pOLWrQK_SUMs^Ok9UGkICn?6Iq-M&ZIz*wfW+qN%gFwKa8YUwvyy?gX70 z5!5eD+Qi0&zV?JV<~7mb`ez17Jii|G{?AYuIk}QKbM(i%G}v#@pf-K>>w|+L)Mr1R z)__OHJgx5Ko|ipMytq;W%am!+8x9 z%Z}7R?52R1wS|IY?#&Biq^-~P7bQDL)>l09A_JkdL2-?(t>K0%kX!Vi)Y#>oV^dy= zdGP@&zb%(Lf$%DHj0;@K%<_Xl4q|w_=3M{;Xf(*hj!Q??PC4&QAIA;*hU|3_&Gp{# z_|8r~Wq8+SG^qVx&ys=+s;00CjkGg0Uf?MzwMhSeFs&0s?L(Lm&R(-h%bX9XWKB69PcZ$UVU?A0m@PWsinl0ir{5^FszkCwLZ6pXhry{2y zI58WEP6C)l`^6N`1x0x*hGc#il1{Wa2x)7g=|Ear9uq2C%W0S4FP>H%+-VR4)+_s7 zCF4oApoeLQE>4Gv*D5|`fW29}?+ln)Tk$X0Nv z$vWZTIEzWy6s~D1RR$<_bls_v3xV}(SJl*f_IhMI$`X4?9bYFft0;_dg;-JrnYrwK zf&ZzhH{F~}Dc>QlqK&!UII0{qXEB+SP=1LrOP5$Q228D-L9>+qkr?dkId@*U#Ee0W zXs1GpE}VxLC@^J0E*ZvkgAcbxdi;r80b#u?4eVieB<7PJ(Ced%I-e~L^;sJP)upIz zMSIooT?Kv=J?Yx_kaVG_J?whPZU}F+C*jqFFLxdlouE?2+{%P@W#{MTM$BA1JTP^! zm=9;L`1x*(gJ-d~bsy`f()nMqBju!}MG6$I)OZlV`sI(y;g!Q%mLehRrwq+cA!Eo_ zmA!EvO2VCd@&Q9^vSb%H#>UUk6um4DU^Mjc8J0BIae90{k3`s-H&^OOoO)_kKv7ZG8cOHKD8c6k4F z!~igXm|zn4;eGdh4bQSnpzkgl zjq#hr%?u;V5^?GqCl7G&Qb13uObtfDI1mP9gr%&`c)h&7J~*?r(cwx#PF}BF+Q>BD z_e;+PC5cyjnW!Lzy9*^^*kdm8 z`rB>Egpk{IZu-D{uWjBh?9)vbX$*UTieBZszDPTK4s_jP07H{jKbF^C0r4in((m~A z7yxHC6=?5s>p^jgA2(74#ap$2u3h8UoF{5c4``2ND7qup=!TD?Hg zhlhuz7^=K}knEV&)Au-hV7t7m>KX`b+Vq%jTbj9$0iZWzN4N*hb|iY{o}L+Wr%X*W zrUFIKb6|SkMogKpFuyPwGWPdEf=6zDgNyDdJG!h-ObEYNZ~Fu(BP$CMu3LlQFO5ce zgezdMi>x%_fT>*AdkOG&>cx)j12JYF63GYpaz#sxhL7yx;NSq;E{wkkY{4TD!=Uc@cn{h z`v`J@@(%E$0!fI#i=s@!a5?9y-=@wyx(s9bVwH2z2|8~c-!@~i>KJs}aaf#00t^*jwZ3;6}TCuY~OnJ<|iB@^di_)$XA+3F}^ z*)bPxg=LLGpqv6V#y)WYf4)fQ7!`(<0>h!JvEbJ=elaK_G_ZiO4y!ih=hBfyj64aJ z4Gi$FU9_~)U8Z})0aA)+wP{&9UWE1m|K?3VJK;oSh|?9N={ec}IvO0&$+KY6q`xcm zx`cj}aqiO5X1)zaiNlV5g|l!sEW6QQ+K;_I|>Q)i44EE-clr`z*xL`lrdk1h&|2Oq9B-;ceYQ}E?9 zoKR!RQ#~I$mmxX%J@~#4uYGDZowU2YAIA-wK5w&d%Ens_H3VT#rC-!)b-O#6sh|&b#~SUo>$4= z(6>Nz@i*&G`6CC_6(FuGP_=sbCN(l(N@UcUD(f+ZC63VPhmF^PhsEeuvf3V9MyU3F zvC>(aiO{k=UK$+LMu^y+sD~@voNn{mR9g~QoU8u->w6n!YVXOUpMV^fk{Spu@x(5 zGE0K9V;HXL*Gdb*M%G=H)e6tmy~Dz|SAlMDhV2v{J;?Kg>!A*>>^&4};HT$qt{&UT zkEesq%Iv9bvZ?l3E`K?M)nJ*<+j+jiNW5|=lBL4qP2_PHk6JVG;8M=L5+qnhdvto# z<;b|L6O{7&0mu@Y-LLREw@_D%a=aRrx4?YyQFn=tl#!VLR zx!O$kP@}+4@gw4EU1s7FkJex<#}T_Hv+QhZO5$2%;>Pw-WIM$(JTi&JuqFz#&OB<- zv~{LOn2i>T8Th~KSAPZDt^4a|f_yI1LNn2y{pFRE@oUr|n`1dEx#>hPfDWlF)&gUU zvVd8O3rWi4c_{<#JfwlCcP2`8&cM3h9=(Y%#=-1|ow!$%kum$k!=pNqJto+QS?}-; zP{2=amA>q6l5Q%g+H)wtXcjJdCTc#qU^hKadkcOV*xQ{H$H-ZlseKcz(|zNTCuj{^ z8=KRpO215vB)OtKOpA}kgFano=7#X&eggf%EvAK!LA^5_G#mQN2Mhs00&^=QkFH5J zc+0S?spi0Xs)dE1ByVS+0KqEaFI1uwM`-kQ-=*7MgYGii-FPqZ7r#;|&DXXhr|VBKn6lO-&7V8q;p<(1w{_6weEu(BTC{-4Rz)GtyGQw#9Y}`dd+I3 zAzf$%hnmkqv7Lhm;G;M zIaUFJ4=h7bmK>TSU!tHMefPv$G^H79VKy|VLLV6;p|MB**qp_2dxsB;xujMyt zYT2&0qWLgPf9O57MY~h5g*L>BmuHC1>db50YGlV*6Oot`nxDD(ddIMme2tfj;5_eM zM*e(#b+wKVV(a^?Xe)OyT3xexu#?!MUqWHrV8fvTSfhA;DR~{w%Dxqzu?n|dOT;Ka zF!p_(>*)D7KYuG{2=U`Tl?xS_t2wzFIzDGSQ$0L+s<5b)8yqwR-42XOCg& z4(YP*ueMwQ@KX7ooR8}*@X}Rw6WzAn<7mFL4uzr099nsJOt$&p0bj!bH_-QVMhElE za+ah`9V=%n%`n9{l~eRN+!&7YlGLvBga^j55bXBYKeK4QnJlk&N3T~F+}PVNp|*&A zn8iVaFRd*pC{I!1!&Rygpk)%;C`AQxdlMa?NB)t>d(qszm0 zu2ILniOl7Dquh6HIr59)p2EHB&0BS!v|+Ioe1hth-A`ffctMSySDX3UzMhZT$oR-y z$JWi=ARUdichUG3aIUZq-FrK3MHq~*u%Zg5v1iDs=*Sji{Aype4UrpK*q^=#J<}0< zY1|Qa@YZq~@}TS()2SopxU*()I(K=unR~Cm;|=-|-TBD4>oTYF6TO2O7xLlqXLE%Q zE@$<8&U)1-!=OuB894M>hlLWxo`L_d`Glj$j*s(3v+x}JzU{^h$Bv;>1&fdROT~8D z&#^Y+hNpvl8g2$LQ)UKoe20O#xqYIk>BQnvi9QC0kr5Z+uq~ga%ks;XLHmAEqw47P zZ!mGP9o4IeIbR0aaq*jtWx3lc-!T_n$GQoq^Eoy8K6?9dnB>`aM|w|mD>V9nfvTk}&ch*_!vSr@`@m(-@>3&7L)NMlt&p{lcon011?Z>BF9OD zA(bhP3+9vD6U>%sZxOPX`*U4Mq4#$+VQUg2P#dYkw6XK|g~mZ&h*26dN18Fy9FYZ5 zBGBoY)d#kPdxWVMT+0USGKFZvP=MT9$B7%}afBO5fD@zf2CSl&je8(T1Dmf2y&)Q~NXs}zou@aV z*hLa3p-)By7UB=%9jA`xl1YlWfEA=VG55t~#=@>ek8?Usdq6RT)IVzteu*yHm4J@5 z9HNbhHE25qFqPKK=^x%ID1B1ZAk&2MDpT%sW%o@5@?466XzUls}y3RRU~ z8x8x;Xe%3ryILx#Tsw`d(vGUHVzKA%dHQoID?5|tx}q;kn#soUo?Sv!;2v?Sc;n0r!o+JIiJ z>P2T%c7cl7853Ab`V?$aQyH|B5N#a#u7J3H`Mbb^dZbY-X&E!5Ty$8nG+fQ3IOZ)( z+eG+Q8p2O;%f69BpNDWcGYmhoLCK-JNm0rRWTh)BWr4><;#va7l?`iqLZ_w%P-5PD zBqT6wWgU3C=f6q`s9nX`c11kg_?WLwc+xv!CK1^spI$}SMExLgvf}CwwQ&Nam zyQC%e2651fgFFoq&sj>q!OkrY6U{P!j+n8-c>-!I&CH5%&do*q%-=8Y#>IM_ofJ8svQmA{;gZEvFb#_IBKb8` z&0k<)9yWC!g$m-@)`f`^c8$`GHg>$Z!9$v*Ig!M)lVtN};4R;d^z;HJN=y4pfzy(O z`rNWKMhD!Y4ao)GjAS!Hxx@npyBw35&>11p?2wgi*y#!T3S0Sew~*}@NsSXe3yEC8 z=74(Y!(KFW?hy^)isQ4iDlr%jI@~Dkx2oQUi$b0ER@8C$Lz?5bR%bu+;<|R`DTf@Y zSKC*eRn4|0T!l?Tufh{SUHtUUUj~6FbH@IHAt_~~3KKd=QS!4Pr~ybwaXlU|G|mFC3B2m;e56IetS=n+L;|FF zvIt62#^G|~`6bVA&vLM&mS$m0;*#))Kez^TksT96I71Y>kYGX;06kqbC;!@as%OKG zA7wC;x#$i>EME9ImXmx30x%W&;Nw&bdNos7l3b1Dyec3c2a?}~J`$9O>H)uew?EUY zvX5t?iF+^T=F@zSr&i6d)Ysjrpn*9zzO6$3@heg91(l&6BiEYCPmes+^Spi`Ia_oL}_q4>l#uQNNlg&^YMAnf8g0zTSi^z4e9xwZs6w`6E&_Iq$L#B>ovh^ z_1V>OUX;a_Kyxj|j`uJ7g3G7Yu3YbfUwvp@ItFC?DsX)4+pBDBAo$-~KTod}AMwjE zsB!FshC!h~Sb0z_?oJ+^?heeQrjBHLQyelqu@)aN-LV!QGQF{y95As&Z}6Xu+Gw%m zFvt=Rj9j0(bXZ@GO-#u>atK2ZNvF8`+`3F%pITo}UxZ+6MlU~JUyub|hhxg*DBl_U zGTQli&8%yxsb&{X#!$&S#L~gFNIB*w* zeQ4f3Z^#c&){l87j#P37trl3GTQh;@d|Dk@eake%vb^sWee^EcBuG#Fe0~l^# zZt-A&yQH1?)zwYotapfqn$^#W5d@?f$pRt#^1WI&Qceu-(75M+K#)}zq6R;ZD~eB+ zq;1Wt!CcydVlqP}T|begP>y{|>? z7I=fp*+bm?rA>7=-}c^;IDa0MXcELvN z;u6%Zy{w(!0gCs`{Uo&(Q1j6cC|+5=Fj07HC;^PK{y|M|GL|*k2sAIxGn#s{mkn2K zWzjA1d-Zi_-VSPMpRY=DQ-3g9w)cYm`mT{(sIi83q>e334rk;|4{Rx!?wm1x=05+^ z!WvWbUXg1A0dD)_(gjBZ>l*+U;Xop^QtsdZpos6{zCV74iB_ zy&0z9#B{;iv1(@HVVwo%LN%pqyIkc;14K5rBT#6BAmo_Mt2~0SPw%K97R7+w1pe_T zx_(s(_=|)uE<{6~& zb$1N%HS=8{s1fNLsN_jMXpi=edMG$0bIF16p<$5~OZy}le=?Av=YW1;un5bq)%IrB zCZVJman;_;`fSmjo(C3pY}z@z=bo}{B2%vw%K9!mfyAa(mBdOi5k7MKIul@`FcI67 zF21e6g*F=5Yiz?gJkJQ*aGQ5q$HYOyGu`UA3QrF$RBIJBW!J~1^x^f)ifySP6ynZ!=3KdEEbLbPWdvAb`FCAqe)=HL+H)WyyRWY@|^ z7vaZA;O#LVk@r4o-4aRt*9h^#ioNq#+9hsyD1+C_*fZI_NwHwmUCN?Te!7xt&H&f% z&6!9%d)n1U>)S*!T}VW27&P3rZZljzC322coPHXIPZD$rSF;q;J*LpK>)DBCyU(I~ z1fgnI9u*HnOv1=&4&aEE5SW9Da?w!E2eGNkKl&YZ^m*ews|#N1ttMZ)ZA!_Hf5a5% z!&j5|N@MA?fZGkPGcHvDk0;<9j4T4F+UX9xhhq2QI1XsHfY**dPMt0Q4W~BSEnxTF z{oYyxlKs5BvH(=s`LfcNRpXNaxtssGAOzQ5eGaZfQag4Pt=zAW>JfI#xBxe!pWeOC zldIJ^$$;Z&h9Uq}m7N6I_VN#op}$ja(L>BE^T7iFU4#Gu{hk~D#lYz3fOl}n%9gXg_5eXD=BDQ^ z>&dwwc-9Sx`GP)!vF3b!drc(obIr!6`%X_jmok#@%``7`=WN^H*Z%v#P=$niB5i~^ zF|!Yo`@zuOVT@2laUcqlz<;0@`Dy=A+K4GEmTvIbiRorG&BUmNF3?fB40+P;r-+5#k1`*LhHDIq<%X_D?k5CaYZXDjWz`>)^P_1X9 zS+w4v?n9EJHQ3h+gX~$6j#gSV|Kuf`1UGjz5fUQ3XO$)%e>*C`t(x0+QqvgoT;ltS zqD!}I=vAHUBxHV73#&a2a`PH(jodg7{RUttrjxy0elape;_cQK#TsX~Zt(j7LmZv+? zfbkXGMXFLo>PJ^pPG1ou_DpDDeA#3B@JT2qeWOm+Up@4pGf+H?tna{0#((vBWyqA7D7I;L0;Qmm6@VG00FJ$sP@Y|t{-~INJ03Tc)!5()e^nlYJZo+;LIeixr zjdcVG$}D%|_y)E02eDC$sEscI_#wxJRi&zOd2R63ED@@dWudyG^{ZJw2v?dUqQFab1` zx*^Tajg`*GWC8hERW`I_?6Jk9XF#~tF;+h=_hoFusfltJExX?E%O1-`D&snpa|_~WR6;V=ex@W{+Nj69^{iRsW=6SLhr7lM>9+3WjCL+;o04QJwcw%D0-^+5!z1e9;r15sS2*z0wf ze0x?6@benSHkBKuXZF=1x47#{k>+q=7P>V$dz$y$lg+zmtN99GY6B$DHNj%2dT_R0 zq2BRxMr?u|MP;VwYsM>Bjp?kEW*D?9swk`1GsC0T_{}iiGB_E&_vhkBZT00WIH{&3 z5Z|0@a&_zTEI!t*PDvI{u!#GsmctaYnm^vV4>)Qhd*jHoBS{eByNifvC$^P(O~5~; zvH!@8_06$atPFLoniqm4I63X0@RzekL2P-*;Rk;(C>WJ4 z!o=Q6qLhk@XPQXs?eX3p>zQM{Qbg}tVNtMU2$MxHUv`#e{H{!jgcP^O$}(vX&!l|w z{v#*Fe;*0%oc?g(jg*Xnm|nfTj2sWNj_hWqVEi*^1JT4w)_xr~g9w`P11aNaqkf&v zdql{t(uOHgY$n#TvDV2=j7NDz(Xrib2^8J>Bb9%1F)n`M2eMOh5YFZbdUSci5)@7N zvOCm5hS(Lpa{iT%~j@})d8a0)Ne{(q>h-=#q1yF+St?%3(NdJ{5C4&<=}!dSKNP#l^!)!)EzjaY$UP~5(7uP*yI&Q%%$oX z@PF35YL$>=K0L`O?Q&&ac1}fLZ%+=~b19On?E4>j>&`Tg|zd3 z4^vXT%1vM)@Yya;GG6z<&9qq$?Q3HCNG{H$+RCd(vbijlad{YydU&n7YLf-f9(o_bjt0A z!laka;{}vXxm=-eK!N6#Cj!AMMf8JL4i$i)7Rmjz;AnG+`T(sgF8J3b8u7GW`C$YJ z2-@f_puB)m7d`???x)`eemC`7t`O*NF=(X%>ooF2VE-e|;;uB$H&@7A8&Gltf>3{# z|33MDP6D(Ef)?rt_D`7$7%*a>)QKZt)QJyJ%Hr36^7qyJ-6*xZU#r^RzhUMu=K#6r zl>LS3y|Uyc`fWR)6p<3mMg&!aLhW%3tG9;_H1A zSs$a@Y>Jb!_992o_iaeXhaxN~w-dz6vBhLgW&5wu&7gU~FU$>OkZ9{EF?4-%0%V8Y z$8&xj+?E#%V1fLujgW^nLOEJOS_{XR;KT9-ZBW8hhvcwq1sUJ!OHcwhDsh6EYjO5X zEig^gm0lpqGrqC0k-DV;o<!XS(DBoIav!<&HJ))t|^SlBYx|2`DEWo+^7nuATmJp()cRT{3`sIiO) z*wRA0Hys8@2)gKq}Oe$*NuO>jJn4AK<@v>v1QAfY>n1bT-!$CK6 zk0%CXwc1DI?$=S>-4o5wVh(cRONyfD3Ea`*uB5^pxcaAg9-q+kDP=1Ch4@}C#PP~S zIQA6FyUWg4wx*TC$44uEPiI43V6Q97GTmk}EvBlU#irdKMakvOO9YRzGF;P-#cc;C zH>j*`4{fv?>0}8W&!Wc|P83QtnrG@Y+LgLr2@X6aep#GOKAn0?yLB`-c+Oe}u6nP@FSU-cfTn*4I_x?b+Qc)09^%H>Eso0{|`t^qjQ>V-4N=9Kby z>3ltsz1gP1nZ%jL^<;5fLZD#n$yc;xl@I>JWpTS@p?#no&bUS0OgH54yY4~L;)G+` zbJ609rfcWRY93R9fD2WtmfwX-iUsVsc>}(o=bQ~2ERT$Zl}Bk%J>OU%bHwX4krKKO z>sP``O>Dk8XtI{CH>6L4UC{)FS<2sN;W9SX1K<6r*L!c_9ih# zhVUc=@!-5d6`&{zF9__+PDhFho17KQA--W2yt+JaK6eY<8u_%eNfF(bg79#2v{dGO z2~$7BOd^`EDk`=C43|FHqjXZ^Qex$@1gURL>jsCQGE_jkxhwuG-8@G;zm5ePLdvaH z&+Wau91B=7J@zB$%l1%nH>Rz-TAp=9l5Tz&7N--o8koqUvY5yUW3U(=z)xVV<2x^) z3Fd~DA1q|FC+Z0L|CQP7rR#WL$Dv2+8(u+5o}e$cWz==*?DQ%oB595OE7&eG~mmgM6( z*DcqqtG2M8RGr@If1eB%a2SgZ)}wQ=i`#hQ`5IuT z($hIDettdnQ5#oNV5(M$d%x6tuQoQf+r(ceuB$eV?<62 zu5PvWYA-rn)Rf&%$$s|XG&iNwc`Y1XPFQV7)SLoMdr4xNpoL^DEA4$&XK!pKkSYUZ zcd1DB>pgKD=a1-taNtAZAFx0}7N{UWYrN|_{SdS|srlF;Ym1b2b<11Orzf%Mzw8Ii z1kP|Gr5t#SX6^Hbc(ycKv7wn?>MM)-VQeItY53OEbs=1On)z*xr9C#EvS@J%_9kn~ zvsNFpYI(Xex?B#pLC7fsAW0Qg@zlQ?c+Yru4yb}3K}=faT%yrUEJnEeB(TzW8}cT} zs6si*Je8;tQaW?zuu{(G)MJg1T|k?*o%Ai6h)Zd?4Y>&TEZWx5MM|Mwqm&-vZDMA z1C=nW0oPaoTju-&e}LkXL}o~h&AY^F%6K*{1YwYUH2Kq};5%=OHJCgk#oeat+fQCp zd_Tl|P7n!xstkTXJ#$kO zvuIW<%02KXzkXfn>CtuO8E>=d@qJm}biC?WKPLD;wKnYMA*3}xYek{{v21GsNKdY; zZ(wEod)c-#al>Yn5%t?8#W`O7dde#zh-i@Hd3a-nj@2!2K_A_^eB)knIHb&jg@iCY&ifj%U#Vwj8_P^H|U(gwOrTwkdwFLx!xF z0GWOdsY)Qb6)u!9GshU@fGqpg>oN$Yn6Cb1j>)EY$7>rCw0Y5 zzt)g;ooOLRXGesSL4wC}n26*fjl%FW3r=ghtPM2h5JgTQE(v8r+B75fc-0DTMC*Em z`@eh&8ukmoyZ|1X-wKKZNS^}8nIi9CYv;&dXzTEoZUPc-|G%6mfaf|ge&To5_`u7c z?tqz%WTUx8%r(E}y?KE=D!48v^Mp{%&*B!Do!-V2_Q>D!MmEykmNm-KFO)N^`rOT( zqRhU?gQVjS-L-$oiO_fsL?%c@uVllvXoQFJHZ`J*Rn%x(pv|slU<~-GpxIwzxa;BKGCSe6Sb}` z2Fv^&sjs+s_UsS;J!6H$K(B{W?TH+}lh)pku$ZMml&#p~=K$9KJ5PfUcrl+RK;+$S&uTI3zZgm-3D zgl~HaRmkH##?|6tPW_zql}Jj^`07>en*GQ*zwAkZ{HvqW++?%}e>qg>Jf5-XB2Eo7 z297rroh0WI4z!z#ps0^}76^{yvJ)|68l_;jIz2`&IgqxSZ6j(}|9*=mIEGF__>0_- zC^-;2AIP3T#4om^#xbE{x^=URqUi}?(N%x5fGeFnF^#R|K2_)d9O!Qx{UV_EpL&Py zbk%nZ4Mn{eu4k4mm`$&ne&J*;do7l&c@RnT@3^(4V`oR|Nl{WeFj`;&w-)yxOLu>B zv5q)-8Q&C)zA|^q_UcYox%D==kBYm#-njZZv=11B4q#$}13?0A1QAeHQ@lkaKxL5t zNu~g{=N}&}VZdMx$iV(p*&RUTqVrpa<)!{D06z}9^>ku{V!L`Khs?O3IBI?tiQoPKu=izf&c&H%KB5%pLvJ=mURpuFZ=64 z{*{I3PyCPx!xwo`1qC{Qd#|&p;$E1qOJ=eh*TJK;VG53+=$)TmK*U-`}MG literal 0 HcmV?d00001 From 4dcbe740ddaee322af7a8e2b79e13a0e09698707 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Wed, 17 Dec 2025 10:47:40 +1100 Subject: [PATCH 3/5] . --- docs/diff-tool.md | 2 +- src/DiffEngine.Tests/DefinitionsTest.cs | 2 +- src/DiffEngine.Tests/DiffToolsTest.cs | 2 +- src/DiffEngine.Tests/defaultOrder.include.md | 44 ++++++++++---------- src/DiffEngine.Tests/diffToolList.include.md | 44 ++++++++++---------- src/DiffEngine.Tests/diffTools.include.md | 2 +- src/DiffEngine/Definition.cs | 1 + src/DiffEngine/DiffRunner.cs | 3 +- src/DiffEngine/DiffTools_Add.cs | 22 ++++++---- src/DiffEngine/Implementation/MsWordDiff.cs | 5 ++- src/DiffEngine/ResolvedTool.cs | 9 ++-- 11 files changed, 73 insertions(+), 63 deletions(-) diff --git a/docs/diff-tool.md b/docs/diff-tool.md index b77d1a77..627dbbb0 100644 --- a/docs/diff-tool.md +++ b/docs/diff-tool.md @@ -482,7 +482,7 @@ DiffTools.UseOrder(DiffTool.KDiff3); * Is MDI: False * Supports auto-refresh: False * Supports text files: False - * Use shell execute: True + * Use shell execute: False * Environment variable for custom install location: `DiffEngine_MsWordDiff` * Supported binaries: .doc, .docx diff --git a/src/DiffEngine.Tests/DefinitionsTest.cs b/src/DiffEngine.Tests/DefinitionsTest.cs index 17299cd0..54795f74 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) diff --git a/src/DiffEngine.Tests/DiffToolsTest.cs b/src/DiffEngine.Tests/DiffToolsTest.cs index 4a52abd2..da3589f4 100644 --- a/src/DiffEngine.Tests/DiffToolsTest.cs +++ b/src/DiffEngine.Tests/DiffToolsTest.cs @@ -110,13 +110,13 @@ static async Task AddToolAndLaunch() #endregion } + /** [Fact] public Task LaunchSpecificDocxDiff() => DiffRunner.LaunchAsync(DiffTool.MsWordDiff, Path.Combine(SourceDirectory, "input.temp.docx"), Path.Combine(SourceDirectory, "input.target.docx")); - /** [Fact] public Task LaunchSpecificBinaryDiff() => diff --git a/src/DiffEngine.Tests/defaultOrder.include.md b/src/DiffEngine.Tests/defaultOrder.include.md index d94ea253..aa79ab74 100644 --- a/src/DiffEngine.Tests/defaultOrder.include.md +++ b/src/DiffEngine.Tests/defaultOrder.include.md @@ -1,24 +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) - * **[MsWordDiff](/docs/diff-tool.md#msworddiff)** Win (Cost: Free) + * **[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 d94ea253..aa79ab74 100644 --- a/src/DiffEngine.Tests/diffToolList.include.md +++ b/src/DiffEngine.Tests/diffToolList.include.md @@ -1,24 +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) - * **[MsWordDiff](/docs/diff-tool.md#msworddiff)** Win (Cost: Free) + * **[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 b345e738..952f6021 100644 --- a/src/DiffEngine.Tests/diffTools.include.md +++ b/src/DiffEngine.Tests/diffTools.include.md @@ -347,7 +347,7 @@ DiffTools.UseOrder(DiffTool.KDiff3); * Is MDI: False * Supports auto-refresh: False * Supports text files: False - * Use shell execute: True + * Use shell execute: False * Environment variable for custom install location: `DiffEngine_MsWordDiff` * Supported binaries: .doc, .docx 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/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/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 index aa8aee4c..58951630 100644 --- a/src/DiffEngine/Implementation/MsWordDiff.cs +++ b/src/DiffEngine/Implementation/MsWordDiff.cs @@ -12,19 +12,20 @@ public static Definition MsWordDiff() AutoRefresh: false, IsMdi: false, SupportsText: false, - UseShellExecute: true, RequiresTarget: true, - Cost: "Free", 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 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 From 5b0fb0ff5a0ae5d7065f4f597c1ce0351dfb0660 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Tue, 16 Dec 2025 23:48:25 +0000 Subject: [PATCH 4/5] Docs changes --- docs/diff-tool.order.md | 44 ++++++++++++++++++++--------------------- readme.md | 44 ++++++++++++++++++++--------------------- 2 files changed, 44 insertions(+), 44 deletions(-) diff --git a/docs/diff-tool.order.md b/docs/diff-tool.order.md index 667a31f9..28dd9283 100644 --- a/docs/diff-tool.order.md +++ b/docs/diff-tool.order.md @@ -10,30 +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) - * **[MsWordDiff](/docs/diff-tool.md#msworddiff)** Win (Cost: Free) + * **[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 diff --git a/readme.md b/readme.md index 49d0a36d..0d4f1b8c 100644 --- a/readme.md +++ b/readme.md @@ -63,30 +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) - * **[MsWordDiff](/docs/diff-tool.md#msworddiff)** Win (Cost: Free) + * **[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 From f016f229a9a8caa7aec99f85d514effb794b3587 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Wed, 17 Dec 2025 13:03:20 +1100 Subject: [PATCH 5/5] . --- docs/diff-tool.md | 24 +++++++++++++++++++++++ src/DiffEngine.Tests/DefinitionsTest.cs | 1 + src/DiffEngine.Tests/diffTools.include.md | 24 +++++++++++++++++++++++ src/Directory.Build.props | 2 +- 4 files changed, 50 insertions(+), 1 deletion(-) diff --git a/docs/diff-tool.md b/docs/diff-tool.md index 627dbbb0..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 @@ -483,6 +490,7 @@ DiffTools.UseOrder(DiffTool.KDiff3); * 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 @@ -521,6 +529,7 @@ DiffTools.UseOrder(DiffTool.MsWordDiff); * 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 @@ -583,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 @@ -668,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 @@ -736,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 @@ -768,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 @@ -802,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 @@ -836,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 @@ -870,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 @@ -904,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 @@ -960,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 @@ -1007,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 @@ -1062,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 @@ -1127,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 @@ -1193,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 @@ -1258,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 @@ -1301,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/src/DiffEngine.Tests/DefinitionsTest.cs b/src/DiffEngine.Tests/DefinitionsTest.cs index 54795f74..2eb9a7d0 100644 --- a/src/DiffEngine.Tests/DefinitionsTest.cs +++ b/src/DiffEngine.Tests/DefinitionsTest.cs @@ -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/diffTools.include.md b/src/DiffEngine.Tests/diffTools.include.md index 952f6021..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 @@ -348,6 +355,7 @@ DiffTools.UseOrder(DiffTool.KDiff3); * 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 @@ -386,6 +394,7 @@ DiffTools.UseOrder(DiffTool.MsWordDiff); * 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 @@ -448,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 @@ -533,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 @@ -601,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 @@ -633,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 @@ -667,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 @@ -701,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 @@ -735,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 @@ -769,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 @@ -825,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 @@ -872,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 @@ -927,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 @@ -992,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 @@ -1058,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 @@ -1123,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 @@ -1166,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/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.