From b79dc2257c8431a6fb7b4a60190689ef94b75e84 Mon Sep 17 00:00:00 2001 From: Odin Dutton Date: Fri, 7 Jun 2019 10:31:22 +1000 Subject: [PATCH] Handle Ctrl-C gracefully --- Cargo.lock | 24 ++++++++++++++++++++++++ Cargo.toml | 1 + src/cli.rs | 21 +++++++++++++++++---- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 542948434f..4a0b418e90 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -412,6 +412,15 @@ dependencies = [ "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ctrlc" +version = "3.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "nix 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "curl-sys" version = "0.4.18" @@ -1190,6 +1199,18 @@ dependencies = [ "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "nix" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "nodrop" version = "0.1.13" @@ -1219,6 +1240,7 @@ dependencies = [ "chrono-tz 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", "conch-parser 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ctrlc 3.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "cursive 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "derive-new 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "dirs 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2399,6 +2421,7 @@ dependencies = [ "checksum csv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9044e25afb0924b5a5fc5511689b0918629e85d68ea591e5e87fbf1e85ea1b3b" "checksum csv-core 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa5cdef62f37e6ffe7d1f07a381bc0db32b7a3ff1cac0de56cb0d81e71f53d65" "checksum ctor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3b4c17619643c1252b5f690084b82639dd7fac141c57c8e77a00e0148132092c" +"checksum ctrlc 3.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c7dfd2d8b4c82121dfdff120f818e09fc4380b0b7e17a742081a89b94853e87f" "checksum curl-sys 0.4.18 (registry+https://github.com/rust-lang/crates.io-index)" = "9d91a0052d5b982887d8e829bee0faffc7218ea3c6ebd3d6c2c8f678a93c9a42" "checksum cursive 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b7ecc7282b5361471b607c26f44148205607e26d48a2fc65bd16e7619b1ebb78" "checksum darling 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9158d690bc62a3a57c3e45b85e4d50de2008b39345592c64efd79345c7e24be0" @@ -2487,6 +2510,7 @@ dependencies = [ "checksum miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b7fe927a42e3807ef71defb191dc87d4e24479b221e67015fe38ae2b7b447bab" "checksum ncurses 5.99.0 (registry+https://github.com/rust-lang/crates.io-index)" = "15699bee2f37e9f8828c7b35b2bc70d13846db453f2d507713b758fabe536b82" "checksum nix 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "46f0f3210768d796e8fa79ec70ee6af172dacbe7147f5e69be5240a47778302b" +"checksum nix 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0d10caafde29a846a82ae0af70414e4643e072993441033b2c93217957e2f867" "checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" "checksum nom 5.0.0-beta1 (registry+https://github.com/rust-lang/crates.io-index)" = "6527f311b2baba609e980e008460ab5ebff6d6da15213bb8eb193b7746eefa24" "checksum num 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cf4825417e1e1406b3782a8ce92f4d53f26ec055e3622e1881ca8e9f5f9e08db" diff --git a/Cargo.toml b/Cargo.toml index ccbd9b0992..11709f09d0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -55,6 +55,7 @@ adhoc_derive = "0.1.2" lazy_static = "1.3.0" git2 = "0.8.0" dirs = "2.0.1" +ctrlc = "3.1.3" [dependencies.pancurses] version = "0.16" diff --git a/src/cli.rs b/src/cli.rs index ec490b7b8f..528fd92e0f 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -20,6 +20,7 @@ use rustyline::{self, ColorMode, Config, Editor}; use std::collections::VecDeque; use std::error::Error; use std::iter::Iterator; +use std::sync::atomic::{AtomicBool, Ordering}; #[derive(Debug)] pub enum MaybeOwned<'a, T> { @@ -82,7 +83,22 @@ pub async fn cli() -> Result<(), Box> { rl.set_helper(Some(h)); let _ = rl.load_history("history.txt"); + let ctrl_c = Arc::new(AtomicBool::new(false)); + let cc = ctrl_c.clone(); + ctrlc::set_handler(move || { + cc.store(true, Ordering::SeqCst); + }) + .expect("Error setting Ctrl-C handler"); + loop { + if ctrl_c.load(Ordering::SeqCst) { + ctrl_c.store(false, Ordering::SeqCst); + if let ShellError::String(s) = ShellError::string("CTRL-C") { + context.host.lock().unwrap().stdout(&format!("{:?}", s)); + } + continue; + } + let readline = rl.readline(&format!( "{}{}> ", context.env.lock().unwrap().cwd().display().to_string(), @@ -286,10 +302,7 @@ async fn process_line(readline: Result, ctx: &mut Context LineResult::Success(line.to_string()) } - Err(ReadlineError::Interrupted) => { - println!("CTRL-C"); - LineResult::Break - } + Err(ReadlineError::Interrupted) => LineResult::Error(ShellError::string("CTRL-C")), Err(ReadlineError::Eof) => { println!("CTRL-D"); LineResult::Break