diff --git a/src/Composer/Command/CreateProjectCommand.php b/src/Composer/Command/CreateProjectCommand.php index 4b4bd0eec..9642ef466 100644 --- a/src/Composer/Command/CreateProjectCommand.php +++ b/src/Composer/Command/CreateProjectCommand.php @@ -367,6 +367,17 @@ EOT }); } } + // handler Ctrl+C for Windows on PHP 7.4+ + if (function_exists('sapi_windows_set_ctrl_handler')) { + @mkdir($directory, 0777, true); + if ($realDir = realpath($directory)) { + sapi_windows_set_ctrl_handler(function () use ($realDir) { + $fs = new Filesystem(); + $fs->removeDirectory($realDir); + exit(130); + }); + } + } // avoid displaying 9999999-dev as version if dev-master was selected if ($package instanceof AliasPackage && $package->getPrettyVersion() === VersionParser::DEV_MASTER_ALIAS) { diff --git a/src/Composer/Installer/InstallationManager.php b/src/Composer/Installer/InstallationManager.php index a8266bfe7..4939414e7 100644 --- a/src/Composer/Installer/InstallationManager.php +++ b/src/Composer/Installer/InstallationManager.php @@ -195,10 +195,11 @@ class InstallationManager } }; - // handler Ctrl+C for unix-like systems - $handleInterrupts = function_exists('pcntl_async_signals') && function_exists('pcntl_signal'); + $handleInterruptsUnix = function_exists('pcntl_async_signals') && function_exists('pcntl_signal'); + $handleInterruptsWindows = function_exists('sapi_windows_set_ctrl_handler'); $prevHandler = null; - if ($handleInterrupts) { + $windowsHandler = null; + if ($handleInterruptsUnix) { pcntl_async_signals(true); $prevHandler = pcntl_signal_get_handler(SIGINT); pcntl_signal(SIGINT, function ($sig) use ($runCleanup, $prevHandler) { @@ -211,6 +212,14 @@ class InstallationManager exit(130); }); } + if ($handleInterruptsWindows) { + $windowsHandler = function () use ($runCleanup) { + $runCleanup(); + + exit(130); + }; + sapi_windows_set_ctrl_handler($windowsHandler); + } try { foreach ($operations as $index => $operation) { @@ -317,16 +326,22 @@ class InstallationManager } catch (\Exception $e) { $runCleanup(); - if ($handleInterrupts) { + if ($handleInterruptsUnix) { pcntl_signal(SIGINT, $prevHandler); } + if ($handleInterruptsWindows) { + sapi_windows_set_ctrl_handler($prevHandler, false); + } throw $e; } - if ($handleInterrupts) { + if ($handleInterruptsUnix) { pcntl_signal(SIGINT, $prevHandler); } + if ($handleInterruptsWindows) { + sapi_windows_set_ctrl_handler($prevHandler, false); + } // do a last write so that we write the repository even if nothing changed // as that can trigger an update of some files like InstalledVersions.php if