# Pure cmake script to write out cmake_commit.c and cmake_version.but

set(DEFAULT_COMMIT "unavailable")
set(commit "${DEFAULT_COMMIT}")

set(TOPLEVEL_SOURCE_DIR ${CMAKE_SOURCE_DIR})

execute_process(
  COMMAND ${GIT_EXECUTABLE} rev-parse --show-cdup
  OUTPUT_VARIABLE path_to_top
  ERROR_VARIABLE stderr
  RESULT_VARIABLE status)
string(REGEX REPLACE "\n$" "" path_to_top "${path_to_top}")

# If we're at the top of a git repository, --show-cdup will print the
# empty string (followed by a newline) and return success. If we're
# lower down, it will return a sequence of "../../" that leads to the
# top; if we're higher up it will fail with an error.
if(status EQUAL 0 AND path_to_top STREQUAL "")
  execute_process(
    COMMAND ${GIT_EXECUTABLE} rev-parse HEAD
    OUTPUT_VARIABLE git_commit
    ERROR_VARIABLE stderr
    RESULT_VARIABLE status)
  if(status EQUAL 0)
    string(REGEX REPLACE "\n$" "" commit "${git_commit}")
  else()
    if(commit STREQUAL "unavailable")
      message("Unable to determine git commit: 'git rev-parse HEAD' returned status ${status} and error output:\n${stderr}\n")
    endif()
  endif()
else()
  if(commit STREQUAL "unavailable")
    message("Unable to determine git commit: top-level source dir ${CMAKE_SOURCE_DIR} is not the root of a repository")
  endif()
endif()

if(OUTPUT_TYPE STREQUAL header)
  file(WRITE "${OUTPUT_FILE}" "\
/*
 * cmake_commit.c - string literal giving the source git commit, if known.
 *
 * Generated by cmake/gitcommit.cmake.
 */

#include \"putty.h\"
const char commitid[] = \"${commit}\";
")
elseif(OUTPUT_TYPE STREQUAL halibut)
  if(commit STREQUAL "unavailable")
    file(WRITE "${OUTPUT_FILE}" "\
\\versionid no version information available
")
  else()
    file(WRITE "${OUTPUT_FILE}" "\
\\versionid built from git commit ${commit}
")
  endif()
else()
  message(FATAL_ERROR "Set OUTPUT_TYPE when running this script")
endif()
