From 209bf80b40a2929de20b02c6ad4e7d2a865019ed Mon Sep 17 00:00:00 2001
From: Emmanuel Christophe <emmanuel.christophe@orfeo-toolbox.org>
Date: Wed, 5 May 2010 16:52:24 +0800
Subject: [PATCH] ENH: add mercurial versionning capabilities

---
 CMake/FindMercurial.cmake | 69 +++++++++++++++++++++++++++++++++++++++
 CMakeLists.txt            | 15 ++++++---
 2 files changed, 80 insertions(+), 4 deletions(-)
 create mode 100644 CMake/FindMercurial.cmake

diff --git a/CMake/FindMercurial.cmake b/CMake/FindMercurial.cmake
new file mode 100644
index 0000000000..befc72385f
--- /dev/null
+++ b/CMake/FindMercurial.cmake
@@ -0,0 +1,69 @@
+# - Extract information from a mercurial working copy
+
+# Example usage:
+#  FIND_PACKAGE(Mercurial)
+#  IF(Mercurial_FOUND)
+#    Mercurial_WC_IDENTIFY(${PROJECT_SOURCE_DIR} Project)
+#    MESSAGE("Current revision is ${Project_WC_REVISION}")
+#    MESSAGE("Mercurial version is ${Mercurial_VERSION_HG}")
+#  ENDIF(Mercurial_FOUND)
+
+
+SET(Mercurial_FOUND FALSE)
+SET(Mercurial_HG_FOUND FALSE)
+
+FIND_PROGRAM(Mercurial_HG_EXECUTABLE hg
+  DOC "mercurial command line client")
+MARK_AS_ADVANCED(Mercurial_HG_EXECUTABLE)
+
+IF(Mercurial_HG_EXECUTABLE)
+  SET(Mercurial_HG_FOUND TRUE)
+  SET(Mercurial_FOUND TRUE)
+
+  MACRO(Mercurial_WC_IDENTIFY dir prefix)
+    # the subversion commands should be executed with the C locale, otherwise
+    # the message (which are parsed) may be translated, Alex
+    SET(_Mercurial_SAVED_LC_ALL "$ENV{LC_ALL}")
+    SET(ENV{LC_ALL} C)
+    EXECUTE_PROCESS(COMMAND ${Mercurial_HG_EXECUTABLE} version
+      WORKING_DIRECTORY ${dir}
+      OUTPUT_VARIABLE Mercurial_VERSION_HG
+      OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+    EXECUTE_PROCESS(COMMAND ${Mercurial_HG_EXECUTABLE} identify ${dir}
+      OUTPUT_VARIABLE ${prefix}_WC_IDENTIFY
+      ERROR_VARIABLE Mercurial_hg_identify_error
+      RESULT_VARIABLE Mercurial_hg_identify_result
+      OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+    IF(NOT ${Mercurial_hg_identify_result} EQUAL 0)
+      MESSAGE(SEND_ERROR "Command \"${Mercurial_HG_EXECUTABLE} identify ${dir}\" failed with output:\n${Mercurial_hg_identify_error}")
+    ELSE(NOT ${Mercurial_hg_identify_result} EQUAL 0)
+
+      STRING(REGEX REPLACE "^(.*\n)?Mercurial Distributed SCM [(]version ([.0-9]+).*"
+        "\\2" Mercurial_VERSION_HG "${Mercurial_VERSION_HG}")
+      STRING(REGEX REPLACE "^(.*\n)?([0-9a-f]+).*"
+        "\\2" ${prefix}_WC_REVISION "${${prefix}_WC_IDENTIFY}")
+
+    ENDIF(NOT ${Mercurial_hg_identify_result} EQUAL 0)
+
+    # restore the previous LC_ALL
+    SET(ENV{LC_ALL} ${_Mercurial_SAVED_LC_ALL})
+
+  ENDMACRO(Mercurial_WC_IDENTIFY)
+
+
+
+ENDIF(Mercurial_HG_EXECUTABLE)
+
+
+
+IF(NOT Mercurial_FOUND)
+  IF(NOT Mercurial_FIND_QUIETLY)
+    MESSAGE(STATUS "Mercurial was not found.")
+  ELSE(NOT Mercurial_FIND_QUIETLY)
+    IF(Mercurial_FIND_REQUIRED)
+      MESSAGE(FATAL_ERROR "Mercurial was not found.")
+    ENDIF(Mercurial_FIND_REQUIRED)
+  ENDIF(NOT Mercurial_FIND_QUIETLY)
+ENDIF(NOT Mercurial_FOUND)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f7a855b680..59d3da33f9 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -70,10 +70,17 @@ SET(OTB_VERSION_MAJOR "3")
 SET(OTB_VERSION_MINOR "2")
 SET(OTB_VERSION_PATCH "1")
 
-
-# Version string should not include patch level.  The major.minor is
-# enough to distinguish available features of the toolkit.
-SET(OTB_VERSION_STRING "${OTB_VERSION_MAJOR}.${OTB_VERSION_MINOR}.${OTB_VERSION_PATCH}")
+FIND_PACKAGE(Mercurial)
+IF(Mercurial_FOUND)
+  Mercurial_WC_IDENTIFY(${PROJECT_SOURCE_DIR} OTB)
+  MESSAGE("Mercurial version is ${Mercurial_VERSION_HG}")
+  MESSAGE("Repository revision is ${Project_WC_REVISION}")
+  SET(OTB_VERSION_STRING "${OTB_VERSION_MAJOR}.${OTB_VERSION_MINOR}.${OTB_VERSION_PATCH}.${Project_WC_REVISION}")
+ELSE(Mercurial_FOUND)
+  # Version string should not include patch level.  The major.minor is
+  # enough to distinguish available features of the toolkit.
+  SET(OTB_VERSION_STRING "${OTB_VERSION_MAJOR}.${OTB_VERSION_MINOR}.${OTB_VERSION_PATCH}")
+ENDIF(Mercurial_FOUND)
 
 OPTION(BUILD_TESTING "Build testing." OFF)
 
-- 
GitLab