From 063aa9c1cf976d90b0622a07985c8667f76924b6 Mon Sep 17 00:00:00 2001
From: Nicholas Blair <nicholas.blair@wisc.edu>
Date: Tue, 6 Sep 2016 11:17:56 -0500
Subject: [PATCH] fix: handle maven release plugin generated tags

Look like 'my-awesome-project-0.1.0'; need to use a Pattern to slice out the semver triplet.
---
 build.gradle                                  |  2 +-
 .../wisc/doit/gradle/CompareVersions.groovy   | 28 +++++++++++++++----
 .../doit/gradle/CompareVersionsTest.groovy    | 21 ++++++++++++++
 3 files changed, 44 insertions(+), 7 deletions(-)

diff --git a/build.gradle b/build.gradle
index 5541a09..eeecbb1 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,5 +1,5 @@
 group 'edu.wisc.doit.gradle'
-version '0.2.1'
+version '0.2.2'
 
 apply plugin: 'groovy'
 apply plugin: 'idea'
diff --git a/src/main/groovy/edu/wisc/doit/gradle/CompareVersions.groovy b/src/main/groovy/edu/wisc/doit/gradle/CompareVersions.groovy
index 77d2f27..003dc39 100644
--- a/src/main/groovy/edu/wisc/doit/gradle/CompareVersions.groovy
+++ b/src/main/groovy/edu/wisc/doit/gradle/CompareVersions.groovy
@@ -1,8 +1,12 @@
 package edu.wisc.doit.gradle
 
 import com.github.zafarkhaja.semver.Version
+import org.apache.commons.lang.StringUtils
 import org.gradle.api.GradleException
 
+import java.util.regex.Matcher
+import java.util.regex.Pattern
+
 /**
  * Encapsulates logic for comparing version strings.
  *
@@ -10,6 +14,7 @@ import org.gradle.api.GradleException
  */
 class CompareVersions {
 
+  static final Pattern PATTERN = Pattern.compile(".*(\\d+\\.\\d+\\.\\d+).*")
   /**
    *
    * @param fromGitDescribe the version string from git (e.g. 'git describe')
@@ -22,12 +27,7 @@ class CompareVersions {
       println "git describe is empty - there are no releases yet. You must have at least one tag on the repository to use this task."
       return
     }
-    def lastVersion = Version.valueOf(fromGitDescribe)
-    if(!''.equals(lastVersion.getPreReleaseVersion())) {
-      // git describe produced something like '0.20.7-1-gfbe61fd'
-      // split on '-' and recreate last as the first token
-      lastVersion = Version.valueOf(fromGitDescribe.split('-')[0])
-    }
+    def lastVersion = parseVersionFromGitDescribe(fromGitDescribe)
 
     // read 'version' field from build.gradle
     def currentVersion = Version.valueOf(inBuildGradle);
@@ -38,4 +38,20 @@ class CompareVersions {
       throw new GradleException("version field in build.gradle with current value " + currentVersion + " must be incremented past " + lastVersion)
     }
   }
+
+  /**
+   *
+   * @param gitDescribe the version string from git
+   * @return a {@link Version}
+   * @throws IllegalArgumentException if a version could not be extracted
+     */
+  static Version parseVersionFromGitDescribe(String gitDescribe) {
+    Matcher m = PATTERN.matcher(gitDescribe);
+    if(m.matches()) {
+      String substring = m.group(1);
+      println "Extracted ${substring} from git describe output of ${gitDescribe}"
+      return Version.valueOf(substring);
+    }
+    throw new IllegalArgumentException("cannot parse version from " + gitDescribe)
+  }
 }
diff --git a/src/test/groovy/edu/wisc/doit/gradle/CompareVersionsTest.groovy b/src/test/groovy/edu/wisc/doit/gradle/CompareVersionsTest.groovy
index 1c725ea..31205f3 100644
--- a/src/test/groovy/edu/wisc/doit/gradle/CompareVersionsTest.groovy
+++ b/src/test/groovy/edu/wisc/doit/gradle/CompareVersionsTest.groovy
@@ -1,8 +1,11 @@
 package edu.wisc.doit.gradle
 
+import com.github.zafarkhaja.semver.Version
 import org.gradle.api.GradleException
 import org.junit.Test
 
+import static org.junit.Assert.assertEquals
+
 /**
  * Unit tests for {@link CompareVersions}.
  *
@@ -30,4 +33,22 @@ class CompareVersionsTest {
   public void describe_includes_hash_same_version_expects_failure() {
     CompareVersions.compare("0.20.7-1-gfbe61fd", "0.20.7")
   }
+
+  @Test
+  public void describe_maven_release_plugin_style_tags() {
+    CompareVersions.compare("my-awesome-project-0.2.0-13-g98171dc", "0.2.1")
+  }
+
+  @Test
+  void "parseVersionFromGitDescribe control"() {
+    assertEquals(Version.valueOf("0.0.1"), CompareVersions.parseVersionFromGitDescribe("0.0.1"))
+  }
+  @Test
+  void "parseVersionFromGitDescribe with preReleaseVersion"() {
+    assertEquals(Version.valueOf("0.20.7"), CompareVersions.parseVersionFromGitDescribe("0.20.7-1-gfbe61fd"))
+  }
+  @Test
+  void "parseVersionFromGitDescribe maven release plugin formatted tag"() {
+    assertEquals(Version.valueOf("0.2.0"), CompareVersions.parseVersionFromGitDescribe("my-awesome-project-0.2.0-13-g98171dc"))
+  }
 }
-- 
GitLab