#=========================================================================
#
#  Program:   ParaView
#
#  Copyright (c) Kitware, Inc.
#  All rights reserved.
#  See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details.
#
#     This software is distributed WITHOUT ANY WARRANTY; without even
#     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
#     PURPOSE.  See the above copyright notice for more information.
#
#=========================================================================

# Used to determine the version for ParaView source using "git describe", if git
# is found. On success sets following variables in caller's scope:
#   ${var_prefix}_VERSION
#   ${var_prefix}_VERSION_MAJOR
#   ${var_prefix}_VERSION_MINOR
#   ${var_prefix}_VERSION_PATCH
#   ${var_prefix}_VERSION_PATCH_EXTRA
#   ${var_prefix}_VERSION_FULL
#   ${var_prefix}_VERSION_IS_RELEASE is patch-extra is empty.
#
# If git is not found, or git describe cannot be run successfully, then these
# variables are left unchanged and status message is printed.
#
# Arguments are:
#   source_dir : Source directory
#   git_command : git executable
#   var_prefix : prefix for variables e.g. "PARAVIEW".
function(determine_version source_dir git_command var_prefix)
  set (major)
  set (minor)
  set (patch)
  set (full)
  set (patch_extra)
  set (result -1)

  if (NOT PARAVIEW_GIT_DESCRIBE)
    if (EXISTS ${git_command})
      execute_process(
        COMMAND ${git_command} describe
        WORKING_DIRECTORY ${source_dir}
        RESULT_VARIABLE result
        OUTPUT_VARIABLE output
        ERROR_QUIET
        OUTPUT_STRIP_TRAILING_WHITESPACE
        ERROR_STRIP_TRAILING_WHITESPACE)
    endif()
  else()
    set(result 0)
    set(output ${PARAVIEW_GIT_DESCRIBE})
  endif()

  if (${result} EQUAL 0)
    string(REGEX MATCH "([0-9]+)\\.([0-9]+)\\.([0-9]+)[-]*(.*)"
      version_matches ${output})
    if (CMAKE_MATCH_0)
      message(STATUS "Determined Source Version : ${CMAKE_MATCH_0}")
      set (full ${CMAKE_MATCH_0})
      set (major ${CMAKE_MATCH_1})
      set (minor ${CMAKE_MATCH_2})
      set (patch ${CMAKE_MATCH_3})
      set (patch_extra ${CMAKE_MATCH_4})
    endif()
  endif()

  if (full)
    set (${var_prefix}_VERSION "${major}.${minor}" PARENT_SCOPE)
    set (${var_prefix}_VERSION_MAJOR ${major} PARENT_SCOPE)
    set (${var_prefix}_VERSION_MINOR ${minor} PARENT_SCOPE)
    set (${var_prefix}_VERSION_PATCH ${patch} PARENT_SCOPE)
    set (${var_prefix}_VERSION_PATCH_EXTRA ${patch_extra} PARENT_SCOPE)
    set (${var_prefix}_VERSION_FULL ${full} PARENT_SCOPE)
    if ("${major}.${minor}.${patch}" EQUAL "${full}")
      set (${var_prefix}_VERSION_IS_RELEASE TRUE PARENT_SCOPE)
    else ()
      set (${var_prefix}_VERSION_IS_RELEASE FALSE PARENT_SCOPE)
    endif()
  else()
    message(STATUS
      "Could not use git to determine source version, using version ${${var_prefix}_VERSION_FULL}"
    )
  endif()
endfunction()
