# Note: this cmake script runs at build time (not at configure time).
# 
# The git version could have changed without CMake noticing,
# so it runs at every build

function(get_git_version_tag)
  execute_process(COMMAND git describe --tags --match "v?.*"
                  WORKING_DIRECTORY ${WORKING_DIR}
                  RESULT_VARIABLE git_exit_code
                  OUTPUT_VARIABLE version_from_git
                  ERROR_VARIABLE error_version_from_git)

  if(${git_exit_code})
    message("stderr from git: " ${error_version_from_git})
    message(FATAL_ERROR "git version check exited with code: " ${git_exit_code})
  else(${git_exit_code})
    string(STRIP ${version_from_git} version_from_git)
    set(version_from_git ${version_from_git} PARENT_SCOPE)
  endif(${git_exit_code})
endfunction(get_git_version_tag)

function(get_git_branch)
  execute_process(COMMAND git rev-parse --abbrev-ref HEAD
                  WORKING_DIRECTORY ${WORKING_DIR}
                  RESULT_VARIABLE git_exit_code
                  OUTPUT_VARIABLE git_branch
                  ERROR_VARIABLE error_version_from_git)

  if(${git_exit_code})
    message("stderr from git: " ${error_version_from_git})
    message(FATAL_ERROR "git branch get exited with code: " ${git_exit_code})
  else(${git_exit_code})
    string(STRIP ${git_branch} git_branch)
    set(git_branch ${git_branch} PARENT_SCOPE)
  endif(${git_exit_code})
endfunction(get_git_branch)

function(parse_lib_version)
  string(REGEX REPLACE
         "v([0-9]+)\\.([0-9]+)\\.([0-9]+).*"
         "\\1;\\2;\\3" version_list ${version_from_git})
  list(LENGTH version_list version_list_length)

  if(NOT ${version_list_length} EQUAL 3)
    message(FATAL_ERROR "Could not parse git tag into lib version")
  endif(NOT ${version_list_length} EQUAL 3)

  list(GET version_list 0 LIB_MAJOR)
  list(GET version_list 1 LIB_MINOR)
  list(GET version_list 2 LIB_REVISION)

  set(LIB_MAJOR ${LIB_MAJOR} PARENT_SCOPE)
  set(LIB_MINOR ${LIB_MINOR} PARENT_SCOPE)
  set(LIB_REVISION ${LIB_REVISION} PARENT_SCOPE)

endfunction(parse_lib_version)

get_git_version_tag()

get_git_branch()

parse_lib_version()
# message("lib version: v" ${LIB_MAJOR} "." ${LIB_MINOR} "." ${LIB_REVISION})

message("lib " ${version_from_git} " @ " ${git_branch})

# TODO doc/Doxyfile-library stuff

file(READ ${VERSION_TEMPLATE} version_file)

# CMake regex engine doesn't seem to understand ^ and $
# let's match ///...///\n which works for the template file
string(REGEX REPLACE
       "///.*///\r?\n"
       "" version_file ${version_file})

string(REPLACE "@@lib_version@@"
       ${version_from_git} version_file
       ${version_file})

string(REPLACE "@@lib_major@@"
       ${LIB_MAJOR} version_file
       ${version_file})

string(REPLACE "@@lib_minor@@"
       ${LIB_MINOR} version_file
       ${version_file})

string(REPLACE "@@lib_revision@@"
       ${LIB_REVISION} version_file
       ${version_file})

string(REPLACE "@@branch@@"
       ${git_branch} version_file
       ${version_file})

if(EXISTS ${VERSION_HEADER})
  file(READ ${VERSION_HEADER} old_version_file)
  string(COMPARE EQUAL ${version_file} ${old_version_file} version_file_unchanged)
else()
  set(version_file_unchanged NO)
endif(EXISTS ${VERSION_HEADER})

if(NOT version_file_unchanged)
  message("Writing version.hpp")
  file(WRITE ${VERSION_HEADER} ${version_file})
endif(NOT version_file_unchanged)