if(__GITFUNCTIONS_CMAKE__)
    return()
endif()
set(__GITFUNCTIONS_CMAKE__ TRUE)

find_package(Git QUIET)

include(CMakeParseArguments)

if(GIT_FOUND)
    function(git_run)
    set(oneValueArgs OUTPUT_VAR DEFAULT)
    set(multiValueArgs COMMAND)
    cmake_parse_arguments(GIT_RUN "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})

    execute_process(COMMAND ${GIT_EXECUTABLE} ${GIT_RUN_COMMAND}
        WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
        RESULT_VARIABLE GIT_RESULTVAR
        OUTPUT_VARIABLE GIT_OUTVAR
        OUTPUT_STRIP_TRAILING_WHITESPACE
    )

    if(GIT_RESULTVAR EQUAL 0)
        set(${GIT_RUN_OUTPUT_VAR} "${GIT_OUTVAR}" PARENT_SCOPE)
    else()
        set(${GIT_RUN_OUTPUT_VAR} ${GIT_RUN_DEFAULT})
        message(STATUS "Failed to run Git: ${GIT_OUTVAR}")
    endif()
    endfunction()
else()
    function(git_run)
    set(oneValueArgs OUTPUT_VAR DEFAULT)
    set(multiValueArgs COMMAND)
    cmake_parse_arguments(GIT_RUN "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
    set(${GIT_RUN_OUTPUT_VAR} ${GIT_RUN_DEFAULT})
    endfunction(git_run)
endif()