Skip to content

Commit b54ab6a

Browse files
committed
Kill WinMerge before cleaning to release file locks
1 parent a4bc5e7 commit b54ab6a

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

src/PostSharp.Engineering.BuildTools/Build/CleanCommand.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ protected override bool ExecuteCore( BuildContext context, BuildSettings setting
1818

1919
public static bool Execute( BuildContext context, BuildSettings settings )
2020
{
21+
// Kill WinMerge to release any file locks it may hold.
22+
ProcessKiller.KillWinMerge( context.Console );
23+
2124
var product = context.Product;
2225

2326
void DeleteDirectory( string directory )

src/PostSharp.Engineering.BuildTools/Utilities/ProcessKiller.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,30 @@ namespace PostSharp.Engineering.BuildTools.Utilities;
1010

1111
public static class ProcessKiller
1212
{
13+
public static void KillWinMerge( ConsoleHelper console )
14+
{
15+
var currentSessionId = Process.GetCurrentProcess().SessionId;
16+
17+
var processesToKill = Process.GetProcesses()
18+
.Where( p => p.SessionId == currentSessionId )
19+
.Where( p => p.ProcessName.StartsWith( "WinMerge", StringComparison.OrdinalIgnoreCase ) )
20+
.ToList();
21+
22+
foreach ( var process in processesToKill )
23+
{
24+
console.WriteMessage( $"Killing process {process.Id} ({process.ProcessName})" );
25+
26+
try
27+
{
28+
process.Kill( true );
29+
}
30+
catch ( Exception e )
31+
{
32+
console.WriteWarning( $"Cannot kill {process.Id} ({process.ProcessName}): {e.Message}" );
33+
}
34+
}
35+
}
36+
1337
public static bool KillWellKnownProcesses( ConsoleHelper console, bool dry = false )
1438
{
1539
var currentSessionId = Process.GetCurrentProcess().SessionId;

0 commit comments

Comments
 (0)