| # 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=<URL without password>` 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=<URL without token>` 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() |