diff --git a/build.rs b/build.rs index f906720..f325885 100644 --- a/build.rs +++ b/build.rs @@ -7,4 +7,5 @@ fn main() { .unwrap_or_default(); println!("cargo:rustc-env=GIT_HASH={}", hash.trim()); println!("cargo:rerun-if-changed=.git/HEAD"); + println!("cargo:rerun-if-changed=.git/refs/heads"); } diff --git a/src/cli/mod.rs b/src/cli/mod.rs index 6b0b930..857e89f 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -76,7 +76,9 @@ impl Cli { let args: Vec = std::env::args().collect(); args.iter() .any(|a| a == "--robot" || a == "-J" || a == "--json") - || std::env::var("LORE_ROBOT").is_ok() + || std::env::var("LORE_ROBOT") + .ok() + .is_some_and(|v| !v.is_empty() && v != "0" && v != "false") || !std::io::stdout().is_terminal() } } diff --git a/src/core/error.rs b/src/core/error.rs index 7feb524..54cbbe8 100644 --- a/src/core/error.rs +++ b/src/core/error.rs @@ -53,7 +53,7 @@ impl ErrorCode { pub fn exit_code(&self) -> i32 { match self { Self::InternalError => 1, - Self::ConfigNotFound => 2, + Self::ConfigNotFound => 20, Self::ConfigInvalid => 3, Self::TokenNotSet => 4, Self::GitLabAuthFailed => 5, diff --git a/src/core/shutdown.rs b/src/core/shutdown.rs index 2adc77b..a0f9a49 100644 --- a/src/core/shutdown.rs +++ b/src/core/shutdown.rs @@ -19,11 +19,11 @@ impl ShutdownSignal { } pub fn cancel(&self) { - self.cancelled.store(true, Ordering::Relaxed); + self.cancelled.store(true, Ordering::Release); } pub fn is_cancelled(&self) -> bool { - self.cancelled.load(Ordering::Relaxed) + self.cancelled.load(Ordering::Acquire) } } diff --git a/src/main.rs b/src/main.rs index 57608da..cd51e81 100644 --- a/src/main.rs +++ b/src/main.rs @@ -134,7 +134,9 @@ async fn main() { "never" => console::set_colors_enabled(false), "always" => console::set_colors_enabled(true), "auto" => {} - _ => unreachable!(), + other => { + eprintln!("Warning: unknown color mode '{}', using auto", other); + } } let quiet = cli.quiet; @@ -664,7 +666,10 @@ async fn handle_ingest( let signal_for_handler = signal.clone(); tokio::spawn(async move { let _ = tokio::signal::ctrl_c().await; + eprintln!("\nInterrupted, finishing current batch... (Ctrl+C again to force quit)"); signal_for_handler.cancel(); + let _ = tokio::signal::ctrl_c().await; + std::process::exit(130); }); let ingest_result: std::result::Result<(), Box> = async { @@ -1264,7 +1269,9 @@ fn handle_completions(shell: &str) -> Result<(), Box> { "zsh" => Shell::Zsh, "fish" => Shell::Fish, "powershell" => Shell::PowerShell, - _ => unreachable!(), + other => { + return Err(format!("Unsupported shell: {other}").into()); + } }; let mut cmd = Cli::command(); @@ -1522,7 +1529,10 @@ async fn handle_embed( let signal_for_handler = signal.clone(); tokio::spawn(async move { let _ = tokio::signal::ctrl_c().await; + eprintln!("\nInterrupted, finishing current batch... (Ctrl+C again to force quit)"); signal_for_handler.cancel(); + let _ = tokio::signal::ctrl_c().await; + std::process::exit(130); }); let result = run_embed(&config, full, retry_failed, None, &signal).await?; @@ -1573,7 +1583,10 @@ async fn handle_sync_cmd( let signal_for_handler = signal.clone(); tokio::spawn(async move { let _ = tokio::signal::ctrl_c().await; + eprintln!("\nInterrupted, finishing current batch... (Ctrl+C again to force quit)"); signal_for_handler.cancel(); + let _ = tokio::signal::ctrl_c().await; + std::process::exit(130); }); let start = std::time::Instant::now();