use crate::api::{opt_var, var, CiEnvironment, CiProvider};
pub fn create_environment() -> CiEnvironment {
let event_type = var("CI_MERGE_REQUEST_EVENT_TYPE");
let detached =
event_type == "detached" || event_type == "merged_result" || event_type == "merge_train";
CiEnvironment {
base_branch: opt_var("CI_MERGE_REQUEST_TARGET_BRANCH_NAME")
.or_else(|| opt_var("CI_EXTERNAL_PULL_REQUEST_TARGET_BRANCH_NAME")),
base_revision: opt_var("CI_MERGE_REQUEST_DIFF_BASE_SHA")
.or_else(|| opt_var("CI_MERGE_REQUEST_TARGET_BRANCH_SHA"))
.or_else(|| opt_var("CI_EXTERNAL_PULL_REQUEST_TARGET_BRANCH_SHA")),
branch: opt_var("CI_MERGE_REQUEST_SOURCE_BRANCH_NAME")
.or_else(|| opt_var("CI_EXTERNAL_PULL_REQUEST_SOURCE_BRANCH_NAME"))
.or_else(|| opt_var("CI_COMMIT_BRANCH"))
.unwrap_or_default(),
env_prefix: Some("CI_".into()),
head_revision: if detached {
opt_var("CI_COMMIT_SHA")
} else {
opt_var("CI_MERGE_REQUEST_SOURCE_BRANCH_SHA")
.or_else(|| opt_var("CI_EXTERNAL_PULL_REQUEST_SOURCE_BRANCH_SHA"))
},
id: var("CI_PIPELINE_ID"),
provider: CiProvider::Gitlab,
request_id: opt_var("CI_MERGE_REQUEST_IID")
.or_else(|| opt_var("CI_EXTERNAL_PULL_REQUEST_IID")),
request_url: None,
revision: var("CI_COMMIT_SHA"),
url: opt_var("CI_PIPELINE_URL"),
}
}