From b109f1c54d8d0ca10984daa7e81f884fed9a481d Mon Sep 17 00:00:00 2001
From: Peter Powers <pmpowers@usgs.gov>
Date: Mon, 27 Mar 2017 11:33:57 -0600
Subject: [PATCH] added version writing and reading

---
 build.xml                              | 32 ++++++++++++++-
 src/org/opensha2/DeaggCalc.java        |  3 +-
 src/org/opensha2/HazardCalc.java       |  3 +-
 src/org/opensha2/internal/Version.java | 55 ++++++++++++++++++++++++++
 4 files changed, 89 insertions(+), 4 deletions(-)
 create mode 100644 src/org/opensha2/internal/Version.java

diff --git a/build.xml b/build.xml
index cd64b37d1..e73c69092 100644
--- a/build.xml
+++ b/build.xml
@@ -5,7 +5,6 @@
     nshmp-haz is a platform for conducting seismic hazard calculations
   </description>
 
-  <!-- PROPERTIES -->
   <property name="src" location="src" />
   <property name="test" location="test" />
   <property name="lib" location="lib" />
@@ -14,6 +13,9 @@
   <property name="docs" location="docs" />
   <property name="javadoc" location="${docs}/javadoc" />
 
+  <property name="app.properties" location="${dist}/app.properties" />
+  <property name="tstamp.format" value="yyyy-MM-dd'T'HH:mm:ssXXX" />
+  <available file=".git" type="dir" property="git.present" />
 
   <property name="reports" location="${docs}/reports" />
   <property name="reports.xml" location="${reports}/junit-xml" />
@@ -56,14 +58,40 @@
        and internal package; need to check dependencies
   -->
 
-  <target name="jar" depends="compile.source">
+  <target name="jar" depends="compile.source,set.app.properties">
     <jar destfile="${dist}/nshmp-haz.jar">
       <fileset dir="${classes}" />
+      <fileset file="${app.properties}" />
       <zipfileset src="${guava.jar}" excludes="**/META-INF/**" />
       <zipfileset src="${gson.jar}" />
     </jar>
+    <delete file="${app.properties}" />
   </target>
 
+  <target name="set.app.properties" depends="check.git">
+    <tstamp>
+      <format property="build.date" pattern="${tstamp.format}" />
+    </tstamp>
+    <echo>build.date=${build.date}</echo>
+    <echo file="${app.properties}">build.date=${build.date}</echo>
+    <echo file="${app.properties}" append="true">${line.separator}</echo>
+    <condition property="app.version" value="${git.tag}" else="unknown">
+      <isset property="git.tag" />
+    </condition>
+    <echo>app.version=${app.version}</echo>
+    <echo file="${app.properties}" append="true">app.version=${app.version}</echo>
+  </target>
+
+  <target name="check.git" if="git.present">
+    <exec executable="git"
+          outputproperty="git.tag"
+          failifexecutionfails="false">
+      <arg value="describe" />
+      <arg value="--tags" />
+    </exec>
+  </target>
+
+
   <target name="compile">
     <mkdir dir="${classes}" />
     <javac srcdir="${param.srcdir}"
diff --git a/src/org/opensha2/DeaggCalc.java b/src/org/opensha2/DeaggCalc.java
index cc2399283..c8ae94c4b 100644
--- a/src/org/opensha2/DeaggCalc.java
+++ b/src/org/opensha2/DeaggCalc.java
@@ -14,6 +14,7 @@ import org.opensha2.calc.Sites;
 import org.opensha2.calc.ThreadCount;
 import org.opensha2.eq.model.HazardModel;
 import org.opensha2.internal.Logging;
+import org.opensha2.internal.Version;
 
 import com.google.common.base.Optional;
 import com.google.common.base.Throwables;
@@ -82,7 +83,7 @@ public class DeaggCalc {
       fh.setFormatter(new Logging.ConsoleFormatter());
       log.getParent().addHandler(fh);
 
-      log.info(PROGRAM + ": initializing...");
+      log.info(PROGRAM + ": " + Version.APP_VERSION);
       Path modelPath = Paths.get(args[0]);
       HazardModel model = HazardModel.load(modelPath);
 
diff --git a/src/org/opensha2/HazardCalc.java b/src/org/opensha2/HazardCalc.java
index ea5386518..a4976a1f3 100644
--- a/src/org/opensha2/HazardCalc.java
+++ b/src/org/opensha2/HazardCalc.java
@@ -14,6 +14,7 @@ import org.opensha2.calc.Sites;
 import org.opensha2.calc.ThreadCount;
 import org.opensha2.eq.model.HazardModel;
 import org.opensha2.internal.Logging;
+import org.opensha2.internal.Version;
 
 import com.google.common.base.Optional;
 import com.google.common.base.Throwables;
@@ -89,7 +90,7 @@ public class HazardCalc {
       fh.setFormatter(new Logging.ConsoleFormatter());
       log.getParent().addHandler(fh);
 
-      log.info(PROGRAM + ": initializing...");
+      log.info(PROGRAM + ": " + Version.APP_VERSION);
       Path modelPath = Paths.get(args[0]);
       HazardModel model = HazardModel.load(modelPath);
 
diff --git a/src/org/opensha2/internal/Version.java b/src/org/opensha2/internal/Version.java
new file mode 100644
index 000000000..ff4926bdc
--- /dev/null
+++ b/src/org/opensha2/internal/Version.java
@@ -0,0 +1,55 @@
+package org.opensha2.internal;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Properties;
+
+/**
+ * Application version tracking.
+ * 
+ * @author Peter Powers
+ */
+public class Version {
+
+  /** Application version. */
+  public static final String APP_VERSION;
+
+  /** Build date. */
+  public static final String BUILD_DATE;
+
+  static {
+
+    String appVersion = "unknown";
+    String buildDate = "now";
+
+    /* Assume we're running from a jar. */
+    try {
+      InputStream is = Version.class.getResourceAsStream("/app.properties");
+      Properties props = new Properties();
+      props.load(is);
+      is.close();
+      appVersion = props.getProperty("app.version");
+      buildDate = props.getProperty("build.date");
+    } catch (Exception e1) {
+      /* Otherwise check for a repository. */
+      Path gitDir = Paths.get(".git");
+      if (Files.exists(gitDir)) {
+        try {
+          Process pr = Runtime.getRuntime().exec("git describe --tags");
+          BufferedReader br = new BufferedReader(new InputStreamReader(pr.getInputStream()));
+          appVersion = br.readLine();
+          br.close();
+          /* Detached from repository. */
+        } catch (Exception e2) {}
+      }
+    }
+
+    APP_VERSION = appVersion;
+    BUILD_DATE = buildDate;
+  }
+
+}
-- 
GitLab