# Adds version control information to the variable VERS. For # determining the Version Control System used (if any) it inspects the # existence of certain subdirectories under SOURCE_DIR (if provided as an # extra argument, otherwise uses CMAKE_CURRENT_SOURCE_DIR). function(get_source_info path revision repository) find_package(Git QUIET) if(GIT_FOUND) execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --git-dir WORKING_DIRECTORY ${path} RESULT_VARIABLE git_result OUTPUT_VARIABLE git_output ERROR_QUIET) if(git_result EQUAL 0) string(STRIP "${git_output}" git_output) get_filename_component(git_dir ${git_output} ABSOLUTE BASE_DIR ${path}) execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse HEAD WORKING_DIRECTORY ${path} RESULT_VARIABLE git_result OUTPUT_VARIABLE git_output) if(git_result EQUAL 0) string(STRIP "${git_output}" git_output) set(${revision} ${git_output} PARENT_SCOPE) endif() execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref --symbolic-full-name @{upstream} WORKING_DIRECTORY ${path} RESULT_VARIABLE git_result OUTPUT_VARIABLE git_output ERROR_QUIET) if(git_result EQUAL 0) string(REPLACE "/" ";" branch ${git_output}) list(GET branch 0 remote) else() set(remote "origin") endif() execute_process(COMMAND ${GIT_EXECUTABLE} remote get-url ${remote} WORKING_DIRECTORY ${path} RESULT_VARIABLE git_result OUTPUT_VARIABLE git_output ERROR_QUIET) if(git_result EQUAL 0) # Passwords or tokens should not be stored in the remote URL at the # risk of being leaked. In case we find one, error out and teach the # user the best practices. string(REGEX MATCH "https?://[^/]*:[^/]*@.*" http_password "${git_output}") if(http_password) message(SEND_ERROR "The git remote repository URL has an embedded \ password. Remove the password from the URL or use \ `-DLLVM_FORCE_VC_REPOSITORY=` in order to avoid \ leaking your password (see https://git-scm.com/docs/gitcredentials for \ alternatives).") endif() # GitHub token formats are described at: # https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/about-authentication-to-github#githubs-token-formats string(REGEX MATCH "https?://(gh[pousr]|github_pat)_[^/]+@github.com.*" github_token "${git_output}") if(github_token) message(SEND_ERROR "The git remote repository URL has an embedded \ GitHub Token. Remove the token from the URL or use \ `-DLLVM_FORCE_VC_REPOSITORY=` in order to avoid leaking \ your token (see https://git-scm.com/docs/gitcredentials for alternatives).") endif() string(STRIP "${git_output}" git_output) set(${repository} ${git_output} PARENT_SCOPE) else() set(${repository} ${path} PARENT_SCOPE) endif() endif() else() message(WARNING "Git not found. Version cannot be determined.") endif() endfunction()