use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Once;
static INIT: Once = Once::new();
static IS_CI: AtomicBool = AtomicBool::new(false);
#[deprecated(since = "1.1.0", note = "Use `cached` or `uncached` instead")]
pub fn is_ci() -> bool {
uncached()
}
pub fn cached() -> bool {
INIT.call_once(|| IS_CI.store(uncached(), Ordering::Relaxed));
IS_CI.load(Ordering::Relaxed)
}
pub fn uncached() -> bool {
let ci_var = std::env::var("CI");
ci_var == Ok("true".into())
|| ci_var == Ok("1".into())
|| ci_var == Ok("woodpecker".into())
|| check("CI_NAME")
|| check("GITHUB_ACTION")
|| check("GITLAB_CI")
|| check("NETLIFY")
|| check("TRAVIS")
|| matches!(std::env::var("NODE"), Ok(node) if node.ends_with("//heroku/node/bin/node"))
|| check("CODEBUILD_SRC_DIR")
|| check("BUILDER_OUTPUT")
|| check("GITLAB_DEPLOYMENT")
|| check("NOW_GITHUB_DEPLOYMENT")
|| check("NOW_BUILDER")
|| check("BITBUCKET_DEPLOYMENT")
|| check("GERRIT_PROJECT")
|| check("SYSTEM_TEAMFOUNDATIONCOLLECTIONURI")
|| check("BITRISE_IO")
|| check("BUDDY_WORKSPACE_ID")
|| check("BUILDKITE")
|| check("CIRRUS_CI")
|| check("APPVEYOR")
|| check("CIRCLECI")
|| check("SEMAPHORE")
|| check("DRONE")
|| check("DSARI")
|| check("TDDIUM")
|| check("STRIDER")
|| check("TASKCLUSTER_ROOT_URL")
|| check("JENKINS_URL")
|| check("bamboo.buildKey")
|| check("GO_PIPELINE_NAME")
|| check("HUDSON_URL")
|| check("WERCKER")
|| check("MAGNUM")
|| check("NEVERCODE")
|| check("RENDER")
|| check("SAIL_CI")
|| check("SHIPPABLE")
}
fn check(name: &str) -> bool {
std::env::var(name).is_ok()
}