# This module defines the following variables utilizing
# git to determine the parent tag. And if found the macro
# will attempt to parse them in the github tag fomat
#
# Useful for auto-versioning in our CMakeLists
#
#  EVENT_GIT___VERSION_MAJOR - Major version.
#  EVENT_GIT___VERSION_MINOR - Minor version
#  EVENT_GIT___VERSION_STAGE - Stage version
#
# Example usage:
#
# event_fuzzy_version_from_git()
#    message("Libvent major=${EVENT_GIT___VERSION_MAJOR}")
#    message("        minor=${EVENT_GIT___VERSION_MINOR}")
#    message("        patch=${EVENT_GIT___VERSION_PATCH}")
#    message("        stage=${EVENT_GIT___VERSION_STAGE}")
# endif()

include(FindGit)

macro(event_fuzzy_version_from_git)
	# set our defaults.
	set(EVENT_GIT___VERSION_MAJOR 2)
	set(EVENT_GIT___VERSION_MINOR 1)
	set(EVENT_GIT___VERSION_PATCH 12)
	set(EVENT_GIT___VERSION_STAGE "stable")

	find_package(Git)

	if (GIT_FOUND)
		execute_process(
			COMMAND
				${GIT_EXECUTABLE} describe --abbrev=0 --always
			WORKING_DIRECTORY
				${PROJECT_SOURCE_DIR}
			RESULT_VARIABLE
				GITRET
			OUTPUT_VARIABLE
				GITVERSION
			OUTPUT_STRIP_TRAILING_WHITESPACE
		)

		string(REGEX REPLACE "[\\._-]" ";" VERSION_LIST "${GITVERSION}")
		if(VERSION_LIST)
			list(LENGTH VERSION_LIST VERSION_LIST_LENGTH)
		endif()

		if ((GITRET EQUAL 0) AND (VERSION_LIST_LENGTH EQUAL 5))
			list(GET VERSION_LIST 1 _MAJOR)
			list(GET VERSION_LIST 2 _MINOR)
			list(GET VERSION_LIST 3 _PATCH)
			list(GET VERSION_LIST 4 _STAGE)

			set(_DEFAULT_VERSION "${EVENT_GIT___VERSION_MAJOR}.${EVENT_GIT___VERSION_MINOR}.${EVENT_GIT___VERSION_PATCH}-${EVENT_GIT___VERSION_STAGE}")
			set(_GIT_VERSION     "${_MAJOR}.${_MINOR}.${_PATCH}-${_STAGE}")

			if (${_DEFAULT_VERSION} VERSION_LESS ${_GIT_VERSION})
				set(EVENT_GIT___VERSION_MAJOR ${_MAJOR})
				set(EVENT_GIT___VERSION_MINOR ${_MINOR})
				set(EVENT_GIT___VERSION_PATCH ${_PATCH})
				set(EVENT_GIT___VERSION_STAGE ${_STAGE})
			endif()
		endif()
	endif()
endmacro()
