···11use std::process::Command;
22use std::process::Stdio;
3344+use testutils::ensure_running_outside_ci;
55+46fn taplo_check_config(file: &str) {
57 if Command::new("taplo")
68 .arg("--version")
···810 .status()
911 .is_err()
1012 {
1313+ ensure_running_outside_ci("`taplo` must be in the PATH");
1114 eprintln!("Skipping test because taplo is not installed on the system");
1215 return;
1316 }
+2
lib/tests/test_gpg.rs
···1212use jj_lib::signing::SigStatus;
1313use jj_lib::signing::SignError;
1414use jj_lib::signing::SigningBackend as _;
1515+use testutils::ensure_running_outside_ci;
15161617static PRIVATE_KEY: &str = r#"-----BEGIN PGP PRIVATE KEY BLOCK-----
1718···8182macro_rules! gpg_guard {
8283 () => {
8384 if Command::new("gpg").arg("--version").status().is_err() {
8585+ ensure_running_outside_ci("`gpg` must be in the PATH");
8486 eprintln!("Skipping test because gpg is not installed on the system");
8587 return;
8688 }
+10
lib/testutils/src/lib.rs
···135135 UserSettings::from_config(base_user_config()).unwrap()
136136}
137137138138+/// Panic if `CI` environment variable is set to a non-empty value
139139+///
140140+/// Most CI environments set this variable automatically. See e.g.
141141+/// <https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/store-information-in-variables#default-environment-variables>
142142+#[track_caller]
143143+pub fn ensure_running_outside_ci(reason: &str) {
144144+ let running_in_ci = std::env::var("CI").is_ok_and(|value| !value.is_empty());
145145+ assert!(!running_in_ci, "Running in CI, {reason}.");
146146+}
147147+138148#[derive(Debug)]
139149pub struct TestEnvironment {
140150 temp_dir: TempDir,