# Check the CMake source tree for suspicious policy introdcutions...
#
message("=============================================================================")
message("CTEST_FULL_OUTPUT (Avoid ctest truncation of output)")
message("")
message("CMake_BINARY_DIR='${CMake_BINARY_DIR}'")
message("CMake_SOURCE_DIR='${CMake_SOURCE_DIR}'")
message("GIT_EXECUTABLE='${GIT_EXECUTABLE}'")
message("")


# If this does not appear to be a git checkout, just pass the test here
# and now. (Do not let the test fail if it is run in a tree *exported* from a
# repository or unpacked from a .zip file source installer...)
#
set(is_git_checkout 0)
if(EXISTS "${CMake_SOURCE_DIR}/.git")
  set(is_git_checkout 1)
endif()

message("is_git_checkout='${is_git_checkout}'")
message("")

if(NOT is_git_checkout)
  message("source tree is not a git checkout... test passes by early return...")
  return()
endif()

# If no GIT_EXECUTABLE, see if we can figure out which git was used
# for the ctest_update step on this dashboard...
#
if(is_git_checkout AND NOT GIT_EXECUTABLE)
  set(ctest_ini_file "")
  set(exe "")

  # Use the old name:
  if(EXISTS "${CMake_BINARY_DIR}/DartConfiguration.tcl")
    set(ctest_ini_file "${CMake_BINARY_DIR}/DartConfiguration.tcl")
  endif()

  # But if it exists, prefer the new name:
  if(EXISTS "${CMake_BINARY_DIR}/CTestConfiguration.ini")
    set(ctest_ini_file "${CMake_BINARY_DIR}/CTestConfiguration.ini")
  endif()

  # If there is a ctest ini file, read the update command or git command
  # from it:
  #
  if(ctest_ini_file)
    file(STRINGS "${ctest_ini_file}" line REGEX "^GITCommand: (.*)$")
    string(REGEX REPLACE "^GITCommand: (.*)$" "\\1" line "${line}")
    if("${line}" MATCHES "^\"")
      string(REGEX REPLACE "^\"([^\"]+)\" *.*$" "\\1" line "${line}")
    else()
      string(REGEX REPLACE "^([^ ]+) *.*$" "\\1" line "${line}")
    endif()
    set(exe "${line}")
    if("${exe}" STREQUAL "GITCOMMAND-NOTFOUND")
      set(exe "")
    endif()
    if(exe)
      message("info: GIT_EXECUTABLE set by 'GITCommand:' from '${ctest_ini_file}'")
    endif()

    if(NOT exe)
      file(STRINGS "${ctest_ini_file}" line REGEX "^UpdateCommand: (.*)$")
      string(REGEX REPLACE "^UpdateCommand: (.*)$" "\\1" line "${line}")
      if("${line}" MATCHES "^\"")
        string(REGEX REPLACE "^\"([^\"]+)\" *.*$" "\\1" line "${line}")
      else()
        string(REGEX REPLACE "^([^ ]+) *.*$" "\\1" line "${line}")
      endif()
      set(exe "${line}")
      if("${exe}" STREQUAL "GITCOMMAND-NOTFOUND")
        set(exe "")
      endif()
      if(exe)
        message("info: GIT_EXECUTABLE set by 'UpdateCommand:' from '${ctest_ini_file}'")
      endif()
    endif()
  else()
    message("info: no DartConfiguration.tcl or CTestConfiguration.ini file...")
  endif()

  # If we have still not grokked the exe, look in the Update.xml file to see
  # if we can parse it from there...
  #
  if(NOT exe)
    file(GLOB_RECURSE update_xml_file "${CMake_BINARY_DIR}/Testing/Update.xml")
    if(update_xml_file)
      file(STRINGS "${update_xml_file}" line
        REGEX "^.*<UpdateCommand>(.*)</UpdateCommand>$" LIMIT_COUNT 1)
      string(REPLACE "&quot\;" "\"" line "${line}")
      string(REGEX REPLACE "^.*<UpdateCommand>(.*)</UpdateCommand>$" "\\1" line "${line}")
      if("${line}" MATCHES "^\"")
        string(REGEX REPLACE "^\"([^\"]+)\" *.*$" "\\1" line "${line}")
      else()
        string(REGEX REPLACE "^([^ ]+) *.*$" "\\1" line "${line}")
      endif()
      if(line)
        set(exe "${line}")
      endif()
      if(exe)
        message("info: GIT_EXECUTABLE set by '<UpdateCommand>' from '${update_xml_file}'")
      endif()
    else()
      message("info: no Update.xml file...")
    endif()
  endif()

  if(exe)
    set(GIT_EXECUTABLE "${exe}")
    message("GIT_EXECUTABLE='${GIT_EXECUTABLE}'")
    message("")

    if(NOT EXISTS "${GIT_EXECUTABLE}")
      message(FATAL_ERROR "GIT_EXECUTABLE does not exist...")
    endif()
  else()
    message(FATAL_ERROR "could not determine GIT_EXECUTABLE...")
  endif()
endif()


if(is_git_checkout AND GIT_EXECUTABLE)
  # Check with "git grep" if there are any unacceptable cmPolicies additions
  #
  message("=============================================================================")
  message("This is a git checkout, using git grep to verify no unacceptable policies")
  message("are being introduced....")
  message("")

  execute_process(COMMAND ${GIT_EXECUTABLE} grep -En "[0-9][0-9][0-9][0-9][0-9].*cmPolicies"
    WORKING_DIRECTORY ${CMake_SOURCE_DIR}
    OUTPUT_VARIABLE grep_output
    OUTPUT_STRIP_TRAILING_WHITESPACE)
  message("=== output of 'git grep -En \"[0-9][0-9][0-9][0-9][0-9].*cmPolicies\"' ===")
  message("${grep_output}")
  message("=== end output ===")
  message("")

  if(NOT "${grep_output}" STREQUAL "")
    message(FATAL_ERROR "git grep output is non-empty...
New CMake policies must be introduced in a non-date-based version number.
Send email to the cmake-developers list to figure out what the target
version number for this policy should be...")
  endif()
endif()


# Still here? Good then...
#
message("test passes")
message("")