From 68e988b494dd1d55718ef4bf29ec8b54642d8e45 Mon Sep 17 00:00:00 2001 From: Frank Becker Date: Sat, 9 Jul 2016 12:20:48 +0200 Subject: [PATCH] Failsafe version of checkVersion Task Prevent stopping check Task if an exception happens during checkVersion execution. Print proper warning message if a version violates semantic versioning. Closes #479 --- gradle/versioncheck.gradle | 76 +++++++++++++++++++++++++++++--------- 1 file changed, 58 insertions(+), 18 deletions(-) diff --git a/gradle/versioncheck.gradle b/gradle/versioncheck.gradle index 6e49f0384..ccf26fd41 100644 --- a/gradle/versioncheck.gradle +++ b/gradle/versioncheck.gradle @@ -18,35 +18,75 @@ task checkVersion() { throw new GradleException("I need the gem name to check the version. Add a 'gem_name' property to the gradle.properties file. (e.g.: gem_name=asciidoctor-diagram)") } - def gem_version_pattern = ~/(((\d+\.){1,2}\d+)(\.)?(.*))/ - def gem_latest_version_url = "https://rubygems.org/api/v1/versions/${gem_name}/latest.json".toURL() + doLast { - def json = new JsonSlurper().parse( gem_latest_version_url ) - def gem_latest_version = json.version + String gem_latest_version = getLatestGemVersion(gem_name) + String javaVersion = latestGemVersionAsJavaVersion(gem_latest_version) - def matcher = gem_latest_version =~ gem_version_pattern - def javaVersion = gem_latest_version + try { - doLast { + Version projectVersion = Version.valueOf(version as String) + Version gemJavaVersion = Version.valueOf(javaVersion) - if ( gem_latest_version ==~ gem_version_pattern ) { - matcher.find() - if (matcher.group(4)) { - javaVersion = "${matcher.group(2)}-${matcher.group(5)}" + if (projectVersion.lessThan(gemJavaVersion)) { + logger.warn "\nWARNING\nVersion mismatch: Current Version: {}, Gem Version: {}\n",version , gem_latest_version + } else { + println "up-to-date" } } + catch (Exception e) { + logger.error "\nWARNING\nSemantic version violation: Current Version: {}, Gem Version: {}\n",version , gem_latest_version + } + } +} + +/** + * Consume rubygems webservice to determine latest gem version + * + * @param gemName The gem's package name. eg.: asciidoctor-diagram + * @return latest gem version as String + */ +private String getLatestGemVersion(String gemName) { + def gemVersion + try { + def gem_latest_version_url = "https://rubygems.org/api/v1/versions/${gemName}/latest.json".toURL() + def json = new JsonSlurper().parse(gem_latest_version_url) + gemVersion = json.version + } + catch (Exception e) { + logger.error "Problems getting latest gem version. {}", e.message + throw new StopExecutionException() + } + gemVersion +} - Version projectVersion = Version.valueOf(version) - Version gemJavaVersion = Version.valueOf(javaVersion) +/** + * Transforms a gem version into a java version representation. + * + * e.g.: The gem version of asciidoctorj-epub3 1.5.0.alpha.6 transforms to 1.5.0-alpha.6 + * + * @param gem_latest_version The latest gem version as String + * @return a java compatible presentation of a gem version + */ +private String latestGemVersionAsJavaVersion(String gem_latest_version) { + def gem_version_pattern = ~/(((\d+\.){1,2}\d+)(\.)?(.*))/ + def matcher = gem_latest_version =~ gem_version_pattern + def javaVersion = gem_latest_version - if ( projectVersion.lessThan(gemJavaVersion) ) { - logger.warn "\nWARNING\nVersion mismatch: Current Version: $version, Gem Version: $gem_latest_version\n" - } - else { - println "up-to-date" + try { + if (gem_latest_version ==~ gem_version_pattern) { + matcher.find() + if (matcher.group(4)) { + javaVersion = "${matcher.group(2)}-${matcher.group(5)}" + } } } + catch (Exception e) { + logger.error "Problems transforming gem version {} to java version", gem_latest_version + throw new StopExecutionException() + } + javaVersion } checkVersion.onlyIf { !gradle.startParameter.isOffline() }