Line data Source code
1 : /*! 2 : * \file esys/repo/cienv.cpp 3 : * \brief 4 : * 5 : * \cond 6 : * __legal_b__ 7 : * 8 : * Copyright (c) 2026 Michel Gillet 9 : * Distributed under the MIT License. 10 : * (See accompanying file LICENSE.txt or 11 : * copy at https://opensource.org/licenses/MIT) 12 : * 13 : * __legal_e__ 14 : * \endcond 15 : * 16 : */ 17 : 18 : #include "esys/repo/esysrepo_prec.h" 19 : #include "esys/repo/cienv.h" 20 : 21 : #include <cstdlib> 22 : 23 : namespace esys::repo 24 : { 25 : 26 : namespace 27 : { 28 : 29 0 : const char *env_or_empty(const char *name) 30 : { 31 0 : const char *value = std::getenv(name); 32 0 : return value != nullptr ? value : ""; 33 : } 34 : 35 : } // namespace 36 : 37 0 : CIEngine CIEnv::get_engine() const 38 : { 39 0 : return m_engine; 40 : } 41 : 42 0 : const std::string &CIEnv::get_project() const 43 : { 44 0 : return m_project; 45 : } 46 : 47 0 : const std::string &CIEnv::get_url() const 48 : { 49 0 : return m_url; 50 : } 51 : 52 0 : const std::string &CIEnv::get_rev() const 53 : { 54 0 : return m_rev; 55 : } 56 : 57 0 : Result CIEnv::detect(CIEnv &out) 58 : { 59 0 : out = CIEnv(); 60 : 61 : // GitLab CI 62 0 : if (std::getenv("GITLAB_CI") != nullptr || std::getenv("CI_SERVER") != nullptr) 63 : { 64 0 : const std::string sha = env_or_empty("CI_COMMIT_SHA"); 65 0 : if (sha.empty()) return ESYSREPO_RESULT(ResultCode::CMDPIN_CI_NOT_DETECTED); 66 : 67 0 : out.m_engine = CIEngine::GITLAB; 68 0 : out.m_project = env_or_empty("CI_PROJECT_PATH"); 69 0 : out.m_url = env_or_empty("CI_REPOSITORY_URL"); 70 0 : if (out.m_url.empty()) out.m_url = env_or_empty("CI_PROJECT_URL"); 71 0 : out.m_rev = sha; 72 : 73 0 : if (out.m_project.empty() && out.m_url.empty()) 74 0 : return ESYSREPO_RESULT(ResultCode::CMDPIN_CI_NOT_DETECTED); 75 : 76 0 : return ESYSREPO_RESULT(ResultCode::OK); 77 0 : } 78 : 79 : // GitHub Actions 80 0 : if (std::getenv("GITHUB_ACTIONS") != nullptr) 81 : { 82 0 : const std::string sha = env_or_empty("GITHUB_SHA"); 83 0 : if (sha.empty()) return ESYSREPO_RESULT(ResultCode::CMDPIN_CI_NOT_DETECTED); 84 : 85 0 : out.m_engine = CIEngine::GITHUB; 86 0 : out.m_project = env_or_empty("GITHUB_REPOSITORY"); 87 0 : out.m_url = env_or_empty("GITHUB_SERVER_URL"); 88 0 : if (!out.m_url.empty() && !out.m_project.empty()) 89 0 : out.m_url += "/" + out.m_project + ".git"; 90 0 : out.m_rev = sha; 91 : 92 0 : if (out.m_project.empty() && out.m_url.empty()) 93 0 : return ESYSREPO_RESULT(ResultCode::CMDPIN_CI_NOT_DETECTED); 94 : 95 0 : return ESYSREPO_RESULT(ResultCode::OK); 96 0 : } 97 : 98 : // Present but unsupported CI markers 99 0 : if (std::getenv("CI") != nullptr) 100 0 : return ESYSREPO_RESULT(ResultCode::CMDPIN_CI_UNSUPPORTED); 101 : 102 0 : return ESYSREPO_RESULT(ResultCode::CMDPIN_CI_NOT_DETECTED); 103 : } 104 : 105 : } // namespace esys::repo