aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe-seld-signal
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-08-11 12:19:31 +0900
committernsfisis <nsfisis@gmail.com>2026-08-11 12:19:31 +0900
commit9539fea16e0d8d07faf7edf50d480e0a80c4ccfc (patch)
treec989aae95701e24aace29fec25c9d33c4c065e6b /crates/shirabe-seld-signal
parent144d059b725e2d178d7f4a6403cde9474fe65dcc (diff)
downloadphp-shirabe-9539fea16e0d8d07faf7edf50d480e0a80c4ccfc.tar.gz
php-shirabe-9539fea16e0d8d07faf7edf50d480e0a80c4ccfc.tar.zst
php-shirabe-9539fea16e0d8d07faf7edf50d480e0a80c4ccfc.zip
feat(signal): abort on SIGINT, SIGTERM and SIGHUP at checkpoints
The SignalHandler port was a no-op stub, so all four of Composer's abort paths were dead code: nothing removed a half-created project, reverted composer.json, or cleaned up half-installed packages. Composer runs those handlers from pcntl callbacks, which a Rust signal handler cannot do -- it may touch nothing beyond atomics. SignalSubscription records the signal instead, and the abort runs from checkpoints on the normal call stack, where the clean-up can borrow the state it needs. That also resolves the closure-capture TODO(phase-c)s in RequireCommand and InstallationManager, and replaces exit_with_last_signal's exit(0) with the restore-and-re-raise Seld\Signal does. A subscription is live only inside the four abort regions, so elsewhere the signals keep their default disposition and kill the process at once. It is installed without SA_RESTART so a signal interrupts an interactive prompt rather than resuming the read. A signal reaches only the innermost subscription, reproducing SignalHandler's single-stack dispatch. Drop SignalRegistry, SignalableCommandInterface and the Application wiring for them: nothing in Composer reaches that path, and SignalHandler discards whatever they register. Signal handling from plugins and scripts is undefined behavior; see docs/dev/signals.md. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe-seld-signal')
-rw-r--r--crates/shirabe-seld-signal/Cargo.toml11
-rw-r--r--crates/shirabe-seld-signal/LICENSE19
-rw-r--r--crates/shirabe-seld-signal/src/lib.rs3
-rw-r--r--crates/shirabe-seld-signal/src/signal_handler.rs25
4 files changed, 0 insertions, 58 deletions
diff --git a/crates/shirabe-seld-signal/Cargo.toml b/crates/shirabe-seld-signal/Cargo.toml
deleted file mode 100644
index 1dc7c3df..00000000
--- a/crates/shirabe-seld-signal/Cargo.toml
+++ /dev/null
@@ -1,11 +0,0 @@
-[package]
-name = "shirabe-seld-signal"
-version.workspace = true
-edition.workspace = true
-rust-version.workspace = true
-description = "A Rust port of seld/signal-handler"
-repository.workspace = true
-license.workspace = true
-
-[lints]
-workspace = true
diff --git a/crates/shirabe-seld-signal/LICENSE b/crates/shirabe-seld-signal/LICENSE
deleted file mode 100644
index c1b62a35..00000000
--- a/crates/shirabe-seld-signal/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2015 Jordi Boggiano
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is furnished
-to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/crates/shirabe-seld-signal/src/lib.rs b/crates/shirabe-seld-signal/src/lib.rs
deleted file mode 100644
index 16f51510..00000000
--- a/crates/shirabe-seld-signal/src/lib.rs
+++ /dev/null
@@ -1,3 +0,0 @@
-pub mod signal_handler;
-
-pub use signal_handler::*;
diff --git a/crates/shirabe-seld-signal/src/signal_handler.rs b/crates/shirabe-seld-signal/src/signal_handler.rs
deleted file mode 100644
index b2f1873e..00000000
--- a/crates/shirabe-seld-signal/src/signal_handler.rs
+++ /dev/null
@@ -1,25 +0,0 @@
-//! ref: composer/vendor/seld/signal-handler/src/SignalHandler.php
-
-#[derive(Debug)]
-pub struct SignalHandler;
-
-// TODO(phase-c): disable signal handler at all for now.
-impl SignalHandler {
- pub const SIGINT: &'static str = "SIGINT";
- pub const SIGTERM: &'static str = "SIGTERM";
- pub const SIGHUP: &'static str = "SIGHUP";
-
- pub fn create(_signals: Vec<String>, _callback: Box<dyn Fn(String, &SignalHandler)>) -> Self {
- Self
- }
-
- pub fn unregister(&self) {}
-
- pub fn exit_with_last_signal(&self) {
- std::process::exit(0);
- }
-
- pub fn is_triggered(&self) -> bool {
- false
- }
-}