From 6dbd1d9746291605f73cee20ae9e573f078eeb64 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 17 Jul 2016 18:04:08 -0700 Subject: [PATCH 001/316] Code format. --- example/kobalt/src/Build.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/example/kobalt/src/Build.kt b/example/kobalt/src/Build.kt index bd87306..70328c6 100644 --- a/example/kobalt/src/Build.kt +++ b/example/kobalt/src/Build.kt @@ -57,10 +57,10 @@ val example = project { dependenciesTest { } - - apt { - outputDir = "/src/generated/java/" - } + + apt { + outputDir = "/src/generated/java/" + } install { libDir = "deploy" From 20e2505ca5014de83a7fffc1e16a19c4783ac706 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 17 Jul 2016 18:04:31 -0700 Subject: [PATCH 002/316] Updated documentation. --- .idea/modules/semver.iml | 12 ++++++------ README.html | 1 + README.md | 2 ++ build.gradle | 2 +- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/.idea/modules/semver.iml b/.idea/modules/semver.iml index 24fcd77..1615fa6 100644 --- a/.idea/modules/semver.iml +++ b/.idea/modules/semver.iml @@ -15,12 +15,12 @@ - - - - - - + + + + + + \ No newline at end of file diff --git a/README.html b/README.html index f72ba14..7a4c269 100644 --- a/README.html +++ b/README.html @@ -146,6 +146,7 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf public final static String PROJECT = "${project}"; }

The Velocity variables are automatically filled in by the processor.

+

Please also look at this example using java.time

Elements & Properties

The following annotation elements and properties are available:

diff --git a/README.md b/README.md index 3c8d0ca..719b7f4 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,8 @@ public final class ${className} { } ``` The Velocity variables are automatically filled in by the processor. + +Please also look at this [example](https://github.com/ethauvin/mobibot/blob/master/version.vm) using [`java.time`](https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html) ## Elements & Properties diff --git a/build.gradle b/build.gradle index 8192c45..7895e9a 100644 --- a/build.gradle +++ b/build.gradle @@ -205,7 +205,7 @@ task release(dependsOn: ['wrapper', 'clean', 'deploy']) << { task pandoc(type: Exec) { group = 'Documentation' - def pandoc_args = [] + def pandoc_args = ['--from', 'markdown_github', '--to', 'html5', '-s', '-c', 'github-pandoc.css', '-o', 'README.html', 'README.md'] if (Os.isFamily(Os.FAMILY_WINDOWS)) { commandLine(['cmd', '/c', 'pandoc'] + pandoc_args) From 3973b144bca92a8cc52866911c8c5af05dad63b9 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 17 Jul 2016 18:30:29 -0700 Subject: [PATCH 003/316] Code format. --- kobalt/src/Build.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/kobalt/src/Build.kt b/kobalt/src/Build.kt index 3187eb1..96dc880 100644 --- a/kobalt/src/Build.kt +++ b/kobalt/src/Build.kt @@ -58,7 +58,6 @@ val semver = project { dependenciesTest { compile("org.testng:testng:6.9.12") - } javaCompiler { From 240c928e77661f366b53e26834bbdeba2960d9c2 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 18 Jul 2016 17:45:07 -0700 Subject: [PATCH 004/316] Code format, tabs to spaces, etc. --- .idea/modules/example.iml | 24 ++ .idea/modules/semver.iml | 12 +- build.gradle | 271 +++++++------- example/build.gradle | 94 +++-- example/gradle/wrapper/gradle-wrapper.jar | Bin 53636 -> 53324 bytes .../gradle/wrapper/gradle-wrapper.properties | 4 +- example/gradlew | 46 +-- example/gradlew.bat | 8 +- .../erik/semver/example/GeneratedVersion.java | 157 +++++++++ .../thauvin/erik/semver/example/Example.java | 30 +- example/version.properties | 5 +- semver.ipr | 43 ++- .../net/thauvin/erik/semver/Constants.java | 128 ++++--- .../java/net/thauvin/erik/semver/Version.java | 35 +- .../net/thauvin/erik/semver/VersionInfo.java | 331 +++++++++--------- .../thauvin/erik/semver/VersionProcessor.java | 305 ++++++++-------- 16 files changed, 826 insertions(+), 667 deletions(-) create mode 100644 .idea/modules/example.iml create mode 100644 example/src/generated/java/net/thauvin/erik/semver/example/GeneratedVersion.java diff --git a/.idea/modules/example.iml b/.idea/modules/example.iml new file mode 100644 index 0000000..3004a6f --- /dev/null +++ b/.idea/modules/example.iml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/semver.iml b/.idea/modules/semver.iml index 1615fa6..24fcd77 100644 --- a/.idea/modules/semver.iml +++ b/.idea/modules/semver.iml @@ -15,12 +15,12 @@ - - - - - - + + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 7895e9a..b807226 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id "com.jfrog.bintray" version "1.5" + id "com.jfrog.bintray" version "1.5" } apply plugin: 'java' apply plugin: 'idea' @@ -10,29 +10,27 @@ import org.apache.tools.ant.taskdefs.condition.Os defaultTasks 'deploy' -def getVersion(isIncrement = false) -{ - def propsFile = 'version.properties' - def majorKey = 'version.major' - def minorKey = 'version.minor' - def patchKey = 'version.patch' - def metaKey = 'version.buildmeta' - def preKey = 'version.prerelease' - if (isIncrement) - { - ant.propertyfile(file: propsFile) { - entry(key: patchKey, - type: 'int', - default: '-1', - operation: '+') - } - } - def p = new Properties() - file(propsFile).withInputStream { stream -> p.load(stream) } - def metadata = p.getProperty(metaKey, '') - def prerelease = p.getProperty(preKey, '') - return (p.getProperty(majorKey, '1') + '.' + p.getProperty(minorKey, '0') + '.' + p.getProperty(patchKey, '0') + - (prerelease.length() > 0 ? '-' + prerelease : '') + (metadata.length() > 0 ? '+' + metadata : '')) +def getVersion(isIncrement = false) { + def propsFile = 'version.properties' + def majorKey = 'version.major' + def minorKey = 'version.minor' + def patchKey = 'version.patch' + def metaKey = 'version.buildmeta' + def preKey = 'version.prerelease' + if (isIncrement) { + ant.propertyfile(file: propsFile) { + entry(key: patchKey, + type: 'int', + default: '-1', + operation: '+') + } + } + def p = new Properties() + file(propsFile).withInputStream { stream -> p.load(stream) } + def metadata = p.getProperty(metaKey, '') + def prerelease = p.getProperty(preKey, '') + return (p.getProperty(majorKey, '1') + '.' + p.getProperty(minorKey, '0') + '.' + p.getProperty(patchKey, '0') + + (prerelease.length() > 0 ? '-' + prerelease : '') + (metadata.length() > 0 ? '+' + metadata : '')) } version = getVersion() @@ -56,167 +54,162 @@ def pkgLabels = ['java', 'annotation', 'processor', 'semantic', 'version'] [compileJava, compileTestJava]*.options*.encoding = 'UTF-8' repositories { - mavenLocal() - jcenter() + mavenLocal() + jcenter() } dependencies { - compile 'org.apache.velocity:velocity:1.7' - testCompile 'org.testng:testng:6.9.12' + compile 'org.apache.velocity:velocity:1.7' + testCompile 'org.testng:testng:6.9.12' } bintray { - user = project.hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER') - key = project.hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') - publications = ['MyPublication'] - dryRun = true - pkg { - repo = 'maven' - name = mavenName - licenses = pkgLicenses - desc = mavenDescription - websiteUrl = mavenUrl - issueTrackerUrl = pkgIssueTrackerUrl - vcsUrl = mavenScmCon - labels = pkgLabels - publicDownloadNumbers = true - version { - name = project.version - desc = 'Version ' + project.version - vcsTag = project.version - gpg { - sign = true - } - } - } + user = project.hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER') + key = project.hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') + publications = ['MyPublication'] + dryRun = true + pkg { + repo = 'maven' + name = mavenName + licenses = pkgLicenses + desc = mavenDescription + websiteUrl = mavenUrl + issueTrackerUrl = pkgIssueTrackerUrl + vcsUrl = mavenScmCon + labels = pkgLabels + publicDownloadNumbers = true + version { + name = project.version + desc = 'Version ' + project.version + vcsTag = project.version + gpg { + sign = true + } + } + } } - def pomConfig = { - licenses { - license { - name mavenLicense - url mavenLicenseUrl - distribution 'repo' - } - } - developers { - developer { - id 'ethauvin' - name 'Erik C. Thauvin' - email 'erik@thauvin.net' - } - } - scm { - connection 'scm:git:' + mavenScmCon - developerConnection 'scm:git:' + mavenScmDevCon - url mavenScmCon - } + licenses { + license { + name mavenLicense + url mavenLicenseUrl + distribution 'repo' + } + } + developers { + developer { + id 'ethauvin' + name 'Erik C. Thauvin' + email 'erik@thauvin.net' + } + } + scm { + connection 'scm:git:' + mavenScmCon + developerConnection 'scm:git:' + mavenScmDevCon + url mavenScmCon + } } publishing { - publications { - MyPublication(MavenPublication) { - from components.java - artifact sourcesJar - artifact javadocJar - groupId mavenGroupId - artifactId rootProject.name - version project.version + publications { + MyPublication(MavenPublication) { + from components.java + artifact sourcesJar + artifact javadocJar + groupId mavenGroupId + artifactId rootProject.name + version project.version - pom.withXml { - def root = asNode() - root.appendNode('name', mavenName) - root.appendNode('description', mavenDescription) - root.appendNode('url', mavenUrl) - root.children().last() + pomConfig - } - } - } + pom.withXml { + def root = asNode() + root.appendNode('name', mavenName) + root.appendNode('description', mavenDescription) + root.appendNode('url', mavenUrl) + root.children().last() + pomConfig + } + } + } } task javadocJar(type: Jar, dependsOn: javadoc) { - group = 'Build' - description = 'Builds an archive of the javadoc docs.' - classifier = 'javadoc' - from javadoc.destinationDir + group = 'Build' + description = 'Builds an archive of the javadoc docs.' + classifier = 'javadoc' + from javadoc.destinationDir } task sourcesJar(type: Jar) { - group = 'Build' - description = 'Builds an archive of the source code.' - classifier = 'sources' - from sourceSets.main.allSource + group = 'Build' + description = 'Builds an archive of the source code.' + classifier = 'sources' + from sourceSets.main.allSource } artifacts { - archives javadocJar - archives sourcesJar + archives javadocJar + archives sourcesJar } javadoc { - title = mavenDescription + ' ' + version - options.tags = ['created'] - options.author = true - options.addStringOption('link', 'http://docs.oracle.com/javase/8/docs/api/') - options.addStringOption('sourcepath', project.hasProperty('jdkSrc') ? jdkSrc : "$System.env.JAVA_HOME/src.zip") - if (JavaVersion.current().isJava8Compatible()) - { - options.addStringOption('Xdoclint:none', '-quiet') - } + title = mavenDescription + ' ' + version + options.tags = ['created'] + options.author = true + options.addStringOption('link', 'http://docs.oracle.com/javase/8/docs/api/') + options.addStringOption('sourcepath', project.hasProperty('jdkSrc') ? jdkSrc : "$System.env.JAVA_HOME/src.zip") + if (JavaVersion.current().isJava8Compatible()) { + options.addStringOption('Xdoclint:none', '-quiet') + } } test { - useTestNG() + useTestNG() } compileJava { - doFirst { - project.version = getVersion(isRelease) - } + doFirst { + project.version = getVersion(isRelease) + } } clean { - delete deployDir + delete deployDir } task copyToDeploy(type: Copy) { - from jar - into deployDir + from jar + into deployDir } task deploy(dependsOn: ['build', 'copyToDeploy']) { - description = 'Copies all needed files to the ${deployDir} directory.' - group = 'Publishing' - outputs.dir deployDir - inputs.files copyToDeploy - mustRunAfter clean + description = 'Copies all needed files to the ${deployDir} directory.' + group = 'Publishing' + outputs.dir deployDir + inputs.files copyToDeploy + mustRunAfter clean } task wrapper(type: Wrapper) { - gradleVersion = gradle.gradleVersion + gradleVersion = gradle.gradleVersion } task release(dependsOn: ['wrapper', 'clean', 'deploy']) << { - group = 'Publishing' - description = 'Releases new version.' - isRelease = true + group = 'Publishing' + description = 'Releases new version.' + isRelease = true } task pandoc(type: Exec) { - group = 'Documentation' - def pandoc_args = ['--from', 'markdown_github', '--to', 'html5', '-s', '-c', 'github-pandoc.css', '-o', 'README.html', 'README.md'] - if (Os.isFamily(Os.FAMILY_WINDOWS)) - { - commandLine(['cmd', '/c', 'pandoc'] + pandoc_args) - } - else - { - executable 'pandoc' - args pandoc_args - } - standardOutput = new ByteArrayOutputStream() - ext.output = { - return standardOutput.toString() - } -} + group = 'Documentation' + def pandoc_args = ['--from', 'markdown_github', '--to', 'html5', '-s', '-c', 'github-pandoc.css', '-o', 'README.html', 'README.md'] + if (Os.isFamily(Os.FAMILY_WINDOWS)) { + commandLine(['cmd', '/c', 'pandoc'] + pandoc_args) + } else { + executable 'pandoc' + args pandoc_args + } + standardOutput = new ByteArrayOutputStream() + ext.output = { + return standardOutput.toString() + } +} \ No newline at end of file diff --git a/example/build.gradle b/example/build.gradle index 66b8272..c6937a3 100644 --- a/example/build.gradle +++ b/example/build.gradle @@ -1,5 +1,5 @@ plugins { - id "com.ewerk.gradle.plugins.annotation-processor" version "1.0.2" + id "com.ewerk.gradle.plugins.annotation-processor" version "1.0.2" } apply plugin: 'java' apply plugin: 'idea' @@ -11,29 +11,27 @@ def isRelease = 'release' in gradle.startParameter.taskNames def deployDir = 'deploy' // Get version from properties file. Increment patch if specified. -def getVersion(isIncrement = false) -{ - def propsFile = 'version.properties' - def majorKey = 'version.major' - def minorKey = 'version.minor' - def patchKey = 'version.patch' - def metaKey = 'version.buildmeta' - def preKey = 'version.prerelease' - if (isIncrement) - { - ant.propertyfile(file: propsFile) { - entry(key: patchKey, - type: 'int', - default: '-1', - operation: '+') - } - } - def p = new Properties() - file(propsFile).withInputStream { stream -> p.load(stream) } - def metadata = p.getProperty(metaKey, '') - def prerelease = p.getProperty(preKey, '') - return (p.getProperty(majorKey, '1') + '.' + p.getProperty(minorKey, '0') + '.' + p.getProperty(patchKey, '0') + - (prerelease.length() > 0 ? '-' + prerelease : '') + (metadata.length() > 0 ? '+' + metadata : '')) +def getVersion(isIncrement = false) { + def propsFile = 'version.properties' + def majorKey = 'version.major' + def minorKey = 'version.minor' + def patchKey = 'version.patch' + def metaKey = 'version.buildmeta' + def preKey = 'version.prerelease' + if (isIncrement) { + ant.propertyfile(file: propsFile) { + entry(key: patchKey, + type: 'int', + default: '-1', + operation: '+') + } + } + def p = new Properties() + file(propsFile).withInputStream { stream -> p.load(stream) } + def metadata = p.getProperty(metaKey, '') + def prerelease = p.getProperty(preKey, '') + return (p.getProperty(majorKey, '1') + '.' + p.getProperty(minorKey, '0') + '.' + p.getProperty(patchKey, '0') + + (prerelease.length() > 0 ? '-' + prerelease : '') + (metadata.length() > 0 ? '+' + metadata : '')) } version = getVersion() @@ -42,55 +40,53 @@ mainClassName = 'net.thauvin.erik.semver.example.Example' [compileJava, compileTestJava]*.options*.encoding = 'UTF-8' repositories { - mavenLocal() - mavenCentral() + mavenLocal() + mavenCentral() } dependencies { - compileOnly 'net.thauvin.erik:semver:0.9.6-beta' + compileOnly 'net.thauvin.erik:semver:0.9.6-beta' } annotationProcessor { - // Update version, increment on release. - project.version = getVersion(isRelease) - library 'net.thauvin.erik:semver:0.9.6-beta' - processor 'net.thauvin.erik.semver.VersionProcessor' - // sourcesDir 'src/generated/java' + // Update version, increment on release. + project.version = getVersion(isRelease) + library 'net.thauvin.erik:semver:0.9.6-beta' + processor 'net.thauvin.erik.semver.VersionProcessor' + // sourcesDir 'src/generated/java' } compileJava { - options.compilerArgs << '-proc:none' + options.compilerArgs << '-proc:none' } jar { - manifest.attributes('Main-Class': mainClassName) + manifest.attributes('Main-Class': mainClassName) } clean { - delete deployDir + delete deployDir } - task copyToDeploy(type: Copy) { - from jar - into deployDir + from jar + into deployDir } task deploy(dependsOn: ['build', 'copyToDeploy']) { - description = 'Copies all needed files to the ${deployDir} directory.' - group = 'Publishing' - outputs.dir deployDir - inputs.files copyToDeploy - mustRunAfter clean + description = 'Copies all needed files to the ${deployDir} directory.' + group = 'Publishing' + outputs.dir deployDir + inputs.files copyToDeploy + mustRunAfter clean } task release(dependsOn: ['wrapper', 'clean', 'deploy']) << { - group = 'Publishing' - description = 'Releases new version.' - isRelease = true + group = 'Publishing' + description = 'Releases new version.' + isRelease = true } task wrapper(type: Wrapper) { - gradleVersion = gradle.gradleVersion -} - + gradleVersion = gradle.gradleVersion +} \ No newline at end of file diff --git a/example/gradle/wrapper/gradle-wrapper.jar b/example/gradle/wrapper/gradle-wrapper.jar index 13372aef5e24af05341d49695ee84e5f9b594659..3baa851b28c65f87dd36a6748e1a85cf360c1301 100644 GIT binary patch delta 5483 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 DmjXp= delta 5698 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 diff --git a/example/gradle/wrapper/gradle-wrapper.properties b/example/gradle/wrapper/gradle-wrapper.properties index 7968b98..7d773c3 100644 --- a/example/gradle/wrapper/gradle-wrapper.properties +++ b/example/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sat Jan 23 18:16:10 PST 2016 +#Mon Jul 18 17:32:58 PDT 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-bin.zip diff --git a/example/gradlew b/example/gradlew index 9d82f78..27309d9 100644 --- a/example/gradlew +++ b/example/gradlew @@ -6,12 +6,30 @@ ## ############################################################################## -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" @@ -30,6 +48,7 @@ die ( ) { cygwin=false msys=false darwin=false +nonstop=false case "`uname`" in CYGWIN* ) cygwin=true @@ -40,26 +59,11 @@ case "`uname`" in MINGW* ) msys=true ;; + NONSTOP* ) + nonstop=true + ;; esac -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -85,7 +89,7 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then diff --git a/example/gradlew.bat b/example/gradlew.bat index 8a0b282..832fdb6 100644 --- a/example/gradlew.bat +++ b/example/gradlew.bat @@ -8,14 +8,14 @@ @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome @@ -46,7 +46,7 @@ echo location of your Java installation. goto fail :init -@rem Get command-line arguments, handling Windowz variants +@rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args if "%@eval[2+2]" == "4" goto 4NT_args diff --git a/example/src/generated/java/net/thauvin/erik/semver/example/GeneratedVersion.java b/example/src/generated/java/net/thauvin/erik/semver/example/GeneratedVersion.java new file mode 100644 index 0000000..13070df --- /dev/null +++ b/example/src/generated/java/net/thauvin/erik/semver/example/GeneratedVersion.java @@ -0,0 +1,157 @@ +/* + * This file is automatically generated. + * Do not modify! -- ALL CHANGES WILL BE ERASED! + */ +package net.thauvin.erik.semver.example; + +import java.util.Date; + +/** + * Provides semantic version information. + * + * @author Semantic Version + * Annotation Processor + */ +public final class GeneratedVersion { + private final static String buildmeta = ""; + private final static Date date = new Date(1468888435317L); + private final static int major = 3; + private final static int minor = 1; + private final static int patch = 49; + private final static String prerelease = "beta"; + private final static String project = "Example"; + + /** + * Disables the default constructor. + * + * @throws UnsupportedOperationException If the constructor is called. + */ + private GeneratedVersion() + throws UnsupportedOperationException { + throw new UnsupportedOperationException("Illegal constructor call."); + } + + /** + * Returns the build date. + * + * @return The build date. + */ + public static Date getBuildDate() { + return date; + } + + /** + * Returns the project name. + * + * @return The project name, if any. + */ + public static String getProject() { + return project; + } + + /** + * Returns the full version string. + *

+ * Formatted as: + *

+ * MAJOR.MINOR.PATCH[-PRERELEASE][+BUILDMETADATA] + *
+ *

+ * For example: + *

    + *
  • 1.0.0
  • + *
  • 1.0.0-beta
  • + *
  • 1.0.0+20160124144700
  • + *
  • 1.0.0-alpha+001
  • + *
+ * + * @return The version string. + */ + public static String getVersion() { + return Integer.toString(getMajor()) + '.' + + Integer.toString(getMinor()) + '.' + + Integer.toString(getPatch()) + + getPreRelease(true) + getBuildMetadata(true); + } + + /** + * Returns the major version. + * + * @return The major version. + */ + public static int getMajor() { + return major; + } + + /** + * Returns the minor version. + * + * @return The minor version. + */ + public static int getMinor() { + return minor; + } + + /** + * Returns the patch version. + * + * @return The patch version. + */ + public static int getPatch() { + return patch; + } + + /** + * Returns the pre-release version. + * + * @param isHyphen Prepend a hyphen, if true. + * @return The pre-release version, if any. + */ + public static String getPreRelease(final boolean isHyphen) { + if (prerelease.length() > 0) { + if (isHyphen) { + return '-' + prerelease; + } else { + return prerelease; + } + } + + return ""; + } + + /** + * Returns the pre-release version. + * + * @return The pre-release version, if any. + */ + public static String getPreRelease() { + return getPreRelease(false); + } + + /** + * Returns the build metadata. + * + * @param isPlus Prepend a plus sign, if true. + * @return The build metadata, if any. + */ + public static String getBuildMetadata(final boolean isPlus) { + if (buildmeta.length() > 0) { + if (isPlus) { + return '+' + buildmeta; + } else { + return buildmeta; + } + } + + return ""; + } + + /** + * Returns the build metadata. + * + * @return The build metadata, if any. + */ + public static String getBuildMetadata() { + return getBuildMetadata(false); + } +} \ No newline at end of file diff --git a/example/src/main/java/net/thauvin/erik/semver/example/Example.java b/example/src/main/java/net/thauvin/erik/semver/example/Example.java index f854c44..d21035a 100644 --- a/example/src/main/java/net/thauvin/erik/semver/example/Example.java +++ b/example/src/main/java/net/thauvin/erik/semver/example/Example.java @@ -38,28 +38,26 @@ import java.text.SimpleDateFormat; /** * The Example class. * - * @author Erik C. Thauvin + * @author Erik C. Thauvin * @created 2016-01-13 * @since 1.0 */ @Version(properties = "version.properties") -public class Example -{ - public static void main(final String... args) - { - final SimpleDateFormat sdf = new SimpleDateFormat("EEE, d MMM yyyy 'at' HH:mm:ss z"); +public class Example { + public static void main(final String... args) { + final SimpleDateFormat sdf = new SimpleDateFormat("EEE, d MMM yyyy 'at' HH:mm:ss z"); - System.out.println("-----------------------------------------------------"); + System.out.println("-----------------------------------------------------"); - System.out.println(" " + GeneratedVersion.getProject() + ' ' + GeneratedVersion.getVersion()); + System.out.println(" " + GeneratedVersion.getProject() + ' ' + GeneratedVersion.getVersion()); - System.out.println(" Built on: " + sdf.format(GeneratedVersion.getBuildDate())); - System.out.println(" Major: " + GeneratedVersion.getMajor()); - System.out.println(" Minor: " + GeneratedVersion.getMinor()); - System.out.println(" Patch: " + GeneratedVersion.getPatch()); - System.out.println(" PreRelease: " + GeneratedVersion.getPreRelease()); - System.out.println(" BuildMetaData: " + GeneratedVersion.getBuildMetadata()); + System.out.println(" Built on: " + sdf.format(GeneratedVersion.getBuildDate())); + System.out.println(" Major: " + GeneratedVersion.getMajor()); + System.out.println(" Minor: " + GeneratedVersion.getMinor()); + System.out.println(" Patch: " + GeneratedVersion.getPatch()); + System.out.println(" PreRelease: " + GeneratedVersion.getPreRelease()); + System.out.println(" BuildMetaData: " + GeneratedVersion.getBuildMetadata()); - System.out.println("-----------------------------------------------------"); - } + System.out.println("-----------------------------------------------------"); + } } \ No newline at end of file diff --git a/example/version.properties b/example/version.properties index bb3db8e..c99f89d 100644 --- a/example/version.properties +++ b/example/version.properties @@ -1,8 +1,7 @@ -# -#Wed Jul 06 19:28:58 PDT 2016 +#Mon, 18 Jul 2016 17:33:54 -0700 version.prerelease=beta version.project=Example version.minor=1 version.buildmeta= -version.patch=45 +version.patch=49 version.major=3 diff --git a/semver.ipr b/semver.ipr index 47c9c27..26de8dd 100644 --- a/semver.ipr +++ b/semver.ipr @@ -58,10 +58,27 @@ - + + + + + + + + + + + + + + + @@ -199,6 +228,7 @@ + @@ -334,6 +364,15 @@ + + + + + + + + + diff --git a/src/main/java/net/thauvin/erik/semver/Constants.java b/src/main/java/net/thauvin/erik/semver/Constants.java index 9e6f587..25ada5d 100644 --- a/src/main/java/net/thauvin/erik/semver/Constants.java +++ b/src/main/java/net/thauvin/erik/semver/Constants.java @@ -34,85 +34,83 @@ package net.thauvin.erik.semver; /** * The Constants class holds the constant variables used throughout this project. * - * @author Erik C. Thauvin + * @author Erik C. Thauvin * @created 2016-01-13 * @since 1.0 */ -public final class Constants -{ - /** - * The default class name. - */ - public static final String DEFAULT_CLASS_NAME = "GeneratedVersion"; +public final class Constants { + /** + * The default class name. + */ + public static final String DEFAULT_CLASS_NAME = "GeneratedVersion"; - /** - * The default major version. - */ - public static final int DEFAULT_MAJOR = 1; + /** + * The default major version. + */ + public static final int DEFAULT_MAJOR = 1; - /** - * The default minor version. - */ - public static final int DEFAULT_MINOR = 0; + /** + * The default minor version. + */ + public static final int DEFAULT_MINOR = 0; - /** - * The default patch version. - */ - public static final int DEFAULT_PATCH = 0; + /** + * The default patch version. + */ + public static final int DEFAULT_PATCH = 0; - /** - * The default Velocity template. - */ - public static final String DEFAULT_TEMPLATE = "version.vm"; + /** + * The default Velocity template. + */ + public static final String DEFAULT_TEMPLATE = "version.vm"; - /** - * The empty string. - */ - public static final String EMPTY = ""; + /** + * The empty string. + */ + public static final String EMPTY = ""; - /** - * The build metadata property key. - */ - public static final String KEY_VERSION_BUILDMETA = "version.buildmeta"; + /** + * The build metadata property key. + */ + public static final String KEY_VERSION_BUILDMETA = "version.buildmeta"; - /** - * The major version property key. - */ - public static final String KEY_VERSION_MAJOR = "version.major"; + /** + * The major version property key. + */ + public static final String KEY_VERSION_MAJOR = "version.major"; - /** - * The minor version property key. - */ - public static final String KEY_VERSION_MINOR = "version.minor"; + /** + * The minor version property key. + */ + public static final String KEY_VERSION_MINOR = "version.minor"; - /** - * The patch version property key. - */ - public static final String KEY_VERSION_PATCH = "version.patch"; + /** + * The patch version property key. + */ + public static final String KEY_VERSION_PATCH = "version.patch"; - /** - * The pre-release version property key. - */ - public static final String KEY_VERSION_PRERELEASE = "version.prerelease"; + /** + * The pre-release version property key. + */ + public static final String KEY_VERSION_PRERELEASE = "version.prerelease"; - /** - * The project property key. - */ - public static final String KEY_VERSION_PROJECT = "version.project"; + /** + * The project property key. + */ + public static final String KEY_VERSION_PROJECT = "version.project"; - /** - * The velocity properties name. - */ - public static final String VELOCITY_PROPERTIES = "velocity.properties"; + /** + * The velocity properties name. + */ + public static final String VELOCITY_PROPERTIES = "velocity.properties"; - /** - * Disables the default constructor. - * - * @throws UnsupportedOperationException if the constructor is called. - */ - private Constants() - throws UnsupportedOperationException - { - throw new UnsupportedOperationException("Illegal constructor call."); - } + /** + * Disables the default constructor. + * + * @throws UnsupportedOperationException if the constructor is called. + */ + private Constants() + throws UnsupportedOperationException { + throw new UnsupportedOperationException("Illegal constructor call."); + } } \ No newline at end of file diff --git a/src/main/java/net/thauvin/erik/semver/Version.java b/src/main/java/net/thauvin/erik/semver/Version.java index fd1c986..15c1aa8 100644 --- a/src/main/java/net/thauvin/erik/semver/Version.java +++ b/src/main/java/net/thauvin/erik/semver/Version.java @@ -39,41 +39,40 @@ import java.lang.annotation.Target; /** * The Version class implements the annotation interface. * - * @author Erik C. Thauvin + * @author Erik C. Thauvin * @created 2016-01-13 * @since 1.0 */ @Retention(RetentionPolicy.SOURCE) @Target(ElementType.TYPE) -public @interface Version -{ - String buildmeta() default Constants.EMPTY; +public @interface Version { + String buildmeta() default Constants.EMPTY; - String buildmetaKey() default Constants.KEY_VERSION_BUILDMETA; + String buildmetaKey() default Constants.KEY_VERSION_BUILDMETA; - String className() default Constants.DEFAULT_CLASS_NAME; + String className() default Constants.DEFAULT_CLASS_NAME; - int major() default Constants.DEFAULT_MAJOR; + int major() default Constants.DEFAULT_MAJOR; - String majorKey() default Constants.KEY_VERSION_MAJOR; + String majorKey() default Constants.KEY_VERSION_MAJOR; - int minor() default Constants.DEFAULT_MINOR; + int minor() default Constants.DEFAULT_MINOR; - String minorKey() default Constants.KEY_VERSION_MINOR; + String minorKey() default Constants.KEY_VERSION_MINOR; - int patch() default Constants.DEFAULT_PATCH; + int patch() default Constants.DEFAULT_PATCH; - String patchKey() default Constants.KEY_VERSION_PATCH; + String patchKey() default Constants.KEY_VERSION_PATCH; - String prerelease() default Constants.EMPTY; + String prerelease() default Constants.EMPTY; - String prereleaseKey() default Constants.KEY_VERSION_PRERELEASE; + String prereleaseKey() default Constants.KEY_VERSION_PRERELEASE; - String project() default Constants.EMPTY; + String project() default Constants.EMPTY; - String projectKey() default Constants.KEY_VERSION_PROJECT; + String projectKey() default Constants.KEY_VERSION_PROJECT; - String properties() default Constants.EMPTY; + String properties() default Constants.EMPTY; - String template() default Constants.DEFAULT_TEMPLATE; + String template() default Constants.DEFAULT_TEMPLATE; } \ No newline at end of file diff --git a/src/main/java/net/thauvin/erik/semver/VersionInfo.java b/src/main/java/net/thauvin/erik/semver/VersionInfo.java index 6da9672..678573d 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionInfo.java +++ b/src/main/java/net/thauvin/erik/semver/VersionInfo.java @@ -34,203 +34,186 @@ package net.thauvin.erik.semver; /** * The VersionInfo class is used to hold and retrieve the semantic version values. * - * @author Erik C. Thauvin + * @author Erik C. Thauvin * @created 2016-01-16 * @since 1.0 */ -public class VersionInfo -{ - private final long epoch = System.currentTimeMillis(); +public class VersionInfo { + private final long epoch = System.currentTimeMillis(); - private String buildmeta; + private String buildmeta; - private int major; + private int major; - private int minor; + private int minor; - private int patch; + private int patch; - private String prerelease; + private String prerelease; - private String project; + private String project; - /** - * Creates a new object with default values - */ - public VersionInfo() - { - major = Constants.DEFAULT_MAJOR; - minor = Constants.DEFAULT_MINOR; - patch = Constants.DEFAULT_PATCH; - buildmeta = Constants.EMPTY; - prerelease = Constants.EMPTY; - project = Constants.EMPTY; - } + /** + * Creates a new object with default values + */ + public VersionInfo() { + major = Constants.DEFAULT_MAJOR; + minor = Constants.DEFAULT_MINOR; + patch = Constants.DEFAULT_PATCH; + buildmeta = Constants.EMPTY; + prerelease = Constants.EMPTY; + project = Constants.EMPTY; + } - /** - * Creates a new object with values from a {@link net.thauvin.erik.semver.Version Version} object. - * - * @param version The version object. - */ - public VersionInfo(final Version version) - { - major = version.major(); - minor = version.minor(); - patch = version.patch(); - buildmeta = version.buildmeta(); - prerelease = version.prerelease(); - project = version.project(); - } + /** + * Creates a new object with values from a {@link net.thauvin.erik.semver.Version Version} object. + * + * @param version The version object. + */ + public VersionInfo(final Version version) { + major = version.major(); + minor = version.minor(); + patch = version.patch(); + buildmeta = version.buildmeta(); + prerelease = version.prerelease(); + project = version.project(); + } - /** - * Returns the build metadata. - * - * @return The build metadata. - */ - public String getBuildMetadata() - { - return buildmeta; - } + /** + * Returns the build metadata. + * + * @return The build metadata. + */ + public String getBuildMetadata() { + return buildmeta; + } - /** - * Sets the build metadata. - * - * @param buildmeta The new build metadata. - */ - public void setBuildMetadata(final String buildmeta) - { - this.buildmeta = buildmeta; - } + /** + * Sets the build metadata. + * + * @param buildmeta The new build metadata. + */ + public void setBuildMetadata(final String buildmeta) { + this.buildmeta = buildmeta; + } - /** - * Returns the build epoch/Unix timestamp. - * - * @return The build epoch. - */ - public long getEpoch() - { - return epoch; - } + /** + * Returns the build epoch/Unix timestamp. + * + * @return The build epoch. + */ + public long getEpoch() { + return epoch; + } - /** - * Returns the major version. - * - * @return The major version. - */ - public int getMajor() - { - return major; - } + /** + * Returns the major version. + * + * @return The major version. + */ + public int getMajor() { + return major; + } - /** - * Sets the major version. - * - * @param major The new major version. - */ - public void setMajor(final int major) - { - this.major = major; - } + /** + * Sets the major version. + * + * @param major The new major version. + */ + public void setMajor(final int major) { + this.major = major; + } - /** - * Returns the major version. - * - * @return The major version. - */ - public int getMinor() - { - return minor; - } + /** + * Returns the major version. + * + * @return The major version. + */ + public int getMinor() { + return minor; + } - /** - * Sets the minor version. - * - * @param minor The new minor version. - */ - public void setMinor(final int minor) - { - this.minor = minor; - } + /** + * Sets the minor version. + * + * @param minor The new minor version. + */ + public void setMinor(final int minor) { + this.minor = minor; + } - /** - * Returns the patch version. - * - * @return The patch version. - */ - public int getPatch() - { - return patch; - } + /** + * Returns the patch version. + * + * @return The patch version. + */ + public int getPatch() { + return patch; + } - /** - * Sets the patch version. - * - * @param patch The new patch version. - */ - public void setPatch(final int patch) - { - this.patch = patch; - } + /** + * Sets the patch version. + * + * @param patch The new patch version. + */ + public void setPatch(final int patch) { + this.patch = patch; + } - /** - * Returns the pre-release version. - * - * @return The pre-release version. - */ - public String getPreRelease() - { - return prerelease; - } + /** + * Returns the pre-release version. + * + * @return The pre-release version. + */ + public String getPreRelease() { + return prerelease; + } - /** - * Sets the pre-release version. - * - * @param prerelease The new pre-release version. - */ - public void setPreRelease(final String prerelease) - { - this.prerelease = prerelease; - } + /** + * Sets the pre-release version. + * + * @param prerelease The new pre-release version. + */ + public void setPreRelease(final String prerelease) { + this.prerelease = prerelease; + } - /** - * Returns the project name. - * - * @return The project name. - */ - public String getProject() - { - return project; - } + /** + * Returns the project name. + * + * @return The project name. + */ + public String getProject() { + return project; + } - /** - * Sets the project name. - * - * @param project The new project name. - */ - public void setProject(final String project) - { - this.project = project; - } + /** + * Sets the project name. + * + * @param project The new project name. + */ + public void setProject(final String project) { + this.project = project; + } - /** - * Returns the full version string. - *

- * Formatted as: - *

MAJOR.MINOR.PATCH[-PRERELEASE][+BUILDMETADATA]
- *

- * For example: - *

    - *
  • 1.0.0
  • - *
  • 1.0.0-beta
  • - *
  • 1.0.0+20160124144700
  • - *
  • 1.0.0-alpha+001
  • - *
- * - * @return The version string. - */ - public String getVersion() - { - return Integer.toString(major) + '.' + Integer.toString(minor) + '.' + Integer.toString(patch) + ( - prerelease.length() > 0 ? '-' + prerelease : "") + (buildmeta.length() > 0 ? '+' + buildmeta : ""); - } + /** + * Returns the full version string. + *

+ * Formatted as: + *

MAJOR.MINOR.PATCH[-PRERELEASE][+BUILDMETADATA]
+ *

+ * For example: + *

    + *
  • 1.0.0
  • + *
  • 1.0.0-beta
  • + *
  • 1.0.0+20160124144700
  • + *
  • 1.0.0-alpha+001
  • + *
+ * + * @return The version string. + */ + public String getVersion() { + return Integer.toString(major) + '.' + Integer.toString(minor) + '.' + Integer.toString(patch) + ( + prerelease.length() > 0 ? '-' + prerelease : "") + (buildmeta.length() > 0 ? '+' + buildmeta : ""); + } } \ No newline at end of file diff --git a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java index 4a386f8..e62f6e0 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java +++ b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java @@ -52,200 +52,169 @@ import java.util.Set; /** * The VersionProcessor class implements a semantic version annotation processor. * - * @author Erik C. Thauvin + * @author Erik C. Thauvin * @created 2016-01-13 * @since 1.0 */ -public class VersionProcessor extends AbstractProcessor -{ - private Filer filer; +public class VersionProcessor extends AbstractProcessor { + private Filer filer; - private Messager messager; + private Messager messager; - private void error(final String s) - { - log(Diagnostic.Kind.ERROR, s); - } + private void error(final String s) { + log(Diagnostic.Kind.ERROR, s); + } - private void error(final String s, final Throwable t) - { - messager.printMessage(Diagnostic.Kind.ERROR, (t != null ? t.toString() : s)); - } + private void error(final String s, final Throwable t) { + messager.printMessage(Diagnostic.Kind.ERROR, (t != null ? t.toString() : s)); + } - private VersionInfo findValues(final Version version) - throws IOException - { - final VersionInfo versionInfo; + private VersionInfo findValues(final Version version) + throws IOException { + final VersionInfo versionInfo; - if (version.properties().length() > 0) - { - versionInfo = new VersionInfo(); + if (version.properties().length() > 0) { + versionInfo = new VersionInfo(); - final File propsFile = new File(version.properties()); - if (propsFile.exists()) - { - note("Found properties: " + propsFile); - final Properties p = new Properties(); + final File propsFile = new File(version.properties()); + if (propsFile.exists()) { + note("Found properties: " + propsFile); + final Properties p = new Properties(); - try (FileReader reader = new FileReader(propsFile)) - { - p.load(reader); + try (FileReader reader = new FileReader(propsFile)) { + p.load(reader); - versionInfo.setProject(p.getProperty(version.projectKey(), Constants.EMPTY)); - versionInfo.setMajor(parseIntProperty(p, version.majorKey(), Constants.DEFAULT_MAJOR)); - versionInfo.setMinor(parseIntProperty(p, version.minorKey(), Constants.DEFAULT_MINOR)); - versionInfo.setPatch(parseIntProperty(p, version.patchKey(), Constants.DEFAULT_PATCH)); - versionInfo.setBuildMetadata(p.getProperty(version.buildmetaKey(), Constants.EMPTY)); - versionInfo.setPreRelease(p.getProperty(version.prereleaseKey(), Constants.EMPTY)); - } - } - else - { - error("Could not find: " + propsFile); - throw new FileNotFoundException(propsFile + " (The system cannot find the file specified)"); - } - } - else - { - versionInfo = new VersionInfo(version); - } + versionInfo.setProject(p.getProperty(version.projectKey(), Constants.EMPTY)); + versionInfo.setMajor(parseIntProperty(p, version.majorKey(), Constants.DEFAULT_MAJOR)); + versionInfo.setMinor(parseIntProperty(p, version.minorKey(), Constants.DEFAULT_MINOR)); + versionInfo.setPatch(parseIntProperty(p, version.patchKey(), Constants.DEFAULT_PATCH)); + versionInfo.setBuildMetadata(p.getProperty(version.buildmetaKey(), Constants.EMPTY)); + versionInfo.setPreRelease(p.getProperty(version.prereleaseKey(), Constants.EMPTY)); + } + } else { + error("Could not find: " + propsFile); + throw new FileNotFoundException(propsFile + " (The system cannot find the file specified)"); + } + } else { + versionInfo = new VersionInfo(version); + } - return versionInfo; - } + return versionInfo; + } - /** - * {@inheritDoc} - */ - @Override - public Set getSupportedAnnotationTypes() - { - final Set result = new HashSet<>(); - result.add(Version.class.getCanonicalName()); - return result; - } + /** + * {@inheritDoc} + */ + @Override + public Set getSupportedAnnotationTypes() { + final Set result = new HashSet<>(); + result.add(Version.class.getCanonicalName()); + return result; + } - /** - * {@inheritDoc} - */ - @Override - public SourceVersion getSupportedSourceVersion() - { - return SourceVersion.RELEASE_8; - } + /** + * {@inheritDoc} + */ + @Override + public SourceVersion getSupportedSourceVersion() { + return SourceVersion.RELEASE_8; + } - /** - * {@inheritDoc} - */ - @Override - public synchronized void init(final ProcessingEnvironment processingEnv) - { - super.init(processingEnv); - filer = processingEnv.getFiler(); - messager = processingEnv.getMessager(); - } + /** + * {@inheritDoc} + */ + @Override + public synchronized void init(final ProcessingEnvironment processingEnv) { + super.init(processingEnv); + filer = processingEnv.getFiler(); + messager = processingEnv.getMessager(); + } - /** - * {@inheritDoc} - */ - @Override - public boolean process(final Set annotations, final RoundEnvironment roundEnv) - { - for (final Element element : roundEnv.getElementsAnnotatedWith(Version.class)) - { - final Version version = element.getAnnotation(Version.class); - if (element.getKind() == ElementKind.CLASS) - { - final Element enclosingElement = element.getEnclosingElement(); - if (enclosingElement.getKind() == ElementKind.PACKAGE) - { - final PackageElement packageElement = (PackageElement) enclosingElement; - try - { - final VersionInfo versionInfo = findValues(version); - note("Found version: " + versionInfo.getVersion()); - writeTemplate(packageElement.getQualifiedName().toString(), - version.className(), - versionInfo, - version.template()); - } - catch (IOException e) - { - error("IOException occurred while running the annotation processor", e); - } - } - } - } - return true; - } + private void log(final Diagnostic.Kind kind, final String s) { + messager.printMessage(kind, '[' + VersionProcessor.class.getSimpleName() + "] " + s); + } - private void log(final Diagnostic.Kind kind, final String s) - { - messager.printMessage(kind, '[' + VersionProcessor.class.getSimpleName() + "] " + s); - } + private void note(final String s) { + log(Diagnostic.Kind.NOTE, s); + } - private void note(final String s) - { - log(Diagnostic.Kind.NOTE, s); - } + private int parseIntProperty(final Properties p, final String property, final int defaultValue) { + try { + return Integer.parseInt(p.getProperty(property, Integer.toString(defaultValue))); + } catch (NumberFormatException ignore) { + warn("Invalid property value: " + property); + return defaultValue; + } + } - private int parseIntProperty(final Properties p, final String property, final int defaultValue) - { - try - { - return Integer.parseInt(p.getProperty(property, Integer.toString(defaultValue))); - } - catch (NumberFormatException ignore) - { - warn("Invalid property value: " + property); - return defaultValue; - } - } + /** + * {@inheritDoc} + */ + @Override + public boolean process(final Set annotations, final RoundEnvironment roundEnv) { + for (final Element element : roundEnv.getElementsAnnotatedWith(Version.class)) { + final Version version = element.getAnnotation(Version.class); + if (element.getKind() == ElementKind.CLASS) { + final Element enclosingElement = element.getEnclosingElement(); + if (enclosingElement.getKind() == ElementKind.PACKAGE) { + final PackageElement packageElement = (PackageElement) enclosingElement; + try { + final VersionInfo versionInfo = findValues(version); + note("Found version: " + versionInfo.getVersion()); + writeTemplate(packageElement.getQualifiedName().toString(), + version.className(), + versionInfo, + version.template()); + } catch (IOException e) { + error("IOException occurred while running the annotation processor", e); + } + } + } + } + return true; + } - private void warn(final String s) - { - log(Diagnostic.Kind.WARNING, s); - } + private void warn(final String s) { + log(Diagnostic.Kind.WARNING, s); + } - private void writeTemplate(final String packageName, final String className, final VersionInfo versionInfo, - final String template) - throws IOException - { - final Properties p = new Properties(); - final URL url = this.getClass().getClassLoader().getResource(Constants.VELOCITY_PROPERTIES); + private void writeTemplate(final String packageName, + final String className, + final VersionInfo versionInfo, + final String template) + throws IOException { + final Properties p = new Properties(); + final URL url = this.getClass().getClassLoader().getResource(Constants.VELOCITY_PROPERTIES); - if (url != null) - { - p.load(url.openStream()); + if (url != null) { + p.load(url.openStream()); - final VelocityEngine ve = new VelocityEngine(p); - ve.init(); + final VelocityEngine ve = new VelocityEngine(p); + ve.init(); - final VelocityContext vc = new VelocityContext(); - vc.put("packageName", packageName); - vc.put("className", className); - vc.put("project", versionInfo.getProject()); - vc.put("buildmeta", versionInfo.getBuildMetadata()); - vc.put("epoch", versionInfo.getEpoch()); - vc.put("patch", versionInfo.getPatch()); - vc.put("major", versionInfo.getMajor()); - vc.put("minor", versionInfo.getMinor()); - vc.put("prerelease", versionInfo.getPreRelease()); + final VelocityContext vc = new VelocityContext(); + vc.put("packageName", packageName); + vc.put("className", className); + vc.put("project", versionInfo.getProject()); + vc.put("buildmeta", versionInfo.getBuildMetadata()); + vc.put("epoch", versionInfo.getEpoch()); + vc.put("patch", versionInfo.getPatch()); + vc.put("major", versionInfo.getMajor()); + vc.put("minor", versionInfo.getMinor()); + vc.put("prerelease", versionInfo.getPreRelease()); - final Template vt = ve.getTemplate(template); + final Template vt = ve.getTemplate(template); - note("Loaded template: " + vt.getName()); + note("Loaded template: " + vt.getName()); - final JavaFileObject jfo = filer.createSourceFile(packageName + '.' + className); - try (final Writer writer = jfo.openWriter()) - { - vt.merge(vc, writer); - } + final JavaFileObject jfo = filer.createSourceFile(packageName + '.' + className); + try (final Writer writer = jfo.openWriter()) { + vt.merge(vc, writer); + } - note("Generated source: " + jfo.getName()); - } - else - { - error("Could not load '" + Constants.VELOCITY_PROPERTIES + "' from jar."); - } - } + note("Generated source: " + jfo.getName()); + } else { + error("Could not load '" + Constants.VELOCITY_PROPERTIES + "' from jar."); + } + } } \ No newline at end of file From 4c25c756f57de6c32959c98ca756b9262c4fd89c Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 22 Jul 2016 06:48:36 -0700 Subject: [PATCH 005/316] Updated to kobalt 0.867 --- example/kobalt/wrapper/kobalt-wrapper.jar | Bin 8830 -> 9230 bytes .../kobalt/wrapper/kobalt-wrapper.properties | 2 +- example/kobaltw | 3 ++- example/kobaltw.bat | 4 ++++ kobalt/wrapper/kobalt-wrapper.jar | Bin 8734 -> 9230 bytes kobalt/wrapper/kobalt-wrapper.properties | 2 +- kobaltw | 3 ++- kobaltw.bat | 4 ++++ 8 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 example/kobaltw.bat create mode 100644 kobaltw.bat diff --git a/example/kobalt/wrapper/kobalt-wrapper.jar b/example/kobalt/wrapper/kobalt-wrapper.jar index c1788497a9c59da1afeb10cd17f104bd82ff21f4..d3f775ae308acb7c1dc024c62b6cbb596865c961 100644 GIT binary patch delta 8921 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 delta 8518 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÷kD*HSPwyc9 zvXJS}stF)rcjwtek#`TT2=LKpjHDUGzwSCVz4#H7Z#}XS0VeZnBv_ zmx}f!huP*;sSHYO8B#1Vla+LtqN3lDy@liGa&c_`N3$>XOm25di63sw`Wyp?Gx*@-B(C%obCpman&0SOHP} zDObvW+&hNnJ>i(aeEPRts5yC`#%5%XqxtZWXcwYU1#gvO8%usWvQyw&(leF*qSsdy z4M5@H$^TH6+t|NM>O`U~*^=i=ITPf7`Zt4pkaX;Qb}}k!V>_MIg1?&bQJ)uR6mUa{ zErM`&gHF)Hk#*)xA&9m-xC%;Lv$ErC=zExrNuD1}^@WqgRMjIz-KL}lK81ZbD@|fM z$$po#?c$wzoKLIkan(w9qv1DZ9AG%t?ct+KzXxs|GsY(%Ps|KmUcb_}$P$%dKDQ7K%vo9{9r zKN!jBaoT;?5Mr(&3Jd2!lO(W zVi$Q6aVC+7Lf`k@{x4fK{9k_>l2T1{;pNr(&){3@K`DpPDP%hCNdcMkcHtN#dPB#z$e&t}x~_ZJPs zmJyDAM*tklJ;<~r8r7^iX1)A<^m!&);9;osQg-0eihtG7w%v*=M5E!h;{&rzsE2Em zPYMj%(~${Jel%3|H-v27VS^E?RCe4t3g}J?BX?Z*wZC8qo_i<7lwxRRunod%LK$5_ z9^*Z}EC#5J?R_u|DAXG7Rb^`n476SSz6KU-3c&5ae|9I(eZ>>9X@2yOA+))77)4pW z2c(GDPhR@AF7;m@E)G*OEmA(icWB~${Bnfu`#l6g{nZ!=tVlyt2>5LNNU|%vSiPeA z+!V{C61=_L(xrBzG>*Ph(7eq0dFAHkIP$UKeNWaO*;LlQ)fv4^t;c?yudTY^{(5w` z*TuabzBeVOzw$fAc3#4hvu-Sdbtcy8j{#+EcrFI@m#q?`eotHiW+6g9{Fj9sE-d)@ z;>`D+a6pWR(d}2y+ynm}baCB2#dpq$-O$*$XZ><%2edo%{&s%_hiMwdTb(T*A8X20 zwToL^k!hGKX3SkQ2`vKY zyFkp(2}EjDthaKk<_|6}s0C*DqyV}Nu|y2^gDXN>k7=Zzu9*9!IHd=A4A_zkXI`GM zbF+c_{G-v!U%+Vx_C^8=>KFUvj&*MOVuxNtVY^APnsoa|Ps4PIz3ZUkd)g~y^k?Ky zpLpL#LeCQ9s!zM;B~RV`p^-+bQ7u5Fzc;&5#UuHV_kQ{ErEqllyQ8P(C*ZyDs_~L} zJ(kZt?Qex=Hk*O=lHwrXh87MSK|j9bH8~~XFu8MlG4QC=!)u8O_QY`;JalDfm*T%u zojZbRbvrWRKmM3Ke~W=|GTHcOxNsr|7G?(c3>-;qWn74&fdysdo;2}l_w$ISw`032 zJl@vFjKuC@(wil3?N4Hx#O1%7{qB2>)kz sNPNQx!TslWQ24J>Vh|&Q?w^Fh|ECfBqyBe^(I;**GNL8W|8MGl0F(xuwg3PC diff --git a/example/kobalt/wrapper/kobalt-wrapper.properties b/example/kobalt/wrapper/kobalt-wrapper.properties index 40e4395..fa9f1f9 100644 --- a/example/kobalt/wrapper/kobalt-wrapper.properties +++ b/example/kobalt/wrapper/kobalt-wrapper.properties @@ -1 +1 @@ -kobalt.version=0.843 \ No newline at end of file +kobalt.version=0.867 \ No newline at end of file diff --git a/example/kobaltw b/example/kobaltw index b27b3d8..c5186d5 100644 --- a/example/kobaltw +++ b/example/kobaltw @@ -1 +1,2 @@ -java -jar $(dirname $0)/kobalt/wrapper/kobalt-wrapper.jar $* +#!/usr/bin/env sh +java -jar "`dirname "$0"`/kobalt/wrapper/kobalt-wrapper.jar" $* diff --git a/example/kobaltw.bat b/example/kobaltw.bat new file mode 100644 index 0000000..d578071 --- /dev/null +++ b/example/kobaltw.bat @@ -0,0 +1,4 @@ +@echo off +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +java -jar "%DIRNAME%/kobalt/wrapper/kobalt-wrapper.jar" %* diff --git a/kobalt/wrapper/kobalt-wrapper.jar b/kobalt/wrapper/kobalt-wrapper.jar index 6ca6ca57fa38d07d866754a0971cf6e82f5e83b3..d3f775ae308acb7c1dc024c62b6cbb596865c961 100644 GIT binary patch delta 8925 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 delta 8425 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 LBL*@d00000)%|k# diff --git a/kobalt/wrapper/kobalt-wrapper.properties b/kobalt/wrapper/kobalt-wrapper.properties index 9c63a2e..fa9f1f9 100644 --- a/kobalt/wrapper/kobalt-wrapper.properties +++ b/kobalt/wrapper/kobalt-wrapper.properties @@ -1 +1 @@ -kobalt.version=0.853 \ No newline at end of file +kobalt.version=0.867 \ No newline at end of file diff --git a/kobaltw b/kobaltw index b27b3d8..c5186d5 100755 --- a/kobaltw +++ b/kobaltw @@ -1 +1,2 @@ -java -jar $(dirname $0)/kobalt/wrapper/kobalt-wrapper.jar $* +#!/usr/bin/env sh +java -jar "`dirname "$0"`/kobalt/wrapper/kobalt-wrapper.jar" $* diff --git a/kobaltw.bat b/kobaltw.bat new file mode 100644 index 0000000..d578071 --- /dev/null +++ b/kobaltw.bat @@ -0,0 +1,4 @@ +@echo off +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +java -jar "%DIRNAME%/kobalt/wrapper/kobalt-wrapper.jar" %* From c4baf11bcd55d88f6fdf4550c620df0305ec93bb Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Tue, 2 Aug 2016 14:41:46 -0700 Subject: [PATCH 006/316] Updated to Kobalt 0.882 --- .idea/modules/example.iml | 13 ++++++++----- README.html | 12 ++++++------ README.md | 12 ++++++------ example/build.gradle | 4 ++-- example/kobalt/src/Build.kt | 2 +- example/kobalt/wrapper/kobalt-wrapper.jar | Bin 9230 -> 9230 bytes .../kobalt/wrapper/kobalt-wrapper.properties | 2 +- kobalt/src/Build.kt | 9 ++++----- kobalt/wrapper/kobalt-wrapper.jar | Bin 9230 -> 9230 bytes kobalt/wrapper/kobalt-wrapper.properties | 2 +- semver.ipr | 9 --------- .../net/thauvin/erik/semver/VersionInfo.java | 9 +++++++-- version.properties | 4 ++-- 13 files changed, 38 insertions(+), 40 deletions(-) diff --git a/.idea/modules/example.iml b/.idea/modules/example.iml index 3004a6f..5caf6e3 100644 --- a/.idea/modules/example.iml +++ b/.idea/modules/example.iml @@ -1,5 +1,5 @@ - + @@ -16,9 +16,12 @@ - - - - + + + + + + + \ No newline at end of file diff --git a/README.html b/README.html index 7a4c269..3791922 100644 --- a/README.html +++ b/README.html @@ -239,13 +239,13 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf
<dependency>
     <groupId>net.thauvin.erik</groupId>
     <artifactId>semver</artifactId>
-    <version>0.9.6-beta</version>
+    <version>0.9.7</version>
 </dependency>

Gradle

Class Generation

To install and run from Gradle, add the following to the build.gradle file:

dependencies {
-    compile 'net.thauvin.erik:semver:0.9.6-beta'
+    compile 'net.thauvin.erik:semver:0.9.7'
 }

The GeneratedVersion class will be automatically created in the build directory upon compiling.

Class & Source Generation

@@ -255,11 +255,11 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf }

Then add the following to the build.gradle file:

dependencies {
-    compileOnly 'net.thauvin.erik:semver:0.9.6-beta'
+    compileOnly 'net.thauvin.erik:semver:0.9.7'
 }
 
 annotationProcessor {
-    library 'net.thauvin.erik:semver:0.9.6-beta'
+    library 'net.thauvin.erik:semver:0.9.7'
     processor 'net.thauvin.erik.semver.VersionProcessor'
     // sourcesDir 'src/generated/java'
 }
@@ -273,8 +273,8 @@ compileJava {
 

Kobalt

To install and run from Kobalt, add the following to the Build.kt file:

dependencies {
-    apt("net.thauvin.erik:semver:0.9.6-beta")
-    compile("net.thauvin.erik:semver:0.9.6-beta")
+    apt("net.thauvin.erik:semver:0.9.7")
+    compile("net.thauvin.erik:semver:0.9.7")
 }

Please look at the Build.kt file in the example module directory for a sample.

Auto-Increment

diff --git a/README.md b/README.md index 719b7f4..b37691b 100644 --- a/README.md +++ b/README.md @@ -131,7 +131,7 @@ To install and run from [Maven](http://maven.apache.org/), configure an artifact net.thauvin.erik semver - 0.9.6-beta + 0.9.7 ``` @@ -143,7 +143,7 @@ To install and run from [Gradle](https://gradle.org/), add the following to the ```gradle dependencies { - compile 'net.thauvin.erik:semver:0.9.6-beta' + compile 'net.thauvin.erik:semver:0.9.7' } ``` @@ -163,11 +163,11 @@ Then add the following to the `build.gradle` file: ```gradle dependencies { - compileOnly 'net.thauvin.erik:semver:0.9.6-beta' + compileOnly 'net.thauvin.erik:semver:0.9.7' } annotationProcessor { - library 'net.thauvin.erik:semver:0.9.6-beta' + library 'net.thauvin.erik:semver:0.9.7' processor 'net.thauvin.erik.semver.VersionProcessor' // sourcesDir 'src/generated/java' } @@ -188,8 +188,8 @@ To install and run from [Kobalt](http://beust.com/kobalt/), add the following to ```gradle dependencies { - apt("net.thauvin.erik:semver:0.9.6-beta") - compile("net.thauvin.erik:semver:0.9.6-beta") + apt("net.thauvin.erik:semver:0.9.7") + compile("net.thauvin.erik:semver:0.9.7") } ``` diff --git a/example/build.gradle b/example/build.gradle index c6937a3..f7625e6 100644 --- a/example/build.gradle +++ b/example/build.gradle @@ -45,13 +45,13 @@ repositories { } dependencies { - compileOnly 'net.thauvin.erik:semver:0.9.6-beta' + compileOnly 'net.thauvin.erik:semver:0.9.7' } annotationProcessor { // Update version, increment on release. project.version = getVersion(isRelease) - library 'net.thauvin.erik:semver:0.9.6-beta' + library 'net.thauvin.erik:semver:0.9.7' processor 'net.thauvin.erik.semver.VersionProcessor' // sourcesDir 'src/generated/java' } diff --git a/example/kobalt/src/Build.kt b/example/kobalt/src/Build.kt index 70328c6..47b6356 100644 --- a/example/kobalt/src/Build.kt +++ b/example/kobalt/src/Build.kt @@ -39,7 +39,7 @@ val example = project { version = versionFor() val mainClassName = "net.thauvin.erik.semver.example.Example" - val processorJar = "net.thauvin.erik:semver:0.9.6-beta" + val processorJar = "net.thauvin.erik:semver:0.9.7" sourceDirectories { path("src/main/java") diff --git a/example/kobalt/wrapper/kobalt-wrapper.jar b/example/kobalt/wrapper/kobalt-wrapper.jar index d3f775ae308acb7c1dc024c62b6cbb596865c961..5390ba7f081521f8b249efd65d7ad3e27f005b45 100644 GIT binary patch delta 104 zcmeD4==0zU@MdNaVc_84V2Iku=sA(EjRiz+oMEQ~W=y`NWURWu;1Lr;fHylwzJu@; laRvqkQ6LWRW@Hj!Kxmz8r0fLIQlae20Wt)ndh%IiM*vHl8jSz| delta 104 zcmeD4==0zU@MdNaVc_84U~pUb)ng)G8w-fuIKxhfMHV7#Ku>IKZ2cNrVBRb+VDN6Ik!$3T0mokY14L$!C=v0WF&!=>Px# diff --git a/example/kobalt/wrapper/kobalt-wrapper.properties b/example/kobalt/wrapper/kobalt-wrapper.properties index fa9f1f9..f314d6a 100644 --- a/example/kobalt/wrapper/kobalt-wrapper.properties +++ b/example/kobalt/wrapper/kobalt-wrapper.properties @@ -1 +1 @@ -kobalt.version=0.867 \ No newline at end of file +kobalt.version=0.882 \ No newline at end of file diff --git a/kobalt/src/Build.kt b/kobalt/src/Build.kt index 96dc880..84e6fe3 100644 --- a/kobalt/src/Build.kt +++ b/kobalt/src/Build.kt @@ -11,9 +11,9 @@ import java.io.FileInputStream import java.util.* import net.thauvin.erik.kobalt.plugin.exec.* -val repos = repos(localMaven()) +//val repos = repos(localMaven()) -val pl = plugins("net.thauvin.erik:kobalt-exec:0.6.0-beta") +val pl = plugins("net.thauvin.erik:kobalt-exec:0.6.2") fun StringBuilder.prepend(s: String): StringBuilder { if (this.length > 0) { @@ -82,7 +82,6 @@ val semver = project { } } - val example = project { name = "example" @@ -90,7 +89,7 @@ val example = project { version = versionFor(directory) val mainClassName = "net.thauvin.erik.semver.example.Example" - val processorJar = "net.thauvin.erik:semver:0.9.6-beta" + val processorJar = "net.thauvin.erik:semver:0.9.7" sourceDirectories { path("src/main/java") @@ -124,4 +123,4 @@ val example = project { application { mainClass = mainClassName } -} +} \ No newline at end of file diff --git a/kobalt/wrapper/kobalt-wrapper.jar b/kobalt/wrapper/kobalt-wrapper.jar index d3f775ae308acb7c1dc024c62b6cbb596865c961..5390ba7f081521f8b249efd65d7ad3e27f005b45 100644 GIT binary patch delta 104 zcmeD4==0zU@MdNaVc_84V2Iku=sA(EjRiz+oMEQ~W=y`NWURWu;1Lr;fHylwzJu@; laRvqkQ6LWRW@Hj!Kxmz8r0fLIQlae20Wt)ndh%IiM*vHl8jSz| delta 104 zcmeD4==0zU@MdNaVc_84U~pUb)ng)G8w-fuIKxhfMHV7#Ku>IKZ2cNrVBRb+VDN6Ik!$3T0mokY14L$!C=v0WF&!=>Px# diff --git a/kobalt/wrapper/kobalt-wrapper.properties b/kobalt/wrapper/kobalt-wrapper.properties index fa9f1f9..164fe5e 100644 --- a/kobalt/wrapper/kobalt-wrapper.properties +++ b/kobalt/wrapper/kobalt-wrapper.properties @@ -1 +1 @@ -kobalt.version=0.867 \ No newline at end of file +kobalt.version=0.889 \ No newline at end of file diff --git a/semver.ipr b/semver.ipr index 26de8dd..387f1ab 100644 --- a/semver.ipr +++ b/semver.ipr @@ -364,15 +364,6 @@ - - - - - - - - - diff --git a/src/main/java/net/thauvin/erik/semver/VersionInfo.java b/src/main/java/net/thauvin/erik/semver/VersionInfo.java index 678573d..a6819df 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionInfo.java +++ b/src/main/java/net/thauvin/erik/semver/VersionInfo.java @@ -213,7 +213,12 @@ public class VersionInfo { * @return The version string. */ public String getVersion() { - return Integer.toString(major) + '.' + Integer.toString(minor) + '.' + Integer.toString(patch) + ( - prerelease.length() > 0 ? '-' + prerelease : "") + (buildmeta.length() > 0 ? '+' + buildmeta : ""); + return Integer.toString(major) + + '.' + + Integer.toString(minor) + + '.' + + Integer.toString(patch) + + (prerelease.length() > 0 ? '-' + prerelease : "") + + (buildmeta.length() > 0 ? '+' + buildmeta : ""); } } \ No newline at end of file diff --git a/version.properties b/version.properties index 94e8df4..9128115 100644 --- a/version.properties +++ b/version.properties @@ -1,6 +1,6 @@ #Thu, 28 Jan 2016 17:33:17 -0800 version.major=0 version.minor=9 -version.patch=6 +version.patch=7 version.buildmeta= -version.prerelease=beta +version.prerelease= \ No newline at end of file From 210ff2415aeb1f1da72687fd0095c481ffb339a7 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 24 Mar 2017 15:32:40 -0700 Subject: [PATCH 007/316] Updated for Kobalt 1.0.x --- build.gradle | 2 +- example/kobalt/src/Build.kt | 5 +- .../kobalt/wrapper/kobalt-wrapper.properties | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 53636 -> 52928 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 51 ++++++++++-------- gradlew.bat | 14 ++--- kobalt/src/Build.kt | 21 ++++---- kobalt/wrapper/kobalt-wrapper.properties | 2 +- version.properties | 4 +- 10 files changed, 54 insertions(+), 51 deletions(-) diff --git a/build.gradle b/build.gradle index b807226..dfba62e 100644 --- a/build.gradle +++ b/build.gradle @@ -60,7 +60,7 @@ repositories { dependencies { compile 'org.apache.velocity:velocity:1.7' - testCompile 'org.testng:testng:6.9.12' + testCompile 'org.testng:testng:6.9.13.6' } bintray { diff --git a/example/kobalt/src/Build.kt b/example/kobalt/src/Build.kt index 47b6356..477634c 100644 --- a/example/kobalt/src/Build.kt +++ b/example/kobalt/src/Build.kt @@ -1,14 +1,11 @@ -import com.beust.kobalt.localMaven import com.beust.kobalt.plugin.application.application import com.beust.kobalt.plugin.apt.apt import com.beust.kobalt.plugin.packaging.assemble import com.beust.kobalt.plugin.packaging.install import com.beust.kobalt.project -import com.beust.kobalt.repos import java.io.FileInputStream import java.util.* -val repos = repos(localMaven()) fun StringBuilder.prepend(s: String): StringBuilder { if (this.length > 0) { @@ -39,7 +36,7 @@ val example = project { version = versionFor() val mainClassName = "net.thauvin.erik.semver.example.Example" - val processorJar = "net.thauvin.erik:semver:0.9.7" + val processorJar = "net.thauvin.erik:semver:" sourceDirectories { path("src/main/java") diff --git a/example/kobalt/wrapper/kobalt-wrapper.properties b/example/kobalt/wrapper/kobalt-wrapper.properties index f314d6a..8d6fc4f 100644 --- a/example/kobalt/wrapper/kobalt-wrapper.properties +++ b/example/kobalt/wrapper/kobalt-wrapper.properties @@ -1 +1 @@ -kobalt.version=0.882 \ No newline at end of file +kobalt.version=1.0.23 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 13372aef5e24af05341d49695ee84e5f9b594659..6ffa237849ef3607e39c3b334a92a65367962071 100644 GIT binary patch delta 13232 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%0DBjI}u&-Na`}PVPI&_ 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 D(4}09 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 5b19cb3..726785e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sat Jan 16 15:10:14 PST 2016 +#Thu Oct 06 11:49:56 PDT 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-3.1-bin.zip diff --git a/gradlew b/gradlew index 9d82f78..9aa616c 100644 --- a/gradlew +++ b/gradlew @@ -6,12 +6,30 @@ ## ############################################################################## -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" @@ -30,6 +48,7 @@ die ( ) { cygwin=false msys=false darwin=false +nonstop=false case "`uname`" in CYGWIN* ) cygwin=true @@ -40,26 +59,11 @@ case "`uname`" in MINGW* ) msys=true ;; + NONSTOP* ) + nonstop=true + ;; esac -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -85,7 +89,7 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then @@ -157,4 +161,9 @@ function splitJvmOpts() { eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]]; then + cd "$(dirname "$0")" +fi + exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat index 8a0b282..f955316 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -8,14 +8,14 @@ @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome @@ -46,10 +46,9 @@ echo location of your Java installation. goto fail :init -@rem Get command-line arguments, handling Windowz variants +@rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args :win9xME_args @rem Slurp the command line arguments. @@ -60,11 +59,6 @@ set _SKIP=2 if "x%~1" == "x" goto execute set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ :execute @rem Setup the command line diff --git a/kobalt/src/Build.kt b/kobalt/src/Build.kt index 84e6fe3..3617ef4 100644 --- a/kobalt/src/Build.kt +++ b/kobalt/src/Build.kt @@ -1,3 +1,4 @@ +import com.beust.kobalt.file import com.beust.kobalt.localMaven import com.beust.kobalt.plugin.application.application import com.beust.kobalt.plugin.apt.apt @@ -11,9 +12,9 @@ import java.io.FileInputStream import java.util.* import net.thauvin.erik.kobalt.plugin.exec.* -//val repos = repos(localMaven()) - -val pl = plugins("net.thauvin.erik:kobalt-exec:0.6.2") +val bs = buildScript { + plugins("net.thauvin.erik:kobalt-exec:") +} fun StringBuilder.prepend(s: String): StringBuilder { if (this.length > 0) { @@ -57,7 +58,7 @@ val semver = project { } dependenciesTest { - compile("org.testng:testng:6.9.12") + compile("org.testng:testng:6.9.13.6") } javaCompiler { @@ -87,9 +88,11 @@ val example = project { name = "example" directory = "example" version = versionFor(directory) - + + val aptVer = versionFor() val mainClassName = "net.thauvin.erik.semver.example.Example" - val processorJar = "net.thauvin.erik:semver:0.9.7" + //val processorJar = "net.thauvin.erik:semver:" + val processorJar = file("deploy/semver-" + versionFor() + ".jar") sourceDirectories { path("src/main/java") @@ -101,7 +104,7 @@ val example = project { dependencies { apt(processorJar) - compile(processorJar) + compile("org.apache.velocity:velocity:1.7", processorJar) } dependenciesTest { @@ -109,7 +112,7 @@ val example = project { } install { - libDir = "deploy" + libDir = "example/deploy" } assemble { @@ -123,4 +126,4 @@ val example = project { application { mainClass = mainClassName } -} \ No newline at end of file +} diff --git a/kobalt/wrapper/kobalt-wrapper.properties b/kobalt/wrapper/kobalt-wrapper.properties index 164fe5e..8d6fc4f 100644 --- a/kobalt/wrapper/kobalt-wrapper.properties +++ b/kobalt/wrapper/kobalt-wrapper.properties @@ -1 +1 @@ -kobalt.version=0.889 \ No newline at end of file +kobalt.version=1.0.23 \ No newline at end of file diff --git a/version.properties b/version.properties index 9128115..0011a7e 100644 --- a/version.properties +++ b/version.properties @@ -1,6 +1,6 @@ -#Thu, 28 Jan 2016 17:33:17 -0800 +#Thu, 06 Oct 2016 11:49:46 -0700 version.major=0 version.minor=9 version.patch=7 version.buildmeta= -version.prerelease= \ No newline at end of file +version.prerelease= From feed3a51eae9638b6c332a128b250eb9da09c067 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 24 Mar 2017 15:35:53 -0700 Subject: [PATCH 008/316] Updated testng dependency --- kobalt/src/Build.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/kobalt/src/Build.kt b/kobalt/src/Build.kt index 3617ef4..64b0b9a 100644 --- a/kobalt/src/Build.kt +++ b/kobalt/src/Build.kt @@ -58,7 +58,7 @@ val semver = project { } dependenciesTest { - compile("org.testng:testng:6.9.13.6") + compile("org.testng:testng:6.11") } javaCompiler { @@ -88,8 +88,7 @@ val example = project { name = "example" directory = "example" version = versionFor(directory) - - val aptVer = versionFor() + val mainClassName = "net.thauvin.erik.semver.example.Example" //val processorJar = "net.thauvin.erik:semver:" val processorJar = file("deploy/semver-" + versionFor() + ".jar") From 5562a693a915f649781a74fca70721c54723ff0a Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 24 Mar 2017 15:38:14 -0700 Subject: [PATCH 009/316] Updated testng dependency --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index dfba62e..d9d467e 100644 --- a/build.gradle +++ b/build.gradle @@ -60,7 +60,7 @@ repositories { dependencies { compile 'org.apache.velocity:velocity:1.7' - testCompile 'org.testng:testng:6.9.13.6' + testCompile 'org.testng:testng:6.11' } bintray { From 3001a4f8f0460fc05a6d1eb1ff97ca7004641b2d Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 24 Mar 2017 16:23:14 -0700 Subject: [PATCH 010/316] Updated gradle build files with new syntax, etc. --- README.html | 16 +++++++-------- README.md | 20 +++++++++---------- build.gradle | 10 ++++++---- example/build.gradle | 16 ++++++++------- .../erik/semver/example/GeneratedVersion.java | 2 +- 5 files changed, 34 insertions(+), 30 deletions(-) diff --git a/README.html b/README.html index 3791922..54833fc 100644 --- a/README.html +++ b/README.html @@ -217,7 +217,7 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf

In order to easily incorporate with existing projects, the property keys may be assigned custom values:

@Version(
-  properties = "example.properties", 
+  properties = "example.properties",
   majorKey = "example.major",
   minorKey = "example.minor",
   patchKey = "example.patch",
@@ -239,27 +239,27 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf
 
<dependency>
     <groupId>net.thauvin.erik</groupId>
     <artifactId>semver</artifactId>
-    <version>0.9.7</version>
+    <version>0.9.6-beta</version>
 </dependency>

Gradle

Class Generation

To install and run from Gradle, add the following to the build.gradle file:

dependencies {
-    compile 'net.thauvin.erik:semver:0.9.7'
+    compile 'net.thauvin.erik:semver:0.9.6-beta'
 }

The GeneratedVersion class will be automatically created in the build directory upon compiling.

Class & Source Generation

In order to also incorporate the generated source code into the source tree, use the EWERK Annotation Processor Plugin. Start by addding the following to the very top of the build.gradle file:

plugins {
-    id "com.ewerk.gradle.plugins.annotation-processor" version "1.0.2"
+    id "com.ewerk.gradle.plugins.annotation-processor" version "1.0.3"
 }

Then add the following to the build.gradle file:

dependencies {
-    compileOnly 'net.thauvin.erik:semver:0.9.7'
+    compileOnly 'net.thauvin.erik:semver:0.9.6-beta'
 }
 
 annotationProcessor {
-    library 'net.thauvin.erik:semver:0.9.7'
+    library 'net.thauvin.erik:semver:0.9.6-beta'
     processor 'net.thauvin.erik.semver.VersionProcessor'
     // sourcesDir 'src/generated/java'
 }
@@ -273,8 +273,8 @@ compileJava {
 

Kobalt

To install and run from Kobalt, add the following to the Build.kt file:

dependencies {
-    apt("net.thauvin.erik:semver:0.9.7")
-    compile("net.thauvin.erik:semver:0.9.7")
+    apt("net.thauvin.erik:semver:0.9.6-beta")
+    compile("net.thauvin.erik:semver:0.9.6-beta")
 }

Please look at the Build.kt file in the example module directory for a sample.

Auto-Increment

diff --git a/README.md b/README.md index b37691b..1c2b582 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ An [annotation processor](https://docs.oracle.com/javase/8/docs/api/javax/annota This processor was inspired by Cédric Beust's [version-processor](https://github.com/cbeust/version-processor). ## Examples - + * Using annotation elements: ```java @@ -80,7 +80,7 @@ public final class ${className} { The Velocity variables are automatically filled in by the processor. Please also look at this [example](https://github.com/ethauvin/mobibot/blob/master/version.vm) using [`java.time`](https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html) - + ## Elements & Properties The following annotation elements and properties are available: @@ -101,7 +101,7 @@ In order to easily incorporate with existing projects, the property keys may be ```java @Version( - properties = "example.properties", + properties = "example.properties", majorKey = "example.major", minorKey = "example.minor", patchKey = "example.patch", @@ -131,7 +131,7 @@ To install and run from [Maven](http://maven.apache.org/), configure an artifact net.thauvin.erik semver - 0.9.7 + 0.9.6-beta ``` @@ -143,7 +143,7 @@ To install and run from [Gradle](https://gradle.org/), add the following to the ```gradle dependencies { - compile 'net.thauvin.erik:semver:0.9.7' + compile 'net.thauvin.erik:semver:0.9.6-beta' } ``` @@ -155,7 +155,7 @@ In order to also incorporate the generated source code into the `source tree`, u ```gradle plugins { - id "com.ewerk.gradle.plugins.annotation-processor" version "1.0.2" + id "com.ewerk.gradle.plugins.annotation-processor" version "1.0.3" } ``` @@ -163,11 +163,11 @@ Then add the following to the `build.gradle` file: ```gradle dependencies { - compileOnly 'net.thauvin.erik:semver:0.9.7' + compileOnly 'net.thauvin.erik:semver:0.9.6-beta' } annotationProcessor { - library 'net.thauvin.erik:semver:0.9.7' + library 'net.thauvin.erik:semver:0.9.6-beta' processor 'net.thauvin.erik.semver.VersionProcessor' // sourcesDir 'src/generated/java' } @@ -188,8 +188,8 @@ To install and run from [Kobalt](http://beust.com/kobalt/), add the following to ```gradle dependencies { - apt("net.thauvin.erik:semver:0.9.7") - compile("net.thauvin.erik:semver:0.9.7") + apt("net.thauvin.erik:semver:0.9.6-beta") + compile("net.thauvin.erik:semver:0.9.6-beta") } ``` diff --git a/build.gradle b/build.gradle index d9d467e..5a62455 100644 --- a/build.gradle +++ b/build.gradle @@ -193,10 +193,12 @@ task wrapper(type: Wrapper) { gradleVersion = gradle.gradleVersion } -task release(dependsOn: ['wrapper', 'clean', 'deploy']) << { - group = 'Publishing' - description = 'Releases new version.' - isRelease = true +task release(dependsOn: ['wrapper', 'clean', 'deploy']) { + doLast { + group = 'Publishing' + description = 'Releases new version.' + isRelease = true + } } task pandoc(type: Exec) { diff --git a/example/build.gradle b/example/build.gradle index f7625e6..379f4d4 100644 --- a/example/build.gradle +++ b/example/build.gradle @@ -1,5 +1,5 @@ plugins { - id "com.ewerk.gradle.plugins.annotation-processor" version "1.0.2" + id "com.ewerk.gradle.plugins.annotation-processor" version "1.0.3" } apply plugin: 'java' apply plugin: 'idea' @@ -45,13 +45,13 @@ repositories { } dependencies { - compileOnly 'net.thauvin.erik:semver:0.9.7' + compileOnly 'net.thauvin.erik:semver:+' } annotationProcessor { // Update version, increment on release. project.version = getVersion(isRelease) - library 'net.thauvin.erik:semver:0.9.7' + library 'net.thauvin.erik:semver:+' processor 'net.thauvin.erik.semver.VersionProcessor' // sourcesDir 'src/generated/java' } @@ -81,10 +81,12 @@ task deploy(dependsOn: ['build', 'copyToDeploy']) { mustRunAfter clean } -task release(dependsOn: ['wrapper', 'clean', 'deploy']) << { - group = 'Publishing' - description = 'Releases new version.' - isRelease = true +task release(dependsOn: ['wrapper', 'clean', 'deploy']) { + doLast { + group = 'Publishing' + description = 'Releases new version.' + isRelease = true + } } task wrapper(type: Wrapper) { diff --git a/example/src/generated/java/net/thauvin/erik/semver/example/GeneratedVersion.java b/example/src/generated/java/net/thauvin/erik/semver/example/GeneratedVersion.java index 13070df..bf0710c 100644 --- a/example/src/generated/java/net/thauvin/erik/semver/example/GeneratedVersion.java +++ b/example/src/generated/java/net/thauvin/erik/semver/example/GeneratedVersion.java @@ -14,7 +14,7 @@ import java.util.Date; */ public final class GeneratedVersion { private final static String buildmeta = ""; - private final static Date date = new Date(1468888435317L); + private final static Date date = new Date(1490396459441L); private final static int major = 3; private final static int minor = 1; private final static int patch = 49; From 3a5e79f9062d2d796ea17188a0c604b70aeeef89 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 24 Mar 2017 16:26:32 -0700 Subject: [PATCH 011/316] Updated EWERKS plugin location. --- README.html | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.html b/README.html index 54833fc..576afdd 100644 --- a/README.html +++ b/README.html @@ -249,7 +249,7 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf }

The GeneratedVersion class will be automatically created in the build directory upon compiling.

Class & Source Generation

-

In order to also incorporate the generated source code into the source tree, use the EWERK Annotation Processor Plugin. Start by addding the following to the very top of the build.gradle file:

+

In order to also incorporate the generated source code into the source tree, use the EWERK Annotation Processor Plugin. Start by addding the following to the very top of the build.gradle file:

plugins {
     id "com.ewerk.gradle.plugins.annotation-processor" version "1.0.3"
 }
diff --git a/README.md b/README.md index 1c2b582..4c12a3a 100644 --- a/README.md +++ b/README.md @@ -151,7 +151,7 @@ The `GeneratedVersion` class will be automatically created in the `build` direct #### Class & Source Generation -In order to also incorporate the generated source code into the `source tree`, use the [EWERK Annotation Processor Plugin](https://github.com/ewerk/gradle-plugins/tree/master/plugins/annotation-processor-plugin). Start by addding the following to the very top of the `build.gradle` file: +In order to also incorporate the generated source code into the `source tree`, use the [EWERK Annotation Processor Plugin](https://github.com/ewerk/gradle-plugins/tree/master/annotation-processor-plugin). Start by addding the following to the very top of the `build.gradle` file: ```gradle plugins { From 733576c580cd345115082811250af777850cfa91 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 25 Mar 2017 17:33:58 -0700 Subject: [PATCH 012/316] Updated for Kobalt 1.0.26 --- example/kobalt/src/Build.kt | 12 ----------- .../kobalt/wrapper/kobalt-wrapper.properties | 2 +- kobalt/src/Build.kt | 20 +++---------------- kobalt/wrapper/kobalt-wrapper.properties | 2 +- 4 files changed, 5 insertions(+), 31 deletions(-) diff --git a/example/kobalt/src/Build.kt b/example/kobalt/src/Build.kt index 477634c..d123d2b 100644 --- a/example/kobalt/src/Build.kt +++ b/example/kobalt/src/Build.kt @@ -38,23 +38,11 @@ val example = project { val mainClassName = "net.thauvin.erik.semver.example.Example" val processorJar = "net.thauvin.erik:semver:" - sourceDirectories { - path("src/main/java") - } - - sourceDirectoriesTest { - path("src/test/java") - } - dependencies { apt(processorJar) compile(processorJar) } - dependenciesTest { - - } - apt { outputDir = "/src/generated/java/" } diff --git a/example/kobalt/wrapper/kobalt-wrapper.properties b/example/kobalt/wrapper/kobalt-wrapper.properties index 8d6fc4f..0909c8d 100644 --- a/example/kobalt/wrapper/kobalt-wrapper.properties +++ b/example/kobalt/wrapper/kobalt-wrapper.properties @@ -1 +1 @@ -kobalt.version=1.0.23 \ No newline at end of file +kobalt.version=1.0.26 \ No newline at end of file diff --git a/kobalt/src/Build.kt b/kobalt/src/Build.kt index 64b0b9a..7eaa07a 100644 --- a/kobalt/src/Build.kt +++ b/kobalt/src/Build.kt @@ -45,14 +45,6 @@ val semver = project { artifactId = name version = versionFor() - sourceDirectories { - path("src/main/java") - } - - sourceDirectoriesTest { - path("src/test/java") - } - dependencies { compile("org.apache.velocity:velocity:1.7") } @@ -61,9 +53,6 @@ val semver = project { compile("org.testng:testng:6.11") } - javaCompiler { - } - install { libDir = "deploy" } @@ -79,19 +68,17 @@ val semver = project { exec { val args = listOf("--from", "markdown_github", "--to", "html5", "-s", "-c", "github-pandoc.css", "-o", "README.html", "README.md") commandLine(listOf("pandoc") + args, os = setOf(Os.LINUX)) - commandLine(listOf("cmd", "/c", "pandoc") + args, os =setOf(Os.WINDOWS)) + commandLine(listOf("cmd", "/c", "pandoc") + args, os = setOf(Os.WINDOWS)) } } -val example = project { +val example = project(semver){ name = "example" directory = "example" version = versionFor(directory) val mainClassName = "net.thauvin.erik.semver.example.Example" - //val processorJar = "net.thauvin.erik:semver:" - val processorJar = file("deploy/semver-" + versionFor() + ".jar") sourceDirectories { path("src/main/java") @@ -102,8 +89,7 @@ val example = project { } dependencies { - apt(processorJar) - compile("org.apache.velocity:velocity:1.7", processorJar) + compile("org.apache.velocity:velocity:1.7") } dependenciesTest { diff --git a/kobalt/wrapper/kobalt-wrapper.properties b/kobalt/wrapper/kobalt-wrapper.properties index 8d6fc4f..0909c8d 100644 --- a/kobalt/wrapper/kobalt-wrapper.properties +++ b/kobalt/wrapper/kobalt-wrapper.properties @@ -1 +1 @@ -kobalt.version=1.0.23 \ No newline at end of file +kobalt.version=1.0.26 \ No newline at end of file From 13dec4f063b37a4b8d3acbbc3e6add9b246fbf07 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 14 Apr 2017 16:29:43 -0700 Subject: [PATCH 013/316] Added support for generating koltin source file. --- .../net/thauvin/erik/semver/Constants.java | 20 ++-- .../java/net/thauvin/erik/semver/Version.java | 2 + .../thauvin/erik/semver/VersionProcessor.java | 18 +++- src/main/resources/version.vm | 96 +++++++++++-------- 4 files changed, 79 insertions(+), 57 deletions(-) diff --git a/src/main/java/net/thauvin/erik/semver/Constants.java b/src/main/java/net/thauvin/erik/semver/Constants.java index 25ada5d..a9063dd 100644 --- a/src/main/java/net/thauvin/erik/semver/Constants.java +++ b/src/main/java/net/thauvin/erik/semver/Constants.java @@ -43,62 +43,58 @@ public final class Constants { * The default class name. */ public static final String DEFAULT_CLASS_NAME = "GeneratedVersion"; - + /** + * The default java type. + **/ + public static final String DEFAULT_JAVA_TYPE = "java"; /** * The default major version. */ public static final int DEFAULT_MAJOR = 1; - /** * The default minor version. */ public static final int DEFAULT_MINOR = 0; - /** * The default patch version. */ public static final int DEFAULT_PATCH = 0; - /** * The default Velocity template. */ public static final String DEFAULT_TEMPLATE = "version.vm"; - /** * The empty string. */ public static final String EMPTY = ""; - /** * The build metadata property key. */ public static final String KEY_VERSION_BUILDMETA = "version.buildmeta"; - /** * The major version property key. */ public static final String KEY_VERSION_MAJOR = "version.major"; - /** * The minor version property key. */ public static final String KEY_VERSION_MINOR = "version.minor"; - /** * The patch version property key. */ public static final String KEY_VERSION_PATCH = "version.patch"; - /** * The pre-release version property key. */ public static final String KEY_VERSION_PRERELEASE = "version.prerelease"; - /** * The project property key. */ public static final String KEY_VERSION_PROJECT = "version.project"; - + /** + * The kotlin type. + */ + public static final String KOTLIN_TYPE = "kt"; /** * The velocity properties name. */ diff --git a/src/main/java/net/thauvin/erik/semver/Version.java b/src/main/java/net/thauvin/erik/semver/Version.java index 15c1aa8..178eb4d 100644 --- a/src/main/java/net/thauvin/erik/semver/Version.java +++ b/src/main/java/net/thauvin/erik/semver/Version.java @@ -75,4 +75,6 @@ public @interface Version { String properties() default Constants.EMPTY; String template() default Constants.DEFAULT_TEMPLATE; + + String type() default Constants.DEFAULT_JAVA_TYPE; } \ No newline at end of file diff --git a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java index e62f6e0..b5038db 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java +++ b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java @@ -42,7 +42,8 @@ import javax.lang.model.element.ElementKind; import javax.lang.model.element.PackageElement; import javax.lang.model.element.TypeElement; import javax.tools.Diagnostic; -import javax.tools.JavaFileObject; +import javax.tools.FileObject; +import javax.tools.StandardLocation; import java.io.*; import java.net.URL; import java.util.HashSet; @@ -161,7 +162,8 @@ public class VersionProcessor extends AbstractProcessor { try { final VersionInfo versionInfo = findValues(version); note("Found version: " + versionInfo.getVersion()); - writeTemplate(packageElement.getQualifiedName().toString(), + writeTemplate(version.type(), + packageElement.getQualifiedName().toString(), version.className(), versionInfo, version.template()); @@ -178,7 +180,8 @@ public class VersionProcessor extends AbstractProcessor { log(Diagnostic.Kind.WARNING, s); } - private void writeTemplate(final String packageName, + private void writeTemplate(final String type, + final String packageName, final String className, final VersionInfo versionInfo, final String template) @@ -207,7 +210,14 @@ public class VersionProcessor extends AbstractProcessor { note("Loaded template: " + vt.getName()); - final JavaFileObject jfo = filer.createSourceFile(packageName + '.' + className); + final FileObject jfo; + if (type.equalsIgnoreCase(Constants.KOTLIN_TYPE)) { + jfo = filer.createResource(StandardLocation.SOURCE_OUTPUT, packageName, + className + '.' + type); + } else { + jfo = filer.createSourceFile(packageName + '.' + className); + } + try (final Writer writer = jfo.openWriter()) { vt.merge(vc, writer); } diff --git a/src/main/resources/version.vm b/src/main/resources/version.vm index 7e0f798..80bde66 100644 --- a/src/main/resources/version.vm +++ b/src/main/resources/version.vm @@ -28,6 +28,9 @@ import java.util.Date; * Annotation Processor */ public final class ${className} { + private final static String DEFAULT_PRERELEASE_PREFIX = "-"; + private final static string DEFAULT_BUILDMETA_PREFIX = "+"; + private final static String buildmeta = "${buildmeta}"; private final static Date date = new Date(${epoch}L); private final static int major = ${major}; @@ -86,7 +89,7 @@ public final class ${className} { return Integer.toString(getMajor()) + '.' + Integer.toString(getMinor()) + '.' + Integer.toString(getPatch()) - + getPreRelease(true) + getBuildMetadata(true); + + getPreReleaseWithPrefix + getBuildMetadataWithPrefix; } /** @@ -119,46 +122,10 @@ public final class ${className} { /** * Returns the pre-release version. * - * @param isHyphen Prepend a hyphen, if true. - * @return The pre-release version, if any. + * @return The pre-release version, if any */ - public static String getPreRelease(final boolean isHyphen) { - if (prerelease.length() > 0) { - if (isHyphen) { - return '-' + prerelease; - } else { - return prerelease; - } - } - - return ""; - } - - /** - * Returns the pre-release version. - * - * @return The pre-release version, if any. - */ - public static String getPreRelease() { - return getPreRelease(false); - } - - /** - * Returns the build metadata. - * - * @param isPlus Prepend a plus sign, if true. - * @return The build metadata, if any. - */ - public static String getBuildMetadata(final boolean isPlus) { - if (buildmeta.length() > 0) { - if (isPlus) { - return '+' + buildmeta; - } else { - return buildmeta; - } - } - - return ""; + public static int getPreRelease() { + return prerelease; } /** @@ -167,6 +134,53 @@ public final class ${className} { * @return The build metadata, if any. */ public static String getBuildMetadata() { - return getBuildMetadata(false); + return buildmeta; + } + + /** + * Returns the pre-release version with default prefix. + * + * @return The pre-release version, if any. + */ + public static String getPreReleaseWithPrefix() { + return getPreReleaseWithPrefix(DEFAULT_PRERELEASE_PREFIX); + } + + /** + * Returns the pre-release version. + * + * @param prefix The refix to prepend. + * @return The pre-release version, if any. + */ + public static String getPreReleaseWithPrefix(final String prefix) { + if (prerelease.length() > 0 && prefix.length() > 0) { + return prefix + prerelease; + } else { + return prerelease; + } + } + + /** + * Returns the build metadata with default prefix. + * + * @param prefix The prefix to prepend. + * @return The build metadata, if any. + */ + public static String getBuildMetadataWithPrefix() { + return getBuildMetadataWithPrefix(DEFAULT_PRERELEASE_PREFIX); + } + + /** + * Returns the build metadata. + * + * @param prefix Prefix to prepend. + * @return The build metadata, if any. + */ + public static String getBuildMetadataWithPrefix(final String prefix) { + if (buildmeta.length() > 0 && prefix.length() > 0) { + return prefix + buildmeta; + } else { + return buildmeta; + } } } \ No newline at end of file From 5efb2a9e1def884966f773ecfd4c9f58cd33ae94 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 14 Apr 2017 22:27:07 -0700 Subject: [PATCH 014/316] Added support for mustache instead of Velocity. --- .gitignore | 8 +- build.gradle | 2 +- .../net/thauvin/erik/semver/Constants.java | 22 +++-- .../java/net/thauvin/erik/semver/Version.java | 2 +- .../net/thauvin/erik/semver/VersionInfo.java | 81 +++++++++++++----- .../thauvin/erik/semver/VersionProcessor.java | 83 +++++++------------ src/main/resources/semver-kt.mustache | 46 ++++++++++ .../resources/{version.vm => semver.mustache} | 70 +++++++--------- src/main/resources/velocity.properties | 4 - .../thauvin/erik/semver/VersionInfoTest.java | 14 +++- 10 files changed, 199 insertions(+), 133 deletions(-) create mode 100644 src/main/resources/semver-kt.mustache rename src/main/resources/{version.vm => semver.mustache} (61%) delete mode 100644 src/main/resources/velocity.properties diff --git a/.gitignore b/.gitignore index 24f188e..ac3aa13 100644 --- a/.gitignore +++ b/.gitignore @@ -4,8 +4,8 @@ **/.idea/tasks.xml **/.idea/workspace.xml *.iws -.DS_Store .classpath +.DS_Store .gradle .kobalt .nb-gradle @@ -17,12 +17,14 @@ /dist /gen /gradle.properties +/lib/kotlin* +/libs /local.properties /out /proguard-project.txt /project.properties /target /test-output -Thumbs.db ehthumbs.db -kobaltBuild \ No newline at end of file +kobaltBuild +Thumbs.db \ No newline at end of file diff --git a/build.gradle b/build.gradle index 5a62455..5fee110 100644 --- a/build.gradle +++ b/build.gradle @@ -59,7 +59,7 @@ repositories { } dependencies { - compile 'org.apache.velocity:velocity:1.7' + compile 'com.github.spullara.mustache.java:compiler:0.9.4' testCompile 'org.testng:testng:6.11' } diff --git a/src/main/java/net/thauvin/erik/semver/Constants.java b/src/main/java/net/thauvin/erik/semver/Constants.java index a9063dd..dc29230 100644 --- a/src/main/java/net/thauvin/erik/semver/Constants.java +++ b/src/main/java/net/thauvin/erik/semver/Constants.java @@ -43,10 +43,23 @@ public final class Constants { * The default class name. */ public static final String DEFAULT_CLASS_NAME = "GeneratedVersion"; + /** + * The default mustache template. + */ + public static final String DEFAULT_TEMPLATE = "version.mustache"; + /** + * /** + * The default Java mustache template. + */ + public static final String DEFAULT_JAVA_TEMPLATE = "semver.mustache"; /** * The default java type. **/ public static final String DEFAULT_JAVA_TYPE = "java"; + /** + * The default Kotlin mustache template. + */ + public static final String DEFAULT_KOTLIN_TEMPLATE = "semver-kt.mustache"; /** * The default major version. */ @@ -59,14 +72,11 @@ public final class Constants { * The default patch version. */ public static final int DEFAULT_PATCH = 0; - /** - * The default Velocity template. - */ - public static final String DEFAULT_TEMPLATE = "version.vm"; /** * The empty string. */ public static final String EMPTY = ""; + /** * The build metadata property key. */ @@ -95,10 +105,6 @@ public final class Constants { * The kotlin type. */ public static final String KOTLIN_TYPE = "kt"; - /** - * The velocity properties name. - */ - public static final String VELOCITY_PROPERTIES = "velocity.properties"; /** * Disables the default constructor. diff --git a/src/main/java/net/thauvin/erik/semver/Version.java b/src/main/java/net/thauvin/erik/semver/Version.java index 178eb4d..eae0a20 100644 --- a/src/main/java/net/thauvin/erik/semver/Version.java +++ b/src/main/java/net/thauvin/erik/semver/Version.java @@ -74,7 +74,7 @@ public @interface Version { String properties() default Constants.EMPTY; - String template() default Constants.DEFAULT_TEMPLATE; + String template() default Constants.DEFAULT_JAVA_TEMPLATE; String type() default Constants.DEFAULT_JAVA_TYPE; } \ No newline at end of file diff --git a/src/main/java/net/thauvin/erik/semver/VersionInfo.java b/src/main/java/net/thauvin/erik/semver/VersionInfo.java index a6819df..d6648d5 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionInfo.java +++ b/src/main/java/net/thauvin/erik/semver/VersionInfo.java @@ -41,18 +41,16 @@ package net.thauvin.erik.semver; public class VersionInfo { private final long epoch = System.currentTimeMillis(); - private String buildmeta; - + private String buildMeta; + private String className; private int major; - private int minor; - + private String packageName; private int patch; - - private String prerelease; - + private String preRelease; private String project; + /** * Creates a new object with default values */ @@ -60,9 +58,11 @@ public class VersionInfo { major = Constants.DEFAULT_MAJOR; minor = Constants.DEFAULT_MINOR; patch = Constants.DEFAULT_PATCH; - buildmeta = Constants.EMPTY; - prerelease = Constants.EMPTY; + buildMeta = Constants.EMPTY; + preRelease = Constants.EMPTY; project = Constants.EMPTY; + className = Constants.DEFAULT_CLASS_NAME; + packageName = Constants.EMPTY; } /** @@ -74,9 +74,10 @@ public class VersionInfo { major = version.major(); minor = version.minor(); patch = version.patch(); - buildmeta = version.buildmeta(); - prerelease = version.prerelease(); + buildMeta = version.buildmeta(); + preRelease = version.prerelease(); project = version.project(); + className = version.className(); } /** @@ -84,17 +85,35 @@ public class VersionInfo { * * @return The build metadata. */ - public String getBuildMetadata() { - return buildmeta; + public String getBuildMeta() { + return buildMeta; } /** * Sets the build metadata. * - * @param buildmeta The new build metadata. + * @param buildMeta The new build metadata. */ - public void setBuildMetadata(final String buildmeta) { - this.buildmeta = buildmeta; + public void setBuildMeta(final String buildMeta) { + this.buildMeta = buildMeta; + } + + /** + * Returns the class name. + * + * @return The class name. + */ + public String getClassName() { + return className; + } + + /** + * Sets the class name. + * + * @param className The new class name. + */ + public void setClassName(String className) { + this.className = className; } /** @@ -142,6 +161,24 @@ public class VersionInfo { this.minor = minor; } + /** + * Returns the package name. + * + * @return The package name. + */ + public String getPackageName() { + return packageName; + } + + /** + * Sets the package name version. + * + * @param packageName The new patch version. + */ + public void setPackageName(String packageName) { + this.packageName = packageName; + } + /** * Returns the patch version. * @@ -166,16 +203,16 @@ public class VersionInfo { * @return The pre-release version. */ public String getPreRelease() { - return prerelease; + return preRelease; } /** * Sets the pre-release version. * - * @param prerelease The new pre-release version. + * @param preRelease The new pre-release version. */ - public void setPreRelease(final String prerelease) { - this.prerelease = prerelease; + public void setPreRelease(final String preRelease) { + this.preRelease = preRelease; } /** @@ -218,7 +255,7 @@ public class VersionInfo { + Integer.toString(minor) + '.' + Integer.toString(patch) - + (prerelease.length() > 0 ? '-' + prerelease : "") - + (buildmeta.length() > 0 ? '+' + buildmeta : ""); + + (preRelease.length() > 0 ? '-' + preRelease : "") + + (buildMeta.length() > 0 ? '+' + buildMeta : ""); } } \ No newline at end of file diff --git a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java index b5038db..17bd67c 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java +++ b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java @@ -31,9 +31,9 @@ */ package net.thauvin.erik.semver; -import org.apache.velocity.Template; -import org.apache.velocity.VelocityContext; -import org.apache.velocity.app.VelocityEngine; +import com.github.mustachejava.DefaultMustacheFactory; +import com.github.mustachejava.Mustache; +import com.github.mustachejava.MustacheFactory; import javax.annotation.processing.*; import javax.lang.model.SourceVersion; @@ -45,7 +45,6 @@ import javax.tools.Diagnostic; import javax.tools.FileObject; import javax.tools.StandardLocation; import java.io.*; -import java.net.URL; import java.util.HashSet; import java.util.Properties; import java.util.Set; @@ -89,7 +88,7 @@ public class VersionProcessor extends AbstractProcessor { versionInfo.setMajor(parseIntProperty(p, version.majorKey(), Constants.DEFAULT_MAJOR)); versionInfo.setMinor(parseIntProperty(p, version.minorKey(), Constants.DEFAULT_MINOR)); versionInfo.setPatch(parseIntProperty(p, version.patchKey(), Constants.DEFAULT_PATCH)); - versionInfo.setBuildMetadata(p.getProperty(version.buildmetaKey(), Constants.EMPTY)); + versionInfo.setBuildMeta(p.getProperty(version.buildmetaKey(), Constants.EMPTY)); versionInfo.setPreRelease(p.getProperty(version.prereleaseKey(), Constants.EMPTY)); } } else { @@ -161,12 +160,19 @@ public class VersionProcessor extends AbstractProcessor { final PackageElement packageElement = (PackageElement) enclosingElement; try { final VersionInfo versionInfo = findValues(version); + versionInfo.setPackageName(packageElement.getQualifiedName().toString()); note("Found version: " + versionInfo.getVersion()); - writeTemplate(version.type(), - packageElement.getQualifiedName().toString(), - version.className(), - versionInfo, - version.template()); + final String template; + if (version.template().equals(Constants.DEFAULT_JAVA_TEMPLATE) && + new File(Constants.DEFAULT_TEMPLATE).exists()) { + template = Constants.DEFAULT_TEMPLATE; + } else if (version.template().equals(Constants.DEFAULT_JAVA_TEMPLATE) && + version.type().equals(Constants.KOTLIN_TYPE)) { + template = Constants.DEFAULT_KOTLIN_TEMPLATE; + } else { + template = version.template(); + } + writeTemplate(version.type(), versionInfo, template); } catch (IOException e) { error("IOException occurred while running the annotation processor", e); } @@ -180,51 +186,26 @@ public class VersionProcessor extends AbstractProcessor { log(Diagnostic.Kind.WARNING, s); } - private void writeTemplate(final String type, - final String packageName, - final String className, - final VersionInfo versionInfo, - final String template) + private void writeTemplate(final String type, final VersionInfo versionInfo, final String template) throws IOException { - final Properties p = new Properties(); - final URL url = this.getClass().getClassLoader().getResource(Constants.VELOCITY_PROPERTIES); + final MustacheFactory mf = new DefaultMustacheFactory(); + final Mustache mustache = mf.compile(template); - if (url != null) { - p.load(url.openStream()); + note("Loaded template: " + mustache.getName()); - final VelocityEngine ve = new VelocityEngine(p); - ve.init(); - - final VelocityContext vc = new VelocityContext(); - vc.put("packageName", packageName); - vc.put("className", className); - vc.put("project", versionInfo.getProject()); - vc.put("buildmeta", versionInfo.getBuildMetadata()); - vc.put("epoch", versionInfo.getEpoch()); - vc.put("patch", versionInfo.getPatch()); - vc.put("major", versionInfo.getMajor()); - vc.put("minor", versionInfo.getMinor()); - vc.put("prerelease", versionInfo.getPreRelease()); - - final Template vt = ve.getTemplate(template); - - note("Loaded template: " + vt.getName()); - - final FileObject jfo; - if (type.equalsIgnoreCase(Constants.KOTLIN_TYPE)) { - jfo = filer.createResource(StandardLocation.SOURCE_OUTPUT, packageName, - className + '.' + type); - } else { - jfo = filer.createSourceFile(packageName + '.' + className); - } - - try (final Writer writer = jfo.openWriter()) { - vt.merge(vc, writer); - } - - note("Generated source: " + jfo.getName()); + final FileObject jfo; + if (type.equalsIgnoreCase(Constants.KOTLIN_TYPE)) { + jfo = filer.createResource(StandardLocation.SOURCE_OUTPUT, versionInfo.getPackageName(), + versionInfo.getClassName() + '.' + type); } else { - error("Could not load '" + Constants.VELOCITY_PROPERTIES + "' from jar."); + jfo = filer.createSourceFile(versionInfo.getPackageName() + '.' + versionInfo.getClassName()); } + + try (final Writer writer = jfo.openWriter()) { + mustache.execute(writer, versionInfo).flush(); + } + + note("Generated source: " + jfo.getName()); } + } \ No newline at end of file diff --git a/src/main/resources/semver-kt.mustache b/src/main/resources/semver-kt.mustache new file mode 100644 index 0000000..ed26be3 --- /dev/null +++ b/src/main/resources/semver-kt.mustache @@ -0,0 +1,46 @@ +/* + * This file is automatically generated. + * Do not modify! -- ALL CHANGES WILL BE ERASED! + */ +package {{packageName}} + +import java.util.* + +/** + * Provides semantic version information. + * + * @author Semantic Version + * Annotation Processor + */ +open class {{className}} +private constructor() { + companion object { + val project = "{{project}}" + + val buildDate = Date({{epoch}}L) + val major = {{major}} + val minor = {{minor}} + val patch = {{patch}} + val buildMeta = "{{buildMeta}}" + val preRelease = "{{preRelease}}" + + val version: String + get() = ("$major.$minor.$patch" + preReleaseWithPrefix() + buildMetaWithPrefix()) + + fun preReleaseWithPrefix(prefix: String = "-"): String { + return if (preRelease.isNotEmpty() && prefix.isNotEmpty()) { + "$prefix$preRelease" + } else { + preRelease + } + } + + fun buildMetaWithPrefix(prefix: String = "+"): String { + return if (buildMeta.isNotEmpty() && prefix.isNotEmpty()) { + "$prefix$buildMeta" + } else { + buildMeta + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/version.vm b/src/main/resources/semver.mustache similarity index 61% rename from src/main/resources/version.vm rename to src/main/resources/semver.mustache index 80bde66..af49af4 100644 --- a/src/main/resources/version.vm +++ b/src/main/resources/semver.mustache @@ -1,23 +1,8 @@ -############################################################################## -## -## Available variables: -## -## $packageName - The package name. (string) -## $className - The class name. (string) -## $project - The project name. (string) -## $epoch - The build epoch/unix time. (long) -## $major - The major version. (int) -## $minor - The minor version. (int) -## $patch - The patch version. (int) -## $prerelease - The pre-release version. (string) -## $buildmeta - The build metadata version. (string) -## -############################################################################## /* * This file is automatically generated. * Do not modify! -- ALL CHANGES WILL BE ERASED! */ -package ${packageName}; +package {{packageName}}; import java.util.Date; @@ -27,25 +12,26 @@ import java.util.Date; * @author Semantic Version * Annotation Processor */ -public final class ${className} { +public final class {{className}} { private final static String DEFAULT_PRERELEASE_PREFIX = "-"; private final static string DEFAULT_BUILDMETA_PREFIX = "+"; - private final static String buildmeta = "${buildmeta}"; - private final static Date date = new Date(${epoch}L); - private final static int major = ${major}; - private final static int minor = ${minor}; - private final static int patch = ${patch}; - private final static String prerelease = "${prerelease}"; - private final static String project = "${project}"; + private final static String project = "{{project}}"; + private final static Date date = new Date({{epoch}}L); + private final static int major = {{major}}; + private final static int minor = {{minor}}; + private final static int patch = {{patch}}; + private final static String preRelease = "{{preRelease}}"; + private final static String buildMeta = "{{buildMeta}}"; + /** * Disables the default constructor. * * @throws UnsupportedOperationException If the constructor is called. */ - private ${className}() - throws UnsupportedOperationException { + private {{className}}() + throws UnsupportedOperationException { throw new UnsupportedOperationException("Illegal constructor call."); } @@ -87,9 +73,9 @@ public final class ${className} { */ public static String getVersion() { return Integer.toString(getMajor()) + '.' - + Integer.toString(getMinor()) + '.' - + Integer.toString(getPatch()) - + getPreReleaseWithPrefix + getBuildMetadataWithPrefix; + + Integer.toString(getMinor()) + '.' + + Integer.toString(getPatch()) + + getPreReleaseWithPrefix + getBuildMetaWithPrefix; } /** @@ -125,7 +111,7 @@ public final class ${className} { * @return The pre-release version, if any */ public static int getPreRelease() { - return prerelease; + return preRelease; } /** @@ -133,8 +119,8 @@ public final class ${className} { * * @return The build metadata, if any. */ - public static String getBuildMetadata() { - return buildmeta; + public static String getBuildMeta() { + return buildMeta; } /** @@ -149,14 +135,14 @@ public final class ${className} { /** * Returns the pre-release version. * - * @param prefix The refix to prepend. + * @param prefix The prefix to prepend. * @return The pre-release version, if any. */ public static String getPreReleaseWithPrefix(final String prefix) { - if (prerelease.length() > 0 && prefix.length() > 0) { - return prefix + prerelease; + if (preRelease.length() > 0 && prefix.length() > 0) { + return prefix + preRelease; } else { - return prerelease; + return preRelease; } } @@ -166,8 +152,8 @@ public final class ${className} { * @param prefix The prefix to prepend. * @return The build metadata, if any. */ - public static String getBuildMetadataWithPrefix() { - return getBuildMetadataWithPrefix(DEFAULT_PRERELEASE_PREFIX); + public static String getBuildMetaWithPrefix() { + return getBuildMetaWithPrefix(DEFAULT_PRERELEASE_PREFIX); } /** @@ -176,11 +162,11 @@ public final class ${className} { * @param prefix Prefix to prepend. * @return The build metadata, if any. */ - public static String getBuildMetadataWithPrefix(final String prefix) { - if (buildmeta.length() > 0 && prefix.length() > 0) { - return prefix + buildmeta; + public static String getBuildMetaWithPrefix(final String prefix) { + if (buildMeta.length() > 0 && prefix.length() > 0) { + return prefix + buildMeta; } else { - return buildmeta; + return buildMeta; } } } \ No newline at end of file diff --git a/src/main/resources/velocity.properties b/src/main/resources/velocity.properties deleted file mode 100644 index ba28119..0000000 --- a/src/main/resources/velocity.properties +++ /dev/null @@ -1,4 +0,0 @@ -runtime.log.logsystem.class = org.apache.velocity.runtime.log.SystemLogChute -resource.loader = file, class -file.resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoader -class.resource.loader.class = org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader \ No newline at end of file diff --git a/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java b/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java index 90639be..de26917 100644 --- a/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java +++ b/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java @@ -68,12 +68,24 @@ public class VersionInfoTest Assert.assertEquals(version.getVersion(), "3.2.1-beta"); - version.setBuildMetadata("001"); + version.setBuildMeta("001"); Assert.assertEquals(version.getVersion(), "3.2.1-beta+001"); version.setPreRelease(""); Assert.assertEquals(version.getVersion(), "3.2.1+001"); + + version.setPackageName("com.example"); + + Assert.assertEquals(version.getPackageName(), "com.example"); + + version.setProject("Example"); + + Assert.assertEquals(version.getProject(), "Example"); + + version.setClassName("Example"); + + Assert.assertEquals(version.getClassName(), "Example"); } } \ No newline at end of file From 585e4d1df7cafa12220248d50e581bdcc525c801 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 15 Apr 2017 09:49:36 -0700 Subject: [PATCH 015/316] Turned into an object for easier Java access. --- src/main/resources/semver-kt.mustache | 60 ++++++++++++++++----------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/src/main/resources/semver-kt.mustache b/src/main/resources/semver-kt.mustache index ed26be3..e46f7ef 100644 --- a/src/main/resources/semver-kt.mustache +++ b/src/main/resources/semver-kt.mustache @@ -12,35 +12,47 @@ import java.util.* * @author Semantic Version * Annotation Processor */ -open class {{className}} -private constructor() { - companion object { - val project = "{{project}}" +object {{className}} { + @JvmField + val project = "{{project}}" - val buildDate = Date({{epoch}}L) - val major = {{major}} - val minor = {{minor}} - val patch = {{patch}} - val buildMeta = "{{buildMeta}}" - val preRelease = "{{preRelease}}" + @JvmField + val buildDate = Date({{epoch}}L) - val version: String - get() = ("$major.$minor.$patch" + preReleaseWithPrefix() + buildMetaWithPrefix()) + @JvmField + val major = {{major}} - fun preReleaseWithPrefix(prefix: String = "-"): String { - return if (preRelease.isNotEmpty() && prefix.isNotEmpty()) { - "$prefix$preRelease" - } else { - preRelease - } + @JvmField + val minor = {{minor}} + + @JvmField + val patch = {{patch}} + + @JvmField + val buildMeta = "{{buildMeta}}" + + @JvmField + val preRelease = "{{preRelease}}" + + @JvmStatic + val version: String + get() = ("$major.$minor.$patch" + preReleaseWithPrefix() + buildMetaWithPrefix()) + + @JvmStatic + fun preReleaseWithPrefix(prefix: String = "-"): String { + return if (preRelease.isNotEmpty() && prefix.isNotEmpty()) { + "$prefix$preRelease" + } else { + preRelease } + } - fun buildMetaWithPrefix(prefix: String = "+"): String { - return if (buildMeta.isNotEmpty() && prefix.isNotEmpty()) { - "$prefix$buildMeta" - } else { - buildMeta - } + @JvmStatic + fun buildMetaWithPrefix(prefix: String = "+"): String { + return if (buildMeta.isNotEmpty() && prefix.isNotEmpty()) { + "$prefix$buildMeta" + } else { + buildMeta } } } \ No newline at end of file From 80700b2ad7ee2abe1176efba9aed99091d40641d Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 15 Apr 2017 11:43:03 -0700 Subject: [PATCH 016/316] Changed Java template to match the Kotlin template. --- .../thauvin/erik/semver/example/Example.java | 14 +-- src/main/resources/semver.mustache | 108 ++++-------------- 2 files changed, 29 insertions(+), 93 deletions(-) diff --git a/example/src/main/java/net/thauvin/erik/semver/example/Example.java b/example/src/main/java/net/thauvin/erik/semver/example/Example.java index d21035a..2853818 100644 --- a/example/src/main/java/net/thauvin/erik/semver/example/Example.java +++ b/example/src/main/java/net/thauvin/erik/semver/example/Example.java @@ -49,14 +49,14 @@ public class Example { System.out.println("-----------------------------------------------------"); - System.out.println(" " + GeneratedVersion.getProject() + ' ' + GeneratedVersion.getVersion()); + System.out.println(" " + GeneratedVersion.project + ' ' + GeneratedVersion.getVersion()); - System.out.println(" Built on: " + sdf.format(GeneratedVersion.getBuildDate())); - System.out.println(" Major: " + GeneratedVersion.getMajor()); - System.out.println(" Minor: " + GeneratedVersion.getMinor()); - System.out.println(" Patch: " + GeneratedVersion.getPatch()); - System.out.println(" PreRelease: " + GeneratedVersion.getPreRelease()); - System.out.println(" BuildMetaData: " + GeneratedVersion.getBuildMetadata()); + System.out.println(" Built on: " + sdf.format(GeneratedVersion.buildDate)); + System.out.println(" Major: " + GeneratedVersion.major); + System.out.println(" Minor: " + GeneratedVersion.minor); + System.out.println(" Patch: " + GeneratedVersion.patch); + System.out.println(" PreRelease: " + GeneratedVersion.preRelease); + System.out.println(" BuildMetaData: " + GeneratedVersion.buildMeta); System.out.println("-----------------------------------------------------"); } diff --git a/src/main/resources/semver.mustache b/src/main/resources/semver.mustache index af49af4..c10de6b 100644 --- a/src/main/resources/semver.mustache +++ b/src/main/resources/semver.mustache @@ -14,16 +14,15 @@ import java.util.Date; */ public final class {{className}} { private final static String DEFAULT_PRERELEASE_PREFIX = "-"; - private final static string DEFAULT_BUILDMETA_PREFIX = "+"; + private final static String DEFAULT_BUILDMETA_PREFIX = "+"; - private final static String project = "{{project}}"; - private final static Date date = new Date({{epoch}}L); - private final static int major = {{major}}; - private final static int minor = {{minor}}; - private final static int patch = {{patch}}; - private final static String preRelease = "{{preRelease}}"; - private final static String buildMeta = "{{buildMeta}}"; - + final static String project = "{{project}}"; + final static Date buildDate = new Date({{epoch}}L); + final static int major = {{major}}; + final static int minor = {{minor}}; + final static int patch = {{patch}}; + final static String preRelease = "{{preRelease}}"; + final static String buildMeta = "{{buildMeta}}"; /** * Disables the default constructor. @@ -35,24 +34,6 @@ public final class {{className}} { throw new UnsupportedOperationException("Illegal constructor call."); } - /** - * Returns the build date. - * - * @return The build date. - */ - public static Date getBuildDate() { - return date; - } - - /** - * Returns the project name. - * - * @return The project name, if any. - */ - public static String getProject() { - return project; - } - /** * Returns the full version string. *

@@ -72,55 +53,10 @@ public final class {{className}} { * @return The version string. */ public static String getVersion() { - return Integer.toString(getMajor()) + '.' - + Integer.toString(getMinor()) + '.' - + Integer.toString(getPatch()) - + getPreReleaseWithPrefix + getBuildMetaWithPrefix; - } - - /** - * Returns the major version. - * - * @return The major version. - */ - public static int getMajor() { - return major; - } - - /** - * Returns the minor version. - * - * @return The minor version. - */ - public static int getMinor() { - return minor; - } - - /** - * Returns the patch version. - * - * @return The patch version. - */ - public static int getPatch() { - return patch; - } - - /** - * Returns the pre-release version. - * - * @return The pre-release version, if any - */ - public static int getPreRelease() { - return preRelease; - } - - /** - * Returns the build metadata. - * - * @return The build metadata, if any. - */ - public static String getBuildMeta() { - return buildMeta; + return Integer.toString(major) + '.' + + Integer.toString(minor) + '.' + + Integer.toString(patch) + + preReleaseWithPrefix() + buildMetaWithPrefix(); } /** @@ -128,8 +64,8 @@ public final class {{className}} { * * @return The pre-release version, if any. */ - public static String getPreReleaseWithPrefix() { - return getPreReleaseWithPrefix(DEFAULT_PRERELEASE_PREFIX); + public static String preReleaseWithPrefix() { + return preReleaseWithPrefix(DEFAULT_PRERELEASE_PREFIX); } /** @@ -138,11 +74,11 @@ public final class {{className}} { * @param prefix The prefix to prepend. * @return The pre-release version, if any. */ - public static String getPreReleaseWithPrefix(final String prefix) { + public static String preReleaseWithPrefix(final String prefix) { if (preRelease.length() > 0 && prefix.length() > 0) { - return prefix + preRelease; + return prefix + preRelease; } else { - return preRelease; + return preRelease; } } @@ -152,8 +88,8 @@ public final class {{className}} { * @param prefix The prefix to prepend. * @return The build metadata, if any. */ - public static String getBuildMetaWithPrefix() { - return getBuildMetaWithPrefix(DEFAULT_PRERELEASE_PREFIX); + public static String buildMetaWithPrefix() { + return buildMetaWithPrefix(DEFAULT_PRERELEASE_PREFIX); } /** @@ -162,11 +98,11 @@ public final class {{className}} { * @param prefix Prefix to prepend. * @return The build metadata, if any. */ - public static String getBuildMetaWithPrefix(final String prefix) { + public static String buildMetaWithPrefix(final String prefix) { if (buildMeta.length() > 0 && prefix.length() > 0) { - return prefix + buildMeta; + return prefix + buildMeta; } else { - return buildMeta; + return buildMeta; } } } \ No newline at end of file From 3f630c1b5571bf5becef33730380114c177c423e Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 16 Apr 2017 14:21:17 -0700 Subject: [PATCH 017/316] Synchronized java and kotlin templates. --- src/main/resources/semver-kt.mustache | 5 +- src/main/resources/semver.mustache | 84 +++++++++++++-------------- 2 files changed, 42 insertions(+), 47 deletions(-) diff --git a/src/main/resources/semver-kt.mustache b/src/main/resources/semver-kt.mustache index e46f7ef..dee8e90 100644 --- a/src/main/resources/semver-kt.mustache +++ b/src/main/resources/semver-kt.mustache @@ -34,9 +34,8 @@ object {{className}} { @JvmField val preRelease = "{{preRelease}}" - @JvmStatic - val version: String - get() = ("$major.$minor.$patch" + preReleaseWithPrefix() + buildMetaWithPrefix()) + @JvmField + val version = "$major.$minor.$patch" + preReleaseWithPrefix() + buildMetaWithPrefix() @JvmStatic fun preReleaseWithPrefix(prefix: String = "-"): String { diff --git a/src/main/resources/semver.mustache b/src/main/resources/semver.mustache index c10de6b..44ed13d 100644 --- a/src/main/resources/semver.mustache +++ b/src/main/resources/semver.mustache @@ -25,17 +25,7 @@ public final class {{className}} { final static String buildMeta = "{{buildMeta}}"; /** - * Disables the default constructor. - * - * @throws UnsupportedOperationException If the constructor is called. - */ - private {{className}}() - throws UnsupportedOperationException { - throw new UnsupportedOperationException("Illegal constructor call."); - } - - /** - * Returns the full version string. + * The full version string. *

* Formatted as: *

@@ -49,14 +39,44 @@ public final class {{className}} { *
  • 1.0.0+20160124144700
  • *
  • 1.0.0-alpha+001
  • * - * - * @return The version string. */ - public static String getVersion() { - return Integer.toString(major) + '.' - + Integer.toString(minor) + '.' - + Integer.toString(patch) - + preReleaseWithPrefix() + buildMetaWithPrefix(); + final static String version = Integer.toString(major) + '.' + + Integer.toString(minor) + '.' + + Integer.toString(patch) + + preReleaseWithPrefix() + buildMetaWithPrefix(); + + /** + * Disables the default constructor. + * + * @throws UnsupportedOperationException If the constructor is called. + */ + private GeneratedVersion() + throws UnsupportedOperationException { + throw new UnsupportedOperationException("Illegal constructor call."); + } + + /** + * Returns the build metadata with default prefix. + * + * @param prefix The prefix to prepend. + * @return The build metadata, if any. + */ + public static String buildMetaWithPrefix() { + return buildMetaWithPrefix(DEFAULT_PRERELEASE_PREFIX); + } + + /** + * Returns the build metadata. + * + * @param prefix Prefix to prepend. + * @return The build metadata, if any. + */ + public static String buildMetaWithPrefix(final String prefix) { + if (buildMeta.length() > 0 && prefix.length() > 0) { + return prefix + buildMeta; + } else { + return buildMeta; + } } /** @@ -76,33 +96,9 @@ public final class {{className}} { */ public static String preReleaseWithPrefix(final String prefix) { if (preRelease.length() > 0 && prefix.length() > 0) { - return prefix + preRelease; + return prefix + preRelease; } else { - return preRelease; - } - } - - /** - * Returns the build metadata with default prefix. - * - * @param prefix The prefix to prepend. - * @return The build metadata, if any. - */ - public static String buildMetaWithPrefix() { - return buildMetaWithPrefix(DEFAULT_PRERELEASE_PREFIX); - } - - /** - * Returns the build metadata. - * - * @param prefix Prefix to prepend. - * @return The build metadata, if any. - */ - public static String buildMetaWithPrefix(final String prefix) { - if (buildMeta.length() > 0 && prefix.length() > 0) { - return prefix + buildMeta; - } else { - return buildMeta; + return preRelease; } } } \ No newline at end of file From 6d76cceeef501b3327f84b40845683bdf2d9c012 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 16 Apr 2017 14:24:35 -0700 Subject: [PATCH 018/316] Normalized fields and property names. --- .../thauvin/erik/semver/example/Example.java | 4 ++-- .../net/thauvin/erik/semver/Constants.java | 10 ++++----- .../java/net/thauvin/erik/semver/Version.java | 10 ++++----- .../net/thauvin/erik/semver/VersionInfo.java | 6 ++--- .../thauvin/erik/semver/VersionProcessor.java | 22 +++++++++++++------ 5 files changed, 30 insertions(+), 22 deletions(-) diff --git a/example/src/main/java/net/thauvin/erik/semver/example/Example.java b/example/src/main/java/net/thauvin/erik/semver/example/Example.java index 2853818..801d2d8 100644 --- a/example/src/main/java/net/thauvin/erik/semver/example/Example.java +++ b/example/src/main/java/net/thauvin/erik/semver/example/Example.java @@ -1,7 +1,7 @@ /* * Example.java * - * Copyright (c) 2016, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2017, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -49,7 +49,7 @@ public class Example { System.out.println("-----------------------------------------------------"); - System.out.println(" " + GeneratedVersion.project + ' ' + GeneratedVersion.getVersion()); + System.out.println(" " + GeneratedVersion.project + ' ' + GeneratedVersion.version); System.out.println(" Built on: " + sdf.format(GeneratedVersion.buildDate)); System.out.println(" Major: " + GeneratedVersion.major); diff --git a/src/main/java/net/thauvin/erik/semver/Constants.java b/src/main/java/net/thauvin/erik/semver/Constants.java index dc29230..43953d0 100644 --- a/src/main/java/net/thauvin/erik/semver/Constants.java +++ b/src/main/java/net/thauvin/erik/semver/Constants.java @@ -1,7 +1,7 @@ /* * Constants.java * - * Copyright (c) 2016, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2017, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -43,10 +43,6 @@ public final class Constants { * The default class name. */ public static final String DEFAULT_CLASS_NAME = "GeneratedVersion"; - /** - * The default mustache template. - */ - public static final String DEFAULT_TEMPLATE = "version.mustache"; /** * /** * The default Java mustache template. @@ -72,6 +68,10 @@ public final class Constants { * The default patch version. */ public static final int DEFAULT_PATCH = 0; + /** + * The default mustache template. + */ + public static final String DEFAULT_TEMPLATE_NAME = "version.mustache"; /** * The empty string. */ diff --git a/src/main/java/net/thauvin/erik/semver/Version.java b/src/main/java/net/thauvin/erik/semver/Version.java index eae0a20..3ebc381 100644 --- a/src/main/java/net/thauvin/erik/semver/Version.java +++ b/src/main/java/net/thauvin/erik/semver/Version.java @@ -1,7 +1,7 @@ /* * Version.java * - * Copyright (c) 2016, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2017, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -46,9 +46,9 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.SOURCE) @Target(ElementType.TYPE) public @interface Version { - String buildmeta() default Constants.EMPTY; + String buildMeta() default Constants.EMPTY; - String buildmetaKey() default Constants.KEY_VERSION_BUILDMETA; + String buildMetaKey() default Constants.KEY_VERSION_BUILDMETA; String className() default Constants.DEFAULT_CLASS_NAME; @@ -64,9 +64,9 @@ public @interface Version { String patchKey() default Constants.KEY_VERSION_PATCH; - String prerelease() default Constants.EMPTY; + String preRelease() default Constants.EMPTY; - String prereleaseKey() default Constants.KEY_VERSION_PRERELEASE; + String preReleaseKey() default Constants.KEY_VERSION_PRERELEASE; String project() default Constants.EMPTY; diff --git a/src/main/java/net/thauvin/erik/semver/VersionInfo.java b/src/main/java/net/thauvin/erik/semver/VersionInfo.java index d6648d5..3bd19ab 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionInfo.java +++ b/src/main/java/net/thauvin/erik/semver/VersionInfo.java @@ -1,7 +1,7 @@ /* * VersionInfo.java * - * Copyright (c) 2016, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2017, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -74,8 +74,8 @@ public class VersionInfo { major = version.major(); minor = version.minor(); patch = version.patch(); - buildMeta = version.buildmeta(); - preRelease = version.prerelease(); + buildMeta = version.buildMeta(); + preRelease = version.preRelease(); project = version.project(); className = version.className(); } diff --git a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java index 17bd67c..640a52e 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java +++ b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java @@ -1,7 +1,7 @@ /* * VersionProcessor.java * - * Copyright (c) 2016, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2017, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -80,7 +80,7 @@ public class VersionProcessor extends AbstractProcessor { if (propsFile.exists()) { note("Found properties: " + propsFile); final Properties p = new Properties(); - + try (FileReader reader = new FileReader(propsFile)) { p.load(reader); @@ -88,8 +88,8 @@ public class VersionProcessor extends AbstractProcessor { versionInfo.setMajor(parseIntProperty(p, version.majorKey(), Constants.DEFAULT_MAJOR)); versionInfo.setMinor(parseIntProperty(p, version.minorKey(), Constants.DEFAULT_MINOR)); versionInfo.setPatch(parseIntProperty(p, version.patchKey(), Constants.DEFAULT_PATCH)); - versionInfo.setBuildMeta(p.getProperty(version.buildmetaKey(), Constants.EMPTY)); - versionInfo.setPreRelease(p.getProperty(version.prereleaseKey(), Constants.EMPTY)); + versionInfo.setBuildMeta(p.getProperty(version.buildMetaKey(), Constants.EMPTY)); + versionInfo.setPreRelease(p.getProperty(version.preReleaseKey(), Constants.EMPTY)); } } else { error("Could not find: " + propsFile); @@ -164,8 +164,8 @@ public class VersionProcessor extends AbstractProcessor { note("Found version: " + versionInfo.getVersion()); final String template; if (version.template().equals(Constants.DEFAULT_JAVA_TEMPLATE) && - new File(Constants.DEFAULT_TEMPLATE).exists()) { - template = Constants.DEFAULT_TEMPLATE; + new File(Constants.DEFAULT_TEMPLATE_NAME).exists()) { + template = Constants.DEFAULT_TEMPLATE_NAME; } else if (version.template().equals(Constants.DEFAULT_JAVA_TEMPLATE) && version.type().equals(Constants.KOTLIN_TYPE)) { template = Constants.DEFAULT_KOTLIN_TEMPLATE; @@ -191,7 +191,15 @@ public class VersionProcessor extends AbstractProcessor { final MustacheFactory mf = new DefaultMustacheFactory(); final Mustache mustache = mf.compile(template); - note("Loaded template: " + mustache.getName()); + final String templateName; + if (mustache.getName().equals(Constants.DEFAULT_JAVA_TEMPLATE)) { + templateName = "default (java)"; + } else if (mustache.getName().equals(Constants.DEFAULT_KOTLIN_TEMPLATE)) { + templateName = "default (kotlin)"; + } else { + templateName = mustache.getName(); + } + note("Loaded template: " + templateName); final FileObject jfo; if (type.equalsIgnoreCase(Constants.KOTLIN_TYPE)) { From b471f6208db93ea59ecdcb801e41610b3ecfe001 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 16 Apr 2017 14:26:01 -0700 Subject: [PATCH 019/316] Updated copyright. --- LICENSE.txt | 2 +- src/test/java/net/thauvin/erik/semver/VersionInfoTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index 84fe1dc..f30d392 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (c) 2016, Erik C. Thauvin (erik@thauvin.net) +Copyright (c) 2016-2017, Erik C. Thauvin (erik@thauvin.net) All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java b/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java index de26917..8c3e691 100644 --- a/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java +++ b/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java @@ -1,7 +1,7 @@ /* * VersionInfoTest.java * - * Copyright (c) 2016, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2017, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without From 23eff896456acd32eff12480a500c500b4df5217 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Wed, 19 Apr 2017 10:21:47 -0700 Subject: [PATCH 020/316] Kobalt 1.0.71 update. --- .idea/compiler.xml | 9 + .idea/copyright/Erik_s_Copyright_Notice.xml | 6 + .idea/copyright/profiles_settings.xml | 11 + .idea/encodings.xml | 6 + .idea/inspectionProfiles/Project_Default.xml | 53 +++ .idea/kobalt.xml | 17 + .idea/kotlinc.xml | 7 + .idea/misc.xml | 44 ++ .idea/modules.xml | 12 + .idea/modules/example.iml | 27 -- .idea/modules/semver.iml | 26 -- .idea/modules/semver_main.iml | 14 + .idea/modules/semver_test.iml | 19 + .idea/scopes/Source.xml | 3 + .idea/vcs.xml | 6 + README.html | 299 ++++++++---- README.md | 145 +++--- example/example.iml | 45 ++ example/kobalt/src/Build.kt | 11 +- .../kobalt/wrapper/kobalt-wrapper.properties | 2 +- .../erik/semver/example/GeneratedVersion.java | 157 ------- example/version.properties | 10 +- kobalt/src/Build.kt | 86 ++-- kobalt/wrapper/kobalt-wrapper.properties | 2 +- semver.iml | 13 + semver.ipr | 425 ------------------ version.properties | 1 + 27 files changed, 622 insertions(+), 834 deletions(-) create mode 100644 .idea/compiler.xml create mode 100644 .idea/copyright/Erik_s_Copyright_Notice.xml create mode 100644 .idea/copyright/profiles_settings.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/kobalt.xml create mode 100644 .idea/kotlinc.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml delete mode 100644 .idea/modules/example.iml delete mode 100644 .idea/modules/semver.iml create mode 100644 .idea/modules/semver_main.iml create mode 100644 .idea/modules/semver_test.iml create mode 100644 .idea/scopes/Source.xml create mode 100644 .idea/vcs.xml create mode 100644 example/example.iml delete mode 100644 example/src/generated/java/net/thauvin/erik/semver/example/GeneratedVersion.java create mode 100644 semver.iml delete mode 100644 semver.ipr diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..c83099e --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/copyright/Erik_s_Copyright_Notice.xml b/.idea/copyright/Erik_s_Copyright_Notice.xml new file mode 100644 index 0000000..ef51a2d --- /dev/null +++ b/.idea/copyright/Erik_s_Copyright_Notice.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..249e2ff --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..97626ba --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..8ff795e --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,53 @@ + + + + \ No newline at end of file diff --git a/.idea/kobalt.xml b/.idea/kobalt.xml new file mode 100644 index 0000000..426f587 --- /dev/null +++ b/.idea/kobalt.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000..1c24f9a --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..f738a13 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..f9b1200 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/example.iml b/.idea/modules/example.iml deleted file mode 100644 index 5caf6e3..0000000 --- a/.idea/modules/example.iml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/semver.iml b/.idea/modules/semver.iml deleted file mode 100644 index 24fcd77..0000000 --- a/.idea/modules/semver.iml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/semver_main.iml b/.idea/modules/semver_main.iml new file mode 100644 index 0000000..67c6803 --- /dev/null +++ b/.idea/modules/semver_main.iml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/semver_test.iml b/.idea/modules/semver_test.iml new file mode 100644 index 0000000..4a98385 --- /dev/null +++ b/.idea/modules/semver_test.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/scopes/Source.xml b/.idea/scopes/Source.xml new file mode 100644 index 0000000..2f58665 --- /dev/null +++ b/.idea/scopes/Source.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.html b/README.html index 576afdd..b8a9a4d 100644 --- a/README.html +++ b/README.html @@ -51,19 +51,23 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf

    Semantic Version Annotation Processor

    License (3-Clause BSD) Dependency Status Build Status Build status Maven Central Download

    -

    An annotation processor that automatically generates a GeneratedVersion class containing the semantic version (major, minor, patch, etc.) that is read from a Properties file or defined in the annotation.

    +

    An annotation processor that automatically generates a GeneratedVersion class based on a Mustache template and containing the semantic version (major, minor, patch, etc.) that is read from a Properties file or defined in the annotation.

    This processor was inspired by Cédric Beust's version-processor.

    Examples

    • Using annotation elements:
    -
    @Version(major = 1, minor = 0, patch = 0, prerelease = "beta")
    +
    import net.thauvin.erik.semver.Version;
    +
    +@Version(major = 1, minor = 0, patch = 0, preRelease = "beta")
     public class A {
     // ...
    -
    @Version(properties = "version.properties")
    +
    import net.thauvin.erik.semver.Version;
    +
    +@Version(properties = "version.properties")
     public class A {
     // ...
    # version.properties
    @@ -72,146 +76,237 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf
     version.patch=0
     version.prerelease=beta

    Template

    -

    Upon running the annotator processor, a source file GeneratedVersion.java is automatically generated with static methods to access the semantic version data. The source is based on a fully customizable Velocity template.

    -
    @Version(template = "myversion.vm")
    +

    Upon running the annotation processor, a source file GeneratedVersion.java is automatically generated with static methods to access the semantic version data. The source is based on a fully customizable Mustache template.

    +

    To use your own template, simply create a version.mustache file. The processor will automatically look for it.

    +

    To specify your own template name, use:

    +
    @Version(template = "myversion.mustache")
     public class A {
     // ...

    Default Template

    -

    The default template implements the following static methods:

    +

    The default template implements the following static fields:

    - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + + + +
    MethodDescriptionExampleFieldDescriptionExample
    getProjectThe project name, if any.MyProjectprojectThe project name, if any.MyProject
    getBuildDateThe build date.java.util.DatebuildDateThe build date.java.util.Date
    getVersionThe full version string.1.0.0-alpha+001versionThe full version string.1.0.0-alpha+001
    getMajorThe major version.1majorThe major version.1
    getMinorThe minor version.0minorThe minor version.0
    getPatchThe patch version.0patchThe patch version.0
    getPreReleaseThe pre-release version, if any.alphapreReleaseThe pre-release version, if any.alpha
    getBuildMetadataThe build metadata, if any.001buildMetaThe build metadata, if any.001
    +

    And the following methods/functions:

    + +++++ + + + + + + + + + + + + + + + + +
    MethodDescriptionExample
    preReleaseWithPrefix()Returns the pre-release with a prefix, - by default.-alpha
    buildMetaWithPrefix()Returns the build metadata with a prefix, + by default.+001

    Custom Template

    A very simple custom template might look something like:

    -
    /* myversion.vm */
    -package ${packageName}
    +
    /* version.mustache */
    +package {{packageName}}
     
     import java.util.Date;
     
    -public final class ${className} {
    -    public final static String BUILDMETA = "${buildmeta}";
    -    public final static Date DATE = new Date(${epoch}L);
    -    public final static int MAJOR = ${major};
    -    public final static int MINOR = ${minor};
    -    public final static int PATCH = ${patch};
    -    public final static String PRERELEASE = "${prerelease}";
    -    public final static String PROJECT = "${project}";
    +public final class {{className}} {
    +    public final static String PROJECT = "{{project}}";
    +    public final static Date DATE = new Date({{epoch}}L);
    +    public final static int MAJOR = {{major}};
    +    public final static int MINOR = {{minor}};
    +    public final static int PATCH = {{patch}};
    +    public final static String PRERELEASE = "{{preRelease}}";
    +    public final static String BUILDMETA = "{{buildMeta}}";
     }
    -

    The Velocity variables are automatically filled in by the processor.

    -

    Please also look at this example using java.time

    +

    The mustache variables automatically filled in by the processor are:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    VariableDescriptionType
    {{packageName}}The package name.String
    {{className}}The class name.String
    {{project}}The project name.String
    {{epoch}}The build epoch/unix time.long
    {{major}}The major version.int
    {{minor}}The minor version.int
    {{patch}}The patch version.int
    {{preRelease}}The pre/release version.String
    {{buildMeta}}The build metadata version.String
    +

    Please also look at this example using java.time

    Elements & Properties

    The following annotation elements and properties are available:

    - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + + + + + + +
    ElementPropertyDescriptionDefaultElementPropertyDescriptionDefault
    projectversion.projectThe project name.projectversion.projectThe project name.
    majorversion.majorThe major version number.1majorversion.majorThe major version number.1
    minorversion.majorThe minor version number.0minorversion.majorThe minor version number.0
    patchversion.patchThe patch version number.0patchversion.patchThe patch version number.0
    prereleaseversion.prereleaseThe pre-release version.preReleaseversion.prereleaseThe pre-release version.
    buildmetaversion.buildmetaThe build metadata version.buildMetaversion.buildmetaThe build metadata version.
    classNameThe name of the generated class.GeneratedVersionclassNameThe name of the generated class.GeneratedVersion
    propertiesThe properties file.propertiesThe properties file.
    templateThe template file.version.vmtemplateThe template file.version.mustache
    typeEither java or kt for Kotlin.java
    @@ -221,8 +316,8 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf majorKey = "example.major", minorKey = "example.minor", patchKey = "example.patch", - prereleaseKey = "example.prerelease", - buildmetaKey = "example.buildmeta", + preReleaseKey = "example.prerelease", + buildMetaKey = "example.buildmeta", projectKey = "example.project" ) public class Example { @@ -233,39 +328,39 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf example.minor=0 example.patch=0 # ...
    -

    Usage with Maven, Grail and Kobalt

    +

    Usage with Maven, Grail, Kobalt and Kotlin

    Maven

    To install and run from Maven, configure an artifact as follows:

    <dependency>
         <groupId>net.thauvin.erik</groupId>
         <artifactId>semver</artifactId>
    -    <version>0.9.6-beta</version>
    +    <version>1.0</version>
     </dependency>

    Gradle

    Class Generation

    To install and run from Gradle, add the following to the build.gradle file:

    dependencies {
    -    compile 'net.thauvin.erik:semver:0.9.6-beta'
    +    compileOnly 'net.thauvin.erik:semver:1.0'
     }
    -

    The GeneratedVersion class will be automatically created in the build directory upon compiling.

    +

    The GeneratedVersion class will be automatically created in the build/generated directory upon compiling.

    Class & Source Generation

    -

    In order to also incorporate the generated source code into the source tree, use the EWERK Annotation Processor Plugin. Start by addding the following to the very top of the build.gradle file:

    +

    In order to also incorporate the generated source code into the source tree, use the EWERK Annotation Processor Plugin. Start by adding the following to the very top of the build.gradle file:

    plugins {
         id "com.ewerk.gradle.plugins.annotation-processor" version "1.0.3"
     }

    Then add the following to the build.gradle file:

    dependencies {
    -    compileOnly 'net.thauvin.erik:semver:0.9.6-beta'
    +    compileOnly 'net.thauvin.erik:semver:1.0'
     }
     
     annotationProcessor {
    -    library 'net.thauvin.erik:semver:0.9.6-beta'
    +    library 'net.thauvin.erik:semver:1.0'
         processor 'net.thauvin.erik.semver.VersionProcessor'
         // sourcesDir 'src/generated/java'
     }
     
     compileJava {
    -    // Disable the classpath procesor
    +    // Disable the classpath processor
         options.compilerArgs << '-proc:none'
     }

    The plugin implements a separate compile task that only runs the annotation processor and is executed during the build phase.

    @@ -273,10 +368,20 @@ compileJava {

    Kobalt

    To install and run from Kobalt, add the following to the Build.kt file:

    dependencies {
    -    apt("net.thauvin.erik:semver:0.9.6-beta")
    -    compile("net.thauvin.erik:semver:0.9.6-beta")
    +    apt("net.thauvin.erik:semver:1.0")
    +    compileOnly("net.thauvin.erik:semver:1.0")
     }

    Please look at the Build.kt file in the example module directory for a sample.

    +

    Kotlin

    +

    The annotation processor also supports Kotlin.

    +

    To generate a Kotlin version file, simply specify the type as follows:

    +
    import net.thauvin.erik.semver.Version
    +
    +@Version(properties = "version.properties", type="kt")
    +open class Main {
    +// ...
    +

    The Kotlin default template implements the same static fields and functions as the Java template.

    +

    Please look at the Example for Kotlin project for samples on using Gradle and Kobalt.

    Auto-Increment

    Incrementing the version is best left to your favorite build system.

    For a solution using Gradle, please have a look at the build.gradle file in the example module directory. To run the example with patch version auto-incrementing, issue the following command:

    diff --git a/README.md b/README.md index 4c12a3a..3b0f6b9 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![License (3-Clause BSD)](https://img.shields.io/badge/license-BSD%203--Clause-blue.svg?style=flat-square)](http://opensource.org/licenses/BSD-3-Clause) [![Dependency Status](https://www.versioneye.com/user/projects/56a680101b78fd00390001d2/badge.svg?style=flat)](https://www.versioneye.com/user/projects/56a680101b78fd00390001d2) [![Build Status](https://travis-ci.org/ethauvin/semver.svg?branch=master)](https://travis-ci.org/ethauvin/semver) [![Build status](https://ci.appveyor.com/api/projects/status/nbv4mxd1gpxtx69o?svg=true)](https://ci.appveyor.com/project/ethauvin/semver) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver/badge.svg)](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver) [ ![Download](https://api.bintray.com/packages/ethauvin/maven/SemVer/images/download.svg) ](https://bintray.com/ethauvin/maven/SemVer/_latestVersion) -An [annotation processor](https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html) that automatically generates a `GeneratedVersion` class containing the [semantic version](http://semver.org/) (major, minor, patch, etc.) that is read from a `Properties` file or defined in the [annotation](https://docs.oracle.com/javase/tutorial/java/annotations/basics.html). +An [annotation processor](https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html) that automatically generates a `GeneratedVersion` class based on a [Mustache](https://mustache.github.io/) template and containing the [semantic version](http://semver.org/) (major, minor, patch, etc.) that is read from a `Properties` file or defined in the [annotation](https://docs.oracle.com/javase/tutorial/java/annotations/basics.html). This processor was inspired by Cédric Beust's [version-processor](https://github.com/cbeust/version-processor). @@ -11,7 +11,9 @@ This processor was inspired by Cédric Beust's [version-processor](https://githu * Using annotation elements: ```java -@Version(major = 1, minor = 0, patch = 0, prerelease = "beta") +import net.thauvin.erik.semver.Version; + +@Version(major = 1, minor = 0, patch = 0, preRelease = "beta") public class A { // ... ``` @@ -19,6 +21,8 @@ public class A { * Or using a [properties](https://docs.oracle.com/javase/tutorial/essential/environment/properties.html) file: ```java +import net.thauvin.erik.semver.Version; + @Version(properties = "version.properties") public class A { // ... @@ -34,68 +38,92 @@ version.prerelease=beta ## Template -Upon running the annotator processor, a source file [`GeneratedVersion.java`](https://github.com/ethauvin/semver/blob/master/example/src/generated/java/net/thauvin/erik/semver/example/GeneratedVersion.java) is automatically generated with static methods to access the semantic version data. The source is based on a fully customizable [Velocity](http://velocity.apache.org/) template. +Upon running the annotation processor, a source file [`GeneratedVersion.java`](https://github.com/ethauvin/semver/blob/master/example/src/generated/java/net/thauvin/erik/semver/example/GeneratedVersion.java) is automatically generated with static methods to access the semantic version data. The source is based on a fully customizable [Mustache](https://mustache.github.io/) template. + +To use your own template, simply create a `version.mustache` file. The processor will automatically look for it. + +To specify your own template name, use: ```java -@Version(template = "myversion.vm") +@Version(template = "myversion.mustache") public class A { // ... ``` ### Default Template -The [default template](https://github.com/ethauvin/semver/blob/master/src/main/resources/version.vm) implements the following static methods: +The [default template](https://github.com/ethauvin/semver/blob/master/src/main/resources/semver.mustache) implements the following static fields: -Method | Description | Example -------------------|----------------------------------|------------------ -`getProject` | The project name, if any. | `MyProject` -`getBuildDate` | The build date. | [`java.util.Date`](https://docs.oracle.com/javase/8/docs/api/java/util/Date.html) -`getVersion` | The full version string. | `1.0.0-alpha+001` -`getMajor` | The major version. | `1` -`getMinor` | The minor version. | `0` -`getPatch` | The patch version. | `0` -`getPreRelease` | The pre-release version, if any. | `alpha` -`getBuildMetadata`| The build metadata, if any. | `001` +Field | Description | Example +:--------------|:---------------------------------|:----------------- +`project` | The project name, if any. | `MyProject` +`buildDate` | The build date. | [`java.util.Date`](https://docs.oracle.com/javase/8/docs/api/java/util/Date.html) +`version` | The full version string. | `1.0.0-alpha+001` +`major` | The major version. | `1` +`minor` | The minor version. | `0` +`patch` | The patch version. | `0` +`preRelease` | The pre-release version, if any. | `alpha` +`buildMeta` | The build metadata, if any. | `001` + +And the following methods/functions: + +Method | Description | Example +:------------------------|:----------------------------------------------------------|:-------- +`preReleaseWithPrefix()` | Returns the pre-release with a prefix, `-` by default. | `-alpha` +`buildMetaWithPrefix()` | Returns the build metadata with a prefix, `+` by default. | `+001` ### Custom Template A very simple custom template might look something like: ```java -/* myversion.vm */ -package ${packageName} +/* version.mustache */ +package {{packageName}} import java.util.Date; -public final class ${className} { - public final static String BUILDMETA = "${buildmeta}"; - public final static Date DATE = new Date(${epoch}L); - public final static int MAJOR = ${major}; - public final static int MINOR = ${minor}; - public final static int PATCH = ${patch}; - public final static String PRERELEASE = "${prerelease}"; - public final static String PROJECT = "${project}"; +public final class {{className}} { + public final static String PROJECT = "{{project}}"; + public final static Date DATE = new Date({{epoch}}L); + public final static int MAJOR = {{major}}; + public final static int MINOR = {{minor}}; + public final static int PATCH = {{patch}}; + public final static String PRERELEASE = "{{preRelease}}"; + public final static String BUILDMETA = "{{buildMeta}}"; } ``` -The Velocity variables are automatically filled in by the processor. +The mustache variables automatically filled in by the processor are: -Please also look at this [example](https://github.com/ethauvin/mobibot/blob/master/version.vm) using [`java.time`](https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html) +Variable | Description | Type +:-----------------|:----------------------------|:-------- +`{{packageName}}` | The package name. | `String` +`{{className}}` | The class name. | `String` +`{{project}}` | The project name. | `String` +`{{epoch}}` | The build epoch/unix time. | `long` +`{{major}}` | The major version. | `int` +`{{minor}}` | The minor version. | `int` +`{{patch}}` | The patch version. | `int` +`{{preRelease}}` | The pre/release version. | `String` +`{{buildMeta}}` | The build metadata version. | `String` + +Please also look at this [example](https://github.com/ethauvin/mobibot/blob/master/version.mustache) using [`java.time`](https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html) ## Elements & Properties The following annotation elements and properties are available: -Element | Property | Description | Default --------------|----------------------|----------------------------------|------------- -`project` | `version.project` | The project name. | -`major` | `version.major` | The major version number. | `1` -`minor` | `version.major` | The minor version number. | `0` -`patch` | `version.patch` | The patch version number. | `0` -`prerelease` | `version.prerelease` | The pre-release version. | -`buildmeta` | `version.buildmeta` | The build metadata version. | -`className` | | The name of the generated class. | `GeneratedVersion` -`properties` | | The properties file. | -`template` | | The template file. | `version.vm` +Element | Property | Description | Default +:------------|:---------------------|:----------------------------------|:---------------- +`project` | `version.project` | The project name. | +`major` | `version.major` | The major version number. | `1` +`minor` | `version.major` | The minor version number. | `0` +`patch` | `version.patch` | The patch version number. | `0` +`preRelease` | `version.prerelease` | The pre-release version. | +`buildMeta` | `version.buildmeta` | The build metadata version. | +`className` | | The name of the generated class. | `GeneratedVersion` +`properties` | | The properties file. | +`template` | | The template file. | `version.mustache` +`type` | | Either `java` or `kt` for Kotlin. | `java` In order to easily incorporate with existing projects, the property keys may be assigned custom values: @@ -105,8 +133,8 @@ In order to easily incorporate with existing projects, the property keys may be majorKey = "example.major", minorKey = "example.minor", patchKey = "example.patch", - prereleaseKey = "example.prerelease", - buildmetaKey = "example.buildmeta", + preReleaseKey = "example.prerelease", + buildMetaKey = "example.buildmeta", projectKey = "example.project" ) public class Example { @@ -121,7 +149,7 @@ example.minor=0 example.patch=0 # ... ``` -## Usage with Maven, Grail and Kobalt +## Usage with Maven, Grail, Kobalt and Kotlin ### Maven @@ -131,7 +159,7 @@ To install and run from [Maven](http://maven.apache.org/), configure an artifact net.thauvin.erik semver - 0.9.6-beta + 1.0 ``` @@ -143,15 +171,15 @@ To install and run from [Gradle](https://gradle.org/), add the following to the ```gradle dependencies { - compile 'net.thauvin.erik:semver:0.9.6-beta' + compileOnly 'net.thauvin.erik:semver:1.0' } ``` -The `GeneratedVersion` class will be automatically created in the `build` directory upon compiling. +The `GeneratedVersion` class will be automatically created in the `build/generated` directory upon compiling. #### Class & Source Generation -In order to also incorporate the generated source code into the `source tree`, use the [EWERK Annotation Processor Plugin](https://github.com/ewerk/gradle-plugins/tree/master/annotation-processor-plugin). Start by addding the following to the very top of the `build.gradle` file: +In order to also incorporate the generated source code into the `source tree`, use the [EWERK Annotation Processor Plugin](https://github.com/ewerk/gradle-plugins/tree/master/annotation-processor-plugin). Start by adding the following to the very top of the `build.gradle` file: ```gradle plugins { @@ -163,17 +191,17 @@ Then add the following to the `build.gradle` file: ```gradle dependencies { - compileOnly 'net.thauvin.erik:semver:0.9.6-beta' + compileOnly 'net.thauvin.erik:semver:1.0' } annotationProcessor { - library 'net.thauvin.erik:semver:0.9.6-beta' + library 'net.thauvin.erik:semver:1.0' processor 'net.thauvin.erik.semver.VersionProcessor' // sourcesDir 'src/generated/java' } compileJava { - // Disable the classpath procesor + // Disable the classpath processor options.compilerArgs << '-proc:none' } ``` @@ -188,13 +216,30 @@ To install and run from [Kobalt](http://beust.com/kobalt/), add the following to ```gradle dependencies { - apt("net.thauvin.erik:semver:0.9.6-beta") - compile("net.thauvin.erik:semver:0.9.6-beta") + apt("net.thauvin.erik:semver:1.0") + compileOnly("net.thauvin.erik:semver:1.0") } ``` Please look at the [Build.kt](https://github.com/ethauvin/semver/blob/master/example/kobalt/src/Build.kt) file in the [example](https://github.com/ethauvin/semver/tree/master/example) module directory for a sample. +### Kotlin + +The annotation processor also supports [Kotlin](https://kotlinlang.org/). + +To generate a Kotlin version file, simply specify the `type` as follows: + +```kotlin +import net.thauvin.erik.semver.Version + +@Version(properties = "version.properties", type="kt") +open class Main { +// ... +``` +The [Kotlin default template](https://github.com/ethauvin/semver/blob/master/src/main/resources/semver-kt.mustache) implements the same static fields and functions as the [Java template](#default-template). + +Please look at the [Example for Kotlin](https://github.com/ethauvin/semver-example-kotlin) project for samples on using [Gradle](https://gradle.org/) and [Kobalt](http://beust.com/kobalt/). + ### Auto-Increment Incrementing the version is best left to your favorite build system. diff --git a/example/example.iml b/example/example.iml new file mode 100644 index 0000000..581b531 --- /dev/null +++ b/example/example.iml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/example/kobalt/src/Build.kt b/example/kobalt/src/Build.kt index d123d2b..a94373e 100644 --- a/example/kobalt/src/Build.kt +++ b/example/kobalt/src/Build.kt @@ -1,14 +1,13 @@ import com.beust.kobalt.plugin.application.application import com.beust.kobalt.plugin.apt.apt -import com.beust.kobalt.plugin.packaging.assemble -import com.beust.kobalt.plugin.packaging.install +import com.beust.kobalt.plugin.packaging.* import com.beust.kobalt.project import java.io.FileInputStream import java.util.* fun StringBuilder.prepend(s: String): StringBuilder { - if (this.length > 0) { + if (this.isNotEmpty()) { this.insert(0, s) } return this @@ -40,15 +39,15 @@ val example = project { dependencies { apt(processorJar) - compile(processorJar) + compileOnly(processorJar) } apt { - outputDir = "/src/generated/java/" + outputDir = "../src/generated/java/" } install { - libDir = "deploy" + target = "deploy" } assemble { diff --git a/example/kobalt/wrapper/kobalt-wrapper.properties b/example/kobalt/wrapper/kobalt-wrapper.properties index 0909c8d..9709019 100644 --- a/example/kobalt/wrapper/kobalt-wrapper.properties +++ b/example/kobalt/wrapper/kobalt-wrapper.properties @@ -1 +1 @@ -kobalt.version=1.0.26 \ No newline at end of file +kobalt.version=1.0.71 \ No newline at end of file diff --git a/example/src/generated/java/net/thauvin/erik/semver/example/GeneratedVersion.java b/example/src/generated/java/net/thauvin/erik/semver/example/GeneratedVersion.java deleted file mode 100644 index bf0710c..0000000 --- a/example/src/generated/java/net/thauvin/erik/semver/example/GeneratedVersion.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * This file is automatically generated. - * Do not modify! -- ALL CHANGES WILL BE ERASED! - */ -package net.thauvin.erik.semver.example; - -import java.util.Date; - -/** - * Provides semantic version information. - * - * @author Semantic Version - * Annotation Processor - */ -public final class GeneratedVersion { - private final static String buildmeta = ""; - private final static Date date = new Date(1490396459441L); - private final static int major = 3; - private final static int minor = 1; - private final static int patch = 49; - private final static String prerelease = "beta"; - private final static String project = "Example"; - - /** - * Disables the default constructor. - * - * @throws UnsupportedOperationException If the constructor is called. - */ - private GeneratedVersion() - throws UnsupportedOperationException { - throw new UnsupportedOperationException("Illegal constructor call."); - } - - /** - * Returns the build date. - * - * @return The build date. - */ - public static Date getBuildDate() { - return date; - } - - /** - * Returns the project name. - * - * @return The project name, if any. - */ - public static String getProject() { - return project; - } - - /** - * Returns the full version string. - *

    - * Formatted as: - *

    - * MAJOR.MINOR.PATCH[-PRERELEASE][+BUILDMETADATA] - *
    - *

    - * For example: - *

      - *
    • 1.0.0
    • - *
    • 1.0.0-beta
    • - *
    • 1.0.0+20160124144700
    • - *
    • 1.0.0-alpha+001
    • - *
    - * - * @return The version string. - */ - public static String getVersion() { - return Integer.toString(getMajor()) + '.' - + Integer.toString(getMinor()) + '.' - + Integer.toString(getPatch()) - + getPreRelease(true) + getBuildMetadata(true); - } - - /** - * Returns the major version. - * - * @return The major version. - */ - public static int getMajor() { - return major; - } - - /** - * Returns the minor version. - * - * @return The minor version. - */ - public static int getMinor() { - return minor; - } - - /** - * Returns the patch version. - * - * @return The patch version. - */ - public static int getPatch() { - return patch; - } - - /** - * Returns the pre-release version. - * - * @param isHyphen Prepend a hyphen, if true. - * @return The pre-release version, if any. - */ - public static String getPreRelease(final boolean isHyphen) { - if (prerelease.length() > 0) { - if (isHyphen) { - return '-' + prerelease; - } else { - return prerelease; - } - } - - return ""; - } - - /** - * Returns the pre-release version. - * - * @return The pre-release version, if any. - */ - public static String getPreRelease() { - return getPreRelease(false); - } - - /** - * Returns the build metadata. - * - * @param isPlus Prepend a plus sign, if true. - * @return The build metadata, if any. - */ - public static String getBuildMetadata(final boolean isPlus) { - if (buildmeta.length() > 0) { - if (isPlus) { - return '+' + buildmeta; - } else { - return buildmeta; - } - } - - return ""; - } - - /** - * Returns the build metadata. - * - * @return The build metadata, if any. - */ - public static String getBuildMetadata() { - return getBuildMetadata(false); - } -} \ No newline at end of file diff --git a/example/version.properties b/example/version.properties index c99f89d..5588eff 100644 --- a/example/version.properties +++ b/example/version.properties @@ -1,7 +1,7 @@ #Mon, 18 Jul 2016 17:33:54 -0700 -version.prerelease=beta version.project=Example -version.minor=1 -version.buildmeta= -version.patch=49 -version.major=3 +version.major=2 +version.minor=17 +version.patch=52 +version.prerelease=beta +version.buildmeta=007 diff --git a/kobalt/src/Build.kt b/kobalt/src/Build.kt index 7eaa07a..2c8015f 100644 --- a/kobalt/src/Build.kt +++ b/kobalt/src/Build.kt @@ -1,23 +1,20 @@ -import com.beust.kobalt.file -import com.beust.kobalt.localMaven -import com.beust.kobalt.plugin.application.application -import com.beust.kobalt.plugin.apt.apt -import com.beust.kobalt.plugin.java.javaCompiler -import com.beust.kobalt.plugin.packaging.assemble -import com.beust.kobalt.plugin.packaging.install -import com.beust.kobalt.plugins -import com.beust.kobalt.project -import com.beust.kobalt.repos -import java.io.FileInputStream -import java.util.* +import com.beust.kobalt.* +import com.beust.kobalt.plugin.application.* +import com.beust.kobalt.plugin.packaging.* +import com.beust.kobalt.plugin.publish.* import net.thauvin.erik.kobalt.plugin.exec.* +import org.apache.maven.model.* +import java.io.* +import java.util.* val bs = buildScript { + plugins("net.thauvin.erik:kobalt-maven-local:") plugins("net.thauvin.erik:kobalt-exec:") + repos(localMaven()) } fun StringBuilder.prepend(s: String): StringBuilder { - if (this.length > 0) { + if (this.isNotEmpty()) { this.insert(0, s) } return this @@ -45,8 +42,27 @@ val semver = project { artifactId = name version = versionFor() + pom = Model().apply { + description = "Semantic Version Annotation Processor" + url = "https://github.com/ethauvin/semver" + licenses = listOf(License().apply { + name = "BSD 3-Clause" + url = "https://opensource.org/licenses/BSD-3-Clause" + }) + scm = Scm().apply { + url = "https://github.com/ethauvin/semver" + connection = "https://github.com/ethauvin/semver.git" + developerConnection = "git@github.com:ethauvin/semver.git" + } + developers = listOf(Developer().apply { + id = "ethauvin" + name = "Erik C. Thauvin" + email = "erik@thauvin.net" + }) + } + dependencies { - compile("org.apache.velocity:velocity:1.7") + compile("com.github.spullara.mustache.java:compiler:0.9.4") } dependenciesTest { @@ -54,17 +70,29 @@ val semver = project { } install { - libDir = "deploy" + target = "deploy" } assemble { - jar {} + jar { + fatJar = true + } + mavenJars {} } - application { - mainClass = "com.example.Main" + autoGitTag { + enabled = true + message = "Version $version" } + bintray { + publish = true + description = "Release version $version" + vcsTag = version + sign = true + } + + exec { val args = listOf("--from", "markdown_github", "--to", "html5", "-s", "-c", "github-pandoc.css", "-o", "README.html", "README.md") commandLine(listOf("pandoc") + args, os = setOf(Os.LINUX)) @@ -72,7 +100,7 @@ val semver = project { } } -val example = project(semver){ +val example = project(semver) { name = "example" directory = "example" @@ -80,26 +108,6 @@ val example = project(semver){ val mainClassName = "net.thauvin.erik.semver.example.Example" - sourceDirectories { - path("src/main/java") - } - - sourceDirectoriesTest { - path("src/test/java") - } - - dependencies { - compile("org.apache.velocity:velocity:1.7") - } - - dependenciesTest { - - } - - install { - libDir = "example/deploy" - } - assemble { jar { manifest { diff --git a/kobalt/wrapper/kobalt-wrapper.properties b/kobalt/wrapper/kobalt-wrapper.properties index 0909c8d..9709019 100644 --- a/kobalt/wrapper/kobalt-wrapper.properties +++ b/kobalt/wrapper/kobalt-wrapper.properties @@ -1 +1 @@ -kobalt.version=1.0.26 \ No newline at end of file +kobalt.version=1.0.71 \ No newline at end of file diff --git a/semver.iml b/semver.iml new file mode 100644 index 0000000..e624f82 --- /dev/null +++ b/semver.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/semver.ipr b/semver.ipr deleted file mode 100644 index 387f1ab..0000000 --- a/semver.ipr +++ /dev/null @@ -1,425 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Android Lint - - - Java - - - Portability issuesJava - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.8.x - - - - - - - - \ No newline at end of file diff --git a/version.properties b/version.properties index 0011a7e..a836620 100644 --- a/version.properties +++ b/version.properties @@ -1,4 +1,5 @@ #Thu, 06 Oct 2016 11:49:46 -0700 +version.project=semver version.major=0 version.minor=9 version.patch=7 From d3f7130cc7309c85b52c6dac07a2daa19c4c1be0 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 22 Apr 2017 09:08:40 -0700 Subject: [PATCH 021/316] Added public access. --- src/main/resources/semver.mustache | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/main/resources/semver.mustache b/src/main/resources/semver.mustache index 44ed13d..e94a518 100644 --- a/src/main/resources/semver.mustache +++ b/src/main/resources/semver.mustache @@ -16,13 +16,13 @@ public final class {{className}} { private final static String DEFAULT_PRERELEASE_PREFIX = "-"; private final static String DEFAULT_BUILDMETA_PREFIX = "+"; - final static String project = "{{project}}"; - final static Date buildDate = new Date({{epoch}}L); - final static int major = {{major}}; - final static int minor = {{minor}}; - final static int patch = {{patch}}; - final static String preRelease = "{{preRelease}}"; - final static String buildMeta = "{{buildMeta}}"; + public final static String project = "{{project}}"; + public final static Date buildDate = new Date({{epoch}}L); + public final static int major = {{major}}; + public final static int minor = {{minor}}; + public final static int patch = {{patch}}; + public final static String preRelease = "{{preRelease}}"; + public final static String buildMeta = "{{buildMeta}}"; /** * The full version string. @@ -40,7 +40,7 @@ public final class {{className}} { *
  • 1.0.0-alpha+001
  • * */ - final static String version = Integer.toString(major) + '.' + public final static String version = Integer.toString(major) + '.' + Integer.toString(minor) + '.' + Integer.toString(patch) + preReleaseWithPrefix() + buildMetaWithPrefix(); @@ -58,7 +58,6 @@ public final class {{className}} { /** * Returns the build metadata with default prefix. * - * @param prefix The prefix to prepend. * @return The build metadata, if any. */ public static String buildMetaWithPrefix() { From 03d14886002aa2314c6eb27a6713718197a0ac5f Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 22 Apr 2017 09:09:12 -0700 Subject: [PATCH 022/316] Updated build scripts for testing. --- build.gradle | 2 +- example/build.gradle | 2 +- example/kobalt/src/Build.kt | 7 +++++- .../kobalt/wrapper/kobalt-wrapper.properties | 2 +- kobalt/src/Build.kt | 23 +------------------ 5 files changed, 10 insertions(+), 26 deletions(-) diff --git a/build.gradle b/build.gradle index 5fee110..5305f1f 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id "com.jfrog.bintray" version "1.5" + id "com.jfrog.bintray" version "1.7.3" } apply plugin: 'java' apply plugin: 'idea' diff --git a/example/build.gradle b/example/build.gradle index 379f4d4..90fd763 100644 --- a/example/build.gradle +++ b/example/build.gradle @@ -1,5 +1,5 @@ plugins { - id "com.ewerk.gradle.plugins.annotation-processor" version "1.0.3" + id "com.ewerk.gradle.plugins.annotation-processor" version "1.0.4" } apply plugin: 'java' apply plugin: 'idea' diff --git a/example/kobalt/src/Build.kt b/example/kobalt/src/Build.kt index a94373e..159a18a 100644 --- a/example/kobalt/src/Build.kt +++ b/example/kobalt/src/Build.kt @@ -1,3 +1,4 @@ +import com.beust.kobalt.* import com.beust.kobalt.plugin.application.application import com.beust.kobalt.plugin.apt.apt import com.beust.kobalt.plugin.packaging.* @@ -6,6 +7,10 @@ import java.io.FileInputStream import java.util.* +val bs = buildScript { + repos(file("K:/maven/repository/")) +} + fun StringBuilder.prepend(s: String): StringBuilder { if (this.isNotEmpty()) { this.insert(0, s) @@ -35,7 +40,7 @@ val example = project { version = versionFor() val mainClassName = "net.thauvin.erik.semver.example.Example" - val processorJar = "net.thauvin.erik:semver:" + val processorJar = "net.thauvin.erik:semver:0.9.7" dependencies { apt(processorJar) diff --git a/example/kobalt/wrapper/kobalt-wrapper.properties b/example/kobalt/wrapper/kobalt-wrapper.properties index 9709019..842b330 100644 --- a/example/kobalt/wrapper/kobalt-wrapper.properties +++ b/example/kobalt/wrapper/kobalt-wrapper.properties @@ -1 +1 @@ -kobalt.version=1.0.71 \ No newline at end of file +kobalt.version=1.0.72 \ No newline at end of file diff --git a/kobalt/src/Build.kt b/kobalt/src/Build.kt index 2c8015f..b757775 100644 --- a/kobalt/src/Build.kt +++ b/kobalt/src/Build.kt @@ -98,25 +98,4 @@ val semver = project { commandLine(listOf("pandoc") + args, os = setOf(Os.LINUX)) commandLine(listOf("cmd", "/c", "pandoc") + args, os = setOf(Os.WINDOWS)) } -} - -val example = project(semver) { - - name = "example" - directory = "example" - version = versionFor(directory) - - val mainClassName = "net.thauvin.erik.semver.example.Example" - - assemble { - jar { - manifest { - attributes("Main-Class", mainClassName) - } - } - } - - application { - mainClass = mainClassName - } -} +} \ No newline at end of file From 4a8b379634828ad4d1d797a37cdef911b0ab3a76 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 22 Apr 2017 09:09:48 -0700 Subject: [PATCH 023/316] Plugins update. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3b0f6b9..7bbb2e1 100644 --- a/README.md +++ b/README.md @@ -183,7 +183,7 @@ In order to also incorporate the generated source code into the `source tree`, u ```gradle plugins { - id "com.ewerk.gradle.plugins.annotation-processor" version "1.0.3" + id "com.ewerk.gradle.plugins.annotation-processor" version "1.0.4" } ``` From 746102ec541b120ec65167c4351834604fea2cdb Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 22 Apr 2017 09:10:21 -0700 Subject: [PATCH 024/316] Included generated source file. --- .../erik/semver/example/GeneratedVersion.java | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 example/src/generated/java/net/thauvin/erik/semver/example/GeneratedVersion.java diff --git a/example/src/generated/java/net/thauvin/erik/semver/example/GeneratedVersion.java b/example/src/generated/java/net/thauvin/erik/semver/example/GeneratedVersion.java new file mode 100644 index 0000000..39082b1 --- /dev/null +++ b/example/src/generated/java/net/thauvin/erik/semver/example/GeneratedVersion.java @@ -0,0 +1,104 @@ +/* + * This file is automatically generated. + * Do not modify! -- ALL CHANGES WILL BE ERASED! + */ +package net.thauvin.erik.semver.example; + +import java.util.Date; + +/** + * Provides semantic version information. + * + * @author Semantic Version + * Annotation Processor + */ +public final class GeneratedVersion { + private final static String DEFAULT_PRERELEASE_PREFIX = "-"; + private final static String DEFAULT_BUILDMETA_PREFIX = "+"; + + final static String project = "Example"; + final static Date buildDate = new Date(1492727792896L); + final static int major = 2; + final static int minor = 17; + final static int patch = 52; + final static String preRelease = "beta"; + final static String buildMeta = "007"; + + /** + * The full version string. + *

    + * Formatted as: + *

    + * MAJOR.MINOR.PATCH[-PRERELEASE][+BUILDMETADATA] + *
    + *

    + * For example: + *

      + *
    • 1.0.0
    • + *
    • 1.0.0-beta
    • + *
    • 1.0.0+20160124144700
    • + *
    • 1.0.0-alpha+001
    • + *
    + */ + final static String version = Integer.toString(major) + '.' + + Integer.toString(minor) + '.' + + Integer.toString(patch) + + preReleaseWithPrefix() + buildMetaWithPrefix(); + + /** + * Disables the default constructor. + * + * @throws UnsupportedOperationException If the constructor is called. + */ + private GeneratedVersion() + throws UnsupportedOperationException { + throw new UnsupportedOperationException("Illegal constructor call."); + } + + /** + * Returns the build metadata with default prefix. + * + * @param prefix The prefix to prepend. + * @return The build metadata, if any. + */ + public static String buildMetaWithPrefix() { + return buildMetaWithPrefix(DEFAULT_PRERELEASE_PREFIX); + } + + /** + * Returns the build metadata. + * + * @param prefix Prefix to prepend. + * @return The build metadata, if any. + */ + public static String buildMetaWithPrefix(final String prefix) { + if (buildMeta.length() > 0 && prefix.length() > 0) { + return prefix + buildMeta; + } else { + return buildMeta; + } + } + + /** + * Returns the pre-release version with default prefix. + * + * @return The pre-release version, if any. + */ + public static String preReleaseWithPrefix() { + return preReleaseWithPrefix(DEFAULT_PRERELEASE_PREFIX); + } + + /** + * Returns the pre-release version. + * + * @param prefix The prefix to prepend. + * @return The pre-release version, if any. + */ + public static String preReleaseWithPrefix(final String prefix) { + if (preRelease.length() > 0 && prefix.length() > 0) { + return prefix + preRelease; + } else { + return preRelease; + } + } +} \ No newline at end of file From 4e1c124510069998d5204365b5ca8dcafc395341 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 22 Apr 2017 10:01:07 -0700 Subject: [PATCH 025/316] Fixed VersionInfo initialization. --- .../java/net/thauvin/erik/semver/VersionProcessor.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java index 640a52e..104255e 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java +++ b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java @@ -71,16 +71,14 @@ public class VersionProcessor extends AbstractProcessor { private VersionInfo findValues(final Version version) throws IOException { - final VersionInfo versionInfo; + final VersionInfo versionInfo = new VersionInfo(version); if (version.properties().length() > 0) { - versionInfo = new VersionInfo(); - final File propsFile = new File(version.properties()); if (propsFile.exists()) { note("Found properties: " + propsFile); final Properties p = new Properties(); - + try (FileReader reader = new FileReader(propsFile)) { p.load(reader); @@ -95,8 +93,6 @@ public class VersionProcessor extends AbstractProcessor { error("Could not find: " + propsFile); throw new FileNotFoundException(propsFile + " (The system cannot find the file specified)"); } - } else { - versionInfo = new VersionInfo(version); } return versionInfo; From 18b236f55c9841eba0ce52eb82648c065bd5f136 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 22 Apr 2017 10:01:16 -0700 Subject: [PATCH 026/316] Fixed template. --- src/main/resources/semver.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/semver.mustache b/src/main/resources/semver.mustache index e94a518..947505d 100644 --- a/src/main/resources/semver.mustache +++ b/src/main/resources/semver.mustache @@ -50,7 +50,7 @@ public final class {{className}} { * * @throws UnsupportedOperationException If the constructor is called. */ - private GeneratedVersion() + private {{className}}() throws UnsupportedOperationException { throw new UnsupportedOperationException("Illegal constructor call."); } From a5f4767fa575feb770f8b9219aa4bd3c99a90e7e Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 22 Apr 2017 10:45:04 -0700 Subject: [PATCH 027/316] Improved exception. Improved VersionInfo() initialization. --- .../thauvin/erik/semver/VersionProcessor.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java index 104255e..ae8cc18 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java +++ b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java @@ -82,16 +82,16 @@ public class VersionProcessor extends AbstractProcessor { try (FileReader reader = new FileReader(propsFile)) { p.load(reader); - versionInfo.setProject(p.getProperty(version.projectKey(), Constants.EMPTY)); - versionInfo.setMajor(parseIntProperty(p, version.majorKey(), Constants.DEFAULT_MAJOR)); - versionInfo.setMinor(parseIntProperty(p, version.minorKey(), Constants.DEFAULT_MINOR)); - versionInfo.setPatch(parseIntProperty(p, version.patchKey(), Constants.DEFAULT_PATCH)); - versionInfo.setBuildMeta(p.getProperty(version.buildMetaKey(), Constants.EMPTY)); - versionInfo.setPreRelease(p.getProperty(version.preReleaseKey(), Constants.EMPTY)); + versionInfo.setProject(p.getProperty(version.projectKey(), version.project())); + versionInfo.setMajor(parseIntProperty(p, version.majorKey(), version.major())); + versionInfo.setMinor(parseIntProperty(p, version.minorKey(), version.minor())); + versionInfo.setPatch(parseIntProperty(p, version.patchKey(), version.patch())); + versionInfo.setBuildMeta(p.getProperty(version.buildMetaKey(), version.buildMeta())); + versionInfo.setPreRelease(p.getProperty(version.preReleaseKey(), version.preRelease())); } } else { error("Could not find: " + propsFile); - throw new FileNotFoundException(propsFile + " (The system cannot find the file specified)"); + throw new FileNotFoundException("The system cannot find the specified file: " + propsFile); } } @@ -170,7 +170,7 @@ public class VersionProcessor extends AbstractProcessor { } writeTemplate(version.type(), versionInfo, template); } catch (IOException e) { - error("IOException occurred while running the annotation processor", e); + error("IOException occurred while running the annotation processor: " + e.getMessage(), e); } } } From 0b9e1ddce1be2eb09320156bd30b8ef734e4ccd2 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 23 Apr 2017 19:49:45 -0700 Subject: [PATCH 028/316] Update static fields in templates to uppercase. --- README.md | 20 ++++++------ src/main/resources/semver-kt.mustache | 38 +++++++++++++---------- src/main/resources/semver.mustache | 44 +++++++++++++-------------- 3 files changed, 55 insertions(+), 47 deletions(-) diff --git a/README.md b/README.md index 7bbb2e1..82d548d 100644 --- a/README.md +++ b/README.md @@ -56,14 +56,14 @@ The [default template](https://github.com/ethauvin/semver/blob/master/src/main/r Field | Description | Example :--------------|:---------------------------------|:----------------- -`project` | The project name, if any. | `MyProject` -`buildDate` | The build date. | [`java.util.Date`](https://docs.oracle.com/javase/8/docs/api/java/util/Date.html) -`version` | The full version string. | `1.0.0-alpha+001` -`major` | The major version. | `1` -`minor` | The minor version. | `0` -`patch` | The patch version. | `0` -`preRelease` | The pre-release version, if any. | `alpha` -`buildMeta` | The build metadata, if any. | `001` +`PROJECT` | The project name, if any. | `MyProject` +`BUILDDATE` | The build date. | [`java.util.Date`](https://docs.oracle.com/javase/8/docs/api/java/util/Date.html) +`VERSION` | The full version string. | `1.0.0-alpha+001` +`MAJOR` | The major version. | `1` +`MINOR` | The minor version. | `0` +`PATCH` | The patch version. | `0` +`PRERELEASE` | The pre-release version, if any. | `alpha` +`BUILDMETA` | The build metadata, if any. | `001` And the following methods/functions: @@ -248,4 +248,6 @@ For a solution using [Gradle](https://gradle.org/), please have a look at the [b ``` gradle release run -``` \ No newline at end of file +``` + +For a solution using [Kobalt]([Kobalt](http://beust.com/kobalt/) look at my [Property File Editor](https://github.com/ethauvin/kobalt-property-file) plug-in. \ No newline at end of file diff --git a/src/main/resources/semver-kt.mustache b/src/main/resources/semver-kt.mustache index dee8e90..f52fc25 100644 --- a/src/main/resources/semver-kt.mustache +++ b/src/main/resources/semver-kt.mustache @@ -14,44 +14,50 @@ import java.util.* */ object {{className}} { @JvmField - val project = "{{project}}" + val PRERELEASE_PREFIX = "-" @JvmField - val buildDate = Date({{epoch}}L) + val BUILDMEATA_PREFIX = "+" @JvmField - val major = {{major}} + val PROJECT = "{{project}}" @JvmField - val minor = {{minor}} + val BUILDDATE = Date({{epoch}}L) @JvmField - val patch = {{patch}} + val MAJOR = {{major}} @JvmField - val buildMeta = "{{buildMeta}}" + val MINOR = {{minor}} @JvmField - val preRelease = "{{preRelease}}" + val PATCH = {{patch}} @JvmField - val version = "$major.$minor.$patch" + preReleaseWithPrefix() + buildMetaWithPrefix() + val BUILDMETA = "{{buildMeta}}" + + @JvmField + val PRERELEASE = "{{preRelease}}" + + @JvmField + val VERSION = "$MAJOR.$MINOR.$PATCH" + preReleaseWithPrefix() + buildMetaWithPrefix() @JvmStatic - fun preReleaseWithPrefix(prefix: String = "-"): String { - return if (preRelease.isNotEmpty() && prefix.isNotEmpty()) { - "$prefix$preRelease" + fun preReleaseWithPrefix(prefix: String = PRERELEASE_PREFIX): String { + return if (PRERELEASE.isNotEmpty() && prefix.isNotEmpty()) { + "$prefix$PRERELEASE" } else { - preRelease + PRERELEASE } } @JvmStatic - fun buildMetaWithPrefix(prefix: String = "+"): String { - return if (buildMeta.isNotEmpty() && prefix.isNotEmpty()) { - "$prefix$buildMeta" + fun buildMetaWithPrefix(prefix: String = BUILDMEATA_PREFIX): String { + return if (BUILDMETA.isNotEmpty() && prefix.isNotEmpty()) { + "$prefix$BUILDMETA" } else { - buildMeta + BUILDMETA } } } \ No newline at end of file diff --git a/src/main/resources/semver.mustache b/src/main/resources/semver.mustache index 947505d..7424d6c 100644 --- a/src/main/resources/semver.mustache +++ b/src/main/resources/semver.mustache @@ -13,16 +13,16 @@ import java.util.Date; * Annotation Processor */ public final class {{className}} { - private final static String DEFAULT_PRERELEASE_PREFIX = "-"; - private final static String DEFAULT_BUILDMETA_PREFIX = "+"; + public final static String PRERELEASE_PREFIX = "-"; + public final static String BUILDMETA_PREFIX = "+"; - public final static String project = "{{project}}"; - public final static Date buildDate = new Date({{epoch}}L); - public final static int major = {{major}}; - public final static int minor = {{minor}}; - public final static int patch = {{patch}}; - public final static String preRelease = "{{preRelease}}"; - public final static String buildMeta = "{{buildMeta}}"; + public final static String PROJECT = "{{project}}"; + public final static Date BUILDDATE = new Date({{epoch}}L); + public final static int MAJOR = {{major}}; + public final static int MINOR = {{minor}}; + public final static int PATCH = {{patch}}; + public final static String PRERELEASE = "{{preRelease}}"; + public final static String BUILDMETA = "{{buildMeta}}"; /** * The full version string. @@ -40,9 +40,9 @@ public final class {{className}} { *
  • 1.0.0-alpha+001
  • * */ - public final static String version = Integer.toString(major) + '.' - + Integer.toString(minor) + '.' - + Integer.toString(patch) + public final static String VERSION = Integer.toString(MAJOR) + '.' + + Integer.toString(MINOR) + '.' + + Integer.toString(PATCH) + preReleaseWithPrefix() + buildMetaWithPrefix(); /** @@ -56,12 +56,12 @@ public final class {{className}} { } /** - * Returns the build metadata with default prefix. + * Returns the build metadata with {@value #BUILDMETA_PREFIX} prefix. * * @return The build metadata, if any. */ public static String buildMetaWithPrefix() { - return buildMetaWithPrefix(DEFAULT_PRERELEASE_PREFIX); + return buildMetaWithPrefix(BUILDMETA_PREFIX); } /** @@ -71,20 +71,20 @@ public final class {{className}} { * @return The build metadata, if any. */ public static String buildMetaWithPrefix(final String prefix) { - if (buildMeta.length() > 0 && prefix.length() > 0) { - return prefix + buildMeta; + if (BUILDMETA.length() > 0 && prefix.length() > 0) { + return prefix + BUILDMETA; } else { - return buildMeta; + return BUILDMETA; } } /** - * Returns the pre-release version with default prefix. + * Returns the pre-release version with {@value #PRERELEASE_PREFIX} prefix. * * @return The pre-release version, if any. */ public static String preReleaseWithPrefix() { - return preReleaseWithPrefix(DEFAULT_PRERELEASE_PREFIX); + return preReleaseWithPrefix(PRERELEASE_PREFIX); } /** @@ -94,10 +94,10 @@ public final class {{className}} { * @return The pre-release version, if any. */ public static String preReleaseWithPrefix(final String prefix) { - if (preRelease.length() > 0 && prefix.length() > 0) { - return prefix + preRelease; + if (PRERELEASE.length() > 0 && prefix.length() > 0) { + return prefix + PRERELEASE; } else { - return preRelease; + return PRERELEASE; } } } \ No newline at end of file From 455f6ae93527b91b4bf48969917ee6e5b72123db Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 23 Apr 2017 19:54:19 -0700 Subject: [PATCH 029/316] Kobalt 1.0.74 update. --- .gitignore | 1 + .idea/kobalt.xml | 2 +- .idea/modules.xml | 2 +- example/build.gradle | 2 +- example/kobalt/src/Build.kt | 2 +- .../kobalt/wrapper/kobalt-wrapper.properties | 2 +- .../erik/semver/example/GeneratedVersion.java | 104 ------------------ kobalt/wrapper/kobalt-wrapper.properties | 2 +- 8 files changed, 7 insertions(+), 110 deletions(-) delete mode 100644 example/src/generated/java/net/thauvin/erik/semver/example/GeneratedVersion.java diff --git a/.gitignore b/.gitignore index ac3aa13..355b112 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ **/.idea/libraries **/.idea/tasks.xml **/.idea/workspace.xml +*.sublime-* *.iws .classpath .DS_Store diff --git a/.idea/kobalt.xml b/.idea/kobalt.xml index 426f587..ecc78f0 100644 --- a/.idea/kobalt.xml +++ b/.idea/kobalt.xml @@ -5,7 +5,7 @@
    +

    View Example

    Template

    Upon running the annotation processor, a source file GeneratedVersion.java is automatically generated with static methods to access the semantic version data. The source is based on a fully customizable Mustache template.

    To use your own template, simply create a version.mustache file. The processor will automatically look for it.

    To specify your own template name, use:

    -
    @Version(template = "myversion.mustache")
    +
    @Version(template = "version.mustache")
     public class A {
     // ...

    Default Template

    @@ -94,42 +95,42 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf -project +PROJECT The project name, if any. MyProject -buildDate +BUILDDATE The build date. java.util.Date -version +VERSION The full version string. 1.0.0-alpha+001 -major +MAJOR The major version. 1 -minor +MINOR The minor version. 0 -patch +PATCH The patch version. 0 -preRelease +PRERELEASE The pre-release version, if any. alpha -buildMeta +BUILDMETA The build metadata, if any. 001 @@ -285,24 +286,30 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf +packageName + +The package name. +Same as annotated class + + className The name of the generated class. GeneratedVersion - + properties The properties file. - + template The template file. version.mustache - + type Either java or kt for Kotlin. @@ -346,7 +353,7 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf

    Class & Source Generation

    In order to also incorporate the generated source code into the source tree, use the EWERK Annotation Processor Plugin. Start by adding the following to the very top of the build.gradle file:

    plugins {
    -    id "com.ewerk.gradle.plugins.annotation-processor" version "1.0.3"
    +    id "com.ewerk.gradle.plugins.annotation-processor" version "1.0.4"
     }

    Then add the following to the build.gradle file:

    dependencies {
    @@ -381,10 +388,11 @@ compileJava {
     open class Main {
     // ...

    The Kotlin default template implements the same static fields and functions as the Java template.

    -

    Please look at the Example for Kotlin project for samples on using Gradle and Kobalt.

    +

    Please look at the Example for Kotlin project for samples on using Gradle (build.gradle) and Kobalt (Build.kt).

    Auto-Increment

    Incrementing the version is best left to your favorite build system.

    For a solution using Gradle, please have a look at the build.gradle file in the example module directory. To run the example with patch version auto-incrementing, issue the following command:

    gradle release run
    +

    For a solution using Kobalt look at my Property File Editor plug-in.

    diff --git a/kobalt/src/Build.kt b/kobalt/src/Build.kt index 86733eb..b961a9f 100644 --- a/kobalt/src/Build.kt +++ b/kobalt/src/Build.kt @@ -1,5 +1,6 @@ import com.beust.kobalt.buildScript import com.beust.kobalt.file +import com.beust.kobalt.plugin.java.javadoc import com.beust.kobalt.plugin.packaging.assemble import com.beust.kobalt.plugin.packaging.install import com.beust.kobalt.plugin.publish.autoGitTag @@ -16,10 +17,10 @@ import java.io.FileInputStream import java.util.* val bs = buildScript { - //repos(file("K:/maven/repository")) + repos(file("K:/maven/repository")) plugins("net.thauvin.erik:kobalt-maven-local:", - "net.thauvin.erik:kobalt-exec:", - "net.thauvin.erik:kobalt-versioneye:") + "net.thauvin.erik:kobalt-exec:", + "net.thauvin.erik:kobalt-versioneye:") } fun StringBuilder.prepend(s: String): StringBuilder { @@ -47,12 +48,13 @@ fun versionFor(directory: String = "./"): String { val semver = project { name = "semver" + description = "Semantic Version Annotation Processor" group = "net.thauvin.erik" artifactId = name version = versionFor() pom = Model().apply { - description = "Semantic Version Annotation Processor" + description = project.description url = "https://github.com/ethauvin/semver" licenses = listOf(License().apply { name = "BSD 3-Clause" @@ -78,10 +80,6 @@ val semver = project { compile("org.testng:testng:6.11") } - install { - target = "deploy" - } - assemble { jar { //fatJar = true @@ -91,6 +89,10 @@ val semver = project { } } + install { + target = "deploy" + } + autoGitTag { enabled = true message = "Version $version" @@ -103,11 +105,25 @@ val semver = project { sign = true } + javadoc { + title = project.description + ' ' + project.version + tags("created") + author = true + //quiet = false + //verbose = true + links("http://docs.oracle.com/javase/8/docs/api/") + } exec { - val args = listOf("--from", "markdown_github", "--to", "html5", "-s", "-c", "github-pandoc.css", "-o", "README.html", "README.md") - commandLine(listOf("pandoc") + args, os = setOf(Os.LINUX)) - commandLine(listOf("cmd", "/c", "pandoc") + args, os = setOf(Os.WINDOWS)) + taskName = "pandoc" + commandLine("pandoc", + "--from", "markdown_github", + "--to", "html5", + "-s", + "-c", "github-pandoc.css", + "-o", "README.html", + "README.md", + os = setOf(Os.LINUX, Os.MINGW, Os.CYGWIN)) } versionEye { diff --git a/src/main/resources/semver-kt.mustache b/src/main/resources/semver-kt.mustache index f52fc25..ef2828c 100644 --- a/src/main/resources/semver-kt.mustache +++ b/src/main/resources/semver-kt.mustache @@ -13,38 +13,36 @@ import java.util.* * Annotation Processor */ object {{className}} { - @JvmField - val PRERELEASE_PREFIX = "-" + @JvmField val PRERELEASE_PREFIX = "-" - @JvmField - val BUILDMEATA_PREFIX = "+" + @JvmField val BUILDMEATA_PREFIX = "+" - @JvmField - val PROJECT = "{{project}}" + @JvmField val PROJECT = "{{project}}" - @JvmField - val BUILDDATE = Date({{epoch}}L) + @JvmField val BUILDDATE = Date({{epoch}}L) - @JvmField - val MAJOR = {{major}} + @JvmField val MAJOR = {{major}} - @JvmField - val MINOR = {{minor}} + @JvmField val MINOR = {{minor}} - @JvmField - val PATCH = {{patch}} + @JvmField val PATCH = {{patch}} - @JvmField - val BUILDMETA = "{{buildMeta}}" + @JvmField val BUILDMETA = "{{buildMeta}}" - @JvmField - val PRERELEASE = "{{preRelease}}" + @JvmField val PRERELEASE = "{{preRelease}}" - @JvmField - val VERSION = "$MAJOR.$MINOR.$PATCH" + preReleaseWithPrefix() + buildMetaWithPrefix() + /** + * The full version string formatted as [MAJOR].[MINOR].[PATCH]-[PRERELEASE]+[BUILDMETA] + */ + @JvmField val VERSION = "$MAJOR.$MINOR.$PATCH" + preReleaseWithPrefix() + buildMetaWithPrefix() - @JvmStatic - fun preReleaseWithPrefix(prefix: String = PRERELEASE_PREFIX): String { + /** + * Returns the pre-release version with prefix. + * + * @param prefix The prefix, defaults to [PRERELEASE_PREFIX]. + * @return The pre-release version, if any. + */ + @JvmStatic fun preReleaseWithPrefix(prefix: String = PRERELEASE_PREFIX): String { return if (PRERELEASE.isNotEmpty() && prefix.isNotEmpty()) { "$prefix$PRERELEASE" } else { @@ -52,8 +50,13 @@ object {{className}} { } } - @JvmStatic - fun buildMetaWithPrefix(prefix: String = BUILDMEATA_PREFIX): String { + /** + * Returns the build metadata with prefix. + * + * @param prefix The prefix, defaults to [BUILDMEATA_PREFIX]. + * @return The build metadata, if any. + */ + @JvmStatic fun buildMetaWithPrefix(prefix: String = BUILDMEATA_PREFIX): String { return if (BUILDMETA.isNotEmpty() && prefix.isNotEmpty()) { "$prefix$BUILDMETA" } else { From ac4eba1ccb787776713de6888ac88a5a276602f9 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Thu, 4 May 2017 11:40:38 -0700 Subject: [PATCH 046/316] Kobalt update. --- .idea/kobalt.xml | 2 +- example/kobalt/wrapper/kobalt-wrapper.properties | 2 +- kobalt/Build.kt.iml | 10 +++++----- kobalt/wrapper/kobalt-wrapper.properties | 2 +- kobaltw-test | 4 ++++ 5 files changed, 12 insertions(+), 8 deletions(-) create mode 100644 kobaltw-test diff --git a/.idea/kobalt.xml b/.idea/kobalt.xml index fef2944..e48749a 100644 --- a/.idea/kobalt.xml +++ b/.idea/kobalt.xml @@ -5,7 +5,7 @@

    Then add the following to the build.gradle file:

    dependencies {
    -    compileOnly 'net.thauvin.erik:semver:1.0'
    +    compileOnly 'net.thauvin.erik:semver:1.0.0'
     }
     
     annotationProcessor {
    -    library 'net.thauvin.erik:semver:1.0'
    +    library 'net.thauvin.erik:semver:1.0.0'
         processor 'net.thauvin.erik.semver.VersionProcessor'
         // sourcesDir 'src/generated/java'
     }
    @@ -375,8 +375,8 @@ compileJava {
     

    Kobalt

    To install and run from Kobalt, add the following to the Build.kt file:

    dependencies {
    -    apt("net.thauvin.erik:semver:1.0")
    -    compileOnly("net.thauvin.erik:semver:1.0")
    +    apt("net.thauvin.erik:semver:1.0.0")
    +    compileOnly("net.thauvin.erik:semver:1.0.0")
     }

    Please look at the Build.kt file in the example module directory for a sample.

    Kotlin

    diff --git a/README.md b/README.md index 553dec0..ed07f92 100644 --- a/README.md +++ b/README.md @@ -174,7 +174,7 @@ To install and run from [Gradle](https://gradle.org/), add the following to the ```gradle dependencies { - compileOnly 'net.thauvin.erik:semver:1.0' + compileOnly 'net.thauvin.erik:semver:1.0.0' } ``` @@ -194,11 +194,11 @@ Then add the following to the `build.gradle` file: ```gradle dependencies { - compileOnly 'net.thauvin.erik:semver:1.0' + compileOnly 'net.thauvin.erik:semver:1.0.0' } annotationProcessor { - library 'net.thauvin.erik:semver:1.0' + library 'net.thauvin.erik:semver:1.0.0' processor 'net.thauvin.erik.semver.VersionProcessor' // sourcesDir 'src/generated/java' } @@ -219,8 +219,8 @@ To install and run from [Kobalt](http://beust.com/kobalt/), add the following to ```gradle dependencies { - apt("net.thauvin.erik:semver:1.0") - compileOnly("net.thauvin.erik:semver:1.0") + apt("net.thauvin.erik:semver:1.0.0") + compileOnly("net.thauvin.erik:semver:1.0.0") } ``` diff --git a/kobalt/src/Build.kt b/kobalt/src/Build.kt index 5f1d4f3..55c3780 100644 --- a/kobalt/src/Build.kt +++ b/kobalt/src/Build.kt @@ -94,6 +94,7 @@ val semver = project { autoGitTag { enabled = true + push = false message = "Version $version" } From eddb0dada44f54f7eca44aad62e7485d0ff491b8 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Thu, 11 May 2017 10:31:40 -0700 Subject: [PATCH 052/316] Fixed maven version number. --- README.html | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.html b/README.html index 0375381..5b41783 100644 --- a/README.html +++ b/README.html @@ -341,7 +341,7 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf
    <dependency>
         <groupId>net.thauvin.erik</groupId>
         <artifactId>semver</artifactId>
    -    <version>1.0</version>
    +    <version>1.0.0</version>
     </dependency>

    Gradle

    Class Generation

    diff --git a/README.md b/README.md index ed07f92..4162e22 100644 --- a/README.md +++ b/README.md @@ -162,7 +162,7 @@ To install and run from [Maven](http://maven.apache.org/), configure an artifact net.thauvin.erik semver - 1.0 + 1.0.0 ``` From 70f181e4a08ef0d89bff0555d411b5c57b6982c6 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 27 May 2017 11:11:38 -0700 Subject: [PATCH 053/316] Added JvmOverloads annotation. --- src/main/resources/semver-kt.mustache | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/resources/semver-kt.mustache b/src/main/resources/semver-kt.mustache index febd83d..2ee4813 100644 --- a/src/main/resources/semver-kt.mustache +++ b/src/main/resources/semver-kt.mustache @@ -34,7 +34,9 @@ object {{className}} { * @param prefix The prefix, defaults to [PRERELEASE_PREFIX]. * @return The pre-release version, if any. */ - @JvmStatic fun preReleaseWithPrefix(prefix: String = PRERELEASE_PREFIX): String { + @JvmStatic + @JvmOverloads + fun preReleaseWithPrefix(prefix: String = PRERELEASE_PREFIX): String { return if (PRERELEASE.isNotEmpty() && prefix.isNotEmpty()) { "$prefix$PRERELEASE" } else { @@ -48,7 +50,9 @@ object {{className}} { * @param prefix The prefix, defaults to [BUILDMEATA_PREFIX]. * @return The build metadata, if any. */ - @JvmStatic fun buildMetaWithPrefix(prefix: String = BUILDMEATA_PREFIX): String { + @JvmStatic + @JvmOverloads + fun buildMetaWithPrefix(prefix: String = BUILDMEATA_PREFIX): String { return if (BUILDMETA.isNotEmpty() && prefix.isNotEmpty()) { "$prefix$BUILDMETA" } else { From 93bb9afffb81102ccd68b4fc3e7f8dda9b0ba00f Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 29 May 2017 16:47:03 -0700 Subject: [PATCH 054/316] Added circleci configuration. --- circle.yml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 circle.yml diff --git a/circle.yml b/circle.yml new file mode 100644 index 0000000..ead84b6 --- /dev/null +++ b/circle.yml @@ -0,0 +1,3 @@ +dependencies: + override: + - chmod +x gradlew \ No newline at end of file From 069052f7c77a91fd610f6f780cb67723d653f311 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 29 May 2017 17:13:40 -0700 Subject: [PATCH 055/316] Added configuration options for circleci. --- circle.yml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/circle.yml b/circle.yml index ead84b6..d359fb1 100644 --- a/circle.yml +++ b/circle.yml @@ -1,3 +1,15 @@ +machine: + java: + version: oraclejdk8 + dependencies: override: - - chmod +x gradlew \ No newline at end of file + - chmod +x gradlew + +general: + artifacts: + - build/libs + +test: + post: + - cp -r build/reports/* $CIRCLE_TEST_REPORTS/ \ No newline at end of file From f0a7d1aea1bae9497a1d5db5be9c7a9fa6fa359a Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 29 May 2017 17:39:27 -0700 Subject: [PATCH 056/316] Added circleci badge. --- README.html | 2 +- README.md | 2 +- circle.yml | 4 ---- version.properties | 2 +- 4 files changed, 3 insertions(+), 7 deletions(-) diff --git a/README.html b/README.html index 5b41783..84804b5 100644 --- a/README.html +++ b/README.html @@ -50,7 +50,7 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf

    Semantic Version Annotation Processor

    -

    License (3-Clause BSD) Dependency Status Build Status Build status Maven Central Download

    +

    License (3-Clause BSD) Dependency Status Build Status Build status CircleCI Maven Central Download

    An annotation processor that automatically generates a GeneratedVersion class based on a Mustache template and containing the semantic version (major, minor, patch, etc.) that is read from a Properties file or defined in the annotation.

    This processor was inspired by Cédric Beust's version-processor.

    Examples

    diff --git a/README.md b/README.md index 4162e22..f4edcfa 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Semantic Version Annotation Processor -[![License (3-Clause BSD)](https://img.shields.io/badge/license-BSD%203--Clause-blue.svg?style=flat-square)](http://opensource.org/licenses/BSD-3-Clause) [![Dependency Status](https://www.versioneye.com/user/projects/56a680101b78fd00390001d2/badge.svg?style=flat)](https://www.versioneye.com/user/projects/56a680101b78fd00390001d2) [![Build Status](https://travis-ci.org/ethauvin/semver.svg?branch=master)](https://travis-ci.org/ethauvin/semver) [![Build status](https://ci.appveyor.com/api/projects/status/nbv4mxd1gpxtx69o?svg=true)](https://ci.appveyor.com/project/ethauvin/semver) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver/badge.svg)](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver) [ ![Download](https://api.bintray.com/packages/ethauvin/maven/SemVer/images/download.svg) ](https://bintray.com/ethauvin/maven/SemVer/_latestVersion) +[![License (3-Clause BSD)](https://img.shields.io/badge/license-BSD%203--Clause-blue.svg?style=flat-square)](http://opensource.org/licenses/BSD-3-Clause) [![Dependency Status](https://www.versioneye.com/user/projects/56a680101b78fd00390001d2/badge.svg?style=flat)](https://www.versioneye.com/user/projects/56a680101b78fd00390001d2) [![Build Status](https://travis-ci.org/ethauvin/semver.svg?branch=master)](https://travis-ci.org/ethauvin/semver) [![Build status](https://ci.appveyor.com/api/projects/status/nbv4mxd1gpxtx69o?svg=true)](https://ci.appveyor.com/project/ethauvin/semver) [![CircleCI](https://circleci.com/gh/ethauvin/semver/tree/master.svg?style=shield)](https://circleci.com/gh/ethauvin/semver/tree/master) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver/badge.svg)](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver) [ ![Download](https://api.bintray.com/packages/ethauvin/maven/SemVer/images/download.svg) ](https://bintray.com/ethauvin/maven/SemVer/_latestVersion) An [annotation processor](https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html) that automatically generates a `GeneratedVersion` class based on a [Mustache](https://mustache.github.io/) template and containing the [semantic version](http://semver.org/) (major, minor, patch, etc.) that is read from a `Properties` file or defined in the [annotation](https://docs.oracle.com/javase/tutorial/java/annotations/basics.html). diff --git a/circle.yml b/circle.yml index d359fb1..128bc93 100644 --- a/circle.yml +++ b/circle.yml @@ -6,10 +6,6 @@ dependencies: override: - chmod +x gradlew -general: - artifacts: - - build/libs - test: post: - cp -r build/reports/* $CIRCLE_TEST_REPORTS/ \ No newline at end of file diff --git a/version.properties b/version.properties index db3bacf..18bf707 100644 --- a/version.properties +++ b/version.properties @@ -2,6 +2,6 @@ version.project=semver version.major=1 version.minor=0 -version.patch=0 +version.patch=1 version.buildmeta= version.prerelease= From 4493d6b0e66c686da5cfc4251afaa261d6ae0b24 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Tue, 30 May 2017 15:24:05 -0700 Subject: [PATCH 057/316] Added release badge. --- README.html | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.html b/README.html index 84804b5..a2de79a 100644 --- a/README.html +++ b/README.html @@ -50,7 +50,7 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf

    Semantic Version Annotation Processor

    -

    License (3-Clause BSD) Dependency Status Build Status Build status CircleCI Maven Central Download

    +

    License (3-Clause BSD) release Dependency Status Build Status Build status CircleCI Maven Central Download

    An annotation processor that automatically generates a GeneratedVersion class based on a Mustache template and containing the semantic version (major, minor, patch, etc.) that is read from a Properties file or defined in the annotation.

    This processor was inspired by Cédric Beust's version-processor.

    Examples

    diff --git a/README.md b/README.md index f4edcfa..effe7df 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Semantic Version Annotation Processor -[![License (3-Clause BSD)](https://img.shields.io/badge/license-BSD%203--Clause-blue.svg?style=flat-square)](http://opensource.org/licenses/BSD-3-Clause) [![Dependency Status](https://www.versioneye.com/user/projects/56a680101b78fd00390001d2/badge.svg?style=flat)](https://www.versioneye.com/user/projects/56a680101b78fd00390001d2) [![Build Status](https://travis-ci.org/ethauvin/semver.svg?branch=master)](https://travis-ci.org/ethauvin/semver) [![Build status](https://ci.appveyor.com/api/projects/status/nbv4mxd1gpxtx69o?svg=true)](https://ci.appveyor.com/project/ethauvin/semver) [![CircleCI](https://circleci.com/gh/ethauvin/semver/tree/master.svg?style=shield)](https://circleci.com/gh/ethauvin/semver/tree/master) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver/badge.svg)](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver) [ ![Download](https://api.bintray.com/packages/ethauvin/maven/SemVer/images/download.svg) ](https://bintray.com/ethauvin/maven/SemVer/_latestVersion) +[![License (3-Clause BSD)](https://img.shields.io/badge/license-BSD%203--Clause-blue.svg?style=flat-square)](http://opensource.org/licenses/BSD-3-Clause) [![release](http://github-release-version.herokuapp.com/github/ethauvin/semver/release.svg?style=flat)](https://github.com/ethauvin/semver/releases/latest) [![Dependency Status](https://www.versioneye.com/user/projects/56a680101b78fd00390001d2/badge.svg?style=flat)](https://www.versioneye.com/user/projects/56a680101b78fd00390001d2) [![Build Status](https://travis-ci.org/ethauvin/semver.svg?branch=master)](https://travis-ci.org/ethauvin/semver) [![Build status](https://ci.appveyor.com/api/projects/status/nbv4mxd1gpxtx69o?svg=true)](https://ci.appveyor.com/project/ethauvin/semver) [![CircleCI](https://circleci.com/gh/ethauvin/semver/tree/master.svg?style=shield)](https://circleci.com/gh/ethauvin/semver/tree/master) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver/badge.svg)](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver) [ ![Download](https://api.bintray.com/packages/ethauvin/maven/SemVer/images/download.svg) ](https://bintray.com/ethauvin/maven/SemVer/_latestVersion) An [annotation processor](https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html) that automatically generates a `GeneratedVersion` class based on a [Mustache](https://mustache.github.io/) template and containing the [semantic version](http://semver.org/) (major, minor, patch, etc.) that is read from a `Properties` file or defined in the [annotation](https://docs.oracle.com/javase/tutorial/java/annotations/basics.html). From d99a9ba6bddd8d415be788e1e0af4fffbb6d0181 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Tue, 30 May 2017 15:43:51 -0700 Subject: [PATCH 058/316] Version 1.0.1 --- README.html | 18 +++++++++--------- README.md | 18 +++++++++--------- example/kobalt/src/Build.kt | 2 +- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/README.html b/README.html index a2de79a..628cf27 100644 --- a/README.html +++ b/README.html @@ -107,7 +107,7 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf VERSION The full version string. -1.0.0-alpha+001 +1.2.3-alpha+001 MAJOR @@ -117,12 +117,12 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf MINOR The minor version. -0 +2 PATCH The patch version. -0 +3 PRERELEASE @@ -341,13 +341,13 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf
    <dependency>
         <groupId>net.thauvin.erik</groupId>
         <artifactId>semver</artifactId>
    -    <version>1.0.0</version>
    +    <version>1.0.1</version>
     </dependency>

    Gradle

    Class Generation

    To install and run from Gradle, add the following to the build.gradle file:

    dependencies {
    -    compileOnly 'net.thauvin.erik:semver:1.0.0'
    +    compileOnly 'net.thauvin.erik:semver:1.0.1'
     }

    The GeneratedVersion class will be automatically created in the build/generated directory upon compiling.

    Class & Source Generation

    @@ -357,11 +357,11 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf }

    Then add the following to the build.gradle file:

    dependencies {
    -    compileOnly 'net.thauvin.erik:semver:1.0.0'
    +    compileOnly 'net.thauvin.erik:semver:1.0.1'
     }
     
     annotationProcessor {
    -    library 'net.thauvin.erik:semver:1.0.0'
    +    library 'net.thauvin.erik:semver:1.0.1'
         processor 'net.thauvin.erik.semver.VersionProcessor'
         // sourcesDir 'src/generated/java'
     }
    @@ -375,8 +375,8 @@ compileJava {
     

    Kobalt

    To install and run from Kobalt, add the following to the Build.kt file:

    dependencies {
    -    apt("net.thauvin.erik:semver:1.0.0")
    -    compileOnly("net.thauvin.erik:semver:1.0.0")
    +    apt("net.thauvin.erik:semver:1.0.1")
    +    compileOnly("net.thauvin.erik:semver:1.0.1")
     }

    Please look at the Build.kt file in the example module directory for a sample.

    Kotlin

    diff --git a/README.md b/README.md index effe7df..6fee617 100644 --- a/README.md +++ b/README.md @@ -60,10 +60,10 @@ Field | Description | Example :--------------|:---------------------------------|:----------------- `PROJECT` | The project name, if any. | `MyProject` `BUILDDATE` | The build date. | [`java.util.Date`](https://docs.oracle.com/javase/8/docs/api/java/util/Date.html) -`VERSION` | The full version string. | `1.0.0-alpha+001` +`VERSION` | The full version string. | `1.2.3-alpha+001` `MAJOR` | The major version. | `1` -`MINOR` | The minor version. | `0` -`PATCH` | The patch version. | `0` +`MINOR` | The minor version. | `2` +`PATCH` | The patch version. | `3` `PRERELEASE` | The pre-release version, if any. | `alpha` `BUILDMETA` | The build metadata, if any. | `001` @@ -162,7 +162,7 @@ To install and run from [Maven](http://maven.apache.org/), configure an artifact net.thauvin.erik semver - 1.0.0 + 1.0.1 ``` @@ -174,7 +174,7 @@ To install and run from [Gradle](https://gradle.org/), add the following to the ```gradle dependencies { - compileOnly 'net.thauvin.erik:semver:1.0.0' + compileOnly 'net.thauvin.erik:semver:1.0.1' } ``` @@ -194,11 +194,11 @@ Then add the following to the `build.gradle` file: ```gradle dependencies { - compileOnly 'net.thauvin.erik:semver:1.0.0' + compileOnly 'net.thauvin.erik:semver:1.0.1' } annotationProcessor { - library 'net.thauvin.erik:semver:1.0.0' + library 'net.thauvin.erik:semver:1.0.1' processor 'net.thauvin.erik.semver.VersionProcessor' // sourcesDir 'src/generated/java' } @@ -219,8 +219,8 @@ To install and run from [Kobalt](http://beust.com/kobalt/), add the following to ```gradle dependencies { - apt("net.thauvin.erik:semver:1.0.0") - compileOnly("net.thauvin.erik:semver:1.0.0") + apt("net.thauvin.erik:semver:1.0.1") + compileOnly("net.thauvin.erik:semver:1.0.1") } ``` diff --git a/example/kobalt/src/Build.kt b/example/kobalt/src/Build.kt index 46eeb64..6b99e0a 100644 --- a/example/kobalt/src/Build.kt +++ b/example/kobalt/src/Build.kt @@ -41,7 +41,7 @@ val example = project { version = versionFor() val mainClassName = "net.thauvin.erik.semver.example.Example" - val processorJar = "net.thauvin.erik:semver:1.0.0" + val processorJar = "net.thauvin.erik:semver:1.0.1" dependencies { apt(processorJar) From 6374143961e31671b2a57236db37a633398102ae Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Wed, 31 May 2017 09:19:45 -0700 Subject: [PATCH 059/316] Kobalt 1.0.87 update. --- example/kobalt/wrapper/kobalt-wrapper.properties | 2 +- kobalt/wrapper/kobalt-wrapper.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/example/kobalt/wrapper/kobalt-wrapper.properties b/example/kobalt/wrapper/kobalt-wrapper.properties index eb3786f..65a12ce 100644 --- a/example/kobalt/wrapper/kobalt-wrapper.properties +++ b/example/kobalt/wrapper/kobalt-wrapper.properties @@ -1 +1 @@ -kobalt.version=1.0.85 +kobalt.version=1.0.87 diff --git a/kobalt/wrapper/kobalt-wrapper.properties b/kobalt/wrapper/kobalt-wrapper.properties index cdcb2d1..4a5b196 100644 --- a/kobalt/wrapper/kobalt-wrapper.properties +++ b/kobalt/wrapper/kobalt-wrapper.properties @@ -1 +1 @@ -kobalt.version=1.0.86 \ No newline at end of file +kobalt.version=1.0.87 \ No newline at end of file From 18fb2c0bdc555b69f8ae7285ec69650e64626449 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Wed, 31 May 2017 11:35:44 -0700 Subject: [PATCH 060/316] Nudged release button. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6fee617..7d244a8 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Semantic Version Annotation Processor -[![License (3-Clause BSD)](https://img.shields.io/badge/license-BSD%203--Clause-blue.svg?style=flat-square)](http://opensource.org/licenses/BSD-3-Clause) [![release](http://github-release-version.herokuapp.com/github/ethauvin/semver/release.svg?style=flat)](https://github.com/ethauvin/semver/releases/latest) [![Dependency Status](https://www.versioneye.com/user/projects/56a680101b78fd00390001d2/badge.svg?style=flat)](https://www.versioneye.com/user/projects/56a680101b78fd00390001d2) [![Build Status](https://travis-ci.org/ethauvin/semver.svg?branch=master)](https://travis-ci.org/ethauvin/semver) [![Build status](https://ci.appveyor.com/api/projects/status/nbv4mxd1gpxtx69o?svg=true)](https://ci.appveyor.com/project/ethauvin/semver) [![CircleCI](https://circleci.com/gh/ethauvin/semver/tree/master.svg?style=shield)](https://circleci.com/gh/ethauvin/semver/tree/master) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver/badge.svg)](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver) [ ![Download](https://api.bintray.com/packages/ethauvin/maven/SemVer/images/download.svg) ](https://bintray.com/ethauvin/maven/SemVer/_latestVersion) +[![License (3-Clause BSD)](https://img.shields.io/badge/license-BSD%203--Clause-blue.svg?style=flat-square)](http://opensource.org/licenses/BSD-3-Clause) [![release](http://github-release-version.herokuapp.com/github/ethauvin/semver/release.svg?style=flat&1)](https://github.com/ethauvin/semver/releases/latest) [![Dependency Status](https://www.versioneye.com/user/projects/56a680101b78fd00390001d2/badge.svg?style=flat)](https://www.versioneye.com/user/projects/56a680101b78fd00390001d2) [![Build Status](https://travis-ci.org/ethauvin/semver.svg?branch=master)](https://travis-ci.org/ethauvin/semver) [![Build status](https://ci.appveyor.com/api/projects/status/nbv4mxd1gpxtx69o?svg=true)](https://ci.appveyor.com/project/ethauvin/semver) [![CircleCI](https://circleci.com/gh/ethauvin/semver/tree/master.svg?style=shield)](https://circleci.com/gh/ethauvin/semver/tree/master) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver/badge.svg)](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver) [ ![Download](https://api.bintray.com/packages/ethauvin/maven/SemVer/images/download.svg) ](https://bintray.com/ethauvin/maven/SemVer/_latestVersion) An [annotation processor](https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html) that automatically generates a `GeneratedVersion` class based on a [Mustache](https://mustache.github.io/) template and containing the [semantic version](http://semver.org/) (major, minor, patch, etc.) that is read from a `Properties` file or defined in the [annotation](https://docs.oracle.com/javase/tutorial/java/annotations/basics.html). From 3dd301baf24b2a2d1c1e583d835fac852020a10b Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Wed, 7 Jun 2017 16:32:44 -0700 Subject: [PATCH 061/316] Moved README.html to docs. --- .idea/kobalt.xml | 2 +- .idea/modules/semver_main.iml | 2 +- .idea/modules/semver_test.iml | 2 +- README.md | 3 ++- build.gradle | 7 ++++++- README.html => docs/README.html | 3 ++- github-pandoc.css => docs/github-pandoc.css | 0 kobalt/Build.kt.iml | 6 +++--- kobalt/src/Build.kt | 10 +++++----- semver.iml | 2 +- 10 files changed, 22 insertions(+), 15 deletions(-) rename README.html => docs/README.html (95%) rename github-pandoc.css => docs/github-pandoc.css (100%) diff --git a/.idea/kobalt.xml b/.idea/kobalt.xml index 3364e98..b117217 100644 --- a/.idea/kobalt.xml +++ b/.idea/kobalt.xml @@ -5,7 +5,7 @@
    • Using annotation elements:
    • @@ -76,16 +77,16 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf version.minor=0 version.patch=0 version.prerelease=beta
    -

    View Example

    +

    View Example

    Template

    -

    Upon running the annotation processor, a source file GeneratedVersion.java is automatically generated with static methods to access the semantic version data. The source is based on a fully customizable Mustache template.

    +

    Upon running the annotation processor, a source file GeneratedVersion.java is automatically generated with static methods to access the semantic version data. The source is based on a fully customizable Mustache template.

    To use your own template, simply create a version.mustache file. The processor will automatically look for it.

    To specify your own template name, use:

    @Version(template = "version.mustache")
     public class A {
     // ...

    Default Template

    -

    The default template implements the following static fields:

    +

    The default template implements the following static fields:

    @@ -316,26 +317,39 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf + + + + + +
    Either java or kt for Kotlin. java
    keysPrefixThe prefix for all property keys.version.

    In order to easily incorporate with existing projects, the property keys may be assigned custom values:

    @Version(
       properties = "example.properties",
    -  majorKey = "example.major",
    -  minorKey = "example.minor",
    -  patchKey = "example.patch",
    -  preReleaseKey = "example.prerelease",
    -  buildMetaKey = "example.buildmeta",
    -  projectKey = "example.project"
    +  keysPrefix = "example."
    +  majorKey = "maj",
    +  minorKey = "min",
    +  patchKey = "build",
    +  preReleaseKey = "rel",
    +  buildMetaKey = "meta",
    +  projectKey = "project"
     )
     public class Example {
     // ...
    # example.properties
     example.project=Example
    -example.major=1
    -example.minor=0
    -example.patch=0
    +example.maj=1
    +example.min=0
    +example.build=0
    +example.rel=beta
    +example.meta=
     # ...
    +
    +

    ⚠️ keysPrefix is a new element in 1.1.0 and may break older versions when using custom property keys.
    +⚡ A quick fix is to include keysPrefix="" in the annotation to remove the default version. prefix.

    +

    Usage with Maven, Grail, Kobalt and Kotlin

    Maven

    To install and run from Maven, configure an artifact as follows:

    @@ -348,38 +362,22 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf

    Class Generation

    To install and run from Gradle, add the following to the build.gradle file:

    dependencies {
    +    annotationProcessor 'net.thauvin.erik:semver:1.0.1'
         compileOnly 'net.thauvin.erik:semver:1.0.1'
     }

    The GeneratedVersion class will be automatically created in the build/generated directory upon compiling.

    Class & Source Generation

    -

    In order to also incorporate the generated source code into the source tree, use the EWERK Annotation Processor Plugin. Start by adding the following to the very top of the build.gradle file:

    -
    plugins {
    -    id "com.ewerk.gradle.plugins.annotation-processor" version "1.0.4"
    -}
    -

    Then add the following to the build.gradle file:

    -
    dependencies {
    -    compileOnly 'net.thauvin.erik:semver:1.0.1'
    -}
    -
    -annotationProcessor {
    -    library 'net.thauvin.erik:semver:1.0.1'
    -    processor 'net.thauvin.erik.semver.VersionProcessor'
    -    // sourcesDir 'src/generated/java'
    -}
    -
    -compileJava {
    -    // Disable the classpath processor
    -    options.compilerArgs << '-proc:none'
    -}
    -

    The plugin implements a separate compile task that only runs the annotation processor and is executed during the build phase.

    -

    Please look at the build.gradle file in the example module directory for a sample.

    +

    In order to also incorporate the generated source code into the source tree, add the following to the very top of the build.gradle file:

    +
    compileJava.options.annotationProcessorGeneratedSourcesDirectory = file("${projectDir}/src/generated")
    +

    The GeneratedVersion.java file will now be located in src/generated.

    +

    Please look at the build.gradle file in the Java example module directory for a sample.

    Kobalt

    To install and run from Kobalt, add the following to the Build.kt file:

    dependencies {
         apt("net.thauvin.erik:semver:1.0.1")
         compileOnly("net.thauvin.erik:semver:1.0.1")
     }
    -

    Please look at the Build.kt file in the example module directory for a sample.

    +

    Please look at the Build.kt file in the Kotlin example module directory for a sample.

    Kotlin

    The annotation processor also supports Kotlin.

    To generate a Kotlin version file, simply specify the type as follows:

    @@ -388,12 +386,9 @@ compileJava { @Version(properties = "version.properties", type="kt") open class Main { // ...
    -

    The Kotlin default template implements the same static fields and functions as the Java template.

    -

    Please look at the Example for Kotlin project for samples on using Gradle (build.gradle) and Kobalt (Build.kt).

    -

    Auto-Increment

    -

    Incrementing the version is best left to your favorite build system.

    -

    For a solution using Gradle, please have a look at the build.gradle file in the example module directory. To run the example with patch version auto-incrementing, issue the following command:

    -
    gradle release run
    -

    For a solution using Kobalt look at my Property File Editor plug-in.

    +

    The Kotlin default template implements the same static fields and functions as the Java template.

    +

    Please look at the Kotlin example project for samples on using Gradle (build.gradle.kts) and Kobalt (Build.kt).

    +

    Auto-Increment

    +

    Incrementing the version is best left to your favorite build system. For a solution using Gradle, please have a look at the Semver Version Plugin for Gradle.

    From 65ee5339528f75caf5dc9a63e9c1055dd65c2438 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 1 Jul 2018 01:29:51 -0700 Subject: [PATCH 085/316] Revert "Changed to relative links." This reverts commit 4da4f15e6773d453a76dda50243143e8ee0e6eca. --- README.md | 16 +++++----- build.gradle | 1 - docs/README.html | 83 +++++++++++++++++++++++++----------------------- 3 files changed, 52 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index 6f2f00a..e514584 100644 --- a/README.md +++ b/README.md @@ -37,11 +37,11 @@ version.patch=0 version.prerelease=beta ``` -[View Example](tree/master/examples) +[View Example](https://github.com/ethauvin/semver/tree/master/example) ## Template -Upon running the annotation processor, a source file [`GeneratedVersion.java`](blob/master/example/src/generated/java/net/thauvin/erik/semver/example/GeneratedVersion.java) is automatically generated with static methods to access the semantic version data. The source is based on a fully customizable [Mustache](https://mustache.github.io/) template. +Upon running the annotation processor, a source file [`GeneratedVersion.java`](https://github.com/ethauvin/semver/blob/master/example/src/generated/java/net/thauvin/erik/semver/example/GeneratedVersion.java) is automatically generated with static methods to access the semantic version data. The source is based on a fully customizable [Mustache](https://mustache.github.io/) template. To use your own template, simply create a `version.mustache` file. The processor will automatically look for it. @@ -55,7 +55,7 @@ public class A { ### Default Template -The [default template](blob/master/src/main/resources/semver.mustache) implements the following static fields: +The [default template](https://github.com/ethauvin/semver/blob/master/src/main/resources/semver.mustache) implements the following static fields: Field | Description | Example :--------------|:---------------------------------|:----------------- @@ -158,7 +158,7 @@ example.meta= # ... ``` -> :warning: `keysPrefix` is a new element in `1.1.0` and may break older versions when using custom property keys. +> :warning: `keysPrefix` is a new element in `1.0.0` and may break older versions when using custom property keys. > :zap: A quick fix is to include `keysPrefix=""` in the annotation to remove the default `version.` prefix. ## Usage with Maven, Grail, Kobalt and Kotlin @@ -200,7 +200,7 @@ compileJava.options.annotationProcessorGeneratedSourcesDirectory = file("${proje The `GeneratedVersion.java` file will now be located in `src/generated`. -Please look at the [build.gradle](blob/master/examples/java/build.gradle) file in the [Java example](tree/master/example/java) module directory for a sample. +Please look at the [build.gradle](https://github.com/ethauvin/semver/blob/master/example/build.gradle) file in the [example](https://github.com/ethauvin/semver/tree/master/example) module directory for a sample. ### Kobalt @@ -213,7 +213,7 @@ dependencies { } ``` -Please look at the [Build.kt](blob/master/examples/kotlin/kobalt/src/Build.kt) file in the [Kotlin example](tree/master/example/kotlin) module directory for a sample. +Please look at the [Build.kt](https://github.com/ethauvin/semver/blob/master/example/kobalt/src/Build.kt) file in the [example](https://github.com/ethauvin/semver/tree/master/example) module directory for a sample. ### Kotlin @@ -228,9 +228,9 @@ import net.thauvin.erik.semver.Version open class Main { // ... ``` -The [Kotlin default template](blob/master/src/main/resources/semver-kt.mustache) implements the same static fields and functions as the [Java template](#default-template). +The [Kotlin default template](https://github.com/ethauvin/semver/blob/master/src/main/resources/semver-kt.mustache) implements the same static fields and functions as the [Java template](#default-template). -Please look at the [Kotlin example](tree/master/examples/Kotlin) project for samples on using Gradle ([build.gradle.kts](blob/master/examples/kotlin/build.gradle.kts)) and Kobalt ([Build.kt](blob/master/examples/kotlin/kobalt/src/Build.kt)). +Please look at the [Example for Kotlin](https://github.com/ethauvin/semver-example-kotlin) project for samples on using Gradle ([build.gradle](https://github.com/ethauvin/semver-example-kotlin/blob/master/build.gradle)) and Kobalt ([Build.kt](https://github.com/ethauvin/semver-example-kotlin/blob/master/kobalt/src/Build.kt)). ## Auto-Increment diff --git a/build.gradle b/build.gradle index 2197cb5..027e847 100644 --- a/build.gradle +++ b/build.gradle @@ -212,7 +212,6 @@ task pandoc(type: Exec) { '-s', '-c', 'github-pandoc.css', '-o', 'docs/README.html', - '-H', 'docs/header.inc', 'README.md'] if (Os.isFamily(Os.FAMILY_WINDOWS)) { commandLine(['cmd', '/c', 'pandoc'] + pandoc_args) diff --git a/docs/README.html b/docs/README.html index 3808cb0..7564fa1 100644 --- a/docs/README.html +++ b/docs/README.html @@ -47,14 +47,13 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf -

    Semantic Version Annotation Processor

    -

    License (3-Clause BSD) release Maven Central Download
    -Known Vulnerabilities Build Status Build status CircleCI

    +

    License (3-Clause BSD) release Maven Central Download
    +Dependency Status Build Status Build status CircleCI

    An annotation processor that automatically generates a GeneratedVersion class based on a Mustache template and containing the semantic version (major, minor, patch, etc.) that is read from a Properties file or defined in the annotation.

    -

    This processor was inspired by Cédric Beust's version-processor and works well in conjunction with the Semantic Version Plugin for Gralde.

    +

    This processor was inspired by Cédric Beust's version-processor.

    Examples

    • Using annotation elements:
    • @@ -77,16 +76,16 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf version.minor=0 version.patch=0 version.prerelease=beta
    -

    View Example

    +

    View Example

    Template

    -

    Upon running the annotation processor, a source file GeneratedVersion.java is automatically generated with static methods to access the semantic version data. The source is based on a fully customizable Mustache template.

    +

    Upon running the annotation processor, a source file GeneratedVersion.java is automatically generated with static methods to access the semantic version data. The source is based on a fully customizable Mustache template.

    To use your own template, simply create a version.mustache file. The processor will automatically look for it.

    To specify your own template name, use:

    @Version(template = "version.mustache")
     public class A {
     // ...

    Default Template

    -

    The default template implements the following static fields:

    +

    The default template implements the following static fields:

    @@ -317,39 +316,26 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf - - - - - -
    Either java or kt for Kotlin. java
    keysPrefixThe prefix for all property keys.version.

    In order to easily incorporate with existing projects, the property keys may be assigned custom values:

    @Version(
       properties = "example.properties",
    -  keysPrefix = "example."
    -  majorKey = "maj",
    -  minorKey = "min",
    -  patchKey = "build",
    -  preReleaseKey = "rel",
    -  buildMetaKey = "meta",
    -  projectKey = "project"
    +  majorKey = "example.major",
    +  minorKey = "example.minor",
    +  patchKey = "example.patch",
    +  preReleaseKey = "example.prerelease",
    +  buildMetaKey = "example.buildmeta",
    +  projectKey = "example.project"
     )
     public class Example {
     // ...
    # example.properties
     example.project=Example
    -example.maj=1
    -example.min=0
    -example.build=0
    -example.rel=beta
    -example.meta=
    +example.major=1
    +example.minor=0
    +example.patch=0
     # ...
    -
    -

    ⚠️ keysPrefix is a new element in 1.1.0 and may break older versions when using custom property keys.
    -⚡ A quick fix is to include keysPrefix="" in the annotation to remove the default version. prefix.

    -

    Usage with Maven, Grail, Kobalt and Kotlin

    Maven

    To install and run from Maven, configure an artifact as follows:

    @@ -362,22 +348,38 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf

    Class Generation

    To install and run from Gradle, add the following to the build.gradle file:

    dependencies {
    -    annotationProcessor 'net.thauvin.erik:semver:1.0.1'
         compileOnly 'net.thauvin.erik:semver:1.0.1'
     }

    The GeneratedVersion class will be automatically created in the build/generated directory upon compiling.

    Class & Source Generation

    -

    In order to also incorporate the generated source code into the source tree, add the following to the very top of the build.gradle file:

    -
    compileJava.options.annotationProcessorGeneratedSourcesDirectory = file("${projectDir}/src/generated")
    -

    The GeneratedVersion.java file will now be located in src/generated.

    -

    Please look at the build.gradle file in the Java example module directory for a sample.

    +

    In order to also incorporate the generated source code into the source tree, use the EWERK Annotation Processor Plugin. Start by adding the following to the very top of the build.gradle file:

    +
    plugins {
    +    id "com.ewerk.gradle.plugins.annotation-processor" version "1.0.4"
    +}
    +

    Then add the following to the build.gradle file:

    +
    dependencies {
    +    compileOnly 'net.thauvin.erik:semver:1.0.1'
    +}
    +
    +annotationProcessor {
    +    library 'net.thauvin.erik:semver:1.0.1'
    +    processor 'net.thauvin.erik.semver.VersionProcessor'
    +    // sourcesDir 'src/generated/java'
    +}
    +
    +compileJava {
    +    // Disable the classpath processor
    +    options.compilerArgs << '-proc:none'
    +}
    +

    The plugin implements a separate compile task that only runs the annotation processor and is executed during the build phase.

    +

    Please look at the build.gradle file in the example module directory for a sample.

    Kobalt

    To install and run from Kobalt, add the following to the Build.kt file:

    dependencies {
         apt("net.thauvin.erik:semver:1.0.1")
         compileOnly("net.thauvin.erik:semver:1.0.1")
     }
    -

    Please look at the Build.kt file in the Kotlin example module directory for a sample.

    +

    Please look at the Build.kt file in the example module directory for a sample.

    Kotlin

    The annotation processor also supports Kotlin.

    To generate a Kotlin version file, simply specify the type as follows:

    @@ -386,9 +388,12 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf @Version(properties = "version.properties", type="kt") open class Main { // ... -

    The Kotlin default template implements the same static fields and functions as the Java template.

    -

    Please look at the Kotlin example project for samples on using Gradle (build.gradle.kts) and Kobalt (Build.kt).

    -

    Auto-Increment

    -

    Incrementing the version is best left to your favorite build system. For a solution using Gradle, please have a look at the Semver Version Plugin for Gradle.

    +

    The Kotlin default template implements the same static fields and functions as the Java template.

    +

    Please look at the Example for Kotlin project for samples on using Gradle (build.gradle) and Kobalt (Build.kt).

    +

    Auto-Increment

    +

    Incrementing the version is best left to your favorite build system.

    +

    For a solution using Gradle, please have a look at the build.gradle file in the example module directory. To run the example with patch version auto-incrementing, issue the following command:

    +
    gradle release run
    +

    For a solution using Kobalt look at my Property File Editor plug-in.

    From 8b0ab8cde2a52aca9ff3105e8dccaf84e7dae3c5 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 1 Jul 2018 01:33:41 -0700 Subject: [PATCH 086/316] Misc. IDEA settings updates. --- .idea/codeStyles/codeStyleConfig.xml | 5 +++++ .idea/compiler.xml | 2 ++ .idea/kotlinc.xml | 7 +++++++ .idea/modules/examples-kotlin_main.iml | 26 ++++++++++++++++++++++++++ .idea/modules/examples-kotlin_test.iml | 26 ++++++++++++++++++++++++++ 5 files changed, 66 insertions(+) create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/kotlinc.xml create mode 100644 .idea/modules/examples-kotlin_main.iml create mode 100644 .idea/modules/examples-kotlin_test.iml diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..d91f848 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml index bc0f461..6d140d3 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -3,6 +3,8 @@ + + \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000..5806fb3 --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/.idea/modules/examples-kotlin_main.iml b/.idea/modules/examples-kotlin_main.iml new file mode 100644 index 0000000..a65f44f --- /dev/null +++ b/.idea/modules/examples-kotlin_main.iml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/examples-kotlin_test.iml b/.idea/modules/examples-kotlin_test.iml new file mode 100644 index 0000000..5b759ec --- /dev/null +++ b/.idea/modules/examples-kotlin_test.iml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + \ No newline at end of file From 277b27c2c1a8d9d77a4787ddc5a31b64c7030b7b Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 1 Jul 2018 01:34:27 -0700 Subject: [PATCH 087/316] Changed references to version 1.1.0. --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index e514584..021cfd7 100644 --- a/README.md +++ b/README.md @@ -158,7 +158,7 @@ example.meta= # ... ``` -> :warning: `keysPrefix` is a new element in `1.0.0` and may break older versions when using custom property keys. +> :warning: `keysPrefix` is a new element in `1.1.0` and may break older versions when using custom property keys. > :zap: A quick fix is to include `keysPrefix=""` in the annotation to remove the default `version.` prefix. ## Usage with Maven, Grail, Kobalt and Kotlin @@ -171,7 +171,7 @@ To install and run from [Maven](http://maven.apache.org/), configure an artifact net.thauvin.erik semver - 1.0.1 + 1.1.0 ``` @@ -183,8 +183,8 @@ To install and run from [Gradle](https://gradle.org/), add the following to the ```gradle dependencies { - annotationProcessor 'net.thauvin.erik:semver:1.0.1' - compileOnly 'net.thauvin.erik:semver:1.0.1' + annotationProcessor 'net.thauvin.erik:semver:1.1.0' + compileOnly 'net.thauvin.erik:semver:1.1.0' } ``` @@ -208,8 +208,8 @@ To install and run from [Kobalt](http://beust.com/kobalt/), add the following to ```gradle dependencies { - apt("net.thauvin.erik:semver:1.0.1") - compileOnly("net.thauvin.erik:semver:1.0.1") + apt("net.thauvin.erik:semver:1.1.0") + compileOnly("net.thauvin.erik:semver:1.1.0") } ``` From 657373cd8b0e607d414269015188cfb6cd3e87e5 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 1 Jul 2018 02:19:40 -0700 Subject: [PATCH 088/316] Fixed examples links. --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 021cfd7..d867d85 100644 --- a/README.md +++ b/README.md @@ -37,11 +37,11 @@ version.patch=0 version.prerelease=beta ``` -[View Example](https://github.com/ethauvin/semver/tree/master/example) +[View Example](https://github.com/ethauvin/semver/tree/master/exampled) ## Template -Upon running the annotation processor, a source file [`GeneratedVersion.java`](https://github.com/ethauvin/semver/blob/master/example/src/generated/java/net/thauvin/erik/semver/example/GeneratedVersion.java) is automatically generated with static methods to access the semantic version data. The source is based on a fully customizable [Mustache](https://mustache.github.io/) template. +Upon running the annotation processor, a source file [`GeneratedVersion.java`](https://github.com/ethauvin/semver/blob/master/examples/java/src/generated/java/net/thauvin/erik/semver/examples/java/GeneratedVersion.java) is automatically generated with static methods to access the semantic version data. The source is based on a fully customizable [Mustache](https://mustache.github.io/) template. To use your own template, simply create a `version.mustache` file. The processor will automatically look for it. @@ -200,7 +200,7 @@ compileJava.options.annotationProcessorGeneratedSourcesDirectory = file("${proje The `GeneratedVersion.java` file will now be located in `src/generated`. -Please look at the [build.gradle](https://github.com/ethauvin/semver/blob/master/example/build.gradle) file in the [example](https://github.com/ethauvin/semver/tree/master/example) module directory for a sample. +Please look at the [build.gradle](https://github.com/ethauvin/semver/blob/master/examples/java/build.gradle) file in the [Java example](https://github.com/ethauvin/semver/tree/master/example/java) module directory for a sample. ### Kobalt @@ -213,7 +213,7 @@ dependencies { } ``` -Please look at the [Build.kt](https://github.com/ethauvin/semver/blob/master/example/kobalt/src/Build.kt) file in the [example](https://github.com/ethauvin/semver/tree/master/example) module directory for a sample. +Please look at the [Build.kt](https://github.com/ethauvin/semver/blob/master/examples/kotlin/kobalt/src/Build.kt) file in the [Kotlin example](https://github.com/ethauvin/semver/tree/master/examples/kotlin) module directory for a sample. ### Kotlin @@ -230,7 +230,8 @@ open class Main { ``` The [Kotlin default template](https://github.com/ethauvin/semver/blob/master/src/main/resources/semver-kt.mustache) implements the same static fields and functions as the [Java template](#default-template). -Please look at the [Example for Kotlin](https://github.com/ethauvin/semver-example-kotlin) project for samples on using Gradle ([build.gradle](https://github.com/ethauvin/semver-example-kotlin/blob/master/build.gradle)) and Kobalt ([Build.kt](https://github.com/ethauvin/semver-example-kotlin/blob/master/kobalt/src/Build.kt)). +Please look at the [Kotlin example](https://github.com/ethauvin/semver/tree/master/examples/kotlin) project for samples on using Gradle ([build.gradle.kts](https://github.com/ethauvin/semver/blob/master/examples/kotlin/build.gradle.kts)) and Kobalt ([Build.kt](https://github.com/ethauvin/semver/blob/master/examples/kotlin/kobalt/src/Build.kt)). + ## Auto-Increment From d53463e0e5af9f1585f37561e3379b6d6ebe7751 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 2 Jul 2018 00:04:29 -0700 Subject: [PATCH 089/316] Fixed typo. --- README.md | 2 +- src/main/java/net/thauvin/erik/semver/Version.java | 2 +- .../net/thauvin/erik/semver/VersionProcessor.java | 14 +++++++------- .../net/thauvin/erik/semver/VersionInfoTest.java | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index d867d85..4c5b8c2 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ version.patch=0 version.prerelease=beta ``` -[View Example](https://github.com/ethauvin/semver/tree/master/exampled) +[View Example](https://github.com/ethauvin/semver/tree/master/examples) ## Template diff --git a/src/main/java/net/thauvin/erik/semver/Version.java b/src/main/java/net/thauvin/erik/semver/Version.java index 7795675..94aee55 100644 --- a/src/main/java/net/thauvin/erik/semver/Version.java +++ b/src/main/java/net/thauvin/erik/semver/Version.java @@ -80,5 +80,5 @@ public @interface Version { String type() default Constants.DEFAULT_JAVA_TYPE; - String keysPefix() default Constants.DEFAULT_KEYS_PREFIX; + String keysPrefix() default Constants.DEFAULT_KEYS_PREFIX; } \ No newline at end of file diff --git a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java index 43757d1..1893822 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java +++ b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java @@ -83,17 +83,17 @@ public class VersionProcessor extends AbstractProcessor { p.load(reader); versionInfo.setProject( - p.getProperty(version.keysPefix() + version.projectKey(), version.project())); + p.getProperty(version.keysPrefix() + version.projectKey(), version.project())); versionInfo.setMajor( - parseIntProperty(p, version.keysPefix() + version.majorKey(), version.major())); + parseIntProperty(p, version.keysPrefix() + version.majorKey(), version.major())); versionInfo.setMinor( - parseIntProperty(p, version.keysPefix() + version.minorKey(), version.minor())); + parseIntProperty(p, version.keysPrefix() + version.minorKey(), version.minor())); versionInfo.setPatch( - parseIntProperty(p, version.keysPefix() + version.patchKey(), version.patch())); + parseIntProperty(p, version.keysPrefix() + version.patchKey(), version.patch())); versionInfo.setBuildMeta( - p.getProperty(version.keysPefix() + version.buildMetaKey(), version.buildMeta())); + p.getProperty(version.keysPrefix() + version.buildMetaKey(), version.buildMeta())); versionInfo.setPreRelease( - p.getProperty(version.keysPefix() + version.preReleaseKey(), version.preRelease())); + p.getProperty(version.keysPrefix() + version.preReleaseKey(), version.preRelease())); } } else { error("Could not find: " + propsFile); @@ -119,7 +119,7 @@ public class VersionProcessor extends AbstractProcessor { */ @Override public SourceVersion getSupportedSourceVersion() { - return SourceVersion.RELEASE_8; + return SourceVersion.latestSupported(); } /** diff --git a/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java b/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java index 41c1a68..57ad06a 100644 --- a/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java +++ b/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java @@ -182,7 +182,7 @@ class VersionTest implements Version { } @Override - public String keysPefix() { + public String keysPrefix() { return "product."; } From 968c6802694a8bc385b5bdd7c1f1b2ed15bd04c1 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 2 Jul 2018 00:06:01 -0700 Subject: [PATCH 090/316] Cleaned up examples. --- examples/java/.gitattributes | 5 +++++ .../src/main/java/com/example/{Example.java => App.java} | 3 +-- examples/kotlin/.gitattributes | 5 +++++ examples/kotlin/src/main/java/com/example/Example.java | 2 +- examples/kotlin/src/main/kotlin/com/example/Main.kt | 2 +- 5 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 examples/java/.gitattributes rename examples/java/src/main/java/com/example/{Example.java => App.java} (90%) create mode 100644 examples/kotlin/.gitattributes diff --git a/examples/java/.gitattributes b/examples/java/.gitattributes new file mode 100644 index 0000000..6ec2ae2 --- /dev/null +++ b/examples/java/.gitattributes @@ -0,0 +1,5 @@ +# Set the default behavior, in case people don't have core.autocrlf set. +* text=auto + +# batch files are specific to windows and always crlf +*.bat eol=crlf diff --git a/examples/java/src/main/java/com/example/Example.java b/examples/java/src/main/java/com/example/App.java similarity index 90% rename from examples/java/src/main/java/com/example/Example.java rename to examples/java/src/main/java/com/example/App.java index c3cb880..ca0582a 100644 --- a/examples/java/src/main/java/com/example/Example.java +++ b/examples/java/src/main/java/com/example/App.java @@ -1,7 +1,6 @@ package com.example; import net.thauvin.erik.semver.Version; - import java.text.SimpleDateFormat; @Version(properties = "version.properties") @@ -11,7 +10,7 @@ public class Example { System.out.println("-----------------------------------------------------"); - System.out.println(" " + GeneratedVersion.PROJECT + ' ' + GeneratedVersion.VERSION); + System.out.println(" Version:" + GeneratedVersion.PROJECT + ' ' + GeneratedVersion.VERSION); System.out.println(" Built on: " + sdf.format(GeneratedVersion.BUILDDATE)); System.out.println(" Major: " + GeneratedVersion.MAJOR); diff --git a/examples/kotlin/.gitattributes b/examples/kotlin/.gitattributes new file mode 100644 index 0000000..6ec2ae2 --- /dev/null +++ b/examples/kotlin/.gitattributes @@ -0,0 +1,5 @@ +# Set the default behavior, in case people don't have core.autocrlf set. +* text=auto + +# batch files are specific to windows and always crlf +*.bat eol=crlf diff --git a/examples/kotlin/src/main/java/com/example/Example.java b/examples/kotlin/src/main/java/com/example/Example.java index abeaf51..51b8b0d 100644 --- a/examples/kotlin/src/main/java/com/example/Example.java +++ b/examples/kotlin/src/main/java/com/example/Example.java @@ -8,7 +8,7 @@ public class Example { System.out.println("-- From Java ----------------------------------------"); - System.out.println(" " + GeneratedVersion.PROJECT + ' ' + GeneratedVersion.VERSION); + System.out.println(" Version: " + GeneratedVersion.PROJECT + ' ' + GeneratedVersion.VERSION); System.out.println(" Built on: " + sdf.format(GeneratedVersion.BUILDDATE)); System.out.println(" Major: " + GeneratedVersion.MAJOR); diff --git a/examples/kotlin/src/main/kotlin/com/example/Main.kt b/examples/kotlin/src/main/kotlin/com/example/Main.kt index ce661ef..0b30a6e 100644 --- a/examples/kotlin/src/main/kotlin/com/example/Main.kt +++ b/examples/kotlin/src/main/kotlin/com/example/Main.kt @@ -11,7 +11,7 @@ class Main { println("-----------------------------------------------------") - println(" ${GeneratedVersion.PROJECT} ${GeneratedVersion.VERSION}") + println(" Version: ${GeneratedVersion.PROJECT} ${GeneratedVersion.VERSION}") println(" Built on: " + sdf.format(GeneratedVersion.BUILDDATE)) println(" Major: ${GeneratedVersion.MAJOR}") From e735ca02ed0744cab580a496b66658fb2c9ecf99 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 2 Jul 2018 00:07:05 -0700 Subject: [PATCH 091/316] Removed unsupported javadoc options (needs Java 10+) --- .idea/misc.xml | 2 +- build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index bc8d0a3..6bd5763 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,7 +1,7 @@ - + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 027e847..ee437a4 100644 --- a/build.gradle +++ b/build.gradle @@ -159,7 +159,7 @@ javadoc { options.tags = ['created'] options.author = true options.addStringOption('link', 'http://docs.oracle.com/javase/8/docs/api/') - options.addBooleanOption('html5', true) + //options.addBooleanOption('html5', true) //options.addStringOption('sourcepath', project.hasProperty('jdkSrc') ? jdkSrc : "$System.env.JAVA_HOME/src.zip") if (JavaVersion.current().isJava8Compatible()) { options.addStringOption('Xdoclint:none', '-quiet') From d72dab75938c338759e4fbf04ea90663582002d3 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 2 Jul 2018 01:49:40 -0700 Subject: [PATCH 092/316] Added file paths to log. --- .../thauvin/erik/semver/VersionProcessor.java | 46 +++++++++++-------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java index 1893822..3635577 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java +++ b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java @@ -70,30 +70,31 @@ public class VersionProcessor extends AbstractProcessor { } private VersionInfo findValues(final Version version) - throws IOException { + throws IOException { final VersionInfo versionInfo = new VersionInfo(version); if (version.properties().length() > 0) { final File propsFile = new File(version.properties()); if (propsFile.exists()) { - note("Found properties: " + propsFile); + note("Found properties: " + propsFile + " (" + propsFile.getAbsoluteFile().getParent() + ')'); + final Properties p = new Properties(); - try (FileReader reader = new FileReader(propsFile)) { + try (final FileReader reader = new FileReader(propsFile)) { p.load(reader); versionInfo.setProject( - p.getProperty(version.keysPrefix() + version.projectKey(), version.project())); + p.getProperty(version.keysPrefix() + version.projectKey(), version.project())); versionInfo.setMajor( - parseIntProperty(p, version.keysPrefix() + version.majorKey(), version.major())); + parseIntProperty(p, version.keysPrefix() + version.majorKey(), version.major())); versionInfo.setMinor( - parseIntProperty(p, version.keysPrefix() + version.minorKey(), version.minor())); + parseIntProperty(p, version.keysPrefix() + version.minorKey(), version.minor())); versionInfo.setPatch( - parseIntProperty(p, version.keysPrefix() + version.patchKey(), version.patch())); + parseIntProperty(p, version.keysPrefix() + version.patchKey(), version.patch())); versionInfo.setBuildMeta( - p.getProperty(version.keysPrefix() + version.buildMetaKey(), version.buildMeta())); + p.getProperty(version.keysPrefix() + version.buildMetaKey(), version.buildMeta())); versionInfo.setPreRelease( - p.getProperty(version.keysPrefix() + version.preReleaseKey(), version.preRelease())); + p.getProperty(version.keysPrefix() + version.preReleaseKey(), version.preRelease())); } } else { error("Could not find: " + propsFile); @@ -168,10 +169,10 @@ public class VersionProcessor extends AbstractProcessor { note("Found version: " + versionInfo.getVersion()); final String template; if (version.template().equals(Constants.DEFAULT_JAVA_TEMPLATE) && - new File(Constants.DEFAULT_TEMPLATE_NAME).exists()) { + new File(Constants.DEFAULT_TEMPLATE_NAME).exists()) { template = Constants.DEFAULT_TEMPLATE_NAME; } else if (version.template().equals(Constants.DEFAULT_JAVA_TEMPLATE) && - version.type().equals(Constants.KOTLIN_TYPE)) { + version.type().equals(Constants.KOTLIN_TYPE)) { template = Constants.DEFAULT_KOTLIN_TEMPLATE; } else { template = version.template(); @@ -191,24 +192,29 @@ public class VersionProcessor extends AbstractProcessor { } private void writeTemplate(final String type, final VersionInfo versionInfo, final String template) - throws IOException { + throws IOException { final MustacheFactory mf = new DefaultMustacheFactory(); final Mustache mustache = mf.compile(template); final String templateName; - if (mustache.getName().equals(Constants.DEFAULT_JAVA_TEMPLATE)) { - templateName = "default (Java)"; - } else if (mustache.getName().equals(Constants.DEFAULT_KOTLIN_TEMPLATE)) { - templateName = "default (Kotlin)"; - } else { - templateName = mustache.getName(); + switch (mustache.getName()) { + case Constants.DEFAULT_JAVA_TEMPLATE: + templateName = "default (Java)"; + break; + case Constants.DEFAULT_KOTLIN_TEMPLATE: + templateName = "default (Kotlin)"; + break; + default: + templateName = mustache.getName(); + break; } note("Loaded template: " + templateName); final FileObject jfo; + final String fileName = versionInfo.getClassName() + '.' + type; if (type.equalsIgnoreCase(Constants.KOTLIN_TYPE)) { jfo = filer.createResource(StandardLocation.SOURCE_OUTPUT, versionInfo.getPackageName(), - versionInfo.getClassName() + '.' + type); + fileName); } else { jfo = filer.createSourceFile(versionInfo.getPackageName() + '.' + versionInfo.getClassName()); } @@ -217,7 +223,7 @@ public class VersionProcessor extends AbstractProcessor { mustache.execute(writer, versionInfo).flush(); } - note("Generated source: " + jfo.getName()); + note("Generated source: " + fileName + " (" + new File(jfo.getName()).getAbsoluteFile().getParent() + ')'); } } \ No newline at end of file From 9e351699c701fd5c8de8160780d1303f6b85cfd0 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Tue, 3 Jul 2018 23:16:31 -0700 Subject: [PATCH 093/316] Cleaned examples. --- examples/java/.idea/.name | 1 + examples/java/.idea/compiler.xml | 9 +++ examples/java/.idea/encodings.xml | 6 ++ .../inspectionProfiles/Project_Default.xml | 53 ++++++++++++++++++ examples/java/.idea/misc.xml | 6 ++ examples/java/.idea/modules.xml | 10 ++++ examples/java/.idea/modules/examples-java.iml | 13 +++++ .../java/.idea/modules/examples-java_main.iml | 18 ++++++ .../java/.idea/modules/examples-java_test.iml | 15 +++++ .../com/example/GeneratedVersion.java | 2 +- .../com/example/{App.java => Example.java} | 0 examples/kotlin/.idea/.name | 1 + examples/kotlin/.idea/compiler.xml | 9 +++ examples/kotlin/.idea/encodings.xml | 6 ++ .../inspectionProfiles/Project_Default.xml | 53 ++++++++++++++++++ examples/kotlin/.idea/kotlinc.xml | 7 +++ examples/kotlin/.idea/misc.xml | 6 ++ examples/kotlin/.idea/modules.xml | 10 ++++ .../kotlin/.idea/modules/examples-kotlin.iml | 13 +++++ .../.idea/modules/examples-kotlin_main.iml | 56 +++++++++++++++++++ .../.idea/modules/examples-kotlin_test.iml | 53 ++++++++++++++++++ version.properties | 6 +- 22 files changed, 349 insertions(+), 4 deletions(-) create mode 100644 examples/java/.idea/.name create mode 100644 examples/java/.idea/compiler.xml create mode 100644 examples/java/.idea/encodings.xml create mode 100644 examples/java/.idea/inspectionProfiles/Project_Default.xml create mode 100644 examples/java/.idea/misc.xml create mode 100644 examples/java/.idea/modules.xml create mode 100644 examples/java/.idea/modules/examples-java.iml create mode 100644 examples/java/.idea/modules/examples-java_main.iml create mode 100644 examples/java/.idea/modules/examples-java_test.iml rename examples/java/src/main/java/com/example/{App.java => Example.java} (100%) create mode 100644 examples/kotlin/.idea/.name create mode 100644 examples/kotlin/.idea/compiler.xml create mode 100644 examples/kotlin/.idea/encodings.xml create mode 100644 examples/kotlin/.idea/inspectionProfiles/Project_Default.xml create mode 100644 examples/kotlin/.idea/kotlinc.xml create mode 100644 examples/kotlin/.idea/misc.xml create mode 100644 examples/kotlin/.idea/modules.xml create mode 100644 examples/kotlin/.idea/modules/examples-kotlin.iml create mode 100644 examples/kotlin/.idea/modules/examples-kotlin_main.iml create mode 100644 examples/kotlin/.idea/modules/examples-kotlin_test.iml diff --git a/examples/java/.idea/.name b/examples/java/.idea/.name new file mode 100644 index 0000000..1658a34 --- /dev/null +++ b/examples/java/.idea/.name @@ -0,0 +1 @@ +examples-java \ No newline at end of file diff --git a/examples/java/.idea/compiler.xml b/examples/java/.idea/compiler.xml new file mode 100644 index 0000000..f0a6a7b --- /dev/null +++ b/examples/java/.idea/compiler.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/examples/java/.idea/encodings.xml b/examples/java/.idea/encodings.xml new file mode 100644 index 0000000..97626ba --- /dev/null +++ b/examples/java/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/examples/java/.idea/inspectionProfiles/Project_Default.xml b/examples/java/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..8ff795e --- /dev/null +++ b/examples/java/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,53 @@ + + + + \ No newline at end of file diff --git a/examples/java/.idea/misc.xml b/examples/java/.idea/misc.xml new file mode 100644 index 0000000..e707cdd --- /dev/null +++ b/examples/java/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/examples/java/.idea/modules.xml b/examples/java/.idea/modules.xml new file mode 100644 index 0000000..e27b37a --- /dev/null +++ b/examples/java/.idea/modules.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/examples/java/.idea/modules/examples-java.iml b/examples/java/.idea/modules/examples-java.iml new file mode 100644 index 0000000..a57fa1a --- /dev/null +++ b/examples/java/.idea/modules/examples-java.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/java/.idea/modules/examples-java_main.iml b/examples/java/.idea/modules/examples-java_main.iml new file mode 100644 index 0000000..f9a8e31 --- /dev/null +++ b/examples/java/.idea/modules/examples-java_main.iml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/java/.idea/modules/examples-java_test.iml b/examples/java/.idea/modules/examples-java_test.iml new file mode 100644 index 0000000..a6695cc --- /dev/null +++ b/examples/java/.idea/modules/examples-java_test.iml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/java/src/generated/com/example/GeneratedVersion.java b/examples/java/src/generated/com/example/GeneratedVersion.java index 4023644..2cd8f0d 100644 --- a/examples/java/src/generated/com/example/GeneratedVersion.java +++ b/examples/java/src/generated/com/example/GeneratedVersion.java @@ -16,7 +16,7 @@ public final class GeneratedVersion { public final static String BUILDMETA_PREFIX = "+"; public final static String PROJECT = "Example"; - public final static Date BUILDDATE = new Date(1530167147192L); + public final static Date BUILDDATE = new Date(1530684509154L); public final static int MAJOR = 2; public final static int MINOR = 17; public final static int PATCH = 52; diff --git a/examples/java/src/main/java/com/example/App.java b/examples/java/src/main/java/com/example/Example.java similarity index 100% rename from examples/java/src/main/java/com/example/App.java rename to examples/java/src/main/java/com/example/Example.java diff --git a/examples/kotlin/.idea/.name b/examples/kotlin/.idea/.name new file mode 100644 index 0000000..e3bef29 --- /dev/null +++ b/examples/kotlin/.idea/.name @@ -0,0 +1 @@ +examples-kotlin \ No newline at end of file diff --git a/examples/kotlin/.idea/compiler.xml b/examples/kotlin/.idea/compiler.xml new file mode 100644 index 0000000..ed63cad --- /dev/null +++ b/examples/kotlin/.idea/compiler.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/examples/kotlin/.idea/encodings.xml b/examples/kotlin/.idea/encodings.xml new file mode 100644 index 0000000..97626ba --- /dev/null +++ b/examples/kotlin/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/examples/kotlin/.idea/inspectionProfiles/Project_Default.xml b/examples/kotlin/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..8ff795e --- /dev/null +++ b/examples/kotlin/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,53 @@ + + + + \ No newline at end of file diff --git a/examples/kotlin/.idea/kotlinc.xml b/examples/kotlin/.idea/kotlinc.xml new file mode 100644 index 0000000..5806fb3 --- /dev/null +++ b/examples/kotlin/.idea/kotlinc.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/examples/kotlin/.idea/misc.xml b/examples/kotlin/.idea/misc.xml new file mode 100644 index 0000000..e707cdd --- /dev/null +++ b/examples/kotlin/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/examples/kotlin/.idea/modules.xml b/examples/kotlin/.idea/modules.xml new file mode 100644 index 0000000..26eeb73 --- /dev/null +++ b/examples/kotlin/.idea/modules.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/examples/kotlin/.idea/modules/examples-kotlin.iml b/examples/kotlin/.idea/modules/examples-kotlin.iml new file mode 100644 index 0000000..ae8dcbb --- /dev/null +++ b/examples/kotlin/.idea/modules/examples-kotlin.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/kotlin/.idea/modules/examples-kotlin_main.iml b/examples/kotlin/.idea/modules/examples-kotlin_main.iml new file mode 100644 index 0000000..f7bffce --- /dev/null +++ b/examples/kotlin/.idea/modules/examples-kotlin_main.iml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/kotlin/.idea/modules/examples-kotlin_test.iml b/examples/kotlin/.idea/modules/examples-kotlin_test.iml new file mode 100644 index 0000000..696a8f5 --- /dev/null +++ b/examples/kotlin/.idea/modules/examples-kotlin_test.iml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/version.properties b/version.properties index 18bf707..0dfd594 100644 --- a/version.properties +++ b/version.properties @@ -1,7 +1,7 @@ #Thu, 06 Oct 2016 11:49:46 -0700 version.project=semver version.major=1 -version.minor=0 -version.patch=1 +version.minor=1 +version.patch=0 version.buildmeta= -version.prerelease= +version.prerelease=beta From d9e0acef6c528cf431848dbb6992b2a881bb4e4c Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Thu, 5 Jul 2018 17:39:27 -0700 Subject: [PATCH 094/316] Added Gradle plugin reference. --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4c5b8c2..665ec45 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ An [annotation processor](https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html) that automatically generates a `GeneratedVersion` class based on a [Mustache](https://mustache.github.io/) template and containing the [semantic version](http://semver.org/) (major, minor, patch, etc.) that is read from a `Properties` file or defined in the [annotation](https://docs.oracle.com/javase/tutorial/java/annotations/basics.html). -This processor was inspired by Cédric Beust's [version-processor](https://github.com/cbeust/version-processor) and works well in conjunction with the [Semantic Version Plugin for Gralde](https://github.com/ethauvin/semver-gradle). +This processor was inspired by Cédric Beust's [version-processor](https://github.com/cbeust/version-processor) and works well in conjunction with the [__Semantic Version Plugin for Gradle__](https://github.com/ethauvin/semver-gradle). ## Examples @@ -235,4 +235,6 @@ Please look at the [Kotlin example](https://github.com/ethauvin/semver/tree/mast ## Auto-Increment -Incrementing the version is best left to your favorite build system. For a solution using Gradle, please have a look at the [Semver Version Plugin for Gradle](https://github.com/ethauvin/semver-gradle). \ No newline at end of file +Incrementing the version is best left to your favorite build system. For a solution using Gradle, please have a look at the [__Semver Version Plugin for Gradle__](https://github.com/ethauvin/semver-gradle). + +There are also full [examples](https://github.com/ethauvin/semver-gradle/tree/master/examples/annotation-processor) in both [Java](https://github.com/ethauvin/semver-gradle/tree/master/examples/annotation-processor/java) and [Kotlin](https://github.com/ethauvin/semver-gradle/tree/master/examples/annotation-processor) showing how to use both the plugin and annotation processor concurrently. \ No newline at end of file From 144868855fbe2ff8c0b391ece43fe02f462bed2b Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Thu, 5 Jul 2018 17:39:56 -0700 Subject: [PATCH 095/316] Added build file for all examples. --- examples/.gitignore | 32 +++++++++++++++++++ examples/build.gradle | 5 +++ examples/java/kobalt/src/Build.kt | 2 +- .../kobalt/wrapper/kobalt-wrapper.properties | 2 +- .../com/example/GeneratedVersion.java | 2 +- examples/settings.gradle | 2 ++ 6 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 examples/.gitignore create mode 100644 examples/build.gradle create mode 100644 examples/settings.gradle diff --git a/examples/.gitignore b/examples/.gitignore new file mode 100644 index 0000000..91cf804 --- /dev/null +++ b/examples/.gitignore @@ -0,0 +1,32 @@ +**/.idea/dictionaries +**/.idea/gradle.xml +**/.idea/libraries +**/.idea/tasks.xml +**/.idea/workspace.xml +**/src/*.class +*.code-workspace +*.iws +*.properties +*.sublime-* +.classpath +.DS_Store +.gradle +.kobalt +.nb-gradle +.project +.settings +/bin +/build +/deploy +/dist +/gen +/gradle.properties +/local.properties +/out +/proguard-project.txt +/project.properties +/target +/test-output +ehthumbs.db +kobaltBuild +Thumbs.db \ No newline at end of file diff --git a/examples/build.gradle b/examples/build.gradle new file mode 100644 index 0000000..188b92b --- /dev/null +++ b/examples/build.gradle @@ -0,0 +1,5 @@ +task run { + dependsOn( + "java:clean", "java:run", + "kotlin:clean", "kotlin:run", "kotlin:runJava") +} \ No newline at end of file diff --git a/examples/java/kobalt/src/Build.kt b/examples/java/kobalt/src/Build.kt index 6b99e0a..f1bd155 100644 --- a/examples/java/kobalt/src/Build.kt +++ b/examples/java/kobalt/src/Build.kt @@ -6,7 +6,7 @@ import com.beust.kobalt.plugin.packaging.* import java.io.FileInputStream import java.util.* -// .kobaltw run +// ./kobaltw run val bs = buildScript { repos(localMaven()) diff --git a/examples/java/kobalt/wrapper/kobalt-wrapper.properties b/examples/java/kobalt/wrapper/kobalt-wrapper.properties index 65a12ce..d630dff 100644 --- a/examples/java/kobalt/wrapper/kobalt-wrapper.properties +++ b/examples/java/kobalt/wrapper/kobalt-wrapper.properties @@ -1 +1 @@ -kobalt.version=1.0.87 +kobalt.version=1.0.114 \ No newline at end of file diff --git a/examples/java/src/generated/com/example/GeneratedVersion.java b/examples/java/src/generated/com/example/GeneratedVersion.java index 2cd8f0d..e0b5686 100644 --- a/examples/java/src/generated/com/example/GeneratedVersion.java +++ b/examples/java/src/generated/com/example/GeneratedVersion.java @@ -16,7 +16,7 @@ public final class GeneratedVersion { public final static String BUILDMETA_PREFIX = "+"; public final static String PROJECT = "Example"; - public final static Date BUILDDATE = new Date(1530684509154L); + public final static Date BUILDDATE = new Date(1530837381991L); public final static int MAJOR = 2; public final static int MINOR = 17; public final static int PATCH = 52; diff --git a/examples/settings.gradle b/examples/settings.gradle new file mode 100644 index 0000000..945de05 --- /dev/null +++ b/examples/settings.gradle @@ -0,0 +1,2 @@ +include "java", "kotlin" +rootProject.name = 'examples' From d1438ecad598213e6e8308ff44cf1fc0369d22f3 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 7 Jul 2018 18:51:21 -0700 Subject: [PATCH 096/316] Added file path when version properties file not found. --- src/main/java/net/thauvin/erik/semver/VersionProcessor.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java index 3635577..ae5ad86 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java +++ b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java @@ -98,7 +98,8 @@ public class VersionProcessor extends AbstractProcessor { } } else { error("Could not find: " + propsFile); - throw new FileNotFoundException("The system cannot find the specified file: " + propsFile); + throw new FileNotFoundException("The system cannot find the specified file: `" + + propsFile.getAbsolutePath() + '`'); } } From 39693cb3986a2faadb4f5866a6df8fa5031cf676 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 7 Jul 2018 18:51:41 -0700 Subject: [PATCH 097/316] Added vcs. --- .gitignore | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 4632220..ff3d427 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,7 @@ -**/.idea/dictionaries -**/.idea/gradle.xml -**/.idea/libraries -**/.idea/tasks.xml -**/.idea/workspace.xml -*.sublime-* -*.iws +!.vscode/extensions.json +!.vscode/launch.json +!.vscode/settings.json +!.vscode/tasks.json .classpath .DS_Store .gradle @@ -12,6 +9,25 @@ .nb-gradle .project .settings +.vscode/* +*.code-workspace +*.iws +*.sublime-* +**/.idea/**/dataSources.ids +**/.idea/**/dataSources.local.xml +**/.idea/**/dataSources/ +**/.idea/**/dbnavigator.xml +**/.idea/**/dictionaries +**/.idea/**/dynamic.xml +**/.idea/**/gradle.xml +**/.idea/**/libraries +**/.idea/**/shelf +**/.idea/**/sqlDataSources.xml +**/.idea/**/tasks.xml +**/.idea/**/uiDesigner.xml +**/.idea/**/usage.statistics.xml +**/.idea/**/workspace.xml +**/*.class /bin /build /deploy From 7db6cbc8395b6788c910904c0f77712325474183 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 7 Jul 2018 18:52:56 -0700 Subject: [PATCH 098/316] Added semver plugin. Cleanup. --- build.gradle | 134 ++++++++++++++++----------------------------------- 1 file changed, 41 insertions(+), 93 deletions(-) diff --git a/build.gradle b/build.gradle index ee437a4..2f48681 100644 --- a/build.gradle +++ b/build.gradle @@ -1,45 +1,17 @@ plugins { + id 'java' + id 'maven-publish' id "com.jfrog.bintray" version "1.8.3" id "com.github.ben-manes.versions" version "0.20.0" + id "net.thauvin.erik.gradle.semver" version "0.9.5-beta" } -apply plugin: 'java' -apply plugin: 'idea' -apply plugin: 'maven' -apply plugin: 'maven-publish' import org.apache.tools.ant.taskdefs.condition.Os -defaultTasks 'deploy' +defaultTasks 'check' -def getVersion(isIncrement = false) { - def propsFile = 'version.properties' - def majorKey = 'version.major' - def minorKey = 'version.minor' - def patchKey = 'version.patch' - def metaKey = 'version.buildmeta' - def preKey = 'version.prerelease' - if (isIncrement) { - ant.propertyfile(file: propsFile) { - entry(key: patchKey, - type: 'int', - default: '-1', - operation: '+') - } - } - def p = new Properties() - file(propsFile).withInputStream { stream -> p.load(stream) } - def metadata = p.getProperty(metaKey, '') - def prerelease = p.getProperty(preKey, '') - return (p.getProperty(majorKey, '1') + '.' + p.getProperty(minorKey, '0') + '.' + p.getProperty(patchKey, '0') + - (prerelease.length() > 0 ? '-' + prerelease : '') + (metadata.length() > 0 ? '+' + metadata : '')) -} - -version = getVersion() group = 'net.thauvin.erik' -def deployDir = 'deploy' -def isRelease = 'release' in gradle.startParameter.taskNames - def mavenName = 'SemVer' def mavenDescription = 'Semantic Version Annotation Processor' def mavenUrl = 'https://github.com/ethauvin/semver' @@ -83,7 +55,7 @@ bintray { publicDownloadNumbers = true version { name = project.version - desc = 'Version ' + project.version + desc = "Version $project.version" vcsTag = project.version gpg { sign = true @@ -92,28 +64,6 @@ bintray { } } -def pomConfig = { - licenses { - license { - name mavenLicense - url mavenLicenseUrl - distribution 'repo' - } - } - developers { - developer { - id 'ethauvin' - name 'Erik C. Thauvin' - email 'erik@thauvin.net' - } - } - scm { - connection 'scm:git:' + mavenScmCon - developerConnection 'scm:git:' + mavenScmDevCon - url mavenScmCon - } -} - task javadocJar(type: Jar, dependsOn: javadoc) { group = 'Build' description = 'Builds an archive of the javadoc docs.' @@ -141,28 +91,45 @@ publishing { artifact javadocJar groupId project.group artifactId rootProject.name - version project.version - pom.withXml { - def root = asNode() - root.appendNode('name', mavenName) - root.appendNode('description', mavenDescription) - root.appendNode('url', mavenUrl) - root.children().last() + pomConfig + pom { + name = mavenName + description = mavenDescription + url = mavenUrl + licenses { + license { + name = mavenLicense + url = mavenLicenseUrl + distribution = 'repo' + } + } + developers { + developer { + id = 'ethauvin' + name = 'Erik C. Thauvin' + email = 'erik@thauvin.net' + } + } + scm { + connection = "scm:git:" + mavenScmCon + developerConnection = "scm:git:" + mavenScmDevCon + url = mavenScmCon + } } } } } javadoc { - title = mavenDescription + ' ' + version - options.tags = ['created'] - options.author = true - options.addStringOption('link', 'http://docs.oracle.com/javase/8/docs/api/') - //options.addBooleanOption('html5', true) - //options.addStringOption('sourcepath', project.hasProperty('jdkSrc') ? jdkSrc : "$System.env.JAVA_HOME/src.zip") - if (JavaVersion.current().isJava8Compatible()) { - options.addStringOption('Xdoclint:none', '-quiet') + doFirst { + title = "$mavenDescription $project.version API" + } + options.with { + tags = ['created'] + author = true + addBooleanOption('html4', true) + links('https://docs.oracle.com/javase/8/docs/api/') + addStringOption('Xdoclint:none', '-quiet') } } @@ -171,37 +138,18 @@ test { } compileJava { - doFirst { - project.version = getVersion(isRelease) - } + options.compilerArgs.add('-proc:none') } compileTestJava { options.compilerArgs.add('-proc:none') } -clean { - delete deployDir -} - -task copyToDeploy(type: Copy) { - from jar - into deployDir -} - -task deploy(dependsOn: ['build', 'copyToDeploy']) { - description = 'Copies all needed files to the ${deployDir} directory.' +task release(dependsOn: ['wrapper', 'clean', 'publishToMavenLocal']) { group = 'Publishing' - outputs.dir deployDir - inputs.files copyToDeploy - mustRunAfter clean -} - -task release(dependsOn: ['wrapper', 'clean', 'deploy']) { - group = 'Publishing' - description = 'Releases new version.' + description = 'Releases new version to local maven repository.' doFirst { - isRelease = true + println("Version: $version") } } From 05531406a9a307f9f3b8461890be50611ad9160f Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 7 Jul 2018 19:56:22 -0700 Subject: [PATCH 099/316] Added script to run all examples. --- examples/build.gradle | 5 ----- examples/examples.sh | 17 +++++++++++++++++ examples/settings.gradle | 2 -- 3 files changed, 17 insertions(+), 7 deletions(-) delete mode 100644 examples/build.gradle create mode 100644 examples/examples.sh delete mode 100644 examples/settings.gradle diff --git a/examples/build.gradle b/examples/build.gradle deleted file mode 100644 index 188b92b..0000000 --- a/examples/build.gradle +++ /dev/null @@ -1,5 +0,0 @@ -task run { - dependsOn( - "java:clean", "java:run", - "kotlin:clean", "kotlin:run", "kotlin:runJava") -} \ No newline at end of file diff --git a/examples/examples.sh b/examples/examples.sh new file mode 100644 index 0000000..d0895bc --- /dev/null +++ b/examples/examples.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +if [ $# -eq 0 ]; then + echo "Usage: $0 [...]" + exit 1 +fi + +dir=$(dirname "$(readlink -f "$0")") +color=$(tput setaf 6) +normal=$(tput sgr0) + +for ex in "java" "kotlin"; do + cd "$dir/$ex" || exit 1 + echo "> Project: ${color}${ex}${normal}" + gradle clean "$@" --console=plain --no-build-cache || exit 1 + echo +done \ No newline at end of file diff --git a/examples/settings.gradle b/examples/settings.gradle deleted file mode 100644 index 945de05..0000000 --- a/examples/settings.gradle +++ /dev/null @@ -1,2 +0,0 @@ -include "java", "kotlin" -rootProject.name = 'examples' From dc82c66d68899af14e3082d8782d293bf6aad24b Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Wed, 11 Jul 2018 03:33:42 -0700 Subject: [PATCH 100/316] Added spotbugs and errorprone plugins. --- build.gradle | 12 ++++++++++++ config/spotbugs/excludefilter.xml | 14 ++++++++++++++ .../net/thauvin/erik/semver/VersionInfoTest.java | 2 +- 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 config/spotbugs/excludefilter.xml diff --git a/build.gradle b/build.gradle index 2f48681..1818ab9 100644 --- a/build.gradle +++ b/build.gradle @@ -4,8 +4,12 @@ plugins { id "com.jfrog.bintray" version "1.8.3" id "com.github.ben-manes.versions" version "0.20.0" id "net.thauvin.erik.gradle.semver" version "0.9.5-beta" + id "com.github.spotbugs" version "1.6.2" + id "net.ltgt.errorprone" version "0.0.14" } + +import com.github.spotbugs.SpotBugsTask import org.apache.tools.ant.taskdefs.condition.Os defaultTasks 'check' @@ -35,6 +39,7 @@ repositories { dependencies { compile 'com.github.spullara.mustache.java:compiler:0.9.5' + spotbugsPlugins 'com.h3xstream.findsecbugs:findsecbugs-plugin:1.7.1' testCompile 'org.testng:testng:6.14.3' } @@ -137,6 +142,13 @@ test { useTestNG() } +tasks.withType(SpotBugsTask) { + reports { + xml.enabled = false + html.enabled = true + } + excludeFilter = file("$projectDir/config/spotbugs/excludeFilter.xml") +} compileJava { options.compilerArgs.add('-proc:none') } diff --git a/config/spotbugs/excludefilter.xml b/config/spotbugs/excludefilter.xml new file mode 100644 index 0000000..4d8881d --- /dev/null +++ b/config/spotbugs/excludefilter.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java b/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java index 57ad06a..beb6aeb 100644 --- a/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java +++ b/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java @@ -159,7 +159,7 @@ public class VersionInfoTest { } } -@SuppressWarnings("ClassExplicitlyAnnotation") +@SuppressWarnings({"ClassExplicitlyAnnotation", "BadAnnotationImplementation"}) class VersionTest implements Version { @Override public Class annotationType() { From 21f74b272923de9927d900656ec85c4701d7c6f2 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Wed, 11 Jul 2018 03:34:45 -0700 Subject: [PATCH 101/316] Now using an InputStreamReader with UTF8 to read the properties file. --- src/main/java/net/thauvin/erik/semver/VersionProcessor.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java index ae5ad86..5775a18 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java +++ b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java @@ -45,6 +45,7 @@ import javax.tools.Diagnostic; import javax.tools.FileObject; import javax.tools.StandardLocation; import java.io.*; +import java.nio.charset.StandardCharsets; import java.util.HashSet; import java.util.Properties; import java.util.Set; @@ -80,7 +81,8 @@ public class VersionProcessor extends AbstractProcessor { final Properties p = new Properties(); - try (final FileReader reader = new FileReader(propsFile)) { + try (final InputStreamReader reader = + new InputStreamReader(new FileInputStream(propsFile), StandardCharsets.UTF_8)) { p.load(reader); versionInfo.setProject( From fc48de28b4783a39c6c641620ce0c5e61bd9ba7d Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Wed, 11 Jul 2018 03:35:10 -0700 Subject: [PATCH 102/316] Removed unecessary exceptions. --- .../thauvin/erik/semver/VersionInfoTest.java | 33 +++++++++---------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java b/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java index beb6aeb..95429de 100644 --- a/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java +++ b/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java @@ -49,8 +49,7 @@ public class VersionInfoTest { private VersionInfo versionInfo = new VersionInfo(); @Test - public void testGetVersion() - throws Exception { + public void testGetVersion() { Assert.assertEquals(versionInfo.getVersion(), "1.0.0", "getVersion(1.0.0)"); @@ -80,8 +79,7 @@ public class VersionInfoTest { } @Test - public void testSetGet() - throws Exception { + public void testSetGet() { versionInfo.setMajor(1); @@ -118,12 +116,11 @@ public class VersionInfoTest { Assert.assertEquals(versionInfo.getClassName(), "Example", "getClassName(Example"); Assert.assertTrue((versionInfo.getEpoch() - now.getTimeInMillis()) < 1000, - "buildDate - now < 1s"); + "buildDate - now < 1s"); } @Test - public void testVersionInfo() - throws Exception { + public void testVersionInfo() { final Version version = new VersionTest(); versionInfo = new VersionInfo(version); @@ -139,19 +136,19 @@ public class VersionInfoTest { Assert.assertEquals(versionInfo.getBuildMeta(), version.buildMeta(), "getBuildMeta(buildMeta)"); Assert.assertEquals(versionInfo.getPackageName(), version.packageName(), - "getPackageName(packageName)"); + "getPackageName(packageName)"); Assert.assertEquals(versionInfo.getVersion(), - version.major() - + "." - + version.minor() - + '.' - + version.patch() - + '-' - + version.preRelease() - + '+' - + version.buildMeta(), - "getVersion(version)"); + version.major() + + "." + + version.minor() + + '.' + + version.patch() + + '-' + + version.preRelease() + + '+' + + version.buildMeta(), + "getVersion(version)"); Assert.assertEquals(versionInfo.getProject(), version.project(), "getProject(project)"); From ff51da6c5c6622942f107f857b9a36d1e05236d1 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Wed, 11 Jul 2018 22:57:01 -0700 Subject: [PATCH 103/316] chmod +x --- clean.sh | 0 examples/examples.sh | 0 examples/java/gradlew | 0 examples/java/kobaltw | 0 examples/kotlin/gradlew | 0 5 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 clean.sh mode change 100644 => 100755 examples/examples.sh mode change 100644 => 100755 examples/java/gradlew mode change 100644 => 100755 examples/java/kobaltw mode change 100644 => 100755 examples/kotlin/gradlew diff --git a/clean.sh b/clean.sh old mode 100644 new mode 100755 diff --git a/examples/examples.sh b/examples/examples.sh old mode 100644 new mode 100755 diff --git a/examples/java/gradlew b/examples/java/gradlew old mode 100644 new mode 100755 diff --git a/examples/java/kobaltw b/examples/java/kobaltw old mode 100644 new mode 100755 diff --git a/examples/kotlin/gradlew b/examples/kotlin/gradlew old mode 100644 new mode 100755 From 043858f4c08fd89c74b38710ace6a671c62cfd4f Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Wed, 11 Jul 2018 22:58:08 -0700 Subject: [PATCH 104/316] Added editorConfig. --- .editorconfig | 2 ++ examples/java/.editorconfig | 2 ++ examples/kotlin/.editorconfig | 2 ++ 3 files changed, 6 insertions(+) create mode 100644 .editorconfig create mode 100644 examples/java/.editorconfig create mode 100644 examples/kotlin/.editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..a6971e1 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,2 @@ +[*] +insert_final_newline=true diff --git a/examples/java/.editorconfig b/examples/java/.editorconfig new file mode 100644 index 0000000..a6971e1 --- /dev/null +++ b/examples/java/.editorconfig @@ -0,0 +1,2 @@ +[*] +insert_final_newline=true diff --git a/examples/kotlin/.editorconfig b/examples/kotlin/.editorconfig new file mode 100644 index 0000000..a6971e1 --- /dev/null +++ b/examples/kotlin/.editorconfig @@ -0,0 +1,2 @@ +[*] +insert_final_newline=true From 98c2cad9ff2070026350119eead9e81d10bb4482 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 2 Nov 2018 17:28:24 -0700 Subject: [PATCH 105/316] Updated wrappers. --- .../{excludefilter.xml => excludeFilter.xml} | 0 .../java/gradle/wrapper/gradle-wrapper.jar | Bin 54417 -> 56177 bytes .../gradle/wrapper/gradle-wrapper.properties | 3 +-- .../kobalt/wrapper/kobalt-wrapper.properties | 2 +- .../com/example/GeneratedVersion.java | 0 .../kotlin/gradle/wrapper/gradle-wrapper.jar | Bin 54417 -> 56177 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 54417 -> 56177 bytes gradle/wrapper/gradle-wrapper.properties | 3 +-- kobalt/wrapper/kobalt-wrapper.properties | 2 +- 10 files changed, 5 insertions(+), 7 deletions(-) rename config/spotbugs/{excludefilter.xml => excludeFilter.xml} (100%) rename examples/java/src/generated/{ => java}/com/example/GeneratedVersion.java (100%) diff --git a/config/spotbugs/excludefilter.xml b/config/spotbugs/excludeFilter.xml similarity index 100% rename from config/spotbugs/excludefilter.xml rename to config/spotbugs/excludeFilter.xml diff --git a/examples/java/gradle/wrapper/gradle-wrapper.jar b/examples/java/gradle/wrapper/gradle-wrapper.jar index 758de960ec7947253b058ff79c88ce51f3abe08a..29953ea141f55e3b8fc691d31b5ca8816d89fa87 100644 GIT binary patch delta 49471 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 WQGf@&|Fh+cf(#evVP8i7iTyt`4f zx_0eed#%;C%@FbB5Wjh0?JT6lz`($?;ziYAbx-i_TyI^!#rG1#w|K%|`|71$LxO=V z!X;jj;w66nMhNJ7&1<24VUDLzNMc)mgONof8=Nvzmj}t&z_-FdW{H}^a^+(Vb$deo zNg89P+{9^rM!8u_?M}hTOi}lJTLWfA#09kfpgTEdWVxlT_M{6?{QLZPwgxlmQ(+hP z)*m*VP|*49EH+HaJf<^9g_jz?H=ckUCF&y2I2?xAG39EmQUuB&OR$rQ6~Cpo({BM)vyH&0IqpOP`JyBAdK=*Z6C zvc-9spai5+X>!ap+pbPzVC}Hn7XB!lZCWsV?9Q0cEc`9Io??Y*W%$dA8k;kFlK-|$ zD@gF62@RXHgPA2m>Q`~4s;+41cvq1gX224seX}KvN0Wwpx@{~P+l4LegtCFL++uyJ zYkYyHEV%EvzX0V`#(ip9m+28C;v$?5V{JoKwlm;E$+wc$da1S=E2lKagv(N;Pv%8Obej2f?9H$uBt!+%|JQU` ztPy@fyRKO$EWGeY8ICKH$O2q@^VGn*cwg#^e4m8B(vQv7lCIX0eT)`bhLjK|O#i6s z6RZngBRYa+EenBUOx9e^abIS$G*8LWXA__yqN|UbxjDj`!}WASUXnx5Rk@Je=G@Ye zj9pj@KaSyrSmb6V5R>&w#4k3(ny0Qk;-lFoAk;`yg;Q%ACaNKZ%AiWFM2}LPl5a)> z@*3>{CoOx6d9`X~#U&@y3aQjEJwUT5O>BVd2nl9-9-;9iq>SOE2`Q?4AC|;;j+xSnQogXnu>2S0%{j@n z-|Z8(b#v;=<4D2TS{`p!Or|J%FQztB& zZfjnVBD=s=UE=ppkSATYoalXtlsKRyx_;1rG($A)5K}v6{mL4U`4(HdoOvUC4cIVRaW*kKwd^kj5gNY8r;kAmETVCh-SG%ObmFCi z;YJ%(RwPJ6tnSwo-Ywigolaj)9j+Svioia~yM!U-X7=r4K8>N+wIV4YY6O5j_CkHS zwN(^T__NytQY?G{TsL|YU0D8NTjJjFRT_?p9A=K#6V%siL_2s zPA)auA?cVozKb||FOj@NmVF#~-`u`$zDRVpE4kpebV-0ji zdsZs&$V=ti?$-rhQArk&p@|P~NlX}5CVvs&y?&AVg88lh0f`9)1`CV+U#AoUvkA7a zD*SJ^_}`*Pyd}j>be@1sT!qF5!gBgZoXMC4#q1^Q;pF5hx-t<^cJc=?UCsrMgor2n zYoGVwNG1Avam~d2n|V^l1InpP+ncIqwJ^`+H=s z`J77{DvSU?Wi*($E30&S4EC0SimU+sazAZgy9T=x?7hfucRW-f|56gBkQs7BacNv= zlJJ-TBo8K{0I>fH{eO^;Iq|!pfP;aF{@2wx|1a_`7$zXJg7F0lX*k40Q85Cf=3w^5 z846dmdiC4%_g$2t{~XS`%^u2)4Bj=Era0VUK$_oij@z}6m(|m8t&<2?((Q^gIv)YD zEA|q4E6ALP0M4Ge&VECmyV-eN8q)`19s7!PF!wdTHkU*4K2#`7M~NG1Ky4Fc=zME8 z=)2R4m?(hO!b~8zvOmW2?!sEK9++B3L=^|UnBy4r{T->M*v#1|H2-_k53i13-r{x* zrrKg}4pbxKTV)yA>(Gnvpo7WD1}J*Oai)AP+AbDNH}HGQzjg5}3)}Z78wjCKR*Cf3 zSL{Dbg+yAs+RUKi2$OMLk5Tb13|G~WZs&OROO=8Ag7`hsP^k)+SjMoS=A~@2k?4ng8u zh)iN`BPwBV0V1s0KOndunWULMw1F&)h9lx%T1HN6JS>x)LrsOe3p(03&XXPDDjw65 z-H|V#eH0zZ^=3zy#_}toP0E*3q4ECj972Ep6C1hl-$+s=JAd4dh^R(>3UC7hG6D(c zRTtOf0_gETnTKowfxch@uWAg+?!A7ti)r;kVWp(;*fF%U{w9~UQVR-mCi~`;i3rvu zvra4nl9FoVS03l|Dg`5SD1+dbN{e{q59sgs|8Ir=PnrC_MVmrF1_Pre1Op@cf64?I z$ks(L!CdwbQd!%?i;*VLlC3kjG3&*C!zcL3geZ*;4w-)KOXnIo=$_W&@tlzvODcTrkxrCTh@NV|eHHkP}k8%%`jT1SH=WnLf(t-HNp0T5Ci~H+8uPCejhTQ+?u-;gR z{yFSGe#wmRxPR1!IpME_r@H$`8Tai|hy3oMUz61!;3Wrdhs7tS`o zO}0mznME->&JJm{^>HiNFAr8{v?_stALZ?@7y)DQrI(GO-V1IlOb=Ecy6d-z>M7U0 z;E#poBPel5gJvjCBzPoz)TGc*XK#iym-?|Hrp4@@O^t=34%;vJ5)gnn$}qGFiUve= z7JTtWI$manJ)vt?`W4=^e9^^KR1TMjli#LiP1(U0oVH}`Aiab7Jj;A`RJ5*x1O0UIhxaJoD(}k zsp{m6s;pHuGSm|zw1vY@*`$G~OkBgZ$T0{yW{sniAHN-i(x zsIc0eblE;(bIfqfK0QzzZWve1n=sm>k9?3cite4PZVMn>za}Ojn7Gbx??9naZ(dVv zK!+=bXKTz#`YyKu5;;A1t}&ic2uCr<_;Y+no=$+k4nws4L-vWslHpP^Bt<&-}rDI)9g#~U}6^xq}idZA=b)36-9GC2Tih3Zw=bCTU z^1JU#OYp7bnAI^H&AH}xVGh7j@gaB8jL(z%ueo+NyCNP3DTBO4R|zK{W?o^RSjD*! z*Q=WStsjTQ2?-T#Ar-Kh;JZ2K{lD)h1kUAoHLeKM5P$>S0q^XwBF1fEmWPe(KJg3PyH5cZC5;wSpVWm{% zCtvl!1~fO0tt6(xNLFT(R)s6`J#ymY$xNk*eNznLIcon^3+KMU=l#jX&8q8ZugP&i zQm*AeWI(-fmoKPBlYP25xdrAh!c)mTtw7x!RIrZO5|v%jDzO3DgXIzFmpN1>cMKb5*vA}o!J5=&0rd}SqU%Quo4?tn4*h3{w8B+I^9+X zjuKkxBxu&|7sns39{Z_3yWJ>hFL)nSqTk=>9e%+KNr0!SJjTW##uCQHmcmt@#3$0o z6aw^OlBw1aWqy561t}5^^G}#=f$ns0k^ww=vTdsDQYZ|73`VDF=YfUvoV%2aI`{lf z3k4cH!C6IBld7n+#61I+S6N|_Y6cm9W9oFZKHRZ#nraFAK*Z^EGqoI7c}hjoD9{nc z=(<#Wd5v&#JSUs^FWo*x5Mwbu_3fWBZeWPdMK~@??a4tZ_RXMz@ASxhEQ(%6oGtdxVkwkZt{|5s^2!t)2PcJ}sT(@LpZQk++4j zu{z0!OzJo`TGmlbUVUzcmy$cYYtF%@1L#`Q666*C zbfPChDgL_ykLSi`RQgv;041oY4y`}^AXk8{n3eT-cW5=7*i9RqnhMsYJ65ew0+Y%d zHz)6+Q4&!QsDxEQXMBj}s#!5#G}3+P7p(JJBAncb#quh*sWYvymBW&S!Os_~$$$EL z=F{~aoA@O>k3w`LYhnqkH6WeSR9-d4@2hdv*^EByy%1$IM^nL-;qUw%UF$x3^tC)G zGldI{2sbmM$UYMJjx&> zQbhKS?f+^gr%;SB=4G{hwqn}Zfung-X6TW#td!HIs?C;Wk zY)V$dZv-tE7ntqcPms`Eidw!;RhVCvxU`!yOw!G02x{ zkR1+Db`&a0nFFzEh^Bqv4BeOCirqNcp5JZ2nO7@5m26oKre?9Pnobk?t&PzjhCzJK zhJ&NNq^AD6rbdg0kyIWNdh0I}{SnQO);y-sO~jZ>E&27~PoTMwxW$agQ3A4hC4@*m z)v%2ys@H416=x*|qd7l!zIITHYC~zWm5L!H z?rg&f=C+~wBjZtxsT(#AfI7)Sj=z;K#I#(`MZDD<0bH`QEO0FwG(RmgEmSx;C|v4o z@N3_1S|kGE3Nt2@?o?G)qOPb5Txp#35PbL@>BSFxG7;@P6OxJzrvr+ zqamF{;~*PO&N_pdrx@FFN0xHJ#?CVg;y61$g8SF(ytAqOh>SJ2vrd6D8}O^6vT)4j zxsUe?8-Fp5-|PtR&KB`48l8-da2PU{^#vNwMkcb#Tyln$h&`Cbg-|8& z41+f)x5O?mXCas3(Jo>ifj5R_7qL6K;RT*J58K5*+iklSudn3??A|xiezhxrhpT*q z!5b#<2XYq#$*@4AW(+#ZKFlq%_#qkeO9$Q_z?JkwdzfQwG5q&k!W+ew?iPLeiFo0b zvUX4A#t5&tpazWQ>CV}V1*Vi{V zc#_%>ntP=OX9>9ml~ytO=7g0K_N2yM!*2T#z3)Y>kaV*|K{!n4b$wXP%1EY`qJ{gm za;^v}9hwp;5fl?Vvq>=)H+~MStQ$vneR`*am6JbjzLd#RKvlQ6rl@Qg;G@0MQVk~4 z_>P<&I3?4)rf+P}RCiN057QJ2g9OSs>|cGNkdapx^b zv}*FMRnv`h?o;Mil0;nK6#Wu~=5id-HWJY?63GcFct3r8EPCOMH&QyQeo=h_z_WDY zNCxiR*Z4BHc%FHQKKEbXp3I`_axGL!nrWhr0@TtIaM%yOFbl(Ul6t}qIPL^^6RuY9 z0x>x5oO!1_i}s-%t^A!P{IY_8yn33b`E0&8V>00>M$;N8Lj;vsit9r9YwLtBu%GXz z=*HKK^bP9y@y{Gr!!v-3IwKm?GC*nAIo9 zew0xaR{K#ETEW#ahG*2eARWP86;|xhRP)>KAwo>(zlI*4bUN7<`lQdJ4F?vI*;j-m znsSQ8Ne-Jn*|z+r(V9t)iC*A5k|_8>?_}V1F&p9I~g&*)ecLM)^;z(cwE1D5B7}y~~;x3*5 zpznrpj29@ZJGXYu#f{91Ho`R{$-WZ&AWGjsDcz?*>h{NFKSX?KF1*XTsj^1vhk}Zn z!dj7oul!n=>wM-B`Fy$+H5%%4h(Qxamt$#9UTWK^lC`hun}5fjc$8L*=@)_S@Z*5( zV?S-+^IC=kf;VKHKc~M9SuhfgOVO4WsHKRdLo%L^ALMKD5vwj)zb(ixR-?gLxbfgJ z&={aXVrdyr8^c(o|KQgJzWZ*yAZ7eLfXuG`OR~_PUe_F(h^xCPK& zngs+HXOf>c^i10Nk`5P&MP*F1i?mUO?Z692>&nmgl>3m1fJN5@Q`bSy%bf^Oazk2+ z639KDTE(HOg3B@W$Fb-Knrb{5dcbJZwS;k7>;1@7Fs%VZrT_4;dQs(+OqAYrq`z44 z&@fVyn&ms$O+R8U6PqIcM~eVxF|gBmgUo2`hX|T=#|*!;Ox|#Atb}P!Wb$z=zj~iT z`r|Y1k~FfbsIX9KUGrBhFM9M`bKTe^f(CZ=g=&y;2*@>%vKV|X^U!$V!jr4?_-X)LdWQDp9Q@Z3a0m^2F)#Wxo(~Gl|YnHjg z2t!PG?R&G6r5tvJg5_!p+gbeR=q|;=vM#wUlD%t~MtYsKAw${w0trd_M77dG{Io{J zU%4=f1|f!@a_lY}o`gfG&F*2zYXuRZto**-HSt)Q9EbzR+!PejjWN z%f)-)3nZK2!)t<`@361X2^_VyN0$UCr%c+V5V3B}yx%FX74q0Y8^Kar+rA_RwcIp^ z856u9IoiBb2YETG4KP9U3?ONpnLaR?q6C&W_VF}k{382VLT;1|$AKNXkvLTqID#*w ztczvjC}+K7mo5h!ZZlzM`d&Wj#ZW^n44`zL$eLWYvzUjH6)0&P=`Kfnv4k0p*FbG} zt~I5E%_{X4a&S$T!`wwe8Pd7Vv6bvgCJM4 zeC)sQl}CCtrDfA!4JA>m5p|P!xg_VMFLaI)@E{9P)?PzIeqYV$op$Xeq$!szB(m{a zQm^?Wkb3S-kN_&gx`?E`$w;`3pNNJqX2lTSliS8mb!PT@5 zSkrHD@kY}xh4Fj8+PO6#Pqx{KG+YV%VdAdDvqZy4ckVHsoM^0AwyVOD4HYU1BJX#r8kf= z>;MoBJNV=E$RGo~tXl)H_zQZ2v_ixKrM$5~{tuub;2#XlEtnMA04RSKQI!xUfHvZi zm&~)i?fTF#%nQba`rt1Vd&w`qhZ{srUxyi$SnGp6bf;GQ5*f6b?qG_8N#ZsC6l(|B zC}MIv(+lh`F+rKp0`{*k!JOmiS#u4Z6o6}_%%@ZCdV05#3_$oemMN8cEFBQY`(%D= zF;O{;8z)o=J3f|}kfxj;EUi@euKthlSm#CKE4n7gZ-wTDd2i_1hp^NHXH)v+2e}jT&1&a{SvNtcv!2wnBps^tzyHr%_#f#NvfOvm;6H_4HSv;^8_-w57sLFL zjyGI-RI8$GYPQvf)L+%R)SMq2uZYxuC52P52!*R*?y%6c|IqHDw6&cZ5q^;25*kor z`1`YCv~AL>+wEv#;#x!`5L~CfB3N}|)VpAZE=Mkc4%Wm-+TbM;Rl1IJw=MWLSQo0V zsmKHOw!+KBIbK((H|3_((LTny z8N*=t=QKKJ5=X($H{R4{zMde*)DLRF)^)EZbom)Un6uStt>igAUnGZ?6_Ps}o+`RX zG4qARHSffY)+>9=C?>!;^J~C><$Ga?GVtZ;^{0ds(1K$STo4G7BPGi{hY5(3E5qGZ6Oq zBNuUiCPvw*Rv(Q8{b+^s4N$tdsxR~YiG}ryYL#}9^DaH#NWWnTYdBx&9p$x9oAQ8A z=^clHc<)6B<8jj?3%uQ=rFO-BzpC23#UC(9_QP8y!@rIu!|n;7Lho`M^=2W>cKLnM z8XzBLGg-sRxE1+F2+Tz^XFnYGYQ%40m~rz>)tBfq;uk0ZYX}$ApSURlVD9sLkdmeI zN+cv=&dPGkK_K9m80-J09W`O#jfJ7qB>6!nNJ-SsN!*mE0_a&ha1I2dp0Hef2K$DJ z#+Uu4Q~yl;%`ega08U&gBt0E2!t~}^*dfriMy6)dOorIZjL z=WXpwq5;`DF#Z_Jc>hFx2i(2d|FmZ%M-&5Nu@8+8SqWLFN5Zurus1i86-R!plcLOy zSB|#wpd^yZY<8#KL3f&+$l>zV$C8>Sb*K~ch#j5QS3fwp!vBTy#J@X#LN%hTl3J>7YE>q)*uw zg5Rn%!`dn}!<(Y@{yv01dMGSdwDTG0FDgYOTt*%R_sT_=iZXg=DpK;{Eg4D@H}+`` zKLu2H6Ow4%qWNnKjoi3k<@RF03zzSx(>L$PVdV~6f4o!`y=IZ*YTrP;zDoJLBnf^b zSUe<=7^g&c?~Q0<`75otwit9@jS$^E69oFJ54GGlKyBadcO<;{(Ras@{5=e(4-6rx ze1QwB*s-REzI6*)Bl^6|j<1n;hi-pExdblGPx%*Gtm`^zwMkL=DoB zULTPpz`K#%Lgp&S>x*VH|Diy;arg=$RM}D#nD#r~_}Z z8?d>ur~CWT^qm7+S6-e%zKn8({%~LLj5Q)U_J5cRRbmp1n?~w?oVjilmqOALMW^9y z5l0aSRuihE3pScb>xn}qC4uy^+4fRm&&wP8;uc?hrT6Qd!_#F?M$teQ#025dV+B@s zym)fK3J7q}%Ee3+^)xi}abhE!cz_S>Q7e}DhoIz|tMuJTL^r8nZwj;P#kfwrw>LEN zrMvfK;U9rX$V*m z(T6|eDu|{A_b5K47b0Tx`8YEJx~U1yS+c05j*Piz3hoa>_)Ri*7smGrf*s<)xeTJt zIivTqkXm-EkYrpqI%Y%R<$wW}8%{&b6J_Zz0D*As2$3ywBn=ZkFw&Urr73KCr)7|j z`nxM52FFQ*(mxqE+ZUq1+Fg{F!e9~53&&S~Q3hREwy$rM49W71_J`8I_ALq$Xrp`= zGpD?--w^(*eAoD;rB@B**<-w$Fs@-o5LsXnW3;tAt`3HmhK5rR2WU}X`Lb?aFQI!n zS<><2cc5HRRY$+>F*pHV@F6vx%t>i(jladKb6?jX8x$)YQ!X)2(kF`55 z8A-bs(jNgYqKRSIn(c6)7begoohO(pSyo^$2eQX;JH7o?HX~VFrZxz!#EAJ#O2e)| zno(`gOljd4mHV2HEs*e)Gn)FPIQNSxdLv(hqAa2~qgD3oTtJ+It6q^2XJsj$Cb0wy zpY0?T5`zpg=KS=5SBQY$tVFz~ootIRpMs79?bls`KvikX_sunT!|^K4O9B6d2)zs) zGA;Q?GNr17y1|iN%3~i$* z&Sq6Kr3@XG4BgmZ`+f5ZT zQ7sGZk6jyXf&ec{RQIW{Z%*^VF*^&%{QPD4tYW{c9*!E*i1rkuj9FniCW4)V>N*p* zw2=?h(*m2eo#05YAbZE@Ej>P0)rY>z=tGRAAT8|`A%*iJA@eUm=8I?tBq%>VNy{qF z)kpBh&{j^*$50tK`fz65Y^mIt40))AS0rp7=5@?9j750nSL;+(!ghjNc71BR zIwcRpF}209YfPikG~`td(%)dZ+lP3-ZyaV&>O;&Ke z!~CJ07SH^qE$dtid7UecMTgUv0;xcG3H0aHvPFs7ol;ilC+CUVoMPHW{Gp8+(p`Y| z`BSt=^1!1)PRpa9Kfa{0SD?jJ#;t6+>Re|JKi&qdrD%2tDXy-=Mfjj%@(9VC(~s|} zmpRmq*WpFh>%p|y8Jn^+Ylu`PMUhenmsw9NFdN+EzQ(m8x@{jUb|PmGwq6J21>|9| z^lN1eC-X*mu6ymr0uf$=$XgWt+_AH{mT98V#_Xghx8L}}UX$*@93``K{7lJ%C<6i^ z{&9>JClMm=;i`S7t;`-c#{EcYPLFFqY|Ab&8gU7}giM`eB*W&O^FmHb{+@^^Zo3@x8stK(|c2gLmM5 zFJ((u|2&)e#dG3WjQl&ZTM7c zzAEjD{Xt)dgk=xaq*$J;IL4)TLG8<@2pIRhw6Fzvv3YoLI21RjsD+(dUf|4KI1`4XHym9c84q?e_2c#4f0G0Z`^4|W7Zx_K zfPsoj1vc@N`dE7^iFVZ#C)9Y1Q{P%Gq=AA=XVXkIDP7ANMQGeFfUUmlIYg}SLwE9A zqF*O7sW^;At#0h505yyYzyHRZrA>bIDJiOzGWv_P@JKye)cHG1TL`wnxPyYn<;sKo zbuR$%zu_81{xp|>0Ry{4N!((g2j0Cjw6VUFk6gk>p~Usd)bo@aLPlpSNHKrkpk~Z) zd%|*(Nz&RnSurOf@I1$QUEP#9RZrV8b=#i3N5s$_&&-c}1F#CSv)I1zMkRm8nAu-ho5XWbTo#f5m zwIF0$!KdDj*bhM@e04RamHmet?>&cEd|OO6#1^aWk~N%;JN4^;EWVQ?%xg5kYvh)= zQ=9VIZs`5?o9as*B8lTr_|2}CKO{-=kvW^c!C>6rEu24ltjy3VuQ1i5IsVkp%_*)h z#(=f?ivgkGOQ)hB^HMh|a133-DVV<-h2LE?<2hC*;J{~|AmM`RNMW8GU2#G_{Ohc&x{q&xW z8ane6<9X^2NbA^L*(v6)9azN5%q6@cu#?hFT}JmM*acVoRj5~9ZqaXd(T8ag#iK6s z0v6E<#A_T0DFb2Fqpknt)tIsJ@=*AZg;u2NZPZ-H$umzk1_Q!D(UG|wS4Wj>D?Zo9Gx$5ZOpj!+pEkP!{`n%ZOR6)JXj_>)v6v}EglTXg+%W2@S)(=iM zfxVQ@D!dTMTB{CFH zMLud4B7<=Nr(p3uc#c-Y11941@@=%@KU|#CrW6(YYt*QD{4suJQ|S>)!OGoVvAH{? z{5b>n{DEP)b}yl^I5!GNJ#)7OE3aJt1@ItB9Nx@ALd;DJuNfylp?el@5@NS^Es=Vb zZ(%-E|MTFI-;`iwN*+3>1eSMO17${i{?fburX%VG#+4sw2g8&KPxu2kKWJ9ha&I$Y zdtgJv;FdCmlo1_xj*Lt%3r1^$su;^5eC`)Ne-rCYbAF7)e_z>Zq~v0vMo@O4rCYQB zZ9SmigENq34d4D|198s<)Y$)W2rq3ASS=D}Le+d73}xF!l7w%e$y^*67GJi-g0U^H z>9ynoBJ_s9j$QXQ{>$53CO8pue!xKw|FxPVXLyrddYJH7KBHbwi&{LR9zHrtqUN$) zXwcC}yjKX&-e!;n%j3wOpRGZ z3JJorX_H=e2LAoo6mi))rkW9D!^rdQV<#aC9G6Nv5B)V_fBHQxBMDI-!p^ml`H$x! zYzVNC>y-t-Pgo5?!2}h9`d;4 zi@&;K=UAs=Iqo>m0nO&w7^2bl$Y5NqmT!d~+4Ez2y6P9*m6M1A-fO!=^JTj^eKH#@ z&?s>PLd*Y&vODQ7y%}kvpSjTp_U^El^XyQ3oUDK9bFSrUH2x8ay7!Ox;_$5F#RHXT zW~ElaAuUXPlPxAitcs6T+;lVQ&1!acQQbTA$+i9SqyaWCN182&|9 zwfSB89aBp+PZC#ggY_o?3nasO?hkC?IAR2PoqF&!es8npY!8_OyrGBo6>O?IuHTtD^S=^Hv5-^nBYT5goE0-=U? zkG?}Vl2t5gI|rWpa*}PSU`mUshJ&gbldW&4HJw_z<=K6CZ1PfFa@n2_z14x zfLOB&M#1uNowiXCB^Gyy?g^Ke&aoxkS2!wvM=Usp@V3ROqWDvhbI8tL4A)B@fG3@4 z57;L4%!*?v^Xg1CFNj z?(CWqfh}a`iDkUn)y~rED*O1v`QLACS_+mf90nLz6&)BDY2q#mQDPSlECA=Pao8k6 z!;vn4$E;79-R9!$vk(QbH7bP!!A2$}s_~oZ&Oq&zd^%fSk0)xchywCF>EG^6HLT{(5?F zll+ft5#$k1r4G}?kjEHj0Kwp#-$2r%DqNz)f_l4b#Cu-Gu-|`-jBW6OhGANN)5vnL z^-2lSiMHHYfJ$fy5oaWG=+8^(1UIKSzy%Yn=?LLxG=wR78(tOh(kYbc`>mmDu;Y+# z44C1*Go_AAvxCNp%W;R24T_zca*yc*jkOqIXAF#J_oF^Kb-EQKfsJBzFV7#;_v|9e zf4zLZ)$X`~cP30D<$2}wH+|ECH%il|Qp)Ch6weo&ma~~S$m=M(T zjXy54SQlsK(LcVQ0Mjx4Y8Z^`t^}-lcM`q@+NS!u@c_BX=M$Hloh=o0oHG*}|ce%MA1OBjaeb@ z6db4>tD8|&pw$Rp9h(}f8B-aGmdtLyQ-S*eo5>G+W8ClHnE2F?8F{tv21{|Ui2J{p zQx|73K~88Cv&u=wu%jHb-~2Y55<`Hm?Xb4eTH~|+wiaWT2Eb=}+H^FYm0@33Io2yu zY_(;9+zrWd8XH@ibfZe#MSzr193^+pGwS)ql8{y1O^|JTnNipJLVJftL;GmXpfW&N zFF>qhgI1F6h(K^Yf8SrM-_UMLW>zIcpJd(Ppp)AHomp}wv};2Tx|q`@Q0?L-TuK~m z(lcnVtn@4dW}N$xNRRbR2a)Wk=8LIv^OkAsTwUuGcsP8{(b2L&_K9fAndb_9_)>t_nA{fg7GL}GiKMN^78ohe zjE&BCH)S=Vlm@YOH+)Lw)TyCj$W5H^FX>*pMx)t*7?-~z9+kfHVbY9rV}^5c#Y{S# zMO0Yk_#{}1=Wf(k-RJ{K1L5h|*$ZQC(ih;?QoPFqR$66Z*_xTJ*oFFm11Y_cTTJVy z?%I7!X^5o-tWL4L4GLjubRJQ}DydrogV102yQ9dN{ziyoYy-ME3j=iXb-tC$;89>^ zU9;r?4b$o>nKH}RolUe?DdWsy6RuS}+27@yvlG;^V+X@f8@ub!XD$VEdN6ev@De(T zB0bA%@R-x=c1?mf`z58qLY`$U0(3YNn=RH)=?Wfj{zSI`{aTuVlG)4F2?937GLEU$ zpjR7@MALIV5bc3q2S*(Wl75F7ZAC+~en<__DWg<>^7-a-J5F*HY*vD7qq1^_|AI!Al>6(N zE$@YKS!c{cvYWVNVylY9UclUr%T?{?gls}E#UDOVa2g2QH-J~GR{rXqadIue3d z^9_+}=23?+C$4(5e(aG>cd}QYh*%_=c0V^)RCUcrJ4e^lu|E8&!}{5S$X|y5c!t9) z-~G{~xvi_vANJ#QP-#JDj?dggs#PCpKjAq1E6E1TR@wX1UBA%dmQ`@F7k9{neILxEfxa zJ3zTOz`a^Nx3ml1xbW`Sr*`c9MKAPuJnmfM3*5N&4#{6A_85bK%eou&y4^mv_KY}a{Y4Mg zUy+l0`n)RqakiNzh3Elw&Q|Ti_mdG`C}L~D63&LC7a2sUbjRuA-`1(Y7*{Aprx(pvcdd! zQs?j493!W%O^scf5YK`Gb=~Y4Qr}!x|G1c*B|b>=)TfLnp@0jppfn{^cMmZq|3g)j zj>?oh`2#J}(ATeQKygr9?=QQ$Tz#s#sAi;D{)Rk9NJa&`DO;3_fQn@km zNl%izrGA6g#UKkHHxk^sL&E##44?WJfLp^}us3-HwlbuMqV4Ind)JRa_*Z}Tkv_D3 z8o1)9zIIQ;S z_s9N-CRI0`ke!mM2#cjsp{M{&z+KgkoRWRWy3DWc4bcOjoXGfH6!qWK-#u1)`;#|( zS;m8jjud_rOB)=SSc(^qh`ZO*&P73-DU=Jm#+}#RRx*hp(n6CkG;^%>o&dh5{7(O) zc}!%7#LTfpeZTyJB2ebg3$L5emC0V??KeSO2l;jwD{vn#i~1kbifT??4%TDb$AM#)#7R}V;YBey%lp9(r^ zE{pNPEt8?(PL0Arl?L=PKsgS4-(F%N4*R+{blfba@i|J{NjUu7bQ1|n-BLsE5F%ZE z6=5ak@beo?Nw=&Xq?25^AP`NG(R)GDtEy!-xuYPfDp$y`<=-0Ru4m{;2+LC6U_exw zya2=)C3c_Xy%ghj2_Ig zfi8mJgq&Al%`G-B=UF7+m5~b*Olh7ik25YL0S7;JG$q~k!TA}CI-C*VkCQ&R1iv<8 z6c98^1%^SGX{_TbR>aOQD-vK1>>n9mFv$ z_-c-=6a7=!Lr)M*CL7x$DMMq=wX5Zx>buig$^_TJPUY|m+D}(jP*^AiK4~2U4a{w# zo9p;YX*b=~vwgg2|BlAnkhJtCx}efi!^E%o{@I8TqEW}ymc%i2N&llh8t;C)MquL~ zMz->kPHv4v`V>Fa+c*cW8@Q}mi=c>u?daFD)YPD>01PLUCxuJF4DLaE$8d6ZFueG+ z?y^g;vuz_ucS7vD;WiLV)h12!_M&#cAN2cdF2N3?WD9lC{O<(VL|N;Wc`<-2!rH)A z*&97YkiybD?_-UG3~oNiq3BVA1cV8)Wy1zxY}&~A5GX~c-g{9roV!Cmey2k_RR7If z$`End@RBT}t(I?)HOrEu|6jiJbNOqJJ^C85YExx7{}VjW5DDJM|2XMUU2GK$Y7Jf{ zrd0b~PDs3Pd@Sy_nwCq5zh$zF&4g*@z@trR0?MWR1>&qEKL-0me!52V7NF}6VKqjW z@gVhv9>0l^zH$|*;p3@taA)!`{(u!7!6`#03g68z{%&)j$GM*|o>Rnj5?y->-4&pr zlgN?_$0Zychx`U@W2Ub=gELV}TYFJjAe`|4t`z8>mQ_4ckC?8!J#AZNKGi#_ z(~Ia|D|y;AU2p;iGV#BnNyKVSyOteUnY{|W;Ecoq_K0`Y=X%)&B_`llx7?g{Vs2h7`6PB z9o;?oRu@DHZ7c}b$R>B?18E*k*^U_fVMc*V@d_oimqa3A0>tV%3T(2y+WgU}n`~q={d_!yg zX(nmu6DdR>BD>~Y`Kwr1tvWqq}x-XWK=0Dh{7)9KBimevVd znD=wRAM>PuG=192CGCPxkHw~i=a`xOT*cN+f5+*qSuxBeVmt93J99qq1l;;xGk6Ei z?Cd{Oi-xmDL7D;<2ZC*U8b#!TM-wQckpEq1@9aB;8T=-&J_heq!hU5FOCbb&3X@%QaUf8BzmonD;w*v(w_ zo!+y$M_SKcMlGwI1k1I&$q%QDJ@Oq~pquY;@N2}wPtoveJRZT41mRlOQiQxs*RutU z7tpJKO)*U+4+AfP;JeEb?<=CIJZp9IRUTbZkBMw>Txn3u8U1)6q6w`c#(Pw56pKKwh&M`ePrh{UQw~ z+9JKx!_frx*ZZ(V1X-}_3`p^mhRS{cm6F0uI*Cq5E=ZC>R}T424?pq*tusJyTAVDL~=5gK4Vlnrvk zNsPRRY^}y)+c~H{xzK}`lL+onhyb5##Ihf2eyyTvw9y#9y8W|tz??OZ$P60rp_QH| z_?6up2F7?WJf2NR_?dIBccNc5sHS=#<>^RK#q|w@EWeu_b2~O%&9i+We%N_B$#CI4 zpA+}{w4h#gRjTrdQBS|XMqUUGc^$KyyeEC~+Z;aBMw8<4k4Kg-IV~r}E2Td-B);eF zXRi1zuW&Ye+_&VJu|4COIl73OWpii9xgK3`UV^Kpa!yTPoy)#~59abAZ}VeG^Pa74SN~7f0enP zY5fSU?i3(#k*aIs)q`EH)4y9&($D9%S>}@<%l5aqIDM$x=qEQvWLwE#P~LnKp3V%O zi@xJQK|!?WxVBvQ;<2ztCfC700&V)ydYFekOyNI`T#nM zsekb6-R{*)y8x_Zk~++?I=qhl`H4?Po39YoOHu)%8?|3`a~4Kh6I?B1Ui>rDXmwLu zy%;c%tKFD`zPmFprx!*wDc0#64CC_wJ)L{9g0@!(5Y4=YTa+*z;Svn;{iFB^O`hUQ zc$-xDlTEyuMDmu&aG6{ZnRDv4BPN9G27RsorO*-k`^?zTzkrpcoY>XIdTgFRly&FV*&yet?4)hwVh zx}SVIj{KA2W~QzctOl)1BEAtg=DUoWjkqniRTGpaOG*F*oTxDvgTR|o zI-W?jeFZ*2CgMx7SN=MWzlT7DhZ#6qisZeV=JZDAv^>_02>|IBsNfveulk87Cv!iJ zJLS`HuR#86!#W(JoWrnn9G*k0s?kw{^5VN*PAzkNYs6Z5j>LwOcKHvFb~P*#0I-<3 zlEMQZzuau<6M9VuTMl{bAO9^K!|w~9o;u&J4RY_ddfN-7H4CX^|vCJQL?Fm@|%8l^??)mn~w`6Bz9t>|)h zcp1(!q{WI&q1TXSJ90*viL}Dj3IGw|`H7^@+k5n;&JsOVCpE6^bRRlW}#FxyYb8g&LZ+bB;68ZaIviF`r zg7>E2PmyN`7&IYi3gh!8^N2J=0%6o9rbaXvFM&~!$wnjvwvG4(CY9)SGNRs7!bg;u zpCnJ#3R->Jp8C?_?%ov3ozQ%3KhC$qc-2;DpD+GpVZNiZgZ=j>G<>$8KK?f3;QU_{ z#eWLOq%3^G_7o%_N%ckV*AnshE zqpl*rjNi5c_PAP%)?pDt4{C%b6q-v#tVS+q1w;AvweX0e_J(81gW-U@y|JzDV^~?(z-t)^gw_;h6xmR1O(L5} zKf6&fQ%r_PAUSbNdh&^`;&e8ywklFO>UH zxDKCC`c@+4O0@TPbiMw;aix~osr@hGU@2Rf#oSEYzVFiRg?X?2(_LM>q)A{kw$TPNej zov`-C{?Ko=R;_Hd*5m*IW5iQ8bUMG-u7L0y#*qz6zR1QV#U52gyHtxCa~OM2R}c$N zCN&u_{+9UwHB8$-K{H{7_#Ka?T_5p4+*JdR*)u8D5r`BWN+XK-_zYYzR|bfqj0VCM zg?HKxlT-WX!AA{4!xy+K_d_`-3{c~cUkkx6T{i+t7%GS&EOhrflUd(?y0P#;WvR7e z54aD|9Kvh$$A}zJJX2whm_MggirzTEcO#vov=(f?bJy6{-B6=%GB9Q=Oh$&Z<$b zZnHRlX>iL|raDAb9g(rFWk4-fscwbtW)c1OSP_}pw{`6X@Ae&+QZDSRw(i2l{s*3Q z-RL%Oaxg;8fce)*Msqm8++7ESAzTNrm~H%N7*LeNkR?3ex%qp8IQ5^Ff_P4pzUh)J z)>#KKV)w+@NdHLhp(W4e{K8--&Y5I$<*DfbXH7iG?&v5rmamo@7bVq+ysZUMYoJ*M zjxDUv*k_hO%q=4%EJ45em}*CNRm*K{ORtqznS%Z6*FAPOg>mPTb(Z=h9_|akKdQXp z1spmqd%LAZ-ccS$y-;!TjE*-bVQCP;n3Mn{l(gY550bQkKwKS_!%I~2*P3PR#`wfKCVE*%;1cYec4nea z?kK~LR%D-&MKezRArN#&BFHa%k$h$tFL>}%GSfoKeYKdY=mgHZjccjIyp`y_Il88FtL~@dO?0uzO0~}*I)tpKg}2a( zNX1$G?(vF2>E4-OOrrqpU=GB>(Av&$RMyN)3*p^Bg2&z~7P4zxRJYCkPk=iI znq2yAeCZD8K99A{EhNO|)pcejZdgux2$ZAqGB2~R9q(U`P88z&O`KOQsB(9Eik66f zlJ9WL3tvF97dWNQYM=Ee2V5~Iqf6uZZ!a#54{X;HW>H5d z8GU*j*DErO*YVmu8DcD-lnqr&we!0*`j420O#zP11ly~s-3@r%U0oJACZ)N?Op?8Z z?5`j|^JN|^!2?g}yn3%n&G5?!(sO+ot*htokWd?uL~li3Pd1PV2@*bdZb68St!wNCm0N2`q!(XMwkVTjHhF)XGO=A0tEE`pneD1~=J+Ou_ zy*;8i%bDk(imT{&@5D==4(LWoE718*Or1h^#`se0&1=(K@RjB40o&6jnN!`w<=CtG z!Wi#_bTI&~((CAMJXaY{PgE7}@95Y6=T=4jzZ5cK&+)DJ?;I~)Xb=#F|E!J_(|CX= zRV^hg6|_$_2@WFM(M}d|t-_`tEk$~9vc}(Nr08H|KZ|rvi89GUfKIz35}^C=9&kv>miWm~eu`-`K-^^dDoK3*41-AzlfpRaE*{Gc77c0R`gg#lCq zrwk|kF4EMgH@zfLb}za5sw|w4J17R;P+kQ{F1Ljs(gR%lo0m1MJv=`rcW3*E2kxc!F`}F@ zR()s_XUByp50`;yKVey9G)xC)q|HR6OkDh5q5D}ft-z{#dcys@Mptv2JSG7Q59Y2` zIxQ(p4~cYv8VlBObdoh1nST< zb3?jB%LLjgYP-@2ItKw|p_O_bHc3$k6wF+uQK8_SX8KtNaKz|%HQBEl?ib^nM#(m@ zG(+7a3BcIElcKr=ub=6}X#+6lhArNJx8kxG2l?apT_@UgY)!(_KP0|46ErXveX#}H6{GKM7 zzfsNjZ%mrA#>;m|Uw{k5DNPk}C#Hg6>Z3p3xDs@x(3adFiCHxq$@atOJ`mr;(pZx^ zA+;y12+UEOrEmLgd;CE@(~sw zVn0BA8oWT%Y^y~cN@yE4@;RfR@6#FFBe|um3OS>$hzb3YERE1K{}M+k7V7|0jk zm!D63L6n)h%?ypG!l(j=F77Q2+X|N2~&y;dj0 zpw_|MmkE9dCbDYcp#&~?^A!+&q6Jq}T4KayQy{@wLi^Oo9QXs6x2b&Blc}d}?HYqM zt9QOpPxID^NEtF4MAX<{Dl!NKt$J zFPP_Xs+ZVSv)i`nBB!!FysbS3W%t!|jtVv|J;}|8*1gwY7U?=V=<3Ujkkt?4tGqX(of81jFeZ6fK)Jz z^F6j$(*rV>zO8g?QRSAma@7f6<9n1w1N{bMN^+X$zq z7I6Hn55U#SQlu~W{22u^=9*vsfc@`ZboDa?bm%7tNa8mYM){u=c6%Bfkfavoh59{v zR>jeHXuu6))iQ>G{1A+1bZd=A`=zx0Do^{%a&AyV%E~LO61@U_o5e!Vv+zV`wUMY( z&U2_yf2I|hH&5p3jqfYgH_PL1rK(}x{oT>iW=Gmn#@@uZR_ARFrXFN1-WS479TGm` z-UQR>weU~5(Vx4SaL{r$fJrSucPlJA*qsZe>_Kj0mThe82nV_#w^8+QCwS5qI{eLv zey`_kFAsMDr!9g(D0jXoZi4-VkUsb1BgDJwIEL)K7qEt$qXn`4XRIlLqa9QO@AxCR zo9h!KKGZ?86~C#v=OdHzf0)bvB064)Yr4<|Q&!$+`ih=-{@ z5`*m5GLW4#doYJ4i4Lrhb`s{C>lyg?rx!Tbmw32X1lXs)a3_P7!unFOGOr>rIR zS*`7?d1?cS>p*$$RnW4N>R942mOn&$6pco6qui9$kD@eazyz);#qy$fPMm_%kg}55 z>WXnUUMHGTeLtx50*59*e(G%T2MXJg`T;>X?GUNBbLC0`IIkJAX73G$zRVfg@#9}7 z3zOb?nDR2b#fU_4R5D0xMi=NYLoI6vkBL)U?9&5SN*pp~rM7e!F;{p>;5G3QOr9UdQRIU{c0Im0PmCV&lJb7%BnyI$GBBPcG zmQ-#HVi$j@3mNrFYs<2JD@d4?;SQ35%dN#uBu)V>9?k}cM^rMC=7>Em;V!6quvE2kmtp-f+RLd>Go512}QyZa4uj?&A8{eIu@OJPl z(w{aunIMu|GvWovUyHp{1@Tiq!%~P~7!kdz^ln{0A${g;=RBtb3H=aNCiT9Lw3QJf z0L++PjL~B>M)H+et(0azxty4$%j;I&;3Q{HXq{@vd8e;e^Bk{iY`+PsB=NF#i!kD! ziGX21aH=K&n<*ux3pffiKYe=EI4?RL?5HMubt32KX&3qM$BY)PFr-))co;KPl)pcu zii`;Vj^@wFZY`6GjRn?v+icVdcdcY;K*`{JK$R?=Cv=8UAUAGC=vG@3f?UQR_NOee zf;nNTv#I9ZWmnMF&sXAME!RLNe(>LVh7;B9tCKBoc)3<^nvercDCSRh;RM3fOt(yj zZ|e~i*9J(YHOXsih^~lpN{FtIb4y59$ZA*YP(VK{-RG5G;|Rfc+jRb)I(0>@Jw1NU|k$jdeLO5{wxvib(L)>7AJ* z=XDVN=w`YT!Vw5_Gdf*Sk{w#I4imLnp6reQaUKT<8EB?mut|z|wK`(oG!7G%DWf8F zQPmrkm<5x@@q&d-Eu*WZu+FB(P2R`NPPEixp2d}nvx^CM!Pd z_wIp5zTQo@MC5MQu=AK*4W5wHJvYqcnbxR|l|THTEk+Qo^3HDY^S14yy#Lx_s=erS zV|-G3eKY$(xxPS%aQ{K9$6y|>DiJ$^=BpWk4+)bV*=J7vspRmDS9dU+pCRB~VY#g` zInl?Z2viD~1?(`TAI=DHYf;f2&TyubuB!?QcW3x^;X?utD=F}-2PA)u z&EWm(P(LGs4nI6NhgS>2jB#?A&Y0?Op-29 zo91ody3ni$@7IGv*&bC$E{JSh+!p0+fSTV|*<@Q>jUHEAE%{Vt7$9$(o|FghoXSdH z5n%pB(0peGu$kaJcVIZ@pcLpYbn2SpB-p=e3Mt_U3B25)lICU{iJKAV8ZWH+==uC3 zmLFXGx?Pm+&M#Ou4lv*(BP6-3murK@@Q+RqlnNqsB8DI)%_wPLO0$ud2eSp?xH*9x zcG%8M@ZE72gpp5Lc$L2{R9RlY0#b3|lc3`jk_0sli%Px{X=F#Vqlc+sRGosGj`Z@# zDa)flkx{DjJ%0En_qfcrfFH&$AxlqIb@~C_18!Yp%a66>)YW@5Zhev^Ulqa!jP`r? z)MYf5ffQk1i4@Tn)wKV2Mbmb0MKKdcR|P%ihAvkA>O^Z2NVY`XIQ-0=vl0EF-NCM9 zD}$T;DBL))uyJ^tJgl1xm;-<&04y@WV~6jP69_ED0o2W*HdR~GhzAAEYkX;f;y-81 z1>e4T7{yNx*tMAmg&B9HmVG&>4V5R=@$uoIL!PsSs`$*7H z!F0KG{GsV9=jxbTI7zian~ZG(p9F5GZ7|KnHce;DX}kq3Uww>u`R^lkiwP$IP&|SR zcecJcG@x2y){1U{mu5KXiI#CYz`#nkXS{a{0L6&bd7PMpT}c&u#_8WoX<^Ku>r>~U z*WSfGT{mQ3al(~N77|c>u5ZDXKMLhc@VjcSHrx`cT~N9dR&cw5IK|Iy8hBpAoK* zMW;ax>pkw6EwI)yQ5iT>SzPh!!BT*gfHD}yAwZ*`RJj>lY0o)=YWXdF!2UZz>Ogo! zSrVO9q0&6exwl@X$lNYXREE_?rb#u*Qe{SJ{k%Mn07Z#40RXpW@*sR{-e774oMb=_ zGet}kB2!SfcO*8;NY^Ewk%&3gSx{{Z*ECGMycz$Ut~s_VKQsN*=(s^TyfbW3i#Oej zHb<<@gZzW_X`JE7(j%TtvwAY#mYBq%Zdn?%9}f{{$+%32dPQ1vWAS&GOHp!Uc7B;7 zYhZW}lX79nDPX2qv8=)>D!oiI8J239I)l$9n`y(~w-AJabs!W8TVS21@SeyJ;lirQ zA?6WFd&CCjQK_q=N3~l-aRTl@3| zxo>HUfiRz+73rw~SM+sSuiKf#g{jNl$ys2FvEYSM15l{!met*FHtqhHC-$X^a#bMr5MN$w(aefy1<%gmG^23)C6b8F~$_#>LhnEhQ3Z@w3in_fwM_&Dr zfyTzL#&*HIJ@5j;>fDTm8v0i+w;iGcf8eA&O1g;`O*nRzpSr${GL3gwW=``&@!YCX ztWFto0{Wjv+>@Tr&%iNQ&%F!j`$-BHSd~&pzEFkb_!$ac>n>)jyjoXtNM#T_ZCdx@ zZ;>LMo846#+{dDvovKhFfM)ym zZM6Hpr}bkJ_}c^<2W7xgQb1?`Lu+l(n=?*vT$(Tw^Ql$a@78NjZ%Rf9DRkNZjrINP z^|uYw+s~U<$Zfa@6qscugEf&2k-#3#qkt0LfY&^L96=eT0(izR7=y1$WRH(dlpE!rU&`-$L6ITky8u9_R|->f8P>1iV3>x~ zu=`U^eMG91e5vh08VPgrvTkjp#uWFrVmNY1zO$D!QkAx7&YW`--+%q;ZdXJR$*9=4_MQKKjYwdI$00S*>ivAE~N!@&p*PW z$tu`f4iHoy${1xTW?$2bI4F&DnBgjz%r=g(Jv#qhOx~ci<<#&%ZGI`($f|$u!9t~IDM;0ADo&D+3_A)3A2GFx)6t2rDo^&(v9wjKSWiYZr7p=B6oZ%I+bya5#hM@bHCR}#|F$&RGQqd;r?Q+)l*(immE?>uvhDJKjr!)HP0rrCdD0}G2QBArW?`yMXq4_K6;sgouI64AP)10x-N4Lk%M~lz*x1}wR z4!ZJGq<5~B_Udj`iABrOxS{<Zqb%GXPIbl2h_!Y+UTmKB>@?0c{hBCe8#x+IYQQCh8)H4c%mh_2H>Tn3aH{LwMQ@ z=KJ&3w)%XGy97^#42J*?ZzGQ?V++oO#ak3&BTt2v7zy!W?;Q&33B?pR8)to8LHG4> zD`J(PwCYM4i^a@k)S!t>%khe2y2DGuf6g_ivw*kG2yQq$`L#xIB5V4y@y~2C)at3M zAt^yQAN%4>vgvbt+TSS}Pa1I{>H-aBi$M)ktVpqwU4u;+276|a6AQTMWzr=tTdo@8d zBSvHI%57Bd(b?aOXcfIq+9*DL-UP#g|$k$ zx+l0QbtDv1402Lyxu~xcqac=LMsK8d96WaTK;^~1TR_JL%NNt6C*~4@VeB2zq_5bozW1(VUoffBpZt_fyN)KjT)zGc`n%`{sL98l_r8Y*-9YKKABL^pNnigZl^=p1xkrh-Ow}4_cuV zqPfFzgeg2{0&Vs?VGH)1fs5dBJX5F^*;pc(-N45==7B6sMrmK;;1mWh4#1);F7aJ| zBf4(|wOGenr}P=6LV3%mBl)B?(mXx~RJ|<9z%Cz!Il6J+uUr_W!6r5PaR`qL*XF_-=h2qY6Qsyq(xLO@D~=a*5i_ zd@|QI{-DURK&&jo887cF!2$M32X$h(D+8S#skqedCnZd4&JZcFZ+s$UU@Z*DP%?7# zBaB=rJk3qB-fDzNN^qPT`Pcan!T01InL)&fl8!JdxCF9bzNyWO7ej-SAE^X$VNY#1rzr;u>a zv9)dUwoO%P?Xb+6q|T+)1ce3OnhVKQ{5MP}h^=;Z+Ox5cNMssRRF_m*NrN6CxUhTV zk%asw)J?NtBFQ-#kLV;$P(mkcuV^Qqr0`2z;*|3Tt+&}R#1>ejHzbx<&TG^=`~z*8 z_y0!>{2wr|jKHvfe6ycH5kqN->`^yIAC+Y3|47Np}Jf{LvcN&Bt4|Gso%G`n~9 z(Q(%HZD+A9ssP#OhR?05$_|}Os>I`?8{^c%sl&@|d^C;^E}5K*bv4R43)0A_TN+e> z#@AD4?Uu5bNs1C=6$)wuLKHjlnO*OCV*pe|B|K=Mh`b}3fyVmpBOH&3i?LVnHrv7z zF$_A-9uc)~Td!z%g;=*^ZN_mxG=SL!PlTimSU ziL)8}4DJN^I=tMW|8fMiICPOdGyOvK$S6G*NdXdw86F)Xa-a1%%_jjpOUU8*3*LL2Qg=v|QvbDcNZ~%kA6Z`4518tx9Ss$SR6P1H@k-D;# z`s>AjO$n3^-#-G2ki*o;fLq#fQUs}~0jGfx(joX5%_KKTS9^oBP2xUTO^`qVJpEW0 ztYBNN3Ov5>3EAi8r?`~okw?c^+_HNu+E2W|gOi}|M^DQ(GJO>OQ*eM4=wG}Z zDVe~xP`lv2PNeFMY-8Q_Wt$2ZM7OGbR+2faflKC2=Rn0p<&U{>e2q0 zI13Sv7EizH7^;i#U1%1b!xMeQ7xv-S1kzXHl)oE74XgOO`sqi@s#MH&a{675y0`LGfN~mgRzP9!D4h`nw@JY?)g#v{1K_I^+Z528oQ{WA_WQt1KkB@ylY z9%>@eK58Y}Bj-zCjC6_ah(u!JfWd9ShP=4C7j=#{Ahy$7P+m}MvC=G8oKvzg?X1RG z^VpcStxy$ea17F2gx}~IxA$57^-12xXy>-=$eaN;o8DH%n27|8GVQF?aGQ6GqRH#f zP_W7hn2J5VBzS}$8s35rO|90Sz2`djC<`&FE0~iRcWN%C_QYaW!{|s z>x~N4ZK)FMtn+!imWGfm>JbFb!UZku{L+rQAGf?T_V&k2Ji~fyj7{ z-=l^gvt|_TAXTAlLTYs zsibZi&|sk*WQqDd3pbT?FF~>V6>#Ezkfiy9^{#U_g!;@ezw8g0$H%m?2K`};4C;zc z5NDIP_%p`g7TydXypU`SN3f?ocD9Ap2lB8=SE$I->&j4z{D$3yi6z|u{@IpVN3_)#UX-P69K{Td@}bX3^5du zNHyABTEVKs=bgl8n@bjR?fVb27#J~U5&9YBPMOUbw~xt0BRH6WA~=LTep|T3 zXZM$kpcMHkqD&po?B4&DRfyR}`sd^Uzss08K-(8w_N9Hh1NxvRbqo0KdeGer3ti6p zExIgzi{_&L=`86M$N)u3YqoQLka*9u*C9iIjqviynv%I~3hX`tlnUU&g5hYOisfB) z@lh+Ib<}HR&*+~-^c`qnQ2&?#L9LUksz@?~;*_J4=g;G5oO?GVS6BQXrF)b=@CM*i z=i~Z#UDlWCYWm3V(D798Sb@$;TukPSq>=}yK;tz$7+_PiGvMFdNGpAZ(Pj%({8jr8 z+Z=njaxYwI$eO~b+PTB7V~#F+Z|q^G8CaeZbsIPDL0IjW#V$_sVw&&H`3*5>Z#Ojx$$tu_5(ej(mz5NupLv%;3~hv z6{Bu%zPiS@mPrKQenp@$p3~-F^m}&T4A~AjYRi?r!T~a17lmmDPT?kM|3+pP=goG;AvRI7^l^9yACsuL~1D1zFk- zuo4gp@M{xlmH7&ni+;ftmH;exekBe2E87i`#td85SvIS?5P^-qO6{<@9(#cOCHh2o z6!gMe>dR)uaY!q--oen=SM~iLQ;nTAXZO~(siyWDBIf)(A=)fZjrcJ=g18JSn{zK>hoYJ2Y_tLPT4@Mhapnuod^~dk%jVD}9=j zo+a~d^u8a|9B4}uSPts#h8UPU4FH$#~_dG-c9F~ol>__Pz0{SB_&0kqAePtaATfK; zn;uMlI_}}vIgfkT#piT=4erq)M`Rs6YxK8|QX=lyf5|%f@@pjBW%|y*>SwI1fSVQ> z>G&zvr_Qp90Euc^}n?-$z`G0YS=7kq|&jAGY((ZCOHYx zm&AdKwIseGJ`1a`SJ#Pp3p>#gj3sn#i}>AoiM5Ii7r~jmht0MOjjW9-4HI}w{e|u#<@`RDA?WGpLXqDqWDNqgQScAGc&qT7qM0{lu8q^7f^!)Y}o88v-D+_J%m-%*HTnIUS@@;Ko zh}8>zY5)$5dPy8h!6_|H$x8=ZHWxyAr0F`P5v%R?iWZpDpx}yO`Y1w|nY&d^f?MfH}VGuWo^3%Vi|AeV|1f>sa~C6XYowQ zz`XjgKtG%ay?(oF9}#wlgRm(0nF+2)NTk~|5nxBh|A3R|YMLgZesltttKJQeXk64V zbrrW5>Od7e>P|33>P@&Ogqw1Mj3CKDv}fc^yr+a9>LkWwV5MAPaiLnO$GSju_63(C z^(;6jF}RJ^mFd^1#mCfTxZFJ$8)V=wUu_uA7%&G$O?ShEZk}%FB8QZo6|Bl#WhIzv z3gBXuwPAO2fl=P?n(X-NXRC(;OQp{Xqccd|&=^;BkpLUWC6#sYzmH;x^9{DBoW&ZPT&-iHY{i+#}<2Dj%-46%*B1?pZye7tqY94@#9h%n0ldb zLAgm1E1gxYR+GzU^DHkHYBt*4Ds-tnHQ(s2YiCFd z(>2y|CPo3VkntnPSv{PDi#G$db%Dpw#&aT-H|JNegH(0miFHnxdVl|_DB&>w`IiRQ z_f@x~xzxh)Ej|d|#w>x)m-zQ>5=zX$Jx=53MNVhv&s!=R=oZ1U5d_?OR(AQ$7!*GD z0Ab-%$q4Rn*lqN$m|@C{v3WXxeu8c7&^PmO8kMkF_)poOgR#Y5ewG7WPg(fBhQjM> zfx5GTGH4(Q{^)|YT3&E2nocDbx?{&9??9+!zt|Z+h+N&x^`>Pnqggo2cGUP_x&EvP z!5SAx7wmr{A>8p!8bE#_)Q9N|7~h6j?i-vy+;5$qr3yD9Tpr^3yi&9N%Nf~QF-|xM zjQxjM22ObdbSuH4XoSu-X%v7PND^f1YvZeg?nldLdCn__L{%qX! zQsVhc_TqGD1H8Uf8L`jH+c(98We|A50J z3Oq{W2ElC|XDq82T6ZJ#l}Rfv?`Y{C{455`4Ct%n^rX9c!;KWD#M7mTN8JFEaM!< z5qbK4fa}rPk2E5-4>tfxDCugoX$&<5B?WlK(|qteVY>Wx2281^JQn6BZz45?bcXV= zJR!|kd3{0R{&rg24o=YisaFd5ww4iIz}6^JtDAi5x$~qMa}JX6NaQ$3f58nOr#!Y2 z_at$_uD-=yw?A^$%1OCGrw8S^BvwR&dZe6^{(?x1XXPD9b2oYgH^+#j6#myU&L+8s zNXI2NRu%WA*3RzY;_FN1{mw?}wdsSD6P*Ggl8aFvtvQto`ZgaGnj^SBE#`^9&P_t` zVU3L|0fUCtFSrW=(hhW>R{2osRQKeK+EkRF*h67E4-vP|w+p|M$maphc(ijY8}Mr` z7lb8j!pj);z_^bwHk13D+b!czpf| z2X4W{C}^E;p&h+^_q02^=V~vVKbf4rGwfDKvCrIT2iiw#eEu&ahitbdblxcUO9a1-*V4DZg z_qC1;IdF|XeC+{Mp#EtmXk33Zd+8x>i7T47DElCi82sAax9OW2M}C`{Ool!Bk)M91Xi zrIJZfBU7U-_s4j^e6DB2Lf`!1Yr@+RDOk!xBozeZt*>3>d)a>yATg_rSt+rUniz<^ zL8iq~Pr^%dZ=M5fD-_!C0L7Y4BO$u>UcH=A?klu{+dXU_GC|C?C@g={_x5n$@_e1L zMMSCK(c-3D2j!8im=E#$ zZRvikzlw|!uG)6Z{rT9mlV&ozpJR#XK-n<5Y6N_&KEeTkRN02#zmSF+(;KeuFnLe! zE7WUUh3v5}ASvP%=&_sk`b!f;oSe2yI0o(}SX`hMAYa^DW$N_XN42$@5AO_L=N}XY z#$wIzDws+SGAkUle0Ihj<#jL-?=O$#sAQuLp>^cHk*_sJoUCrJ70EDmQ_?D5GfCqk zI@o%c`hE>E&~%yl%8=_6icUPO7d>UKF2ubOm+l^#iE2ZcrfeOt2B`YToNS0@F$A?&B%J zOsffyD&3n=r9cX~wF(CMhIX)$7MRTrj0vW7caeZh#?HwfS-!x|spOdF*Gd;@p_yWh zD#h9i<-qeQs*sCj;W863S0^$lvzYF)CEe+F;qB_|`Ffe?=io7JWA5QInv!iU^(w)u zvkH>RsEL^^Y4)v?xk9;X`ml;+4{ngUf9iACv>|TG$S^Z<4X=M7T2s+%#yXU6YE%XH z^VBiJ(NG;dxoAX8Y2!GFCm5!`u|P~9(WO{FF-wU3^RFk79|JNV@N|mRn+$I-Un&C# z>q=CFfDP%fzwli>>pqrLn&wawiK+5HVqnoCRV}@#`1jl)t>jvunB}4N0p}eT-nO@U zst7I56R=k}WM$u@zSgqMF?Mg9b(2mbAmR^tLJRFBq#^qNrqbBd+1j@GB%(17?BUDb&a>wdm7FAb*dJo zm{+ppg~ZXzD&yKmbmm$P>BEmt>F&9&TxJ$HB!eh_T(=hgrn&WTW8e(eDdUCAiduB- z7Ce{|ZXLk5BjKZzTw;A-&0(q3tG^OqSdp}7{7m{j|xT52;kf8AT<-={I7?84s(6s~S_tM|@ zO_Fq)mrD7GPV(%YEuqb2xP=xi-r)=szo#C=oqoii+P=WE5Mu5RXewX?!HyZLk*@We zX#huC#1b$4KDDQjY|!v73M3Yd;h1|0jX8wS_eEV_kMTTO9DxFVTwzPf!FRK6ry@&h zSjU9i7_XhM;XpC6%5RbqCFt)`UV4A2awp)j$}Y+%Rwk*YABK%grjY+kkWj3s03Da` z8})UkikeOC)=&zGdntj;$#VaFGXAGmm0!RB(`6uoJmlpYGPXUVX(VVIunZ~4tc0-w zkrMdtIi*9-hAcEJs3<}CLZyl!g7es3OWmmO~LpJvgovCi2Cb2~&hC5t2!J*Lu7pSlBkg zm%!WWS4sV2Ujk*k6-^)se}DbDO#Kch`wjcXR9q*hODS}#VA*eX!yDZh8;+r{80kcn zZX&El?`l^)dCX7hgYup#Mf7D&FI4E-vDsNKsBJBnt&&CUB}_g>=StYKzqmn`rfUbV zi0GOoGA|agW%a1ejAfwTcE%sci2C48kcu|~mNcf8Cu^nj>0vxg4KcMO(-dff4K`!3 zxCM1TNPiAmN;32R^Z6atfdtI`Jwi(ZCw);%xFQXsF;9QNI4-@bIemcWVRZk}xBe({ zt{y4=7>(MLl&aEaRGW7r=7)C16E_J|^ymS=kH)vK|GJiL(V|I^8)OzNq=+6B7;O;+ zOq7KT62TIvw}-6MnKKv`SRrXxHzyT`=aLZE%0Q`_Y+di-40SD0lumj93{p?k@7qS#vtpLM(v@((SSZXp0+gj>!j}kL5aS)eybl()foVeiq@#H3MMC|qmqNoB zv;HCfLOP8DGet$fngyPoGrzBUbE`T0#eIrxltMsE`v-ofj{qw0bklp*L)$vzc9f86 zfl0J-#&=?w9#z;vR$4Ki7W7xjTVvI4GUd!F@66V&ByBBWAdVM{XKT z+^6_Od*}&CtS2BVGO~x^!IVe-GhxO^kJ@kWQ~Id)Tb6Qe{1UWGIm#@@aP%3yLU3 zziY6<_NDoS{^(s3fRtqugi6YZ8?+!rgcxR%ViB8nnj5kc7o2%UPQ|9gf1w>GK&4@zcjAdS0|0i@I9-CN5T-giOdtYK~tKPF*uNpJLT#?Olcf z8~W2%H-fJ&2)+~@{`#jO2%`AA)st$*H3YTd;+DuaV$Ng$O)vS9Xs>! zE_kQb&X4jSgm=#*WB}jay;^N5R=yWXoCPw~rCRmEMt%2P2XvZlsSlarq0is)@Zmhw zX5TBz68rBc2J0laWas`~J`^|y7T0+`YfQyYCUv#jDYn8ACW#^)VWrfXY$5i}b^$8L zk~o->48D-Lllg{i1`r2-i<`N*?=-5^^%+U0FW9n}u13p|nk-52J`d!F0vlB$nF3%jYP|UKI|#R)hca0WXM% z(MFN$UI69iTis$;ynS7*eZI7T{pafW@^ros0f!vY?v+-ysvI)oCZTS>e#Ure4Bn+K zdVXmT2!8r6?-go2n4el7El{ZL9GZn@$R!zG8tO@5$I;>je4^v(!f{w_nKrEH z5J*SD5T$h9+Fw6kxy$PEKOf)yebIaYwd<@ag0h3e%RDVok;M$|+3oL63bY>k=*$sm zi{i4hlS9-G5Cc79c#gKU1K*$=zg?MMGmlCg^+`8|j2&aLwtf~AA0VZq>w3sgI^b%` z=~iz`9B=+YAw4HR8BVr*hMm-2<#e&lv0a8E>_-mM3f(Fk6I85?%_T{Io#pHlhZFG6 zs^t;!?YErA?-^A{h&;iesYsqFITzf|Okp(G#cFAs&tFJ2i_T$q6$pXT$t(-QU2#B}PWNSwMv=dnvERR5kRZ>Ud>6G2WLo+qzjX(v)~+ z-8#=Y&Y{9)(X^*S&|fc zNwdc-PTWXi_B9)}&)F)AjU3kP3D!vl?w+utz*jnH$obSxi7g#zow(!atm`QIfH2RW}^>jUS*xayh znsdi>L!~3f*EPirWs+}RxEr;?bqSBCb-V5sgTD*;IhAK9`6fh1y+ozqU3{`gaOuNF zv`+>7SQfV;R(APGT1cj~sMxnu-Ij={u5m2I#0anVp@`%tDvdLRPzY*;M`aG4SV(oe zOdY#7Sr{_#ew%G7^~4*cK5!8o%#zCxrSP*CE5a1VM(f#hVw+vvJAxn6#LmK5pz`@& z!6Y4ej@lWJ6`E@5f27Z*1sH!hQOd zp{u{RO5d(Zas6VIk1buA5qKN7>Uz$zahL7*d+kEb;N>vA5DI4$+`0$~YW}fff8!-N z=*#iW`89T9+mknSWA@S)6*SaKd__gbyS|VRC1iUa73=30ANFm#m;aeqP$kYZ zBYs;a;nVJ68Y7W>2d_m06G_0$*D^_A<=x{$Tmceqn|`G@8XHO>64kOOEEuy4UfI~aNDnH_0nU7l}DjBp~29}X8cdINFE=%!-F3Z;}(m10> zA}LqUt|XFm<55>otuM~_v1eSEMHFwIL9aRMi;#R8@~Q|e>X}Z)w(5oG^av|C@Gsb3^XbkNG?>j~ zS4w1V5gaK}N}C`j%b)hxV}e3;T$pRb&YWE7wJq4T@@a^&V0-?n)tys)lC=H0RUowu zTK^9J@{)bH`-*NuaXy`Kf7V_5?5wt(Xc(LyX4qM!)P2%i;J&r2E7(V?eiEl zCSvUK`YVKNe7zd>lH6*U4fbNxCOjiwwdB)h$DFv^zVWzyKbC8g&3oopGnkCT^(;yK zavHwmcp?UJt{1SIj(ADVm!huK*`%SfOzJ!-$WEEbrE0uBvu!rf#mdif5^Ly1apW*1 zy~)wL2KtC5@&7UX;hrUL?%!zxp* z5bdt3Ln#Li$kGV5?x5&y6HkQL7j_ND z0dr;Wub9#z^5kRAi%Og?-qr|e7NypYn}uG-a*R>xI1HR{n%0ro0yza%4%3&0XErir z@S3e!ioVI5qk>Da)z}YW=8 z?8HIbawmAYo5Y6d(&$oD$a72pDzcmyu_}!~lv0c8$}GUlVP^xqbHM7U1$t0=g7x8< zc_^Q{_%m~XwiYir!AXNj8JUYlvQ8&U#VDG%O)-gB6>5IV%#ZqoV=6m6lh7xxFO!iJ zCdZxA_)&E%4Sfb0dedFOGQygu+Ml0IPU}IR`E>iz%gkqXEotQU{EU5q3N3TJg=>r| z;q_;m&7wsHNp-g@LRa9slYNi+h%q$0cOlfP^;|ngO3?yA`Qf@pDZLx(3vl#$(awh?un7tP=7X>`c(94@!9tz85G@m`DElG3*p;%cMesSPYUX^)yvb}srbM7GTgA%}gXH~ZlUvtVvL8ja@ zyogRPLx(%NHa8dA7i_I9u$7-~|AjZItW;g|qQz`*;MP3i(ge3xQ9al3}Qxu)g*17~F4j9s0ZuNg=dAUK<1pT+@@7Ciym zu1)cE?{1Mdj# zYyFnup9X45yO-mi)Cas}cZw4#`&{#;;;W^8#P|MGCsMJIJhGK5@^Y>~vzp~n z?|BFZab}IeCC5VwX&j9>NP%{xb^m8}XDUZ9&0Qqnk@n5GKK5QHKcnIlMB5(I_mT}r zk#Q;5=_iUY*sh}p+*o5;52Va}Zezu#7Mv*dKib`NTO|yryWzhDGJScZ@Jt-u^uMi! zN**lrr0EP~X%Th1$#f23EXQ7C=@OwO-ndX0euIlt!)GXyp|24D>L8-^%0g3U+^%1( z?pj^qi@-76=9}wF?diX@4%ulmio%px*GCM{-Zx*hMjouj|_h-8~=nY3#+rJtl@yWud%)HTA`zz3q$Ps%7YoDT2xtnaC`6_3tym>3i(6L*?%A zn7hV7Fps9%{O&Rsq@Zk_ZrtO6`~D@x_RGmToQL7wB=8wABaZyG0ssC>bqHDZJhZ#W z?Mx96dk5$_>-OQ}sS9SMJMuV{03XwXdPHu;*SLV$uHUsU`sT!?xdmy$WEow3DXrx> z8}^iosnO-td;;=|DqcGW{at+1rlmB5@whP!AIZz0a2AtjKx_ob0XYtHeA(M6z77%D z&^R8mdt11v!#@b4Zf_ir%UqG!@34mg{QJ!-T~IdhhvzKbqn&3xW*_wlxzC730>7w2z^k;r>`Q+7TV33Z8C(1E0ms1f z_Ti|XKNX8?JyhBY$i=>{{5D*bu8O|pKPkOr|Jr|Qd-^5M{q#sDqFSSptI{s8)N3ubQJ zC8f}zAKh<0XJbsrApY#3%7#9z%E8$$SCn8qI$*&*-M z{f?kXKNTq1t$tRy@vBXRE_}3i=RIqH>V3*5lCtCub$~1PzJ?mnXU_2Nrq&_>nPt;B z%(J92NJ^l3v6iqW!|m14D}$G-{fR=FAFjCLV}*DZ2rerUdCltlAz8+|h@nO(#xlPU zey-4#n<1#`(uOI2KMCYIBphJx7V#DzM}pnxzxFY7pW+I~hu@pdtFEy^XM0y*1XI6^ zb#j^l-I_YuEt2JgP8H93NPZO g*deErS@4UrK<)vcGA2Rx+H;t2P44+yIZ$Lf#N zK(-O-@@A^@Rs_y!n`Jn%W!ugA_)DuqqCP%bw|OfXb(3Nxv<3eNi{}bd3EfG$h!6RA z6JYK!B@`XPbA2aAIhxBqJ&z_NKk{|KPKH6++x-S%g!)TIjR|^kWQz;Bx($DsAUX<4 z!6OL>Dd=-js~Rj<*Yp}vFiR~PLwWBNjMKUELxg_9++n<6OzhPslyHa&dq+f}G} zCEQ^(u2!K>GZEJ+AKM7)#2MZaGn5ncZPO+z67l8c2xI4FvSfzTKvh|N$H@x%^{|Tc zex(K%H;>r91#?9kjW5lU?+VIei$*W}Td%`22oHA)x5)49nHMo3cc?=88(E8d+5J4- z$Z7JuMeIO1;z8b|_657tgWICtX)!;P#@D~1_yV6?2u9yIC=+u#l`=pK#x;@Vp zjh9a+d(|x>f;}-jJoJjmPeIg01_7&KPY)gMe_dh&_D`YZ8W-4YEV$c$^ykldE&KUl zgA9WhohwPtjCWNkJbbynySjqwT{?o{rAw9J!?=V;*L$HBo~`07FWo2nz9i*tlJbw) znCcfF$JdM9!`V7Eb;L+sQdhWrekR!HYd-uns1o9+Dv+aIg?7l_{Q$nMe#;=+T0m=1 zaVdzZ*iVgq=yA0nO6f2z{GOpK*lA8Z7!>{9nNNImi)`D5U!G}&tWS2Fd$r8md>IekfHlveM|Rx9lg}J;3X)DaA#-=-F-6J` zn&2{mzN5E;>y>!p!w=V-hpABhtf}{n;iiP9HR&wt18Me_D9K%X_|>grZ>eZ`*+Aam z_XnhlDO(6f9ciH|0|(3ut8$UX{Jo9pX{Li?rm|AT2MW=Pi}*(SpbwKXY-LhBbdvT| z0bw#LL|1l2`~_vtPB5d(v|%+_m)eS2`qL6vdOX4E40G0ggabBhCNQ>#ZEVM#b4^^w z5ysM>jsgqmuzNxlRGBfI$l8Q>Y|uAGN;82F_PRO_Nf`%bE*kTS3`$ZRO%j!pPU2rd z&|J~@1L;_tpS%lK#CMwG1n^L>a@=7oe_@qR74>y};@7<;wF)_K>i#f>dfdysPf()1i5$7tRA!ymaC=S zvh+khVf*V#jE2YwNz+u`o;r>1L@A9pOlMWd3ZT$Wd)I!w=wsN`;<#KdGLd5GX0aT7 zjhCx-mq>~OPn0L3s>yrVd9w%!t%4_QW6xTtbJKKydC%|YqZ`?hkxaQ<&z7IivwP%z zif(?n@%LF+o8COAOhfoy%JZNt%Au3>am2&2Ug`#z4zMytN+GpouHPIbFxgWhjbO(X}>QwOC#4Tq6^ zZ(ScXy8Crx9w-^6Xb#-T+~5vZt{t7+@?JDymY{RCKH0q!D6ACJS<-WNYb>46-OYBz zd#Z@+kUjS2tb0uClyZV;UqND$!TD5ugD^(gP~WR8zMimr0cigNf}!6_|0?1}EHiT* zUEDe$`@PE<#@)XB1|a&Sbp$R~?m0&{o6)?wDz%w51jfjIt2^a&b=8(stQNcOBq7Iv@M9=Tj%QZI#Tr|FAll@f14%Ri>M*WV5sjU8z7?c%Dm-VR22V;Dp_N4x5Evvk+S?NBDw z=I%hd+`4xBsMukRO?CCh8KmP5h}=nDojmZu9<1Oo*ctC`1XPp%z5xiyx5eC(8~i+Y z5qiBwrR(L8mISHoJ_woS0fKXT{{IwDvgQ)#1Ek=a#LCdj$6EEl*fpT~EO&}IPbkHd zS6S2!P#&;C<1Fo@gY@2(OflXvX?iF^S4K8}Dx|m=HY3HKE$VX-J0eghh3o!m;)7$y zr6zh89~*(}dUk(IA{%*1IS${)2A^3h&4c6%UCg}ao7@VAvdf~56M3~7Z)P?dbchnBSSxT*=f3J>1cPG? zCD+WQIU<7?zYir@W5Y+K=ule+{i5{0be=1>3PE&rR^~ubZOhMgp^uHm;8AaCh_qNd z*C?L8ue4Cz>mJC43POu7X2_7$>4ulF*0hr)Y>u20-*zo*L<3pMR3jXAerV$Cj*U4E zb%>Kb9Gj=fs^O3oFr1NioRA8aOM{j7n!L0qk2>HuLA;U|^%=?1l(kfo#kF;;@88P; z28)8_5lQ{4gKv2+0H#gWSD7jv_ik^KS=io~atflzCc9S;U{jHs$5@wRD`t1BbOixi6azPN7 z*o{@=D&Ac43&MGYN2`tOp$)H7QF$s-hE!FhX6%thh|Ua8!cyMl8#*_)(YDVoP4r)q zbp+0aIBl<|Gv{IFDq3e9N)t$kK5(VjQnlB)!}1xY$bgnRdYidBJI!!P8z`%G?<^&2 z>Vow)!{px(BQ)Uy9$QgA&K0cqz&B!ZJROF%CVo{{{B5?h(9kLkwemx>TZF$brFOdNZqBYdRZw?LfXNhhqmeS4U zdqPR?wP>SKtT~nOibBnOj<~SwuZrpGIWmp|%x7{U?cWcPpTq|khgwQDc{Q**!b-88 zi7Li-Ia#Pkv#{M09CDPidfPl3Yt;xcO3p`Qxh`C^Tpq{bb>XwC2wAekcbGjRC_V;e zpG<;sn&8CFC!_6AKcL!bP{wf2J~=hvcX(4x1ueqP>ZnDqU`;hC1~3mjju)hiW+-bB z`^5y={i>i8bR=jhk2>^(=_5g~dzVp!(m{Q=i0ej8J*Kv^xZ|xrzvY$BY(T5*Buo76 zQqzVC^ieV%hwvR@kY30o>DQ&hmq(I?FwRQQKU<^}4}#I8BfX#4KQWt~cOdf|c&TZZ+Zv;B+<+Pvwl*;a}{Vq zqzo)H?#a6A%M$U#9Hn1V`+;dYpd%Q?04QC^@0Dm z?wEN0-Ydz2sAn*{np6Zjb{lU~Dh@-u2XO>x<9wn>aa&p@3*eV1>KCXHtN>~wzol}U z2yu;;?Fz}Rcf}wD60*?twV?m`^c7@_7L70?u)M>4o^gD)iV)$vZ-Mw{iw~ltzj6p{ zzEhAK(0d6Z4-^Pn5)=KI7IW?cAK~}dmAUB7nY(`0(N^GIak)5>{q4YU`^8pp?J0ZY zPz=CBaVVaGooZP{Xg1YL;h*L1k%gt;Vwu4KxkKN&IQDi+qEqXDZQWz_)!`@2s@9iDScfr2(hgnfwAYE%jv(6o^Wh3f{ zv@&ytT!-F@03=?if-j{GDxlghiqqoi&TFl-35TAkEqIvFs~l0TC$ggZO8~7>PA% zqMN!e2Iicfg!GY?@0X>940-`LnasoI8#n z>d0l$md+&RGLYSSc<{|ixfCG|9$@JZ%JeNo-B(&Zp-$c^f$TjVZ@^U*#BHoKp?cvf zG|J6-*I|7yzYly49aw|~dPyJX*Suq!zyHd5V!A&++otwkq$z>%{iY!&)-@^?TSz8G z3GaIKue>dAb_aF`WHFQkoY}(x(*3(q-_*=-MpmqcB|?px&oB~++o4ne!$NA^R|FU2 zD8{E9YUi1`#()7rngn*;=S9fGfAqhV#GgE6EXI=dOV8$c%D(X1;9>jr$L|lc5e6NN znUa#S9BH8FyGQ2Sg1yklOlkU}_)j?l4D>)}-GGZPEp*@RcI%3^yCOmGNSMB3cFvk2 zC3T~>Y3o0O%QS;e80Zemka|rFMz@eG+5%Do>xb#Zs(oT>qW4&fDP(#u4YWnr4HwnW zbsJBTRy8qjK+`sMt_RpFoHU75iyRgXtdc{nc+uW`fl0e`O{RyTy~n@>+mb0m*1^3S z_4a8a4Sf}Rb^&8uHAaxNlcOqu5_1|;R_aG01@w=%o zvhjjRFQ&zDvj0cp8@Ysb5q~cg)d>L6S1M^ z;dJY;ow}vTp>&e9>pYJn$!?O?M*2ZWe}=m%dh~7CJN@NmGKZ&v3O)}r&Uk)Oz(65W z@U`KoN~KYeNb(Q{m3Sc(dqoe;lNK0aJe?L+Ptk6WQj<&YkT=Y};s0v#7Q<*PDrfZ@<*OGkZ2o9e6;CS!(L$Ax{4DF9qx< z5e_?WTffd5g7@_}18&eTU?{$HaO|Ki^vC++!Dndf`YARTh|B~$f_J=_AvPqE9wLPJ1fbmA?5p2yQL?E9vz;Yw1&{^QT5fiNI;j_sh=MstMGFQ<%YR=)&|qjJY_JkE0oZR89mXoq%mN%git|Pb4$@8t?jOa2 z8FA!w1#dyx_~HMyb;9F=na0oo@mClV@BWcy0zg5L{?{U8D;p64l7j;v&<_QswR}j^ z2;|N33Od34Yi)202nYyg#xQ_HT<;-6L9xApR`4JYHkfFf830q}v!(~>43r_q@%k7d ziT^^NaazDhr46_Q2?~lG4+@I*l_eIk|AFAZo8zQ_gHtWnatN>jd6T^Yi5bB8TsUAf zCbYi?U=R@m$z_Csf`}ph3q)jufB^6d69V{d5gm}0f~}1Rxk!~XkPhpW#b^!)NCw`R zKnJ|4-1iEamHPYpNG1WW|0%F0GKu}hLKfVuL zM8sYh#CQ4&NzVcRuaswAK_njF&$GOM|0=xv`)8qeLadNO^j-+S8$Zwi|7cbGlm9{k zahcbyobU4&^Z;T0b(jBY6#OSq=D&MQ@dxMsPyl>u`ae0#|NR!Swfy<7CB``pz^k0o zSCDV;U#MV?9`Ns+od0r-QGX%Sc{;$W%!mIHkgfVy2t)%(f&c>k2`ul199P-hYZ;stljp#xC=H;(k*=cz5_uO+-J6!5nNbik{)y;s(9)BgkJ z;(%!v(P93HoB|6j;=J+70&nHBgAEoi-u@Hjlmls+%z>cfVBI33zdL^w1Mb2 zOt~xv_^0px2Y7~@TAo)x_IGg1viTdQ9@s&rHO zK7I2aJ^qKS%>E8W1iFeB7j_@?@67Lzxv4e#_&KM?HJWVAY!CiyeD_AkfG^lSSipC( z5H^u(N!`($m^Tt1XU+&$FP;b}^I;dk@5D@yjX*@Ssdp)a4r%9dASG_PMGRCUZvA8j z+OS;*o!Cyqk2H&8-URGF9olfFv>wKk-x1f$^>2SMwUv^13?!JaLdIE#St_x-nt~*t zX)R89hE7{7@7`o>GWE_@EOIFdTQb$2BvuxOeHCan=yfwm^Ehiwo2)CnbEzG5FE8oZ zlYlXWC8n)M)^c0PQBB5dy<~)cP3x=(BWa6k%lNjcTCt|AW_npFIc}6$nK`R&f)~fd zx)MDad z1WYQcaSUIdz)6%W6h2e385T_zzWN1u+5tc9qC6aWJN??tq zL0H-z3UfQbS#5xETk|eV`*~jh*OAr>|CYuJ`xcecwk1SwEyNHam;0nUS|6i39{Kw( z8YEJ?L#=`Ej-mO#+I}8ycq>s}8h5CIWwO5VC2q~rP+xF@0|n_Wv1GsLf44C#ey9&v zz3LBOzb1iodB^&C$5Kl&q0^_u)B_lPv5pl=L{f$oIBlATS0m=!nXL3ag0>kR>g92b z-phsuD%g6<54ZyU_M}y~dEE6XxGg79cPNCrdPIseuULDL%e_`O|MJ_DOg@s|(|_)o zX&5vGY;`vX|6L%AUNb7%m>9jBU1eBeOtWdawyBC=BR(K&XKSD0Waco`nghfhV9)AY zKXPoHgQ?`Uvl$FasB_ScO6#y^>$UYM`?Fmz<+$&6hY(E+Dy4g;Z`8937qNY1I}~%D zTPvHmR(Th7!Bz{rN4Pgnr&XsiUzbKzgxP*(tW}01uYI^Miw4(c(d^O{6`cxQ2*$|y-HeU0O-Gq-H~>S=){IPkbG)^JAr5rZR8 zsmCI!>6URr%9m*#n%Kx;pV5bGr1?&$y2@o3+7~5!N_0%eyE@N9x&w&)Ak%1MAq!2R z<5YMh|EG+t<2d`?R>Y?^k`^gU(JzfQ`7U|ke>D>ENImE|(rL6XMADR;bNyVHyeb&g z8~p2fnC34hcSJzWAlTo#h(ox*lM>X8xenabChRVi7@i0?9I2oLNT*b5X%v=VX%nHm zLK>J0uDNggauuO-!CpXI4bn=7llxrqAE>0qV1XjzrkEkt-xl)RU&*X-<6eo6YKp4} z%qkS`lgrj$*-dcs57YjSmQrF{s|`I-)zOb z5npF~Xdf2~LNAT<_?IsozrzDL#J`+u>CZ1pmmy_Tzy%Z=UY3;qp$zPvm7tS&bH$+> z3;mYP9)y*3fY0TRw7Ewq`@=24CsWd{xP=?ea4P&K=$3Sl)e>h5#O!U7;f{Cq2q?=z zKw^M_egFR7(iH*IBq|?CwuKe}pnHOZ_C@u*g4V;<(UOwXeYvoS`o$t?4_CdXefcxq z3~$HK`|)5Q%pzbx8@u{cFQI86pjA#uy+md?XY7!PS@X^J!HVLVdQK}GRLfP`x}5RW z<5+YJO2V(djGB-rNx>|O4lQ?vKBAk89axf}rP34~g^YiJB@e&O_xW}xNJ6j*u~|ih zUVqpV{H$=e*oXLEpldGXy~&C&>VQF2({jD_4=PAAQ&IV3TlA%JT6yCck8p(G6eIJ) zu5gNiyx{S)D6Ot2zG{z|MGzS0E!l&Z1qN`^lu2&yO~yw8uCYt zL#$#41Z2TImez;1o9jdhDsrnes#%*Z4+y#_1|X_vYCfRlE&-)n=Pmw`6jkGEg@ri`E4jn zE5E=RQ@mCdbQIB(g$vv+;yRdy{=u73@n}y42<;u4upgeBp_D@))-^W`(J=fE1Pa? zh_*8$jyA%&X!!t+y)zC4Qy@hMmI&nNGf8Yo=t>tE%_$#mlT(_@#AGf!EmHbY+n7bj3 zll2jdzt=<0#{$e+O)pnfZ&9`ZVjO*yn!wbs-M3H9fU*8tXq5h2sJoBXV6cBEKuK0T zU6zpMOg^L&%)jOSH3UC_U%a0>U?QL1U_fA>`qZBCj8W$671%%MJ@uKrs?%HWSKm)D zu&)R}b>=G7{ArG=7qh=_-w5$DI}$)PX8czSeyPN03>*qUyfS}!V)n*!4`G@U#M#z`DOO-H9TeZQm z8kS>CKy4Lzp7}~%$8pl(a(gS4;;GF3N9jO{q*|7|4QJ^{il%!%VVFI;c`~Ud97zN3 zk@MJ1#KuHPG6tmY&hXpB4z1&Ir0;^rmRv_r)^6|6$H%iI8L}I}`7IAcf})7K6j|Qm zb%*D4TxpJrg_MYf?^mzC?*~zYTi&`J(z5F$Kr9y%!_99Yp*2WoL+E@{n6boruz7S8 zx3yV{-42To=X=c(PUe=|IJZ&D!Y82X*uG5W%69)X9b)2kS=|Nh;f0K#%9?qiR+T z5WZCS^Om{GAZ#|8wc%?VU6;(^$1X0@pP^@xQJtnGK}Ryj`@lL-vOOKAJF@qEj9aKFk z$!%QqBGq5_;*;nM6VvRvj{(Ml(C^>pONpS7SwyuD)<;deYu zgLx2gnQ7bE<5{e;olQQ5U0p2pT7p&F!**ndTxgKQ*u^*|Llv{PsPGJ->!BE2Ni}OQ zgE&);&g9%1`UJwDCRI{sa@URsv>!>5bZ2m!EZ3+v)41L;4;Iy3g)I@#{39-$p+j2t zPCa>$2mW^0tYyFAEVey{eqT8WziB6l&`Wck63_{opUka*O#SQXZSg z;+UV9VVRUeUK2^ED>0L(az$01k{nhWciS1EXP}@0(KkAqi40{RMQ+UV<;m^&8u^79 zSMvZuD*ic)Lp~(hnJkC?D+&fbxH(U)pb+OJla>G_ec6OnM?Uz_ee(F}5{P>&wF~(1$^gWg2Z#l)0G4eW^ zp$%r^C6vfh5ZT|Jqskm&&FNRE_136|p01L&9{UiX4CI)`yQEo>sZh0KYdmHd z>T{6iIZu-S)@VM+TU9L~M78%MM#vbiZ{8+lo|vJt3o2YJiIpRo7=t3_tbaDn;Dd~v zC!%Y(S*dkclk_l?L+0gYx@G)xXR4c+5G)@vpM1Vk5IV-Q*_WHjPh&!HnW5$i7V9>) z8Yo)IYh`!6SY8T$t#1@oWG}Cr!F&p(f=&87qZ@Kg}*_fQVjX- zmMR9=C7S-TVzgMbY+=89#8=dQFV_{8N&GX=EwDAg%&1J@jfz&goW;(VTS>K(_&edj zQNsuqX|Iy)lFH$FbjVA_CWo}LV171@sIDFVOqVkur>bR|^~r(btW}w$wDI}TYkIE0 z5tDoZ5Qb*+Njh*9+2a$tMcJ0`Wa*CZmfC!N%M(sv@)Q8Q9hN4UqY|t9UY(&^K_XIT z)spW}iT`Fj-efVK(C5ug`Jz%q zBGYZ?I?G#+>M+`vnmwICPj{(zQf=dC^-Dsl?ZRDcMtCd zCpKR$r}XNU)?_T1QeN-UrU+qG@S@V_Hv?^Hp-&#?G%>mN@m%-r72oMYYE*9~b`-!3 z9K>zxGGNMTSB1do(A5l}{3dnUA9KkW(0MikoBT2A+-;mAtSmsVj$G9q{Lg2D*$Cwm zTADBL!JeAuQVPoNQ%b#KIX-p0z+xkZhlP2ns+*y@CClRXnXQhxlFZ2w!=92(C6XO&poGW+FP&r2 zDKt0)YiQL~Lkh!*ZW>-sUnHlsB%v;cBYiXT)JITRDz9QMJoW^c*@{b#vxpiVuwt`J z;Am~1H5i0T$aePgu+y`tPbVLL)_&ru1xzSNE^7_^lO`aBZ*QhIp3VQdk9w@ek1|;F zuWUn>Qh8g{=v9S+nMw8+bPxoWGMDgZbXh|O^|6wfOm=-C%W?LgYL=f)HtIc;7%6$| z38@ht{U#mO>d}K`cBN#yJ*@gqptfpTm$2%4rcDjOx~k4I#b}+G241yL&`7=ncL!Ch zo}=-Nu+t94YF~GWkMjwouiaA;-QQYW)zXKY#of#6mLc-eY< zTY;ASlQXyZp0G8WrZo`b-+9eqdg5sxeY2Ev>g;>M8I2RpY3e`|iWkMMlh z@X?f*Y(3tLyPx6Oe3Z~Ug3y%4eTi0}V_NyQXjQp0Ss{SifP zpxP_dpK=U{SI)EDewhO`K!nbzPrIS@V^2xO_6}}0`emUo`%dMPJ9w33Ozsu7F3T$+ zGa$3mQ08a+A@v4)!W#K2?WMXz+!=`NT0<>a3-rxTxwKmSY%sFNp1Uy}ww$$c@aPp~ zQXN? zx1hc!^1)8|G)GCnub`G)gjwOuatE@Z(!0q?-6lqB$Sf12oMV*6Q~N7Qo?RGjEs?5g z_j5lkFpQlOE?eQVGg&D6%@rGHlQ+3q@tb{r3S)!9X@C||N}g?ag;Es^RF`Lz7xO(y2}&07p=R%#VDqowne712hMZ75jHZ%5^`T9crzqT&%csJN8s`5r*?%g{aa}2 zhjr0Fh53Opk;#?$^yxNnaqQ1-Tu?7%jm#Z=pArPp#m(gat(S5v@*6i1O}&^_NV7w) zC8>xfo`3@;sZm8x^$x^I?7)!CV^YBxCPC+9Eo$r2c}*>8ehQi6!;bKm@Lfhw{SmX8 zbTaJPSRbnCJ5&Ihrfq?PaIFIL8*7+1J*FMG?lVgxnS3Rid>Ooad9*yGMdOEcutmu$ zyWkMIZsk9Kx%up9npJB5icAy;;b%})3aAWg3a%H#^ zb0dNj>`#@0+>y8|m1!MoucG11*fg5IQa}QeUrrMML_|KC1Z}4VX>Vkt2NcIyVlkw= zhV{-dicXw8G^#>*qbum{mUq088BR{Vaj>csdeeCkQ(nX6EiUfXmmmuEx6NStDf`m} zwY|Rvm)j}a7+d~gX5Bw3Cu8mBjzoAByT&C2%=_(Q5SHJw*KuYNuW)iEhUAI(MR@W{ zLWs@HOdc@og5%kc1qbL3Y-+axV}x~fKDp!4Tdf#Ir|EUuNl5qMb=y&%QO?!vdMF0B>@eY(PO8$$j1PE`XNhExi zQ2mf0E{h;%GyA6(Em#mA#lGo*9p1&0v-SakY#8hhJ}Xqp7_MS+p*)(G)ytewz=9nM z0Wpjp8$<=wa_2wW?d2PNA5zxfJv7K-Gx`0uQmPhhW)!lrQNO{kjmo6ZjSP+PC`Y2! zLZ=Dq3uEv+dn&t|Tc0hihF*@uZ9a}b6kG9Q-flhcV^gbi$nkeWBWgG zE;vd8q-t)t;%ni45$Y^%-t&5F57%aG@yh5;MAo)IshXo7b~q=P@!1?_{DzfTTa4@h z*=p5jI#1UsOT)HZhlsz}-oyn|%pAG*W7TgNuc2>kZq=|MTx9#SbK z=sWA#`|j{9}ecx5wC(W@L2S&%74%7 z7>2QXWY}TVPJJI$65eAh+I2x&9+z(2thC(_9tSy#ImV3Vk_(+neQL?SI?=kU#dTcC znV{(+Mz)7M9VR(u*GHFuI?Wn6m-Qy##JG@zK9yyO#i~R~>c~h zVjUzj&Pa}Iiv9&5dh;ecW~NSImciE;aiFCIvwBl!qyP5(d1kf#<(+)_dD(_4{s`=n;+695nwm4RnfUwPB&*i-D)4 zO@7kaLU=Xrvq@i^;WhTWmSp)6-)miej~yRKdZj6PaS0^gXEcU<#}8Vz!ajBTR7QQj zBPSFZh35?@O2Y<$i#Y3zRaO;mdhpzW!-Q>D8L$(qalz%W``e@_q)GwB>tI>V15XH0 zLPy|#S>3uZ@ZKxq)W+erJ*mfG#k;);g@&eTI^(pQ6viMG?Oy+@K=6U9kxn5vf1t!h z?(w#E3eZD!bl6W7rmVUHpHAXf2X{IBxSXi$P}F!0$M8c^;*1Wf!i+Aw(7h2IFJ3w7 znzY-CjZi&q$Fk_ITY*+%yqVDwwz9K=7Q9PzX0r5q}cSfqfoh@5q4e` zcbRFdmQH*Q)3v2oaO&8K>+I!C?lAJHASw7dET$V#Wl=lWXdcsvy@f_G%gNW6@z&XX zM=Ena3JrjKfZ6d|5gNw!Mo*F^MGPd$Ba<#rQ$YK}xANnFZL&+yyn|@pCW>F-5~ARY zSA4Dw8RcT*-!~v@7deC&X}CzgtMiW}{IfCo^SvDO4^bBWD5Vf1lt5h6>y*OpFZsje z;}UF%d*or9!u)L!=gYl#rqK~f2H~R)u854euuL2+hT(#{Q(N}zxV42hcto0W3iSmV z0$cTkzNmz1?i;f+7-XJSV$XScWccVC++rJx4|?Kt8884xqJvD^CvI@mYH80a9TJo2 zmAa$Vn)`NkETtL8c6u!J5eEgtXlWni5tkFdIvPrsRkz*W=9%`dLjAFhy(gD5H4@Lm z?ay(*9v#>7-Y`?3J()}pDou%2pdzo=mM|;Gu+7~pZ&gpnAF4PY`t1uw5aVXrq-(t< zk0vTY8U{G?zm!4Js6W%DM}g~tg@6hfs+r=^95!EwKBj5*!Cbx8(LD2BJ)l}sA{7Mx?Tu)wX4?Da(K@3{fM4_TL7A%9V@4Zjtzy}e9Br_+656M=w&UI ze~LgHiiE@`rkGa_akCU{9kU#g+C2`fxAoVE31a?{;}}|7frJP!CzFbK6+5aiceT=mO5`2gX(AH6OcaOU|?a%g~Xh|mg1H$iU2&RM@;83 zyD%Jvte*5D8n(3@Ge%_4w@4=y@WgwJOmj?x(Kv$er~nOSv;wlHM&!R`RhKpBG=coa za%|1TN3OFqp1{{%5PClX7RKXYWK206)el zGriiDxG{mf8p|)XmUN}=zXWnEGdLOs;2rHxFX!*NPqhDmi}~^=ntf;Nq!r*`OGR=3IX zJa&e3Lu)+Kv)>VVK;r)5Q!82w+302TSJ@*&h|Or@(q0oJbJ#awDwJ2N-DKF>VcPVW zDf?;*@!yK-uS#u0q;Js02k9~ES;h(s(=qS3Ap1Ji=ypvNM+B@9Ah>{$u`G-9jxm(Z zA}tUSdk|1lemO{Y3JNs2kK+?Z`WJ0~LwHxTw_J6_*{)b6C}euh;0kQHMs5h1WJK%< zaz|=f(Qd*?QCJxhLzKz{_hP*-7pV{mk)em<9+7w!}cDsd5Jk`ytO0gvxL4_sK&7 zQP$e#+H$rAi1Y~4D5(<~wcPQPoTkzAieOm`v5d>WjF`}fZ-uKwnYo>e)rU}0R8pVf zAr5c-D^MEDfXAx#i=Va0y5qn`vUuK zE^+=phmY!D4D0Q`{6sen7#Q9EU19m7&`D#cK(027ANm^Zmk`6p@x#V1`yZxo;9e&5 zCQ$aGm+R07O^E9mI7ta&g7$$mY>SZ#HFfMZ*-VRN3cszg>JnN~cer6MSZ~yq;Ze970q0jL@()?;QjgG4AkQ>qMR%EJApW1=@qoP7LQ0f&N z1aSF)sF-&dJRMa)n%y(e?Yn=a}40mmaZ_itv*0Y!)9 zubDylz94v+PdUuK!TOVXe9XR)TlG&OK>1Dz6XG>l_~yCiCbzIo?Bl)bnP?MOSX*+h zaC{N=G^+o_?4~YM2vh81PqFSeLf)9j890f=me%l?!BHWV941^4(cNrU(8IU9l6j(* zE4k5J-(^PvZ;%7SNJh7X7Aa9v3r_ij7!00=h`67;s3e7+9(TbxerSn^I7S3rA*`t>BXW+~^=u!tv8d zthVCDgZ0QTGxM?6#_QS|B`v;hz~vK>OfnWD75Tadv52{ujhZx>Pb3A%kw*yH$zt-O zrS)c=kO&vfDB#u?CF1;L=+O`rhe~si>iyL{!g(b5rixC-Bh)<-^)N)ANiQtRNe#+l zoEBLl`xX%aKrqeCcdfD^k)>Rhn26~yu)pd3)B5<<+*m^@rWmvc{unl>J*!}sOmC*> zkDA3bnUWG^u|#UAJplOoc6n3LSjiAIe7Q|8Dp|xPQm#5)9GD5bcjV4^M8C4>l!hYX zfkI}wsK`4Dgq66zE2b(BbR_;r1~n|?k;E0o!%k1xZWH1w=^|y6Y#x|X@OH0#$4_*o zkG5>iUsW0~TK8HH#QaQEkTiDqJK|b7E~PaaaV{EJ{Jf>fBLQ&qRaEJf2qUiT>mrhO z=nN@zs0^uWkEgje+AiI3edgxTKQaxC?Gc2x@W@P`s#wN_0sHxI|4I+`UXh*S;8Tc{ zBoTf)?R=?}+XXlT#!r-q?%r`z&(Aq%~V42*WA7)S~f{mwHN$AH#EC=Z$V*ODU z&!oaQz|=lJ>;-;qbQh~=mQIC-`8>L=8j9?5BMkH7vHb1(~~qRaH|yby6EoJ_merQOh^HEp9hjp)p}V<{@i zs*1$h9yN4D93nKLRZf&6JB@rxs!J2Fpu!F$!?GS^#scU}6REJGDWkNjA}z=YB2Kcj zNtp_ln3OvnU)*}H6-H~uGZF<-Y-`MM?Mzdb*IYv^ZB1J%(APH$$4tvGaX8Q8Sg1rv z2v*P|oqaf+hGSqBFQL79AmfH-8ig~s4on10ATKp3FLm!1TW;@E$n9;44B4e4W3#N2 z4nIY@8i4F0MT@gH>sV_`Yu}k)v1ro8kgN*9bQESoDXK@SFB}VGL0KK@`cw^x{EM~J zD9ye~BrHEe$fd|eok-C5kiW3n&=qP%TCWe7cES>`ek7Mny(o`T+juiBuDeHR*GD3n zl257V*F`8~t;cL(EYMvYS@Irq&xotGTe$on+y-KJ-vn5dCIS~aycaXMs&rIOC;S`D zSTvQ5PE~bv_I@Ns_e{%Y`*dEtI)B6R&%{3hC#+?j={8kYY8jJCGLxMConfof>vGDC zhAT5_b5vCnXJ8-Gttxj@X<4?~5l6^l?$LK#%4w?I+5RVJdPj>tg64upX1@w|n}tVz zT^-oMgL`(7meajyGI_s*cec5XijJpKPqXOmb8>OQ+j%caG?Q#r>a~EzJ|s4b|B*lh|~3w1X2#OKtbblru?neZ>1!TkAP(_Pf= zfO_PlNL3b(7YMhRJNSBg<*0^_`t)R@ryHxyk}r6 z#+koT>Y~8A^L5sJYt`x3_ZkpOZs6AS;oo2;_MeH_XQFo4vAHa(73ldr5)XdC_&eT~ ze(`Mkj1`^&>5Ft_zBe`jV)^-=z4xUD6|^4#N1;p1dt;&4S}MVoI9|>cOe|V33m)L!iI}WvUTN@0-{D7|FBPzU?2& z!kmx7oSwk+gyC-t zQaD4yWR2Wn&X^$roRK<(Wily`PM}A{LN{x0i&~;SYAB1oJ+=4m-C~rz_x}LWc%>Vq zLNX`^Jbl^$4YY0mu33hsymi@#&gSf0AeQ!3cZy17r|K0`bgE2QEXA94TB&e#E*YxU zu&>=4Eud3pUANZ~Em~KjZ<9N8MC{)^EyKa39&e-t`geJgw}d^uKuq)wb2$158x6SX z@|#^);x!Go2U}fTDNl|9tXM!hh^l4`?^+oCdEQ3ri1po)5J6PQg#70K)pnHTb|52n zFufDfP224#;TOtn1Yvjh8w-ytkY)ys+B@-!e|&CIB}IAGpF51E@wtB($Mo^->C-An z4wr{u*m<~6S(8s{QN@eaK|p9D>DVL8C%0c_^eBZH6*3R6Y0%KYm!o5dF+T)94a$}3cY_YJf3SNjIWb$?0md2Yz4RIrs$7fa<(k;pPFDEbID&UtczbP zAbGE;oha#x!*BU+%FV8IdGY<|%XLz(ky@vlET)%Ir=O^J1;`E-^cC>Hwj6u!ke>!35*Wje37CGEO>OgO{08U)I3 z+afexE6tC{$6M97Ajs%}$kzme?=iB)_57hbp2edw{y(2f8nh&x(EhT<%euJi6v@gk zn6oIHEva^WCv=x3!BUM0OQ=}t<_bJA+&+yA7ww`$FWg&k z)FZ>1IjE-L22{X6)I~l?MutJAjG~d!*%Vk035wzx zLkX=e!VyD&;sG6N(MBD)@RMpO%DTuV`Tpm9BY1angtZ^ssBF_~?UHKk;*NA3Cwh)K z5$}>~{c#+D@TxcW%FpTT!zAv9(F2k4(@caHzeeZ_5)Mg$8gT@fQcpmzGJ=(dg*1Yg zBW@VTQlJZ*-yqyhkPhvQE5O2g=Z$Hk43fY!LbDdC(=$j*UZ@?iJm6eng{+e$UW&h> zU6Pr2^9aiW2eRM`oQcew=FpyQQ9dNBwVO{4TitzGo zUT-xt)?i}{_E=bAl)JzA;jpwt>11TeGWsTB%~}2Kv!Te?^82IU*W#@??o+AF5@(p4 z8hV(oaDIaKx%5;E!LotcEPZs;qbeBqW`ToRa4B{)v{s$baAqCiqh8?;sw#nnos7K< zE{zHcp_EjapDbOFbpR|5u0K7;Iqu`2^90j)Yd4jd)81|}Zn5%&uDz@$H6j+Z8Q2(Z)4&v}J0uWR38~oA7Vq)0MCn_?V z-RqB4FY-bW+$~W)Gn20H+R`tr&Px}mG)E+Jld@TYB5YDao@6;qP3vW}d8JPtVUIL)HNYLmM0w%8v{y21$8D^0k1WptjZ*!|$^(L35u1KZQ&>Fql3 zhz8m@{9xkI0I;6flCWl%Ui^3)FM_=lC&eV(PR&to%w{~Meb_)JM-fi}MC_C2mpgyk z+Oq6HzS3c84gS&tnAgHE;sYB@q18Kd{^EoG6kS;Uk&dPC5c3_uQo%vG>TLZFksJh^ zv;!H^VRDG8j&hnmYhH%`*>eHGd#v7ghQqh)|LHvv06^zQlm4qXG3l`xx2Dr{%L1PZ zsak&Kgwg}PfGWn!>p=|lrSkik`cr4fs022cRl6FCo@VmrbWi`KM6!{BOsQjo)oeHe zeSk@ihQPzqvbV=hX)JjeYh9slKqjoc-R5Z)X9ZL)X-WcN6{D5chx>)xFV)ls6aPu; zn#4{`fWcy`<~2_|Ij`Ng5?quh#z(P%!pW>iXU@Ssuh!DJAPRX;zbzv|2jN;@mhVL# zgRuG-_rsleuKzqUM&+2XG4DnEJ?aBM=Q=fQZHjE@+%2E%UygiRlkz;8!JUvj z$9G-*nXt;KWVW(d#$~rTaq`(PD<@W}!k88Yyi$g;jHV4;GdQNL2fI=^rcm8>xFo|= zqizL6zGp{Uv+I3y7m}7dsFB}9q4kJge+x%WhBlTNSD)E^?3?+?-F;UUmDRdvka+$x zAhgQ6huc2K+?}pXNFA|50&m`x5_e}yH!xpkrd@3gIp z>%I3*Uat=v*IvbUr@cXt4S(&d4=uId+X?9wxacSAb3r6_dqXo$vJ&Nq zaO1{LlO*vYKe4#9738xIKJ@z_B-s7~Uhu9*ZW0`Yc9o8c9+h!SXbrl(P#44|T&-!% zCM1TDa;5BkEKOQpbwriKl%Bmc9okmJSS)Gx)WyWv)a(Z(L=TLvG3hhc(1db)=ZH&O2|EjW3z@=u@C{UNeVY#U`4^3-ASN6Ln>A{wGhiM7|v zFMf?g0;Z!f)@D)v&$H9bNlCc^PG@M(mr#6hYFgF?Ww={yY+>xj;X!SZO{oghTixj^4aZc!$+YpY9;g6m$b6|YKE3STM{S82q zFvjX9gkN8-M+R{)q9pw+O6KNhoM;$`q|)q=6bKL+elmth!T6v*gcP>bt=csPs~QWu zmxCf2>S#Z}R|E04Y|~qHt!lek>!Ql~zFz(?r5~dtB;0=Na{cr5H_Cf|4-^n*kL|lt zrH@asOkpoB#U-Cvw`UKqiA$SvHk>>I%-D%;NdgW?nZ3P(Y7|l|lhPl!jk3U*v0W0= z>yAxrsOxV^nenh-l$4nf>pYtK`XIuuMVig%sJUBxNF~AY4+1O`NW)}Pgk!u&~5WWRa0EyH46q*(AWnRC^)Jpbm4!2#xxkPsC|IW0m}^jMsxM-2;00Muj8-fxno7!5Et4tw z;E~}E4MZ&Tvr{dNPC`Yx4=kE$&sdPKsAFS{AF&c@XZ6B_OJ>wQ4R|p$4Cv#0&$4)W zvSesm|BfHkmL!ithvWl*?Qf4k4SusDTKaDd_OEfdx>z?oXtDB4kt0$qsb~Z?=nx{W zWGV{qGoy;~PBG40V8iIf4~IA0rVQfss|BN;m{ z^lY+^_k!CFnELa72bH1nGu2b4e9G@0S##=Ta{t<8p1M(fCmQ@ET@x_V~ZZQG2$kjWA; zt8pf5V*Eh76Sj_Ds5t=Q23;FDO&u!bN7(aYbX!`9 z;!0@?wtED?|OijhOQjb9Lc-j~?}w#y+C$cD)* zw*9E=KJgQn$oYi7*hekhn%!+n01x($``IOL>ugOm}k=80I9Ql6bt#j$LT|6?}tX+t`OP33@Xq5wtTf73Y z@fVN&zlF;m&i!&XE5*uZ{1{P)RR-w7>y|D=-wPFm3KZ~+>K_n4?Q$KDv)Oxf1b+ex zZ<@PR4-Va!k)QkWvH5iUKiA%ndeIq5T)&^y>8NYQWWl5c&ThSOIo&@Z+VsMav=FZZ z&w7G(c=v|3+ZtW}9WKjki0O?1x$y0svm6K4BPa^=g3Qz9V$;3$iK7CK4= z<gM^BPFa-xhyn%zlty{?vrhDKH!{14~9*XZDPrvJ)DLtYNhYh?}B*udNX06qmN3H+C575?c(Iz)~#=(7n}nYdb-Yo zi&WIB18qjO#sCTQfq1ACO_@mCYb=eloH*NhglIbVAIBI;(SRXGi6fT8bOS2|tkKU4 zj!NQEtx7=DUX&Xb>#r*JWD+2do8;wR1j(Qg1&#w`Rvo=FoPTy`AEEOKO(@xXw#?2& z9Oj?=mEPSkX=cFV*rf2d{3Ph9e7Jpm;r$YkoD;Kp4AX9EXF^f*D#)0FmtKXT5Aw+{ zXiD*1;R+|CQ734&nq7X2_e&OjOP&Qz`wBD{-s(+b#MsuXI$o{D>wxF1S?2pa$W^(; z&mI_~%6Emc^fxMVzr-T1e)F{A>bqCudbdujgl0)6Z!T75E| zf_J^&^y+{ah3;j#6R2vm{^FBYD1^V8-5QUDg{*HoW8|Pfr9-Vi1$SMN+&;2;q){q{ z{s4)d?%+h1f|Dmk6;M3mdR2(sTYSs^Y@7W$^lWHbsC#z{NZ(s}^Zy4XVLi$#Rj%|Z zw#>^5P*iz45OqZZKcg$;`sI_tQPuwx59 z;yYs5Kk|0*$Bbus0x`#rWO@c>s@Lw=1BTafJ&E@3tC(6!m4uwGnQ|iSi5=Rh7TsjD zb|QFTEdNTd;RWceBW_J?qAgv60ySET7ap_jJEQIKrDn4MTx$0SqZ#tZ>Y?`uC72uf?Gxg1- zPE%iY@_n9YdAYSR+k9)JlaLrus=v2tcbNai*U(i4wDJY}S07XDCGTC?P|4zp8~Zm7 zE9NDLch$07vaLwl#(YF%iju24{mI)2+iRGxU`H9%^b4(Q9mE8_-MW!Tl=d+&KymC~ z9}eJ_k;eUJH&1q@Zr~}ywPMCFW2!ZuEJ)d_2vi)uc+Xs5M=(mKd6NuS|N0Zh^XQAG zi~y+woJew`Nq)m=$;8V_KcEx|<;`$amti$X*ioX}lq5GMogx2Df29;%FtjKtJa;yB zkjZ=%1&v6DZbQuUJN&T3aRB)(r9pp zV(I_m>YSo8iI#XDPCT(~+qP}n<`*YlY=6;YVo&S|C$??d#srg_d+vQXXRYql5B<_> zuim?=epU4^U(?vtim8{XgK>FmyJ?u5qOACpJ(-0n*ep^gxlD)dx>Y+$A;06=RAM`n zj1Q=z@72HaoC7w$%^XjbQsgWXO{>E+a%cyzkg2&jN_29b+Srx&ler})P8GOEpLV>A z6<(_*7?c57r;sfZva9hJhO?+C;1m4N_R^~5BL(w9!Y;f zU$HT+NUHN~VA>F3yk>$f;rj<|q?7P3d9okoQTV=b#FepffEPtSm{(z}u$)pqsFQJ` zW$DC+RWNX(wG(81;C>LWi%lxsr9=c8ner1h<4gj3&O+X7!M=scd&*C;;>#`ONTHZsfDd!UQ zXF39Q>a?*~zbM@?UKOJ@hZAx%tg(*s+K>pI&;kzm8f(f_2Zglx#!b zBha9t-=1Bn3rgm4y@xAn-|sT)5_EG75~sV4rLx$f+WoH#rXQ{^i;LtN16D6NrhFhD z?`qr>CMrtXV5FAwqa2_>MeY>oOr_{Y zv35AI5c{2lNe_fDcMQjTeOvmI(E^;!2y~?$*tts&m;pXyo$G;-_&_4ZqHPgHFL0m| zYg>EWWcBPO-e%FPXZ)3A{1rLgJttD1NYUG0FvSI%VeEzONTs!37p(7epsEInnjP6pY9L8b7sjSj zs$=-U#1;8cvF-)Rf<{6EqIk4c`AC4?Xs^v6)ONRr$a6#0bk+H6>7T@j!*-S=bg zzxDZVq%Qk?Q@juQeA=#t$$RY~L|UryQhTDhb`Mc^O&uBr`^?}hIo;By^-#c1QRW2w zCE3PZoME}*%*OE2BKm5kE%x!#%)_y8`%RgDdj`u*YQLv9mE3{SNA{ENHf;K`sZDfn5^BDF?|?7fBKs98(?MikBxn&F<%W@nj#tS@w|^ zTvD^T!MV~Jjicc`fn}X=(wAua9f?lBPLq$$hErK?b#VH|kQUD7LGH}cl?#S$TibRM zb~X}_kmKLKnZyk{lO8`Q;c4k-ve$+x=}auj!hWp{cvP8*I@N$Vx*k5pvX&gJ*uet(GS15fLfr{o!qCed zMrSFmnHoat)&P5;x#w8=lXEn;Iqm1cq^Whv0!ukS?SyQ2b-!WHG1ZxR00OrDp z51vmjlIDGXn2=Y=7DY&951wuX>|7VXVj7X!`dibSIr^h1^$B- z*-!3$c>!CADO`Tr%PtQqeq7CPUcjYB9)P_qd!1liZ7aKIBml?r1$N+#rph}HZAb-Q zECea%+l>C0dN|MmnY8meHhjYYl5jA9dIdW+&#=7Hfvr7aFu|uNHmNLuNrg+7!xt~E zAv8N>KZ%!cor`w>vL0Z^E$bQN1D^uKi^>a*6+|$+kRI{>&U=cR^$iI&nmxz~!t*0` z3mhGC$0Nm^fQLPKtK=C2vQgbPQ}LQ!5Ek-d^cE9o<^%{y^Z^}YF}h8G*7hn(f^FU2 z1X38Ci*JGEmW{AUM?~!*>4~yCclfQ_9UcMaE_sIv<#&k@!Y!~ZYuc(-+%l{O)9f*$ zOQY|v^dshVgAfD#cSDOBaJ`oyuf@xL`7nfo2}Hzs=kw$Q11cjwloB;eWmxnxJ@`56 z{O$6mA0_Y!yZ#josW<~Q$2i!cjTQSv`BgM;IZnMx{0z& zkpm^y!|g;Jbb{j+@-R?;D7u*u{He1H&x6QBs|-(zb(lqlQ!WMtGRdlB9E@8_ zEDkcVDyop-UYh_%5nm%)(O)ZoQBJ8+eVVC&0EmT${UQ_=GGPz&ArLa9)kccYyZq0K z5_^t0`V;xTx#LYY-;?uKc`C=3niBDUxTDAjA}}0e?>uLMG5m>~q3L8Ew=1$j~c2C8Xns=|mj9#k%nvfe`w4k8}&&Q-%r;FO=AKX#k?^kO=_ z78VAA+vMX)BmOpP4OwT^P>C;!Xy@=MZlj-Ufza$t2r-N}8C^kPg5)>R@wU>5c*`bL z1M-$Xoy<49g^+HtGThn;@L)^{33HrUw3*v)T(}M=`F*nN5#f?Ym<@Y+XnJ{XW1PW6 zB1iVA^0(9=l#QZrIp&aRpAy_Z8*sLjR2nX`GIY@fkBP)d89c+fe@FaPGv4gQ{C9?$ zNyfEux{keanQu=?J3B7CB-#pav=@HN2o$#@TRRCOCB_(@fn9L;4XIf~p26Sn(~->k z7bab`h;!-ex>=OhWqnb!pg2}q=7XL75Jj>Wc{EfC{1v4uF*1gL!XB!dEXIva7WJF} zrIN`qZu-ryuMrry?e=@+B-S919hI*iz%s^OD z0zT3@ELKIO@bNXy#g{I-6r_nZ0rXQtgGp z)+MDL@t)QuS%5l}DirC8SS+#-2GuAEwV_wPMbS$w2BH}8JNQ4E(;uvm{K3|S}Dyjy=?c8U~k@GC%h&5tH`Dq4QQggNDoN)qqW!`>cC6Gm#X#+o^q`AX0=aRxzcR7o?58NiO41Dy(h^tuI$BO=_m2h4gcz`7)z2 zOp+T%=;{AW4BN)yvi#>fT2rQ>8_?cCHhrt5I5hfPRe65L3I`*>g~%iVMBN96V1UNy zw*ezA5=w{r$^1OxRFx)CJo#c@O?l2+pu$?ofNb86_K8dM$qpSh1Sws>3Y981RCswq zbsIAcHx<|yJpSzQ@Czo!X;;Et5To#sXv4mSKeLIzN{UrIR<-*E4^Ga2mL1=mb&%M> zqKN<>7f{3*y81_Jg8Nob0&O$j^$c z|Mg$W2bljpSk&@cps~Ly4@|#QSg5`Z7V?zQZ(luLw&M89n1YZgQc>XMxEDdBX{?H2 zQ01QZzd57zTUO*yS{-OT(b)3qarEO-XGbEgY|o3|QkZPlniQWss2$1L3gWw;xdHrM zR!KooRDW5nH=mFG_)QsZ<@`McZh52k=x)Tj=s5S{W}+Gl$HSI%BI2{@(7`ttrVh^2 zT>xRpbTV>MWR!3$e>h9!@1;99kJXjzp`#M?QcJhZRN8bK`6^fmfyg?LVp2ODg zS3O!s%^qlE6DZr0r~5-Nq)isJTWRXAnA*+M&pj~1E%~a2vz`9;FUueFAusY5qCd<# z%we~oEJmpy=JJ<<7-Cu;K0}@Pdyv&={UmU)!5oVLT5qiZ(T}V)LrzMzH#*kc95k;^ zAA7IvPM=}Lu1QIbgWykYEcu9lUv;E-xwwr>9H_oCO$x^$AxAGeDIq-)r1H(=^QAz` ziBxVaBtKE(N&FDzgA9-L)aGtnmnFr9t30Nawp5t3cFXg@Leny)^Ql*yuC@G9#r&e% zkC_lp3TvLX{dzQKi*r`z(%;Jy2CGYwULH4&sxVt`o3cO~>zs=Yvm_v%$Y>_D!OPQ8}99rL<^XnFia^Sj(wH37em>x^Qdzp$ve_kWf2+X1GRBtBh+ou8=rSWi*_m zud}FjbL2$ww~BXirv3T~%?3v)7hykLTQahaQxC>B8CmwYKvr+li|3qrL~39&PlgZ$ zJld`#zj5Wcp(7r11DZx>F^O2m{>0Cppnv`58r|sNvh2uH*keywq(7@Z1JXFjs5#>H zM3IQU$^?X$Sc3CxydjkBbiQCWN2yQOv)lCIH1D8taWm5}`kULX~p@Gvt@ zYHEb>m>ov<+>L#5U}y$rb^!1hz|3W&daIAbo_T0Etss=Y=Y-_b*D=_JzF# z)1!TW%Z7>5>1Zz9{2*+xvXCXF8@8yMj%SJF6W;f%!`*V6l{-$5*^e6j(4Wf+Gkb+^ zoYP8gumSxZ-b%uuTPl&ZGa)8|?#kxnr?&xSYeJ}_YCryp>A#P_;d7vlRV@B!R!dB` z{YxZ;35Ih68Rh-4c~woOZcJJ=zSb_*=)e|J*gzFOdx!6)j{B42)Cx7Rl00FUp zPSNo9rf%2Y7kv9j_8<8TGbKO>%liC??b*ZUN(H?i>MM`C55ZF#Ju@j@@hcMo3IF=` zS(fUoudhGjQJw0}4;5iiWljxY~RXwAde^lkOyA}@&x+YC+dj&R+6c1zo?2eIt zSjrLYZV}Et!?&RTNMv<&4{|e-WPd_M0R3e#^gk15nMUZ3nv(t87H3(C0!j)hmecij z=46ej-{_<8S(QLo3p8;}C~LI-Q97|>NPd-!L(SHhbV7;rN}EHu%6!JPsRI6Gk%)-nD*VDy~S465y^8tXU;d1S11yg@`LTgp=S!4efL;WAoTIH}) z+&+)qsXGt`w5fbBKY$fToc~Gsu*W7O^{zE!{rz6RFY68h%g|ZM?n1impaB@?20K;} zlc;XqHuTD;EO!c^Dk`JL@h*R+gaWOP9&N#IbzE*??P34~{Ze&*QprWk<^kFUIvY8g zlnh*FHS7!q_a*LJKf}5HxsNi3C%z#n$4n9podW+%Bo$ljh!OWjwnV-{C~LX^2|suQ zzXc%93C9z8&Xm!7lv`Jp4duhod&l62dWd?_%kCedF-|VzzANyn_ z_b5^o-NJt}mf*R?%W475hIO1Jb)YJ4fva$kKkn%^9VpKht+Zudc-XNP~Jya`wcWO{rjrjLJcJ%U%h!4vaDL#@r|YK`k3( z#tMdcO!?ky)tSJZbxXx0bDJ(;F^kL?L`hMilP;Dq6FVtGTHT}KBAYK*pP7mOvz>*V zUr?Nti-=$P@PP6%25Z#DiY~>)p*{ z8Ek^dWo31*G%Jy5Vv=L&=iuwW_{*BGpUw8(0JyY#D$}U`7jx62f;Y>ky_lM?5HGGD zqJwTKk+;2?Hytrhx`m)oAS>pq4mwLd3LwS!wa8K=`mX1jm`99Ug>x!{&%RGW$HNtb z2@cA4o|EMY{(ZA48EyTKMLP{4i1O)+6()n#D(d;Pro{@Aqw4}T7rSsi2ceK~^v=|e zz^^0%GEHpVM#UaWE{e@M-*HvC{5?ZNMIXfJhGrsDupsi6H07-$CYKu>!D&a4k|FHH zI=nxZGv82*k?DrIU!}Sad1KW&MC6dedP9fyeEVuneUs%{`|p(XfaLmYjpSiWS}n~g zQ^Ri$2{B%`xgpP*{y~)ohJ%qK6)&*Fz(!v;%aA^JA=O)2A@y6{KPtDBf7EU{|CnBB z_{UyDy%K+H!d+BVdn`$4NjA$fZts>*BMm;qC3ETd-u4 zd$t(W4?EIejoHi(EtFHZS)&Qz9hraqajZ}iD&%~ba}UJXy4I1zM4)dXl#u}D0AZ=l zXZD7+N3K$42z@@rhQ&0SV(hW^xyKGJYeKX+@F}Yg_g?X4jphj}iWs=7a++E17VAgX zm7IEA<{Tm)y)Clv*xP@kfLSpPE$59hAIiP)i`Tb@d8@I#kbjDM@UkJZGq@Cfe@`aZ zaV0o#Ch2M4?Tp+ft-(V%&>ry=1^R?#!AkeeE&~zvys+owS5N3dVO1+6!Cq&k>){}A zC}MsN8sDJ7y|+Y14C>z~JYnyAp#BN|`K5L;%hL>JnVkD^+gkvU^@6k!#CMSf%71=B z@)+hWU~(!9KOwxVhQ26{ZGl*ebSl_?G6C=4nxRD@Uh8oRKIiElB?>lm2F~dBY<<0X zt1++Z^sWl3F*TkUUR6FJfPFQX57gs!=?M+Tf9Cq;)F&?Fi)yuFN&pxpNifHm>`dtN zCm>9H+Z_gPN*U&2!=V5QT2yD`fzP2Gd1p78&Y@AVBH)<)M%<^v?UJe$-jRI|vA&^C zXrq{#(?{luhQEKOX^-Luj;(TDkT*m=ta+z@Cgxfp;!(BU<5U-?uk90jyx>yb5U8UL zJPUA+VZ^1Ts5j*tI4pc59(KoaK~Hb*lNv!YyHxB*LYI+XWdDKuq=mL_zbcgNT@l9V z7FXVP+A}VUY`kK4BL44y;z}MLCi#n0{QXjn0Hy2l1Fg?Q^T5C*t7DoXUDTlSWWCE{ zewmev?BTnGHxkflyLl}RD3?UXM>D^J1=8$aY(iYNEBdpu^Rs`hZcjCLf4;v%=Z8q! z8uay|TLH zKbCY^4Xpiw0Pp8eHX{VPx|=8;NOR@BL_O`Upx!&H`;Lw2TK=2=D)_PQs3T8< z(L1Q9jX4h2m8@aXLx}g6q41K)k(Jr`RUyR`oO>8Q3l&3$sdQ>+}tMsGo^7SX%E!E8@Jh04#cp zgk3I)EM7ZE!ZL}?_5qyaz5gcGnO1a0llnso6Uc@SuM4W9T1??aK z&qC&#k3tqTq=*}Yg%(^&l4vfysGMC=7-EB5Rx>z>54f6E2!&-*1)79*=+{$`Vy=@2 zObvy^J^1L#_`iQuotbk<<}Z8AhXHaiU;+LG&L81^($$koM}d6@M-#Ib12gA`qEV@t zOGc4uAu!4oL2oaKsiuG!cC*Bl>2RXwZ?FGZt#9k)3DbekC8N`ro>K>S4%mLarG99< z^r0XfmtuJe-9Go(x^@??ec$NL3&iTddY2!tm+WK;lcvzveI(l=A&r_xgX&CH-U3qW zO_Fv>4(L;MA~|QM#ImDd?KDMs$>@a5HxK+(A|g86HT1vT6c89%Xe1Swx<~iFBQomZ z4tu_R44WhJOc^EKTZ|Ncft@Bk+%HwQ({>aSIFNxYHFwOcmE($1**0O)E5UAHD@TVt#TE-hIgVG<>7=Cvg0`J+Y z>>Erwf5f+rw>PQCZ@yBXFZNv%+-nNHn_D#IS|V6^K((e`T5w3^iJ-Ic>lnT?g&mo8 zwU93V7h=A-am9G3iju+=zQ74-4Gnqe_bdF(2FEuWyK?QGyX30_8@oDSekBlXR{U2G z=q@5x8%bRq0U~|10$Y)BJ=bGe_M;tb8Jto6b$K;AYir7HuUz)L&DBw?CxU1*(eZ-UBZM3X75;C)j#lv(=V{X_t zt<$~MDlvV2q6=b4+vfDT9VrqD)}y)?^wk?QZ?|?gIY#G)Ilt~-VA!K>cA_}S6gxK)5HVY^dGpxhsA(+-S&4J3L8@WD(H`||*cB(y9f z+Wfy(5YP;S_r2YsX)nMEG4O`f?`P^3_YiJ*=!kS_fZ6l3^_{ZX3yd3&ygnL!|Eo

    vm{t3Dhhs+4_!qHo#K(VRivbaK77`*iJmN8}az2u6)%aGmS~Mv3qeirrlnsVi z^7QZ){u_%-i&gW$ti9dB<(Re0#H*q%<6icQ}YQ&Q?)>NdBZ=bQIra5Ua4D=uu> z?LfH|h}^d~){a>>^n6HfPp}|VStPKe^H;yFMPrZiVMd9z6u5rFrN=+~!LJf(JWsA0 z3!mmZnF6%=>o;uhh{=p*O@isMpsf+mo7jdH;{NDs^yVQ6U8|2SLAQ}aF;@P@oKGYoJIBlxLyD<-Pjoq zbeZXZ>Ob4qm=R{2A6_~lpUHN!QC+P+J(=?jF}Y>~^Q^nGp9ph5*b*L1IZiH&+ZxF<_|3>?2Q-~aAXNtq`M~zym*XXbS01BeO1pS}=X6K0 zW&pMZ;yDfhWaenrGj7lj+OZ&+cAz9;)1xNI9(c4SiadE3pmTdecF%Oq&<=PRIw$(f z4%sRgaRD5VtbI{MxQ;}+aKmw_gY+Ep63%6e8m*B`P$w2tT#8z3mP>4%*}yX0s!Z{HhOCRmv?tw0K+Bj=$D~k4jsV7w zLA$rQK_LTk)|NGE`^!ea((0?b%~|6{U9YEj_T~&%0d){^v** z=Yz5vd-`1WsnlyFZZB8Nsb}Gatm}5LUmd#oN_b@b&#P<7FhQQ!jvI_YVcRwq5#XC8 zPgsAty!FWti%IoLa!B(Y;;#mSc0|oj(j+@naQ zYtlrj8n-Q#DFcxYhP4xmFTFR0HS4{Sq=@Pfk2&Fkj~(S`tdzVaO1AVOZIs{pLNvwL z_UIuu0(ug0q>3G2IaX2n0M52$K42(jh>Q0;1DA0)27+@|e|rCYtNDtaQ%--&*u)tn z=BtV_d@7rLb5RIL_mSua8t{gPEsumuzrl`ZJ#rM%>uCtRaYeK{=a}U2c0&rhy3np% z9FmnQDH^HfovMOZX;lwimQWTEH1RF#C#%^hTK$9mp#^U(56^-hE%X-w0wSqHMn-?h zrth;5R=a8nNeRFDy4blQOgfm3C=DB?HT&lcBajXwK$K`swQXN*Am4qAjicv|i#|6b zbne$O;9?xSP&=GGS|ZQcoVbfQLAB!=o!I3`|hvHuR1oer&75LVihgP zXn``N)KSaiw`Ye<6%8!JZY+7lhBFn^V`g-@lN}K8!Sv;}h!YewB$=7I0IcSE9?Hi! z6}bbfK8OMti$k(LWb`|>K7(LwHMXvplQMxo2LQnK|6U%ui}d0rSa0>wPFspxZYi?m zfkdXL$T0TN=c(tD6ad{niw>NP9U)5W_}^VVjO{Nm1APYecdfKDtfaBQYg=B7@Bial zf$+!hK%tg_P>UPFH6Um!8Q}RESxa-ExNvHs8l7?}3fi0v2Wd6x+`zD@?y{pv2BLTo zuy4DNnPYZLML(LmQc%F4YAaV>ef9#;#$#+n$}&r!e0yF*^40=TQ+={FXRe?gs3 zCENiSVb+hWG>Y0e-z=}S%(%D?N!v=9_->TwmlJd`@;v28>ZoeE(mL_j{Fztlk6vh3 zsrd`_r&By?M8Cs+T;9D}hM&?YVK`J(8tz4LfR%nj3W9iXI6`Do6=Pw(eagdHdaoeE zNc?jf&Ps@>y;09ZFL1jOC&tKQ>;l(r#`@3)i>_$GG)-s+@rlz*ql1CKF*=r}e4`M{G@6fjRqhZJE< z-X!M@v;yzp)x` zf|7b0!Z53zfF?+J4?F4>e_gr}@?>vJyAbdNae9vZ8%HBy$cWtjN|XITsUJkio=4jJ zVSO{acaGRs_+uI8m94#?I`!E-3t&8o8I3lTS)pd2&5(0_F44O>>lk5=J5N^(pPs^O zN84OphUL~`PFvAv^@DQK&12GtD-3-PRI;B(t4Q#4ML}i`^+8ezU^X;XJ%SGO4H@Wb!k=nl@dr z)te-Q(rc3C)-7<4>%3HHzlN0DNwqpWXg3`uzLIU5f>R$sYIQdDmt_eDzHoinM4Eye zguHsn6R@ctP@=PxPDd%<=!mV>YRD1rN+H=UtC@vX$V25NRmE%m`*tWcL6nZOVS;%| z)+4kU`?$`-->0UfVamtUm-fE+#$ZWxK`_PTG3q5{EKG$#Q=>XUf53dqM~fLJX8-8D zLp#AO(qzxtW7lao$Y6AFqo$Ov(Um!x^wYR`8CbJ-G!>RXp59=!s@BZUH*HYZ_?mmv zZqb=w8u1V0YuOpiio1`4E~?;6PA!&}97$y!lIKuFViuWqLgs0CQ9xs6903k;V=4-( zwb0q&{wzg=vHUi|)3eM*$8*rn?V+vro`yP%Vc5wIpm%%2BvZ6Ju4b%_p_+xRRM}ca z1eUob;tm-t`IJ8n5&5cPT^GaU6u!5je<_d$Aja+q;GWC4GRrnMZU0#Lgql^SKy=SJ zc^ctlFt~^Vt-*D%I9ZqQgqcqQ@@5^4BD<xT79=-E?9&z-w1OUFxC(49@wb^jjSAABf zf2h6Qi}NqvF4Z{H9m!Z8(N_|iZcM|5^5x@9Fgl$Kzhw_Yi=cShyBy!X3iMj<`5=G* zC6s$l^Zu-;FPMK6KQ%D_U6hJ|lB&t-va85ivx}>BB$tN}DotTI5>RGTUvs5Xfeda? z=A4e4P*-$v!czVL3&Ca-liv3vOimxXy2x{#X*-^kCpBVxV#xhtCFCQB+vd?&$2hsY zUg9`deP20lVidW#mQPqxVXj=0FwcK7`7t+jC~&ZemEP5X5AVkZ>J22V<;*HF zqO(zI6s5HA8MNOK!kj@#f@B68z)&ACj(Dg5P#9ATeXE2YIO#?aM(6(P@5LKugzLF& zg`*lK^jc(Xe4m|E+(HBQd-C`2q^NTsIpto!6HLUv;v#$|jtJd}wt}wJZV{Fv+rfVK z@HkiZISsPEUmbfAxw$ExzrLS^D;XP}!@SJoVE=>uFL>}BETDSIM;aUqO#TaYv4ZLY z2toReOu!8-cry6Doxb#|dD~1WE40yx^4i0Soj#bGf&mIf%_dkYSCF6EwU_e9+weJl z5IcuFjmdbJBQ^jV3F0^#A@>RPEb^aVK(Ud8rd-9n76HYiWhQ;FboxO~Xt7=ej-S7?S zzm^rOaeMC-H0~q|6yPc$kyM4Hq43@=J#V1g9Pw0tT^D$Pd{^D$3P)3bH`MVwn*8$| z@gr}$)*0-X$7=@QBIlB#z}U(a7Ra340DZ4s8un?{YPFvVLwNxZIE;qtq?0%iU_$?A zYf*aieG1lzBHWB>Iom~>T7bqhc~&jj1ZTi?XI0+&D*Oi)@Xw4xikq-($>-2RwzAZ! z!_Wdns@?HajaSmzOS>l?u^NV>v1SydTtNZkbVxou`~?`gxe}=)#$C>Vecb zrAt7E87k9ne&;`E?VpUW-0RWEdI#(^6ISYu5Cy@Dwk@!VO%5&Ajp>8yE)EMlfvT?d zbcFi6J*KF&M9Jg?*w>@~16Ls{kvou>1@$Y~q-8_~82aS3{oF+lh zWt~GowjZUm2{))%7EVRQVG)(4CD}4!&ZqP~UD1mXAFHIS=SwH1tdi*!yZwCnv8aV|%`1`{Sx>J7DVi3%eo&9p5U#;=39Rg`@cMY=^qv`SG=|7Fb{ z+W(-U!LDww(6IC{DUhS(rxcH4SI|RlU-=A-*z04@UV^7p|2--bwa_OId%CLOYSi4C zLNb|bJT!rM-`L(vQqY}cJT*bVUYf<#WHB}aB5xa%t zvV-I>2C{PL#@Kt}7liWU-Iim7QK$y0aAfLwO)is5Zpzpnkx*wls^0rB{v=w4hvw{0 zpfX3Ao?aY6C4@^w;W>>RC#gO#5Oq^#JR6I_Fl~=SBKO+V4=vSUj&#p?v(1h^^AW!% zQ1w8gQ6|bL%3aku@hucsgKSRGopq5m(>y~zTtR;$)@f-dbCYB*AzU6b0W1Nt*BDhW zFZ%Qs0(kpmo9lXL;JHj2<9=gyhF-$AL`&DMw3X}_b`FcG-v~|7ynLyy*wi{j#3f?* z$0@J0vpr-QYa z7cTq@4sl4xTOXDmc55halk5U>ZW~7N9&;n{PW|$hp8vw)_dJ^S9DO96GVKU^*A`t# zvo;g1R7HI~i9=Dg-y{X}+0)I9x*s6v^GJ$w@qTLS`!zg`P$%{ zKdu2oQ&6rWbp-LTwI~{nP?y%Mq>DjTd!&VjdsXIXy}8hq?DR{I19@tZ$v&ZN~yYhzZ_iB9uxJOUt)=-*IKtQZYVZgY!$28R|RP~$FjnWeo zLrh)?9D5^dZwKse29c0f!!u6^1pDmvyVa#I#_5li&VXdAz`Oz4$Pv+6k~ModfvFvI zBq-8SEtxxxDISyI?1bjV1n{X{ucQyJUFY^=Ds{DUT;+M-8sWf4i(5c-B-DXMfXvy> z+qWck&MNiGcobFkIt4-z>|&Eq6!< zw40R+NvE@{Y72*0fI!l*jM$avj*M|#J@*#C|K>QxP?{}DzeWX~eBCr(UJ3=s*b^5R zYE(c28xukub*Z912bFTRYv2urOj+9MvFm>X6q@M#kMg_}0U07HYGGsBYWD9mvpxoP zMRGuWEk|B4z#*f#Q@+om$lcPQWE}Fhwt845%F$4IVN-(&gPUe_-tk}zm{{k0mSbtL z`vt6QB!=9X8UZus7c%~kmQ$NPW!dEqV1B_e*68vg%$_>M0$NX3f~s6@-)fPfJe<24X7gU}TnB-y0VCR1RN2KDK<-prKxrEeZn zyW{=>k!hnM8~3T;kCE4lb9{kC(=sC_^X`6>{eySgz|-pK{r&zCKL~b?j1R@Bh?1-j z-4s=I17L#j3>625bDZ)<1~mYs0H2Ar+e3~@wg*uPO@X5qw=6dcL^s2cvGWzmTrM#X z{ceRI$5P}f5VfY_HLMJ$@ZP-Wbs=(RANbJLI`q(w3D)Y}9yr!I z5s(zSrDg+jOmDIccBy}5!0dj?<$Q9KpOg^;sRdCp#|L5XF0)Mb@8gdE$T>$R8xjkr zj{zZ*=l9ozr;s_0Cne3H<0}kVs{{lNL|>C=WTjq#tx@AaZAGIJ0ulBWlVSmhS}V~* zUBsquh#j8@S&lCW=_NhL9@nBe_sPYJHcQIsn z6HKh^f(Whh!^P`=z^nHK(}D{@SRYL}9|c`Q;IO(AaIlKCN_b>Vc+P;T5_y)Rx9VbX z$l$f1oT-Wjn5AyfFHgrIKc*I8FtRH{5~8*?!ZG|8E$lKsrZx=0eht2D5B?j4hJvgdGcOSz)D9ojyfGJ!*w_BAi+ibu7G=^Y>{e_HT< zkcvMpFk>E{*G_Jz_1B&jR&47ei+drFMW)c`6Z=G7C;!Q};cL2niQ#A>fKfP)a0K$E z?}splLKEgE=Vn5yN2pKptI71U_YeM#B~;>IHu#4@1@V^8{0rI?-~16Fa(QCgL>YCP ziIWSk7$<*GvpfyxkB2Mi5G^5TdFk>uhImM5o^kvzBjV6?#VsYX{gcHBQ(C@v~POH07vtxlmcqBgQroj9Jw-$cAXxwwWC{MhFC&P}U`8Mnb(QyX8 zic1V4-Uv&%)_#_Q$1VeoQEtlXmSVD-pVr0KL+W0;#b6y#_X%y78TTSQs}#hxr`mpm4E?6AfAWNG5U`Q5XukjJ3i9>RRq4gcQKw_IHmN zGqsL#H#emAhEseYQ3rZ^M?a#%XE4ax8Y$Kv2n2t8>Dw|t4FG0>ag zxfk3xwq@3yXSK7ffbSF|U{Ud@Jp10?=9vl1RWqt~yaf3qdBFT?^3X1sz_XM5{ zjp@?}UZ!V7qlzQRaHvJw;)XUNwYU=_mdkg-T4E%MRA}0n!bGE{$q9n4M)e& z2sV;E@R=8&Fkdeqi0mxp{xiCsJ^2<7xj=V2z>KmNeefMZcvh$9?Llz#c*WHlL1A8rB^de11lWht86aO-el3O7Bmmno*o3)N6 zAqHqN#h&+qx@$O60)-UndZ(RxWmbnFMEfs7y+owq1+jn-v1>!JbwImVYEV1(S^&U3 zxSJa+;nD~NKs9HGbZrTv(3eUu?4<(g19qqVdY*R9GY2qwkGgEn;9$)VTq$UeaArY$ zh+U@hS5o1?mm*KCz6}>xi9LV&4(L0~Uug#aR)l~b0xaXL(fhgMMrLr>Cjy!49Vcuf zei?N;xhhNX^-;*b3@N!HPgngT7+CG7CH_?zNrf0q?)E^&q=gzmkZ;^>$ zT(=|$=w6MPv-0rI4-HO*#r>A(n&_P9&$x5?b7{R?;)NPp<}xjv!6uoPGTJ}^V#24e zwL`&3vhalE<0&F-wd;KoHgC#+h(oMr$@RzZ^KlWPSf~7Aeg~gOX@lDybwsUoK)4<6 z#xpdfz@@jH4KgM%Pu~^)9MuJ>7fkz^e2ss>QmG0T?nGc~5!aG@4rJhjV`PUozZe%a z`61V#w{-BsM#K_3I1m38g(VQOt$VtMhI$#v`}6U;aExSL1>B{7(3450V+G@($xGdjWf4-r9v8;q>sbq(iW;jm+-d>03U+|OXg7Sm zQ8BCxhLv)Co1nFcPbEv!@Ap(To{68&$GPT-P^=Ti#Zjh!*Cw2!y-Hxid2?h6(&>5 zzl1)y)))Jp=j1s9Z8u06GeU3;y)uYNEAh2nPepSGF_XrDf1r9#!D88g>TEm5QKMvx z+%8_+?~vy2B}@zqKMNjs`SOGg0U`Kj3DXut11vcCS~z1A*;i6&JD(VU6tSqSOmC@F zEo7YD?vkWREiTXj3oh+1M)(XM ztg>QAi>xu`0D!zI{DJZl23;M|;wT|eW{Ri!p{&OIxXN#rdGyTg?`Ke@ISolnr*3m9A^w&jB5g5L=* z9hqmFV%<<=lN_)5ug=h*9kcHTEon_)$fMZIRirPPNbxrsW4@B`xF08oB&vr`-3!gdkI$oGS-Ex@Yljb=NAzwhVePs_Vwa^__DVTT`JV(XAqP zvT?4qg6jH@ScZ4DclAxY+_}8vYC!Kj%HTVc=GIV((cXd~TI^OjMx~r(c*c~3;>~EY z(&*7tbt}Htw8kYCSvL8pF03X!4%5K~YgdJsF~%&M_nA@eb?A(#s&*Fj{2wtP&w&k$u7uk{ z9gT`Zg_>mf=#}hiHL68j4RS+HI^_9q%Kk(1&k0k-YF~`gvZ2Rc&JQWi8Ma`m78ciB zWi}RU23d&)m76UhtY}a8EONg%=e=LDTdNoxsek3^x#(oxM*(1Iu3FNr_2kquQ4}GU zH?do!ihAipGPtKFVeo%D!2u%Jk9i>3k84JTMTv%udB7;A}t(rBfq8x**OqI(rrM|>mD;WH58%5otTPm z(n}7Pjw~)|dVc1>Q0TTUPfr_JC`O7~^zcb@SwrSZcKX4aIa2yUG?6MoiY`mY3JhgWRQE2bDZKs>C?Xu* zcMB@VJJ>k3P@C$U$}HV% zjukYBhuBYprYRhfhmIARE8jV$hS!2YNthU`{(>)%v*@V((O~T)uN3%))JB_$3H_@l1Ymp{;ZD>=9eR3gi@s znCsMZd3W=4!|Tt&=I(3w;4IZS?6`zC)@276?6`IF{Pm$Sl5m)<8{$-IHXy&Cc1BQ~ zi-L43gz|md{pFsBBOcKneB0pj1p>X`X)2~zEy3n@;QC#|`y7K&Bkk%>1NUwev&Xz) z+I6@9@j+tM+5<;b#IxQEOwE=oL!swmRhmO~v^~r{K16Y!9|TE);$6F^x_Y^2aakN) zjc#eFbjM$wSuxX%ia@yt;-B>6c7_9KSUv|a?Y|Kkx5K%Dbnd=Zj3JmH07)bp&0UoT zF!@8bfSUO{%epqm02$F59-;)Q);@kF9YP&6TN`5W$z9;v)xtuw ziV5|@l)}$N@l`UTO5vC3%LZimuWJf4p*-P_d$ME0_OxZ&d(78FA%piTbbdMR&oL`3 zenZmNNL{$ydo^5iN-!ZY!=nxBs6JwIFU zn;%kZ!|KklmZXmPgE0_J-$d@{MlSX?*v+~oQFFzIDBpi>sV!}#S5o7Ib+pmO(|6p| zKEF1_P#%J%x7@9=yN{F^BJxunZJB4G$9HcPA1wc-w8>xqvL*|`!7VbP?>M)RfXAKn z;c)!=+jBMAI&5D(O&MoEB<&LJcWXTnKUD7DJ>8!m;=is=|8oc69u`#PO9Nt>CIq2I zp#WXkmC#61p-oXoK8St%h&dRFN0T;T5Kzrrk;=8nw1ty*{muS%{y_vIcmUTALO9`i zqiF(Cb|{JZoVWStWy*LB%;b56WsSrpLcnsNRF;e9tXxRv`<$X|PDPctpYm-VC-Bh5 zJBea1#Td_PcbuiwMPBP?i#a=KLH_(W|MOI3sd#~f^nTP?>leCCTlyJhu*=dR35g`uHr zmzClt(E`mn%NXAvJoP{HmEp9T&(4BmMmZmcPH~Rtl8)%ntS!PUoS#b znY!y>ZQG8>ETR(#vEep1Ie|(F(k?XQLW$=TTL?Nf32UG!5I;_(uYnRn9Lx^8h$A3# zj`d6sXlCo#5;ey#Ke6Ft9p;VSkwqLo=8LICYr_(06mcY}wP(tLZCq%#1ylkDXB{AM zec#(kk9bO4(?Jy=38QTee{}RBS-UrGQ50e(#A|XmK`W-rEPx-?U?mQ?3_+mAPH~DN z3H7rZXIl-R{=#eK$Rx(};1!k!(En|pUA3`_OSz&!Vh$Yw$qbd&X9Djjl{A}U2xs6u z9BbIZh0;S?7&b!Ucp~wY=88+)c&ua98M!gq)fu$m#yg+dVGj%}t@AY42 zW$kqhxPZsN4@&>F{@Y501!Yd-04vpO73Y<({4Ug&DjDp^Cvbgw*-UJD3}j+)^}mLZ zDR8E01#Dk5@iBanwd0@7-eb9nB;iEoivQ=S^N_P_Z`>qSxW3l~?@{Ztv)6R%`LzBv z5Q5f-D}-l=^SFgfW1m0}EZq}3A3IzSL5D(*NN>hDprq=kGRPF-F=^KbY*AxLP3nzh zUd>asfY-Ap2-cow6gcQ(`(X`al|@FsFFY|Z^UC3O*peWd9WOF%bH^t(3*7C!!Ni6& zovc!+MZjONX)X)#7%G>KKu$O#uvc$kExd%o)?ya@F&b^Xwlv0!+oipFz_bWBsMsyzrQ#TU?*D=VI*K%HGkWGk-;%p=q zB&{qJ*%Dz4#9+6tMKZVS?VJ9Z&ue;3x%8m<{>@*#X+6)ZBK>CIvo7@fXI05}(nRKL z)%hgmE*nEN5imrNnxAVc_TQIGI{Ob+bU2{Y+93`zHJAIP8P;fk=ip7_6h8c;-Z*8{ zI|U7=4f7OX(=YhczYjdrDp)NgT0${*D%Q+(Q2?A*V53gia+NNm{<0#mDH zxYd&R?lP9GLiSA#&5oI4GI!j@S~uTVnjZ?x>t_qyysBJS74UOoiWIWv(O?h4phgP- zUJ*gLGXNAN^XWJZAh}qI4SVu7)Oc+*`~men+S~U_nDasbSyAJBsT$-E+N3WUm%i+v#LbKoA6O08j%h0GS(yRm~k2!TU|XRyClx&vHjo0&0)Fs3~G(DcxPt@ zqKIb#GVTNiaGGJ=MoN;HnNHBfvR3DW!Qe--Ct*<`-(b=TIdT+XR0lLyE$SL??`cm0*}3{YAbaZvdD^xRyE`ZI(sH*httsbd zJTkz)Qxqh~O$wj492E~4wFpIec$e8|h*+IF=I>}?kz}~sSazA_ri*F=ojTTx@BZt( z$K*0UmzCBKAC&gPNFA2zY|_fJXUK-@405Mhy&a*S%0lH$bx>NDr6n+;lUO$rB~QH! zs4!o7om^z`rYZTr`zccdHjqwWFeJ(xnPJ(+M``>QI>D(O+6ym!I-Sif@8s5j8>@{( z2qQi*%Q|th;5>JXhxu7Jycps>E!#$9Sz3=Ne#CFVS0EANF`!?nd1;nZG6trxYU-5~ zUU#^+W9aorKa=Gi8kf(Ad$&p8-GdyQfVCgZFv zqgR(e*kdAEGHQuvH_?W9i^B2Xfm=Ew66r9*lq^A!(JsTF@2U_zw00soqE^bsFa9GK z4b0OSq<*j`O#I?|m|jz4_S0@9O9dR1gI&$6%$Xl~yTX=Yc+i2vtk3>*zv{7FfpiA% z^AS&Q?3&rNhKS;Wj-WOMp&u1ydoSWBO`B-jpAFp@Ovv;Kip{5Hxn+N27DQL`81ca; zp?B*@)yY^hR-m5hW!FMD#96*Wy$(AgXYrpFwXK|Q`E*LT$oTD@r>QivQU#?Y;zAgs zuM?t2)Y<=(BTN?3&0z^>CP4vsLOn#eDAjGVfR!Isz86^l|3OI`UR&xq*B)fDqOdYC zc2@9!`@-u>f7=VD`eIz#y!%8xa3+w!?>;SOPc8bZ zUUe>m&4i#`1KEz@0x2XB+`(YPd4~83a;F$mU2}|))XO zDs~*b8{&uE#X#l4uqRC(<}?@WiWii2Pl0|*j^D7i8(ZFW&QVo99ma_tQJbffj^t=O z<$7!wN%p&7+R)g&>sCcsSiOLY0MQh$i*pU?Effx2!*GU8yR4?Q#)u8;kWjIx%;d1T z0bNZ`vJV~=JjJhAPAmh3tk&dtxI>Zel50wpX^2m<9_Y_MmvLl3@f$+Qj(C-D09d*Z zL*^C=$1gtKT8zAk>lm%12_uTy5|38SV!9c2GXnTATYt<@Fdv*noSZ0Dx(Ryuh*Gs$uQ~X(LzTw zAeqwTJ@`i~q~M{;DIveL+i;sYwy&QtOOOoGT(MBT3#S(PdRgFju^C{H4k7Gz0jAD! zn44X^J^g&8`O3@ao=2!c5N?TrpAf_g3MnrKUt4exCB$T~dJS2SA=j@U%5cPI*V9eO(GzdY1^mS4(_{rq$B(t5 z13t6C>g84qY%0BDCq7oBD)ss13M&qeM{0V-KtA7Kqjrh*WePiAk3qut=m7M#v}TaF}aanl88bcZ(bM+H4u{lQtMldu0ZaZ zv!m#h{*Op~QBt#xFkpuIEn;m+KAe`39{p^Ii@>|isNUbX$?inWR&ab-2GYauA^4io z!>-8XK#wt{HZ0eWGvSxUN}~0Msg~&cp(zrI&WC`NuQ(C{VSVlj4U;q5X03zww^yF| zhTdv<>&!WWi)X1td|t%pQFDqZxg?so;d4CF_dnN zvujv13*H-~>rZ$~L$~A$nJ%~#C&jU!**>eg2rbF!<+n-u+sMh2d|DMwkKShA3=>s=%`@uY zl|jSyl1FpHlq4o(xak zOXAFQi2=EsI9veyvws4l$OybYBbgTaph<|>Hgi7y z;9PtY#T&!b_jDHTYZwgqsIDh&{QcH*F~{R5)b^v{*D2m@UjAnNuFl`^2I%E{PjU0P z5+xof}0R$>k(lsq=@q_(Fc&&EY z$SR$`5!Nt=ozizd-8xyUUff6Yz7rJ8{AKi&xD1gQPIie@i&|P6pAr#w=Td4HFOP#R zQ|D8f3kB>BtORLt|`n1SvGpg=1h77qh^5ybBZvXIy6Oe~#VflktI&6~IQBkK727HOxbmseVYlm>)&se5H^ zmX^fVI% ztSWn?)dmC{$~xcn2m*C}wG>OT4Wj{p1DkahRpAhUPd!bp?yGwTb$VtgnvOaY<}Do- zC#?adhe?^A!`BC~=a%n|(J@05BvGXi4{!L|$M3n(ubmWfT=ANCLtdswF&NgO2-uwgY*-FB$7r5D` zneuy0Xm2I7!JVLF{eyAT@SY`&(FBW9%XhEdA% z(TTwb_uvPJJI*lEb@WufmdRivJo)Ces9ZDAo|)0e!S?m6@#R*vTwh?mqwPo6Ga2OB z(3(J@Br-~IQHw+@rW--ma3AP+3le!7;d7Y=B+%vZ3M8ei4JsK^duR>tLl>N9=zGe7 zks{LhC}7Zp&?m#}*~zY)7~erUzWFj}ydL}>{cxnzZVU~XHyJFR! zuIE`{VKw$b)!Kq69{5wntRD~G6;zy4+#JF`coS(>`Lo2bt6c#+PbjZYNixc)7xXCi z^L~?45Ao+{6#yK?Mb@c+jc({`k_j0;BPH-Szc3wtl~)yrB_{ICMUF!*!_rATkr#b4 z9Y*bOi&nks9iCQowo)5(pqk+gnFVVh&2>!~C0_GW7*3dv=Yd{W#rINz32=U=)bq%z z>5<0-;iYTopfUjeG0grye%T{bqAi6O5D?1r{|MS~IuLuAaV?pGhy>FS$8VrC~9jB`-RiFL{r$oG*C0y)TlRr#l<~ zJ&c}Axcm+>T*Ye6Ljyq5V=icFfnzRl%He_cj`({Y20%1=Y;q}k9B~Y-At}@$vU*vX z?2L*beAFv zA-V!)r!2)HJoZH~Hm}7g@er(Z+E3MrQ|2u5sw#OrGHNPC&R_wCUf~@!3w*sZ{ z_+|KJBXXFF?BlUWaubQGArou`YXd&5Gh*K+)Wm)wm$KDrdKz|xYd3yoLPFNEFlxnU zkurNQsl6G)X#9LCDt2C{$~7*h#q4V35=Vx6WZ0;)2f_}iQ03-gOuukZItwXhMRgnUUBcWZ>p^Y@^% z8gc9WZt9=XNe-y*uQd?x__moX#X7gEaAb`g)h*D$0azshy5THC=dtmx;h_%LimtWn z7n*A!AxfC0ZjsTJpbi;rtZ7w#Yx+U8_PJfqPBL>fg^VA@_;y0P*Mf0trS_ZGIbzTk zT7%L~L5#-dNkR-6-W)e~QY-VbcG=iuHuS@glP!!Wy-u^uh((kygjT1gO;x43%~cn5 zu>Qcs=pHVAU|F;Wt15Qmmvcci>vxV;*jX%i=#B}xYpDrrcrb{Tu+k5>+hlhr7`nkv-Dqn*>GWWycSRcMaunJALu;Q0GkNET8Hd3r2H; zIu5(CIcXyC0<<@?z&g!*=)D{9oMqSoEQJp5J?#{k69|6b(BxYOL4wXX>w>xwFATAkIzT76T6gCSCt5{{Bg=r?y1z3M3`YWJ4-flE`H(6s5d|6XV&i5R&_@9g@CMzV|hikvec2 zCmGtvc4H{^y=+z7CQesCH3A}B-~l9iig=WS>@O)A?l@~T=gb_hnRPnr+>(}R?(eX& zb_wYo^_ougXN})+S`%64f5S7i%G(vUGcYhcW^9m^09@v8+11ZoX?9!coaPgeniIY_ zC2!b`Zr*sxUc|9z)+zqNRFuIPmcazO1QjQ1-H5kpp!<%-KY#Z#D$>&!x5CyR5Lyxo zZyjTrA5Vd@v`DJB`;j**wGa=NFt-m|B*nUrS0`z)9C%|Y+eHq?$Xf!qjy-GsUVc+U zr4M>$dgLn^rno`b>!1ovXn2F;AuVBgEb@s=)W&&G{dA)~1X&%q_5oFs)j164s=oa! z=6SEYC}1X??89$q{!XQz|2#26x4XNK}UMUSVF=R+kc z9s_bvo?A{~eNC{t!-`#MRfET;*4E*8T(u7ij7UNKaUO;_g@vr~LxiOEJiPN~GXs16 z799@mtXt|ll}>9eNbWldqIz}TTRLn;?$spDux$wP2KuCU7PM9X2*XgoURG>dd!!&s z15uPRVWygs6S2BQozaR^lDxcc3#uWf5+2U|6CTxA<= zg%u0&8VAssd=`wgA^PmJvpJX7o`DfO>+?Re*IBQ-%qe%P+5DpZd-VcON607&a6V9Y zRzml`F-S`u812(?cYF_l8bLSp^XAf>Fa9xnU0>OMfbXuZS}h{8qd4|+AdOKL-TLFm zGT4(IR$!YaFoY9SxEREpFCK954kssMRWkm}E~Hhxduutnbf`K5h;*_)AlY5v{*deZ z^7fHQ^AcJ`h$P)mZw+eQ0%?HYOwjQ)Hz+unzXBLVM>nb7AH9JMJl-hEnx6Hz=~P#W zFJ#^*5kk}1M28=ILZ?&=fM$T@Ij-j3-Z@|2D4Js9UaDnE3R?__$JVl5HKfm&ms?30 z4C+4gO}`Tzy&5nZ8+{5KjUp3hdG>W@4cNu;j`8wrx12+C&0wfYH?z8$wWQTdJGT%z z-SP}yr*$j!iuQs6@`;8MYMEvizR$QM27;>}h#J>bUq3$kfEHD1O z!AOldi?EgHRxI&-*EjMG@&Gv|g1c?AxLd@6fTUUf(kK1O=~yiEr)%ydQKnyCAcWHs zZWzKUMl(y2z`7_=ZPWL`*=f%X$WXkraE;rJ=>luB2{RbsteVpCz7$MpOEvEy++SEW z;&-P_iZkpiu@Zk<_{x=)$S>W=5adN3EbrJX-}63Wch>9F!^q>KOhS+Is%a- zIPz7x1BI!I>tBEnM}~0BP&>W6Wj_vRB?Xhn9y*A(`-QvG?>xGHNJeYK@V^mD5C|2m zZVl_p?(T(+n@a95pZXV{z;}ek{fs*7$Ub-Y4B@;p1k{NdaomM`s{;@Vgt63bk2l{# zerE7QT0N?nW?~RV%qQ$BRte}xD^)?8O9@+0Do8L{vY0~9i5^6C>Wxu=b$aii z;sVMZTnMBkbww{lC9j4X6o~$*PmL6A)iGw%eGkMdI+)ouPGqzh~;( z$moGtS>iD3jd;^yDG?G2Mnvj+PEDuiJ+Nm3*vDd+c6|~>{nSI7W&#mR9>f}Za4Qic z`}8jn2_y!DZ&7BqdEz0xNscSbn6vc37NE~(u}HNl1nBYdD^&bwac&LcC@tC-5~{?a za#`Om`&XD)@>KMO8*iBH67=_}9|i3ah4+ANk4P7>94!nqp(mwA-Gq+||Oq%0Ko`!uc;ifqaQDU%*c% zg}!k^?JoWr*Mxmz4>CvvXP$i4ep+Xekn##t895Y^XN#dXP62idGkEj*h*(JSi~O+X z`mmKq;*R66SeZ3D2fKQaEQ%C0{Vkx9XUE!k*)J>)#EsCD1(+-?uB`|YH@#R>KqlOFUTHR_oXZ9`RYZsxNeuO$^MWyMz=AG;rpLDFJ9_-Eyw5!U!r zgdRT#@nK}PCk3vhqbQGbh=_B9rGq<(2bn8pO&m9{qo zQ9jw33DMr(vAOH@mfyqM-ZuVM4n1qBGi*$bEWbW6YcOs!0*j`@CPZU{_A2 zLk+l(CZG~HavfNpXOpFq2xJEKnreL>aY8Jm2*Zm`&;i^NN-`{}<8N;)FA=OQvBtSrYBo00^@b;o1c0jstJLS%I#{9q|0 zH>JxHCS~}mBM2%tDY;}U%&|PMu+)jfeH%j^3p5E}>l%tR)frd-{RF_tDsJIsa$w~% zmCn-l&q&__hU_ZxKmDYS|D~g#f*4kP`jeYS!jpX@eFGuqMmWaiD6?ceVF>%YXVhClVf|uxc0&isFY%?1#LlM_L#IIJLrRLD$a?6Q z)fm2tBT^mI_4w+tS0RkR{`9$sW)tqMq*o6~z5bZ*@*ND9Xk;L%C(@*S+u+ES)RihD z{$y|A=x##*;l`^_M<5A%w6F-epIDpD1t0pQRW#Q^VdU0L9_)Jpua@RQ$E8?lK42Cp zV)M<=1KV4)vo)RabZL&lA*!TsuOj|UtJ6DR4A7wI;lT4Hil7Djh@H4^I{d{>`xk~^ z?oVaYWt(5oS>19ck1+#M=GFR+Q*n;uRQrNnx~99Ccw4f;nT$T$J#c*Jzr#=9$bE?> z{E=XV7WRQlV#PJFDLxoS82*aJ0YgW28Z5c}^D)>wlU6b`A2@tchTL!7#-%5ek8R7U z=fnFhk-fcO7`$hI12b!ymwKviupN&K8i_>xMYj>igW(YsLmbznP7HW%>D;O%U;H8o zT5(+O-l81cOi8E}G)P5Ao{vpIZ$t{+QF+_+$F=ykYFt~x7+d?YrH({G3$?XjYpOL< zFYvz=6rXt&Hry)E-=Kb%I@(jcMbcC%+0prZ+qQ^IVio!YEZlZWdjq<3LM{=NxWR4Sw=0&!IRjs_xFvDzzZ@O5Bo~+XICXS%?LCldG`9B$UZc5bV6~VpdfdA1 zN+(#n5!={~b<@XHWDVuR1A0H;_#wuoflirTm$QQ_Uz$1zE8#FXZC@?zoPXl9mBTH{ zmyrtx82APQVaIM|EkBzgx@~B)xQk;{3e8|A%Vvvmk)Y-j56x((92d7fFbUrCFKGdL z++J9!j@FnSFkkP@^ZJGd$`n&hXjJYO@fuE^$3zu3D=y0c(e^X%WA8RrnxBh74S{$9$g>hfy(ZRSICV3k_kRi7WpAhTVfqQn4>8Yo#dwh zA4=HT1T`;%kP8(YJ9n-oA!nI#sAFA>?r!Xz9N#4HHQ1y+1(!R4;EVBv)D0PaS zYL36@S#{CnpBbMW)yLFd8URrS&&|3+GcwPrUDI2lU+*$VhTmX+ao2T+pZ2eAPx!Gs zf7#$|Nqn^}=+1mSl4{oOc=%#}@%w+eB_cLResFQC83=*^TRc!M9tUMIf|&VD+;K#$<-b&F zU%JazE|+p{>`rUu&zROkuKEh->o4Ku+hQfAFbR11Q3my4p-#fYe_Pjjr zhTsVk7M~4(!Oo5%{~8RmqI6UnG{Q18zs~RwsNPdiR^{hsS=gCxQ4hquj`!%O*yErV zA`~aW$y*86u)5;aQMrC3@PVwBxDv*+2H1z)a|aJK z2OTt9UlHkGj$a~vy)1q3gI>-*?y=^2fYig~6UK@m2_HVC_p1OJ6m!|9tA7C6IL=L_ zu5!8$F`puN>Gyu%@ZEoU$qD!&&5^lyE;6O$(DrhwY@Rw>e(_&moen8@~I z#%{Ka>BVecAW_lEE0|8eQ9p$5xwnHBXMN->u{E+brQY>&CEZ^%)_=e+1SgY|!Dh~c zM~7On)M9mXyQ>3iW0mx=TS(lAN(IX#by->?ot5RAEj5HVvwolW+ zf77HB^_ae*Ms&vgwxP0@9uUH2Eis)j?_8wWp1%10NI-;EHKUZ&pozhP@mhh{>6 zp--Qr2GqiU#pbR8es-okiTANQ9B*|ayu~Ck>p1nP>@=J5}%KAlO(0&yyy;Z|ewEyzT8zyukl^5-FgvR)w zIk8>?=vNrt$=<_(%Tgc9B@kT9^#aN5DQwHe?~zMsOklSwA05q%V$N1-2wfB+yw?=L zPap&t-x-BH^&F4is~~-vnx`>bJ%z`N+78Gz(j|JV(p;)DrrXEJS0qBiA20Ke?Wec1 z_8_D~v2M|owu5m#iyJ#p-C%5o!iL^=5=-9#N;qrLBK-Mx>8g#;n!Kn~C=-Wcxhf9cZ(`^7PUX zCvS_~b@Qp|4hA!|wyw!8;yB&M2o3tfll*7cEF2e?C;Z1?tuI2qET+S$0E&en9QcS} z9*8jsaIEPn*$o~gZ$CFDrW|5xn2T`p3(4NoRnb2O!T|(bF*(^c5IJ&W@QM7@)ap5u zOK2&2pRV4EVD)2_Uwqs|qrfVsleo+&GRIB}xc*M>M%xlSk7b4Zg2GR;q$HX7_+W^O!h6GC}z9}(#qeWl1>Z)kV_a=xOj;$jJ{#@i$uX+ zGc{}_um-#zZV(MQ=2_h51E2*?PnySG(qCliiW1ge?RZ#>j4phXx?*&8(3G-!-{-9- z%DGzOjqhC)kK%n$&ZSd__@1c}_?x0ND%8#^oR`$Pgb zAJK;>vrK3*LHDcb(<8=aR-)Z7pa%n&Xvm5eK}-^^z#5&_eRh!gd-Ax)l4+eHJ5rE1 z(DtH8PMSMd*Mp`AIoo-pjZN^vObe4VijKHvp;8_p%UnZ;PP*n0*jnBje}S0Ez-+W6 zf3?M)L@lO8eXw$Nh~7!~wj_f%pvmBH%jB_28Q?yp$9scC_f0C>TA2m`qlx$XX8pFq z^u;CJdyDF>J*qo#4KIy2c!zfN1uk4cNVcNiuH)k=DmK%O7{ZF~dOK>)-;&28v%I}| zs!0+DaSm2!alUjP(K~g!G!!)CF;)iAG6nZW>>&N`n!$4$#$^r6mk*>8zOvbiL`^AymR>Li zCR{6gG0>vC&Ye$P_nrp#hJ#Jyz;xJ@J`iUeZCQ#GMSu|^QA<|QK}f_Xk6Ns`N&WL%z*J?1e;_WhnL{x^?$=}xa-1X{RLFBFRx`v1J z&Orj9y(!IPVbZxK{2_Kc6;@82Mu@N2&N_O!4c1&{YE%m{o0v`F=kY+;d-XyHn9bnp z`UI?oL_u}W`+&uM;?jIXs|0>}OB_KjYLDmz4Dc{kLM9 z-#-<}md1RXpKhXGyu$lQfJ2!(`7le%Q)6QB9Ua}FGJ(q>UId9S<%xwjxLA3$%UIxor3G%`$e`}_da0x&uc(wrZ(54+4eM+VRC{kb$~-4eUtjIut9Audyn3_z}td(2yn;jxQV zOc$RWg?Kn|2UrWCv~`m0{ft#-cF5Q5WnNg3tlOEdz5Ti`hB>SQTHqmH^+fo56(05b zZ^`|HNYl;Xwxjc+ksECS4%NL7aC%aQ}&a7^DN7A{^Q@g5BFvxG zjY4~YN01P3`~TnHWr_3;D0_$=K)pK*b`l3O4Dlc!z|Z3U&z4T{ZxC$!Fd5)!5AU!H z{O&qfheHg!)SoNTs8j!Ud#RgejEY7{LA9da0L5Zrox}#w-GMDU$%LF zomr^#ZxBlSC=TE+TcE#i5So8*ld41@ycsmW|FzBd`;s#2f`P(-|C$wmg?#?XglGT; z06?)i??E!NXdtRFf_Fem(5Ep);VsL56}h>Sp^1$ti?NL*i_-s;!2aBF+jL;Xn_BSS%5WW1^xmu27r1e6#)NfVh5MJ#9x4K zA%8L{OmPAJ>OB4nBpUt))D{E)ZB3zp`~UxckJbNvTvIF_#&kp85mJ#|7%}s9>=iOlLpIGWF*}qt7UEmm? z;7{y*Hu0aU^B0BZuY}sgU?4fjbPfmb-#Z`wTSlU7pzU^YP%9YppQR4?J23v0DX0$& zV*aN{0slKK{1;a;2oj%{1N<{B{4;O7fUhy{f8PZk`3!?9=S|-!j)J24$Us~RXn_Aa WQGf@&|Fh+cf(#evVP8i7iTyt`4f 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 g*deErS@4UrK<)vcGA2Rx+H;t2P44+yIZ$Lf#N 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 WQGf@&|Fh+cf(#evVP8i7iTyt`4f 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 g*deErS@4UrK<)vcGA2Rx+H;t2P44+yIZ$Lf#N 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 Date: Fri, 2 Nov 2018 17:33:00 -0700 Subject: [PATCH 106/316] Fixed main class. Added source & target. --- examples/java/kobalt/src/Build.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/examples/java/kobalt/src/Build.kt b/examples/java/kobalt/src/Build.kt index f1bd155..911a863 100644 --- a/examples/java/kobalt/src/Build.kt +++ b/examples/java/kobalt/src/Build.kt @@ -1,6 +1,7 @@ import com.beust.kobalt.* import com.beust.kobalt.plugin.application.* import com.beust.kobalt.plugin.apt.* +import com.beust.kobalt.plugin.java.javaCompiler import com.beust.kobalt.plugin.publish.* import com.beust.kobalt.plugin.packaging.* import java.io.FileInputStream @@ -40,7 +41,7 @@ val example = project { version = versionFor() - val mainClassName = "net.thauvin.erik.semver.example.Example" + val mainClassName = "com.example.Example" val processorJar = "net.thauvin.erik:semver:1.0.1" dependencies { @@ -56,6 +57,10 @@ val example = project { target = "deploy" } + javaCompiler { + args("-source", "1.8", "-target", "1.8") + } + assemble { jar { manifest { @@ -67,4 +72,4 @@ val example = project { application { mainClass = mainClassName } -} \ No newline at end of file +} From 33beb8ad5f2afda05c1b7dcfe154789aa7968b2a Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 2 Nov 2018 17:33:22 -0700 Subject: [PATCH 107/316] Fixed generated source location. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 665ec45..3db1cb5 100644 --- a/README.md +++ b/README.md @@ -195,7 +195,7 @@ The `GeneratedVersion` class will be automatically created in the `build/generat In order to also incorporate the generated source code into the `source tree`, add the following to the very top of the `build.gradle` file: ```gradle -compileJava.options.annotationProcessorGeneratedSourcesDirectory = file("${projectDir}/src/generated") +compileJava.options.annotationProcessorGeneratedSourcesDirectory = file("${projectDir}/src/generated/java") ``` The `GeneratedVersion.java` file will now be located in `src/generated`. @@ -237,4 +237,4 @@ Please look at the [Kotlin example](https://github.com/ethauvin/semver/tree/mast Incrementing the version is best left to your favorite build system. For a solution using Gradle, please have a look at the [__Semver Version Plugin for Gradle__](https://github.com/ethauvin/semver-gradle). -There are also full [examples](https://github.com/ethauvin/semver-gradle/tree/master/examples/annotation-processor) in both [Java](https://github.com/ethauvin/semver-gradle/tree/master/examples/annotation-processor/java) and [Kotlin](https://github.com/ethauvin/semver-gradle/tree/master/examples/annotation-processor) showing how to use both the plugin and annotation processor concurrently. \ No newline at end of file +There are also full [examples](https://github.com/ethauvin/semver-gradle/tree/master/examples/annotation-processor) in both [Java](https://github.com/ethauvin/semver-gradle/tree/master/examples/annotation-processor/java) and [Kotlin](https://github.com/ethauvin/semver-gradle/tree/master/examples/annotation-processor) showing how to use both the plugin and annotation processor concurrently. From 98fe423ee560ec5c04c022da1f69acf2656440ed Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 2 Nov 2018 17:33:41 -0700 Subject: [PATCH 108/316] Added filters. --- config/spotbugs/excludeFilter.xml | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/config/spotbugs/excludeFilter.xml b/config/spotbugs/excludeFilter.xml index 4d8881d..ddb2db1 100644 --- a/config/spotbugs/excludeFilter.xml +++ b/config/spotbugs/excludeFilter.xml @@ -3,12 +3,14 @@ xmlns="https://github.com/spotbugs/filter/3.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://github.com/spotbugs/filter/3.0.0 https://raw.githubusercontent.com/spotbugs/spotbugs/3.1.0/spotbugs/etc/findbugsfilter.xsd"> - - - - - - - - - \ No newline at end of file + + From a5021509036042f48fb0b79afc52e296620eb547 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 2 Nov 2018 17:35:02 -0700 Subject: [PATCH 109/316] Updated dependencies. --- build.gradle | 12 ++++++------ examples/java/build.gradle | 6 +++--- examples/kotlin/build.gradle.kts | 12 ++++++------ kobalt/src/Build.kt | 5 +++-- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/build.gradle b/build.gradle index 1818ab9..459e421 100644 --- a/build.gradle +++ b/build.gradle @@ -1,11 +1,10 @@ plugins { id 'java' id 'maven-publish' - id "com.jfrog.bintray" version "1.8.3" + id "com.jfrog.bintray" version "1.8.4" id "com.github.ben-manes.versions" version "0.20.0" - id "net.thauvin.erik.gradle.semver" version "0.9.5-beta" - id "com.github.spotbugs" version "1.6.2" - id "net.ltgt.errorprone" version "0.0.14" + id "net.thauvin.erik.gradle.semver" version "0.9.8-beta" + id "com.github.spotbugs" version "1.6.5" } @@ -39,7 +38,7 @@ repositories { dependencies { compile 'com.github.spullara.mustache.java:compiler:0.9.5' - spotbugsPlugins 'com.h3xstream.findsecbugs:findsecbugs-plugin:1.7.1' + compileOnly 'com.github.spotbugs:spotbugs-annotations:3.1.8' testCompile 'org.testng:testng:6.14.3' } @@ -149,6 +148,7 @@ tasks.withType(SpotBugsTask) { } excludeFilter = file("$projectDir/config/spotbugs/excludeFilter.xml") } + compileJava { options.compilerArgs.add('-proc:none') } @@ -183,4 +183,4 @@ task pandoc(type: Exec) { ext.output = { return standardOutput.toString() } -} \ No newline at end of file +} diff --git a/examples/java/build.gradle b/examples/java/build.gradle index 78c81a4..031d82e 100644 --- a/examples/java/build.gradle +++ b/examples/java/build.gradle @@ -5,12 +5,12 @@ apply plugin: 'application' defaultTasks 'run' -def semverProcessor = 'net.thauvin.erik:semver:1.0.1' +def semverProcessor = 'net.thauvin.erik:semver:1.1.0-beta' sourceCompatibility = 1.8 targetCompatibility = 1.8 -compileJava.options.annotationProcessorGeneratedSourcesDirectory = file("${projectDir}/src/generated") +compileJava.options.annotationProcessorGeneratedSourcesDirectory = file("${projectDir}/src/generated/java") mainClassName = 'com.example.Example' @@ -22,4 +22,4 @@ repositories { dependencies { annotationProcessor semverProcessor compileOnly semverProcessor -} \ No newline at end of file +} diff --git a/examples/kotlin/build.gradle.kts b/examples/kotlin/build.gradle.kts index cfaca3a..86bc0e2 100644 --- a/examples/kotlin/build.gradle.kts +++ b/examples/kotlin/build.gradle.kts @@ -1,7 +1,7 @@ plugins { - kotlin("jvm") version "1.2.50" + kotlin("jvm") version "1.3.0" application - id("org.jetbrains.kotlin.kapt") version "1.2.50" + id("org.jetbrains.kotlin.kapt") version "1.3.0" } // ./gradlew @@ -10,7 +10,7 @@ plugins { defaultTasks(ApplicationPlugin.TASK_RUN_NAME) -var semverProcessor = "net.thauvin.erik:semver:1.0.1" +var semverProcessor = "net.thauvin.erik:semver:1.1.0-beta" dependencies { kapt(semverProcessor) @@ -29,8 +29,8 @@ application { } tasks { - val runJava by creating(JavaExec::class) { + register("runJava", JavaExec::class) { main = "com.example.Example" - classpath = java.sourceSets["main"].runtimeClasspath + classpath = sourceSets["main"].runtimeClasspath } -} \ No newline at end of file +} diff --git a/kobalt/src/Build.kt b/kobalt/src/Build.kt index f0c3b06..34c9ad8 100644 --- a/kobalt/src/Build.kt +++ b/kobalt/src/Build.kt @@ -75,10 +75,11 @@ val semver = project { dependencies { compile("com.github.spullara.mustache.java:compiler:0.9.5") compileOnly("org.jetbrains.kotlin:kotlin-stdlib:1.2.10") + compileOnly("com.github.spotbugs:spotbugs-annotations:3.1.8") } dependenciesTest { - compile("org.testng:testng:6.13.1") + compile("org.testng:testng:6.14.3") } javaCompiler { @@ -137,4 +138,4 @@ val semver = project { pom2xml { } -} \ No newline at end of file +} From be2ecfa2f90c09a73d73c89ace1d8b04e0b34040 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 2 Nov 2018 17:35:32 -0700 Subject: [PATCH 110/316] Fixed spacing. --- examples/java/src/main/java/com/example/Example.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/java/src/main/java/com/example/Example.java b/examples/java/src/main/java/com/example/Example.java index ca0582a..ba725b3 100644 --- a/examples/java/src/main/java/com/example/Example.java +++ b/examples/java/src/main/java/com/example/Example.java @@ -10,7 +10,7 @@ public class Example { System.out.println("-----------------------------------------------------"); - System.out.println(" Version:" + GeneratedVersion.PROJECT + ' ' + GeneratedVersion.VERSION); + System.out.println(" Version: " + GeneratedVersion.PROJECT + ' ' + GeneratedVersion.VERSION); System.out.println(" Built on: " + sdf.format(GeneratedVersion.BUILDDATE)); System.out.println(" Major: " + GeneratedVersion.MAJOR); @@ -21,4 +21,4 @@ public class Example { System.out.println("-----------------------------------------------------"); } -} \ No newline at end of file +} From 3b4404edbea29101daea615b2890be2ed47945ca Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 2 Nov 2018 17:39:08 -0700 Subject: [PATCH 111/316] Added FindsBugs warnings suppression. --- src/main/java/net/thauvin/erik/semver/VersionProcessor.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java index 5775a18..b71c852 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java +++ b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java @@ -34,6 +34,7 @@ package net.thauvin.erik.semver; import com.github.mustachejava.DefaultMustacheFactory; import com.github.mustachejava.Mustache; import com.github.mustachejava.MustacheFactory; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import javax.annotation.processing.*; import javax.lang.model.SourceVersion; @@ -70,6 +71,7 @@ public class VersionProcessor extends AbstractProcessor { messager.printMessage(Diagnostic.Kind.ERROR, (t != null ? t.toString() : s)); } + @SuppressFBWarnings(value = "PATH_TRAVERSAL_IN") private VersionInfo findValues(final Version version) throws IOException { final VersionInfo versionInfo = new VersionInfo(version); @@ -194,6 +196,7 @@ public class VersionProcessor extends AbstractProcessor { log(Diagnostic.Kind.WARNING, s); } + @SuppressFBWarnings(value = "PATH_TRAVERSAL_IN") private void writeTemplate(final String type, final VersionInfo versionInfo, final String template) throws IOException { final MustacheFactory mf = new DefaultMustacheFactory(); @@ -229,4 +232,4 @@ public class VersionProcessor extends AbstractProcessor { note("Generated source: " + fileName + " (" + new File(jfo.getName()).getAbsoluteFile().getParent() + ')'); } -} \ No newline at end of file +} From 66f779ecccac2d6c6fa529215f325eef280fa880 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 2 Nov 2018 17:40:18 -0700 Subject: [PATCH 112/316] Made sure the properties file can be read. --- .../net/thauvin/erik/semver/VersionProcessor.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java index b71c852..826037d 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java +++ b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java @@ -78,7 +78,7 @@ public class VersionProcessor extends AbstractProcessor { if (version.properties().length() > 0) { final File propsFile = new File(version.properties()); - if (propsFile.exists()) { + if (propsFile.isFile() && propsFile.canRead()) { note("Found properties: " + propsFile + " (" + propsFile.getAbsoluteFile().getParent() + ')'); final Properties p = new Properties(); @@ -101,8 +101,14 @@ public class VersionProcessor extends AbstractProcessor { p.getProperty(version.keysPrefix() + version.preReleaseKey(), version.preRelease())); } } else { - error("Could not find: " + propsFile); - throw new FileNotFoundException("The system cannot find the specified file: `" + final String findOrRead; + if (propsFile.canRead()) { + findOrRead = "find"; + } else { + findOrRead = "read"; + } + error("Could not " + findOrRead + ": " + propsFile); + throw new FileNotFoundException("The system cannot " + findOrRead + " the specified file: `" + propsFile.getAbsolutePath() + '`'); } } From 6948d22607b358a514bdfb533d5f2313442e1643 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 2 Nov 2018 17:40:44 -0700 Subject: [PATCH 113/316] Updated dependencies. --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index c3eaddf..a1d98eb 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 net.thauvin.erik semver - 1.0.1 + 1.1.0-beta semver Semantic Version Annotation Processor https://github.com/ethauvin/semver @@ -35,7 +35,7 @@ org.testng testng - 6.13.1 + 6.14.3 test From 7bfd656cf0f4c73fc195bd822476b03fe69e3073 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 3 Nov 2018 11:26:43 -0700 Subject: [PATCH 114/316] Updated wrappers. --- .../java/kobalt/wrapper/kobalt-wrapper.jar | Bin 9230 -> 13310 bytes .../kobalt/wrapper/kobalt-wrapper.properties | 2 +- kobalt/wrapper/kobalt-wrapper.jar | Bin 9230 -> 13310 bytes kobalt/wrapper/kobalt-wrapper.properties | 2 +- updatewrappers.sh | 17 +++++++++++++++++ 5 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 updatewrappers.sh diff --git a/examples/java/kobalt/wrapper/kobalt-wrapper.jar b/examples/java/kobalt/wrapper/kobalt-wrapper.jar index 5390ba7f081521f8b249efd65d7ad3e27f005b45..22d3ef5a57cd7c12b01203a62009f95cb4c0575a 100644 GIT binary patch literal 13310 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 U{=>tL`ugz4(rXq73_nT!AEintfB*mh literal 9230 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 U{=>tL`ugz4(rXq73_nT!AEintfB*mh literal 9230 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 Date: Sat, 3 Nov 2018 11:40:48 -0700 Subject: [PATCH 115/316] IDEA misc. updates. --- .idea/misc.xml | 3 +++ .idea/modules/examples-kotlin_main.iml | 5 +++-- .idea/modules/examples-kotlin_test.iml | 12 ++++++++++-- .idea/semver.iml | 2 ++ 4 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 .idea/semver.iml diff --git a/.idea/misc.xml b/.idea/misc.xml index 6bd5763..5d9e04b 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,9 @@ + + diff --git a/.idea/modules/examples-kotlin_main.iml b/.idea/modules/examples-kotlin_main.iml index a65f44f..33346db 100644 --- a/.idea/modules/examples-kotlin_main.iml +++ b/.idea/modules/examples-kotlin_main.iml @@ -6,13 +6,14 @@ diff --git a/.idea/modules/examples-kotlin_test.iml b/.idea/modules/examples-kotlin_test.iml index 5b759ec..ad47dc2 100644 --- a/.idea/modules/examples-kotlin_test.iml +++ b/.idea/modules/examples-kotlin_test.iml @@ -6,13 +6,21 @@ + diff --git a/.idea/semver.iml b/.idea/semver.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/.idea/semver.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file From 4028bb2ec8a8f4d8bd48c423685de1aa2001eb5a Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 3 Nov 2018 11:41:48 -0700 Subject: [PATCH 116/316] Version 1.1.0-beta --- README.md | 12 +++---- build.gradle | 2 +- docs/README.html | 89 ++++++++++++++++++++++------------------------ version.properties | 6 ++-- 4 files changed, 52 insertions(+), 57 deletions(-) diff --git a/README.md b/README.md index 3db1cb5..cefe757 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ version.prerelease=beta Upon running the annotation processor, a source file [`GeneratedVersion.java`](https://github.com/ethauvin/semver/blob/master/examples/java/src/generated/java/net/thauvin/erik/semver/examples/java/GeneratedVersion.java) is automatically generated with static methods to access the semantic version data. The source is based on a fully customizable [Mustache](https://mustache.github.io/) template. -To use your own template, simply create a `version.mustache` file. The processor will automatically look for it. +To use your own template, simply create a `version.mustache` file in the project's root directory. The processor will automatically look for it. To specify your own template name, use: @@ -171,7 +171,7 @@ To install and run from [Maven](http://maven.apache.org/), configure an artifact net.thauvin.erik semver - 1.1.0 + 1.1.0-beta ``` @@ -183,8 +183,8 @@ To install and run from [Gradle](https://gradle.org/), add the following to the ```gradle dependencies { - annotationProcessor 'net.thauvin.erik:semver:1.1.0' - compileOnly 'net.thauvin.erik:semver:1.1.0' + annotationProcessor 'net.thauvin.erik:semver:1.1.0-beta' + compileOnly 'net.thauvin.erik:semver:1.1.0-beta' } ``` @@ -208,8 +208,8 @@ To install and run from [Kobalt](http://beust.com/kobalt/), add the following to ```gradle dependencies { - apt("net.thauvin.erik:semver:1.1.0") - compileOnly("net.thauvin.erik:semver:1.1.0") + apt("net.thauvin.erik:semver:1.1.0-beta") + compileOnly("net.thauvin.erik:semver:1.1.0-beta") } ``` diff --git a/build.gradle b/build.gradle index 459e421..fa6af98 100644 --- a/build.gradle +++ b/build.gradle @@ -131,7 +131,7 @@ javadoc { options.with { tags = ['created'] author = true - addBooleanOption('html4', true) + //addBooleanOption('html4', true) links('https://docs.oracle.com/javase/8/docs/api/') addStringOption('Xdoclint:none', '-quiet') } diff --git a/docs/README.html b/docs/README.html index 7564fa1..a53c851 100644 --- a/docs/README.html +++ b/docs/README.html @@ -50,10 +50,10 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf

    Semantic Version Annotation Processor

    -

    License (3-Clause BSD) release Maven Central Download
    -Dependency Status Build Status Build status CircleCI

    +

    License (3-Clause BSD) release Maven Central Download
    +Known Vulnerabilities Build Status Build status CircleCI

    An annotation processor that automatically generates a GeneratedVersion class based on a Mustache template and containing the semantic version (major, minor, patch, etc.) that is read from a Properties file or defined in the annotation.

    -

    This processor was inspired by Cédric Beust's version-processor.

    +

    This processor was inspired by Cédric Beust's version-processor and works well in conjunction with the Semantic Version Plugin for Gradle.

    Examples

    • Using annotation elements:
    • @@ -76,10 +76,10 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf version.minor=0 version.patch=0 version.prerelease=beta -

      View Example

      +

      View Example

      Template

      -

      Upon running the annotation processor, a source file GeneratedVersion.java is automatically generated with static methods to access the semantic version data. The source is based on a fully customizable Mustache template.

      -

      To use your own template, simply create a version.mustache file. The processor will automatically look for it.

      +

      Upon running the annotation processor, a source file GeneratedVersion.java is automatically generated with static methods to access the semantic version data. The source is based on a fully customizable Mustache template.

      +

      To use your own template, simply create a version.mustache file in the project's root directory. The processor will automatically look for it.

      To specify your own template name, use:

      @Version(template = "version.mustache")
       public class A {
      @@ -316,70 +316,67 @@ code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Inf
       Either java or kt for Kotlin.
       java
       
      +
      +keysPrefix
      +
      +The prefix for all property keys.
      +version.
      +
       
       
       

      In order to easily incorporate with existing projects, the property keys may be assigned custom values:

      @Version(
         properties = "example.properties",
      -  majorKey = "example.major",
      -  minorKey = "example.minor",
      -  patchKey = "example.patch",
      -  preReleaseKey = "example.prerelease",
      -  buildMetaKey = "example.buildmeta",
      -  projectKey = "example.project"
      +  keysPrefix = "example."
      +  majorKey = "maj",
      +  minorKey = "min",
      +  patchKey = "build",
      +  preReleaseKey = "rel",
      +  buildMetaKey = "meta",
      +  projectKey = "project"
       )
       public class Example {
       // ...
      # example.properties
       example.project=Example
      -example.major=1
      -example.minor=0
      -example.patch=0
      +example.maj=1
      +example.min=0
      +example.build=0
      +example.rel=beta
      +example.meta=
       # ...
      +
      +

      ⚠️ keysPrefix is a new element in 1.1.0 and may break older versions when using custom property keys.
      +⚡ A quick fix is to include keysPrefix="" in the annotation to remove the default version. prefix.

      +

      Usage with Maven, Grail, Kobalt and Kotlin

      Maven

      To install and run from Maven, configure an artifact as follows:

      <dependency>
           <groupId>net.thauvin.erik</groupId>
           <artifactId>semver</artifactId>
      -    <version>1.0.1</version>
      +    <version>1.1.0-beta</version>
       </dependency>

      Gradle

      Class Generation

      To install and run from Gradle, add the following to the build.gradle file:

      dependencies {
      -    compileOnly 'net.thauvin.erik:semver:1.0.1'
      +    annotationProcessor 'net.thauvin.erik:semver:1.1.0-beta'
      +    compileOnly 'net.thauvin.erik:semver:1.1.0-beta'
       }

      The GeneratedVersion class will be automatically created in the build/generated directory upon compiling.

      Class & Source Generation

      -

      In order to also incorporate the generated source code into the source tree, use the EWERK Annotation Processor Plugin. Start by adding the following to the very top of the build.gradle file:

      -
      plugins {
      -    id "com.ewerk.gradle.plugins.annotation-processor" version "1.0.4"
      -}
      -

      Then add the following to the build.gradle file:

      -
      dependencies {
      -    compileOnly 'net.thauvin.erik:semver:1.0.1'
      -}
      -
      -annotationProcessor {
      -    library 'net.thauvin.erik:semver:1.0.1'
      -    processor 'net.thauvin.erik.semver.VersionProcessor'
      -    // sourcesDir 'src/generated/java'
      -}
      -
      -compileJava {
      -    // Disable the classpath processor
      -    options.compilerArgs << '-proc:none'
      -}
      -

      The plugin implements a separate compile task that only runs the annotation processor and is executed during the build phase.

      -

      Please look at the build.gradle file in the example module directory for a sample.

      +

      In order to also incorporate the generated source code into the source tree, add the following to the very top of the build.gradle file:

      +
      compileJava.options.annotationProcessorGeneratedSourcesDirectory = file("${projectDir}/src/generated/java")
      +

      The GeneratedVersion.java file will now be located in src/generated.

      +

      Please look at the build.gradle file in the Java example module directory for a sample.

      Kobalt

      To install and run from Kobalt, add the following to the Build.kt file:

      dependencies {
      -    apt("net.thauvin.erik:semver:1.0.1")
      -    compileOnly("net.thauvin.erik:semver:1.0.1")
      +    apt("net.thauvin.erik:semver:1.1.0-beta")
      +    compileOnly("net.thauvin.erik:semver:1.1.0-beta")
       }
      -

      Please look at the Build.kt file in the example module directory for a sample.

      +

      Please look at the Build.kt file in the Kotlin example module directory for a sample.

      Kotlin

      The annotation processor also supports Kotlin.

      To generate a Kotlin version file, simply specify the type as follows:

      @@ -389,11 +386,9 @@ compileJava { open class Main { // ...

      The Kotlin default template implements the same static fields and functions as the Java template.

      -

      Please look at the Example for Kotlin project for samples on using Gradle (build.gradle) and Kobalt (Build.kt).

      -

      Auto-Increment

      -

      Incrementing the version is best left to your favorite build system.

      -

      For a solution using Gradle, please have a look at the build.gradle file in the example module directory. To run the example with patch version auto-incrementing, issue the following command:

      -
      gradle release run
      -

      For a solution using Kobalt look at my Property File Editor plug-in.

      +

      Please look at the Kotlin example project for samples on using Gradle (build.gradle.kts) and Kobalt (Build.kt).

      +

      Auto-Increment

      +

      Incrementing the version is best left to your favorite build system. For a solution using Gradle, please have a look at the Semver Version Plugin for Gradle.

      +

      There are also full examples in both Java and Kotlin showing how to use both the plugin and annotation processor concurrently.

      diff --git a/version.properties b/version.properties index 0dfd594..6cb4370 100644 --- a/version.properties +++ b/version.properties @@ -1,7 +1,7 @@ -#Thu, 06 Oct 2016 11:49:46 -0700 -version.project=semver +#Generated by the Semver Plugin for Gradle +#Fri Nov 02 22:19:45 PDT 2018 +version.buildmeta= version.major=1 version.minor=1 version.patch=0 -version.buildmeta= version.prerelease=beta From 396efca16f349eafc42f61a7f64c6642661f4045 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 3 Nov 2018 11:42:41 -0700 Subject: [PATCH 117/316] Misc. updates. --- .../generated/java/com/example/GeneratedVersion.java | 2 +- examples/java/version.properties | 11 ++++++----- examples/kotlin/version.properties | 9 +++++---- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/examples/java/src/generated/java/com/example/GeneratedVersion.java b/examples/java/src/generated/java/com/example/GeneratedVersion.java index e0b5686..e1c1f06 100644 --- a/examples/java/src/generated/java/com/example/GeneratedVersion.java +++ b/examples/java/src/generated/java/com/example/GeneratedVersion.java @@ -16,7 +16,7 @@ public final class GeneratedVersion { public final static String BUILDMETA_PREFIX = "+"; public final static String PROJECT = "Example"; - public final static Date BUILDDATE = new Date(1530837381991L); + public final static Date BUILDDATE = new Date(1541197895495L); public final static int MAJOR = 2; public final static int MINOR = 17; public final static int PATCH = 52; diff --git a/examples/java/version.properties b/examples/java/version.properties index 5588eff..d8f031d 100644 --- a/examples/java/version.properties +++ b/examples/java/version.properties @@ -1,7 +1,8 @@ -#Mon, 18 Jul 2016 17:33:54 -0700 -version.project=Example -version.major=2 -version.minor=17 -version.patch=52 +#Generated by the Semver Plugin for Gradle +#Wed Jul 11 00:11:38 PDT 2018 version.prerelease=beta +version.minor=17 version.buildmeta=007 +version.patch=52 +version.major=2 +version.project=Example diff --git a/examples/kotlin/version.properties b/examples/kotlin/version.properties index fca66d0..da66130 100644 --- a/examples/kotlin/version.properties +++ b/examples/kotlin/version.properties @@ -1,7 +1,8 @@ -#Mon, 18 Jul 2016 17:33:54 -0700 -version.project=Example -version.major=2 +#Generated by the Semver Plugin for Gradle +#Fri Nov 02 18:26:53 PDT 2018 +version.buildmeta=007 +version.major=3 version.minor=17 version.patch=52 version.prerelease=beta -version.buildmeta=007 \ No newline at end of file +version.project=Example From 91993c598686c31babd32a976dda571249f3f7b5 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 3 Nov 2018 17:11:08 -0700 Subject: [PATCH 118/316] Fixed bintray upload. --- build.gradle | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/build.gradle b/build.gradle index fa6af98..2dccfe3 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,6 @@ plugins { id "com.github.spotbugs" version "1.6.5" } - import com.github.spotbugs.SpotBugsTask import org.apache.tools.ant.taskdefs.condition.Os @@ -46,7 +45,7 @@ bintray { user = project.hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER') key = project.hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') publications = ['MyPublication'] - dryRun = true + dryRun = false pkg { repo = 'maven' name = mavenName @@ -57,14 +56,6 @@ bintray { vcsUrl = mavenScmCon labels = pkgLabels publicDownloadNumbers = true - version { - name = project.version - desc = "Version $project.version" - vcsTag = project.version - gpg { - sign = true - } - } } } @@ -157,6 +148,13 @@ compileTestJava { options.compilerArgs.add('-proc:none') } +bintrayUpload { + versionName = "$project.version" + versionDesc = "Beta version $project.version" + versionVcsTag = "$project.version" + signVersion = true +} + task release(dependsOn: ['wrapper', 'clean', 'publishToMavenLocal']) { group = 'Publishing' description = 'Releases new version to local maven repository.' From a05c441f767b4b9ceb5be87a6ac1d2d282e04836 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 3 Nov 2018 17:11:55 -0700 Subject: [PATCH 119/316] Version 1.1.0-beta --- version.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.properties b/version.properties index 6cb4370..1f51dae 100644 --- a/version.properties +++ b/version.properties @@ -1,5 +1,5 @@ #Generated by the Semver Plugin for Gradle -#Fri Nov 02 22:19:45 PDT 2018 +#Sat Nov 03 17:10:00 PDT 2018 version.buildmeta= version.major=1 version.minor=1 From 887280a5fcd1990b86a12394e994a1f3f3cf64f8 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 4 Nov 2018 01:27:31 -0800 Subject: [PATCH 120/316] Fixed bintray signing. --- build.gradle | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 2dccfe3..96a97b8 100644 --- a/build.gradle +++ b/build.gradle @@ -56,6 +56,9 @@ bintray { vcsUrl = mavenScmCon labels = pkgLabels publicDownloadNumbers = true + version { + gpg { sign = true } + } } } @@ -150,9 +153,8 @@ compileTestJava { bintrayUpload { versionName = "$project.version" - versionDesc = "Beta version $project.version" + versionDesc = "Beta version $project.version" versionVcsTag = "$project.version" - signVersion = true } task release(dependsOn: ['wrapper', 'clean', 'publishToMavenLocal']) { From 077b6073b4aacf3375074d9483d80f52c95eec5b Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 4 Nov 2018 01:27:50 -0800 Subject: [PATCH 121/316] Fixed kotlin example location. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cefe757..e56f747 100644 --- a/README.md +++ b/README.md @@ -237,4 +237,4 @@ Please look at the [Kotlin example](https://github.com/ethauvin/semver/tree/mast Incrementing the version is best left to your favorite build system. For a solution using Gradle, please have a look at the [__Semver Version Plugin for Gradle__](https://github.com/ethauvin/semver-gradle). -There are also full [examples](https://github.com/ethauvin/semver-gradle/tree/master/examples/annotation-processor) in both [Java](https://github.com/ethauvin/semver-gradle/tree/master/examples/annotation-processor/java) and [Kotlin](https://github.com/ethauvin/semver-gradle/tree/master/examples/annotation-processor) showing how to use both the plugin and annotation processor concurrently. +There are also full [examples](https://github.com/ethauvin/semver-gradle/tree/master/examples/annotation-processor) in both [Java](https://github.com/ethauvin/semver-gradle/tree/master/examples/annotation-processor/java) and [Kotlin](https://github.com/ethauvin/semver-gradle/tree/master/examples/annotation-processor/kotlin) showing how to use both the plugin and annotation processor concurrently. From 635351c9556d92948e30de71242dc7f919921651 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 4 Nov 2018 10:41:50 -0800 Subject: [PATCH 122/316] Fixed warning. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e56f747..f795dcc 100644 --- a/README.md +++ b/README.md @@ -158,7 +158,7 @@ example.meta= # ... ``` -> :warning: `keysPrefix` is a new element in `1.1.0` and may break older versions when using custom property keys. +> :warning: `keysPrefix` is a new element staring in `1.1.0` and may break older versions when using custom property keys. > :zap: A quick fix is to include `keysPrefix=""` in the annotation to remove the default `version.` prefix. ## Usage with Maven, Grail, Kobalt and Kotlin From d60bf6345e96837ffadf15b96f30fa66e189c49f Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 30 Mar 2019 17:27:44 -0700 Subject: [PATCH 123/316] IDEA update. --- .idea/copyright/Erik_s_Copyright_Notice.xml | 6 ++++++ .idea/modules/examples-kotlin_main.iml | 7 ------- .idea/modules/examples-kotlin_test.iml | 14 -------------- .idea/scopes/Sources.xml | 3 +++ examples/kotlin/.idea/vcs.xml | 6 ++++++ 5 files changed, 15 insertions(+), 21 deletions(-) create mode 100644 .idea/copyright/Erik_s_Copyright_Notice.xml create mode 100644 .idea/scopes/Sources.xml create mode 100644 examples/kotlin/.idea/vcs.xml diff --git a/.idea/copyright/Erik_s_Copyright_Notice.xml b/.idea/copyright/Erik_s_Copyright_Notice.xml new file mode 100644 index 0000000..ef51a2d --- /dev/null +++ b/.idea/copyright/Erik_s_Copyright_Notice.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/modules/examples-kotlin_main.iml b/.idea/modules/examples-kotlin_main.iml index 33346db..f6c1db1 100644 --- a/.idea/modules/examples-kotlin_main.iml +++ b/.idea/modules/examples-kotlin_main.iml @@ -5,13 +5,6 @@ -
    */ - public final static String VERSION = Integer.toString(MAJOR) + '.' - + Integer.toString(MINOR) + '.' - + Integer.toString(PATCH) - + preReleaseWithPrefix() + buildMetaWithPrefix(); + public final static String VERSION = Integer.toString(MAJOR) + SEPARATOR + Integer.toString(MINOR) + SEPARATOR + + Integer.toString(PATCH) + preReleaseWithPrefix() + buildMetaWithPrefix(); /** * Disables the default constructor. @@ -70,7 +68,7 @@ public final class GeneratedVersion { * @return The build metadata, if any. */ public static String buildMetaWithPrefix(final String prefix) { - if (BUILDMETA.length() > 0 && prefix.length() > 0) { + if (BUILDMETA.length() > 0) { return prefix + BUILDMETA; } else { return BUILDMETA; @@ -93,10 +91,10 @@ public final class GeneratedVersion { * @return The pre-release version, if any. */ public static String preReleaseWithPrefix(final String prefix) { - if (PRERELEASE.length() > 0 && prefix.length() > 0) { + if (PRERELEASE.length() > 0) { return prefix + PRERELEASE; } else { return PRERELEASE; } } -} \ No newline at end of file +} diff --git a/examples/java/version.properties b/examples/java/version.properties index 0821cbd..d329bec 100644 --- a/examples/java/version.properties +++ b/examples/java/version.properties @@ -2,7 +2,7 @@ #Sat Mar 30 15:48:08 PDT 2019 version.buildmeta=007 version.major=2 -version.minor=17 +version.minor=0 version.patch=52 version.prerelease=beta version.project=Example diff --git a/examples/kotlin/.idea/modules/examples-kotlin_main.iml b/examples/kotlin/.idea/modules/examples-kotlin_main.iml index b2be99a..21ca34c 100644 --- a/examples/kotlin/.idea/modules/examples-kotlin_main.iml +++ b/examples/kotlin/.idea/modules/examples-kotlin_main.iml @@ -6,7 +6,7 @@
    - + - \ No newline at end of file + diff --git a/examples/kotlin/build.gradle.kts b/examples/kotlin/build.gradle.kts index 284263c..cff424c 100644 --- a/examples/kotlin/build.gradle.kts +++ b/examples/kotlin/build.gradle.kts @@ -10,7 +10,7 @@ plugins { defaultTasks(ApplicationPlugin.TASK_RUN_NAME) -var semverProcessor = "net.thauvin.erik:semver:1.1.1" +var semverProcessor = "net.thauvin.erik:semver:1.2.0" dependencies { kapt(semverProcessor) diff --git a/pom.xml b/pom.xml index e43ce3f..da36d4b 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 net.thauvin.erik semver - 1.1.1 + 1.2.0 semver Semantic Version Annotation Processor https://github.com/ethauvin/semver diff --git a/version.properties b/version.properties index 9a9096f..66b85c5 100644 --- a/version.properties +++ b/version.properties @@ -2,6 +2,6 @@ #Sat Mar 30 18:10:32 PDT 2019 version.buildmeta= version.major=1 -version.minor=1 -version.patch=1 +version.minor=2 +version.patch=0 version.prerelease= From 1f8388ca4f24d81b0506c8f22474c2ae5af18ea2 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 1 Apr 2019 12:15:01 -0700 Subject: [PATCH 140/316] Fixed javadoc. --- src/main/resources/semver-kt.mustache | 2 +- src/main/resources/semver.mustache | 15 +-------------- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/src/main/resources/semver-kt.mustache b/src/main/resources/semver-kt.mustache index d54afa8..bc6d68e 100644 --- a/src/main/resources/semver-kt.mustache +++ b/src/main/resources/semver-kt.mustache @@ -34,7 +34,7 @@ object {{className}} { val SEPARATOR = "{{separator}}" /** - * The full version string formatted as [MAJOR][SEPARATOR][MINOR][SEPARATOR][PATCH][[PRERELEASE_PREFIX][PRERELEASE]][[BUILDMETA_PREFIX][BUILDMETA]] + * The full semantic version string. */ @JvmField val VERSION = "$MAJOR$SEPARATOR$MINOR$SEPARATOR$PATCH" + preReleaseWithPrefix() + buildMetaWithPrefix() diff --git a/src/main/resources/semver.mustache b/src/main/resources/semver.mustache index 3baf2b1..48b9a87 100644 --- a/src/main/resources/semver.mustache +++ b/src/main/resources/semver.mustache @@ -24,20 +24,7 @@ public final class {{className}} { public final static String SEPARATOR = "{{separator}}"; /** - * The full version string. - *

    - * Formatted as: - *

    - * [MAJOR][SEPARATOR][MINOR][SEPARATOR][PATCH][[PRERELEASE_PREFIX][PRERELEASE]][[BUILDMETA_PREFIX][BUILDMETA]] - *
    - *

    - * For example: - *

      - *
    • 1.0.0
    • - *
    • 1.0.0-beta
    • - *
    • 1.0.0+20160124144700
    • - *
    • 1.0.0-alpha+001
    • - *
    + * The full semantic version string. */ public final static String VERSION = Integer.toString(MAJOR) + SEPARATOR + Integer.toString(MINOR) + SEPARATOR + Integer.toString(PATCH) + preReleaseWithPrefix() + buildMetaWithPrefix(); From e35276ddc8150c071845d99d655e839248a130b6 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 1 Apr 2019 15:22:08 -0700 Subject: [PATCH 141/316] Removed unnecessary throw in disabled constructor. --- src/main/java/net/thauvin/erik/semver/Constants.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/net/thauvin/erik/semver/Constants.java b/src/main/java/net/thauvin/erik/semver/Constants.java index 140f405..ddb3adf 100644 --- a/src/main/java/net/thauvin/erik/semver/Constants.java +++ b/src/main/java/net/thauvin/erik/semver/Constants.java @@ -139,11 +139,8 @@ public final class Constants { /** * Disables the default constructor. - * - * @throws UnsupportedOperationException if the constructor is called. */ - private Constants() - throws UnsupportedOperationException { + private Constants() { throw new UnsupportedOperationException("Illegal constructor call."); } } From e51dd093d9ad3217155b94b1046961fd93755071 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 1 Apr 2019 15:22:46 -0700 Subject: [PATCH 142/316] Combined redundant if statements. --- src/main/java/net/thauvin/erik/semver/VersionProcessor.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java index 18ff31f..0d2202f 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java +++ b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java @@ -233,10 +233,8 @@ public class VersionProcessor extends AbstractProcessor { throw new IOException("Could not find the target directory for generated Kotlin files."); } final File versionFile = new File(kaptGenDir, fileName); - if (!versionFile.getParentFile().exists()) { - if (!versionFile.getParentFile().mkdirs()) { - note("Could not create target directory: " + versionFile.getParentFile().getAbsolutePath()); - } + if (!versionFile.getParentFile().exists() && !versionFile.getParentFile().mkdirs()) { + note("Could not create target directory: " + versionFile.getParentFile().getAbsolutePath()); } try (final OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(versionFile), StandardCharsets.UTF_8)) { From f1d712816ef379a7f1a66b037071f943c86a1a03 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 1 Apr 2019 19:28:38 -0700 Subject: [PATCH 143/316] Added sonarcloud config. --- .gitignore | 1 + .travis.yml | 12 ++++++++++-- build.gradle | 1 + sonar-project.properties | 2 ++ 4 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 sonar-project.properties diff --git a/.gitignore b/.gitignore index 48c9251..2fe3b60 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ .kobalt .nb-gradle .project +.scannerwork .settings .vscode/* *.code-workspace diff --git a/.travis.yml b/.travis.yml index 58e8252..de23128 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,15 @@ language: java +dist: trusty + +addons: + sonarcloud: + organization: "ethauvin-github" + +script: + - sonar-scanner jdk: - oraclejdk8 - + before_install: - - chmod +x gradlew \ No newline at end of file + - chmod +x gradlew diff --git a/build.gradle b/build.gradle index dd6d6fd..f5f5f0c 100644 --- a/build.gradle +++ b/build.gradle @@ -5,6 +5,7 @@ plugins { id 'com.github.ben-manes.versions' version '0.21.0' id 'net.thauvin.erik.gradle.semver' version '0.9.9-beta' id 'com.github.spotbugs' version '1.7.1' + id 'org.sonarqube' version '2.7' } import com.github.spotbugs.SpotBugsTask diff --git a/sonar-project.properties b/sonar-project.properties new file mode 100644 index 0000000..27314ec --- /dev/null +++ b/sonar-project.properties @@ -0,0 +1,2 @@ +sonar.projectKey=ethauvin_semver +sonar.sourceEncoding=UTF-8 From 5580ea66873ab97566eee093bdf752e8050d147e Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 1 Apr 2019 19:29:05 -0700 Subject: [PATCH 144/316] Fixed template name. --- src/main/java/net/thauvin/erik/semver/Constants.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/thauvin/erik/semver/Constants.java b/src/main/java/net/thauvin/erik/semver/Constants.java index ddb3adf..40a43b2 100644 --- a/src/main/java/net/thauvin/erik/semver/Constants.java +++ b/src/main/java/net/thauvin/erik/semver/Constants.java @@ -86,7 +86,7 @@ public final class Constants { /** * The default mustache template. */ - public static final String DEFAULT_TEMPLATE_NAME = "mustache"; + public static final String DEFAULT_TEMPLATE_NAME = "version.mustache"; /** * The empty string. */ From eb907c33fa3d925940ddd5fbc7172c32d767bd5e Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 1 Apr 2019 19:30:53 -0700 Subject: [PATCH 145/316] Using gradlew to test examples. --- examples/examples.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/examples.sh b/examples/examples.sh index d0895bc..c83bb0e 100755 --- a/examples/examples.sh +++ b/examples/examples.sh @@ -12,6 +12,6 @@ normal=$(tput sgr0) for ex in "java" "kotlin"; do cd "$dir/$ex" || exit 1 echo "> Project: ${color}${ex}${normal}" - gradle clean "$@" --console=plain --no-build-cache || exit 1 + ./gradlew clean "$@" --console=plain --no-build-cache || exit 1 echo -done \ No newline at end of file +done From 77a1b1cf14c25b0c082a08eb6972af7bcb356290 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 1 Apr 2019 19:31:31 -0700 Subject: [PATCH 146/316] Improved templates. --- examples/java/example.mustache | 33 +++++++++++++++++++++++++++ examples/kotlin/example.mustache | 36 ++++++++++++++++++++++++++++++ src/main/resources/semver.mustache | 7 ++---- 3 files changed, 71 insertions(+), 5 deletions(-) create mode 100644 examples/java/example.mustache create mode 100644 examples/kotlin/example.mustache diff --git a/examples/java/example.mustache b/examples/java/example.mustache new file mode 100644 index 0000000..a44fd5d --- /dev/null +++ b/examples/java/example.mustache @@ -0,0 +1,33 @@ +/* + * This file is automatically generated. + * Do not modify! -- ALL CHANGES WILL BE ERASED! + */ +package {{packageName}}; + +import java.util.Date; + +public final class {{className}} { + public final static String PROJECT = "{{project}}"; + public final static Date BUILDDATE = new Date({{epoch}}L); + public final static int MAJOR = {{major}}; + public final static int MINOR = {{minor}}; + public final static int PATCH = {{patch}}; + public final static String PRERELEASE = "{{preRelease}}"; + public final static String BUILDMETA = "{{buildMeta}}"; + + /** + * The full semantic version string. + */ + public final static String VERSION = Integer.toString(MAJOR) + '.' + + Integer.toString(MINOR) + '.' + + Integer.toString(PATCH) + + ((!PRERELEASE.isEmpty()) ? "-" + PRERELEASE : "") + + ((!BUILDMETA.isEmpty()) ? "+" + BUILDMETA : ""); + + /** + * Disables the default constructor. + */ + private {{className}}() { + throw new UnsupportedOperationException("Illegal constructor call."); + } +} diff --git a/examples/kotlin/example.mustache b/examples/kotlin/example.mustache new file mode 100644 index 0000000..1d3a14a --- /dev/null +++ b/examples/kotlin/example.mustache @@ -0,0 +1,36 @@ +/* + * This file is automatically generated. + * Do not modify! -- ALL CHANGES WILL BE ERASED! + */ +package {{packageName}} + +import java.util.Date + +/** + * Provides semantic version information. + * + * @author Semantic Version Annotation Processor + */ +object {{className}} { + @JvmField + val PROJECT = "{{project}}" + @JvmField + val BUILDDATE = Date({{epoch}}L) + @JvmField + val MAJOR = {{major}} + @JvmField + val MINOR = {{minor}} + @JvmField + val PATCH = {{patch}} + @JvmField + val PRERELEASE = "{{preRelease}}" + @JvmField + val BUILDMETA = "{{buildMeta}}" + + /** + * The full semantic version string. + */ + @JvmField + val VERSION = ("$MAJOR.$MINOR.$PATCH" + if (PRERELEASE.isNotEmpty()) "-$PRERELEASE" else "" + + if (BUILDMETA.isNotEmpty()) "+$BUILDMETA" else "") +} diff --git a/src/main/resources/semver.mustache b/src/main/resources/semver.mustache index 48b9a87..20c08ce 100644 --- a/src/main/resources/semver.mustache +++ b/src/main/resources/semver.mustache @@ -27,15 +27,12 @@ public final class {{className}} { * The full semantic version string. */ public final static String VERSION = Integer.toString(MAJOR) + SEPARATOR + Integer.toString(MINOR) + SEPARATOR - + Integer.toString(PATCH) + preReleaseWithPrefix() + buildMetaWithPrefix(); + + Integer.toString(PATCH) + preReleaseWithPrefix() + buildMetaWithPrefix(); /** * Disables the default constructor. - * - * @throws UnsupportedOperationException If the constructor is called. */ - private {{className}}() - throws UnsupportedOperationException { + private {{className}}() { throw new UnsupportedOperationException("Illegal constructor call."); } From d74d2b5fdfc35950aafa8f8259d5ee1c7ca0b806 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 1 Apr 2019 19:32:01 -0700 Subject: [PATCH 147/316] Added sonarcloud badge. --- README.md | 4 ++-- build.gradle | 2 +- docs/README.html | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 5d1758d..671e572 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Semantic Version Annotation Processor [![License (3-Clause BSD)](https://img.shields.io/badge/license-BSD%203--Clause-blue.svg?style=flat-square)](http://opensource.org/licenses/BSD-3-Clause) [![release](https://img.shields.io/github/release/ethauvin/semver.svg)](https://github.com/ethauvin/semver/releases/latest) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver/badge.svg)](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver) [ ![Download](https://api.bintray.com/packages/ethauvin/maven/SemVer/images/download.svg) ](https://bintray.com/ethauvin/maven/SemVer/_latestVersion) -[![Known Vulnerabilities](https://snyk.io/test/github/ethauvin/semver/badge.svg?targetFile=build.gradle)](https://snyk.io/test/github/ethauvin/semver?targetFile=build.gradle) [![Build Status](https://travis-ci.org/ethauvin/semver.svg?branch=master)](https://travis-ci.org/ethauvin/semver) [![Build status](https://ci.appveyor.com/api/projects/status/nbv4mxd1gpxtx69o?svg=true)](https://ci.appveyor.com/project/ethauvin/semver) [![CircleCI](https://circleci.com/gh/ethauvin/semver/tree/master.svg?style=shield)](https://circleci.com/gh/ethauvin/semver/tree/master) +[![Known Vulnerabilities](https://snyk.io/test/github/ethauvin/semver/badge.svg?targetFile=build.gradle)](https://snyk.io/test/github/ethauvin/semver?targetFile=build.gradle) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=ethauvin_semver&metric=alert_status)](https://sonarcloud.io/dashboard?id=ethauvin_semver) [![Build Status](https://travis-ci.org/ethauvin/semver.svg?branch=master)](https://travis-ci.org/ethauvin/semver) [![Build status](https://ci.appveyor.com/api/projects/status/nbv4mxd1gpxtx69o?svg=true)](https://ci.appveyor.com/project/ethauvin/semver) [![CircleCI](https://circleci.com/gh/ethauvin/semver/tree/master.svg?style=shield)](https://circleci.com/gh/ethauvin/semver/tree/master) An [annotation processor](https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html) that automatically generates a `GeneratedVersion` class based on a [Mustache](https://mustache.github.io/) template and containing the [semantic version](http://semver.org/) (major, minor, patch, etc.) that is read from a `Properties` file or defined in the [annotation](https://docs.oracle.com/javase/tutorial/java/annotations/basics.html). @@ -84,7 +84,7 @@ A very simple custom template might look something like: ```java /* version.mustache */ -package {{packageName}} +package {{packageName}}; import java.util.Date; diff --git a/build.gradle b/build.gradle index f5f5f0c..5a09a41 100644 --- a/build.gradle +++ b/build.gradle @@ -38,7 +38,7 @@ repositories { dependencies { implementation 'com.github.spullara.mustache.java:compiler:0.9.6' - compileOnly 'com.github.spotbugs:spotbugs-annotations:3.1.12' + // compileOnly 'com.github.spotbugs:spotbugs-annotations:3.1.12' testImplementation 'org.testng:testng:6.14.3' } diff --git a/docs/README.html b/docs/README.html index f4ecc35..3215637 100644 --- a/docs/README.html +++ b/docs/README.html @@ -82,7 +82,7 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni

    Semantic Version Annotation Processor

    License (3-Clause BSD) release Maven Central Download
    -Known Vulnerabilities Build Status Build status CircleCI

    +Known Vulnerabilities Quality Gate Status Build Status Build status CircleCI

    An annotation processor that automatically generates a GeneratedVersion class based on a Mustache template and containing the semantic version (major, minor, patch, etc.) that is read from a Properties file or defined in the annotation.

    This processor was inspired by Cédric Beust's version-processor and works well in conjunction with the Semantic Version Plugin for Gradle.

    Examples

    @@ -208,7 +208,7 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni

    Custom Template

    A very simple custom template might look something like:

    /* version.mustache */
    -package {{packageName}}
    +package {{packageName}};
     
     import java.util.Date;
     
    
    From b1602c78a902f4d94387773cb23ad0a86a0045ed Mon Sep 17 00:00:00 2001
    From: "Erik C. Thauvin" 
    Date: Mon, 1 Apr 2019 19:35:18 -0700
    Subject: [PATCH 148/316] Added annotation with template example.
    
    ---
     examples/java/src/main/java/com/example/Example.java   | 2 ++
     examples/kotlin/src/main/java/com/example/Example.java | 2 +-
     examples/kotlin/src/main/kotlin/com/example/Main.kt    | 4 +++-
     3 files changed, 6 insertions(+), 2 deletions(-)
    
    diff --git a/examples/java/src/main/java/com/example/Example.java b/examples/java/src/main/java/com/example/Example.java
    index ba725b3..9b654ce 100644
    --- a/examples/java/src/main/java/com/example/Example.java
    +++ b/examples/java/src/main/java/com/example/Example.java
    @@ -1,8 +1,10 @@
     package com.example;
     
     import net.thauvin.erik.semver.Version;
    +
     import java.text.SimpleDateFormat;
     
    +//@Version(properties = "version.properties", template = "example.mustache")
     @Version(properties = "version.properties")
     public class Example {
         public static void main(final String... args) {
    diff --git a/examples/kotlin/src/main/java/com/example/Example.java b/examples/kotlin/src/main/java/com/example/Example.java
    index 51b8b0d..ba23235 100644
    --- a/examples/kotlin/src/main/java/com/example/Example.java
    +++ b/examples/kotlin/src/main/java/com/example/Example.java
    @@ -19,4 +19,4 @@ public class Example {
     
             System.out.println("-----------------------------------------------------");
         }
    -}
    \ No newline at end of file
    +}
    diff --git a/examples/kotlin/src/main/kotlin/com/example/Main.kt b/examples/kotlin/src/main/kotlin/com/example/Main.kt
    index f4316dd..682132a 100644
    --- a/examples/kotlin/src/main/kotlin/com/example/Main.kt
    +++ b/examples/kotlin/src/main/kotlin/com/example/Main.kt
    @@ -3,10 +3,12 @@ package com.example
     import net.thauvin.erik.semver.Version
     import java.text.SimpleDateFormat
     
    +//@Version(properties = "version.properties", type = "kt", template = "example.mustache")
     @Version(properties = "version.properties", type = "kt")
     class Main {
         companion object {
    -        @JvmStatic fun main(args: Array) {
    +        @JvmStatic
    +        fun main(args: Array) {
                 val sdf = SimpleDateFormat("EEE, d MMM yyyy 'at' HH:mm:ss z")
     
                 println("-----------------------------------------------------")
    
    From 7c8e348b27b272e3614c9904fc79f9054921d05e Mon Sep 17 00:00:00 2001
    From: "Erik C. Thauvin" 
    Date: Tue, 2 Apr 2019 22:57:40 -0700
    Subject: [PATCH 149/316] Removed kobalt.
    
    ---
     kobalt/Build.kt.iml                           |  42 ------
     kobalt/src/Build.kt                           | 141 ------------------
     kobalt/wrapper/kobalt-wrapper.jar             | Bin 13311 -> 0 bytes
     kobalt/wrapper/kobalt-wrapper.properties      |   1 -
     .../wrapper/kobalt/wrapper/kobalt-wrapper.jar | Bin 13310 -> 0 bytes
     .../kobalt/wrapper/kobalt-wrapper.properties  |   1 -
     kobalt/wrapper/kobaltw                        |   2 -
     kobalt/wrapper/kobaltw.bat                    |   4 -
     kobaltw                                       |   2 -
     kobaltw-test                                  |   4 -
     kobaltw.bat                                   |   4 -
     pom.xml                                       |  42 ------
     12 files changed, 243 deletions(-)
     delete mode 100644 kobalt/Build.kt.iml
     delete mode 100644 kobalt/src/Build.kt
     delete mode 100644 kobalt/wrapper/kobalt-wrapper.jar
     delete mode 100644 kobalt/wrapper/kobalt-wrapper.properties
     delete mode 100644 kobalt/wrapper/kobalt/wrapper/kobalt-wrapper.jar
     delete mode 100644 kobalt/wrapper/kobalt/wrapper/kobalt-wrapper.properties
     delete mode 100644 kobalt/wrapper/kobaltw
     delete mode 100644 kobalt/wrapper/kobaltw.bat
     delete mode 100755 kobaltw
     delete mode 100644 kobaltw-test
     delete mode 100644 kobaltw.bat
     delete mode 100644 pom.xml
    
    diff --git a/kobalt/Build.kt.iml b/kobalt/Build.kt.iml
    deleted file mode 100644
    index 83dc276..0000000
    --- a/kobalt/Build.kt.iml
    +++ /dev/null
    @@ -1,42 +0,0 @@
    -
    -
    -  
    -    
    -    
    -    
    -    
    -      
    -    
    -    
    -    
    -    
    -      
    -        
    -          
    -        
    -        
    -        
    -          
    -        
    -      
    -    
    -    
    -      
    -        
    -          
    -        
    -        
    -        
    -      
    -    
    -    
    -      
    -        
    -          
    -        
    -        
    -        
    -      
    -    
    -  
    -
    \ No newline at end of file
    diff --git a/kobalt/src/Build.kt b/kobalt/src/Build.kt
    deleted file mode 100644
    index 6936aca..0000000
    --- a/kobalt/src/Build.kt
    +++ /dev/null
    @@ -1,141 +0,0 @@
    -import com.beust.kobalt.buildScript
    -import com.beust.kobalt.localMaven
    -import com.beust.kobalt.plugin.java.javadoc
    -import com.beust.kobalt.plugin.java.javaCompiler
    -import com.beust.kobalt.plugin.packaging.assemble
    -import com.beust.kobalt.plugin.packaging.install
    -import com.beust.kobalt.plugin.publish.autoGitTag
    -import com.beust.kobalt.plugin.publish.bintray
    -import com.beust.kobalt.project
    -import net.thauvin.erik.kobalt.plugin.exec.Os
    -import net.thauvin.erik.kobalt.plugin.exec.exec
    -import net.thauvin.erik.kobalt.plugin.pom2xml.pom2xml
    -import org.apache.maven.model.Developer
    -import org.apache.maven.model.License
    -import org.apache.maven.model.Model
    -import org.apache.maven.model.Scm
    -import java.io.FileInputStream
    -import java.util.*
    -
    -val bs = buildScript {
    -    repos(localMaven())
    -    plugins("net.thauvin.erik:kobalt-exec:",
    -            "net.thauvin.erik:kobalt-pom2xml:")
    -}
    -
    -fun StringBuilder.prepend(s: String): StringBuilder {
    -    if (this.isNotEmpty()) {
    -        this.insert(0, s)
    -    }
    -    return this
    -}
    -
    -fun versionFor(directory: String = "./"): String {
    -    val propsFile = directory + '/' + "version.properties"
    -    val majorKey = "version.major"
    -    val minorKey = "version.minor"
    -    val patchKey = "version.patch"
    -    val metaKey = "version.buildmeta"
    -    val preKey = "version.prerelease"
    -
    -    val p = Properties().apply { FileInputStream(propsFile).use { fis -> load(fis) } }
    -
    -    return (p.getProperty(majorKey, "1") + "." + p.getProperty(minorKey, "0") + "." + p.getProperty(patchKey, "0")
    -            + StringBuilder(p.getProperty(preKey, "")).prepend("-")
    -            + StringBuilder(p.getProperty(metaKey, "")).prepend("+"))
    -}
    -
    -val semver = project {
    -
    -    name = "semver"
    -    description = "Semantic Version Annotation Processor"
    -    group = "net.thauvin.erik"
    -    artifactId = name
    -    version = versionFor()
    -
    -    pom = Model().apply {
    -        description = project.description
    -        url = "https://github.com/ethauvin/semver"
    -        licenses = listOf(License().apply {
    -            name = "BSD 3-Clause"
    -            url = "https://opensource.org/licenses/BSD-3-Clause"
    -        })
    -        scm = Scm().apply {
    -            url = "https://github.com/ethauvin/semver"
    -            connection = "https://github.com/ethauvin/semver.git"
    -            developerConnection = "git@github.com:ethauvin/semver.git"
    -        }
    -        developers = listOf(Developer().apply {
    -            id = "ethauvin"
    -            name = "Erik C. Thauvin"
    -            email = "erik@thauvin.net"
    -        })
    -    }
    -
    -    dependencies {
    -        compile("com.github.spullara.mustache.java:compiler:0.9.6")
    -        compileOnly("org.jetbrains.kotlin:kotlin-stdlib:1.3.21")
    -        compileOnly("com.github.spotbugs:spotbugs-annotations:3.1.12")
    -    }
    -
    -    dependenciesTest {
    -        compile("org.testng:testng:6.14.3")
    -    }
    -
    -    javaCompiler {
    -        args("-source", "1.8", "-target", "1.8")
    -    }
    -
    -    assemble {
    -        jar {
    -            //fatJar = true
    -        }
    -        mavenJars {
    -            //fatJar = true
    -        }
    -    }
    -
    -    install {
    -        target = "deploy"
    -    }
    -
    -    autoGitTag {
    -        enabled = true
    -        push = false
    -        message = "Version $version"
    -    }
    -
    -    bintray {
    -        name = "SemVer"
    -        publish = true
    -        description = "Release version $version"
    -        issueTrackerUrl = "https://github.com/ethauvin/semver/issues"
    -        vcsTag = version
    -        sign = true
    -    }
    -
    -    javadoc {
    -        title = "${project.description} ${project.version}"
    -        tags("created")
    -        author = true
    -        //quiet = false
    -        //verbose = true
    -        links("http://docs.oracle.com/javase/8/docs/api/")
    -    }
    -
    -    exec {
    -        taskName = "pandoc"
    -        val args = arrayOf("--from", "markdown_github",
    -                "--to", "html5",
    -                "-s",
    -                "-c", "github-pandoc.css",
    -                "-o", "docs/README.html",
    -                "README.md")
    -        commandLine("pandoc", *args, os = setOf(Os.LINUX, Os.MINGW, Os.CYGWIN))
    -        commandLine("cmd", "/c", "pandoc", *args, os = setOf(Os.WINDOWS))
    -    }
    -
    -    pom2xml {
    -
    -    }
    -}
    diff --git a/kobalt/wrapper/kobalt-wrapper.jar b/kobalt/wrapper/kobalt-wrapper.jar
    deleted file mode 100644
    index 8757609f0b6781ed71431711dd5e6792912ada74..0000000000000000000000000000000000000000
    GIT binary patch
    literal 0
    HcmV?d00001
    
    literal 13311
    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
    F{{yLcAq@Zk
    
    diff --git a/kobalt/wrapper/kobalt-wrapper.properties b/kobalt/wrapper/kobalt-wrapper.properties
    deleted file mode 100644
    index 0ca8045..0000000
    --- a/kobalt/wrapper/kobalt-wrapper.properties
    +++ /dev/null
    @@ -1 +0,0 @@
    -kobalt.version=1.0.122
    \ No newline at end of file
    diff --git a/kobalt/wrapper/kobalt/wrapper/kobalt-wrapper.jar b/kobalt/wrapper/kobalt/wrapper/kobalt-wrapper.jar
    deleted file mode 100644
    index 22d3ef5a57cd7c12b01203a62009f95cb4c0575a..0000000000000000000000000000000000000000
    GIT binary patch
    literal 0
    HcmV?d00001
    
    literal 13310
    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
    U{=>tL`ugz4(rXq73_nT!AEintfB*mh
    
    diff --git a/kobalt/wrapper/kobalt/wrapper/kobalt-wrapper.properties b/kobalt/wrapper/kobalt/wrapper/kobalt-wrapper.properties
    deleted file mode 100644
    index a96b6c5..0000000
    --- a/kobalt/wrapper/kobalt/wrapper/kobalt-wrapper.properties
    +++ /dev/null
    @@ -1 +0,0 @@
    -kobalt.version=1.0.118
    diff --git a/kobalt/wrapper/kobaltw b/kobalt/wrapper/kobaltw
    deleted file mode 100644
    index c5186d5..0000000
    --- a/kobalt/wrapper/kobaltw
    +++ /dev/null
    @@ -1,2 +0,0 @@
    -#!/usr/bin/env sh
    -java -jar "`dirname "$0"`/kobalt/wrapper/kobalt-wrapper.jar" $*
    diff --git a/kobalt/wrapper/kobaltw.bat b/kobalt/wrapper/kobaltw.bat
    deleted file mode 100644
    index d578071..0000000
    --- a/kobalt/wrapper/kobaltw.bat
    +++ /dev/null
    @@ -1,4 +0,0 @@
    -@echo off
    -set DIRNAME=%~dp0
    -if "%DIRNAME%" == "" set DIRNAME=.
    -java -jar "%DIRNAME%/kobalt/wrapper/kobalt-wrapper.jar" %*
    diff --git a/kobaltw b/kobaltw
    deleted file mode 100755
    index c5186d5..0000000
    --- a/kobaltw
    +++ /dev/null
    @@ -1,2 +0,0 @@
    -#!/usr/bin/env sh
    -java -jar "`dirname "$0"`/kobalt/wrapper/kobalt-wrapper.jar" $*
    diff --git a/kobaltw-test b/kobaltw-test
    deleted file mode 100644
    index 06230ec..0000000
    --- a/kobaltw-test
    +++ /dev/null
    @@ -1,4 +0,0 @@
    -#!/usr/bin/env sh
    -JAR=$(ls -1 -t /k/GitHub/kobalt/kobaltBuild/libs/*.jar | egrep -v "(sources|javadoc)" | head -1)
    -export KOBALT_JAR=$JAR
    -java -jar $JAR $*
    diff --git a/kobaltw.bat b/kobaltw.bat
    deleted file mode 100644
    index d578071..0000000
    --- a/kobaltw.bat
    +++ /dev/null
    @@ -1,4 +0,0 @@
    -@echo off
    -set DIRNAME=%~dp0
    -if "%DIRNAME%" == "" set DIRNAME=.
    -java -jar "%DIRNAME%/kobalt/wrapper/kobalt-wrapper.jar" %*
    diff --git a/pom.xml b/pom.xml
    deleted file mode 100644
    index da36d4b..0000000
    --- a/pom.xml
    +++ /dev/null
    @@ -1,42 +0,0 @@
    -
    -
    -  4.0.0
    -  net.thauvin.erik
    -  semver
    -  1.2.0
    -  semver
    -  Semantic Version Annotation Processor
    -  https://github.com/ethauvin/semver
    -  
    -    
    -      BSD 3-Clause
    -      https://opensource.org/licenses/BSD-3-Clause
    -    
    -  
    -  
    -    
    -      ethauvin
    -      Erik C. Thauvin
    -      erik@thauvin.net
    -    
    -  
    -  
    -    https://github.com/ethauvin/semver.git
    -    git@github.com:ethauvin/semver.git
    -    https://github.com/ethauvin/semver
    -  
    -  
    -    
    -      com.github.spullara.mustache.java
    -      compiler
    -      0.9.6
    -    
    -    
    -      org.testng
    -      testng
    -      6.14.3
    -      test
    -    
    -  
    -
    
    From 931d08be639721245547626eac5fb6485f8252d3 Mon Sep 17 00:00:00 2001
    From: "Erik C. Thauvin" 
    Date: Tue, 2 Apr 2019 22:59:47 -0700
    Subject: [PATCH 150/316] Added sonarcloud with jacoco.
    
    ---
     .travis.yml              | 16 +++++++++-------
     build.gradle             |  8 ++++++++
     sonar-project.properties |  2 --
     3 files changed, 17 insertions(+), 9 deletions(-)
     delete mode 100644 sonar-project.properties
    
    diff --git a/.travis.yml b/.travis.yml
    index de23128..f2a55d1 100644
    --- a/.travis.yml
    +++ b/.travis.yml
    @@ -1,15 +1,17 @@
     language: java
    -dist: trusty
    +
    +jdk:
    +  - oraclejdk8
     
     addons:
       sonarcloud:
         organization: "ethauvin-github"
     
    -script:
    -  - sonar-scanner
    -
    -jdk:
    -  - oraclejdk8
    -
     before_install:
       - chmod +x gradlew
    +
    +after_success:
    +  - |
    +      if [ "${TRAVIS_TEST_RESULT}" == 0 ]; then
    +        ./gradlew sonarqube
    +      fi
    diff --git a/build.gradle b/build.gradle
    index 5a09a41..e12cd38 100644
    --- a/build.gradle
    +++ b/build.gradle
    @@ -1,5 +1,6 @@
     plugins {
         id 'java'
    +    id 'jacoco'
         id 'maven-publish'
         id 'com.jfrog.bintray' version '1.8.4'
         id 'com.github.ben-manes.versions' version '0.21.0'
    @@ -186,3 +187,10 @@ task pandoc(type: Exec) {
             return standardOutput.toString()
         }
     }
    +
    +sonarqube {
    +    properties {
    +        property("sonar.projectKey", "ethauvin_semver")
    +        property("sonar.sourceEncoding", "UTF-8")
    +    }
    +}
    diff --git a/sonar-project.properties b/sonar-project.properties
    deleted file mode 100644
    index 27314ec..0000000
    --- a/sonar-project.properties
    +++ /dev/null
    @@ -1,2 +0,0 @@
    -sonar.projectKey=ethauvin_semver
    -sonar.sourceEncoding=UTF-8
    
    From 4df1dd3ddd21e006617ca9f5c7017b8ad4b9c06c Mon Sep 17 00:00:00 2001
    From: "Erik C. Thauvin" 
    Date: Tue, 2 Apr 2019 23:00:16 -0700
    Subject: [PATCH 151/316] Updated shell scripts.
    
    ---
     clean.sh             | 37 ---------------------------------
     examples/examples.sh |  6 +++---
     releasecheck.sh      | 49 ++++++++++++++++++++++++++++++++++++++++++++
     updatewrappers.sh    | 47 ++++++++++++++++++++++++++----------------
     4 files changed, 81 insertions(+), 58 deletions(-)
     delete mode 100755 clean.sh
     create mode 100644 releasecheck.sh
    
    diff --git a/clean.sh b/clean.sh
    deleted file mode 100755
    index 552252d..0000000
    --- a/clean.sh
    +++ /dev/null
    @@ -1,37 +0,0 @@
    -#!/bin/bash
    -
    -DEBUG=false
    -
    -rm="rm -rf"
    -
    -if [ "$DEBUG" = true ]; then
    -	rm="echo rm -rf"
    -fi
    -
    -buildkt="kobalt/src/Build.kt"
    -
    -name=$(cat $buildkt | grep -m 1 "name = " | cut -d"\"" -f 2)
    -group=$(cat $buildkt | grep -m 1 "group = " | cut -d"\"" -f 2)
    -
    -if [ -z "$1" ]; then
    -	version=$(cat $buildkt | grep -m 1 "version = " | cut -d"\"" -f 2)
    -else
    -	version="$1"
    -fi
    -
    -maven="/k/maven/repository/${group//.//}/${name}/${version}"
    -kobalt="$HOME/.kobalt/cache/${group//.//}/${name}/${version}"
    -localRepo="$HOME/.kobalt/localMavenRepo/${group//.//}/${name}/${version}"
    -
    -read -p "Delete version ${version}? " -n 1 -r
    -echo
    -if [[ $REPLY =~ ^[Yy]$ ]]; then
    -	for dir in "$kobalt" "$maven" "$localRepo"; do
    -		if [ -d "$dir" ]; then
    -			echo -e "Deleting : \e[32;1m$dir\e[0m"
    -			$rm "$dir"
    -		else
    -			echo -e "Not Found: \e[31;1m$dir\e[0m"
    -		fi
    -	done
    -fi
    \ No newline at end of file
    diff --git a/examples/examples.sh b/examples/examples.sh
    index c83bb0e..77ffbdf 100755
    --- a/examples/examples.sh
    +++ b/examples/examples.sh
    @@ -6,12 +6,12 @@ if [ $# -eq 0 ]; then
     fi
     
     dir=$(dirname "$(readlink -f "$0")")
    -color=$(tput setaf 6)
    +cyan=$(tput setaf 6)
     normal=$(tput sgr0)
     
     for ex in "java" "kotlin"; do
         cd "$dir/$ex" || exit 1
    -    echo "> Project: ${color}${ex}${normal}"
    -    ./gradlew clean "$@" --console=plain --no-build-cache || exit 1
    +    echo "> Project: ${cyanlor}${ex}${normal}"
    +    ./gradlew --console=plain --no-build-cache clean "$@" || exit 1
         echo
     done
    diff --git a/releasecheck.sh b/releasecheck.sh
    new file mode 100644
    index 0000000..b863595
    --- /dev/null
    +++ b/releasecheck.sh
    @@ -0,0 +1,49 @@
    +#!/bin/bash
    +
    +pwd=$PWD
    +red=$(tput setaf 1)
    +cyan=$(tput setaf 6)
    +normal=$(tput sgr0)
    +date=$(date +%Y)
    +
    +sonar="sonarqube"
    +doc="pandoc"
    +src="src/main/java/net/thauvin/erik/semver"
    +test="src/test/java/net/thauvin/erik/semver"
    +ext=".java"
    +
    +checkCopyright() {
    +    if [ "$(grep -c "$date" "$1")" -eq 0 ]; then
    +        echo -e Copyright: "${red}$f${normal}"
    +    else
    +        echo -e Checked: "$1"
    +    fi
    +}
    +
    +runGradle() {
    +    echo -e "${cyan}${1}${normal}"
    +    cd "$1" || exit 1
    +    shift
    +    ./gradlew --console=plain --no-build-cache clean $@ || exit 1
    +    cd "$pwd"
    +    read -p "Press enter to continue..."
    +    clear
    +}
    +
    +./updatewrappers.sh
    +read -p "Press enter to continue..."
    +clear
    +
    +gradle --console=plain --no-build-cache clean dU check $doc $sonar || exit 1
    +read -p "Press enter to continue..."
    +clear
    +
    +runGradle examples/java run
    +runGradle examples/kotlin run runJava
    +clear
    +
    +cd "$pwd"
    +
    +for f in LICENSE.TXT ${src}/*${ext} ${test}/*${ext} ; do
    +    checkCopyright "$f"
    +done
    diff --git a/updatewrappers.sh b/updatewrappers.sh
    index 1fe1824..0e597f9 100644
    --- a/updatewrappers.sh
    +++ b/updatewrappers.sh
    @@ -1,19 +1,30 @@
    -#!/bin/sh
    +#!/bin/bash
     
    -echo "semver"
    -gradle -q wrapper
    -kobaltw --update --log 0
    -cp -f /c/kobalt/kobalt/wrapper/kobalt-wrapper.jar /k/java/semver/kobalt/wrapper
    -./kobaltw --version
    -cd examples/java
    -echo
    -echo "examples/java"
    -gradle -q wrapper
    -kobaltw --update --log 0
    -cp -f /c/kobalt/kobalt/wrapper/kobalt-wrapper.jar /k/java/semver/kobalt/wrapper
    -./kobaltw --version
    -echo
    -echo "examples/kotlin"
    -cd ../kotlin
    -gradle -q wrapper 
    -cd ..
    +export JAVA_HOME="$JAVA8_HOME"
    +export PATH="$(cygpath "$JAVA_HOME")/bin:$PATH"
    +
    +declare -a dirs=("${PWD##*/}" "examples/java" "examples/kotlin")
    +pwd=$PWD
    +
    +updateWrappers() {
    +    if [ -d gradle ]; then
    +        gradle -q --console=plain wrapper
    +        echo -e "    $(./gradlew --version | grep Gradle)"
    +    fi
    +    if [ -d kobalt ]; then
    +        ./kobaltw --update --log 0
    +        echo -e "    Kobalt $(cut -d "=" -f 2 kobalt/wrapper/kobalt-wrapper.properties)"
    +    fi
    +}
    +
    +color=$(tput setaf 6)
    +normal=$(tput sgr0)
    +
    +for d in "${dirs[@]}"; do
    +    if [ -d "$d" ]; then
    +        cd "$d" || exit 1
    +    fi
    +    echo -e "${color}${d}${normal}"
    +    updateWrappers
    +    cd "$pwd"
    +done
    
    From 9f3b488822abed61e02fffb709329beb2d408be9 Mon Sep 17 00:00:00 2001
    From: "Erik C. Thauvin" 
    Date: Tue, 2 Apr 2019 23:00:36 -0700
    Subject: [PATCH 152/316] Added more coverage tests.
    
    ---
     .../thauvin/erik/semver/VersionInfoTest.java    | 17 +++++++++--------
     1 file changed, 9 insertions(+), 8 deletions(-)
    
    diff --git a/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java b/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java
    index 4682f2e..10cd936 100644
    --- a/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java
    +++ b/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java
    @@ -50,7 +50,6 @@ public class VersionInfoTest {
     
         @Test
         public void testGetVersion() {
    -
             Assert.assertEquals(versionInfo.getVersion(), "1.0.0", "getVersion(1.0.0)");
     
             versionInfo.setMajor(3);
    @@ -92,13 +91,11 @@ public class VersionInfoTest {
             versionInfo.setSeparator("-");
     
             Assert.assertEquals(versionInfo.getVersion(), "3-2-1+001", "getVersion(3-2-1+001)");
    -
    -        versionInfo.setSeparator(".");
    -
         }
     
         @Test
         public void testSetGet() {
    +        versionInfo.setSeparator(".");
     
             versionInfo.setMajor(1);
     
    @@ -126,18 +123,23 @@ public class VersionInfoTest {
     
             Assert.assertEquals(versionInfo.getVersion(), "1.2.3-alpha+001", "getVersion(1.2.3-alpha+001)");
     
    -        versionInfo.setBuildMeta("1");
             versionInfo.setBuildMetaPrefix("");
     
             Assert.assertEquals(versionInfo.getBuildMetaPrefix(), "", "getBuildMetaPrefix( )");
     
    -        Assert.assertEquals(versionInfo.getVersion(), "1.2.3-alpha1", "getVersion(1.2.3-alpha1)");
    +        Assert.assertEquals(versionInfo.getVersion(), "1.2.3-alpha001", "getVersion(1.2.3+alpha001)");
     
             versionInfo.setPreReleasePrefix(".");
     
             Assert.assertEquals(versionInfo.getPreReleasePrefix(), ".", "getPreReleasePrefix(.)");
     
    -        Assert.assertEquals(versionInfo.getVersion(), "1.2.3.alpha1", "getVersion(1.2.3.alpha1)");
    +        Assert.assertEquals(versionInfo.getVersion(), "1.2.3.alpha001", "getVersion(1.2.3.alpha001");
    +
    +        versionInfo.setSeparator("-");
    +
    +        Assert.assertEquals(versionInfo.getSeparator(), "-", "getSeparator(-)");
    +
    +        Assert.assertEquals(versionInfo.getVersion(), "1-2-3.alpha001", "getVersion(1-2-3.alpha001)");
     
             versionInfo.setProject("My Example");
     
    @@ -153,7 +155,6 @@ public class VersionInfoTest {
     
         @Test
         public void testVersionInfo() {
    -
             final Version version = new VersionTest();
             versionInfo = new VersionInfo(version);
     
    
    From 9e63b00c71eb7ede87c3e34c3bf482d5fdab6f6d Mon Sep 17 00:00:00 2001
    From: "Erik C. Thauvin" 
    Date: Tue, 2 Apr 2019 23:18:35 -0700
    Subject: [PATCH 153/316] Removed kobalt.
    
    ---
     .circleci/config.yml | 30 ------------------------------
     1 file changed, 30 deletions(-)
    
    diff --git a/.circleci/config.yml b/.circleci/config.yml
    index 7fdfcb3..586a6df 100644
    --- a/.circleci/config.yml
    +++ b/.circleci/config.yml
    @@ -38,38 +38,8 @@ jobs:
           - store_test_results:
               path: build/reports/
     
    -  build_kobalt:
    -    <<: *defaults
    -
    -    steps:
    -      - checkout
    -      - restore_cache:
    -          keys:
    -          - kobalt-dependencies-{{ checksum "kobalt/src/Build.kt" }}
    -          # fallback to using the latest cache if no exact match is found
    -          - kobalt-dependencies-
    -
    -      - run:
    -          name: Check Versions
    -          command: ./kobaltw checkVersions
    -
    -      - save_cache:
    -          paths: ~/.kobalt
    -          key: kobalt-dependencies-{{ checksum "kobalt/src/Build.kt" }}
    -
    -      - run:
    -          name: Assemble & Test
    -          command: ./kobaltw assemble test
    -
    -      - store_artifacts:
    -          path: kobaltBuild/test-output/
    -          destination: test-output
    -      - store_test_results:
    -          path: kobaltBuild/test-output/
    -
     workflows:
       version: 2
       build_gradle_and_kobalt:
         jobs:
           - build_gradle
    -      - build_kobalt
    \ No newline at end of file
    
    From b733cd89e2becd87cffc61d662d2de0988b0f4f1 Mon Sep 17 00:00:00 2001
    From: "Erik C. Thauvin" 
    Date: Tue, 2 Apr 2019 23:22:21 -0700
    Subject: [PATCH 154/316] Removed kobalt, added jdk version.
    
    ---
     .circleci/config.yml | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/.circleci/config.yml b/.circleci/config.yml
    index 586a6df..1b19e22 100644
    --- a/.circleci/config.yml
    +++ b/.circleci/config.yml
    @@ -40,6 +40,6 @@ jobs:
     
     workflows:
       version: 2
    -  build_gradle_and_kobalt:
    +  build_gradle_jdk8:
         jobs:
           - build_gradle
    
    From f4169e56ed381515d9f3161531dc962f34bba4e1 Mon Sep 17 00:00:00 2001
    From: "Erik C. Thauvin" 
    Date: Wed, 3 Apr 2019 02:19:20 -0700
    Subject: [PATCH 155/316] Trim int properties.
    
    ---
     .../java/net/thauvin/erik/semver/VersionProcessor.java     | 7 ++++---
     1 file changed, 4 insertions(+), 3 deletions(-)
    
    diff --git a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java
    index 0d2202f..c8039ac 100644
    --- a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java
    +++ b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java
    @@ -148,7 +148,9 @@ public class VersionProcessor extends AbstractProcessor {
         }
     
         private void log(final Diagnostic.Kind kind, final String s) {
    -        messager.printMessage(kind, '[' + VersionProcessor.class.getSimpleName() + "] " + s);
    +        if (messager != null) {
    +            messager.printMessage(kind, '[' + VersionProcessor.class.getSimpleName() + "] " + s);
    +        }
         }
     
         private void note(final String s) {
    @@ -157,7 +159,7 @@ public class VersionProcessor extends AbstractProcessor {
     
         private int parseIntProperty(final Properties p, final String property, final int defaultValue) {
             try {
    -            return Integer.parseInt(p.getProperty(property, Integer.toString(defaultValue)));
    +            return Integer.parseInt(p.getProperty(property, Integer.toString(defaultValue)).trim());
             } catch (NumberFormatException ignore) {
                 warn("Invalid property value: " + property);
                 return defaultValue;
    @@ -251,5 +253,4 @@ public class VersionProcessor extends AbstractProcessor {
                     + new File(jfo.getName()).getAbsoluteFile().getParent() + ')');
             }
         }
    -
     }
    
    From 4f66ef80245ac0f3aca35fb55d8f864788d11ecd Mon Sep 17 00:00:00 2001
    From: "Erik C. Thauvin" 
    Date: Wed, 3 Apr 2019 02:20:41 -0700
    Subject: [PATCH 156/316] Added tests for private methods.
    
    ---
     .../thauvin/erik/semver/VersionInfoTest.java  | 129 -------------
     .../erik/semver/VersionProcessorTest.java     |  79 ++++++++
     .../net/thauvin/erik/semver/VersionTest.java  | 169 ++++++++++++++++++
     test.properties                               |   9 +
     4 files changed, 257 insertions(+), 129 deletions(-)
     create mode 100644 src/test/java/net/thauvin/erik/semver/VersionProcessorTest.java
     create mode 100644 src/test/java/net/thauvin/erik/semver/VersionTest.java
     create mode 100644 test.properties
    
    diff --git a/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java b/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java
    index 10cd936..470c122 100644
    --- a/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java
    +++ b/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java
    @@ -34,7 +34,6 @@ package net.thauvin.erik.semver;
     import org.testng.Assert;
     import org.testng.annotations.Test;
     
    -import java.lang.annotation.Annotation;
     import java.util.Calendar;
     
     /**
    @@ -194,131 +193,3 @@ public class VersionInfoTest {
             Assert.assertEquals(versionInfo.getClassName(), version.className(), "getClassName(className)");
         }
     }
    -
    -@SuppressWarnings({"ClassExplicitlyAnnotation", "BadAnnotationImplementation"})
    -class VersionTest implements Version {
    -    @Override
    -    public Class annotationType() {
    -        return null;
    -    }
    -
    -    @Override
    -    public String buildMeta() {
    -        return "007";
    -    }
    -
    -    @Override
    -    public String buildMetaKey() {
    -        return "build.meta";
    -    }
    -
    -    @Override
    -    public String buildMetaPrefix() {
    -        return "+";
    -    }
    -
    -    @Override
    -    public String buildMetaPrefixKey() {
    -        return "build.meta.prefix";
    -    }
    -
    -    @Override
    -    public String className() {
    -        return "MyTest";
    -    }
    -
    -    @Override
    -    public String keysPrefix() {
    -        return "product.";
    -    }
    -
    -    @Override
    -    public int major() {
    -        return 2;
    -    }
    -
    -    @Override
    -    public String majorKey() {
    -        return "build.major";
    -    }
    -
    -    @Override
    -    public int minor() {
    -        return 17;
    -    }
    -
    -    @Override
    -    public String minorKey() {
    -        return "build.minor";
    -    }
    -
    -    @Override
    -    public String packageName() {
    -        return "com.foo.example";
    -    }
    -
    -    @Override
    -    public int patch() {
    -        return 52;
    -    }
    -
    -    @Override
    -    public String patchKey() {
    -        return "build.patch";
    -    }
    -
    -    @Override
    -    public String preRelease() {
    -        return "beta";
    -    }
    -
    -    @Override
    -    public String preReleaseKey() {
    -        return "build.prerelease";
    -    }
    -
    -    @Override
    -    public String preReleasePrefix() {
    -        return "-";
    -    }
    -
    -    @Override
    -    public String preReleasePrefixKey() {
    -        return "build.prerelase.prefix";
    -    }
    -
    -    @Override
    -    public String project() {
    -        return "My Test Project";
    -    }
    -
    -    @Override
    -    public String projectKey() {
    -        return "build.project";
    -    }
    -
    -    @Override
    -    public String properties() {
    -        return "test.properties";
    -    }
    -
    -    @Override
    -    public String separator() {
    -        return ".";
    -    }
    -
    -    @Override
    -    public String separatorKey() {
    -        return "build.separator";
    -    }
    -
    -    @Override
    -    public String template() {
    -        return "myversion.mustache";
    -    }
    -
    -    @Override
    -    public String type() {
    -        return "kt";
    -    }
    -}
    diff --git a/src/test/java/net/thauvin/erik/semver/VersionProcessorTest.java b/src/test/java/net/thauvin/erik/semver/VersionProcessorTest.java
    new file mode 100644
    index 0000000..93918d6
    --- /dev/null
    +++ b/src/test/java/net/thauvin/erik/semver/VersionProcessorTest.java
    @@ -0,0 +1,79 @@
    +/*
    + * VersionProcessorTest.java
    + *
    + * Copyright (c) 2016-2019, Erik C. Thauvin (erik@thauvin.net)
    + * All rights reserved.
    + *
    + * Redistribution and use in source and binary forms, with or without
    + * modification, are permitted provided that the following conditions are met:
    + *
    + *   Redistributions of source code must retain the above copyright notice, this
    + *   list of conditions and the following disclaimer.
    + *
    + *   Redistributions in binary form must reproduce the above copyright notice,
    + *   this list of conditions and the following disclaimer in the documentation
    + *   and/or other materials provided with the distribution.
    + *
    + *   Neither the name of this project nor the names of its contributors may be
    + *   used to endorse or promote products derived from this software without
    + *   specific prior written permission.
    + *
    + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
    + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    + */
    +package net.thauvin.erik.semver;
    +
    +import org.testng.Assert;
    +import org.testng.annotations.Test;
    +
    +import java.lang.reflect.InvocationTargetException;
    +import java.lang.reflect.Method;
    +import java.util.Properties;
    +
    +/**
    + * The VersionProcessorTest class.
    + *
    + * @author Erik C. Thauvin
    + * @created 2019-04-02
    + * @since 1.2.0
    + */
    +public class VersionProcessorTest {
    +    private final VersionProcessor processor = new VersionProcessor();
    +    private final Version version = new VersionTest();
    +
    +    @Test
    +    public void testFindValues() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
    +        final Method method = processor.getClass().getDeclaredMethod("findValues", Version.class);
    +        method.setAccessible(true);
    +        final VersionInfo versionInfo = (VersionInfo) method.invoke(processor, version);
    +
    +        Assert.assertEquals(versionInfo.getVersion(), "0-0-7:vodka++martini", "getVersion(0-0-7:vodka++martin)");
    +        Assert.assertEquals(versionInfo.getProject(), "James Bond", "getProject(James Bond)");
    +    }
    +
    +    @Test
    +    public void testParseIntProperty() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
    +        final Properties p = new Properties();
    +        p.setProperty("1", "1");
    +        p.setProperty("2", "2.1");
    +        p.setProperty("3", "zero");
    +        p.setProperty("4", " 4 ");
    +
    +        final Method method = processor.getClass().getDeclaredMethod(
    +            "parseIntProperty", Properties.class, String.class, int.class);
    +        method.setAccessible(true);
    +
    +        Assert.assertEquals(method.invoke(processor, p, "1", -1), 1, "parseIntProperty(1)");
    +        Assert.assertEquals(method.invoke(processor, p, "2", -1), -1, "parseIntProperty(2.1)");
    +        Assert.assertEquals(method.invoke(processor, p, "3", -1), -1, "parseIntProperty(zero)");
    +        Assert.assertEquals(method.invoke(processor, p, "4", -1), 4, "parseIntProperty( 4 )");
    +    }
    +}
    diff --git a/src/test/java/net/thauvin/erik/semver/VersionTest.java b/src/test/java/net/thauvin/erik/semver/VersionTest.java
    new file mode 100644
    index 0000000..0d91ac2
    --- /dev/null
    +++ b/src/test/java/net/thauvin/erik/semver/VersionTest.java
    @@ -0,0 +1,169 @@
    +/*
    + * VersionTest.java
    + *
    + * Copyright (c) 2016-2019, Erik C. Thauvin (erik@thauvin.net)
    + * All rights reserved.
    + *
    + * Redistribution and use in source and binary forms, with or without
    + * modification, are permitted provided that the following conditions are met:
    + *
    + *   Redistributions of source code must retain the above copyright notice, this
    + *   list of conditions and the following disclaimer.
    + *
    + *   Redistributions in binary form must reproduce the above copyright notice,
    + *   this list of conditions and the following disclaimer in the documentation
    + *   and/or other materials provided with the distribution.
    + *
    + *   Neither the name of this project nor the names of its contributors may be
    + *   used to endorse or promote products derived from this software without
    + *   specific prior written permission.
    + *
    + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
    + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    + */
    +package net.thauvin.erik.semver;
    +
    +import java.lang.annotation.Annotation;
    +
    +/**
    + * The VersionTest class.
    + *
    + * @author Erik C. Thauvin
    + * @created 2019-04-02
    + * @since 1.2.0
    + */
    +@SuppressWarnings({"ClassExplicitlyAnnotation"})
    +class VersionTest implements Version {
    +    @Override
    +    public Class annotationType() {
    +        return null;
    +    }
    +
    +    @Override
    +    public String buildMeta() {
    +        return "007";
    +    }
    +
    +    @Override
    +    public String buildMetaKey() {
    +        return "meta";
    +    }
    +
    +    @Override
    +    public String buildMetaPrefix() {
    +        return "+";
    +    }
    +
    +    @Override
    +    public String buildMetaPrefixKey() {
    +        return "meta.prefix";
    +    }
    +
    +    @Override
    +    public String className() {
    +        return "MyTest";
    +    }
    +
    +    @Override
    +    public String keysPrefix() {
    +        return "build.";
    +    }
    +
    +    @Override
    +    public int major() {
    +        return 2;
    +    }
    +
    +    @Override
    +    public String majorKey() {
    +        return "major";
    +    }
    +
    +    @Override
    +    public int minor() {
    +        return 17;
    +    }
    +
    +    @Override
    +    public String minorKey() {
    +        return "minor";
    +    }
    +
    +    @Override
    +    public String packageName() {
    +        return "com.foo.example";
    +    }
    +
    +    @Override
    +    public int patch() {
    +        return 52;
    +    }
    +
    +    @Override
    +    public String patchKey() {
    +        return "patch";
    +    }
    +
    +    @Override
    +    public String preRelease() {
    +        return "beta";
    +    }
    +
    +    @Override
    +    public String preReleaseKey() {
    +        return "prerelease";
    +    }
    +
    +    @Override
    +    public String preReleasePrefix() {
    +        return "-";
    +    }
    +
    +    @Override
    +    public String preReleasePrefixKey() {
    +        return "prerelease.prefix";
    +    }
    +
    +    @Override
    +    public String project() {
    +        return "My Test Project";
    +    }
    +
    +    @Override
    +    public String projectKey() {
    +        return "project";
    +    }
    +
    +    @Override
    +    public String properties() {
    +        return "test.properties";
    +    }
    +
    +    @Override
    +    public String separator() {
    +        return ".";
    +    }
    +
    +    @Override
    +    public String separatorKey() {
    +        return "separator";
    +    }
    +
    +    @Override
    +    public String template() {
    +        return "myversion.mustache";
    +    }
    +
    +    @Override
    +    public String type() {
    +        return "kt";
    +    }
    +}
    diff --git a/test.properties b/test.properties
    new file mode 100644
    index 0000000..98cab4c
    --- /dev/null
    +++ b/test.properties
    @@ -0,0 +1,9 @@
    +build.major=0
    +build.minor=0
    +build.patch=7
    +build.prerelease=vodka
    +build.prerelease.prefix=:
    +build.meta=martini
    +build.meta.prefix=++
    +build.separator=-
    +build.project=James Bond
    
    From 730deed7c0dbbec9fe60be12fa1b0000297a7b1a Mon Sep 17 00:00:00 2001
    From: "Erik C. Thauvin" 
    Date: Wed, 3 Apr 2019 23:34:48 -0700
    Subject: [PATCH 157/316] Added jacoco reports to sonarqube.
    
    ---
     build.gradle | 4 ++++
     1 file changed, 4 insertions(+)
    
    diff --git a/build.gradle b/build.gradle
    index e12cd38..6087c2b 100644
    --- a/build.gradle
    +++ b/build.gradle
    @@ -194,3 +194,7 @@ sonarqube {
             property("sonar.sourceEncoding", "UTF-8")
         }
     }
    +
    +tasks.sonarqube {
    +    dependsOn("jacocoTestReport")
    +}
    
    From 9794fab00f319c322151fd2a61884ad5d827f1fb Mon Sep 17 00:00:00 2001
    From: "Erik C. Thauvin" 
    Date: Fri, 5 Apr 2019 21:59:43 -0700
    Subject: [PATCH 158/316] Updated shell scripts.
    
    ---
     examples/examples.sh |  19 ++++--
     preflightcheck.sh    | 157 +++++++++++++++++++++++++++++++++++++++++++
     releasecheck.sh      |  49 --------------
     updatewrappers.sh    |  50 +++++++++++---
     4 files changed, 212 insertions(+), 63 deletions(-)
     create mode 100644 preflightcheck.sh
     delete mode 100644 releasecheck.sh
    
    diff --git a/examples/examples.sh b/examples/examples.sh
    index 77ffbdf..c8687e2 100755
    --- a/examples/examples.sh
    +++ b/examples/examples.sh
    @@ -1,17 +1,28 @@
     #!/bin/bash
     
     if [ $# -eq 0 ]; then
    -    echo "Usage: $0  [...]"
    +    echo "Usage: $0 "
         exit 1
     fi
     
    +# set the examples directories
    +declare -a examples=(
    +    "java"
    +    "kotlin")
    +
     dir=$(dirname "$(readlink -f "$0")")
     cyan=$(tput setaf 6)
     normal=$(tput sgr0)
     
    -for ex in "java" "kotlin"; do
    +i=0
    +for ex in "${examples[@]}"; do
    +    if [ $i -ne 0 ]
    +    then
    +        read -p "Press [Enter] key to continue..."
    +        clear
    +    fi
         cd "$dir/$ex" || exit 1
    -    echo "> Project: ${cyanlor}${ex}${normal}"
    +    echo "> Project: ${cyan}${ex}${normal}"
         ./gradlew --console=plain --no-build-cache clean "$@" || exit 1
    -    echo
    +    (( i++ ))
     done
    diff --git a/preflightcheck.sh b/preflightcheck.sh
    new file mode 100644
    index 0000000..630196e
    --- /dev/null
    +++ b/preflightcheck.sh
    @@ -0,0 +1,157 @@
    +#!/bin/bash
    +
    +#
    +# Version: 1.0
    +#
    +
    +# set source and test locations
    +src="src/main/java/net/thauvin/erik/semver"
    +test="src/test/java/net/thauvin/erik/semver"
    +# e.g: .java, .kt, etc.
    +ext=".java"
    +java8=true
    +# e.g:  
    +declare -a examples=(
    +    "examples/java run"
    +    "examples/kotlin run runJava")
    +# e.g: empty or javadoc, etc.
    +doc="javadoc pandoc"
    +# e.g. empty or sonarqube
    +sonar="sonarqube"
    +
    +# gradle default command line args
    +opts="--console=plain --no-build-cache --no-daemon"
    +
    +if [ "$java8" = true ]
    +then
    +    export JAVA_HOME="$JAVA8_HOME"
    +    export PATH="$(cygpath "$JAVA_HOME")/bin:$PATH"
    +fi
    +
    +pwd=$PWD
    +red=$(tput setaf 1)
    +cyan=$(tput setaf 6)
    +std=$(tput sgr0)
    +date=$(date +%Y)
    +
    +pause() {
    +  read -p "Press [Enter] key to continue..."
    +  clear
    +}
    +
    +checkCopyright() {
    +    if [ "$(grep -c "$date" "$1")" -eq 0 ]
    +    then
    +        echo -e "   Invalid: ${red}$f${std}"
    +    else
    +        echo -e "   Checked: $1"
    +    fi
    +}
    +
    +runGradle() {
    +    cd "$1" || exit 1
    +    echo -e "> Project: ${cyan}${1}${std} [Gradle]"
    +    shift
    +    ./gradlew $opts clean $@ || exit 1
    +    cd "$pwd"
    +}
    +
    +runKobalt() {
    +    cd "$1" || exit 1
    +    if [ -f kobalt/src/Build.kt ]
    +    then
    +        read -p "Run Kobalt Example? [y/n]: " choice
    +        case $choice in
    +            [Yy] )
    +                clear
    +                echo -e "> Project: ${cyan}$1${std} [Kobalt]"
    +                shift
    +                ./kobaltw clean $@ ;;
    +            * ) ;;
    +        esac
    +    fi
    +    cd "$pwd"
    +}
    +
    +updateWrappers() {
    +    clear
    +    ./updatewrappers.sh
    +    pause
    +}
    +
    +checkDeps() {
    +    clear
    +    echo -e "${cyan}Checking depencencies...${std}"
    +    gradle --console=plain dU || exit 1
    +    pause
    +}
    +
    +gradleCheck() {
    +    clear
    +    echo -e "${cyan}Checking Gradle build....${std}"
    +    gradle $opts clean check $doc $sonar || exit 1
    +    pause
    +}
    +
    +examples() {
    +    clear
    +    echo -e "Running examples..."
    +    for ex in "${examples[@]}"
    +    do
    +        runGradle $ex
    +        runKobalt $ex
    +        read -p "Continue? [y/n]: " choice
    +        clear
    +        case $choice in
    +            [Yy] ) continue ;;
    +            * ) return ;;
    +        esac
    +    done
    +}
    +
    +validateCopyrights() {
    +    clear
    +    echo -e "${cyan}Validating copyrights...${std}"
    +    for f in LICENSE.TXT ${src}/*${ext} ${test}/*${ext}
    +    do
    +        checkCopyright "$f"
    +    done
    +    pause
    +}
    +
    +everything() {
    +    updateWrappers
    +    checkDeps
    +    gradleCheck
    +    examples
    +    validateCopyrights
    +}
    +
    +showMenu() {
    +    echo "    1. Update Wrappers"
    +    echo "    2. Check Dependencies"
    +    echo "    3. Check Gradle Build"
    +    echo "    4. Run Examples"
    +    echo "    5. Validate Copyrights"
    +    echo "    6. Check Everything"
    +}
    +
    +readOptions(){
    +	local choice
    +	read -p "Enter choice [1-6]: " choice
    +	case $choice in
    +		1) updateWrappers ;;
    +		2) checkDeps ;;
    +        3) gradleCheck ;;
    +        4) examples ;;
    +        5) validateCopyrights ;;
    +        6) everything ;;
    +		*) exit 0 ;;
    +	esac
    +}
    +
    +while true
    +do
    +	showMenu
    +	readOptions
    +done
    diff --git a/releasecheck.sh b/releasecheck.sh
    deleted file mode 100644
    index b863595..0000000
    --- a/releasecheck.sh
    +++ /dev/null
    @@ -1,49 +0,0 @@
    -#!/bin/bash
    -
    -pwd=$PWD
    -red=$(tput setaf 1)
    -cyan=$(tput setaf 6)
    -normal=$(tput sgr0)
    -date=$(date +%Y)
    -
    -sonar="sonarqube"
    -doc="pandoc"
    -src="src/main/java/net/thauvin/erik/semver"
    -test="src/test/java/net/thauvin/erik/semver"
    -ext=".java"
    -
    -checkCopyright() {
    -    if [ "$(grep -c "$date" "$1")" -eq 0 ]; then
    -        echo -e Copyright: "${red}$f${normal}"
    -    else
    -        echo -e Checked: "$1"
    -    fi
    -}
    -
    -runGradle() {
    -    echo -e "${cyan}${1}${normal}"
    -    cd "$1" || exit 1
    -    shift
    -    ./gradlew --console=plain --no-build-cache clean $@ || exit 1
    -    cd "$pwd"
    -    read -p "Press enter to continue..."
    -    clear
    -}
    -
    -./updatewrappers.sh
    -read -p "Press enter to continue..."
    -clear
    -
    -gradle --console=plain --no-build-cache clean dU check $doc $sonar || exit 1
    -read -p "Press enter to continue..."
    -clear
    -
    -runGradle examples/java run
    -runGradle examples/kotlin run runJava
    -clear
    -
    -cd "$pwd"
    -
    -for f in LICENSE.TXT ${src}/*${ext} ${test}/*${ext} ; do
    -    checkCopyright "$f"
    -done
    diff --git a/updatewrappers.sh b/updatewrappers.sh
    index 0e597f9..8dff011 100644
    --- a/updatewrappers.sh
    +++ b/updatewrappers.sh
    @@ -1,30 +1,60 @@
     #!/bin/bash
     
    -export JAVA_HOME="$JAVA8_HOME"
    -export PATH="$(cygpath "$JAVA_HOME")/bin:$PATH"
    +#
    +# Version: 1.0
    +#
    +
    +# set the examples directories
    +declare -a dirs=(
    +    "${PWD##*/}"
    +    "examples/java"
    +    "examples/kotlin")
    +java8=true
     
    -declare -a dirs=("${PWD##*/}" "examples/java" "examples/kotlin")
     pwd=$PWD
    +cyan=$(tput setaf 6)
    +green=$(tput setaf 2)
    +red=$(tput setaf 1)
    +std=$(tput sgr0)
     
    +###
    +
    +if [ "$java8" = true ]
    +then
    +    export JAVA_HOME="$JAVA8_HOME"
    +    export PATH="$(cygpath "$JAVA_HOME")/bin:$PATH"
    +fi
    +
    +kVer=$(kobaltw --version | awk '{print substr($2, 1, length($2)-1)}')
     updateWrappers() {
    +    curVer="$(gradle --version | awk '/Gradle/ {print $2}')"
         if [ -d gradle ]; then
    -        gradle -q --console=plain wrapper
    -        echo -e "    $(./gradlew --version | grep Gradle)"
    +        if [ "$curVer" != "$(./gradlew --version | awk '/Gradle/ {print $2}')" ]; then
    +            gradle -q --console=plain wrapper
    +            echo -e "        $(./gradlew --version | awk '/Gradle/') ${green}UPDATED${std}"
    +        else
    +            echo -e "        Gradle $curVer UP-TO-DATE"
    +        fi
         fi
         if [ -d kobalt ]; then
    -        ./kobaltw --update --log 0
    -        echo -e "    Kobalt $(cut -d "=" -f 2 kobalt/wrapper/kobalt-wrapper.properties)"
    +        kw=$(cut -d "=" -f 2 kobalt/wrapper/kobalt-wrapper.properties)
    +        if [ "$kw" = "$kVer" ]
    +        then
    +            echo -e "        Kobalt $kw UP-TO-DATE"
    +        else
    +            echo "kobalt.version=$kVer" > kobalt/wrapper/kobalt-wrapper.properties
    +            echo -e "        Kobalt $kVer ${green}UPDATED${std}"
    +        fi
         fi
     }
     
    -color=$(tput setaf 6)
    -normal=$(tput sgr0)
    +echo -e "Updating wrappers..."
     
     for d in "${dirs[@]}"; do
         if [ -d "$d" ]; then
             cd "$d" || exit 1
         fi
    -    echo -e "${color}${d}${normal}"
    +    echo -e "    ${cyan}${d}${std}"
         updateWrappers
         cd "$pwd"
     done
    
    From 45e99ea6a7b2a05d074e815399b20d35f21d4d39 Mon Sep 17 00:00:00 2001
    From: "Erik C. Thauvin" 
    Date: Fri, 5 Apr 2019 23:50:31 -0700
    Subject: [PATCH 159/316] Added project name.
    
    ---
     examples/java/version.properties   | 2 +-
     examples/kotlin/version.properties | 2 +-
     2 files changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/examples/java/version.properties b/examples/java/version.properties
    index d329bec..ac49981 100644
    --- a/examples/java/version.properties
    +++ b/examples/java/version.properties
    @@ -5,4 +5,4 @@ version.major=2
     version.minor=0
     version.patch=52
     version.prerelease=beta
    -version.project=Example
    +version.project=Java Example
    diff --git a/examples/kotlin/version.properties b/examples/kotlin/version.properties
    index da66130..d097cae 100644
    --- a/examples/kotlin/version.properties
    +++ b/examples/kotlin/version.properties
    @@ -5,4 +5,4 @@ version.major=3
     version.minor=17
     version.patch=52
     version.prerelease=beta
    -version.project=Example
    +version.project=Kotlin Example
    
    From 9cc9c66b29aaca264757a6796d47f0400d0f8a17 Mon Sep 17 00:00:00 2001
    From: "Erik C. Thauvin" 
    Date: Mon, 8 Apr 2019 09:55:34 -0700
    Subject: [PATCH 160/316] Re-enabled SpotBugs.
    
    ---
     build.gradle                                                | 5 ++++-
     src/main/java/net/thauvin/erik/semver/VersionProcessor.java | 3 +++
     2 files changed, 7 insertions(+), 1 deletion(-)
    
    diff --git a/build.gradle b/build.gradle
    index 6087c2b..d939ab7 100644
    --- a/build.gradle
    +++ b/build.gradle
    @@ -39,7 +39,10 @@ repositories {
     
     dependencies {
         implementation 'com.github.spullara.mustache.java:compiler:0.9.6'
    -    // compileOnly 'com.github.spotbugs:spotbugs-annotations:3.1.12'
    +
    +    spotbugsPlugins 'com.h3xstream.findsecbugs:findsecbugs-plugin:1.9.0'
    +    compileOnly 'com.github.spotbugs:spotbugs-annotations:3.1.11'
    +
         testImplementation 'org.testng:testng:6.14.3'
     }
     
    diff --git a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java
    index c8039ac..636e712 100644
    --- a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java
    +++ b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java
    @@ -34,6 +34,7 @@ package net.thauvin.erik.semver;
     import com.github.mustachejava.DefaultMustacheFactory;
     import com.github.mustachejava.Mustache;
     import com.github.mustachejava.MustacheFactory;
    +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
     
     import javax.annotation.processing.*;
     import javax.lang.model.SourceVersion;
    @@ -69,6 +70,7 @@ public class VersionProcessor extends AbstractProcessor {
             log(Diagnostic.Kind.ERROR, (t != null ? t.toString() : s));
         }
     
    +    @SuppressFBWarnings(value = "PATH_TRAVERSAL_IN")
         private VersionInfo findValues(final Version version)
             throws IOException {
             final VersionInfo versionInfo = new VersionInfo(version);
    @@ -207,6 +209,7 @@ public class VersionProcessor extends AbstractProcessor {
             log(Diagnostic.Kind.WARNING, s);
         }
     
    +    @SuppressFBWarnings(value = "PATH_TRAVERSAL_IN")
         private void writeTemplate(final String type,
                                    final VersionInfo versionInfo,
                                    final String template)
    
    From 909b03e86159174447cd710d188e79159a1652d3 Mon Sep 17 00:00:00 2001
    From: "Erik C. Thauvin" 
    Date: Mon, 8 Apr 2019 09:56:24 -0700
    Subject: [PATCH 161/316] Updated scripts.
    
    ---
     examples/examples.sh | 2 ++
     updatewrappers.sh    | 4 ++--
     2 files changed, 4 insertions(+), 2 deletions(-)
    
    diff --git a/examples/examples.sh b/examples/examples.sh
    index c8687e2..99926d3 100755
    --- a/examples/examples.sh
    +++ b/examples/examples.sh
    @@ -1,5 +1,7 @@
     #!/bin/bash
     
    +# Version 1.0
    +
     if [ $# -eq 0 ]; then
         echo "Usage: $0 "
         exit 1
    diff --git a/updatewrappers.sh b/updatewrappers.sh
    index 8dff011..91ba1d6 100644
    --- a/updatewrappers.sh
    +++ b/updatewrappers.sh
    @@ -1,7 +1,7 @@
     #!/bin/bash
     
     #
    -# Version: 1.0
    +# Version: 1.0.1
     #
     
     # set the examples directories
    @@ -42,7 +42,7 @@ updateWrappers() {
             then
                 echo -e "        Kobalt $kw UP-TO-DATE"
             else
    -            echo "kobalt.version=$kVer" > kobalt/wrapper/kobalt-wrapper.properties
    +            echo -e "kobalt.version=$kVer" > kobalt/wrapper/kobalt-wrapper.properties
                 echo -e "        Kobalt $kVer ${green}UPDATED${std}"
             fi
         fi
    
    From 6455662d23ebe37110c1b1e8a66d15156dba901e Mon Sep 17 00:00:00 2001
    From: "Erik C. Thauvin" 
    Date: Sun, 14 Apr 2019 22:25:01 -0700
    Subject: [PATCH 162/316] The version is now calculated internally.
    
    ---
     .idea/inspectionProfiles/Project_Default.xml  | 53 -------------------
     .../inspectionProfiles/profiles_settings.xml  |  7 +++
     README.md                                     | 45 +++++++---------
     examples/java/example.mustache                | 10 +---
     examples/kotlin/example.mustache              |  7 +--
     .../net/thauvin/erik/semver/VersionInfo.java  | 20 ++++---
     .../java/net/thauvin/erik/semver/package.html | 17 +++---
     src/main/resources/semver-kt.mustache         | 38 +------------
     src/main/resources/semver.mustache            | 53 +------------------
     .../thauvin/erik/semver/VersionInfoTest.java  |  8 +++
     10 files changed, 60 insertions(+), 198 deletions(-)
     delete mode 100644 .idea/inspectionProfiles/Project_Default.xml
     create mode 100644 .idea/inspectionProfiles/profiles_settings.xml
    
    diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
    deleted file mode 100644
    index 8ff795e..0000000
    --- a/.idea/inspectionProfiles/Project_Default.xml
    +++ /dev/null
    @@ -1,53 +0,0 @@
    -
    -  
    -    
    -
    \ No newline at end of file
    diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
    new file mode 100644
    index 0000000..dc2dcae
    --- /dev/null
    +++ b/.idea/inspectionProfiles/profiles_settings.xml
    @@ -0,0 +1,7 @@
    +
    +  
    +    
    +
    \ No newline at end of file
    diff --git a/README.md b/README.md
    index 671e572..99162ba 100644
    --- a/README.md
    +++ b/README.md
    @@ -55,7 +55,7 @@ public class A {
     
     ### Default Template
     
    -The [default template](https://github.com/ethauvin/semver/blob/master/src/main/resources/semver.mustache    ) implements the following static fields:
    +The [default template](https://github.com/ethauvin/semver/blob/master/src/main/resources/semver.mustache    ) implements the following static variables:
     
     Field              | Description                      |  Example
     :------------------|:---------------------------------|:-----------------
    @@ -71,13 +71,6 @@ Field              | Description                      |  Example
     `BUILDMETA_PREFIX` | The metadata prefix.             | `+`
     `SEPARATOR`        | The version separator.           | `.`
     
    -And the following methods/functions:
    -
    -Method                   | Description                                               | Example
    -:------------------------|:----------------------------------------------------------|:--------
    -`preReleaseWithPrefix()` | Returns the pre-release with a prefix, `-` by default.    | `-alpha`
    -`buildMetaWithPrefix()`  | Returns the build metadata with a prefix, `+` by default. | `+001`
    -
     ### Custom Template
     
     A very simple custom template might look something like:
    @@ -91,29 +84,27 @@ import java.util.Date;
     public final class {{className}} {
         public final static String PROJECT = "{{project}}";
         public final static Date DATE = new Date({{epoch}}L);
    -    public final static int MAJOR = {{major}};
    -    public final static int MINOR = {{minor}};
    -    public final static int PATCH = {{patch}};
    -    public final static String PRERELEASE = "{{preRelease}}";
    -    public final static String BUILDMETA = "{{buildMeta}}";
    +    public final static String VERSION = "{{semver}}";
     }
     ```
    +
     The mustache variables automatically filled in by the processor are:
     
    -Variable               | Description                 | Type
    -:----------------------|:----------------------------|:--------
    -`{{packageName}}`      | The package name.           | `String`
    -`{{className}}`        | The class name.             | `String`
    -`{{project}}`          | The project name.           | `String`
    -`{{epoch}}`            | The build epoch/unix time.  | `long`
    -`{{major}}`            | The major version.          | `int`
    -`{{minor}}`            | The minor version.          | `int`
    -`{{patch}}`            | The patch version.          | `int`
    -`{{preRelease}}`       | The pre-release version.    | `String`
    -`{{preReleasePrefix}}` | The pre-release prefix.     | `String`
    -`{{buildMeta}}`        | The build metadata version. | `String`
    -`{{buildMetaPrefix}}`  | The metadata prefix.        | `String`
    -`{{separator}}`        | The version separator.      | `String`
    +Variable                      | Description                 | Type
    +:-----------------------------|:----------------------------|:--------
    +`{{packageName}}`             | The package name.           | `String`
    +`{{className}}`               | The class name.             | `String`
    +`{{project}}`                 | The project name.           | `String`
    +`{{epoch}}`                   | The build epoch/unix time.  | `long`
    +`{{major}}`                   | The major version.          | `int`
    +`{{minor}}`                   | The minor version.          | `int`
    +`{{patch}}`                   | The patch version.          | `int`
    +`{{preRelease}}`              | The pre-release version.    | `String`
    +`{{preReleasePrefix}}`        | The pre-release prefix.     | `String`
    +`{{buildMeta}}`               | The build metadata version. | `String`
    +`{{buildMetaPrefix}}`         | The metadata prefix.        | `String`
    +`{{separator}}`               | The version separator.      | `String`
    +`{{semver}}` or `{{version}}` | The full semantic version.  | `String`
     
     Please also look at this [example](https://github.com/ethauvin/mobibot/blob/master/version.mustache) using [`java.time`](https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html)
     
    diff --git a/examples/java/example.mustache b/examples/java/example.mustache
    index a44fd5d..f09599e 100644
    --- a/examples/java/example.mustache
    +++ b/examples/java/example.mustache
    @@ -14,15 +14,7 @@ public final class {{className}} {
         public final static int PATCH = {{patch}};
         public final static String PRERELEASE = "{{preRelease}}";
         public final static String BUILDMETA = "{{buildMeta}}";
    -
    -    /**
    -     * The full semantic version string.
    -     */
    -    public final static String VERSION = Integer.toString(MAJOR) + '.'
    -            + Integer.toString(MINOR) + '.'
    -            + Integer.toString(PATCH)
    -            + ((!PRERELEASE.isEmpty()) ? "-" + PRERELEASE : "")
    -            + ((!BUILDMETA.isEmpty()) ? "+" + BUILDMETA : "");
    +    public final static String VERSION = "{{version}}";
     
         /**
          * Disables the default constructor.
    diff --git a/examples/kotlin/example.mustache b/examples/kotlin/example.mustache
    index 1d3a14a..d839096 100644
    --- a/examples/kotlin/example.mustache
    +++ b/examples/kotlin/example.mustache
    @@ -26,11 +26,6 @@ object {{className}} {
         val PRERELEASE = "{{preRelease}}"
         @JvmField
         val BUILDMETA = "{{buildMeta}}"
    -
    -    /**
    -    * The full semantic version string.
    -    */
         @JvmField
    -    val VERSION = ("$MAJOR.$MINOR.$PATCH" + if (PRERELEASE.isNotEmpty()) "-$PRERELEASE" else ""
    -        + if (BUILDMETA.isNotEmpty()) "+$BUILDMETA" else "")
    +    val VERSION = "{{version}}"
     }
    diff --git a/src/main/java/net/thauvin/erik/semver/VersionInfo.java b/src/main/java/net/thauvin/erik/semver/VersionInfo.java
    index 6f88cf6..0b83a82 100644
    --- a/src/main/java/net/thauvin/erik/semver/VersionInfo.java
    +++ b/src/main/java/net/thauvin/erik/semver/VersionInfo.java
    @@ -122,7 +122,7 @@ public class VersionInfo {
          *
          * @param buildMetaPrefix The meta-data prefix.
          */
    -    public void setBuildMetaPrefix(String buildMetaPrefix) {
    +    public void setBuildMetaPrefix(final String buildMetaPrefix) {
             this.buildMetaPrefix = buildMetaPrefix;
         }
     
    @@ -140,7 +140,7 @@ public class VersionInfo {
          *
          * @param className The new class name.
          */
    -    public void setClassName(String className) {
    +    public void setClassName(final String className) {
             this.className = className;
         }
     
    @@ -203,7 +203,7 @@ public class VersionInfo {
          *
          * @param packageName The new package name.
          */
    -    public void setPackageName(String packageName) {
    +    public void setPackageName(final String packageName) {
             this.packageName = packageName;
         }
     
    @@ -257,7 +257,7 @@ public class VersionInfo {
          *
          * @param preReleasePrefix The new pre-release prefix.
          */
    -    public void setPreReleasePrefix(String preReleasePrefix) {
    +    public void setPreReleasePrefix(final String preReleasePrefix) {
             this.preReleasePrefix = preReleasePrefix;
         }
     
    @@ -279,6 +279,14 @@ public class VersionInfo {
             this.project = project;
         }
     
    +
    +    /**
    +     * Sames as {@link #getVersion()}
    +     */
    +    public String getSemver() {
    +        return getVersion();
    +    }
    +
         /**
          * Returns the version separator.
          *
    @@ -289,11 +297,11 @@ public class VersionInfo {
         }
     
         /**
    -     * Setsthe version separtor.
    +     * Sets the version separator.
          *
          * @param separator The new version separator.
          */
    -    public void setSeparator(String separator) {
    +    public void setSeparator(final String separator) {
             this.separator = separator;
         }
     
    diff --git a/src/main/java/net/thauvin/erik/semver/package.html b/src/main/java/net/thauvin/erik/semver/package.html
    index c63dfc0..1b1b126 100644
    --- a/src/main/java/net/thauvin/erik/semver/package.html
    +++ b/src/main/java/net/thauvin/erik/semver/package.html
    @@ -1,11 +1,12 @@
     
    -
    -
    -    Semantic Version Annotation Processor
    -
    -
    -An annotation processor that automatically generates a GeneratedVersion class containing the semantic version (major, minor, patch, etc.) that is read from a Properties file or defined in the annotation.
    +
    +
    +    Semantic Version Annotation Processor
    +
    +
    +An annotation processor that automatically generates a GeneratedVersion class containing the semantic
    +version (major, minor, patch, etc.) that is read from a Properties file or defined in the annotation.
     
     @since 1.0
    -
    -
    +
    +
    diff --git a/src/main/resources/semver-kt.mustache b/src/main/resources/semver-kt.mustache
    index bc6d68e..4ade969 100644
    --- a/src/main/resources/semver-kt.mustache
    +++ b/src/main/resources/semver-kt.mustache
    @@ -32,42 +32,6 @@ object {{className}} {
         val BUILDMEATA_PREFIX = "{{buildMetaPrefix}}"
         @JvmField
         val SEPARATOR = "{{separator}}"
    -
    -    /**
    -    * The full semantic version string.
    -    */
         @JvmField
    -    val VERSION = "$MAJOR$SEPARATOR$MINOR$SEPARATOR$PATCH" + preReleaseWithPrefix() + buildMetaWithPrefix()
    -
    -    /**
    -     * Returns the pre-release version with prefix.
    -     *
    -     * @param prefix The prefix, defaults to [PRERELEASE_PREFIX].
    -     * @return The pre-release version, if any.
    -     */
    -    @JvmStatic
    -    @JvmOverloads
    -    fun preReleaseWithPrefix(prefix: String = PRERELEASE_PREFIX): String {
    -        return if (PRERELEASE.isNotEmpty()) {
    -            "$prefix$PRERELEASE"
    -        } else {
    -            PRERELEASE
    -        }
    -    }
    -
    -    /**
    -     * Returns the build metadata with prefix.
    -     *
    -     * @param prefix The prefix, defaults to [BUILDMEATA_PREFIX].
    -     * @return The build metadata, if any.
    -     */
    -    @JvmStatic
    -    @JvmOverloads
    -    fun buildMetaWithPrefix(prefix: String = BUILDMEATA_PREFIX): String {
    -        return if (BUILDMETA.isNotEmpty()) {
    -            "$prefix$BUILDMETA"
    -        } else {
    -            BUILDMETA
    -        }
    -    }
    +    val VERSION = "{{version}}"
     }
    diff --git a/src/main/resources/semver.mustache b/src/main/resources/semver.mustache
    index 20c08ce..548d540 100644
    --- a/src/main/resources/semver.mustache
    +++ b/src/main/resources/semver.mustache
    @@ -22,12 +22,7 @@ public final class {{className}} {
         public final static String BUILDMETA = "{{buildMeta}}";
         public final static String BUILDMETA_PREFIX = "{{buildMetaPrefix}}";
         public final static String SEPARATOR = "{{separator}}";
    -
    -    /**
    -     * The full semantic version string.
    -     */
    -    public final static String VERSION = Integer.toString(MAJOR) + SEPARATOR + Integer.toString(MINOR) + SEPARATOR
    -        + Integer.toString(PATCH) + preReleaseWithPrefix() + buildMetaWithPrefix();
    +    public final static String VERSION = "{{version}}";
     
         /**
          * Disables the default constructor.
    @@ -35,50 +30,4 @@ public final class {{className}} {
         private {{className}}() {
             throw new UnsupportedOperationException("Illegal constructor call.");
         }
    -
    -    /**
    -     * Returns the build metadata with {@value #BUILDMETA_PREFIX} prefix.
    -     *
    -     * @return The build metadata, if any.
    -     */
    -    public static String buildMetaWithPrefix() {
    -        return buildMetaWithPrefix(BUILDMETA_PREFIX);
    -    }
    -
    -    /**
    -     * Returns the build metadata.
    -     *
    -     * @param prefix Prefix to prepend.
    -     * @return The build metadata, if any.
    -     */
    -    public static String buildMetaWithPrefix(final String prefix) {
    -        if (BUILDMETA.length() > 0) {
    -            return prefix + BUILDMETA;
    -        } else {
    -            return BUILDMETA;
    -        }
    -    }
    -
    -    /**
    -     * Returns the pre-release version with {@value #PRERELEASE_PREFIX} prefix.
    -     *
    -     * @return The pre-release version, if any.
    -     */
    -    public static String preReleaseWithPrefix() {
    -        return preReleaseWithPrefix(PRERELEASE_PREFIX);
    -    }
    -
    -    /**
    -     * Returns the pre-release version.
    -     *
    -     * @param prefix The prefix to prepend.
    -     * @return The pre-release version, if any.
    -     */
    -    public static String preReleaseWithPrefix(final String prefix) {
    -        if (PRERELEASE.length() > 0) {
    -            return prefix + PRERELEASE;
    -        } else {
    -            return PRERELEASE;
    -        }
    -    }
     }
    diff --git a/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java b/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java
    index 470c122..58e4a20 100644
    --- a/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java
    +++ b/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java
    @@ -90,6 +90,9 @@ public class VersionInfoTest {
             versionInfo.setSeparator("-");
     
             Assert.assertEquals(versionInfo.getVersion(), "3-2-1+001", "getVersion(3-2-1+001)");
    +
    +        Assert.assertEquals(versionInfo.getVersion(), versionInfo.getSemver(),
    +            "getVersion(3-2-1+001) = getSemver(3-2-1+001) ");
         }
     
         @Test
    @@ -122,6 +125,8 @@ public class VersionInfoTest {
     
             Assert.assertEquals(versionInfo.getVersion(), "1.2.3-alpha+001", "getVersion(1.2.3-alpha+001)");
     
    +        Assert.assertEquals(versionInfo.getVersion(), versionInfo.getSemver(), "getVersion() = getSemver()");
    +
             versionInfo.setBuildMetaPrefix("");
     
             Assert.assertEquals(versionInfo.getBuildMetaPrefix(), "", "getBuildMetaPrefix( )");
    @@ -188,6 +193,9 @@ public class VersionInfoTest {
                     + version.buildMeta(),
                 "getVersion(version)");
     
    +        Assert.assertEquals(versionInfo.getVersion(), versionInfo.getSemver(),
    +            "getVersion(version) = getSemver(version)");
    +
             Assert.assertEquals(versionInfo.getProject(), version.project(), "getProject(project)");
     
             Assert.assertEquals(versionInfo.getClassName(), version.className(), "getClassName(className)");
    
    From feb33d7e2d4609dc2708dc1c2d5c9f8cd3c336e0 Mon Sep 17 00:00:00 2001
    From: "Erik C. Thauvin" 
    Date: Mon, 15 Apr 2019 00:19:14 -0700
    Subject: [PATCH 163/316] Added constants tests.
    
    ---
     .../thauvin/erik/semver/ConstantsTest.java    | 69 +++++++++++++++++++
     1 file changed, 69 insertions(+)
     create mode 100644 src/test/java/net/thauvin/erik/semver/ConstantsTest.java
    
    diff --git a/src/test/java/net/thauvin/erik/semver/ConstantsTest.java b/src/test/java/net/thauvin/erik/semver/ConstantsTest.java
    new file mode 100644
    index 0000000..5c3603f
    --- /dev/null
    +++ b/src/test/java/net/thauvin/erik/semver/ConstantsTest.java
    @@ -0,0 +1,69 @@
    +/*
    + * ConstantsTest.java
    + *
    + * Copyright (c) 2016-2019, Erik C. Thauvin (erik@thauvin.net)
    + * All rights reserved.
    + *
    + * Redistribution and use in source and binary forms, with or without
    + * modification, are permitted provided that the following conditions are met:
    + *
    + *   Redistributions of source code must retain the above copyright notice, this
    + *   list of conditions and the following disclaimer.
    + *
    + *   Redistributions in binary form must reproduce the above copyright notice,
    + *   this list of conditions and the following disclaimer in the documentation
    + *   and/or other materials provided with the distribution.
    + *
    + *   Neither the name of this project nor the names of its contributors may be
    + *   used to endorse or promote products derived from this software without
    + *   specific prior written permission.
    + *
    + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
    + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    + */
    +package net.thauvin.erik.semver;
    +
    +import org.testng.Assert;
    +import org.testng.annotations.Test;
    +
    +import java.util.ArrayList;
    +import java.util.List;
    +
    +/**
    + * The ConstantsTest class.
    + *
    + * @author Erik C. Thauvin
    + * @created 2019-04-14
    + * @since 1.0
    + */
    +public class ConstantsTest {
    +    @Test
    +    public void testDefaults() {
    +        Assert.assertEquals(Constants.DEFAULT_MAJOR, 1, "major");
    +        Assert.assertEquals(Constants.DEFAULT_MINOR, 0, "minor");
    +        Assert.assertEquals(Constants.DEFAULT_PATCH, 0, "patch");
    +        Assert.assertEquals(Constants.DEFAULT_PRERELEASE_PREFIX, "-", "preRelease");
    +        Assert.assertEquals(Constants.DEFAULT_BUILDMETA_PREFIX, "+", "buildMeta");
    +        Assert.assertEquals(Constants.DEFAULT_SEPARATOR, ".", "separator");
    +    }
    +
    +    @Test
    +    public void testTemplates() {
    +        final List templates = new ArrayList<>();
    +        templates.add(Constants.DEFAULT_JAVA_TEMPLATE);
    +        templates.add(Constants.DEFAULT_KOTLIN_TEMPLATE);
    +        templates.add(Constants.DEFAULT_TEMPLATE_NAME);
    +
    +        for (final String tp : templates) {
    +            Assert.assertTrue(tp.endsWith(".mustache"), tp);
    +        }
    +    }
    +}
    
    From 5f13ef37b2c560c0391848f85288c0a6e0c47c60 Mon Sep 17 00:00:00 2001
    From: "Erik C. Thauvin" 
    Date: Mon, 15 Apr 2019 03:08:53 -0700
    Subject: [PATCH 164/316] Added line separator to log().
    
    ---
     src/main/java/net/thauvin/erik/semver/VersionProcessor.java | 3 ++-
     1 file changed, 2 insertions(+), 1 deletion(-)
    
    diff --git a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java
    index 636e712..f37c6d4 100644
    --- a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java
    +++ b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java
    @@ -151,7 +151,8 @@ public class VersionProcessor extends AbstractProcessor {
     
         private void log(final Diagnostic.Kind kind, final String s) {
             if (messager != null) {
    -            messager.printMessage(kind, '[' + VersionProcessor.class.getSimpleName() + "] " + s);
    +            messager.printMessage(kind, '[' + VersionProcessor.class.getSimpleName() + "] " + s
    +                + System.lineSeparator());
             }
         }
     
    
    From 528f9c9a541adac4f351a2a6e9fe5cf451bab5d9 Mon Sep 17 00:00:00 2001
    From: "Erik C. Thauvin" 
    Date: Mon, 15 Apr 2019 03:09:46 -0700
    Subject: [PATCH 165/316] Added Kotlin/Gradle install instruction. Added table
     of contents.
    
    ---
     README.md | 66 ++++++++++++++++++++++++++++++++++++++++++-------------
     1 file changed, 51 insertions(+), 15 deletions(-)
    
    diff --git a/README.md b/README.md
    index 99162ba..623df55 100644
    --- a/README.md
    +++ b/README.md
    @@ -7,6 +7,22 @@ An [annotation processor](https://docs.oracle.com/javase/8/docs/api/javax/annota
     
     This processor was inspired by Cédric Beust's [version-processor](https://github.com/cbeust/version-processor) and works well in conjunction with the [__Semantic Version Plugin for Gradle__](https://github.com/ethauvin/semver-gradle).
     
    +## Table of Contents
    +- [Examples](#examples)
    +- [Template](#template)
    +  - [Default Template](#default-template)
    +  - [Custom Template](#custom-template)
    +- [Elements & Properties](#elements---properties)
    +- [Usage with Maven, Gradle, Kotlin and Kobalt](#usage-with-maven--gradle--kotlin-and-kobalt)
    +  - [Maven](#maven)
    +  - [Gradle](#gradle)
    +    - [Class Generation](#class-generation)
    +    - [Class & Source Generation](#class---source-generation)
    +  - [Kotlin](#kotlin)
    +    - [Kotlin & Gradle](#kotlin---gradle)
    +  - [Kobalt](#kobalt)
    +- [Auto-Increment](#auto-increment)
    +  
     ## Examples
     
     * Using annotation elements:
    @@ -161,7 +177,7 @@ example.meta=
     > :warning: `keysPrefix` is a new element staring in `1.1.0` and may break older versions when using custom property keys.  
     > :zap: A quick fix is to include `keysPrefix=""` in the annotation to remove the default `version.` prefix.
     
    -## Usage with Maven, Grail, Kobalt and Kotlin
    +## Usage with Maven, Gradle, Kotlin and Kobalt
     
     ### Maven
     
    @@ -202,19 +218,6 @@ The `GeneratedVersion.java` file will now be located in `src/generated`.
     
     Please look at the [build.gradle](https://github.com/ethauvin/semver/blob/master/examples/java/build.gradle) file in the [Java example](https://github.com/ethauvin/semver/tree/master/examples/java) module directory for a sample.
     
    -### Kobalt
    -
    -To install and run from [Kobalt](https://beust.com/kobalt/), add the following to the `Build.kt` file:
    -
    -```gradle
    -dependencies {
    -    apt("net.thauvin.erik:semver:1.2.0")
    -    compileOnly("net.thauvin.erik:semver:1.2.0")
    -}
    -```
    -
    -Please look at the [Build.kt](https://github.com/ethauvin/semver/blob/master/examples/java/kobalt/src/Build.kt) file in the [Java example](https://github.com/ethauvin/semver/tree/master/examples/java) module directory for a sample.
    -
     ### Kotlin
     
     The annotation processor also supports [Kotlin](https://kotlinlang.org/).
    @@ -230,7 +233,40 @@ open class Main {
     ```
     The [Kotlin default template](https://github.com/ethauvin/semver/blob/master/src/main/resources/semver-kt.mustache) implements the same static fields and functions as the [Java template](#default-template).
     
    -Please look at the [Kotlin example](https://github.com/ethauvin/semver/tree/master/examples/kotlin) project for samples on using Gradle ([build.gradle.kts](https://github.com/ethauvin/semver/blob/master/examples/kotlin/build.gradle.kts)) and Kobalt ([Build.kt](https://github.com/ethauvin/semver/blob/master/examples/java/kobalt/src/Build.kt)).
    +#### Kotlin & Gradle
    +
    +To install and run from [Gradle](https://gradle.org/), add the following to the `build.gradle.kts` file:
    +
    +```kotlin
    +var semverProcessor = "net.thauvin.erik:semver:1.2.0"
    +
    +dependencies {
    +    kapt(semverProcessor)
    +    compileOnly(semverProcessor)
    +}
    +```
    +As of [Kotlin 1.2.30](https://blog.jetbrains.com/kotlin/2019/04/kotlin-1-3-30-released/#more-6991), when using `kapt` you must include the following to the [gradle.properties](https://github.com/ethauvin/semver/blob/master/examples/kotlin/gralde.properties) file:
    +
    +```ini
    +kapt.use.worker.api=true
    +```
    +
    +This option will likely be enabled by default in the future.
    +
    +Please look at the [Kotlin example](https://github.com/ethauvin/semver/tree/master/examples/kotlin) project for a [build.gradle.kts](https://github.com/ethauvin/semver/blob/master/examples/kotlin/build.gradle.kts) sample.
    +
    +### Kobalt
    +
    +To install and run from [Kobalt](https://beust.com/kobalt/), add the following to the `Build.kt` file:
    +
    +```gradle
    +dependencies {
    +    apt("net.thauvin.erik:semver:1.2.0")
    +    compileOnly("net.thauvin.erik:semver:1.2.0")
    +}
    +```
    +
    +Please look at the [Build.kt](https://github.com/ethauvin/semver/blob/master/examples/java/kobalt/src/Build.kt) file in the [Java example](https://github.com/ethauvin/semver/tree/master/examples/java) module directory for a sample.
     
     
     ## Auto-Increment
    
    From 59c28f1b50169516f53b621a9f12dc4021ae68a3 Mon Sep 17 00:00:00 2001
    From: "Erik C. Thauvin" 
    Date: Mon, 15 Apr 2019 03:13:34 -0700
    Subject: [PATCH 166/316] Removed invalid link.
    
    ---
     README.md | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/README.md b/README.md
    index 623df55..56fbb72 100644
    --- a/README.md
    +++ b/README.md
    @@ -245,7 +245,7 @@ dependencies {
         compileOnly(semverProcessor)
     }
     ```
    -As of [Kotlin 1.2.30](https://blog.jetbrains.com/kotlin/2019/04/kotlin-1-3-30-released/#more-6991), when using `kapt` you must include the following to the [gradle.properties](https://github.com/ethauvin/semver/blob/master/examples/kotlin/gralde.properties) file:
    +As of [Kotlin 1.2.30](https://blog.jetbrains.com/kotlin/2019/04/kotlin-1-3-30-released/#more-6991), when using `kapt` you must include the following to the `gradle.properties` file:
     
     ```ini
     kapt.use.worker.api=true
    
    From fbdd6661ead04a684337032f11d9f310204355d1 Mon Sep 17 00:00:00 2001
    From: "Erik C. Thauvin" 
    Date: Mon, 15 Apr 2019 21:24:20 -0700
    Subject: [PATCH 167/316] Cleanup/
    
    ---
     examples/java/kobalt/src/Build.kt             | 34 ++-----------------
     .../kobalt/wrapper/kobalt-wrapper.properties  |  2 +-
     2 files changed, 3 insertions(+), 33 deletions(-)
    
    diff --git a/examples/java/kobalt/src/Build.kt b/examples/java/kobalt/src/Build.kt
    index 911a863..1bfdcf6 100644
    --- a/examples/java/kobalt/src/Build.kt
    +++ b/examples/java/kobalt/src/Build.kt
    @@ -2,10 +2,7 @@ import com.beust.kobalt.*
     import com.beust.kobalt.plugin.application.*
     import com.beust.kobalt.plugin.apt.*
     import com.beust.kobalt.plugin.java.javaCompiler
    -import com.beust.kobalt.plugin.publish.*
     import com.beust.kobalt.plugin.packaging.*
    -import java.io.FileInputStream
    -import java.util.*
     
     // ./kobaltw run
     
    @@ -13,36 +10,13 @@ val bs = buildScript {
         repos(localMaven())
     }
     
    -fun StringBuilder.prepend(s: String): StringBuilder {
    -    if (this.isNotEmpty()) {
    -        this.insert(0, s)
    -    }
    -    return this
    -}
    -
     val example = project {
     
         name = "example"
    -
    -    fun versionFor(): String {
    -        val propsFile = "version.properties"
    -        val majorKey = "version.major"
    -        val minorKey = "version.minor"
    -        val patchKey = "version.patch"
    -        val metaKey = "version.buildmeta"
    -        val preKey = "version.prerelease"
    -
    -        val p = Properties().apply { FileInputStream(propsFile).use { fis -> load(fis) } }
    -
    -        return (p.getProperty(majorKey, "1") + "." + p.getProperty(minorKey, "0") + "." + p.getProperty(patchKey, "0")
    -                + StringBuilder(p.getProperty(preKey, "")).prepend("-")
    -                + StringBuilder(p.getProperty(metaKey, "")).prepend("+"))
    -    }
    -
    -    version = versionFor()
    +    version = "1.0"
     
         val mainClassName = "com.example.Example"
    -    val processorJar = "net.thauvin.erik:semver:1.0.1"
    +    val processorJar = "net.thauvin.erik:semver:1.2.0"
     
         dependencies {
             apt(processorJar)
    @@ -53,10 +27,6 @@ val example = project {
             //outputDir = "../src/generated/java/"
         }
     
    -    install {
    -        target = "deploy"
    -    }
    -
         javaCompiler {
             args("-source", "1.8", "-target", "1.8")
         }
    diff --git a/examples/java/kobalt/wrapper/kobalt-wrapper.properties b/examples/java/kobalt/wrapper/kobalt-wrapper.properties
    index 0ca8045..0d568d3 100644
    --- a/examples/java/kobalt/wrapper/kobalt-wrapper.properties
    +++ b/examples/java/kobalt/wrapper/kobalt-wrapper.properties
    @@ -1 +1 @@
    -kobalt.version=1.0.122
    \ No newline at end of file
    +kobalt.version=1.0.122
    
    From b175ad4f4cdd04defe847d45206a73667f7381a1 Mon Sep 17 00:00:00 2001
    From: "Erik C. Thauvin" 
    Date: Mon, 15 Apr 2019 21:27:18 -0700
    Subject: [PATCH 168/316] Added table of contents. Added Maven example. Added
     Kotlin's kapt limitations, etc.
    
    ---
     README.md        |  22 +++++++----
     docs/README.html | 101 +++++++++++++++++++++++++++--------------------
     2 files changed, 73 insertions(+), 50 deletions(-)
    
    diff --git a/README.md b/README.md
    index 56fbb72..ea64eab 100644
    --- a/README.md
    +++ b/README.md
    @@ -191,11 +191,17 @@ To install and run from [Maven](https://maven.apache.org/), configure an artifac
     
     ```
     
    +Please look at [pom.xml](https://github.com/ethauvin/semver/blob/master/examples/java/pom.xml) in the [Java example](https://github.com/ethauvin/semver/tree/master/examples/java) directory for a sample:
    +
    +```bash
    +mvn compile exec:java
    +```
    +
     ### Gradle
     
     #### Class Generation
     
    -To install and run from [Gradle](https://gradle.org/), add the following to the `build.gradle` file:
    +To install and run from [Gradle](https://gradle.org/), add the following to `build.gradle`:
     
     ```gradle
     dependencies {
    @@ -208,7 +214,7 @@ The `GeneratedVersion` class will be automatically created in the `build/generat
     
     #### Class & Source Generation
     
    -In order to also incorporate the generated source code into the `source tree`, add the following to the very top of the `build.gradle` file:
    +In order to also incorporate the generated source code into the `source tree`, add the following to the very top of `build.gradle`:
     
     ```gradle
     compileJava.options.annotationProcessorGeneratedSourcesDirectory = file("${projectDir}/src/generated/java")
    @@ -216,7 +222,7 @@ compileJava.options.annotationProcessorGeneratedSourcesDirectory = file("${proje
     
     The `GeneratedVersion.java` file will now be located in `src/generated`.
     
    -Please look at the [build.gradle](https://github.com/ethauvin/semver/blob/master/examples/java/build.gradle) file in the [Java example](https://github.com/ethauvin/semver/tree/master/examples/java) module directory for a sample.
    +Please look at [build.gradle](https://github.com/ethauvin/semver/blob/master/examples/java/build.gradle) in the [Java example](https://github.com/ethauvin/semver/tree/master/examples/java) directory for a sample.
     
     ### Kotlin
     
    @@ -235,7 +241,7 @@ The [Kotlin default template](https://github.com/ethauvin/semver/blob/master/src
     
     #### Kotlin & Gradle
     
    -To install and run from [Gradle](https://gradle.org/), add the following to the `build.gradle.kts` file:
    +To install and run from [Gradle](https://gradle.org/), add the following to `build.gradle.kts`:
     
     ```kotlin
     var semverProcessor = "net.thauvin.erik:semver:1.2.0"
    @@ -245,19 +251,19 @@ dependencies {
         compileOnly(semverProcessor)
     }
     ```
    -As of [Kotlin 1.2.30](https://blog.jetbrains.com/kotlin/2019/04/kotlin-1-3-30-released/#more-6991), when using `kapt` you must include the following to the `gradle.properties` file:
    +As of [Kotlin 1.2.30](https://blog.jetbrains.com/kotlin/2019/04/kotlin-1-3-30-released/#more-6991), when using `kapt` you must include the following in `gradle.properties`:
     
     ```ini
     kapt.use.worker.api=true
     ```
     
    -This option will likely be enabled by default in the future.
    +This option will likely be enabled by default in the future, but is currently not working under Java 10/11 see [KT-26203](https://youtrack.jetbrains.net/issue/KT-26203). 
     
     Please look at the [Kotlin example](https://github.com/ethauvin/semver/tree/master/examples/kotlin) project for a [build.gradle.kts](https://github.com/ethauvin/semver/blob/master/examples/kotlin/build.gradle.kts) sample.
     
     ### Kobalt
     
    -To install and run from [Kobalt](https://beust.com/kobalt/), add the following to the `Build.kt` file:
    +To install and run from [Kobalt](https://beust.com/kobalt/), add the following to `Build.kt`:
     
     ```gradle
     dependencies {
    @@ -266,7 +272,7 @@ dependencies {
     }
     ```
     
    -Please look at the [Build.kt](https://github.com/ethauvin/semver/blob/master/examples/java/kobalt/src/Build.kt) file in the [Java example](https://github.com/ethauvin/semver/tree/master/examples/java) module directory for a sample.
    +Please look at [Build.kt](https://github.com/ethauvin/semver/blob/master/examples/java/kobalt/src/Build.kt) in the [Java example](https://github.com/ethauvin/semver/tree/master/examples/java) directory for a sample.
     
     
     ## Auto-Increment
    diff --git a/docs/README.html b/docs/README.html
    index 3215637..0fa5011 100644
    --- a/docs/README.html
    +++ b/docs/README.html
    @@ -85,6 +85,31 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni
     Known Vulnerabilities Quality Gate Status Build Status Build status CircleCI

    An annotation processor that automatically generates a GeneratedVersion class based on a Mustache template and containing the semantic version (major, minor, patch, etc.) that is read from a Properties file or defined in the annotation.

    This processor was inspired by Cédric Beust's version-processor and works well in conjunction with the Semantic Version Plugin for Gradle.

    +

    Table of Contents

    +

    Examples

    • Using annotation elements:
    • @@ -116,7 +141,7 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni public class A { // ...

    Default Template

    -

    The default template implements the following static fields:

    +

    The default template implements the following static variables:

    @@ -183,28 +208,6 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni
    -

    And the following methods/functions:

    - - - - - - - - - - - - - - - - - - - - -
    MethodDescriptionExample
    preReleaseWithPrefix()Returns the pre-release with a prefix, - by default.-alpha
    buildMetaWithPrefix()Returns the build metadata with a prefix, + by default.+001

    Custom Template

    A very simple custom template might look something like:

    + public final static String VERSION = "{{semver}}"; +}

    The mustache variables automatically filled in by the processor are:

    @@ -291,6 +290,11 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni + + + + +
    The version separator. String
    {{semver}} or {{version}}The full semantic version.String

    Please also look at this example using java.time

    @@ -423,7 +427,7 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni

    ⚠️ keysPrefix is a new element staring in 1.1.0 and may break older versions when using custom property keys.
    A quick fix is to include keysPrefix="" in the annotation to remove the default version. prefix.

    -

    Usage with Maven, Grail, Kobalt and Kotlin

    +

    Usage with Maven, Gradle, Kotlin and Kobalt

    Maven

    To install and run from Maven, configure an artifact as follows:

    <dependency>
    @@ -431,9 +435,11 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni
         <artifactId>semver</artifactId>
         <version>1.2.0</version>
     </dependency>
    +

    Please look at pom.xml in the Java example directory for a sample:

    +

    Gradle

    Class Generation

    -

    To install and run from Gradle, add the following to the build.gradle file:

    +

    To install and run from Gradle, add the following to build.gradle:

    dependencies {
         annotationProcessor 'net.thauvin.erik:semver:1.2.0'
         compileOnly 'net.thauvin.erik:semver:1.2.0'
    @@ -441,19 +447,11 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni
     

    The GeneratedVersion class will be automatically created in the build/generated directory upon compiling.

    Class & Source Generation

    -

    In order to also incorporate the generated source code into the source tree, add the following to the very top of the build.gradle file:

    +

    In order to also incorporate the generated source code into the source tree, add the following to the very top of build.gradle:

    compileJava.options.annotationProcessorGeneratedSourcesDirectory = file("${projectDir}/src/generated/java")
     

    The GeneratedVersion.java file will now be located in src/generated.

    -

    Please look at the build.gradle file in the Java example module directory for a sample.

    -

    Kobalt

    -

    To install and run from Kobalt, add the following to the Build.kt file:

    -
    dependencies {
    -    apt("net.thauvin.erik:semver:1.2.0")
    -    compileOnly("net.thauvin.erik:semver:1.2.0")
    -}
    -
    -

    Please look at the Build.kt file in the Java example module directory for a sample.

    +

    Please look at build.gradle in the Java example directory for a sample.

    Kotlin

    The annotation processor also supports Kotlin.

    To generate a Kotlin version file, simply specify the type as follows:

    @@ -463,7 +461,26 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni open class Main { // ...

    The Kotlin default template implements the same static fields and functions as the Java template.

    -

    Please look at the Kotlin example project for samples on using Gradle (build.gradle.kts) and Kobalt (Build.kt).

    +

    Kotlin & Gradle

    +

    To install and run from Gradle, add the following to build.gradle.kts:

    + +

    As of Kotlin 1.2.30, when using kapt you must include the following in gradle.properties:

    + +

    This option will likely be enabled by default in the future, but is currently not working under Java 10/11 see KT-26203.

    +

    Please look at the Kotlin example project for a build.gradle.kts sample.

    +

    Kobalt

    +

    To install and run from Kobalt, add the following to Build.kt:

    +
    dependencies {
    +    apt("net.thauvin.erik:semver:1.2.0")
    +    compileOnly("net.thauvin.erik:semver:1.2.0")
    +}
    +
    +

    Please look at Build.kt in the Java example directory for a sample.

    Auto-Increment

    Incrementing the version is best left to your favorite build system. For a solution using Gradle, please have a look at the Semver Version Plugin for Gradle.

    There are also full examples in both Java and Kotlin showing how to use both the plugin and annotation processor concurrently.

    From 927919b18b8640e8f614ecfc909a20afec3ed56d Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 15 Apr 2019 21:27:51 -0700 Subject: [PATCH 169/316] Added maven project. --- examples/java/.gitignore | 19 ++++++------ examples/java/pom.xml | 66 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 9 deletions(-) create mode 100644 examples/java/pom.xml diff --git a/examples/java/.gitignore b/examples/java/.gitignore index 51e51c5..6e9dd4c 100644 --- a/examples/java/.gitignore +++ b/examples/java/.gitignore @@ -1,16 +1,16 @@ -**/.idea/dictionaries -**/.idea/gradle.xml -**/.idea/libraries -**/.idea/tasks.xml -**/.idea/workspace.xml -*.iws -.DS_Store .classpath +.DS_Store .gradle .kobalt .nb-gradle .project .settings +*.iws +**/.idea/dictionaries +**/.idea/gradle.xml +**/.idea/libraries +**/.idea/tasks.xml +**/.idea/workspace.xml /bin /build /deploy @@ -23,6 +23,7 @@ /proguard-project.txt /project.properties /test-output -Thumbs.db ehthumbs.db -kobaltBuild \ No newline at end of file +kobaltBuild +target +Thumbs.db diff --git a/examples/java/pom.xml b/examples/java/pom.xml new file mode 100644 index 0000000..38776a4 --- /dev/null +++ b/examples/java/pom.xml @@ -0,0 +1,66 @@ + + + 4.0.0 + + com.example + Example + 1.0.0 + Example + + + 1.2.0 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + 1.8 + 1.8 + UTF-8 + src/generated/java + + + net.thauvin.erik + semver + ${semver} + + + + + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + + my-execution + package + + java + + + + + com.example.Example + + + + + + + + + net.thauvin.erik + semver + ${semver} + compile + + + From 73f3455dc6ab06f91a97bd4ac0af880feedc9ecb Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 15 Apr 2019 21:28:05 -0700 Subject: [PATCH 170/316] Version 1.1 --- preflightcheck.sh | 91 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 72 insertions(+), 19 deletions(-) diff --git a/preflightcheck.sh b/preflightcheck.sh index 630196e..dd16833 100644 --- a/preflightcheck.sh +++ b/preflightcheck.sh @@ -1,7 +1,7 @@ #!/bin/bash # -# Version: 1.0 +# Version: 1.1 # # set source and test locations @@ -22,6 +22,8 @@ sonar="sonarqube" # gradle default command line args opts="--console=plain --no-build-cache --no-daemon" +### + if [ "$java8" = true ] then export JAVA_HOME="$JAVA8_HOME" @@ -36,7 +38,6 @@ date=$(date +%Y) pause() { read -p "Press [Enter] key to continue..." - clear } checkCopyright() { @@ -50,9 +51,11 @@ checkCopyright() { runGradle() { cd "$1" || exit 1 + clear echo -e "> Project: ${cyan}${1}${std} [Gradle]" shift ./gradlew $opts clean $@ || exit 1 + pause cd "$pwd" } @@ -60,15 +63,23 @@ runKobalt() { cd "$1" || exit 1 if [ -f kobalt/src/Build.kt ] then - read -p "Run Kobalt Example? [y/n]: " choice - case $choice in - [Yy] ) - clear - echo -e "> Project: ${cyan}$1${std} [Kobalt]" - shift - ./kobaltw clean $@ ;; - * ) ;; - esac + clear + echo -e "> Project: ${cyan}${1}${std} [Kobalt]" + shift + ./kobaltw clean $@ || exit 1 + pause + fi + cd "$pwd" +} + +runMaven() { + cd "$1" || exit 1 + if [ -f pom.xml ] + then + clear + echo -e "> Project: ${cyan}${1}${std} [Maven]" + mvn clean compile exec:java || exit 1 + pause fi cd "$pwd" } @@ -83,7 +94,23 @@ checkDeps() { clear echo -e "${cyan}Checking depencencies...${std}" gradle --console=plain dU || exit 1 - pause + read -p "Check Examples depencencies? [y/n] " cont + clear + case $cont in + [Yy] ) for ex in "${examples[@]}" + do + runGradle $(echo "$ex" | cut -d " " -f 1) dU + runKobalt $(echo "$ex" | cut -d " " -f 1) checkVersions + runMaven $(echo "$ex" | cut -d " " -f 1) versions:display-dependency-updates + read -p "Continue? [y/n]: " cont + clear + case $cont in + [Yy] ) continue ;; + * ) return ;; + esac + done ;; + * ) return ;; + esac } gradleCheck() { @@ -93,22 +120,46 @@ gradleCheck() { pause } -examples() { - clear - echo -e "Running examples..." +runExamples() { for ex in "${examples[@]}" do runGradle $ex runKobalt $ex - read -p "Continue? [y/n]: " choice + runMaven $ex + read -p "Continue? [y/n]: " cont clear - case $choice in + case $cont in [Yy] ) continue ;; * ) return ;; esac done } +examplesMenu() { + clear + echo -e "${cyan}Examples${std}" + for ex in "${!examples[@]}" + do + printf ' %d. %s\n' $(($ex + 1)) $(echo "${examples[ex]}" | cut -d " " -f 1) + done + echo " $((${#examples[@]} + 1)). Run All Examples" + read -p "Enter choice [1-${#examples[@]}]: " choice + clear + case $choice in + [0-9] ) if [ "$choice" -gt "${#examples[@]}" ] + then + runExamples + examplesMenu + else + runGradle ${examples[$(($choice - 1))]} + runKobalt ${examples[$(($choice - 1))]} + runMaven ${examples[$(($choice - 1))]} + examplesMenu + fi ;; + * ) return ;; + esac +} + validateCopyrights() { clear echo -e "${cyan}Validating copyrights...${std}" @@ -123,11 +174,13 @@ everything() { updateWrappers checkDeps gradleCheck - examples + runExamples validateCopyrights } showMenu() { + clear + echo "${cyan}Preflight Check${std}" echo " 1. Update Wrappers" echo " 2. Check Dependencies" echo " 3. Check Gradle Build" @@ -143,7 +196,7 @@ readOptions(){ 1) updateWrappers ;; 2) checkDeps ;; 3) gradleCheck ;; - 4) examples ;; + 4) examplesMenu ;; 5) validateCopyrights ;; 6) everything ;; *) exit 0 ;; From 27c622c7ba41ebea0c7047e3de2883942d81a6e6 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 15 Apr 2019 23:34:55 -0700 Subject: [PATCH 171/316] Version 1.1.1 --- preflightcheck.sh | 62 ++++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/preflightcheck.sh b/preflightcheck.sh index dd16833..8875a7f 100644 --- a/preflightcheck.sh +++ b/preflightcheck.sh @@ -1,7 +1,7 @@ #!/bin/bash # -# Version: 1.1 +# Version: 1.1.1 # # set source and test locations @@ -15,12 +15,13 @@ declare -a examples=( "examples/java run" "examples/kotlin run runJava") # e.g: empty or javadoc, etc. -doc="javadoc pandoc" +gradle_doc="javadoc pandoc" # e.g. empty or sonarqube -sonar="sonarqube" - -# gradle default command line args -opts="--console=plain --no-build-cache --no-daemon" +gradle_sonar="sonarqube" +# gradle options for examples +gradle_opts="--console=plain --no-build-cache --no-daemon" +# maven arguments for examples +maven_args="compile exec:java" ### @@ -52,9 +53,10 @@ checkCopyright() { runGradle() { cd "$1" || exit 1 clear + reset echo -e "> Project: ${cyan}${1}${std} [Gradle]" shift - ./gradlew $opts clean $@ || exit 1 + ./gradlew $@ || exit 1 pause cd "$pwd" } @@ -64,9 +66,10 @@ runKobalt() { if [ -f kobalt/src/Build.kt ] then clear + reset echo -e "> Project: ${cyan}${1}${std} [Kobalt]" shift - ./kobaltw clean $@ || exit 1 + ./kobaltw $@ || exit 1 pause fi cd "$pwd" @@ -77,8 +80,10 @@ runMaven() { if [ -f pom.xml ] then clear + reset echo -e "> Project: ${cyan}${1}${std} [Maven]" - mvn clean compile exec:java || exit 1 + shift + mvn $@ || exit 1 pause fi cd "$pwd" @@ -97,41 +102,38 @@ checkDeps() { read -p "Check Examples depencencies? [y/n] " cont clear case $cont in - [Yy] ) for ex in "${examples[@]}" - do - runGradle $(echo "$ex" | cut -d " " -f 1) dU - runKobalt $(echo "$ex" | cut -d " " -f 1) checkVersions - runMaven $(echo "$ex" | cut -d " " -f 1) versions:display-dependency-updates + * ) for ex in "${!examples[@]}" + do + runGradle $(echo "${examples[ex]}" | cut -d " " -f 1) dU + runKobalt $(echo "${examples[ex]}" | cut -d " " -f 1) checkVersions + runMaven $(echo "${examples[ex]}" | cut -d " " -f 1) versions:display-dependency-updates + if [ "$ex" -eq "${#examples}"] + then read -p "Continue? [y/n]: " cont clear case $cont in - [Yy] ) continue ;; - * ) return ;; + * ) continue ;; + [Nn] ) return ;; esac - done ;; - * ) return ;; + fi + done ;; + [Nn] ) return ;; esac } gradleCheck() { clear echo -e "${cyan}Checking Gradle build....${std}" - gradle $opts clean check $doc $sonar || exit 1 + gradle $gradle_opts clean check $gradle_doc $gradle_sonar || exit 1 pause } runExamples() { - for ex in "${examples[@]}" + for ex in "${!examples[@]}" do - runGradle $ex - runKobalt $ex - runMaven $ex - read -p "Continue? [y/n]: " cont - clear - case $cont in - [Yy] ) continue ;; - * ) return ;; - esac + runGradle ${examples[ex]} clean $gradle_opts + runKobalt ${examples[ex]} clean + runMaven $(echo "${examples[ex]}" | cut -d " " -f 1) clean $maven_args done } @@ -153,7 +155,7 @@ examplesMenu() { else runGradle ${examples[$(($choice - 1))]} runKobalt ${examples[$(($choice - 1))]} - runMaven ${examples[$(($choice - 1))]} + runMaven $(echo "${examples[$(($choice - 1))]}" | cut -d " " -f 1) $maven_args examplesMenu fi ;; * ) return ;; From eba4b97704b17dd0d2e5308213e4d8142c392e85 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 15 Apr 2019 23:35:13 -0700 Subject: [PATCH 172/316] Cleanup. --- src/main/java/net/thauvin/erik/semver/Constants.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/net/thauvin/erik/semver/Constants.java b/src/main/java/net/thauvin/erik/semver/Constants.java index 40a43b2..35e24c0 100644 --- a/src/main/java/net/thauvin/erik/semver/Constants.java +++ b/src/main/java/net/thauvin/erik/semver/Constants.java @@ -38,6 +38,7 @@ package net.thauvin.erik.semver; * @created 2016-01-13 * @since 1.0 */ +@SuppressWarnings("WeakerAccess") public final class Constants { /** * The default metadata prefix. From 5f431e0725b79c0dfde40ab2fded77019c0151ae Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Tue, 16 Apr 2019 11:20:33 -0700 Subject: [PATCH 173/316] Added checkstyle. --- config/checkstyle/checkstyle.xml | 258 ++++++++++++++++++ .../net/thauvin/erik/semver/Constants.java | 1 + .../java/net/thauvin/erik/semver/Version.java | 121 ++++++++ .../net/thauvin/erik/semver/VersionInfo.java | 17 +- .../thauvin/erik/semver/VersionProcessor.java | 15 +- .../thauvin/erik/semver/ConstantsTest.java | 1 + .../thauvin/erik/semver/VersionInfoTest.java | 1 + .../erik/semver/VersionProcessorTest.java | 1 + .../net/thauvin/erik/semver/VersionTest.java | 1 + 9 files changed, 404 insertions(+), 12 deletions(-) create mode 100644 config/checkstyle/checkstyle.xml diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml new file mode 100644 index 0000000..ac8ef90 --- /dev/null +++ b/config/checkstyle/checkstyle.xml @@ -0,0 +1,258 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/net/thauvin/erik/semver/Constants.java b/src/main/java/net/thauvin/erik/semver/Constants.java index 35e24c0..affc701 100644 --- a/src/main/java/net/thauvin/erik/semver/Constants.java +++ b/src/main/java/net/thauvin/erik/semver/Constants.java @@ -29,6 +29,7 @@ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + package net.thauvin.erik.semver; /** diff --git a/src/main/java/net/thauvin/erik/semver/Version.java b/src/main/java/net/thauvin/erik/semver/Version.java index 8550d42..90d4835 100644 --- a/src/main/java/net/thauvin/erik/semver/Version.java +++ b/src/main/java/net/thauvin/erik/semver/Version.java @@ -29,6 +29,7 @@ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + package net.thauvin.erik.semver; import java.lang.annotation.ElementType; @@ -46,51 +47,171 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.SOURCE) @Target(ElementType.TYPE) public @interface Version { + /** + * Returns the build metadata version. + * + * @return The build metadata version. + */ String buildMeta() default Constants.EMPTY; + /** + * Returns the build metadata key. + * + * @return The build metadata key. + */ String buildMetaKey() default Constants.KEY_VERSION_BUILDMETA; + /** + * Returns the build metadata prefix. + * + * @return The build metadata prefix. + */ String buildMetaPrefix() default Constants.DEFAULT_BUILDMETA_PREFIX; + /** + * Returns the build metadata prefix key. + * + * @return The build metadata prefix key. + */ String buildMetaPrefixKey() default Constants.KEY_VERSION_BUILDMETA_PREFIX; + /** + * Returns the class name. + * + * @return The class name. + */ String className() default Constants.DEFAULT_CLASS_NAME; + /** + * Returns the keys prefix. + * + * @return The keys prefix. + */ String keysPrefix() default Constants.DEFAULT_KEYS_PREFIX; + /** + * Returns the major version. + * + * @return The major version. + */ int major() default Constants.DEFAULT_MAJOR; + /** + * Returns the major key. + * + * @return The major key. + */ String majorKey() default Constants.KEY_VERSION_MAJOR; + /** + * Returns the minor version. + * + * @return The build minor version. + */ int minor() default Constants.DEFAULT_MINOR; + /** + * Returns the minor key. + * + * @return The minor key. + */ String minorKey() default Constants.KEY_VERSION_MINOR; + /** + * Returns the package name. + * + * @return The package name . + */ String packageName() default Constants.EMPTY; + /** + * Returns the patch version. + * + * @return The patch version. + */ int patch() default Constants.DEFAULT_PATCH; + /** + * Returns the patch key. + * + * @return The patch key. + */ String patchKey() default Constants.KEY_VERSION_PATCH; + /** + * Returns the pre-release version. + * + * @return The pre-release version. + */ String preRelease() default Constants.EMPTY; + /** + * Returns the pre-release key. + * + * @return The pre-release key. + */ String preReleaseKey() default Constants.KEY_VERSION_PRERELEASE; + /** + * Returns the pre-release prefix. + * + * @return The pre-release prefix. + */ String preReleasePrefix() default Constants.DEFAULT_PRERELEASE_PREFIX; + /** + * Returns the pre-release prefix key. + * + * @return The pre-release prefix key. + */ String preReleasePrefixKey() default Constants.KEY_VERSION_PRERELEASE_PREFIX; + /** + * Returns the project name. + * + * @return The project name. + */ String project() default Constants.EMPTY; + /** + * Returns the project key. + * + * @return The project. + */ String projectKey() default Constants.KEY_VERSION_PROJECT; + /** + * Returns the properties file name. + * + * @return The properties file name. + */ String properties() default Constants.EMPTY; + /** + * Returns the version separator. + * + * @return The separator. + */ String separator() default Constants.DEFAULT_SEPARATOR; + /** + * Returns the version separator key. + * + * @return The separator key. + */ String separatorKey() default Constants.KEY_VERSION_SEPARATOR; + /** + * Returns the template name. + * + * @return The template. + */ String template() default Constants.DEFAULT_JAVA_TEMPLATE; + /** + * Returns the template type. + * + * @return The type. + */ String type() default Constants.DEFAULT_JAVA_TYPE; } diff --git a/src/main/java/net/thauvin/erik/semver/VersionInfo.java b/src/main/java/net/thauvin/erik/semver/VersionInfo.java index 0b83a82..c7da94e 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionInfo.java +++ b/src/main/java/net/thauvin/erik/semver/VersionInfo.java @@ -29,6 +29,7 @@ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + package net.thauvin.erik.semver; /** @@ -281,7 +282,7 @@ public class VersionInfo { /** - * Sames as {@link #getVersion()} + * Sames as {@link #getVersion()}. */ public String getSemver() { return getVersion(); @@ -307,11 +308,15 @@ public class VersionInfo { /** * Returns the full version string. - *

    - * Formatted as: - *

    [MAJOR][SEPARATOR][MINOR][SEPARATOR][PATCH][[PRERELEASE-PREFIX][PRERELEASE]][[BUILDMETA-PREFIX][BUILDMETA]]
    - *

    - * For example: + * + *

    Formatted as: + *

    + * + * [MAJOR][SEPARATOR][MINOR][SEPARATOR][PATCH][[PRERELEASE-PREFIX][PRERELEASE]][[BUILDMETA-PREFIX][BUILDMETA]] + * + *
    + * + *

    For example: *

      *
    • 1.0.0
    • *
    • 1.0.0-beta
    • diff --git a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java index f37c6d4..8b5047a 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java +++ b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java @@ -29,6 +29,7 @@ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + package net.thauvin.erik.semver; import com.github.mustachejava.DefaultMustacheFactory; @@ -97,11 +98,13 @@ public class VersionProcessor extends AbstractProcessor { versionInfo.setBuildMeta( p.getProperty(version.keysPrefix() + version.buildMetaKey(), version.buildMeta())); versionInfo.setBuildMetaPrefix( - p.getProperty(version.keysPrefix() + version.buildMetaPrefixKey(), version.buildMetaPrefix())); + p.getProperty(version.keysPrefix() + version.buildMetaPrefixKey(), + version.buildMetaPrefix())); versionInfo.setPreRelease( p.getProperty(version.keysPrefix() + version.preReleaseKey(), version.preRelease())); versionInfo.setPreReleasePrefix( - p.getProperty(version.keysPrefix() + version.preReleasePrefixKey(), version.preReleasePrefix())); + p.getProperty(version.keysPrefix() + version.preReleasePrefixKey(), + version.preReleasePrefix())); versionInfo.setSeparator( p.getProperty(version.keysPrefix() + version.separatorKey(), version.separator())); } @@ -187,11 +190,11 @@ public class VersionProcessor extends AbstractProcessor { } note("Found version: " + versionInfo.getVersion()); final String template; - if (version.template().equals(Constants.DEFAULT_JAVA_TEMPLATE) && - new File(Constants.DEFAULT_TEMPLATE_NAME).exists()) { + if (version.template().equals(Constants.DEFAULT_JAVA_TEMPLATE) + && new File(Constants.DEFAULT_TEMPLATE_NAME).exists()) { template = Constants.DEFAULT_TEMPLATE_NAME; - } else if (version.template().equals(Constants.DEFAULT_JAVA_TEMPLATE) && - version.type().equals(Constants.KOTLIN_TYPE)) { + } else if (version.template().equals(Constants.DEFAULT_JAVA_TEMPLATE) + && version.type().equals(Constants.KOTLIN_TYPE)) { template = Constants.DEFAULT_KOTLIN_TEMPLATE; } else { template = version.template(); diff --git a/src/test/java/net/thauvin/erik/semver/ConstantsTest.java b/src/test/java/net/thauvin/erik/semver/ConstantsTest.java index 5c3603f..aad3b28 100644 --- a/src/test/java/net/thauvin/erik/semver/ConstantsTest.java +++ b/src/test/java/net/thauvin/erik/semver/ConstantsTest.java @@ -29,6 +29,7 @@ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + package net.thauvin.erik.semver; import org.testng.Assert; diff --git a/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java b/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java index 58e4a20..2b161de 100644 --- a/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java +++ b/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java @@ -29,6 +29,7 @@ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + package net.thauvin.erik.semver; import org.testng.Assert; diff --git a/src/test/java/net/thauvin/erik/semver/VersionProcessorTest.java b/src/test/java/net/thauvin/erik/semver/VersionProcessorTest.java index 93918d6..89230b8 100644 --- a/src/test/java/net/thauvin/erik/semver/VersionProcessorTest.java +++ b/src/test/java/net/thauvin/erik/semver/VersionProcessorTest.java @@ -29,6 +29,7 @@ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + package net.thauvin.erik.semver; import org.testng.Assert; diff --git a/src/test/java/net/thauvin/erik/semver/VersionTest.java b/src/test/java/net/thauvin/erik/semver/VersionTest.java index 0d91ac2..137eac7 100644 --- a/src/test/java/net/thauvin/erik/semver/VersionTest.java +++ b/src/test/java/net/thauvin/erik/semver/VersionTest.java @@ -29,6 +29,7 @@ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + package net.thauvin.erik.semver; import java.lang.annotation.Annotation; From 38fd8d6bdabe7f87d0bb34845462e1afe198c238 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Tue, 16 Apr 2019 11:28:31 -0700 Subject: [PATCH 174/316] Added gradle.properties --- examples/.gitignore | 32 ------------------------------- examples/kotlin/.gitignore | 17 ++++++++-------- examples/kotlin/gradle.properties | 1 + 3 files changed, 9 insertions(+), 41 deletions(-) delete mode 100644 examples/.gitignore create mode 100644 examples/kotlin/gradle.properties diff --git a/examples/.gitignore b/examples/.gitignore deleted file mode 100644 index 91cf804..0000000 --- a/examples/.gitignore +++ /dev/null @@ -1,32 +0,0 @@ -**/.idea/dictionaries -**/.idea/gradle.xml -**/.idea/libraries -**/.idea/tasks.xml -**/.idea/workspace.xml -**/src/*.class -*.code-workspace -*.iws -*.properties -*.sublime-* -.classpath -.DS_Store -.gradle -.kobalt -.nb-gradle -.project -.settings -/bin -/build -/deploy -/dist -/gen -/gradle.properties -/local.properties -/out -/proguard-project.txt -/project.properties -/target -/test-output -ehthumbs.db -kobaltBuild -Thumbs.db \ No newline at end of file diff --git a/examples/kotlin/.gitignore b/examples/kotlin/.gitignore index 32fe2fe..4cfd6f0 100644 --- a/examples/kotlin/.gitignore +++ b/examples/kotlin/.gitignore @@ -1,10 +1,3 @@ -**/.idea/dictionaries -**/.idea/gradle.xml -**/.idea/libraries -**/.idea/tasks.xml -**/.idea/workspace.xml -*.iws -*.sublime-* .classpath .DS_Store .gradle @@ -12,12 +5,18 @@ .nb-gradle .project .settings +*.iws +*.sublime-* +**/.idea/dictionaries +**/.idea/gradle.xml +**/.idea/libraries +**/.idea/tasks.xml +**/.idea/workspace.xml /bin /build /deploy /dist /gen -/gradle.properties /lib/kotlin* /libs /local.properties @@ -29,4 +28,4 @@ ehthumbs.db kobaltBuild kobaltw*-test -Thumbs.db \ No newline at end of file +Thumbs.db diff --git a/examples/kotlin/gradle.properties b/examples/kotlin/gradle.properties new file mode 100644 index 0000000..170c210 --- /dev/null +++ b/examples/kotlin/gradle.properties @@ -0,0 +1 @@ +kapt.use.worker.api=true From 919661095cdb375be91a303c724b48b35c9c7670 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Tue, 16 Apr 2019 11:55:07 -0700 Subject: [PATCH 175/316] Updated wrappers and dependencies. --- examples/java/build.gradle | 7 +++++-- examples/java/gradle/wrapper/gradle-wrapper.properties | 2 +- examples/kotlin/build.gradle.kts | 5 +++-- examples/kotlin/gradle/wrapper/gradle-wrapper.properties | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/examples/java/build.gradle b/examples/java/build.gradle index 958977e..d8240a5 100644 --- a/examples/java/build.gradle +++ b/examples/java/build.gradle @@ -1,5 +1,8 @@ -apply plugin: 'java' -apply plugin: 'application' +plugins { + id 'java' + id 'application' + id 'com.github.ben-manes.versions' version '0.21.0' +} // ./gradlew diff --git a/examples/java/gradle/wrapper/gradle-wrapper.properties b/examples/java/gradle/wrapper/gradle-wrapper.properties index ea13fdf..5f1b120 100644 --- a/examples/java/gradle/wrapper/gradle-wrapper.properties +++ b/examples/java/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.3.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/kotlin/build.gradle.kts b/examples/kotlin/build.gradle.kts index cff424c..83f567a 100644 --- a/examples/kotlin/build.gradle.kts +++ b/examples/kotlin/build.gradle.kts @@ -1,7 +1,8 @@ plugins { - kotlin("jvm").version("1.3.21") + kotlin("jvm").version("1.3.30") application - id("org.jetbrains.kotlin.kapt").version("1.3.21") + id("org.jetbrains.kotlin.kapt").version("1.3.30") + id("com.github.ben-manes.versions").version "0.21.0" } // ./gradlew diff --git a/examples/kotlin/gradle/wrapper/gradle-wrapper.properties b/examples/kotlin/gradle/wrapper/gradle-wrapper.properties index ea13fdf..5f1b120 100644 --- a/examples/kotlin/gradle/wrapper/gradle-wrapper.properties +++ b/examples/kotlin/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.3.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ea13fdf..5f1b120 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.3.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From f29dddf82ce9dff4a42d34b9a77cb57a94077fe5 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Tue, 16 Apr 2019 11:55:18 -0700 Subject: [PATCH 176/316] Added checkstyle. --- build.gradle | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/build.gradle b/build.gradle index d939ab7..0d6c91b 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,5 @@ plugins { + id 'checkstyle' id 'java' id 'jacoco' id 'maven-publish' @@ -148,6 +149,18 @@ tasks.withType(SpotBugsTask) { excludeFilter = file("$projectDir/config/spotbugs/excludeFilter.xml") } +tasks.withType(Checkstyle) { + reports { + xml.enabled false + html.enabled true + //html.stylesheet resources.text.fromFile('config/xsl/checkstyle-custom.xsl') + } +} + +checkstyle { + toolVersion "8.18" +} + compileJava { options.compilerArgs.add('-proc:none') } From 4a1f9e45f565542ed4734d66d0c76e48f6072e9a Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Tue, 16 Apr 2019 11:58:13 -0700 Subject: [PATCH 177/316] Verson 1.0.1 --- updatewrappers.sh | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/updatewrappers.sh b/updatewrappers.sh index 91ba1d6..0074ff2 100644 --- a/updatewrappers.sh +++ b/updatewrappers.sh @@ -1,7 +1,7 @@ #!/bin/bash # -# Version: 1.0.1 +# Version: 1.0.2 # # set the examples directories @@ -11,14 +11,14 @@ declare -a dirs=( "examples/kotlin") java8=true +### + pwd=$PWD cyan=$(tput setaf 6) green=$(tput setaf 2) red=$(tput setaf 1) std=$(tput sgr0) -### - if [ "$java8" = true ] then export JAVA_HOME="$JAVA8_HOME" @@ -50,11 +50,11 @@ updateWrappers() { echo -e "Updating wrappers..." -for d in "${dirs[@]}"; do - if [ -d "$d" ]; then - cd "$d" || exit 1 +for d in "${!dirs[@]}"; do + if [ "$d" -ne 0 ]; then + cd "${dirs[d]}" || exit 1 fi - echo -e " ${cyan}${d}${std}" + echo -e " ${cyan}${dirs[d]}${std}" updateWrappers cd "$pwd" done From bae649736849ae638b47a033edabeb7fa35bf76f Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Tue, 16 Apr 2019 14:26:33 -0700 Subject: [PATCH 178/316] Check that int are positive. --- src/main/java/net/thauvin/erik/semver/VersionProcessor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java index 8b5047a..57246fc 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java +++ b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java @@ -165,7 +165,7 @@ public class VersionProcessor extends AbstractProcessor { private int parseIntProperty(final Properties p, final String property, final int defaultValue) { try { - return Integer.parseInt(p.getProperty(property, Integer.toString(defaultValue)).trim()); + return Math.abs(Integer.parseInt(p.getProperty(property, Integer.toString(defaultValue)).trim())); } catch (NumberFormatException ignore) { warn("Invalid property value: " + property); return defaultValue; From 3cb4b20a3d723a3f850a4fa076d17ed45577a32d Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Tue, 16 Apr 2019 14:26:51 -0700 Subject: [PATCH 179/316] Cleanup --- build.gradle | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/build.gradle b/build.gradle index 0d6c91b..c2caa18 100644 --- a/build.gradle +++ b/build.gradle @@ -71,14 +71,14 @@ bintray { task javadocJar(type: Jar, dependsOn: javadoc) { group = 'Build' description = 'Builds an archive of the javadoc docs.' - classifier = 'javadoc' + archiveClassifier = 'javadoc' from javadoc.destinationDir } task sourceJar(type: Jar) { group = 'Build' description = 'Builds an archive of the source code.' - classifier = 'sources' + archiveClassifier = 'sources' from sourceSets.main.allSource } @@ -151,16 +151,11 @@ tasks.withType(SpotBugsTask) { tasks.withType(Checkstyle) { reports { - xml.enabled false - html.enabled true - //html.stylesheet resources.text.fromFile('config/xsl/checkstyle-custom.xsl') + xml.enabled = false + html.enabled = true } } -checkstyle { - toolVersion "8.18" -} - compileJava { options.compilerArgs.add('-proc:none') } From 3c503c7a06e0fed0bf0ff100725d0f42e2bb8187 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Tue, 16 Apr 2019 14:27:18 -0700 Subject: [PATCH 180/316] Testing. --- examples/kotlin/build.gradle.kts | 4 ++-- examples/kotlin/gradle.properties | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/kotlin/build.gradle.kts b/examples/kotlin/build.gradle.kts index 83f567a..6bd170e 100644 --- a/examples/kotlin/build.gradle.kts +++ b/examples/kotlin/build.gradle.kts @@ -2,7 +2,7 @@ plugins { kotlin("jvm").version("1.3.30") application id("org.jetbrains.kotlin.kapt").version("1.3.30") - id("com.github.ben-manes.versions").version "0.21.0" + id("com.github.ben-manes.versions").version("0.21.0") } // ./gradlew @@ -11,7 +11,7 @@ plugins { defaultTasks(ApplicationPlugin.TASK_RUN_NAME) -var semverProcessor = "net.thauvin.erik:semver:1.2.0" +var semverProcessor = "net.thauvin.erik:semver:1.1.1" dependencies { kapt(semverProcessor) diff --git a/examples/kotlin/gradle.properties b/examples/kotlin/gradle.properties index 170c210..93cd554 100644 --- a/examples/kotlin/gradle.properties +++ b/examples/kotlin/gradle.properties @@ -1 +1 @@ -kapt.use.worker.api=true +#kapt.use.worker.api=true From a9bcd354ed776888cd6edf44c1ce1bcb2edb595d Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Wed, 17 Apr 2019 00:20:44 -0700 Subject: [PATCH 181/316] Checkstyle fixes. --- .idea/checkstyle-idea.xml | 18 ++++++++++++++++++ .idea/checkstyleidea-libs/readme.txt | 6 ++++++ config/checkstyle/checkstyle.xml | 17 +++++++++++++---- .../thauvin/erik/semver/VersionProcessor.java | 15 +++++++++++++-- 4 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 .idea/checkstyle-idea.xml create mode 100644 .idea/checkstyleidea-libs/readme.txt diff --git a/.idea/checkstyle-idea.xml b/.idea/checkstyle-idea.xml new file mode 100644 index 0000000..17101f8 --- /dev/null +++ b/.idea/checkstyle-idea.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/.idea/checkstyleidea-libs/readme.txt b/.idea/checkstyleidea-libs/readme.txt new file mode 100644 index 0000000..71cc7ff --- /dev/null +++ b/.idea/checkstyleidea-libs/readme.txt @@ -0,0 +1,6 @@ +This folder contains libraries copied from the "semver" project. +It is managed by the CheckStyle-IDEA IDE plugin. +Do not modify this folder while the IDE is running. +When the IDE is stopped, you may delete this folder at any time. It will be recreated as needed. +In order to prevent the CheckStyle-IDEA IDE plugin from creating this folder, +uncheck the "Copy libraries from project directory" option in the CheckStyle-IDEA settings dialog. diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml index ac8ef90..c426276 100644 --- a/config/checkstyle/checkstyle.xml +++ b/config/checkstyle/checkstyle.xml @@ -6,9 +6,12 @@ @@ -29,7 +32,10 @@ + + + @@ -47,7 +53,7 @@ - + @@ -194,9 +200,12 @@ - - - + + + + + diff --git a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java index 57246fc..75e403b 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java +++ b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java @@ -37,7 +37,11 @@ import com.github.mustachejava.Mustache; import com.github.mustachejava.MustacheFactory; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import javax.annotation.processing.*; +import javax.annotation.processing.AbstractProcessor; +import javax.annotation.processing.Filer; +import javax.annotation.processing.Messager; +import javax.annotation.processing.ProcessingEnvironment; +import javax.annotation.processing.RoundEnvironment; import javax.lang.model.SourceVersion; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; @@ -45,7 +49,14 @@ import javax.lang.model.element.PackageElement; import javax.lang.model.element.TypeElement; import javax.tools.Diagnostic; import javax.tools.FileObject; -import java.io.*; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.Writer; import java.nio.charset.StandardCharsets; import java.util.HashSet; import java.util.Properties; From c0be96dd249df4896eb7d00600315ba6fc6b96a7 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Wed, 17 Apr 2019 14:49:36 -0700 Subject: [PATCH 182/316] Tied exec:java to verify phase. --- README.md | 2 +- examples/java/pom.xml | 86 +++++++++++++++++++++---------------------- 2 files changed, 43 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index ea64eab..5213926 100644 --- a/README.md +++ b/README.md @@ -194,7 +194,7 @@ To install and run from [Maven](https://maven.apache.org/), configure an artifac Please look at [pom.xml](https://github.com/ethauvin/semver/blob/master/examples/java/pom.xml) in the [Java example](https://github.com/ethauvin/semver/tree/master/examples/java) directory for a sample: ```bash -mvn compile exec:java +mvn verify ``` ### Gradle diff --git a/examples/java/pom.xml b/examples/java/pom.xml index 38776a4..6d1f0a3 100644 --- a/examples/java/pom.xml +++ b/examples/java/pom.xml @@ -10,57 +10,55 @@ Example - 1.2.0 + 1.2.0 - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.0 - - 1.8 - 1.8 - UTF-8 - src/generated/java - - - net.thauvin.erik - semver - ${semver} - - - - - - org.codehaus.mojo - exec-maven-plugin - 1.6.0 - - - my-execution - package - - java - - - - - com.example.Example - - - - - - net.thauvin.erik semver - ${semver} + ${semver.version} compile + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + 1.8 + 1.8 + UTF-8 + src/generated/java + + + net.thauvin.erik + semver + ${semver.version} + + + + + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + + run + verify + + java + + + + + com.example.Example + + + + From 37d33f1ea350459dbf20af50cee41e0c4a507530 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Thu, 18 Apr 2019 23:39:59 -0700 Subject: [PATCH 183/316] Cleanup. --- .gitignore | 91 ++++++++++++++++++++++++++------------ examples/java/.gitignore | 89 +++++++++++++++++++++++++++++-------- examples/kotlin/.gitignore | 87 ++++++++++++++++++++++++++++-------- 3 files changed, 202 insertions(+), 65 deletions(-) diff --git a/.gitignore b/.gitignore index 2fe3b60..e439b59 100644 --- a/.gitignore +++ b/.gitignore @@ -2,49 +2,82 @@ !.vscode/launch.json !.vscode/settings.json !.vscode/tasks.json +!gradle-wrapper.jar .classpath .DS_Store .gradle .history +.idea_modules/ +.idea/**/contentModel.xml +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/dataSources/ +.idea/**/dbnavigator.xml +.idea/**/dictionaries +.idea/**/dynamic.xml +.idea/**/gradle.xml +.idea/**/libraries +.idea/**/mongoSettings.xml +.idea/**/shelf +.idea/**/sqlDataSources.xml +.idea/**/tasks.xml +.idea/**/uiDesigner.xml +.idea/**/usage.statistics.xml +.idea/**/workspace.xml +.idea/caches/build_file_checksums.ser +.idea/httpRequests +.idea/replstate.xml .kobalt +.mtj.tmp/ +.mvn/timing.properties +.mvn/wrapper/maven-wrapper.jar .nb-gradle .project .scannerwork .settings .vscode/* +*.class *.code-workspace +*.ctxt +*.ear *.iws +*.jar +*.log +*.nar +*.rar *.sublime-* -**/.idea/**/dataSources.ids -**/.idea/**/dataSources.local.xml -**/.idea/**/dataSources/ -**/.idea/**/dbnavigator.xml -**/.idea/**/dictionaries -**/.idea/**/dynamic.xml -**/.idea/**/gradle.xml -**/.idea/**/libraries -**/.idea/**/shelf -**/.idea/**/sqlDataSources.xml -**/.idea/**/tasks.xml -**/.idea/**/uiDesigner.xml -**/.idea/**/usage.statistics.xml -**/.idea/**/workspace.xml -**/*.class -/bin -/build -/deploy -/dist -/gen -/gradle.properties -/lib/kotlin* -/libs -/local.properties -/out -/proguard-project.txt -/project.properties -/target -/test-output +*.tar.gz +*.war +*.zip +atlassian-ide-plugin.xml +bin/ +build/ +buildNumber.properties +cmake-build-*/ +com_crashlytics_export_strings.xml +crashlytics-build.properties +crashlytics.properties +dependency-reduced-pom.xml +deploy/ +dist/ ehthumbs.db +fabric.properties +gen/ +gradle.properties +hs_err_pid* kobaltBuild kobaltw*-test +lib/kotlin* +libs/ +local.properties +out/ +pom.xml.next +pom.xml.releaseBackup +pom.xml.tag +pom.xml.versionsBackup +proguard-project.txt +project.properties +release.properties +target/ +test-output Thumbs.db diff --git a/examples/java/.gitignore b/examples/java/.gitignore index 6e9dd4c..a78c5c2 100644 --- a/examples/java/.gitignore +++ b/examples/java/.gitignore @@ -1,29 +1,82 @@ +!.vscode/extensions.json +!.vscode/launch.json +!.vscode/settings.json +!.vscode/tasks.json +!gradle-wrapper.jar .classpath .DS_Store .gradle +.history +.idea_modules/ +.idea/**/contentModel.xml +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/dataSources/ +.idea/**/dbnavigator.xml +.idea/**/dictionaries +.idea/**/dynamic.xml +.idea/**/gradle.xml +.idea/**/libraries +.idea/**/mongoSettings.xml +.idea/**/shelf +.idea/**/sqlDataSources.xml +.idea/**/tasks.xml +.idea/**/uiDesigner.xml +.idea/**/usage.statistics.xml +.idea/**/workspace.xml +.idea/caches/build_file_checksums.ser +.idea/httpRequests +.idea/replstate.xml .kobalt +.mtj.tmp/ +.mvn/timing.properties +.mvn/wrapper/maven-wrapper.jar .nb-gradle .project +.scannerwork .settings +.vscode/* +*.class +*.code-workspace +*.ctxt +*.ear *.iws -**/.idea/dictionaries -**/.idea/gradle.xml -**/.idea/libraries -**/.idea/tasks.xml -**/.idea/workspace.xml -/bin -/build -/deploy -/dist -/gen -/gradle.properties -/libs -/local.properties -/out -/proguard-project.txt -/project.properties -/test-output +*.jar +*.log +*.nar +*.rar +*.sublime-* +*.tar.gz +*.war +*.zip +atlassian-ide-plugin.xml +bin/ +build/ +cmake-build-*/ +com_crashlytics_export_strings.xml +crashlytics-build.properties +crashlytics.properties +dependency-reduced-pom.xml +deploy/ +dist/ ehthumbs.db +fabric.properties +gen/ +gradle.properties +hs_err_pid* kobaltBuild -target +kobaltw*-test +lib/kotlin* +libs/ +local.properties +out/ +pom.xml.next +pom.xml.releaseBackup +pom.xml.tag +pom.xml.versionsBackup +proguard-project.txt +project.properties +release.properties +target/ +test-output Thumbs.db diff --git a/examples/kotlin/.gitignore b/examples/kotlin/.gitignore index 4cfd6f0..a78c5c2 100644 --- a/examples/kotlin/.gitignore +++ b/examples/kotlin/.gitignore @@ -1,31 +1,82 @@ +!.vscode/extensions.json +!.vscode/launch.json +!.vscode/settings.json +!.vscode/tasks.json +!gradle-wrapper.jar .classpath .DS_Store .gradle +.history +.idea_modules/ +.idea/**/contentModel.xml +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/dataSources/ +.idea/**/dbnavigator.xml +.idea/**/dictionaries +.idea/**/dynamic.xml +.idea/**/gradle.xml +.idea/**/libraries +.idea/**/mongoSettings.xml +.idea/**/shelf +.idea/**/sqlDataSources.xml +.idea/**/tasks.xml +.idea/**/uiDesigner.xml +.idea/**/usage.statistics.xml +.idea/**/workspace.xml +.idea/caches/build_file_checksums.ser +.idea/httpRequests +.idea/replstate.xml .kobalt +.mtj.tmp/ +.mvn/timing.properties +.mvn/wrapper/maven-wrapper.jar .nb-gradle .project +.scannerwork .settings +.vscode/* +*.class +*.code-workspace +*.ctxt +*.ear *.iws +*.jar +*.log +*.nar +*.rar *.sublime-* -**/.idea/dictionaries -**/.idea/gradle.xml -**/.idea/libraries -**/.idea/tasks.xml -**/.idea/workspace.xml -/bin -/build -/deploy -/dist -/gen -/lib/kotlin* -/libs -/local.properties -/out -/proguard-project.txt -/project.properties -/target -/test-output +*.tar.gz +*.war +*.zip +atlassian-ide-plugin.xml +bin/ +build/ +cmake-build-*/ +com_crashlytics_export_strings.xml +crashlytics-build.properties +crashlytics.properties +dependency-reduced-pom.xml +deploy/ +dist/ ehthumbs.db +fabric.properties +gen/ +gradle.properties +hs_err_pid* kobaltBuild kobaltw*-test +lib/kotlin* +libs/ +local.properties +out/ +pom.xml.next +pom.xml.releaseBackup +pom.xml.tag +pom.xml.versionsBackup +proguard-project.txt +project.properties +release.properties +target/ +test-output Thumbs.db From 7f172d0b908fb8c9b605c033be4acffccae49cd7 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Thu, 18 Apr 2019 23:42:04 -0700 Subject: [PATCH 184/316] Added semver.properties processor argument. --- README.md | 9 ++++++- examples/kotlin/build.gradle.kts | 6 +++++ .../net/thauvin/erik/semver/Constants.java | 5 ++++ .../thauvin/erik/semver/VersionProcessor.java | 26 ++++++++++++++----- 4 files changed, 38 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 5213926..c0ac051 100644 --- a/README.md +++ b/README.md @@ -250,8 +250,15 @@ dependencies { kapt(semverProcessor) compileOnly(semverProcessor) } + +kapt { + arguments { + arg("semver.properties", "$projectDir/version.properties") + } +} ``` -As of [Kotlin 1.2.30](https://blog.jetbrains.com/kotlin/2019/04/kotlin-1-3-30-released/#more-6991), when using `kapt` you must include the following in `gradle.properties`: + +The arguments block is not required if `kapt` is configured to use the Gradle Worker API in `gradle.properties`: ```ini kapt.use.worker.api=true diff --git a/examples/kotlin/build.gradle.kts b/examples/kotlin/build.gradle.kts index 6bd170e..03418b4 100644 --- a/examples/kotlin/build.gradle.kts +++ b/examples/kotlin/build.gradle.kts @@ -20,6 +20,12 @@ dependencies { implementation(kotlin("stdlib")) } +kapt { + arguments { + arg("semver.properties", "$projectDir/version.properties") + } +} + repositories { mavenLocal() jcenter() diff --git a/src/main/java/net/thauvin/erik/semver/Constants.java b/src/main/java/net/thauvin/erik/semver/Constants.java index affc701..5571ff7 100644 --- a/src/main/java/net/thauvin/erik/semver/Constants.java +++ b/src/main/java/net/thauvin/erik/semver/Constants.java @@ -138,6 +138,11 @@ public final class Constants { */ public static final String KOTLIN_TYPE = "kt"; + /** + * The argument used to specify the properties file location. + */ + public static final String SEMVER_PROPERTIES_ARG = "semver.properties"; + /** * Disables the default constructor. diff --git a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java index 75e403b..4a4a0a7 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java +++ b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java @@ -42,6 +42,7 @@ import javax.annotation.processing.Filer; import javax.annotation.processing.Messager; import javax.annotation.processing.ProcessingEnvironment; import javax.annotation.processing.RoundEnvironment; +import javax.annotation.processing.SupportedOptions; import javax.lang.model.SourceVersion; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; @@ -69,6 +70,7 @@ import java.util.Set; * @created 2016-01-13 * @since 1.0 */ +@SupportedOptions({Constants.KAPT_KOTLIN_GENERATED_OPTION_NAME, Constants.SEMVER_PROPERTIES_ARG}) public class VersionProcessor extends AbstractProcessor { private Filer filer; @@ -82,13 +84,23 @@ public class VersionProcessor extends AbstractProcessor { log(Diagnostic.Kind.ERROR, (t != null ? t.toString() : s)); } + private String getEnv(String envOption, String defaultValue) { + if (processingEnv != null) { // null when testing. + final String prop = processingEnv.getOptions().get(envOption); + if (prop != null) { + return prop; + } + } + return defaultValue; + } + @SuppressFBWarnings(value = "PATH_TRAVERSAL_IN") private VersionInfo findValues(final Version version) throws IOException { final VersionInfo versionInfo = new VersionInfo(version); if (version.properties().length() > 0) { - final File propsFile = new File(version.properties()); + final File propsFile = new File(getEnv(Constants.SEMVER_PROPERTIES_ARG, version.properties())); if (propsFile.isFile() && propsFile.canRead()) { note("Found properties: " + propsFile + " (" + propsFile.getAbsoluteFile().getParent() + ')'); @@ -248,19 +260,19 @@ public class VersionProcessor extends AbstractProcessor { final String fileName = versionInfo.getClassName() + '.' + type; if (type.equalsIgnoreCase(Constants.KOTLIN_TYPE)) { - final String kaptGenDir = processingEnv.getOptions().get(Constants.KAPT_KOTLIN_GENERATED_OPTION_NAME); + final String kaptGenDir = getEnv(Constants.KAPT_KOTLIN_GENERATED_OPTION_NAME, null); if (kaptGenDir == null) { throw new IOException("Could not find the target directory for generated Kotlin files."); } - final File versionFile = new File(kaptGenDir, fileName); - if (!versionFile.getParentFile().exists() && !versionFile.getParentFile().mkdirs()) { - note("Could not create target directory: " + versionFile.getParentFile().getAbsolutePath()); + final File ktFile = new File(kaptGenDir, fileName); + if (!ktFile.getParentFile().exists() && !ktFile.getParentFile().mkdirs()) { + note("Could not create target directory: " + ktFile.getParentFile().getAbsolutePath()); } - try (final OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(versionFile), + try (final OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(ktFile), StandardCharsets.UTF_8)) { mustache.execute(osw, versionInfo).flush(); } - note("Generated source: " + fileName + " (" + versionFile.getParentFile().getAbsolutePath() + ')'); + note("Generated source: " + fileName + " (" + ktFile.getParentFile().getAbsolutePath() + ')'); } else { final FileObject jfo = filer.createSourceFile(versionInfo.getPackageName() + '.' + versionInfo.getClassName()); From ed35e70af443ceceb2208671ee5ad0f21f1338ee Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Thu, 18 Apr 2019 23:42:26 -0700 Subject: [PATCH 185/316] Cleanup. --- .../net/thauvin/erik/semver/VersionInfo.java | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/main/java/net/thauvin/erik/semver/VersionInfo.java b/src/main/java/net/thauvin/erik/semver/VersionInfo.java index c7da94e..61d015c 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionInfo.java +++ b/src/main/java/net/thauvin/erik/semver/VersionInfo.java @@ -59,17 +59,17 @@ public class VersionInfo { * Creates a new object with default values. */ public VersionInfo() { - major = Constants.DEFAULT_MAJOR; - minor = Constants.DEFAULT_MINOR; - patch = Constants.DEFAULT_PATCH; buildMeta = Constants.EMPTY; buildMetaPrefix = Constants.DEFAULT_BUILDMETA_PREFIX; + className = Constants.DEFAULT_CLASS_NAME; + minor = Constants.DEFAULT_MINOR; + packageName = Constants.EMPTY; + patch = Constants.DEFAULT_PATCH; preRelease = Constants.EMPTY; preReleasePrefix = Constants.DEFAULT_PRERELEASE_PREFIX; - separator = Constants.DEFAULT_SEPARATOR; project = Constants.EMPTY; - className = Constants.DEFAULT_CLASS_NAME; - packageName = Constants.EMPTY; + separator = Constants.DEFAULT_SEPARATOR; + major = Constants.DEFAULT_MAJOR; } /** @@ -78,17 +78,17 @@ public class VersionInfo { * @param version The version object. */ public VersionInfo(final Version version) { - major = version.major(); - minor = version.minor(); - patch = version.patch(); buildMeta = version.buildMeta(); buildMetaPrefix = version.buildMetaPrefix(); + className = version.className(); + major = version.major(); + minor = version.minor(); + packageName = version.packageName(); + patch = version.patch(); preRelease = version.preRelease(); preReleasePrefix = version.preReleasePrefix(); - separator = version.separator(); project = version.project(); - className = version.className(); - packageName = version.packageName(); + separator = version.separator(); } /** @@ -280,7 +280,6 @@ public class VersionInfo { this.project = project; } - /** * Sames as {@link #getVersion()}. */ From b83a17e9c88c753c3f9fd832fa8d6f0af2567775 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 19 Apr 2019 12:04:06 -0700 Subject: [PATCH 186/316] Added semver.project.dir processor argument. Closes #2 --- README.md | 12 +++---- examples/kotlin/.gitignore | 1 - examples/kotlin/build.gradle.kts | 2 +- .../net/thauvin/erik/semver/Constants.java | 4 +-- .../thauvin/erik/semver/VersionProcessor.java | 36 ++++++++++--------- 5 files changed, 29 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index c0ac051..2804d53 100644 --- a/README.md +++ b/README.md @@ -12,14 +12,14 @@ This processor was inspired by Cédric Beust's [version-processor](https://githu - [Template](#template) - [Default Template](#default-template) - [Custom Template](#custom-template) -- [Elements & Properties](#elements---properties) -- [Usage with Maven, Gradle, Kotlin and Kobalt](#usage-with-maven--gradle--kotlin-and-kobalt) +- [Elements & Properties](#elements--properties) +- [Usage with Maven, Gradle, Kotlin and Kobalt](#usage-with-maven-gradle-kotlin-and-kobalt) - [Maven](#maven) - [Gradle](#gradle) - [Class Generation](#class-generation) - - [Class & Source Generation](#class---source-generation) + - [Class & Source Generation](#class-source-generation) - [Kotlin](#kotlin) - - [Kotlin & Gradle](#kotlin---gradle) + - [Kotlin & Gradle](#kotlin--gradle) - [Kobalt](#kobalt) - [Auto-Increment](#auto-increment) @@ -253,7 +253,7 @@ dependencies { kapt { arguments { - arg("semver.properties", "$projectDir/version.properties") + arg("semver.project.dir", projectDir) } } ``` @@ -264,7 +264,7 @@ The arguments block is not required if `kapt` is configured to use the Gradle Wo kapt.use.worker.api=true ``` -This option will likely be enabled by default in the future, but is currently not working under Java 10/11 see [KT-26203](https://youtrack.jetbrains.net/issue/KT-26203). +This option will likely be enabled by default in the future, but is currently not working under Java 10+ see [KT-26203](https://youtrack.jetbrains.net/issue/KT-26203). Please look at the [Kotlin example](https://github.com/ethauvin/semver/tree/master/examples/kotlin) project for a [build.gradle.kts](https://github.com/ethauvin/semver/blob/master/examples/kotlin/build.gradle.kts) sample. diff --git a/examples/kotlin/.gitignore b/examples/kotlin/.gitignore index a78c5c2..638960b 100644 --- a/examples/kotlin/.gitignore +++ b/examples/kotlin/.gitignore @@ -62,7 +62,6 @@ dist/ ehthumbs.db fabric.properties gen/ -gradle.properties hs_err_pid* kobaltBuild kobaltw*-test diff --git a/examples/kotlin/build.gradle.kts b/examples/kotlin/build.gradle.kts index 03418b4..5a82d39 100644 --- a/examples/kotlin/build.gradle.kts +++ b/examples/kotlin/build.gradle.kts @@ -22,7 +22,7 @@ dependencies { kapt { arguments { - arg("semver.properties", "$projectDir/version.properties") + arg("semver.project.dir", projectDir) } } diff --git a/src/main/java/net/thauvin/erik/semver/Constants.java b/src/main/java/net/thauvin/erik/semver/Constants.java index 5571ff7..be57649 100644 --- a/src/main/java/net/thauvin/erik/semver/Constants.java +++ b/src/main/java/net/thauvin/erik/semver/Constants.java @@ -139,9 +139,9 @@ public final class Constants { public static final String KOTLIN_TYPE = "kt"; /** - * The argument used to specify the properties file location. + * The argument used to specify the project location. */ - public static final String SEMVER_PROPERTIES_ARG = "semver.properties"; + public static final String SEMVER_PROJECT_DIR_ARG = "semver.project.dir"; /** diff --git a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java index 4a4a0a7..3816b04 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java +++ b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java @@ -35,6 +35,7 @@ package net.thauvin.erik.semver; import com.github.mustachejava.DefaultMustacheFactory; import com.github.mustachejava.Mustache; import com.github.mustachejava.MustacheFactory; +import com.github.mustachejava.MustacheNotFoundException; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import javax.annotation.processing.AbstractProcessor; @@ -70,7 +71,7 @@ import java.util.Set; * @created 2016-01-13 * @since 1.0 */ -@SupportedOptions({Constants.KAPT_KOTLIN_GENERATED_OPTION_NAME, Constants.SEMVER_PROPERTIES_ARG}) +@SupportedOptions({Constants.KAPT_KOTLIN_GENERATED_OPTION_NAME, Constants.SEMVER_PROJECT_DIR_ARG}) public class VersionProcessor extends AbstractProcessor { private Filer filer; @@ -84,23 +85,13 @@ public class VersionProcessor extends AbstractProcessor { log(Diagnostic.Kind.ERROR, (t != null ? t.toString() : s)); } - private String getEnv(String envOption, String defaultValue) { - if (processingEnv != null) { // null when testing. - final String prop = processingEnv.getOptions().get(envOption); - if (prop != null) { - return prop; - } - } - return defaultValue; - } - @SuppressFBWarnings(value = "PATH_TRAVERSAL_IN") private VersionInfo findValues(final Version version) throws IOException { final VersionInfo versionInfo = new VersionInfo(version); if (version.properties().length() > 0) { - final File propsFile = new File(getEnv(Constants.SEMVER_PROPERTIES_ARG, version.properties())); + final File propsFile = new File(getEnv(Constants.SEMVER_PROJECT_DIR_ARG, version.properties())); if (propsFile.isFile() && propsFile.canRead()) { note("Found properties: " + propsFile + " (" + propsFile.getAbsoluteFile().getParent() + ')'); @@ -147,6 +138,17 @@ public class VersionProcessor extends AbstractProcessor { return versionInfo; } + private String getEnv(String envOption, String fileName) { + if (processingEnv != null) { // null when testing. + final String prop = processingEnv.getOptions().get(envOption); + if (prop != null) { + return prop + File.separator + fileName; + } + } + return fileName; + } + + /** * {@inheritDoc} */ @@ -222,9 +224,10 @@ public class VersionProcessor extends AbstractProcessor { } else { template = version.template(); } + writeTemplate(version.type(), versionInfo, template); - } catch (IOException e) { - error("IOException occurred while running the annotation processor: " + e.getMessage(), e); + } catch (IOException | MustacheNotFoundException e) { + error("An error occurred while running the annotation processor: " + e.getMessage(), e); } } } @@ -241,7 +244,8 @@ public class VersionProcessor extends AbstractProcessor { final VersionInfo versionInfo, final String template) throws IOException { - final MustacheFactory mf = new DefaultMustacheFactory(); + final MustacheFactory mf = new DefaultMustacheFactory( + new File(getEnv(Constants.SEMVER_PROJECT_DIR_ARG, "."))); final Mustache mustache = mf.compile(template); final String templateName; @@ -260,7 +264,7 @@ public class VersionProcessor extends AbstractProcessor { final String fileName = versionInfo.getClassName() + '.' + type; if (type.equalsIgnoreCase(Constants.KOTLIN_TYPE)) { - final String kaptGenDir = getEnv(Constants.KAPT_KOTLIN_GENERATED_OPTION_NAME, null); + final String kaptGenDir = processingEnv.getOptions().get(Constants.KAPT_KOTLIN_GENERATED_OPTION_NAME); if (kaptGenDir == null) { throw new IOException("Could not find the target directory for generated Kotlin files."); } From 7f838e98631e6c4fa7431baf4b6548628d8def79 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 19 Apr 2019 13:01:52 -0700 Subject: [PATCH 187/316] Cleanup. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2804d53..bacbabb 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ This processor was inspired by Cédric Beust's [version-processor](https://githu - [Maven](#maven) - [Gradle](#gradle) - [Class Generation](#class-generation) - - [Class & Source Generation](#class-source-generation) + - [Class & Source Generation](#class--source-generation) - [Kotlin](#kotlin) - [Kotlin & Gradle](#kotlin--gradle) - [Kobalt](#kobalt) From 06263ee0037d090b1d4d263094b5941daec562ba Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 19 Apr 2019 13:55:21 -0700 Subject: [PATCH 188/316] Changed getEnv() to getProjectDir() --- .../java/net/thauvin/erik/semver/VersionProcessor.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java index 3816b04..e6ce948 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java +++ b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java @@ -91,7 +91,7 @@ public class VersionProcessor extends AbstractProcessor { final VersionInfo versionInfo = new VersionInfo(version); if (version.properties().length() > 0) { - final File propsFile = new File(getEnv(Constants.SEMVER_PROJECT_DIR_ARG, version.properties())); + final File propsFile = new File(getProjectDir(version.properties())); if (propsFile.isFile() && propsFile.canRead()) { note("Found properties: " + propsFile + " (" + propsFile.getAbsoluteFile().getParent() + ')'); @@ -138,9 +138,9 @@ public class VersionProcessor extends AbstractProcessor { return versionInfo; } - private String getEnv(String envOption, String fileName) { + private String getProjectDir(String fileName) { if (processingEnv != null) { // null when testing. - final String prop = processingEnv.getOptions().get(envOption); + final String prop = processingEnv.getOptions().get(Constants.SEMVER_PROJECT_DIR_ARG); if (prop != null) { return prop + File.separator + fileName; } @@ -245,7 +245,7 @@ public class VersionProcessor extends AbstractProcessor { final String template) throws IOException { final MustacheFactory mf = new DefaultMustacheFactory( - new File(getEnv(Constants.SEMVER_PROJECT_DIR_ARG, "."))); + new File(getProjectDir("."))); final Mustache mustache = mf.compile(template); final String templateName; From cd10d5325a54709aaff496430d438f6b9683afcf Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Tue, 23 Apr 2019 15:47:03 -0700 Subject: [PATCH 189/316] Cleanup. --- .idea/modules/examples-kotlin_main.iml | 2 +- .idea/modules/examples-kotlin_test.iml | 2 +- build.gradle | 14 ++-- examples/java/example.mustache | 17 ++-- .../java/com/example/GeneratedVersion.java | 83 +------------------ examples/kotlin/build.gradle.kts | 2 +- examples/kotlin/example.mustache | 1 + .../thauvin/erik/semver/VersionProcessor.java | 21 +++-- src/main/resources/semver-kt.mustache | 1 + src/main/resources/semver.mustache | 23 ++--- .../thauvin/erik/semver/VersionInfoTest.java | 2 + .../erik/semver/VersionProcessorTest.java | 3 + 12 files changed, 50 insertions(+), 121 deletions(-) diff --git a/.idea/modules/examples-kotlin_main.iml b/.idea/modules/examples-kotlin_main.iml index 7ea61a1..97684ce 100644 --- a/.idea/modules/examples-kotlin_main.iml +++ b/.idea/modules/examples-kotlin_main.iml @@ -6,7 +6,7 @@
    -
  • Elements & Properties
  • -
  • Usage with Maven, Gradle, Kotlin and Kobalt +
  • Elements & Properties
  • +
  • Usage with Maven, Gradle, Kotlin and Kobalt
  • @@ -436,13 +436,13 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni <version>1.2.0</version> </dependency>

    Please look at pom.xml in the Java example directory for a sample:

    - +

    Gradle

    Class Generation

    To install and run from Gradle, add the following to build.gradle:

    dependencies {
         annotationProcessor 'net.thauvin.erik:semver:1.2.0'
    -    compileOnly 'net.thauvin.erik:semver:1.2.0'
    +    implementation 'net.thauvin.erik:semver:1.2.0'
     }
     

    The GeneratedVersion class will be automatically created in the build/generated directory upon compiling.

    @@ -467,11 +467,17 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni dependencies { kapt(semverProcessor) - compileOnly(semverProcessor) -} -

    As of Kotlin 1.2.30, when using kapt you must include the following in gradle.properties:

    + implementation (semverProcessor) +} + +kapt { + arguments { + arg("semver.project.dir", projectDir) + } +} +

    The arguments block is not required if kapt is configured to use the Gradle Worker API in gradle.properties:

    -

    This option will likely be enabled by default in the future, but is currently not working under Java 10/11 see KT-26203.

    +

    This option will likely be enabled by default in the future, but is currently not working under Java 10+ see KT-26203.

    Please look at the Kotlin example project for a build.gradle.kts sample.

    Kobalt

    To install and run from Kobalt, add the following to Build.kt:

    From 0ca574695fcaceb027b22676774b3b46d30e2c3e Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 25 May 2019 21:03:15 -0700 Subject: [PATCH 204/316] 1.2.0 release update. --- CHANGELOG.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a22e047..43dec57 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,15 +1,18 @@ # Change Log -## [Unreleased](https://github.com/ethauvin/semver/tree/HEAD) - -[Full Changelog](https://github.com/ethauvin/semver/compare/1.1.1...HEAD) +## [1.2.0](https://github.com/ethauvin/semver/tree/1.2.0) (2019-05-25) +[Full Changelog](https://github.com/ethauvin/semver/compare/1.1.1...1.2.0) **Implemented enhancements:** +- Calculate the version internally. [\#4](https://github.com/ethauvin/semver/issues/4) +- Attempt to compile non-existent Java source in Gradle project using Kapt [\#3](https://github.com/ethauvin/semver/issues/3) - kapt and Kotlin 1.3.30 require kapt.use.worker.api=true [\#2](https://github.com/ethauvin/semver/issues/2) **Fixed bugs:** +- Default template is not found in 1.1.1 [\#5](https://github.com/ethauvin/semver/issues/5) +- Attempt to compile non-existent Java source in Gradle project using Kapt [\#3](https://github.com/ethauvin/semver/issues/3) - kapt and Kotlin 1.3.30 require kapt.use.worker.api=true [\#2](https://github.com/ethauvin/semver/issues/2) ## [1.1.1](https://github.com/ethauvin/semver/tree/1.1.1) (2019-03-31) From fb593a0a1a6d1740a55ac1ea799d7729a606fea1 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 26 May 2019 23:47:23 -0700 Subject: [PATCH 205/316] Added JDK 12 and Gradle 5.4.1 instructions. Closes #6 --- README.md | 14 ++++++++++++++ examples/java/build.gradle | 5 +++++ 2 files changed, 19 insertions(+) diff --git a/README.md b/README.md index 7def683..0a5a5ae 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ This processor was inspired by Cédric Beust's [version-processor](https://githu - [Gradle](#gradle) - [Class Generation](#class-generation) - [Class & Source Generation](#class--source-generation) + - [Java 12](#java-12) - [Kotlin](#kotlin) - [Kotlin & Gradle](#kotlin--gradle) - [Kobalt](#kobalt) @@ -222,6 +223,19 @@ compileJava.options.annotationProcessorGeneratedSourcesDirectory = file("${proje The `GeneratedVersion.java` file will now be located in `src/generated`. + +#### Java 12 + +When using properties file (`version.properties`) under Java 12+ and Gradle 5.4.1+, the directory containing the properties file must be specified using the `semver.project.dir` processor argument. + +For example, if the properties file is in the Gradle project directory: + +```gradle +tasks.withType(JavaCompile) { + options.compilerArgs += [ "-Asemver.project.dir=$projectDir" ] +} +``` + Please look at [build.gradle](https://github.com/ethauvin/semver/blob/master/examples/java/build.gradle) in the [Java example](https://github.com/ethauvin/semver/tree/master/examples/java) directory for a sample. ### Kotlin diff --git a/examples/java/build.gradle b/examples/java/build.gradle index 7ae28ab..41fdee3 100644 --- a/examples/java/build.gradle +++ b/examples/java/build.gradle @@ -28,6 +28,11 @@ dependencies { implementation semverProcessor } +// For Java 12+ +tasks.withType(JavaCompile) { + options.compilerArgs += [ "-Asemver.project.dir=$projectDir" ] +} + task runExample(type: JavaExec) { group = 'application' classpath = sourceSets.main.runtimeClasspath From 84054cb39824aa064a1e5c7376ecd54eea5a8f78 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 27 May 2019 11:26:50 -0700 Subject: [PATCH 206/316] Cleanup. --- README.md | 82 ++++++++++++++++++++++++++----------------------------- 1 file changed, 39 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index 0a5a5ae..efd829d 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ # Semantic Version Annotation Processor -[![License (3-Clause BSD)](https://img.shields.io/badge/license-BSD%203--Clause-blue.svg?style=flat-square)](http://opensource.org/licenses/BSD-3-Clause) [![release](https://img.shields.io/github/release/ethauvin/semver.svg)](https://github.com/ethauvin/semver/releases/latest) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver/badge.svg)](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver) [ ![Download](https://api.bintray.com/packages/ethauvin/maven/SemVer/images/download.svg) ](https://bintray.com/ethauvin/maven/SemVer/_latestVersion) +[![License (3-Clause BSD)](https://img.shields.io/badge/license-BSD%203--Clause-blue.svg?style=flat-square)](http://opensource.org/licenses/BSD-3-Clause) [![release](https://img.shields.io/github/release/ethauvin/semver.svg)](https://github.com/ethauvin/semver/releases/latest) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver/badge.svg)](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver) [ ![Download](https://api.bintray.com/packages/ethauvin/maven/SemVer/images/download.svg) ](https://bintray.com/ethauvin/maven/SemVer/_latestVersion)\ [![Known Vulnerabilities](https://snyk.io/test/github/ethauvin/semver/badge.svg?targetFile=build.gradle)](https://snyk.io/test/github/ethauvin/semver?targetFile=build.gradle) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=ethauvin_semver&metric=alert_status)](https://sonarcloud.io/dashboard?id=ethauvin_semver) [![Build Status](https://travis-ci.org/ethauvin/semver.svg?branch=master)](https://travis-ci.org/ethauvin/semver) [![Build status](https://ci.appveyor.com/api/projects/status/nbv4mxd1gpxtx69o?svg=true)](https://ci.appveyor.com/project/ethauvin/semver) [![CircleCI](https://circleci.com/gh/ethauvin/semver/tree/master.svg?style=shield)](https://circleci.com/gh/ethauvin/semver/tree/master) -An [annotation processor](https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html) that automatically generates a `GeneratedVersion` class based on a [Mustache](https://mustache.github.io/) template and containing the [semantic version](http://semver.org/) (major, minor, patch, etc.) that is read from a `Properties` file or defined in the [annotation](https://docs.oracle.com/javase/tutorial/java/annotations/basics.html). +An [annotation processor](https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html) that automatically generates a `GeneratedVersion` class based on a [Mustache](https://mustache.github.io/) template and containing the [semantic version](http://semver.org/) (major, minor, patch, etc.) that is read from a [Properties](https://docs.oracle.com/javase/tutorial/essential/environment/properties.html) file or defined in the [annotation](https://docs.oracle.com/javase/tutorial/java/annotations/basics.html). This processor was inspired by Cédric Beust's [version-processor](https://github.com/cbeust/version-processor) and works well in conjunction with the [__Semantic Version Plugin for Gradle__](https://github.com/ethauvin/semver-gradle). @@ -13,17 +13,16 @@ This processor was inspired by Cédric Beust's [version-processor](https://githu - [Default Template](#default-template) - [Custom Template](#custom-template) - [Elements & Properties](#elements--properties) -- [Usage with Maven, Gradle, Kotlin and Kobalt](#usage-with-maven-gradle-kotlin-and-kobalt) - - [Maven](#maven) - - [Gradle](#gradle) - - [Class Generation](#class-generation) - - [Class & Source Generation](#class--source-generation) - - [Java 12](#java-12) - - [Kotlin](#kotlin) - - [Kotlin & Gradle](#kotlin--gradle) - - [Kobalt](#kobalt) +- [Maven](#maven) +- [Gradle](#gradle) + - [Class Generation](#class-generation) + - [Class & Source Generation](#class--source-generation) + - [Java 12](#java-12) +- [Kotlin](#kotlin) + - [Kotlin & Gradle](#kotlin--gradle) +- [Kobalt](#kobalt) - [Auto-Increment](#auto-increment) - + ## Examples * Using annotation elements: @@ -36,7 +35,7 @@ public class A { // ... ``` -* Or using a [properties](https://docs.oracle.com/javase/tutorial/essential/environment/properties.html) file: +* Or using a [properties](hhttps://github.com/ethauvin/semver/blob/master/examples/java/version.properties) file: ```java import net.thauvin.erik.semver.Version; @@ -54,11 +53,11 @@ version.patch=0 version.prerelease=beta ``` -[View Example](https://github.com/ethauvin/semver/tree/master/examples) +[View Examples](https://github.com/ethauvin/semver/tree/master/examples) ## Template -Upon running the annotation processor, a source file [`GeneratedVersion.java`](https://github.com/ethauvin/semver/blob/master/examples/java/src/generated/java/com/example/GeneratedVersion.java) is automatically generated with static methods to access the semantic version data. The source is based on a fully customizable [Mustache](https://mustache.github.io/) template. +Upon running the annotation processor, a source file [GeneratedVersion.java](https://github.com/ethauvin/semver/blob/master/examples/java/src/generated/java/com/example/GeneratedVersion.java) is automatically generated with static methods to access the semantic version data. The source is based on a fully customizable Mustache [template](https://github.com/ethauvin/semver/blob/master/src/main/resources/semver.mustache). To use your own template, simply create a `version.mustache` file in the project's root directory. The processor will automatically look for it. @@ -72,7 +71,7 @@ public class A { ### Default Template -The [default template](https://github.com/ethauvin/semver/blob/master/src/main/resources/semver.mustache ) implements the following static variables: +The [default template](https://github.com/ethauvin/semver/blob/master/src/main/resources/semver.mustache) implements the following static variables: Field | Description | Example :------------------|:---------------------------------|:----------------- @@ -175,12 +174,10 @@ example.meta= # ... ``` -> :warning: `keysPrefix` is a new element staring in `1.1.0` and may break older versions when using custom property keys. +> :warning: `keysPrefix` is a new element staring in `1.1.0` and may break older versions when using custom property keys.\ > :zap: A quick fix is to include `keysPrefix=""` in the annotation to remove the default `version.` prefix. -## Usage with Maven, Gradle, Kotlin and Kobalt - -### Maven +## Maven To install and run from [Maven](https://maven.apache.org/), configure an artifact as follows: @@ -192,17 +189,17 @@ To install and run from [Maven](https://maven.apache.org/), configure an artifac ``` -Please look at [pom.xml](https://github.com/ethauvin/semver/blob/master/examples/java/pom.xml) in the [Java example](https://github.com/ethauvin/semver/tree/master/examples/java) directory for a sample: +Please look at [pom.xml](https://github.com/ethauvin/semver/blob/master/examples/java/pom.xml) in the [examples/java](https://github.com/ethauvin/semver/tree/master/examples/java) directory for a sample: ```bash mvn verify ``` -### Gradle +## Gradle -#### Class Generation +### Class Generation -To install and run from [Gradle](https://gradle.org/), add the following to `build.gradle`: +To install and run from [Gradle](https://gradle.org/), add the following to [build.gradle](https://github.com/ethauvin/semver/blob/master/examples/java/build.gradle): ```gradle dependencies { @@ -211,24 +208,25 @@ dependencies { } ``` -The `GeneratedVersion` class will be automatically created in the `build/generated` directory upon compiling. +The [`GeneratedVersion.java`](https://github.com/ethauvin/semver/blob/master/examples/java/src/generated/java/com/example/GeneratedVersion.java) class will be automatically created in the `build/generated` directory upon compiling. -#### Class & Source Generation +Please look at [build.gradle](https://github.com/ethauvin/semver/blob/master/examples/java/build.gradle) in the [examples/java](https://github.com/ethauvin/semver/tree/master/examples/java) directory for a sample. -In order to also incorporate the generated source code into the `source tree`, add the following to the very top of `build.gradle`: +### Class & Source Generation + +In order to also incorporate the generated source code into the `source tree`, add the following to the very top of [build.gradle](https://github.com/ethauvin/semver/blob/master/examples/java/build.gradle): ```gradle compileJava.options.annotationProcessorGeneratedSourcesDirectory = file("${projectDir}/src/generated/java") ``` -The `GeneratedVersion.java` file will now be located in `src/generated`. +The [`GeneratedVersion.java`](https://github.com/ethauvin/semver/blob/master/examples/java/src/generated/java/com/example/GeneratedVersion.java) file will now be located in `src/generated`. - -#### Java 12 +### Java 12 When using properties file (`version.properties`) under Java 12+ and Gradle 5.4.1+, the directory containing the properties file must be specified using the `semver.project.dir` processor argument. -For example, if the properties file is in the Gradle project directory: +For example, if the properties file is in the Gradle project directory, add the following to [build.gradle](https://github.com/ethauvin/semver/blob/master/examples/java/build.gradle): ```gradle tasks.withType(JavaCompile) { @@ -236,9 +234,7 @@ tasks.withType(JavaCompile) { } ``` -Please look at [build.gradle](https://github.com/ethauvin/semver/blob/master/examples/java/build.gradle) in the [Java example](https://github.com/ethauvin/semver/tree/master/examples/java) directory for a sample. - -### Kotlin +## Kotlin The annotation processor also supports [Kotlin](https://kotlinlang.org/). @@ -253,9 +249,11 @@ open class Main { ``` The [Kotlin default template](https://github.com/ethauvin/semver/blob/master/src/main/resources/semver-kt.mustache) implements the same static fields and functions as the [Java template](#default-template). -#### Kotlin & Gradle +Please look at the [examples/kotlin](https://github.com/ethauvin/semver/tree/master/examples/kotlin) project for a [build.gradle.kts](https://github.com/ethauvin/semver/blob/master/examples/kotlin/build.gradle.kts) sample. -To install and run from [Gradle](https://gradle.org/), add the following to `build.gradle.kts`: +### Kotlin & Gradle + +To install and run from [Gradle](https://gradle.org/), add the following to [build.gradle.kts](https://github.com/ethauvin/semver/blob/master/examples/kotlin/build.gradle.kts): ```kotlin var semverProcessor = "net.thauvin.erik:semver:1.2.0" @@ -272,19 +270,17 @@ kapt { } ``` -The arguments block is not required if `kapt` is configured to use the Gradle Worker API in `gradle.properties`: +The arguments block is not required if `kapt` is configured to use the Gradle Worker API in [gradle.properties](https://github.com/ethauvin/semver/blob/master/examples/kotlin/gradle.properties): ```ini kapt.use.worker.api=true ``` -This option will likely be enabled by default in the future, but is currently not working under Java 10+ see [KT-26203](https://youtrack.jetbrains.net/issue/KT-26203). +This option will likely be enabled by default in the future, but is currently not working under Java 10+ see [KT-26203](https://youtrack.jetbrains.net/issue/KT-26203). -Please look at the [Kotlin example](https://github.com/ethauvin/semver/tree/master/examples/kotlin) project for a [build.gradle.kts](https://github.com/ethauvin/semver/blob/master/examples/kotlin/build.gradle.kts) sample. +## Kobalt -### Kobalt - -To install and run from [Kobalt](https://beust.com/kobalt/), add the following to `Build.kt`: +To install and run from [Kobalt](https://beust.com/kobalt/), add the following to [Build.kt](https://github.com/ethauvin/semver/blob/master/examples/java/kobalt/src/Build.kt): ```gradle dependencies { @@ -293,7 +289,7 @@ dependencies { } ``` -Please look at [Build.kt](https://github.com/ethauvin/semver/blob/master/examples/java/kobalt/src/Build.kt) in the [Java example](https://github.com/ethauvin/semver/tree/master/examples/java) directory for a sample. +Please look at [Build.kt](https://github.com/ethauvin/semver/blob/master/examples/java/kobalt/src/Build.kt) in the [examples/java](https://github.com/ethauvin/semver/tree/master/examples/java) directory for a sample. ## Auto-Increment From 0e03c6c1c2a877681e265d8f21835bacae1c93ad Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 26 Jul 2019 15:58:51 -0700 Subject: [PATCH 207/316] Gradle 5.5.1 update. --- examples/java/gradle/wrapper/gradle-wrapper.properties | 2 +- examples/java/gradlew | 2 +- examples/java/gradlew.bat | 2 +- examples/kotlin/gradle/wrapper/gradle-wrapper.properties | 2 +- examples/kotlin/gradlew | 2 +- examples/kotlin/gradlew.bat | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 2 +- gradlew.bat | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/java/gradle/wrapper/gradle-wrapper.properties b/examples/java/gradle/wrapper/gradle-wrapper.properties index f4d7b2b..4b7e1f3 100644 --- a/examples/java/gradle/wrapper/gradle-wrapper.properties +++ b/examples/java/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/java/gradlew b/examples/java/gradlew index b0d6d0a..8e25e6c 100755 --- a/examples/java/gradlew +++ b/examples/java/gradlew @@ -7,7 +7,7 @@ # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # -# http://www.apache.org/licenses/LICENSE-2.0 +# https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, diff --git a/examples/java/gradlew.bat b/examples/java/gradlew.bat index 9991c50..9618d8d 100644 --- a/examples/java/gradlew.bat +++ b/examples/java/gradlew.bat @@ -5,7 +5,7 @@ @rem you may not use this file except in compliance with the License. @rem You may obtain a copy of the License at @rem -@rem http://www.apache.org/licenses/LICENSE-2.0 +@rem https://www.apache.org/licenses/LICENSE-2.0 @rem @rem Unless required by applicable law or agreed to in writing, software @rem distributed under the License is distributed on an "AS IS" BASIS, diff --git a/examples/kotlin/gradle/wrapper/gradle-wrapper.properties b/examples/kotlin/gradle/wrapper/gradle-wrapper.properties index f4d7b2b..4b7e1f3 100644 --- a/examples/kotlin/gradle/wrapper/gradle-wrapper.properties +++ b/examples/kotlin/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/kotlin/gradlew b/examples/kotlin/gradlew index b0d6d0a..8e25e6c 100755 --- a/examples/kotlin/gradlew +++ b/examples/kotlin/gradlew @@ -7,7 +7,7 @@ # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # -# http://www.apache.org/licenses/LICENSE-2.0 +# https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, diff --git a/examples/kotlin/gradlew.bat b/examples/kotlin/gradlew.bat index 9991c50..9618d8d 100644 --- a/examples/kotlin/gradlew.bat +++ b/examples/kotlin/gradlew.bat @@ -5,7 +5,7 @@ @rem you may not use this file except in compliance with the License. @rem You may obtain a copy of the License at @rem -@rem http://www.apache.org/licenses/LICENSE-2.0 +@rem https://www.apache.org/licenses/LICENSE-2.0 @rem @rem Unless required by applicable law or agreed to in writing, software @rem distributed under the License is distributed on an "AS IS" BASIS, diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f4d7b2b..4b7e1f3 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index b0d6d0a..8e25e6c 100755 --- a/gradlew +++ b/gradlew @@ -7,7 +7,7 @@ # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # -# http://www.apache.org/licenses/LICENSE-2.0 +# https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, diff --git a/gradlew.bat b/gradlew.bat index 9991c50..9618d8d 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -5,7 +5,7 @@ @rem you may not use this file except in compliance with the License. @rem You may obtain a copy of the License at @rem -@rem http://www.apache.org/licenses/LICENSE-2.0 +@rem https://www.apache.org/licenses/LICENSE-2.0 @rem @rem Unless required by applicable law or agreed to in writing, software @rem distributed under the License is distributed on an "AS IS" BASIS, From 3bd333b6032e9893409741cf065fce0d6231dbef Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 26 Jul 2019 15:59:14 -0700 Subject: [PATCH 208/316] Kobalt 1.0.125 update. --- examples/java/kobalt/wrapper/kobalt-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/java/kobalt/wrapper/kobalt-wrapper.properties b/examples/java/kobalt/wrapper/kobalt-wrapper.properties index bdce6e3..b242015 100644 --- a/examples/java/kobalt/wrapper/kobalt-wrapper.properties +++ b/examples/java/kobalt/wrapper/kobalt-wrapper.properties @@ -1 +1 @@ -kobalt.version=1.0.123 +kobalt.version=1.0.125 From cb07b2e21b065d8de3e1b37288a119e735c43dd9 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 26 Jul 2019 16:01:13 -0700 Subject: [PATCH 209/316] Updated Java 12 syntax. --- README.md | 4 +- docs/README.html | 94 ++++++++++++++++++++------------------ examples/java/build.gradle | 5 +- 3 files changed, 56 insertions(+), 47 deletions(-) diff --git a/README.md b/README.md index efd829d..bf214e3 100644 --- a/README.md +++ b/README.md @@ -230,7 +230,9 @@ For example, if the properties file is in the Gradle project directory, add the ```gradle tasks.withType(JavaCompile) { - options.compilerArgs += [ "-Asemver.project.dir=$projectDir" ] + if (JavaVersion.current().isJava12Compatible()) { + options.compilerArgs += [ "-Asemver.project.dir=$projectDir" ] + } } ``` diff --git a/docs/README.html b/docs/README.html index aaea2f5..cf79f94 100644 --- a/docs/README.html +++ b/docs/README.html @@ -83,7 +83,7 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni

    Semantic Version Annotation Processor

    License (3-Clause BSD) release Maven Central Download
    Known Vulnerabilities Quality Gate Status Build Status Build status CircleCI

    -

    An annotation processor that automatically generates a GeneratedVersion class based on a Mustache template and containing the semantic version (major, minor, patch, etc.) that is read from a Properties file or defined in the annotation.

    +

    An annotation processor that automatically generates a GeneratedVersion class based on a Mustache template and containing the semantic version (major, minor, patch, etc.) that is read from a Properties file or defined in the annotation.

    This processor was inspired by Cédric Beust's version-processor and works well in conjunction with the Semantic Version Plugin for Gradle.

    Table of Contents

      @@ -94,20 +94,18 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni
    • Custom Template
  • Elements & Properties
  • -
  • Usage with Maven, Gradle, Kotlin and Kobalt -
  • Auto-Increment
  • Examples

    @@ -120,7 +118,7 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni public class A { // ...
    import net.thauvin.erik.semver.Version;
     
    @@ -132,9 +130,9 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni
     version.minor=0
     version.patch=0
     version.prerelease=beta
    -

    View Example

    +

    View Examples

    Template

    -

    Upon running the annotation processor, a source file GeneratedVersion.java is automatically generated with static methods to access the semantic version data. The source is based on a fully customizable Mustache template.

    +

    Upon running the annotation processor, a source file GeneratedVersion.java is automatically generated with static methods to access the semantic version data. The source is based on a fully customizable Mustache template.

    To use your own template, simply create a version.mustache file in the project's root directory. The processor will automatically look for it.

    To specify your own template name, use:

    @Version(template = "version.mustache")
    @@ -427,66 +425,74 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni
     

    ⚠️ keysPrefix is a new element staring in 1.1.0 and may break older versions when using custom property keys.
    A quick fix is to include keysPrefix="" in the annotation to remove the default version. prefix.

    -

    Usage with Maven, Gradle, Kotlin and Kobalt

    -

    Maven

    +

    Maven

    To install and run from Maven, configure an artifact as follows:

    -

    Please look at pom.xml in the Java example directory for a sample:

    +

    Please look at pom.xml in the examples/java directory for a sample:

    -

    Gradle

    -

    Class Generation

    -

    To install and run from Gradle, add the following to build.gradle:

    +

    Gradle

    +

    Class Generation

    +

    To install and run from Gradle, add the following to build.gradle:

    dependencies {
         annotationProcessor 'net.thauvin.erik:semver:1.2.0'
         implementation 'net.thauvin.erik:semver:1.2.0'
     }
     
    -

    The GeneratedVersion class will be automatically created in the build/generated directory upon compiling.

    -

    Class & Source Generation

    -

    In order to also incorporate the generated source code into the source tree, add the following to the very top of build.gradle:

    +

    The GeneratedVersion.java class will be automatically created in the build/generated directory upon compiling.

    +

    Please look at build.gradle in the examples/java directory for a sample.

    +

    Class & Source Generation

    +

    In order to also incorporate the generated source code into the source tree, add the following to the very top of build.gradle:

    compileJava.options.annotationProcessorGeneratedSourcesDirectory = file("${projectDir}/src/generated/java")
     
    -

    The GeneratedVersion.java file will now be located in src/generated.

    -

    Please look at build.gradle in the Java example directory for a sample.

    -

    Kotlin

    +

    The GeneratedVersion.java file will now be located in src/generated.

    +

    Java 12

    +

    When using properties file (version.properties) under Java 12+ and Gradle 5.4.1+, the directory containing the properties file must be specified using the semver.project.dir processor argument.

    +

    For example, if the properties file is in the Gradle project directory, add the following to build.gradle:

    +
    tasks.withType(JavaCompile) {
    +    if (JavaVersion.current().isJava12Compatible()) {
    +        options.compilerArgs += [ "-Asemver.project.dir=$projectDir" ]
    +    }
    +}
    +
    +

    Kotlin

    The annotation processor also supports Kotlin.

    To generate a Kotlin version file, simply specify the type as follows:

    - -

    The Kotlin default template implements the same static fields and functions as the Java template.

    -

    Kotlin & Gradle

    -

    To install and run from Gradle, add the following to build.gradle.kts:

    - +

    The Kotlin default template implements the same static fields and functions as the Java template.

    +

    Please look at the examples/kotlin project for a build.gradle.kts sample.

    +

    Kotlin & Gradle

    +

    To install and run from Gradle, add the following to build.gradle.kts:

    + +

    The arguments block is not required if kapt is configured to use the Gradle Worker API in gradle.properties:

    +

    This option will likely be enabled by default in the future, but is currently not working under Java 10+ see KT-26203.

    -

    Please look at the Kotlin example project for a build.gradle.kts sample.

    -

    Kobalt

    -

    To install and run from Kobalt, add the following to Build.kt:

    +

    Kobalt

    +

    To install and run from Kobalt, add the following to Build.kt:

    dependencies {
         apt("net.thauvin.erik:semver:1.2.0")
         compileOnly("net.thauvin.erik:semver:1.2.0")
     }
     
    -

    Please look at Build.kt in the Java example directory for a sample.

    +

    Please look at Build.kt in the examples/java directory for a sample.

    Auto-Increment

    Incrementing the version is best left to your favorite build system. For a solution using Gradle, please have a look at the Semver Version Plugin for Gradle.

    There are also full examples in both Java and Kotlin showing how to use both the plugin and annotation processor concurrently.

    diff --git a/examples/java/build.gradle b/examples/java/build.gradle index 41fdee3..20d7757 100644 --- a/examples/java/build.gradle +++ b/examples/java/build.gradle @@ -28,9 +28,10 @@ dependencies { implementation semverProcessor } -// For Java 12+ tasks.withType(JavaCompile) { - options.compilerArgs += [ "-Asemver.project.dir=$projectDir" ] + if (JavaVersion.current().isJava12Compatible()) { + options.compilerArgs += [ "-Asemver.project.dir=$projectDir" ] + } } task runExample(type: JavaExec) { From 5146d46eabb1a16856aa3465f8b51d06f31b5262 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 26 Jul 2019 16:04:19 -0700 Subject: [PATCH 210/316] Semver-Gradle 1.0.4 update. --- build.gradle | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index ed37251..28d70aa 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ plugins { id 'pmd' id 'com.jfrog.bintray' version '1.8.4' id 'com.github.ben-manes.versions' version '0.21.0' - id 'net.thauvin.erik.gradle.semver' version '1.0.2' + id 'net.thauvin.erik.gradle.semver' version '1.0.4' id 'com.github.spotbugs' version '2.0.0' id 'org.sonarqube' version '2.7.1' } @@ -44,10 +44,10 @@ dependencies { implementation 'com.github.spullara.mustache.java:compiler:0.9.6' spotbugsPlugins 'com.h3xstream.findsecbugs:findsecbugs-plugin:1.9.0' - spotbugsPlugins 'com.mebigfatguy.fb-contrib:fb-contrib:7.4.5' + spotbugsPlugins 'com.mebigfatguy.fb-contrib:fb-contrib:7.4.6' - compileOnly 'com.github.spotbugs:spotbugs-annotations:4.0.0-beta2' - testCompileOnly 'com.github.spotbugs:spotbugs-annotations:4.0.0-beta2' + compileOnly 'com.github.spotbugs:spotbugs-annotations:4.0.0-beta3' + testCompileOnly 'com.github.spotbugs:spotbugs-annotations:4.0.0-beta3' testImplementation 'org.testng:testng:6.14.3' @@ -68,6 +68,7 @@ bintray { name = mavenName licenses = pkgLicenses desc = mavenDescription + //released = new Date() websiteUrl = mavenUrl issueTrackerUrl = pkgIssueTrackerUrl vcsUrl = mavenScmCon From 961a9535de435b6d1e76966e196e5d5e2bf597b6 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 26 Jul 2019 16:07:03 -0700 Subject: [PATCH 211/316] Changed dist to trusty. --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index f2a55d1..0161fc0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,5 @@ language: java +dist: trusty jdk: - oraclejdk8 From ae44b3628374a67d88618f8141188e78f45b7752 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 26 Jul 2019 21:17:49 -0700 Subject: [PATCH 212/316] Moved to Kotlin 1.3.41. Fixes #1 --- README.md | 10 ++-------- examples/kotlin/build.gradle.kts | 4 ++-- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index bf214e3..40d0c89 100644 --- a/README.md +++ b/README.md @@ -262,7 +262,7 @@ var semverProcessor = "net.thauvin.erik:semver:1.2.0" dependencies { kapt(semverProcessor) - implementation (semverProcessor) + implementation(semverProcessor) } kapt { @@ -272,13 +272,7 @@ kapt { } ``` -The arguments block is not required if `kapt` is configured to use the Gradle Worker API in [gradle.properties](https://github.com/ethauvin/semver/blob/master/examples/kotlin/gradle.properties): - -```ini -kapt.use.worker.api=true -``` - -This option will likely be enabled by default in the future, but is currently not working under Java 10+ see [KT-26203](https://youtrack.jetbrains.net/issue/KT-26203). +The directory containing the properties file (`version.properties`) must be specified using the `semver.project.dir` processor argument. ## Kobalt diff --git a/examples/kotlin/build.gradle.kts b/examples/kotlin/build.gradle.kts index c3814c5..d6b19ed 100644 --- a/examples/kotlin/build.gradle.kts +++ b/examples/kotlin/build.gradle.kts @@ -1,7 +1,7 @@ plugins { - kotlin("jvm").version("1.3.31") + kotlin("jvm").version("1.3.41") application - id("org.jetbrains.kotlin.kapt").version("1.3.31") + id("org.jetbrains.kotlin.kapt").version("1.3.41") id("com.github.ben-manes.versions").version("0.21.0") } From 14a72542ff3e17693be29a68eff28b294d7688a9 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 27 Jul 2019 14:11:43 -0700 Subject: [PATCH 213/316] Updated compiler option syntax. --- README.md | 12 +++++++----- examples/java/build.gradle | 3 +-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 40d0c89..e6080af 100644 --- a/README.md +++ b/README.md @@ -214,19 +214,21 @@ Please look at [build.gradle](https://github.com/ethauvin/semver/blob/master/exa ### Class & Source Generation -In order to also incorporate the generated source code into the `source tree`, add the following to the very top of [build.gradle](https://github.com/ethauvin/semver/blob/master/examples/java/build.gradle): +In order to also incorporate the generated source code into the `source tree`, add the following to [build.gradle](https://github.com/ethauvin/semver/blob/master/examples/java/build.gradle): ```gradle -compileJava.options.annotationProcessorGeneratedSourcesDirectory = file("${projectDir}/src/generated/java") +tasks.withType(JavaCompile) { + options.annotationProcessorGeneratedSourcesDirectory = file("${projectDir}/src/generated/java") +} ``` The [`GeneratedVersion.java`](https://github.com/ethauvin/semver/blob/master/examples/java/src/generated/java/com/example/GeneratedVersion.java) file will now be located in `src/generated`. ### Java 12 -When using properties file (`version.properties`) under Java 12+ and Gradle 5.4.1+, the directory containing the properties file must be specified using the `semver.project.dir` processor argument. +Under Java 12+ (Gradle 5.4.1+), the directory containing the configuration files (`version.properties`, `version.mustache`) must be specified using the `semver.project.dir` processor argument. -For example, if the properties file is in the Gradle project directory, add the following to [build.gradle](https://github.com/ethauvin/semver/blob/master/examples/java/build.gradle): +For example, if the configuration files are in the Gradle project directory, add the following to [build.gradle](https://github.com/ethauvin/semver/blob/master/examples/java/build.gradle): ```gradle tasks.withType(JavaCompile) { @@ -272,7 +274,7 @@ kapt { } ``` -The directory containing the properties file (`version.properties`) must be specified using the `semver.project.dir` processor argument. +The directory containing the configuration files (`version.properties`, `version.mustache`) must be specified using the `semver.project.dir` processor argument. ## Kobalt diff --git a/examples/java/build.gradle b/examples/java/build.gradle index 20d7757..da23155 100644 --- a/examples/java/build.gradle +++ b/examples/java/build.gradle @@ -14,8 +14,6 @@ final def semverProcessor = 'net.thauvin.erik:semver:1.2.0' sourceCompatibility = 1.8 targetCompatibility = 1.8 -compileJava.options.annotationProcessorGeneratedSourcesDirectory = file("${projectDir}/src/generated/java") - mainClassName = 'com.example.App' repositories { @@ -29,6 +27,7 @@ dependencies { } tasks.withType(JavaCompile) { + options.annotationProcessorGeneratedSourcesDirectory = file("${projectDir}/src/generated/java") if (JavaVersion.current().isJava12Compatible()) { options.compilerArgs += [ "-Asemver.project.dir=$projectDir" ] } From 1580bfca984ef724b9c7f3a81ee129dd02324be1 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 28 Jul 2019 21:37:40 -0700 Subject: [PATCH 214/316] Removed Java 12 syntax. --- README.md | 21 ++++++--------------- examples/java/build.gradle | 4 +--- examples/test/build.gradle | 5 +++-- 3 files changed, 10 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index e6080af..aa97564 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,6 @@ This processor was inspired by Cédric Beust's [version-processor](https://githu - [Gradle](#gradle) - [Class Generation](#class-generation) - [Class & Source Generation](#class--source-generation) - - [Java 12](#java-12) - [Kotlin](#kotlin) - [Kotlin & Gradle](#kotlin--gradle) - [Kobalt](#kobalt) @@ -206,8 +205,14 @@ dependencies { annotationProcessor 'net.thauvin.erik:semver:1.2.0' implementation 'net.thauvin.erik:semver:1.2.0' } + +tasks.withType(JavaCompile) { + options.compilerArgs += [ "-Asemver.project.dir=$projectDir" ] +} ``` +The directory containing the configuration files (`version.properties`, `version.mustache`) must be specified using the `semver.project.dir` processor argument. + The [`GeneratedVersion.java`](https://github.com/ethauvin/semver/blob/master/examples/java/src/generated/java/com/example/GeneratedVersion.java) class will be automatically created in the `build/generated` directory upon compiling. Please look at [build.gradle](https://github.com/ethauvin/semver/blob/master/examples/java/build.gradle) in the [examples/java](https://github.com/ethauvin/semver/tree/master/examples/java) directory for a sample. @@ -224,20 +229,6 @@ tasks.withType(JavaCompile) { The [`GeneratedVersion.java`](https://github.com/ethauvin/semver/blob/master/examples/java/src/generated/java/com/example/GeneratedVersion.java) file will now be located in `src/generated`. -### Java 12 - -Under Java 12+ (Gradle 5.4.1+), the directory containing the configuration files (`version.properties`, `version.mustache`) must be specified using the `semver.project.dir` processor argument. - -For example, if the configuration files are in the Gradle project directory, add the following to [build.gradle](https://github.com/ethauvin/semver/blob/master/examples/java/build.gradle): - -```gradle -tasks.withType(JavaCompile) { - if (JavaVersion.current().isJava12Compatible()) { - options.compilerArgs += [ "-Asemver.project.dir=$projectDir" ] - } -} -``` - ## Kotlin The annotation processor also supports [Kotlin](https://kotlinlang.org/). diff --git a/examples/java/build.gradle b/examples/java/build.gradle index da23155..d67c02b 100644 --- a/examples/java/build.gradle +++ b/examples/java/build.gradle @@ -28,9 +28,7 @@ dependencies { tasks.withType(JavaCompile) { options.annotationProcessorGeneratedSourcesDirectory = file("${projectDir}/src/generated/java") - if (JavaVersion.current().isJava12Compatible()) { - options.compilerArgs += [ "-Asemver.project.dir=$projectDir" ] - } + options.compilerArgs += [ "-Asemver.project.dir=$projectDir" ] } task runExample(type: JavaExec) { diff --git a/examples/test/build.gradle b/examples/test/build.gradle index 7bc55ae..6a3587b 100644 --- a/examples/test/build.gradle +++ b/examples/test/build.gradle @@ -14,7 +14,7 @@ final def semverProcessor = 'net.thauvin.erik:semver:1.2.0' sourceCompatibility = 1.8 targetCompatibility = 1.8 -compileJava.options.annotationProcessorGeneratedSourcesDirectory = file("${projectDir}/src/generated/java") +compileJava. mainClassName = 'com.example.Example' @@ -29,5 +29,6 @@ dependencies { } tasks.withType(JavaCompile) { - options.compilerArgs += [ "-Asemver.project.dir=${projectDir}/example" ] + options.annotationProcessorGeneratedSourcesDirectory = file("${projectDir}/src/generated/java") + options.compilerArgs += [ "-Asemver.project.dir=${projectDir}/example" ] } From ee1d28a7b9b0305a1f183d0e91fc88fd2bfe58b9 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 29 Jul 2019 11:55:40 -0700 Subject: [PATCH 215/316] Switched to com.mebigfatguy.sb-contrib. --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 28d70aa..a07ca1a 100644 --- a/build.gradle +++ b/build.gradle @@ -44,7 +44,7 @@ dependencies { implementation 'com.github.spullara.mustache.java:compiler:0.9.6' spotbugsPlugins 'com.h3xstream.findsecbugs:findsecbugs-plugin:1.9.0' - spotbugsPlugins 'com.mebigfatguy.fb-contrib:fb-contrib:7.4.6' + spotbugsPlugins 'com.mebigfatguy.sb-contrib:sb-contrib:7.4.6' compileOnly 'com.github.spotbugs:spotbugs-annotations:4.0.0-beta3' testCompileOnly 'com.github.spotbugs:spotbugs-annotations:4.0.0-beta3' From 6d48ec62038588b97377691ddad915e59524b39f Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Tue, 30 Jul 2019 21:16:53 -0700 Subject: [PATCH 216/316] Cleanup. --- build.gradle | 5 ++++- docs/README.html | 57 ++++++++++++++++++++++-------------------------- 2 files changed, 30 insertions(+), 32 deletions(-) diff --git a/build.gradle b/build.gradle index a07ca1a..59a862e 100644 --- a/build.gradle +++ b/build.gradle @@ -32,7 +32,6 @@ final def pkgLabels = ['java', 'kotlin', 'annotation', 'processor', 'semantic', sourceCompatibility = 1.8 targetCompatibility = 1.8 -[compileJava, compileTestJava]*.options*.encoding = 'UTF-8' repositories { mavenLocal() @@ -53,6 +52,10 @@ dependencies { testImplementation 'org.testng:testng:6.14.3' } +tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' +} + pmd { ruleSetFiles = files("config/pmd.xml") ruleSets = [] diff --git a/docs/README.html b/docs/README.html index cf79f94..1235a99 100644 --- a/docs/README.html +++ b/docs/README.html @@ -99,7 +99,6 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni
  • Kotlin
      @@ -441,50 +440,46 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni annotationProcessor 'net.thauvin.erik:semver:1.2.0' implementation 'net.thauvin.erik:semver:1.2.0' } + +tasks.withType(JavaCompile) { + options.compilerArgs += [ "-Asemver.project.dir=$projectDir" ] +}
  • +

    The directory containing the configuration files (version.properties, version.mustache) must be specified using the semver.project.dir processor argument.

    The GeneratedVersion.java class will be automatically created in the build/generated directory upon compiling.

    Please look at build.gradle in the examples/java directory for a sample.

    Class & Source Generation

    -

    In order to also incorporate the generated source code into the source tree, add the following to the very top of build.gradle:

    -
    compileJava.options.annotationProcessorGeneratedSourcesDirectory = file("${projectDir}/src/generated/java")
    -
    -

    The GeneratedVersion.java file will now be located in src/generated.

    -

    Java 12

    -

    When using properties file (version.properties) under Java 12+ and Gradle 5.4.1+, the directory containing the properties file must be specified using the semver.project.dir processor argument.

    -

    For example, if the properties file is in the Gradle project directory, add the following to build.gradle:

    +

    In order to also incorporate the generated source code into the source tree, add the following to build.gradle:

    tasks.withType(JavaCompile) {
    -    if (JavaVersion.current().isJava12Compatible()) {
    -        options.compilerArgs += [ "-Asemver.project.dir=$projectDir" ]
    -    }
    +    options.annotationProcessorGeneratedSourcesDirectory = file("${projectDir}/src/generated/java")
     }
     
    +

    The GeneratedVersion.java file will now be located in src/generated.

    Kotlin

    The annotation processor also supports Kotlin.

    To generate a Kotlin version file, simply specify the type as follows:

    - +

    The Kotlin default template implements the same static fields and functions as the Java template.

    Please look at the examples/kotlin project for a build.gradle.kts sample.

    Kotlin & Gradle

    To install and run from Gradle, add the following to build.gradle.kts:

    - -

    The arguments block is not required if kapt is configured to use the Gradle Worker API in gradle.properties:

    - -

    This option will likely be enabled by default in the future, but is currently not working under Java 10+ see KT-26203.

    + +

    The directory containing the configuration files (version.properties, version.mustache) must be specified using the semver.project.dir processor argument.

    Kobalt

    To install and run from Kobalt, add the following to Build.kt:

    dependencies {
    
    From f8101bb2e9c4841f824e9cff83b9669d890f4458 Mon Sep 17 00:00:00 2001
    From: "Erik C. Thauvin" 
    Date: Tue, 17 Mar 2020 22:39:29 -0700
    Subject: [PATCH 217/316] Updated dependencies and copyright.
    
    ---
     .circleci/config.yml                          |   3 +-
     .gitignore                                    |  53 +++++++++---------
     .idea/jarRepositories.xml                     |  30 ++++++++++
     .idea/misc.xml                                |   3 +
     .idea/modules/examples-kotlin_main.iml        |  23 ++++++--
     .idea/modules/examples-kotlin_test.iml        |  23 ++++++--
     LICENSE.txt                                   |   2 +-
     README.md                                     |   4 +-
     build.gradle                                  |  47 ++++++++++------
     config/checkstyle/checkstyle.xml              |  26 ++++++---
     config/pmd.xml                                |  34 +++++++----
     .../java/gradle/wrapper/gradle-wrapper.jar    | Bin 55616 -> 58695 bytes
     .../gradle/wrapper/gradle-wrapper.properties  |   2 +-
     examples/java/gradlew                         |  33 +++++------
     examples/java/gradlew.bat                     |   3 +
     .../kobalt/wrapper/kobalt-wrapper.properties  |   2 +-
     .../kotlin/gradle/wrapper/gradle-wrapper.jar  | Bin 55616 -> 58695 bytes
     .../gradle/wrapper/gradle-wrapper.properties  |   2 +-
     examples/kotlin/gradlew                       |  33 +++++------
     examples/kotlin/gradlew.bat                   |   3 +
     gradle/wrapper/gradle-wrapper.jar             | Bin 55616 -> 58695 bytes
     gradle/wrapper/gradle-wrapper.properties      |   2 +-
     gradlew                                       |  33 +++++------
     gradlew.bat                                   |   3 +
     .../net/thauvin/erik/semver/Constants.java    |   2 +-
     .../java/net/thauvin/erik/semver/Version.java |   2 +-
     .../net/thauvin/erik/semver/VersionInfo.java  |   4 +-
     .../thauvin/erik/semver/VersionProcessor.java |   2 +-
     .../thauvin/erik/semver/ConstantsTest.java    |   2 +-
     .../thauvin/erik/semver/VersionInfoTest.java  |   2 +-
     .../erik/semver/VersionProcessorTest.java     |   2 +-
     .../net/thauvin/erik/semver/VersionTest.java  |   2 +-
     32 files changed, 233 insertions(+), 149 deletions(-)
     create mode 100644 .idea/jarRepositories.xml
    
    diff --git a/.circleci/config.yml b/.circleci/config.yml
    index 1b19e22..4690865 100644
    --- a/.circleci/config.yml
    +++ b/.circleci/config.yml
    @@ -1,3 +1,4 @@
    +version: 2
     defaults: &defaults
       working_directory: ~/repo
       docker:
    @@ -6,8 +7,6 @@ defaults: &defaults
         JVM_OPTS: -Xmx3200m
         TERM: dumb
     
    -version: 2.0
    -
     jobs:
       build_gradle:
         <<: *defaults
    diff --git a/.gitignore b/.gitignore
    index e439b59..f007981 100644
    --- a/.gitignore
    +++ b/.gitignore
    @@ -1,32 +1,14 @@
    +.vscode/*
     !.vscode/extensions.json
     !.vscode/launch.json
     !.vscode/settings.json
     !.vscode/tasks.json
    -!gradle-wrapper.jar
    +
    +__pycache__
     .classpath
     .DS_Store
     .gradle
     .history
    -.idea_modules/
    -.idea/**/contentModel.xml
    -.idea/**/dataSources.ids
    -.idea/**/dataSources.local.xml
    -.idea/**/dataSources/
    -.idea/**/dbnavigator.xml
    -.idea/**/dictionaries
    -.idea/**/dynamic.xml
    -.idea/**/gradle.xml
    -.idea/**/libraries
    -.idea/**/mongoSettings.xml
    -.idea/**/shelf
    -.idea/**/sqlDataSources.xml
    -.idea/**/tasks.xml
    -.idea/**/uiDesigner.xml
    -.idea/**/usage.statistics.xml
    -.idea/**/workspace.xml
    -.idea/caches/build_file_checksums.ser
    -.idea/httpRequests
    -.idea/replstate.xml
     .kobalt
     .mtj.tmp/
     .mvn/timing.properties
    @@ -35,24 +17,42 @@
     .project
     .scannerwork
     .settings
    -.vscode/*
     *.class
     *.code-workspace
     *.ctxt
    -*.ear
     *.iws
    -*.jar
     *.log
     *.nar
     *.rar
     *.sublime-*
     *.tar.gz
    -*.war
     *.zip
    +/**/.idea_modules/
    +/**/.idea/**/caches/build_file_checksums.ser
    +/**/.idea/**/contentModel.xml
    +/**/.idea/**/dataSources.ids
    +/**/.idea/**/dataSources.local.xml
    +/**/.idea/**/dataSources/
    +/**/.idea/**/dbnavigator.xml
    +/**/.idea/**/dictionaries
    +/**/.idea/**/dynamic.xml
    +/**/.idea/**/gradle.xml
    +/**/.idea/**/httpRequests
    +/**/.idea/**/libraries
    +/**/.idea/**/mongoSettings.xml
    +/**/.idea/**/replstate.xml
    +/**/.idea/**/shelf
    +/**/.idea/**/shelf/
    +/**/.idea/**/sqlDataSources.xml
    +/**/.idea/**/tasks.xml
    +/**/.idea/**/uiDesigner.xml
    +/**/.idea/**/usage.statistics.xml
    +/**/.idea/**/workspace.xml
    +/**/.idea/$CACHE_FILE$
    +/**/.idea/$PRODUCT_WORKSPACE_FILE$
     atlassian-ide-plugin.xml
     bin/
     build/
    -buildNumber.properties
     cmake-build-*/
     com_crashlytics_export_strings.xml
     crashlytics-build.properties
    @@ -81,3 +81,4 @@ release.properties
     target/
     test-output
     Thumbs.db
    +venv
    diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
    new file mode 100644
    index 0000000..d32dd97
    --- /dev/null
    +++ b/.idea/jarRepositories.xml
    @@ -0,0 +1,30 @@
    +
    +
    +  
    +    
    +      
    +    
    +      
    +    
    +      
    +    
    +      
    +    
    +      
    +  
    +
    \ No newline at end of file
    diff --git a/.idea/misc.xml b/.idea/misc.xml
    index 361f8c9..5ae2566 100644
    --- a/.idea/misc.xml
    +++ b/.idea/misc.xml
    @@ -1,6 +1,9 @@
     
     
       
    +  
    +    
    +  
       
         
    diff --git a/.idea/modules/examples-kotlin_main.iml b/.idea/modules/examples-kotlin_main.iml
    index 487e0be..4aeac9a 100644
    --- a/.idea/modules/examples-kotlin_main.iml
    +++ b/.idea/modules/examples-kotlin_main.iml
    @@ -2,23 +2,34 @@
     
       
         
    -      
    -        
    +      
    +        
    +          
             
               
               
               

    The directory containing the configuration files (version.properties, version.mustache) must be specified using the semver.project.dir processor argument.

    -

    Kobalt

    -

    To install and run from Kobalt, add the following to Build.kt:

    -
    dependencies {
    -    apt("net.thauvin.erik:semver:1.2.0")
    -    compileOnly("net.thauvin.erik:semver:1.2.0")
    -}
    -
    -

    Please look at Build.kt in the examples/java directory for a sample.

    Auto-Increment

    Incrementing the version is best left to your favorite build system. For a solution using Gradle, please have a look at the Semver Version Plugin for Gradle.

    There are also full examples in both Java and Kotlin showing how to use both the plugin and annotation processor concurrently.

    diff --git a/examples/java/build.gradle b/examples/java/build.gradle index 07de9b6..d455791 100644 --- a/examples/java/build.gradle +++ b/examples/java/build.gradle @@ -1,7 +1,7 @@ plugins { id 'java' id 'application' - id 'com.github.ben-manes.versions' version '0.28.0' + id 'com.github.ben-manes.versions' version '0.38.0' } // ./gradlew run diff --git a/examples/java/gradle/wrapper/gradle-wrapper.jar b/examples/java/gradle/wrapper/gradle-wrapper.jar index 62d4c053550b91381bbd28b1afc82d634bf73a8a..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f 100644 GIT binary patch delta 6656 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 Yte!%o?r4GTrVtxD61Ym!|5fq-1K$0e!T1w z1SC8j)_dObefzK9b=~*c&wBRW>;B{VGKiBofK!FMN5oJBE0V;;!kWUz!jc1W?5KdY zyZ3mCBHprpchz-9{ASiJJh&&h1|4rdw6wxD2+9= z#6#}Uq8&^1F3wgvGFoNDo?bIeEQXpcuAR0-+w$JWoK-@yUal1M&~W_O)r+Rx;{@hWH5n^oQWR36GMYBDDZyPK4L@WVjRrF+XlSzi4X4!_!U%Uujl6LHQ#|l(sUU%{ zefYd8jnVYP91K}Qn-OmmSLYFK1h~_}RPS~>+Xdz%dpvpJ{ll!IKX=JN99qowqslbO zV3DmqPZ}6>KB!9>jEObpi$u5oGPfO3O5!o3N2Mn`ozpje<}1I1H)m2rJDcB7AwXc6 z6j)tnPiql7#)r+b+p9?MVahp&=qJ^$oG+a^C*);FoJ!+V*^W+|2Olx5{*&$bXth)U zejc7mU6cBp?^Rj|dd{GL-0eHRTBi6_yJ&GLP5kIncv^z{?=0AVy^5{S8_n=rtua!J zFGY=A(yV^ZhB}1J_y(F`3QTu+zkHlw;1GiFeP&pw0N1k%NShHlO(4W+(!wy5phcg4 zA-|}(lE_1@@e6y`veg;v7m;q%(PFG&K3#}eRhJioXUU0jg_8{kn$;KVwf;zpL2X_( zC*_R#5*PaBaY73(x*oZ}oE#HPLJQRQ7brNK=v!lsu==lSG1(&q>F)`adBT~d*lMS| z%!%7(p~<7kWNmpZ5-N31*e=8`kih|g5lVrI%2wnLF-2D+G4k6@FrYsJ_80AJ}KMRi>) z-kIeHp{maorNWkF81v0FKgB==_6blyaF$5GaW)B!i4v*jNk6r)vU6?G$0pV8(Y+UK z5lgRVt%;N_gWp)^osv=h+^07UY6+$4^#t=M3>0i0`{`aEkFLL#a)93uXhYO+aKTtu zckg2T9S&GKNtZmdAS^8PzvDva-%-K&g9eqPXQ4$dM^inr@6Zl z{!Cq&C_+V;g*{>!0cZP}?ogDb$#ZS=n@NHE{>k@84lOkl&$Bt2NF)W%GClViJq14_ zQIfa^q+0aq){}CO8j%g%R9|;G0uJuND*HO$2i&U_uW_a5xJ33~(Vy?;%6_(2_Cuq1 zLhThN@xH7-BaNtkKTn^taQHrs$<<)euc6z(dhps>SM;^Wx=7;O&IfNVJq3wk4<1VS z-`*7W4DR_i^W4=dRh>AXi~J$K>`UqP>CKVVH&+T(ODhRJZO7DScU$F7D)di-%^8?O z6)Ux`zdrVOe1GNkPo0FgrrxSu1AGQkJe@pqu}8LkBDm+V!N_1l}`tjLW8${rgDLv3m@E*#zappt-Mm zSC<$o+6UO~w0C=(0$&*y**@nKe_Q{|eAuD!(0YL0_a{z%+sdfSyP={Nyd$re6Rzbp zvsgTY7~VflX0^Vf7qqomYZ_$ryrFVV2$sFyzw2r%Q8*uYDA+)iQdfKms_5(>!s#!( z!P5S(N0i9CKQKaqg(U%Gk#V3*?)lO6dLv`8KB~F<-%VhbtL8Rl>mEz+PN=qx&t*|= zQHV=qG)YKlPk4iCyWIUGjC?kpeA>hIBK*A?B0)rB=RqAal#D%1C9yVQwBcz${#Jb5 zR{TRmMrOrJsLc&6x9qDo@FJ^=do_Y?3oU0G^nV5_EU&+DS+VA7Tp{^TAF>yZbyM3c zf*1CqHY9T|aL_lyY7c)i!_MtGPA!sdy3|mrsKVj1mi&>dms@-ozSa}OZ?2I*tAndg z@S7er$t^d^-;!wLQbG60nWd@1pQVD7tw-G_B#OscoYyremiZ_hj8*sXqQdchuD^!R zpXGuSj5psk+jR>3rWu3^`17>j&*^9^rWbszP=Mf@5KIEj%b=z98v=Ymp%$FYt>%Ld zm8})EDbNOJu9n)gwhz_RS``#Ag)fr)3<*?(!9O~mTQWeh;8c;0@o=iBLQNqx3d_2#W7S9#FXzr6VXfs>4 z;QXw}-STvK9_-7H=uqgal2{GkbjVLN+=D5ddd)4^WvX;(NYA*X*(JxTdiUzqVJopd zQg#~psX4o<)cF>r=rxP`(Xsf<+HG-pf&7aFPL8z|-&B*P?Vmsu5d>Nlg^2$WRY!S@#`g2{81;(1w#o5HsvN}5pFZi});>|VK^kL{Zkx~wgn ztlZp;HW`H8(GdRfIwc~?#N6}o#h158ohI*GIsK%56I_9sf2k_K@4vD!l{(dX9E7PJ;w>$|Y;-VBJSO4@){07bo-89^LZ9g<<%;dOl zyIq{s8`8Ltp*GDwu(l_Z$6sA2nam$BM$Q~6TpZg)w2TtW?G5whV(lRwaf$6EU86is zBP9Rs&vS_~sk?Nn_b}^HkM8LiO@>J}=g(T4hLmvH@5Jj#2aHa~K)lD9VB0k>$V2BP zgh;(=y9Op(KQ=H5vj+%qs>?s4tYN~-Q|fyQePA)s?HrF~;l!+@t8VMzqUpqMLudFT z)=o~s!MM4XkgbetIsODwtQ=FF$IcIp&!pjh6Q6{tL+l*7GQ%8Wsg(tC#qU3oW$~n) zL=>XIxI}Hi7HS0F_mmi+(c%1HDuKiWm>|6Xa}nW7ei55ggru9)xjBvC#JcEIN*#cp zv*ACvr=HTC?dX9NNo9Yhulu_gX5Z~}QQ2&QZ&C77{(>Y3_ z6j5Z1Uc5FtPEpS_31HsgmSLHZijGb_p$WlRJ1p^_1!ZLP8kr6OtCEK7Qh267o$H>e zf<4cNGQRk{g5h$XfvTFQ@`qm@iju83-~}ebAYpZryARHVR$AEt3229U{y@Fp4 z-8FBBtGG&(hTyUdx5ZOfiz`c=<0F%+w|Fl=rWk{K7>70k04SN?RU(^mrKSeKDqA!K^Hsv8C?#ioj4@WUL zC*?{hTai6q0%_oBTqDHygp_Kl;({sAScYQIwMDM1U>{x0ww zve?_}E;DG?+|zsUrsph5X_G7l#Y~vqkq3@NNDabbw7|`eJBmn`Qrlr%?`va=mm$Mc{+FBbQbogAZ6{MuzT|P%QZZotd21eb1hfj|;GYAX&>bx#D5EB+=XMj2XJkpnyMUykaVo) zj3ZLqEl1&)Rturc8m@+uUuD^vaNaSxGwP4dq0-OSb~62lPv8E_K4usLvG{Qg zdR%z8dd2H!{JaT|X_bfm{##*W$YM;_J8Y8&Z)*ImOAf4+| zEyi)qK%Ld1bHuqD+}-WiCnjszDeC-%8g+8JRpG1bOc!xUGB?@?6f~FTrI%U#5R~YF z%t5(S2Q>?0`(XNHa8xKdTEZ~Z4SJOheit#ldfdg63}#W6j8kO;SjQD`vftxS+#x1B zYu|5szEvkyz|}|B3x|DNlyi$;+n+cW$Hu+?)=X1!sa%{H-^;oBO9XACZJ}wkQ!sTa zQ#J3h|HX{{&WwIG3h7d6aWktuJaO)ie6&=KJBoX@w(rBWfin`*a6OmCC5M0HzL(gv zY<*e4hmW>SWVhxk-`UGOAbD%Hk+uu<^7zJ_ytVXamfqCd0$g+W08>?QAB}Cv{b}eM z@X}ILg+uT%>-6`A25p@uhS3%;u>ccSq}8|H_^o&`nBT5S0y z;2H0I^(4MO*S+(4l$gULc4KSeKvidto5Nl0P|%9CqQ*ikY!w_GUlo}sb9HYB=L^oFpJ zfTQskXW!LFVnUo4(OHPDaZSf3zB|3{RGu1>ueE$(+dr?tT zp!SGlqDU8vu{5xLWSvj+j$arHglg54#Lx&TvuO3LIIU>hF9Uoj&=-b*Q?uYr`#V?xz?2 zhirZrv^eA{k%{hFh%9LYVXEYWd5#PuUd1QqaqB*J!CMXEM>fEB$@#1>mtB`Bfil}t zhhTIObqh5HRvT+4q_Do$Q*Jika?qV=Np-DtPkU z(KoXyWLfPwr@UY1)hBAvR3nCBZgd|CevTG?H~HqDF}dzy%2sd2`f{^CBbTk*^K~RO zN~O0+2EjAJlywF%SjgYz810l&G5AqzI<=Ber{912^PpSPRJl3dm8W@dKHL}7_@k3)Y!SXYkyxQy>Q4I2o zr`ev7fLF$1t96h|sH<-#*YzGD-b^3$_!#wsh(Yw;)b@udLz9mm`mFYh z1Zz24KIQJ(*_-E0(3&1InqG;U?wF)GYd>DFo(em`#|UaaYmkA9;GTX7b?0@C@QkTVpGD#mf$dQoRNV=n{^Zi_W*ps;3?^$s`0;ER7;==~OmQ~9 zS5P=FjxE5%|;xq6h4@!_h?@|aK&FYI2IT(OHXv2%1 zWEo-v!L7x^YT(xLVHlpJttcwaF@1Y;-S*q3CRa!g7xdzl|Jan>2#dI0`LKl!T1GMk zRKe4|bQO&ET}Z^Aiym*HII>cSxIzl|F~JEUGxz;+DB=8fxXhnBI4R12q6ews$lA`Jfi}r@A@-)6TOAUMNYFYJ zZ-Zd?lxFTyjN3mXnL!%#>Z%$0gJ4*9g;e;@zSmQ{eGGDaRRNM3s@6!;hYuVc=c+3B z=qzNNS~n^EsJU4aOGE|mdy={C^lPKEfPL-IJAsTpQsDgZ@~s+eHZYmp9yb=YW_4r?lqQaYZQ`nau){W`LY#P)>i zq^wHEuOYs#FlPZeMuT@Etb@~A6feCebq`miJE3w+gAL%bVF_s*5e*@)?xmKSo%I3? zLELHVdWia$}~s6 zr!^LfxSSB4Td&9iTXrzQpl5ZDo#SdmNr;23QsPHQ!x!UT9xtb!Ycz^JF8x)%cFOXK z^EXw%dRz_VD}7?RU^4{)1+xFO=z!EI8IUa3U*rag=1BpHX$Xi<__kSbS{y_xa*MJv z_`thq0Z^sPzjAk48ssDQj}!$N8Q$XC84(bU$t_Bm69Jf+C!h_}ep zwzpQj9sRA94<{x3{~z&ix-DwX;RAzka)4-#6ZHJqKh|SVuO|>Yrv+m30+!|sK<-|E z=)5E->#y<_1V|T1f%Af!ZYqXg}`O zI$qKOWdnclF`%_Z`WGOe{`A`l-#a?s=Q1a#@BOWmExH2;Wl`OB!B-%lq3nO{4=WO& z#k_x|N&(qzm*6S{G*|GCegF2N2ulC+(58z2DG~yUs}i8zvRf&$CJCaexJ6Xu!`qz( z)*v8*kAE#D0KCo*s{8^Rbg=`*E2MzeIt0|x55%n-gO&yX#$l=3W7-_~&(G8j1E(XB hw}tl`5K!1C(72%nnjQrp<7@!WCh47rWB+@R{{wClNUHz< diff --git a/examples/java/gradle/wrapper/gradle-wrapper.properties b/examples/java/gradle/wrapper/gradle-wrapper.properties index bb8b2fc..f371643 100644 --- a/examples/java/gradle/wrapper/gradle-wrapper.properties +++ b/examples/java/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/java/gradlew b/examples/java/gradlew index fbd7c51..4f906e0 100755 --- a/examples/java/gradlew +++ b/examples/java/gradlew @@ -130,7 +130,7 @@ fi if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath diff --git a/examples/java/gradlew.bat b/examples/java/gradlew.bat index 5093609..107acd3 100644 --- a/examples/java/gradlew.bat +++ b/examples/java/gradlew.bat @@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -54,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -64,21 +64,6 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line @@ -86,7 +71,7 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell diff --git a/examples/java/pom.xml b/examples/java/pom.xml index 9a95781..7c8fbc8 100644 --- a/examples/java/pom.xml +++ b/examples/java/pom.xml @@ -45,7 +45,7 @@ org.codehaus.mojo exec-maven-plugin - 1.6.0 + 3.0.0 run diff --git a/examples/java/src/generated/java/com/example/ExampleVersion.java b/examples/java/src/generated/java/com/example/ExampleVersion.java index fe50374..29e900d 100644 --- a/examples/java/src/generated/java/com/example/ExampleVersion.java +++ b/examples/java/src/generated/java/com/example/ExampleVersion.java @@ -9,7 +9,7 @@ import java.util.Date; public final class ExampleVersion { public static final String PROJECT = "Java Example"; - public static final Date BUILDDATE = new Date(1558820521980L); + public static final Date BUILDDATE = new Date(1619704020405L); public static final String VERSION = "8.4.97-alpha+T800"; /** diff --git a/examples/java/src/generated/java/com/example/GeneratedVersion.java b/examples/java/src/generated/java/com/example/GeneratedVersion.java index adf8b76..c081634 100644 --- a/examples/java/src/generated/java/com/example/GeneratedVersion.java +++ b/examples/java/src/generated/java/com/example/GeneratedVersion.java @@ -14,7 +14,7 @@ import java.util.Date; */ public final class GeneratedVersion { public static final String PROJECT = "Java App"; - public static final Date BUILDDATE = new Date(1558820521932L); + public static final Date BUILDDATE = new Date(1619704020387L); public static final int MAJOR = 11; public static final int MINOR = 11; public static final int PATCH = 20; diff --git a/examples/kotlin/build.gradle.kts b/examples/kotlin/build.gradle.kts index 959ab64..bbd15bf 100644 --- a/examples/kotlin/build.gradle.kts +++ b/examples/kotlin/build.gradle.kts @@ -1,8 +1,8 @@ plugins { - kotlin("jvm").version("1.3.72") + kotlin("jvm").version("1.5.0") application - id("org.jetbrains.kotlin.kapt").version("1.3.72") - id("com.github.ben-manes.versions").version("0.28.0") + id("org.jetbrains.kotlin.kapt").version("1.5.0") + id("com.github.ben-manes.versions").version("0.38.0") } // ./gradlew @@ -30,7 +30,7 @@ kapt { repositories { mavenLocal() - jcenter() + mavenCentral() } application { diff --git a/examples/kotlin/gradle/wrapper/gradle-wrapper.jar b/examples/kotlin/gradle/wrapper/gradle-wrapper.jar index 62d4c053550b91381bbd28b1afc82d634bf73a8a..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f 100644 GIT binary patch delta 6656 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 Yte!%o?r4GTrVtxD61Ym!|5fq-1K$0e!T1w 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 diff --git a/examples/kotlin/gradle/wrapper/gradle-wrapper.properties b/examples/kotlin/gradle/wrapper/gradle-wrapper.properties index bb8b2fc..f371643 100644 --- a/examples/kotlin/gradle/wrapper/gradle-wrapper.properties +++ b/examples/kotlin/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/kotlin/gradlew b/examples/kotlin/gradlew index fbd7c51..4f906e0 100755 --- a/examples/kotlin/gradlew +++ b/examples/kotlin/gradlew @@ -130,7 +130,7 @@ fi if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath diff --git a/examples/kotlin/gradlew.bat b/examples/kotlin/gradlew.bat index 5093609..107acd3 100644 --- a/examples/kotlin/gradlew.bat +++ b/examples/kotlin/gradlew.bat @@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -54,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -64,21 +64,6 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line @@ -86,7 +71,7 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell diff --git a/examples/test/build.gradle b/examples/test/build.gradle index 6a3587b..3ea6896 100644 --- a/examples/test/build.gradle +++ b/examples/test/build.gradle @@ -1,7 +1,7 @@ plugins { id 'java' id 'application' - id 'com.github.ben-manes.versions' version '0.21.0' + id 'com.github.ben-manes.versions' version '0.38.0' } // ./gradlew run @@ -14,8 +14,6 @@ final def semverProcessor = 'net.thauvin.erik:semver:1.2.0' sourceCompatibility = 1.8 targetCompatibility = 1.8 -compileJava. - mainClassName = 'com.example.Example' repositories { diff --git a/examples/test/gradle/wrapper/gradle-wrapper.properties b/examples/test/gradle/wrapper/gradle-wrapper.properties index f4d7b2b..f371643 100644 --- a/examples/test/gradle/wrapper/gradle-wrapper.properties +++ b/examples/test/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/test/gradlew b/examples/test/gradlew old mode 100644 new mode 100755 index b0d6d0a..4f906e0 --- a/examples/test/gradlew +++ b/examples/test/gradlew @@ -7,7 +7,7 @@ # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # -# http://www.apache.org/licenses/LICENSE-2.0 +# https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, @@ -82,6 +82,7 @@ esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then @@ -125,10 +126,11 @@ if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath @@ -154,19 +156,19 @@ if $cygwin ; then else eval `echo args$i`="\"$arg\"" fi - i=$((i+1)) + i=`expr $i + 1` done case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi @@ -175,14 +177,9 @@ save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } -APP_ARGS=$(save "$@") +APP_ARGS=`save "$@"` # Collect all arguments for the java command, following the shell quoting and substitution rules eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - exec "$JAVACMD" "$@" diff --git a/examples/test/gradlew.bat b/examples/test/gradlew.bat index 9991c50..107acd3 100644 --- a/examples/test/gradlew.bat +++ b/examples/test/gradlew.bat @@ -5,7 +5,7 @@ @rem you may not use this file except in compliance with the License. @rem You may obtain a copy of the License at @rem -@rem http://www.apache.org/licenses/LICENSE-2.0 +@rem https://www.apache.org/licenses/LICENSE-2.0 @rem @rem Unless required by applicable law or agreed to in writing, software @rem distributed under the License is distributed on an "AS IS" BASIS, @@ -29,6 +29,9 @@ if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @@ -37,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -51,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -61,28 +64,14 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell diff --git a/examples/test/src/generated/java/com/example/ExampleVersion.java b/examples/test/src/generated/java/com/example/ExampleVersion.java index ddf4200..46480b7 100644 --- a/examples/test/src/generated/java/com/example/ExampleVersion.java +++ b/examples/test/src/generated/java/com/example/ExampleVersion.java @@ -9,7 +9,7 @@ import java.util.Date; public final class ExampleVersion { public static final String PROJECT = "Java Example"; - public static final Date BUILDDATE = new Date(1558820496856L); + public static final Date BUILDDATE = new Date(1619673811155L); public static final String VERSION = "8.4.97-alpha+T800"; /** diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 442d913..f371643 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/preflightcheck.sh b/preflightcheck.sh old mode 100644 new mode 100755 index 67359b9..1c8272a --- a/preflightcheck.sh +++ b/preflightcheck.sh @@ -20,7 +20,7 @@ gradle_opts="--console=plain --no-build-cache --no-daemon" maven_args="compile exec:java" # -# Version: 1.1.3 +# Version: 1.1.5 # if [ "$java8" = true ] @@ -40,7 +40,7 @@ pause() { } checkCopyright() { - if [ "$(grep -c "$date" "$1")" -eq 0 ] + if [ "$(grep -c "$date" "$1")" == "0" ] then echo -e " Invalid: ${red}$f${std}" else @@ -104,7 +104,7 @@ checkDeps() { * ) for ex in "${!examples[@]}" do runGradle $(echo "${examples[ex]}" | cut -d " " -f 1) dU - runKobalt $(echo "${examples[ex]}" | cut -d " " -f 1) checkVersions + # runKobalt $(echo "${examples[ex]}" | cut -d " " -f 1) checkVersions runMaven $(echo "${examples[ex]}" | cut -d " " -f 1) versions:display-dependency-updates if [ "$ex" -eq "${#examples}" ] then @@ -130,7 +130,7 @@ runExamples() { for ex in "${!examples[@]}" do runGradle ${examples[ex]} clean $gradle_opts - runKobalt ${examples[ex]} clean + # runKobalt ${examples[ex]} clean runMaven $(echo "${examples[ex]}" | cut -d " " -f 1) clean $maven_args done } @@ -152,7 +152,7 @@ examplesMenu() { examplesMenu else runGradle ${examples[$(($choice - 1))]} - runKobalt ${examples[$(($choice - 1))]} + # runKobalt ${examples[$(($choice - 1))]} runMaven $(echo "${examples[$(($choice - 1))]}" | cut -d " " -f 1) $maven_args examplesMenu fi ;; @@ -163,9 +163,12 @@ examplesMenu() { validateCopyrights() { clear echo -e "${cyan}Validating copyrights...${std}" - for f in LICENSE.TXT ${src}/*${ext} ${test}/*${ext} + for f in "LICENSE.txt" ${src}/*${ext} ${test}/*${ext} do - checkCopyright "$f" + if [ -f "$f" ] + then + checkCopyright "$f" + fi done pause } @@ -189,7 +192,7 @@ showMenu() { echo " 6. Check Everything" } -readOptions(){ +readOptions() { local choice read -p "Enter choice [1-6]: " choice case $choice in diff --git a/src/main/java/net/thauvin/erik/semver/Constants.java b/src/main/java/net/thauvin/erik/semver/Constants.java index 22cf4d5..5a004a2 100644 --- a/src/main/java/net/thauvin/erik/semver/Constants.java +++ b/src/main/java/net/thauvin/erik/semver/Constants.java @@ -1,7 +1,7 @@ /* * Constants.java * - * Copyright (c) 2016-2020, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2021, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/main/java/net/thauvin/erik/semver/Version.java b/src/main/java/net/thauvin/erik/semver/Version.java index f687f00..8b29cec 100644 --- a/src/main/java/net/thauvin/erik/semver/Version.java +++ b/src/main/java/net/thauvin/erik/semver/Version.java @@ -1,7 +1,7 @@ /* * Version.java * - * Copyright (c) 2016-2020, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2021, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/main/java/net/thauvin/erik/semver/VersionInfo.java b/src/main/java/net/thauvin/erik/semver/VersionInfo.java index 19e4807..c45a062 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionInfo.java +++ b/src/main/java/net/thauvin/erik/semver/VersionInfo.java @@ -1,7 +1,7 @@ /* * VersionInfo.java * - * Copyright (c) 2016-2020, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2021, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java index 02cde7b..fdb05cc 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java +++ b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java @@ -1,7 +1,7 @@ /* * VersionProcessor.java * - * Copyright (c) 2016-2020, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2021, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/test/java/net/thauvin/erik/semver/ConstantsTest.java b/src/test/java/net/thauvin/erik/semver/ConstantsTest.java index b1424dd..c5a9a34 100644 --- a/src/test/java/net/thauvin/erik/semver/ConstantsTest.java +++ b/src/test/java/net/thauvin/erik/semver/ConstantsTest.java @@ -1,7 +1,7 @@ /* * ConstantsTest.java * - * Copyright (c) 2016-2020, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2021, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java b/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java index cb42be2..833d4d5 100644 --- a/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java +++ b/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java @@ -1,7 +1,7 @@ /* * VersionInfoTest.java * - * Copyright (c) 2016-2020, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2021, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/test/java/net/thauvin/erik/semver/VersionProcessorTest.java b/src/test/java/net/thauvin/erik/semver/VersionProcessorTest.java index 328fc08..cc77944 100644 --- a/src/test/java/net/thauvin/erik/semver/VersionProcessorTest.java +++ b/src/test/java/net/thauvin/erik/semver/VersionProcessorTest.java @@ -1,7 +1,7 @@ /* * VersionProcessorTest.java * - * Copyright (c) 2016-2020, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2021, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/test/java/net/thauvin/erik/semver/VersionTest.java b/src/test/java/net/thauvin/erik/semver/VersionTest.java index d8c2db8..0df16dd 100644 --- a/src/test/java/net/thauvin/erik/semver/VersionTest.java +++ b/src/test/java/net/thauvin/erik/semver/VersionTest.java @@ -1,7 +1,7 @@ /* * VersionTest.java * - * Copyright (c) 2016-2020, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2021, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/updatewrappers.sh b/updatewrappers.sh old mode 100644 new mode 100755 From 0809e69dfcd4a84767476fd37c51b8f63ec4d2b4 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 2 May 2021 21:57:42 -0700 Subject: [PATCH 222/316] Added support for snapshot. --- build.gradle | 11 ++++++++--- examples/java/build.gradle | 2 +- .../generated/java/com/example/ExampleVersion.java | 2 +- .../generated/java/com/example/GeneratedVersion.java | 2 +- examples/kotlin/build.gradle.kts | 2 +- version.properties | 8 ++++---- 6 files changed, 16 insertions(+), 11 deletions(-) diff --git a/build.gradle b/build.gradle index 347a76e..991ac3c 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ final def mavenScmCon = 'https://github.com/ethauvin/semver.git' final def mavenScmDevCon = 'git@github.com:ethauvin/semver.git' ext.versions = [ - spotbugs: '4.2.3' + spotbugs: '4.2.3' ] repositories { @@ -102,10 +102,14 @@ publishing { repositories { maven { name = "ossrh" - url = "https://oss.sonatype.org/service/local/staging/deploy/maven2/" + project.afterEvaluate { + url = project.version.contains("SNAPSHOT") + ? "https://oss.sonatype.org/content/repositories/snapshots/" + : "https://oss.sonatype.org/service/local/staging/deploy/maven2/" + } credentials(PasswordCredentials) } - } + } } signing { @@ -118,6 +122,7 @@ javadoc { title = "$mavenDescription $project.version API" } options.with { + source = '8' tags = ['created'] author = true //addBooleanOption('html4', true) diff --git a/examples/java/build.gradle b/examples/java/build.gradle index d455791..9b0e427 100644 --- a/examples/java/build.gradle +++ b/examples/java/build.gradle @@ -9,7 +9,7 @@ plugins { defaultTasks 'run' -final def semverProcessor = 'net.thauvin.erik:semver:1.2.0' +final def semverProcessor = 'net.thauvin.erik:semver:1.2.1-SNAPSHOT' sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/examples/java/src/generated/java/com/example/ExampleVersion.java b/examples/java/src/generated/java/com/example/ExampleVersion.java index 29e900d..4d2b300 100644 --- a/examples/java/src/generated/java/com/example/ExampleVersion.java +++ b/examples/java/src/generated/java/com/example/ExampleVersion.java @@ -9,7 +9,7 @@ import java.util.Date; public final class ExampleVersion { public static final String PROJECT = "Java Example"; - public static final Date BUILDDATE = new Date(1619704020405L); + public static final Date BUILDDATE = new Date(1620017348087L); public static final String VERSION = "8.4.97-alpha+T800"; /** diff --git a/examples/java/src/generated/java/com/example/GeneratedVersion.java b/examples/java/src/generated/java/com/example/GeneratedVersion.java index c081634..b8c80aa 100644 --- a/examples/java/src/generated/java/com/example/GeneratedVersion.java +++ b/examples/java/src/generated/java/com/example/GeneratedVersion.java @@ -14,7 +14,7 @@ import java.util.Date; */ public final class GeneratedVersion { public static final String PROJECT = "Java App"; - public static final Date BUILDDATE = new Date(1619704020387L); + public static final Date BUILDDATE = new Date(1620017348189L); public static final int MAJOR = 11; public static final int MINOR = 11; public static final int PATCH = 20; diff --git a/examples/kotlin/build.gradle.kts b/examples/kotlin/build.gradle.kts index bbd15bf..9e4d930 100644 --- a/examples/kotlin/build.gradle.kts +++ b/examples/kotlin/build.gradle.kts @@ -13,7 +13,7 @@ plugins { defaultTasks(ApplicationPlugin.TASK_RUN_NAME) -val semverProcessor = "net.thauvin.erik:semver:1.2.0" +val semverProcessor = "net.thauvin.erik:semver:1.2.1-SNAPSHOT" dependencies { kapt(semverProcessor) diff --git a/version.properties b/version.properties index 448ca88..3966686 100644 --- a/version.properties +++ b/version.properties @@ -1,8 +1,8 @@ #Generated by the Semver Plugin for Gradle -#Fri Apr 26 18:43:34 PDT 2019 +#Sun May 02 21:54:48 PDT 2021 version.buildmeta= version.major=1 version.minor=2 -version.patch=0 -version.prerelease= -version.semver=1.2.0 +version.patch=1 +version.prerelease=SNAPSHOT +version.semver=1.2.1-SNAPSHOT From 79945ad2df7a4e43c6b1ebfbd34d0fdabbcd6c84 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Tue, 11 May 2021 20:50:41 -0700 Subject: [PATCH 223/316] Upgraded to Gradle 7.0.1 --- build.gradle | 6 +++++- examples/java/gradle/wrapper/gradle-wrapper.properties | 2 +- examples/kotlin/build.gradle.kts | 8 ++++---- examples/kotlin/gradle/wrapper/gradle-wrapper.properties | 2 +- examples/test/gradle/wrapper/gradle-wrapper.properties | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 6 files changed, 13 insertions(+), 9 deletions(-) diff --git a/build.gradle b/build.gradle index 991ac3c..75ba55e 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ plugins { id 'com.github.ben-manes.versions' version '0.38.0' id 'net.thauvin.erik.gradle.semver' version '1.0.4' id 'com.github.spotbugs' version '4.7.1' - id 'org.sonarqube' version '3.1.1' + id 'org.sonarqube' version '3.2.0' } import com.github.spotbugs.snom.SpotBugsTask @@ -132,6 +132,10 @@ javadoc { } test { + testLogging { + exceptionFormat "full" + } + useTestNG() } diff --git a/examples/java/gradle/wrapper/gradle-wrapper.properties b/examples/java/gradle/wrapper/gradle-wrapper.properties index f371643..e5338d3 100644 --- a/examples/java/gradle/wrapper/gradle-wrapper.properties +++ b/examples/java/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/kotlin/build.gradle.kts b/examples/kotlin/build.gradle.kts index 9e4d930..771cf48 100644 --- a/examples/kotlin/build.gradle.kts +++ b/examples/kotlin/build.gradle.kts @@ -34,26 +34,26 @@ repositories { } application { - mainClassName = "com.example.App" + mainClass.set("com.example.App") } tasks { register("runJava", JavaExec::class) { group = "application" main = "com.example.JavaApp" - classpath = sourceSets["main"].runtimeClasspath + classpath = sourceSets.main.get().runtimeClasspath } register("runJavaExample", JavaExec::class) { group = "application" main = "com.example.JavaExample" - classpath = sourceSets["main"].runtimeClasspath + classpath = sourceSets.main.get().runtimeClasspath } register("runExample", JavaExec::class) { group = "application" main = "com.example.Example" - classpath = sourceSets["main"].runtimeClasspath + classpath = sourceSets.main.get().runtimeClasspath } } diff --git a/examples/kotlin/gradle/wrapper/gradle-wrapper.properties b/examples/kotlin/gradle/wrapper/gradle-wrapper.properties index f371643..e5338d3 100644 --- a/examples/kotlin/gradle/wrapper/gradle-wrapper.properties +++ b/examples/kotlin/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/test/gradle/wrapper/gradle-wrapper.properties b/examples/test/gradle/wrapper/gradle-wrapper.properties index f371643..e5338d3 100644 --- a/examples/test/gradle/wrapper/gradle-wrapper.properties +++ b/examples/test/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f371643..e5338d3 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From ba0b56f9e2b33c24be53d68874b0bae2024d5f45 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Wed, 19 May 2021 22:56:46 -0700 Subject: [PATCH 224/316] Moved Sonarqube to GitHub action. --- .github/workflows/gradle.yml | 42 +++++++++++++++++++ .travis.yml | 10 ----- build.gradle | 5 ++- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 6 files changed, 49 insertions(+), 14 deletions(-) create mode 100644 .github/workflows/gradle.yml diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml new file mode 100644 index 0000000..28fd6fb --- /dev/null +++ b/.github/workflows/gradle.yml @@ -0,0 +1,42 @@ +name: Java CI with Gradle + +on: [push, pull_request, workflow_dispatch] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + - name: Set up JDK 11 + uses: actions/setup-java@v1 + with: + java-version: 11 + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Cache SonarCloud packages + uses: actions/cache@v1 + with: + path: ~/.sonar/cache + key: ${{ runner.os }}-sonar + restore-keys: ${{ runner.os }}-sonar + - name: Cache Gradle packages + uses: actions/cache@v2 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + - name: Test with Gradle + env: + CI_NAME: "GitHub CI" + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + run: ./gradlew check sonarqube + - name: Cleanup Gradle Cache + run: | + rm -f ~/.gradle/caches/modules-2/modules-2.lock + rm -f ~/.gradle/caches/modules-2/gc.properties diff --git a/.travis.yml b/.travis.yml index 0161fc0..4689db5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,15 +4,5 @@ dist: trusty jdk: - oraclejdk8 -addons: - sonarcloud: - organization: "ethauvin-github" - before_install: - chmod +x gradlew - -after_success: - - | - if [ "${TRAVIS_TEST_RESULT}" == 0 ]; then - ./gradlew sonarqube - fi diff --git a/build.gradle b/build.gradle index 75ba55e..8aad299 100644 --- a/build.gradle +++ b/build.gradle @@ -134,6 +134,7 @@ javadoc { test { testLogging { exceptionFormat "full" + events "passed", "skipped", "failed" } useTestNG() @@ -197,7 +198,9 @@ jacocoTestReport { sonarqube { properties { - property("sonar.projectKey", "ethauvin_semver") + property "sonar.organization", "ethauvin-github" + property "sonar.projectKey", "ethauvin_semver" + property "sonar.host.url", "https://sonarcloud.io" property("sonar.sourceEncoding", "UTF-8") } } diff --git a/examples/java/gradle/wrapper/gradle-wrapper.properties b/examples/java/gradle/wrapper/gradle-wrapper.properties index e5338d3..0f80bbf 100644 --- a/examples/java/gradle/wrapper/gradle-wrapper.properties +++ b/examples/java/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/kotlin/gradle/wrapper/gradle-wrapper.properties b/examples/kotlin/gradle/wrapper/gradle-wrapper.properties index e5338d3..0f80bbf 100644 --- a/examples/kotlin/gradle/wrapper/gradle-wrapper.properties +++ b/examples/kotlin/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e5338d3..0f80bbf 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From a755e7d11e7425363fed3aa90300be08d27c93a6 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Thu, 20 May 2021 21:50:11 -0700 Subject: [PATCH 225/316] Removed TravisCI. --- .github/workflows/gradle.yml | 2 +- .travis.yml | 8 -------- README.md | 2 +- 3 files changed, 2 insertions(+), 10 deletions(-) delete mode 100644 .travis.yml diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 28fd6fb..280a6a1 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -1,4 +1,4 @@ -name: Java CI with Gradle +name: gradle-ci on: [push, pull_request, workflow_dispatch] diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 4689db5..0000000 --- a/.travis.yml +++ /dev/null @@ -1,8 +0,0 @@ -language: java -dist: trusty - -jdk: - - oraclejdk8 - -before_install: - - chmod +x gradlew diff --git a/README.md b/README.md index cd89377..9332eed 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Semantic Version Annotation Processor [![License (3-Clause BSD)](https://img.shields.io/badge/license-BSD%203--Clause-blue.svg?style=flat-square)](http://opensource.org/licenses/BSD-3-Clause) [![release](https://img.shields.io/github/release/ethauvin/semver.svg)](https://github.com/ethauvin/semver/releases/latest) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver/badge.svg)](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver)\ -[![Known Vulnerabilities](https://snyk.io/test/github/ethauvin/semver/badge.svg?targetFile=build.gradle)](https://snyk.io/test/github/ethauvin/semver?targetFile=build.gradle) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=ethauvin_semver&metric=alert_status)](https://sonarcloud.io/dashboard?id=ethauvin_semver) [![Build Status](https://travis-ci.com/ethauvin/semver.svg?branch=master)](https://travis-ci.com/ethauvin/semver) [![Build status](https://ci.appveyor.com/api/projects/status/nbv4mxd1gpxtx69o?svg=true)](https://ci.appveyor.com/project/ethauvin/semver) [![CircleCI](https://circleci.com/gh/ethauvin/semver/tree/master.svg?style=shield)](https://circleci.com/gh/ethauvin/semver/tree/master) +[![Known Vulnerabilities](https://snyk.io/test/github/ethauvin/semver/badge.svg?targetFile=build.gradle)](https://snyk.io/test/github/ethauvin/semver?targetFile=build.gradle) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=ethauvin_semver&metric=alert_status)](https://sonarcloud.io/dashboard?id=ethauvin_semver) [![GitHub CI](https://github.com/ethauvin/semver/actions/workflows/gradle.yml/badge.svg)](https://github.com/ethauvin/semver/actions/workflows/gradle.yml) [![Build status](https://ci.appveyor.com/api/projects/status/nbv4mxd1gpxtx69o?svg=true)](https://ci.appveyor.com/project/ethauvin/semver) [![CircleCI](https://circleci.com/gh/ethauvin/semver/tree/master.svg?style=shield)](https://circleci.com/gh/ethauvin/semver/tree/master) An [annotation processor](https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html) that automatically generates a `GeneratedVersion` class based on a [Mustache](https://mustache.github.io/) template and containing the [semantic version](http://semver.org/) (major, minor, patch, etc.) that is read from a [Properties](https://docs.oracle.com/javase/tutorial/essential/environment/properties.html) file or defined in the [annotation](https://docs.oracle.com/javase/tutorial/java/annotations/basics.html). From 06d062ae0c62c09d2d546366877f6823b298a01d Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 21 May 2021 00:03:55 -0700 Subject: [PATCH 226/316] Moved to JDK 11 and 15. --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 0ee7361..301727a 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -19,8 +19,8 @@ cache: environment: matrix: - - JAVA_HOME: C:\Program Files\Java\jdk1.8.0 - - JAVA_HOME: C:\Program Files (x86)\Java\jdk1.8.0 + - JAVA_HOME: C:\Program Files\Java\jdk15 + - JAVA_HOME: C:\Program Files\Java\jdk11 matrix: fast_finish: true From 94e42972e0f7fa1c33d1b5c8cd2c109c2f98bf8a Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 21 May 2021 15:01:00 -0700 Subject: [PATCH 227/316] Added Visual Studio 2019 image and branch to Appveyor. --- appveyor.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index 301727a..dd9bd2a 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,3 +1,6 @@ +image: + - Visual Studio 2019 + version: "{branch} {build}" skip_tags: true @@ -13,6 +16,7 @@ test_script: branches: only: - master + - 1.2.1-dev cache: - C:\Users\appveyor\.gradle From cae74c95b34aa098d8b0a27af31bcd59b376eb4d Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 29 May 2021 21:56:43 -0700 Subject: [PATCH 228/316] Updated PMD rules. --- README.md | 2 +- build.gradle | 26 +- config/pmd.xml | 279 ++++-------------- examples/kotlin/build.gradle.kts | 8 +- .../thauvin/erik/semver/VersionProcessor.java | 10 +- .../thauvin/erik/semver/VersionInfoTest.java | 5 +- 6 files changed, 91 insertions(+), 239 deletions(-) diff --git a/README.md b/README.md index 9332eed..925e813 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Semantic Version Annotation Processor -[![License (3-Clause BSD)](https://img.shields.io/badge/license-BSD%203--Clause-blue.svg?style=flat-square)](http://opensource.org/licenses/BSD-3-Clause) [![release](https://img.shields.io/github/release/ethauvin/semver.svg)](https://github.com/ethauvin/semver/releases/latest) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver/badge.svg)](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver)\ +[![License (3-Clause BSD)](https://img.shields.io/badge/license-BSD%203--Clause-blue.svg?style=flat-square)](http://opensource.org/licenses/BSD-3-Clause) [![release](https://img.shields.io/github/release/ethauvin/semver.svg)](https://github.com/ethauvin/semver/releases/latest) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver/badge.svg)](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver) [![Known Vulnerabilities](https://snyk.io/test/github/ethauvin/semver/badge.svg?targetFile=build.gradle)](https://snyk.io/test/github/ethauvin/semver?targetFile=build.gradle) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=ethauvin_semver&metric=alert_status)](https://sonarcloud.io/dashboard?id=ethauvin_semver) [![GitHub CI](https://github.com/ethauvin/semver/actions/workflows/gradle.yml/badge.svg)](https://github.com/ethauvin/semver/actions/workflows/gradle.yml) [![Build status](https://ci.appveyor.com/api/projects/status/nbv4mxd1gpxtx69o?svg=true)](https://ci.appveyor.com/project/ethauvin/semver) [![CircleCI](https://circleci.com/gh/ethauvin/semver/tree/master.svg?style=shield)](https://circleci.com/gh/ethauvin/semver/tree/master) An [annotation processor](https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html) that automatically generates a `GeneratedVersion` class based on a [Mustache](https://mustache.github.io/) template and containing the [semantic version](http://semver.org/) (major, minor, patch, etc.) that is read from a [Properties](https://docs.oracle.com/javase/tutorial/essential/environment/properties.html) file or defined in the [annotation](https://docs.oracle.com/javase/tutorial/java/annotations/basics.html). diff --git a/build.gradle b/build.gradle index 8aad299..e3ad8c6 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { id 'maven-publish' id 'pmd' id 'signing' - id 'com.github.ben-manes.versions' version '0.38.0' + id 'com.github.ben-manes.versions' version '0.39.0' id 'net.thauvin.erik.gradle.semver' version '1.0.4' id 'com.github.spotbugs' version '4.7.1' id 'org.sonarqube' version '3.2.0' @@ -27,6 +27,7 @@ final def mavenScmCon = 'https://github.com/ethauvin/semver.git' final def mavenScmDevCon = 'git@github.com:ethauvin/semver.git' ext.versions = [ + pmd: '6.35.0', spotbugs: '4.2.3' ] @@ -36,7 +37,7 @@ repositories { } dependencies { - implementation 'com.github.spullara.mustache.java:compiler:0.9.7' + implementation 'com.github.spullara.mustache.java:compiler:0.9.10' spotbugsPlugins 'com.h3xstream.findsecbugs:findsecbugs-plugin:1.11.0' spotbugsPlugins 'com.mebigfatguy.sb-contrib:sb-contrib:7.4.7' @@ -60,6 +61,7 @@ java { } pmd { + toolVersion = versions.pmd ignoreFailures = true ruleSets = [] ruleSetFiles = files("${projectDir}/config/pmd.xml") @@ -69,9 +71,9 @@ pmd { publishing { publications { mavenJava(MavenPublication) { - from components.java - groupId project.group - artifactId rootProject.name + from(components.java) + groupId = project.group + artifactId = rootProject.name pom { name = mavenName @@ -133,8 +135,8 @@ javadoc { test { testLogging { - exceptionFormat "full" - events "passed", "skipped", "failed" + exceptionFormat = "full" + events("passed", "skipped", "failed") } useTestNG() @@ -179,8 +181,8 @@ task pandoc(type: Exec) { if (Os.isFamily(Os.FAMILY_WINDOWS)) { commandLine(['cmd', '/c', 'pandoc'] + pandoc_args) } else { - executable 'pandoc' - args pandoc_args + executable = 'pandoc' + args(pandoc_args) } standardOutput = new ByteArrayOutputStream() ext.output = { @@ -198,9 +200,9 @@ jacocoTestReport { sonarqube { properties { - property "sonar.organization", "ethauvin-github" - property "sonar.projectKey", "ethauvin_semver" - property "sonar.host.url", "https://sonarcloud.io" + property("sonar.organization", "ethauvin-github") + property("sonar.projectKey", "ethauvin_semver") + property("sonar.host.url", "https://sonarcloud.io") property("sonar.sourceEncoding", "UTF-8") } } diff --git a/config/pmd.xml b/config/pmd.xml index a3a25a4..890a490 100644 --- a/config/pmd.xml +++ b/config/pmd.xml @@ -5,109 +5,78 @@ xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd"> Erik's Ruleset - - - - - - - - - + + + + + + + value="//MethodDeclaration[@Name='hashCode' or @Name='equals' or @Name='toString']"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + + + + + + @@ -115,86 +84,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -202,59 +96,16 @@ - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + diff --git a/examples/kotlin/build.gradle.kts b/examples/kotlin/build.gradle.kts index 771cf48..cb842f0 100644 --- a/examples/kotlin/build.gradle.kts +++ b/examples/kotlin/build.gradle.kts @@ -1,8 +1,8 @@ plugins { - kotlin("jvm").version("1.5.0") - application - id("org.jetbrains.kotlin.kapt").version("1.5.0") - id("com.github.ben-manes.versions").version("0.38.0") + id("application") + id("com.github.ben-manes.versions") version "0.39.0" + kotlin("jvm") version "1.5.10" + kotlin("kapt") version "1.5.10" } // ./gradlew diff --git a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java index fdb05cc..3e78f54 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java +++ b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java @@ -70,7 +70,7 @@ import java.util.Set; * @created 2016-01-13 * @since 1.0 */ -@SuppressWarnings("PMD.GuardLogStatement") +@SuppressWarnings({ "PMD.GuardLogStatement", "PMD.BeanMembersShouldSerialize"}) @SupportedOptions({Constants.KAPT_KOTLIN_GENERATED_OPTION_NAME, Constants.SEMVER_PROJECT_DIR_ARG}) public class VersionProcessor extends AbstractProcessor { private Filer filer; @@ -82,7 +82,7 @@ public class VersionProcessor extends AbstractProcessor { } private void error(final String s, final Throwable t) { - log(Diagnostic.Kind.ERROR, (t != null ? t.toString() : s)); + log(Diagnostic.Kind.ERROR, t != null ? t.toString() : s); } @SuppressFBWarnings({"PATH_TRAVERSAL_IN", "UAC_UNNECESSARY_API_CONVERSION_FILE_TO_PATH"}) @@ -96,7 +96,7 @@ public class VersionProcessor extends AbstractProcessor { final Properties p = new Properties(); - try (final InputStreamReader reader = new InputStreamReader( + try (InputStreamReader reader = new InputStreamReader( Files.newInputStream(propsFile.toPath()), StandardCharsets.UTF_8)) { p.load(reader); @@ -268,7 +268,7 @@ public class VersionProcessor extends AbstractProcessor { if (!ktFile.getParentFile().exists() && !ktFile.getParentFile().mkdirs()) { note("Could not create target directory: " + ktFile.getParentFile().getAbsolutePath()); } - try (final OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(ktFile.toPath()), + try (OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(ktFile.toPath()), StandardCharsets.UTF_8)) { mustache.execute(osw, versionInfo).flush(); } @@ -276,7 +276,7 @@ public class VersionProcessor extends AbstractProcessor { } else { final FileObject jfo = filer.createSourceFile( versionInfo.getPackageName() + '.' + versionInfo.getClassName()); - try (final Writer writer = jfo.openWriter()) { + try (Writer writer = jfo.openWriter()) { mustache.execute(writer, versionInfo).flush(); } note("Generated source: " + fileName + " (" + new File(jfo.getName()).getAbsoluteFile().getParent() + ')'); diff --git a/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java b/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java index 833d4d5..be01241 100644 --- a/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java +++ b/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java @@ -36,7 +36,7 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.testng.Assert; import org.testng.annotations.Test; -import java.util.Calendar; +import java.util.Date; import static org.testng.Assert.assertEquals; @@ -49,7 +49,6 @@ import static org.testng.Assert.assertEquals; */ @SuppressFBWarnings("PRMC_POSSIBLY_REDUNDANT_METHOD_CALLS") public class VersionInfoTest { - private final Calendar now = Calendar.getInstance(); private VersionInfo versionInfo = new VersionInfo(); @SuppressWarnings("PMD.AvoidUsingHardCodedIP") @@ -159,7 +158,7 @@ public class VersionInfoTest { assertEquals(versionInfo.getClassName(), "Example", "getClassName(Example"); - Assert.assertTrue((versionInfo.getEpoch() - now.getTimeInMillis()) < 1000, "buildDate - now < 1s"); + Assert.assertTrue((versionInfo.getEpoch() - new Date().getTime()) < 1000, "buildDate - now < 1s"); } @Test From af3de2cc74394c2efc1b6cd6f363e8fe68800c6d Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 31 May 2021 11:37:20 -0700 Subject: [PATCH 229/316] Added Github workflow martix for JDK 1.8, 11 & 15. --- .github/workflows/gradle.yml | 21 +++++++++++++++------ build.gradle | 33 +++++++++++++++++---------------- examples/java/build.gradle | 1 - 3 files changed, 32 insertions(+), 23 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 280a6a1..eef517b 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -5,17 +5,24 @@ on: [push, pull_request, workflow_dispatch] jobs: build: runs-on: ubuntu-latest + env: + GRADLE_OPTS: "-Dorg.gradle.jvmargs=-XX:MaxMetaspaceSize=512m" + SONAR_JDK: "11" + strategy: + matrix: + java-version: [ 1.8, 11, 15 ] steps: - uses: actions/checkout@v2 with: fetch-depth: 0 - - name: Set up JDK 11 + - name: Set up JDK ${{ matrix.java-version }} uses: actions/setup-java@v1 with: - java-version: 11 + java-version: ${{ matrix.java-version }} - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Cache SonarCloud packages + if: matrix.java-version == env.SONAR_JDK uses: actions/cache@v1 with: path: ~/.sonar/cache @@ -27,15 +34,17 @@ jobs: path: | ~/.gradle/caches ~/.gradle/wrapper - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + key: ${{ runner.os }}-gradle-${{ matrix.java-version }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} restore-keys: | - ${{ runner.os }}-gradle- + ${{ runner.os }}-gradle-${{ matrix.java-version }}- - name: Test with Gradle + run: ./gradlew build check --stacktrace + - name: SonarCloud + if: success() && matrix.java-version == env.SONAR_JDK env: - CI_NAME: "GitHub CI" GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - run: ./gradlew check sonarqube + run: ./gradlew sonarqube - name: Cleanup Gradle Cache run: | rm -f ~/.gradle/caches/modules-2/modules-2.lock diff --git a/build.gradle b/build.gradle index e3ad8c6..3f48fa9 100644 --- a/build.gradle +++ b/build.gradle @@ -71,7 +71,7 @@ pmd { publishing { publications { mavenJava(MavenPublication) { - from(components.java) + from components.java groupId = project.group artifactId = rootProject.name @@ -94,8 +94,8 @@ publishing { } } scm { - connection = "scm:git:" + mavenScmCon - developerConnection = "scm:git:" + mavenScmDevCon + connection = 'scm:git:' + mavenScmCon + developerConnection = 'scm:git:' + mavenScmDevCon url = mavenUrl } } @@ -103,11 +103,11 @@ publishing { } repositories { maven { - name = "ossrh" + name = 'ossrh' project.afterEvaluate { - url = project.version.contains("SNAPSHOT") - ? "https://oss.sonatype.org/content/repositories/snapshots/" - : "https://oss.sonatype.org/service/local/staging/deploy/maven2/" + url = project.version.contains('SNAPSHOT') + ? 'https://oss.sonatype.org/content/repositories/snapshots/' + : 'https://oss.sonatype.org/service/local/staging/deploy/maven2/' } credentials(PasswordCredentials) } @@ -135,8 +135,8 @@ javadoc { test { testLogging { - exceptionFormat = "full" - events("passed", "skipped", "failed") + exceptionFormat = 'full' + events('passed', 'skipped', 'failed') } useTestNG() @@ -161,11 +161,12 @@ tasks.withType(Checkstyle) { } } -task release(dependsOn: ['wrapper', 'clean', 'publishToMavenLocal']) { +task release { group = 'Publishing' description = 'Releases new version to local maven repository.' + dependsOn(wrapper, clean, publishToMavenLocal) doFirst { - println("Version: $version") + println "Version: $version" } } @@ -200,13 +201,13 @@ jacocoTestReport { sonarqube { properties { - property("sonar.organization", "ethauvin-github") - property("sonar.projectKey", "ethauvin_semver") - property("sonar.host.url", "https://sonarcloud.io") - property("sonar.sourceEncoding", "UTF-8") + property('sonar.organization', 'ethauvin-github') + property('sonar.projectKey', 'ethauvin_semver') + property('sonar.host.url', 'https://sonarcloud.io') + property('sonar.sourceEncoding', 'UTF-8') } } tasks.sonarqube { - dependsOn("jacocoTestReport") + dependsOn 'jacocoTestReport' } diff --git a/examples/java/build.gradle b/examples/java/build.gradle index 9b0e427..b17c5b8 100644 --- a/examples/java/build.gradle +++ b/examples/java/build.gradle @@ -34,6 +34,5 @@ tasks.withType(JavaCompile) { task runExample(type: JavaExec) { group = 'application' classpath = sourceSets.main.runtimeClasspath - main = 'com.example.Example' } From b224e1fc9981c18643aa45358831d7e24af7dc32 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 18 Jun 2021 17:20:30 -0700 Subject: [PATCH 230/316] Upgraded to Gradle 7.1. --- .github/workflows/gradle.yml | 10 ++++++++++ build.gradle | 2 +- examples/java/build.gradle | 4 ++-- .../java/gradle/wrapper/gradle-wrapper.jar | Bin 59203 -> 59536 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- examples/java/gradlew | 2 +- .../kotlin/gradle/wrapper/gradle-wrapper.jar | Bin 59203 -> 59536 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- examples/kotlin/gradlew | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 59203 -> 59536 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 2 +- 12 files changed, 19 insertions(+), 9 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index eef517b..251e704 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -5,22 +5,28 @@ on: [push, pull_request, workflow_dispatch] jobs: build: runs-on: ubuntu-latest + env: GRADLE_OPTS: "-Dorg.gradle.jvmargs=-XX:MaxMetaspaceSize=512m" SONAR_JDK: "11" + strategy: matrix: java-version: [ 1.8, 11, 15 ] + steps: - uses: actions/checkout@v2 with: fetch-depth: 0 + - name: Set up JDK ${{ matrix.java-version }} uses: actions/setup-java@v1 with: java-version: ${{ matrix.java-version }} + - name: Grant execute permission for gradlew run: chmod +x gradlew + - name: Cache SonarCloud packages if: matrix.java-version == env.SONAR_JDK uses: actions/cache@v1 @@ -28,6 +34,7 @@ jobs: path: ~/.sonar/cache key: ${{ runner.os }}-sonar restore-keys: ${{ runner.os }}-sonar + - name: Cache Gradle packages uses: actions/cache@v2 with: @@ -37,14 +44,17 @@ jobs: key: ${{ runner.os }}-gradle-${{ matrix.java-version }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} restore-keys: | ${{ runner.os }}-gradle-${{ matrix.java-version }}- + - name: Test with Gradle run: ./gradlew build check --stacktrace + - name: SonarCloud if: success() && matrix.java-version == env.SONAR_JDK env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} run: ./gradlew sonarqube + - name: Cleanup Gradle Cache run: | rm -f ~/.gradle/caches/modules-2/modules-2.lock diff --git a/build.gradle b/build.gradle index 3f48fa9..50a6664 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ plugins { id 'com.github.ben-manes.versions' version '0.39.0' id 'net.thauvin.erik.gradle.semver' version '1.0.4' id 'com.github.spotbugs' version '4.7.1' - id 'org.sonarqube' version '3.2.0' + id 'org.sonarqube' version '3.3' } import com.github.spotbugs.snom.SpotBugsTask diff --git a/examples/java/build.gradle b/examples/java/build.gradle index b17c5b8..5521c85 100644 --- a/examples/java/build.gradle +++ b/examples/java/build.gradle @@ -1,7 +1,7 @@ plugins { id 'java' id 'application' - id 'com.github.ben-manes.versions' version '0.38.0' + id 'com.github.ben-manes.versions' version '0.39.0' } // ./gradlew run @@ -34,5 +34,5 @@ tasks.withType(JavaCompile) { task runExample(type: JavaExec) { group = 'application' classpath = sourceSets.main.runtimeClasspath - main = 'com.example.Example' + mainClass = 'com.example.Example' } diff --git a/examples/java/gradle/wrapper/gradle-wrapper.jar b/examples/java/gradle/wrapper/gradle-wrapper.jar index e708b1c023ec8b20f512888fe07c5bd3ff77bb8f..7454180f2ae8848c63b8b4dea2cb829da983f2fa 100644 GIT binary patch delta 18435 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 B8dv}T delta 17845 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 X49Luk)baa85H9$5YCsTPT`SVRWMtMW diff --git a/examples/java/gradle/wrapper/gradle-wrapper.properties b/examples/java/gradle/wrapper/gradle-wrapper.properties index 0f80bbf..69a9715 100644 --- a/examples/java/gradle/wrapper/gradle-wrapper.properties +++ b/examples/java/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/java/gradlew b/examples/java/gradlew index 4f906e0..744e882 100755 --- a/examples/java/gradlew +++ b/examples/java/gradlew @@ -72,7 +72,7 @@ case "`uname`" in Darwin* ) darwin=true ;; - MINGW* ) + MSYS* | MINGW* ) msys=true ;; NONSTOP* ) diff --git a/examples/kotlin/gradle/wrapper/gradle-wrapper.jar b/examples/kotlin/gradle/wrapper/gradle-wrapper.jar index e708b1c023ec8b20f512888fe07c5bd3ff77bb8f..7454180f2ae8848c63b8b4dea2cb829da983f2fa 100644 GIT binary patch delta 18435 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 B8dv}T delta 17845 zcmV)CK*GO}(F4QI1F(Jx4W$DjNjn4p0N4ir06~)x5+0MO2`GQvQyWzj|J`gh3(E#l zNGO!HfVMRRN~%`0q^)g%XlN*vP!O#;m*h5VyX@j-1N|HN;8S1vqEAj=eCdn`)tUB9 zXZjcT^`bL6qvL}gvXj%9vrOD+x!Gc_0{$Zg+6lTXG$bmoEBV z*%y^c-mV0~Rjzv%e6eVI)yl>h;TMG)Ft8lqpR`>&IL&`>KDi5l$AavcVh9g;CF0tY zw_S0eIzKD?Nj~e4raA8wxiiImTRzv6;b6|LFmw)!E4=CiJ4I%&axSey4zE-MIh@*! z*P;K2Mx{xVYPLeagKA}Hj=N=1VrWU`ukuBnc14iBG?B}Uj>?=2UMk4|42=()8KOnc zrJzAxxaEIfjw(CKV6F$35u=1qyf(%cY8fXaS9iS?yetY{mQ#Xyat*7sSoM9fJlZqq zyasQ3>D>6p^`ck^Y|kYYZB*G})uAbQ#7)Jeb~glGz@2rPu}zBWDzo5K$tP<|meKV% z{Swf^eq6NBioF)v&~9NLIxHMTKe6gJ@QQ^A6fA!n#u1C&n`aG7TDXKM1Jly-DwTB` z+6?=Y)}hj;C#r5>&x;MCM4U13nuXVK*}@yRY~W3X%>U>*CB2C^K6_OZsXD!nG2RSX zQg*0)$G3%Es$otA@p_1N!hIPT(iSE=8OPZG+t)oFyD~{nevj0gZen$p>U<7}uRE`t5Mk1f4M0K*5 zbn@3IG5I2mk;8K>*RZ zPV6iL006)S001s%0eYj)9hu1 z9o)iQT9(v*sAuZ|ot){RrZ0Qw4{E0A+!Yx_M~#Pj&OPUM&i$RU=Uxu}e*6Sr2ror= z&?lmvFCO$)BY+^+21E>ENWe`I0{02H<-lz&?})gIVFyMWxX0B|0b?S6?qghp3lDgz z2?0|ALJU=7s-~Lb3>9AA5`#UYCl!Xeh^i@bxs5f&SdiD!WN}CIgq&WI4VCW;M!UJL zX2};d^sVj5oVl)OrkapV-C&SrG)*x=X*ru!2s04TjZ`pY$jP)4+%)7&MlpiZ`lgoF zo_p>^4qGz^(Y*uB10dY2kcIbt=$FIdYNqk;~47wf@)6|nJp z1cocL3zDR9N2Pxkw)dpi&_rvMW&Dh0@T*_}(1JFSc0S~Ph2Sr=vy)u*=TY$i_IHSo zR+&dtWFNxHE*!miRJ%o5@~GK^G~4$LzEYR-(B-b(L*3jyTq}M3d0g6sdx!X3-m&O% zK5g`P179KHJKXpIAAX`A2MFUA;`nXx^b?mboVbQgigIHTU8FI>`q53AjWaD&aowtj z{XyIX>c)*nLO~-WZG~>I)4S1d2q@&?nwL)CVSWqWi&m1&#K1!gt`g%O4s$u^->Dwq ziKc&0O9KQ7000OG0000%03-m(e&Y`S09YWC4iYDSty&3q8^?8ij|8zxaCt!zCFq1@ z9TX4Hl68`nY>}cQNW4Ullqp$~SHO~l1!CdFLKK}ij_t^a?I?C^CvlvnZkwiVn>dl2 z2$V(JN{`5`-8ShF_ek6HNRPBlPuIPYu>TAeAV5O2)35r3*_k(Q-h1+h5pb(Zu%oJ__pBsW0n5ILw`!&QR&YV`g0Fe z(qDM!FX_7;`U3rxX#QHT{f%h;)Eursw=*#qvV)~y%^Uo^% zi-%sMe^uz;#Pe;@{JUu05zT*i=u7mU9{MkT`ft(vPdQZoK&2mg=tnf8FsaNQ+QcPg zB>vP8Rd6Z0JoH5_Q`zldg;hx4azQCq*rRZThqlqTRMzn1O3_rQTrHk8LQ<{5UYN~` zM6*~lOGHyAnx&#yCK{i@%N1Us@=6cw=UQxpSE;<(LnnES%6^q^QhBYQ-VCSmIu8wh z@_LmwcFDfAhIn>`%h7L{)iGBzu`Md4dj-m3C8mA9+BL*<>q z#$7^ttIBOE-=^|zmG`K8yUKT{yjLu2SGYsreN0*~9yhFxn4U};Nv1XXj1fH*v-g=3 z@tCPc`YdzQGLp%zXwo*o$m9j-+~nSWls#s|?PyrHO%SUGdk**X9_=|b)Y%^j_V$3S z>mL2A-V)Q}qb(uZipEFVm?}HWc+%G6_K+S+87g-&RkRQ8-{0APDil115eG|&>WQhU zufO*|e`hFks^cJJmx_qNx{ltSp3aT|XgD5-VxGGXb7gkiOG$w^qMVBDjR8%!Sbh72niHRDV* ziFy8LE+*$j?t^6aZP9qt-ow;hzkmhvy*Hn-X^6?yVMbtNbyqZQ^rXg58`gk+I%Wv} zn_)dRq+3xjc8D%}EQ%nnTF7L7m}o9&*^jf`_qvUhVKY7w9Zgxr-0YHWFRd3$l_6UX zpXt^U&TiC*qZWx#pOG6k?3Tg)pra*fw(O6_45>lUBN1U5Qmc>^DHt)5b~Ntjsw!NI z1n4{$HWFeIi)*qvgK^ui;(81VQc1(wJ8C#tjR>Dkjf{xYC^_B^#qrdCc)uZxtgua6 zk98UGQF|;;k`c+0_z)tQ&9DwLB~&12@D1!*mTz_!3Mp=cg;B7Oq4cKN>5v&dW7q@H zal=g6Ipe`siZN4NZiBrkJCU*x216gmbV(FymgHuG@%%|8sgD?gR&0*{y4n=pukZnd z4=Nl~_>jVfbIehu)pG)WvuUpLR}~OKlW|)=S738Wh^a&L+Vx~KJU25o6%G7+Cy5mB zgmYsgkBC|@K4Jm_PwPoz`_|5QSk}^p`XV`649#jr4Lh^Q>Ne~#6Cqxn$7dNMF=%Va z%z9Ef6QmfoXAlQ3)PF8#3Y% zadcE<1`fd1&Q9fMZZnyI;&L;YPuy#TQ8b>AnXr*SGY&xUb>2678A+Y z8K%HOdgq_4LRFu_M>Ou|kj4W%sPPaV)#zDzN~25klE!!PFz_>5wCxglj7WZI13U5| zEq_YLKPH;v8sEhyG`dV_jozR);a6dBvkauhC;1dk%mr+J*Z6MMH9jqxFk@)&h{mHl zrf^i_d-#mTF=6-T8Rk?(1+rPGgl$9=j%#dkf@x6>czSc`jk7$f!9SrV{do%m!t8{? z_iAi$Qe&GDR#Nz^#uJ>-_?(E$ns)(3)X3cYY)?gFvU+N>nnCoBSmwB2<4L|xH19+4 z`$u#*Gt%mRw=*&|em}h_Y`Pzno?k^8e*hEwfM`A_yz-#vJtUfkGb=s>-!6cHfR$Mz z`*A8jVcz7T{n8M>ZTb_sl{EZ9Ctau4naX7TX?&g^VLE?wZ+}m)=YW4ODRy*lV4%-0 zG1XrPs($mVVfpnqoSihnIFkLdxG9um&n-U|`47l{bnr(|8dmglO7H~yeK7-wDwZXq zaHT($Qy2=MMuj@lir(iyxI1HnMlaJwpX86je}e=2n|Esb6hB?SmtDH3 z2qH6o`33b{;M{mDa5@@~1or8+Zcio*97pi1Jkx6v5MXCaYsb~Ynq)eWpKnF{n)FXZ z?Xd;o7ESu&rtMFr5(yJ(B7V>&0gnDdL*4MZH&eO+r*t!TR98ssbMRaw`7;`SLI8mT z=)hSAt~F=mz;JbDI6g~J%w!;QI(X14AnOu;uve^4wyaP3>(?jSLp+LQ7uU(iib%IyB(d&g@+hg;78M>h7yAeq$ALRoHGkKXA+E z$Sk-hd$Fs2nL4w9p@O*Y$c;U)W#d~)&8Js;i^Dp^* z0*7*zEGj~VehF4sRqSGny*K_CxeF=T^8;^lb}HF125G{kMRV?+hYktZWfNA^Mp7y8 zK~Q?ycf%rr+wgLaHQ|_<6z^eTG7izr@99SG9Q{$PCjJabSz`6L_QJJe7{LzTc$P&pwTy<&3RRUlSHmK;?}=QAhQaDW3#VWcNAH3 zeBPRTDf3?3mfdI$&WOg(nr9Gyzg`&u^o!f2rKJ57D_>p z6|?Vg?h(@(*X=o071{g^le>*>qSbVam`o}sAK8>b|11%e&;%`~b2OP7--q%0^2YDS z`2M`{2QYr1VC)sIW9WOu8<~7Q>^$*Og{KF+kI;wFegvaIDkB%3*%PWtWKSq7l`1YcDxQQ2@nv{J!xWV?G+w6C zhUUxUYVf%(Q(40_xrZB@rbxL=Dj3RV^{*yHd>4n-TOoHVRnazDOxxkS9kiZyN}IN3 zB^5N=* zRSTO+rA<{*P8-$GZdyUNOB=MzddG$*@q>mM;pUIiQ_z)hbE#Ze-IS)9G}Rt$5PSB{ zZZ;#h9nS7Rf1ecW&n(Gpu9}{vXQZ-f`UHIvD?cTbF`YvH*{rgE(zE22pLAQfhg-`U zuh612EpByB(~{w7svCylrBk%5$LCIyuhrGi=yOfca`=8ltKxHcSNfDRt@62QH^R_0 z&eQL6rRk>Dvf6rjMQv5ZXzg}S`HqV69hJT^pPHtdhqsrPJWs|IT9>BvpQa@*(FX6v zG}TYjreQCnH(slMt5{NgUf)qsS1F&Bb(M>$X}tWI&yt2I&-rJbqveuj?5J$`Dyfa2 z)m6Mq0XH@K)Y2v8X=-_4=4niodT&Y7W?$KLQhjA<+R}WTdYjX9>kD+SRS^oOY1{A= zZTId-(@wF^UEWso($wZtrs%e7t<}YaC_;#@`r0LUzKY&|qPJz*y~RHG`E6bypP5AX zN!p0^AUu8uDR>xM-ALFzBxXM~Q3z=}fHWCIG>0&I6x2Iu7&U)49j7qeMI&?qb$=4I zdMmhAJrO%@0f%YW! z^gLByEGSk+R0v4*d4w*N$Ju6z#j%HBI}6y$2en=-@S3=6+yZX94m&1j@s- z7T6|#0$c~dYq9IkA!P)AGkp~S$zYJ1SXZ#RM0|E~Q0PSm?DsT4N3f^)b#h(u9%_V5 zX*&EIX|gD~P!vtx?ra71pl%v)F!W~X2hcE!h8cu@6uKURdmo1-7icN4)ej4H1N~-C zjXgOK+mi#aJv4;`DZ%QUbVVZclkx;9`2kgbAhL^d{@etnm+5N8pB#fyH)bxtZGCAv z(%t0kPgBS{Q2HtjrfI0B$$M0c?{r~2T=zeXo7V&&aprCzww=i*}Atu7g^(*ivauMz~kkB%Vt{Wydlz%%2c26%>0PAbZO zVHx%tK(uzDl#ZZK`cW8TD2)eD77wB@gum{B2bO_jnqGl~01EF_^jx4Uqu1yfA~*&g zXJ`-N?D-n~5_QNF_5+Un-4&l$1b zVlHFqtluoN85b^C{A==lp#hS9J(npJ#6P4aY41r) zzCmv~c77X5L}H%sj>5t&@0heUDy;S1gSOS>JtH1v-k5l}z2h~i3^4NF6&iMb;ZYVE zMw*0%-9GdbpF1?HHim|4+)Zed=Fk<2Uz~GKc^P(Ig@x0&XuX0<-K(gA*KkN&lY2Xu zG054Q8wbK~$jE32#Ba*Id2vkqmfV{U$Nx9vJ;jeI`X+j1kh7hB8$CBTe@ANmT^tI8 z%U>zrTKuECin-M|B*gy(SPd`(_xvxjUL?s137KOyH>U{z01cBcFFt=Fp%d+BK4U;9 zQG_W5i)JASNpK)Q0wQpL<+Ml#cei41kCHe&P9?>p+KJN>I~`I^vK1h`IKB7k^xi`f z$H_mtr_+@M>C5+_xt%v}{#WO{86J83;VS@Ei3JLtp<*+hsY1oGzo z0?$?OJO$79;{|@aP!fO6t9TJ!?8i&|c&UPWRMbkwT3nEeFH`Yyyh6b%Rm^nBuTt@9 z+$&-4lf!G|@LCo3<8=yN@5dYbc%uq|Hz|0tiiLQKiUoM9g14zyECKGv0}3AWv2WJ zUAXGUhvkNk`0-H%ACsRSmy4fJ@kxBD3ZKSj6g(n1KPw?g{v19phcBr3BEF>J%lL|d zud3LNuL;cR*xS+;X+N^Br+x2{&hDMhb-$6_fKU(Pt0FQUXgNrZvzsVCnsFqv?#L z4-FYsQ-?D>;LdjHu_TT1CHN~aGkmDjWJkJg4G^!+V_APd%_48tErDv6BW5;ji^UDD zRu5Sw7wwplk`w{OGEKWJM&61c-AWn!SeUP8G#+beH4_Ov*)NUV?eGw&GHNDI6G(1Y zTfCv?T*@{QyK|!Q09wbk5koPD>=@(cA<~i4pSO?f(^5sSbdhUc+K$DW#_7^d7i%At z?KBg#vm$?P4h%?T=XymU;w*AsO_tJr)`+HUll+Uk_zx6vNw>G3jT){w3ck+Z=>7f0 zZVkM*!k^Z_E@_pZK6uH#|vzoL{-j1VFlUHP&5~q?j=UvJJNQG ztQdiCF$8_EaN_Pu8+afN6n8?m5UeR_p_6Log$5V(n9^W)-_vS~Ws`RJhQNPb1$C?| zd9D_ePe*`aI9AZ~Ltbg)DZ;JUo@-tu*O7CJ=T)ZI1&tn%#cisS85EaSvpS~c#CN9B z#Bx$vw|E@gm{;cJOuDi3F1#fxWZ9+5JCqVRCz5o`EDW890NUfNCuBn)3!&vFQE{E$L`Cf7FMSSX%ppLH+Z}#=p zSow$)$z3IL7frW#M>Z4|^9T!=Z8}B0h*MrWXXiVschEA=$a|yX9T~o!=%C?T+l^Cc zJx&MB$me(a*@lLLWZ=>PhKs!}#!ICa0! zq%jNgnF$>zrBZ3z%)Y*yOqHbKzEe_P=@<5$u^!~9G2OAzi#}oP&UL9JljG!zf{JIK z++G*8j)K=$#57N)hj_gSA8golO7xZP|KM?elUq)qLS)i(?&lk{oGMJh{^*FgklBY@Xfl<_Q zXP~(}ST6V01$~VfOmD6j!Hi}lsE}GQikW1YmBH)`f_+)KI!t#~B7=V;{F*`umxy#2Wt8(EbQ~ks9wZS(KV5#5Tn3Ia90r{}fI%pfbqBAG zhZ)E7)ZzqA672%@izC5sBpo>dCcpXi$VNFztSQnmI&u`@zQ#bqFd9d&ls?RomgbSh z9a2rjfNiKl2bR!$Y1B*?3Ko@s^L5lQN|i6ZtiZL|w5oq%{Fb@@E*2%%j=bcma{K~9 z*g1%nEZ;0g;S84ZZ$+Rfurh;Nhq0;{t~(EIRt}D@(Jb7fbe+_@H=t&)I)gPCtj*xI z9S>k?WEAWBmJZ|gs}#{3*pR`-`!HJ)1Dkx8vAM6Tv1bHZhH=MLI;iC#Y!$c|$*R>h zjP{ETat(izXB{@tTOAC4nWNhh1_%7AVaf!kVI5D=Jf5I1!?}stbx_Yv23hLf$iUTb z-)WrTtd2X+;vBW_q*Z6}B!10fs=2FA=3gy*dljsE43!G*3Uw(Is>(-a*5E!T4}b-Y zfvOC)-HYjNfcpi`=kG%(X3XcP?;p&=pz+F^6LKqRom~pA}O* zitR+Np{QZ(D2~p_Jh-k|dL!LPmexLM?tEqI^qRDq9Mg z5XBftj3z}dFir4oScbB&{m5>s{v&U=&_trq#7i&yQN}Z~OIu0}G)>RU*`4<}@7bB% zKYxGx0#L#u199YKSWZwV$nZd>D>{mDTs4qDNyi$4QT6z~D_%Bgf?>3L#NTtvX;?2D zS3IT*2i$Snp4fjDzR#<)A``4|dA(}wv^=L?rB!;kiotwU_gma`w+@AUtkSyhwp{M} z!e`jbUR3AG4XvnBVcyIZht6Vi~?pCC!$XF2 z*V~)DBVm8H7$*OZQJYl3482hadhsI2NCz~_NINtpC?|KI6H3`SG@1d%PsDdw{u}hq zN;OU~F7L1jT&KAitilb&Fl3X12zfSuFm;X)xQWOHL&7d)Q5wgn{78QJ6k5J;is+XP zCPO8_rlGMJB-kuQ*_=Yo1TswG4xnZd&eTjc8=-$6J^8TAa~kEnRQ@Zp-_W&B(4r@F zA==}0vBzsF1mB~743XqBmL9=0RSkGn$cvHf*hyc{<2{@hW+jKjbC|y%CNupHY_NC% zivz^btBLP-cDyV8j>u)=loBs>HoI5ME)xg)oK-Q0wAy|8WD$fm>K{-`0|W{H00;;G z000j`0OWQ8aHA9e04^;603eeQIvtaXMG=2tcr1y8Fl-J;AS+=<0%DU8Bp3oEEDhA^ zOY)M8%o5+cF$rC?trfMcty*f)R;^v=f~}||Xe!#;T3eTDZELN&-50xk+J1heP5AQ>h5O#S_uO;O@;~REd*_G$x$hVeE#bchX)otXQy|S5(oB)2a2%Sc(iDHm z=d>V|a!BLp9^#)o7^EQ2kg=K4%nI^sK2w@-kmvB+ARXYdq?xC2age6)e4$^UaY=wn zgLD^{X0A+{ySY+&7RpldwpC6=E zSPq?y(rl8ZN%(A*sapd4PU+dIakIwT0=zxIJEUW0kZSo|(zFEWdETY*ZjIk9uNMUA ze11=mHu8lUUlgRx!hItf0dAF#HfdIB+#aOuY--#QN9Ry zbx|XkG?PrBb@l6Owl{9Oa9w{x^R}%GwcEEfY;L-6OU8|9RXvu`-ECS`jcO1x1MP{P zcr;Bw##*Dod9K@pEx9z9G~MiNi>8v1OU-}vk*HbI)@CM? zn~b=jWUF%HP=CS+VCP>GiAU_UOz$aq3%%Z2laq^Gx`WAEmuNScCN)OlW>YHGYFgV2 z42lO5ZANs5VMXLS-RZTvBJkWy*OeV#L;7HwWg51*E|RpFR=H}h(|N+79g)tIW!RBK ze08bg^hlygY$C2`%N>7bDm`UZ(5M~DTanh3d~dg+OcNdUanr8azO?})g}EfnUB;5- zE1FX=ru?X=zAk4_6@__o1fE+ml1r&u^f1Kb24Jf-)zKla%-dbd>UZ1 zrj3!RR!Jg`ZnllKJ)4Yfg)@z>(fFepeOcp=F-^VHv?3jSxfa}-NB~*qkJ5Uq(yn+( z<8)qbZh{C!xnO@-XC~XMNVnr-Z+paowv!$H7>`ypMwA(X4(knx7z{UcWWe-wXM!d? zYT}xaVy|7T@yCbNOoy)$D=E%hUNTm(lPZqL)?$v+-~^-1P8m@Jm2t^L%4#!JK#Vtg zyUjM+Y*!$);1<)0MUqL00L0*EZcsE&usAK-?|{l|-)b7|PBKl}?TM6~#j9F+eZq25_L&oSl}DOMv^-tacpDI)l*Ws3u+~jO@;t(T)P=HCEZ#s_5q=m zOsVY!QsOJn)&+Ge6Tm)Ww_Bd@0PY(78ZJ)7_eP-cnXYk`>j9q`x2?Xc6O@55wF+6R zUPdIX!2{VGA;FSivN@+;GNZ7H2(pTDnAOKqF*ARg+C54vZ@Ve`i?%nDDvQRh?m&`1 zq46gH)wV=;UrwfCT3F(m!Q5qYpa!#f6qr0wF=5b9rk%HF(ITc!*R3wIFaCcftGwPt z(kzx{$*>g5L<;u}HzS4XD%ml zmdStbJcY@pn`!fUmkzJ8N>*8Y+DOO^r}1f4ix-`?x|khoRvF%jiA)8)P{?$8j2_qN zcl3Lm9-s$xdYN9)>3j6BPFK)Jbovl|Sf_p((CHe!4hx@F)hd&&*Xb&{TBj>%pT;-n z{3+hA^QZYnjXxtF2XwxPZ`S#J8h>5qLwtwM-{5abbEnRS z`9_`Zq8FJiI#0syE_V_3M&trw$P=ezkHosV$8&I5c0(*-9KBE5DJOC-Xv zw}1bq~AD0_Xerm`%ryiG9_$S z5G|btfiAUNdV09SO2l9v+e#(H6HYOdQs=^ z@xwZQU)~;p1L*~ciC}9ao{nQ-@B>rpUzKBxv=cUusOP5Trs3QnvHxGh9e>s7AM{V1|HfYe z3QwH;nHHR49fYzuGc3W3l5xrDAI392SFXx>lWE3V9Ds9il3PyZaN5>oC3>9W-^7vC z3~KZ-@iD?tIkhg+6t{m;RGk2%>@I0&kf)o$+-^ls0(YABNbM(=l#ad@nKp_j=b~Xs ziR;xu_+)lxy6|+af!@}gO2H_x)p;nZ-tYxW5Omq=l`GzMp*GTLr>vZN1?e}^C$t*Z zvzEdIc2|HA2RFN_4#EkzMqKnbbw!?!?%B@M0^^5Z;K?x-%lg?Z>}wMV8zEqHZ$cr~Y#Wv>9+)KMUZatUqbRU8 z8t9qrek(H^C0Tuzq|cP2$WL7tzj+Dj5y^2SF1D154CnsB$xbz`$wV||n-cG%rsT$p z+3RHdadK(3-noj(2L#8c5lODg)V8pv(GEnNb@F>dEHQr>!qge@L>#qg)RAUtiOYqF ziiV_ETExwD)bQ<))?-9$)E(FiRBYyC@}issHS!j9n)~I1tarxnQ2LfjdIJ)*jp{0E z&1oTd%!Qbw$W58s!6ms>F z=p0!~_Mv~8jyaicOS*t(ntw`5uFi0Bc4*mH8kSkk$>!f0;FM zX_t14I55!ZVsg0O$D2iuEDb7(J>5|NKW^Z~kzm@dax z9(|As$U7^}LF%#`6r&UPB*6`!Rf74h~*C=ami6xUxYCwiJxdr$+`z zKSC4A%8!s%R&j*2si(OEc*fy!q)?%=TjDZJ2}O zxT6o>jlKXz_7_Y$N})}IG`*#KfMzs#R(SI#)3*ZEzCv%_tu(VTZ5J| zw2$5kK)xTa>xGFgS0?X(NecjzFVKG%VVn?neu=&eQ+DJ1APlY1E?Q1s!Kk=yf7Uho z>8mg_!U{cKqpvI3ucSkC2V`!d^XMDk;>GG~>6>&X_z75-kv0UjevS5ORHV^e8r{tr z-9z*y&0eq3k-&c_AKw~<`8dtjsP0XgFv6AnG?0eo5P14T{xW#b*Hn2gEnt5-KvN1z zy!TUSi>IRbD3u+h@;fn7fy{F&hAKx7dG4i!c?5_GnvYV|_d&F16p;)pzEjB{zL-zr z(0&AZUkQ!(A>ghC5U-)t7(EXb-3)tNgb=z`>8m8n+N?vtl-1i&*ftMbE~0zsKG^I$ zSbh+rUiucsb!Ax@yB}j>yGeiKIZk1Xj!i#K^I*LZW_bWQIA-}FmJ~^}>p=K$bX9F{}z{s^KWc~OK(zl_X57aB^J9v}yQ5h#BE$+C)WOglV)nd0WWtaF{7`_Ur`my>4*NleQG#xae4fIo(b zW(&|g*#YHZNvDtE|6}yHvu(hDekJ-t*f!2RK;FZHRMb*l@Qwkh*~CqQRNLaepXypX z1?%ATf_nHIu3z6gK<7Dmd;{`0a!|toT0ck|TL$U;7Wr-*piO@R)KrbUz8SXO0vr1K z>76arfrqImq!ny+VkH!4?x*IR$d6*;ZA}Mhro(mzUa?agrFZpHi*)P~4~4N;XoIvH z9N%4VK|j4mV2DRQUD!_-9fmfA2(YVYyL#S$B;vqu7fnTbAFMqH``wS7^B5=|1O&fL z)qq(oV6_u4x(I(**#mD}MnAy(C&B4a1n6V%$&=vrIDq^F_KhE5Uw8_@{V`_#M0vCu zaNUXB=n0HT@D+ppDXi8-vp{tj)?7+k>1j}VvEKRgQ~DWva}8*pp`W8~KRo*kJ*&X} zP!~2fxQr@dM*q0dI|)Fux=pZWBk==RI7i{^BQf`kWlD2%|@R9!JA7& zLbM$uJ12y}_62$|T|{)@OJZtzfpL^t@1nMTYHutrF#D+^?~CN~9`YQ@#&&@c_Zf)( zbC~y8!2LO8jHwQXv>G~1q?c68ipT*%dY&c{8wd_!Y#~tMJ7yk!F8| zt?m_CLVw6cU@@p(#h4cY&Qsfz2Xp3w^4Cg%m03Tmq~9n%hyoMH^KY7{(QkRyn_!YB zzZa!Tgr~5$MAG$x)Fs71#6j}Kvcv3=9VUX8CH< zbP3|fY8f#$K*<5JQ7whM(v=GN2k26Xsh)#0!HKS(koLgAp-;)8z0w&_Z=nG4v6n8u z&Tm0Fi){4_!Y5Kp?!zv$FKfUifQ{%c82uYfrvE{%ejUd72aNYmI*0z3-a-EYr+bB->oH3#t(AY3 zV{Z=(SJr;D#0(`u*dc*~9T7D8Pudw894%!>c4wU&V1m<~0InidR6fbi?yPl(z+sKa zdF*kS>_4^1UO>y4T%Ar>epSr5&vp`$KdY7B(F%P0@VyHk@1fJ=6X0=aGjD-)BrOJD zW}IU@hg~^2r>a1fQvjTtvL*mKJ7q;pfP*U2=URL`VB_Y_JojbZ+MS=vaVN0C6L_MV zG1#5=35-E`KsD%r>-Q_ndvJ2tOYcMMP9f*t0iJ`(Z`^+YP)h>@lR(@Wvrt-`0tHG+ zuP2R@@mx=T@fPoQ1s`e^1I0H*kQPBGDky@!ZQG@8jY-+2ihreG5q$6i{3vmDTg0j$ zzRb*-nKN@{_wD`V6+i*YS)?$XfrA-sW?js?SYU8#vXxxQCc|*K!EbpWfu)3~jwq6_@KC0m;3A%jH^18_a0;ksC2DEwa@2{9@{ z9@T??<4QwR69zk{UvcHHX;`ICOwrF;@U;etd@YE)4MzI1WCsadP=`%^B>xPS-{`=~ zZ+2im8meb#4p~XIL9}ZOBg7D8R=PC8V}ObDcxEEK(4yGKcyCQWUe{9jCs+@k!_y|I z%s{W(&>P4w@hjQ>PQL$zY+=&aDU6cWr#hG)BVCyfP)h>@3IG5I2mk;8K>)Ppba*!h z005B=001VF5fT=Y4_ytCUk`sv8hJckqSy&Gc2Jx^WJ$J~08N{il-M$fz_ML$)Cpil z(nOv_nlZB^c4s&&O3h=OLiCz&(|f0 zxWU_-JZy>hxP*gvR>CLnNeQ1~g;6{g#-}AbkIzWR;j=8=6!AHpKQCbjFYxf9h%bov zVi;eNa1>t-<14KERUW>^KwoF+8zNo`Y*WiQwq}3m0_2RYtL9Wmu`JaRaQMQ)`Si^6+VbM`!rH~T?DX2=(n4nT zf`G`(Rpq*pDk*v~wMYPZ@vMNZDMPnxMYmU!lA{Xfo?n=Ibb4y3eyY1@Dut4|Y^ml& zqs$r}jAo=B(Ml>ogeEjyv(E`=kBzPf2uv9TQtO$~bamD#=Tv`lNy(K|w$J2O6jS51 zzZtOCHDWz7W0=L1XDW5WR5mtLGc~W+>*vX5{e~U@rE~?7e>vKU-v8bj;F4#abtcV(3ZtwXo9ia93HiETyQXwW4a-0){;$OU*l` zW^bjkyZTJ6_DL^0}`*)#EZ|2nvKRzMLH9-~@Z6$v#t8Dm%(qpP+DgzNe6d)1q zBqhyF$jJTyYFvl_=a>#I8jhJ)d6SBNPg#xg2^kZ3NX8kQ74ah(Y5Z8mlXyzTD&}Q8 ziY(pj-N-V2f>&hZQJ`Di%wp2fN(I%F@l)3M8GcSdNy+#HuO{$I8NXubRlFkL)cY@b z#`v{}-^hRXEq*8B_cG=%PZvI$eo(|8Wc(2o8L#0_GX9L$1@yV>%7mGk)QTD1R*OvS z4OW;ym1)%k9Bfem0tOqq3yyAUWp&q|LsN!RDnxa|j;>R|Mm2rIv7=tej5GFaa+`#| z;7u9Z_^XV+vD@2hF8Xe63+Qd`oig6S9jX(*DbjzPb*K-H7c^7E-(~!R6E%TrgW;RvG;WS{Ziv*W*a*`9Bb;$Er3?MyF~5GcXv`k>U)n}lwv$Sp+H@IKA5$mKk0g*4Ln{!tfvITeY zzr%8JJ5BdcEYsR9eGzJ4B&$}4FMmbRU6{8{_w7Kl77@PNe7|Bc#c?5(C5&Z=kJ#(oM90D4`rh2S!|^L!P#e#1hkD5@~-- z`63GV0~*rOZSqw7k^#-Y$Q4z3Oa2SPRURqEahB1B^h{7~+p03SwzqL9QU#$3-X zdYtQ?-K5xDAdfomEd6(yPtZ!yY_<35bMedeq`z2JWorljz5-f9<^93HM-$#+acw%9r!JOM%O<|BR`W& zd-%j_?b^q7Kl6{q^N{cg2u;11rFB5EP+oqG9&pHD#_Mo@aNMj;LUvsl&nK(ca(hT( zzFc2oHC6WQv8g7jo+3ZSwK+9G$cvfRnql)?g=XeQ3+LTh3)79nhEle8OqS3T$qn(> z(=5Bg?EWq-ldEywgzXW965%H(9^ik*rH(8dNdkbcS9|ow&_r`X~R^R?B+(oTiMzzlx8KnHqUi z8Rh-)VAnS-CO+3}yxqm8)X+N+uzieFVm-F#syP#M1p5&$wX3MJ8 z+R@grZ*5G^Uh4I@VT=>C4RJNc^~3mx$kS1F{L?3)BzdduD2MZKdu#jNno&f2&d{?` zW(>$oktzY@GO{|Ln~Bt^A4)(%?l-&(Dm!iL#$K_xOyhwAf=K2<+Bom zw7|hl6E5}B$d%n0sfZvfQRy9Fyz2~ z83#=#LaHnf1th^k*p|ux8!!8pfHE!)x*%=_hAddl)P%4h4%&8!5-W#xqqb}c=H(i|wqcIS&oDQ{ zhI7N-$f$ra3=RjPmMh?-IEkJYQ<}R9Z!}wmp$#~Uc%u1oh#TP}wF*kJJmQX2#27kL z_dz(yKufo<=m71bZfLp^Ll#t3(IHkrgMcvx@~om%Ib(h(<$Da7urTI`x|%`wD--sN zJEEa>4DGSEG?0ulkosfj8IMNN4)B=ZtvGG{|4Fp=Xhg!wPNgYzS>{Bp%%Qa+624X@ X49Luk)baa85H9$5YCsTPT`SVRWMtMW diff --git a/examples/kotlin/gradle/wrapper/gradle-wrapper.properties b/examples/kotlin/gradle/wrapper/gradle-wrapper.properties index 0f80bbf..69a9715 100644 --- a/examples/kotlin/gradle/wrapper/gradle-wrapper.properties +++ b/examples/kotlin/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/kotlin/gradlew b/examples/kotlin/gradlew index 4f906e0..744e882 100755 --- a/examples/kotlin/gradlew +++ b/examples/kotlin/gradlew @@ -72,7 +72,7 @@ case "`uname`" in Darwin* ) darwin=true ;; - MINGW* ) + MSYS* | MINGW* ) msys=true ;; NONSTOP* ) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e708b1c023ec8b20f512888fe07c5bd3ff77bb8f..7454180f2ae8848c63b8b4dea2cb829da983f2fa 100644 GIT binary patch delta 18435 zcmY&<19zBR)MXm8v2EM7ZQHi-#I|kQZfv7Tn#Q)%81v4zX3d)U4d4 zYYc!v@NU%|U;_sM`2z(4BAilWijmR>4U^KdN)D8%@2KLcqkTDW%^3U(Wg>{qkAF z&RcYr;D1I5aD(N-PnqoEeBN~JyXiT(+@b`4Pv`;KmkBXYN48@0;iXuq6!ytn`vGp$ z6X4DQHMx^WlOek^bde&~cvEO@K$oJ}i`T`N;M|lX0mhmEH zuRpo!rS~#&rg}ajBdma$$}+vEhz?JAFUW|iZEcL%amAg_pzqul-B7Itq6Y_BGmOCC zX*Bw3rFz3R)DXpCVBkI!SoOHtYstv*e-May|+?b80ZRh$MZ$FerlC`)ZKt} zTd0Arf9N2dimjs>mg5&@sfTPsRXKXI;0L~&t+GH zkB<>wxI9D+k5VHHcB7Rku{Z>i3$&hgd9Mt_hS_GaGg0#2EHzyV=j=u5xSyV~F0*qs zW{k9}lFZ?H%@4hII_!bzao!S(J^^ZZVmG_;^qXkpJb7OyR*sPL>))Jx{K4xtO2xTr@St!@CJ=y3q2wY5F`77Tqwz8!&Q{f7Dp zifvzVV1!Dj*dxG%BsQyRP6${X+Tc$+XOG zzvq5xcC#&-iXlp$)L=9t{oD~bT~v^ZxQG;FRz|HcZj|^L#_(VNG)k{=_6|6Bs-tRNCn-XuaZ^*^hpZ@qwi`m|BxcF6IWc?_bhtK_cDZRTw#*bZ2`1@1HcB`mLUmo_>@2R&nj7&CiH zF&laHkG~7#U>c}rn#H)q^|sk+lc!?6wg0xy`VPn!{4P=u@cs%-V{VisOxVqAR{XX+ zw}R;{Ux@6A_QPka=48|tph^^ZFjSHS1BV3xfrbY84^=?&gX=bmz(7C({=*oy|BEp+ zYgj;<`j)GzINJA>{HeSHC)bvp6ucoE`c+6#2KzY9)TClmtEB1^^Mk)(mXWYvup02e%Ghm9qyjz#fO3bNGBX} zFiB>dvc1+If!>I10;qZk`?6pEd*(?bI&G*3YLt;MWw&!?=Mf7%^Op?qnyXWur- zwX|S^P>jF?{m9c&mmK-epCRg#WB+-VDe!2d2~YVoi%7_q(dyC{(}zB${!ElKB2D}P z7QNFM!*O^?FrPMGZ}wQ0TrQAVqZy!weLhu_Zq&`rlD39r*9&2sJHE(JT0EY5<}~x@ z1>P0!L2IFDqAB!($H9s2fI`&J_c+5QT|b#%99HA3@zUWOuYh(~7q7!Pf_U3u!ij5R zjFzeZta^~RvAmd_TY+RU@e}wQaB_PNZI26zmtzT4iGJg9U(Wrgrl>J%Z3MKHOWV(? zj>~Ph$<~8Q_sI+)$DOP^9FE6WhO09EZJ?1W|KidtEjzBX3RCLUwmj9qH1CM=^}MaK z59kGxRRfH(n|0*lkE?`Rpn6d^u5J6wPfi0WF(rucTv(I;`aW)3;nY=J=igkjsn?ED ztH&ji>}TW8)o!Jg@9Z}=i2-;o4#xUksQHu}XT~yRny|kg-$Pqeq!^78xAz2mYP9+4 z9gwAoti2ICvUWxE&RZ~}E)#M8*zy1iwz zHqN%q;u+f6Ti|SzILm0s-)=4)>eb5o-0K zbMW8ecB4p^6OuIX@u`f{>Yn~m9PINEl#+t*jqalwxIx=TeGB9(b6jA}9VOHnE$9sC zH`;epyH!k-3kNk2XWXW!K`L_G!%xOqk0ljPCMjK&VweAxEaZ==cT#;!7)X&C|X{dY^IY(e4D#!tx^vV3NZqK~--JW~wtXJ8X19adXim?PdN(|@o(OdgH3AiHts~?#QkolO?*=U_buYC&tQ3sc(O5HGHN~=6wB@dgIAVT$ z_OJWJ^&*40Pw&%y^t8-Wn4@l9gOl`uU z{Uda_uk9!Iix?KBu9CYwW9Rs=yt_lE11A+k$+)pkY5pXpocxIEJe|pTxwFgB%Kpr&tH;PzgOQ&m|(#Otm?@H^r`v)9yiR8v&Uy>d#TNdRfyN4Jk;`g zp+jr5@L2A7TS4=G-#O<`A9o;{En5!I8lVUG?!PMsv~{E_yP%QqqTxxG%8%KxZ{uwS zOT+EA5`*moN8wwV`Z=wp<3?~f#frmID^K?t7YL`G^(X43gWbo!6(q*u%HxWh$$^2EOq`Hj zp=-fS#Av+s9r-M)wGIggQ)b<@-BR`R8l1G@2+KODmn<_$Tzb7k35?e8;!V0G>`(!~ zY~qZz!6*&|TupOcnvsQYPbcMiJ!J{RyfezB^;fceBk znpA1XS)~KcC%0^_;ihibczSxwBuy;^ksH7lwfq7*GU;TLt*WmUEVQxt{ zKSfJf;lk$0XO8~48Xn2dnh8tMC9WHu`%DZj&a`2!tNB`5%;Md zBs|#T0Ktf?vkWQ)Y+q!At1qgL`C|nbzvgc(+28Q|4N6Geq)Il%+I5c@t02{9^=QJ?=h2BTe`~BEu=_u3xX2&?^zwcQWL+)7dI>JK0g8_`W1n~ zMaEP97X>Ok#=G*nkPmY`VoP8_{~+Rp7DtdSyWxI~?TZHxJ&=6KffcO2Qx1?j7=LZA z?GQt`oD9QpXw+s7`t+eeLO$cpQpl9(6h3_l9a6OUpbwBasCeCw^UB6we!&h9Ik@1zvJ`j4i=tvG9X8o34+N|y(ay~ho$f=l z514~mP>Z>#6+UxM<6@4z*|hFJ?KnkQBs_9{H(-v!_#Vm6Z4(xV5WgWMd3mB9A(>@XE292#k(HdI7P zJkQ2)`bQXTKlr}{VrhSF5rK9TsjtGs0Rs&nUMcH@$ZX_`Hh$Uje*)(Wd&oLW($hZQ z_tPt`{O@f8hZ<}?aQc6~|9iHt>=!%We3=F9yIfiqhXqp=QUVa!@UY@IF5^dr5H8$R zIh{=%S{$BHG+>~a=vQ={!B9B=<-ID=nyjfA0V8->gN{jRL>Qc4Rc<86;~aY+R!~Vs zV7MI~gVzGIY`B*Tt@rZk#Lg}H8sL39OE31wr_Bm%mn}8n773R&N)8B;l+-eOD@N$l zh&~Wz`m1qavVdxwtZLACS(U{rAa0;}KzPq9r76xL?c{&GaG5hX_NK!?)iq`t7q*F# zFoKI{h{*8lb>&sOeHXoAiqm*vV6?C~5U%tXR8^XQ9Y|(XQvcz*>a?%HQ(Vy<2UhNf zVmGeOO#v159KV@1g`m%gJ)XGPLa`a|?9HSzSSX{j;)xg>G(Ncc7+C>AyAWYa(k}5B3mtzg4tsA=C^Wfezb1&LlyrBE1~kNfeiubLls{C)!<%#m@f}v^o+7<VZ6!FZ;JeiAG@5vw7Li{flC8q1%jD_WP2ApBI{fQ}kN zhvhmdZ0bb5(qK@VS5-)G+@GK(tuF6eJuuV5>)Odgmt?i_`tB69DWpC~e8gqh!>jr_ zL1~L0xw@CbMSTmQflpRyjif*Y*O-IVQ_OFhUw-zhPrXXW>6X}+73IoMsu2?uuK3lT>;W#38#qG5tDl66A7Y{mYh=jK8Se!+f=N7%nv zYSHr6a~Nxd`jqov9VgII{%EpC_jFCEc>>SND0;}*Ja8Kv;G)MK7?T~h((c&FEBcQq zvUU1hW2^TX(dDCeU@~a1LF-(+#lz3997A@pipD53&Dr@III2tlw>=!iGabjXzbyUJ z4Hi~M1KCT-5!NR#I%!2Q*A>mqI{dpmUa_mW)%SDs{Iw1LG}0y=wbj@0ba-`q=0!`5 zr(9q1p{#;Rv2CY!L#uTbs(UHVR5+hB@m*zEf4jNu3(Kj$WwW|v?YL*F_0x)GtQC~! zzrnZRmBmwt+i@uXnk05>uR5&1Ddsx1*WwMrIbPD3yU*2By`71pk@gt{|H0D<#B7&8 z2dVmXp*;B)SWY)U1VSNs4ds!yBAj;P=xtatUx^7_gC5tHsF#vvdV;NmKwmNa1GNWZ zi_Jn-B4GnJ%xcYWD5h$*z^haku#_Irh818x^KB)3-;ufjf)D0TE#6>|zFf@~pU;Rs zNw+}c9S+6aPzxkEA6R%s*xhJ37wmgc)-{Zd1&mD5QT}4BQvczWr-Xim>(P^)52`@R z9+Z}44203T5}`AM_G^Snp<_KKc!OrA(5h7{MT^$ZeDsSr(R@^kI?O;}QF)OU zQ9-`t^ys=6DzgLcWt0U{Q(FBs22=r zKD%fLQ^5ZF24c-Z)J{xv?x$&4VhO^mswyb4QTIofCvzq+27*WlYm;h@;Bq%i;{hZA zM97mHI6pP}XFo|^pRTuWQzQs3B-8kY@ajLV!Fb?OYAO3jFv*W-_;AXd;G!CbpZt04iW`Ie^_+cQZGY_Zd@P<*J9EdRsc>c=edf$K|;voXRJ zk*aC@@=MKwR120(%I_HX`3pJ+8GMeO>%30t?~uXT0O-Tu-S{JA;zHoSyXs?Z;fy58 zi>sFtI7hoxNAdOt#3#AWFDW)4EPr4kDYq^`s%JkuO7^efX+u#-qZ56aoRM!tC^P6O zP(cFuBnQGjhX(^LJ(^rVe4-_Vk*3PkBCj!?SsULdmVr0cGJM^=?8b0^DuOFq>0*yA zk1g|C7n%pMS0A8@Aintd$fvRbH?SNdRaFrfoAJ=NoX)G5Gr}3-$^IGF+eI&t{I-GT zp=1fj)2|*ur1Td)+s&w%p#E6tDXX3YYOC{HGHLiCvv?!%%3DO$B$>A}aC;8D0Ef#b z{7NNqC8j+%1n95zq8|hFY`afAB4E)w_&7?oqG0IPJZv)lr{MT}>9p?}Y`=n+^CZ6E zKkjIXPub5!82(B-O2xQojW^P(#Q*;ETpEr^+Wa=qDJ9_k=Wm@fZB6?b(u?LUzX(}+ zE6OyapdG$HC& z&;oa*ALoyIxVvB2cm_N&h&{3ZTuU|aBrJlGOLtZc3KDx)<{ z27@)~GtQF@%6B@w3emrGe?Cv_{iC@a#YO8~OyGRIvp@%RRKC?fclXMP*6GzBFO z5U4QK?~>AR>?KF@I;|(rx(rKxdT9-k-anYS+#S#e1SzKPslK!Z&r8iomPsWG#>`Ld zJ<#+8GFHE!^wsXt(s=CGfVz5K+FHYP5T0E*?0A-z*lNBf)${Y`>Gwc@?j5{Q|6;Bl zkHG1%r$r&O!N^><8AEL+=y(P$7E6hd=>BZ4ZZ9ukJ2*~HR4KGvUR~MUOe$d>E5UK3 z*~O2LK4AnED}4t1Fs$JgvPa*O+WeCji_cn1@Tv7XQ6l@($F1K%{E$!naeX)`bfCG> z8iD<%_M6aeD?a-(Qqu61&fzQqC(E8ksa%CulMnPvR35d{<`VsmaHyzF+B zF6a@1$CT0xGVjofcct4SyxA40uQ`b#9kI)& z?B67-12X-$v#Im4CVUGZHXvPWwuspJ610ITG*A4xMoRVXJl5xbk;OL(;}=+$9?H`b z>u2~yd~gFZ*V}-Q0K6E@p}mtsri&%Zep?ZrPJmv`Qo1>94Lo||Yl)nqwHXEbe)!g( zo`w|LU@H14VvmBjjkl~=(?b{w^G$~q_G(HL`>|aQR%}A64mv0xGHa`S8!*Wb*eB}` zZh)&rkjLK!Rqar)UH)fM<&h&@v*YyOr!Xk2OOMV%$S2mCRdJxKO1RL7xP_Assw)bb z9$sQ30bapFfYTS`i1PihJZYA#0AWNmp>x(;C!?}kZG7Aq?zp!B+gGyJ^FrXQ0E<>2 zCjqZ(wDs-$#pVYP3NGA=en<@_uz!FjFvn1&w1_Igvqs_sL>ExMbcGx4X5f%`Wrri@ z{&vDs)V!rd=pS?G(ricfwPSg(w<8P_6=Qj`qBC7_XNE}1_5>+GBjpURPmvTNE7)~r)Y>ZZecMS7Ro2` z0}nC_GYo3O7j|Wux?6-LFZs%1IV0H`f`l9or-8y0=5VGzjPqO2cd$RRHJIY06Cnh- ztg@Pn1OeY=W`1Mv3`Ti6!@QIT{qcC*&vptnX4Pt1O|dWv8u2s|(CkV`)vBjAC_U5` zCw1f&c4o;LbBSp0=*q z3Y^horBAnR)u=3t?!}e}14%K>^562K!)Vy6r~v({5{t#iRh8WIL|U9H6H97qX09xp zjb0IJ^9Lqxop<-P*VA0By@In*5dq8Pr3bTPu|ArID*4tWM7w+mjit0PgmwLV4&2PW z3MnIzbdR`3tPqtUICEuAH^MR$K_u8~-U2=N1)R=l>zhygus44>6V^6nJFbW-`^)f} zI&h$FK)Mo*x?2`0npTD~jRd}5G~-h8=wL#Y-G+a^C?d>OzsVl7BFAaM==(H zR;ARWa^C3J)`p~_&FRsxt|@e+M&!84`eq)@aO9yBj8iifJv0xVW4F&N-(#E=k`AwJ z3EFXWcpsRlB%l_0Vdu`0G(11F7( zsl~*@XP{jS@?M#ec~%Pr~h z2`M*lIQaolzWN&;hkR2*<=!ORL(>YUMxOzj(60rQfr#wTrkLO!t{h~qg% zv$R}0IqVIg1v|YRu9w7RN&Uh7z$ijV=3U_M(sa`ZF=SIg$uY|=NdC-@%HtkUSEqJv zg|c}mKTCM=Z8YmsFQu7k{VrXtL^!Cts-eb@*v0B3M#3A7JE*)MeW1cfFqz~^S6OXFOIP&iL;Vpy z4dWKsw_1Wn%Y;eW1YOfeP_r1s4*p1C(iDG_hrr~-I%kA>ErxnMWRYu{IcG{sAW;*t z9T|i4bI*g)FXPpKM@~!@a7LDVVGqF}C@mePD$ai|I>73B+9!Ks7W$pw;$W1B%-rb; zJ*-q&ljb=&41dJ^*A0)7>Wa@khGZ;q1fL(2qW=|38j43mTl_;`PEEw07VKY%71l6p z@F|jp88XEnm1p~<5c*cVXvKlj0{THF=n3sU7g>Ki&(ErR;!KSmfH=?49R5(|c_*xw z4$jhCJ1gWT6-g5EV)Ahg?Nw=}`iCyQ6@0DqUb%AZEM^C#?B-@Hmw?LhJ^^VU>&phJ zlB!n5&>I>@sndh~v$2I2Ue23F?0!0}+9H~jg7E`?CS_ERu75^jSwm%!FTAegT`6s7 z^$|%sj2?8wtPQR>@D3sA0-M-g-vL@47YCnxdvd|1mPymvk!j5W1jHnVB&F-0R5e-vs`@u8a5GKdv`LF7uCfKncI4+??Z4iG@AxuX7 z6+@nP^TZ5HX#*z(!y+-KJ3+Ku0M90BTY{SC^{ z&y2#RZPjfX_PE<<>XwGp;g4&wcXsQ0T&XTi(^f+}4qSFH1%^GYi+!rJo~t#ChTeAX zmR0w(iODzQOL+b&{1OqTh*psAb;wT*drr^LKdN?c?HJ*gJl+%kEH&48&S{s28P=%p z7*?(xFW_RYxJxxILS!kdLIJYu@p#mnQ(?moGD1)AxQd66X6b*KN?o&e`u9#N4wu8% z^Gw#G!@|>c740RXziOR=tdbkqf(v~wS_N^CS^1hN-N4{Dww1lvSWcBTX*&9}Cz|s@ z*{O@jZ4RVHq19(HC9xSBZI0M)E;daza+Q*zayrX~N5H4xJ33BD4gn5Ka^Hj{995z4 zzm#Eo?ntC$q1a?)dD$qaC_M{NW!5R!vVZ(XQqS67xR3KP?rA1^+s3M$60WRTVHeTH z6BJO$_jVx0EGPXy}XK_&x597 zt(o6ArN8vZX0?~(lFGHRtHP{gO0y^$iU6Xt2e&v&ugLxfsl;GD)nf~3R^ACqSFLQ< zV7`cXgry((wDMJB55a6D4J;13$z6pupC{-F+wpToW%k1qKjUS^$Mo zN3@}T!ZdpiV7rkNvqP3KbpEn|9aB;@V;gMS1iSb@ zwyD7!5mfj)q+4jE1dq3H`sEKgrVqk|y8{_vmn8bMOi873!rmnu5S=1=-DFx+Oj)Hi zx?~ToiJqOrvSou?RVALltvMADodC7BOg7pOyc4m&6yd(qIuV5?dYUpYzpTe!BuWKi zpTg(JHBYzO&X1e{5o|ZVU-X5e?<}mh=|eMY{ldm>V3NsOGwyxO2h)l#)rH@BI*TN; z`yW26bMSp=k6C4Ja{xB}s`dNp zE+41IwEwo>7*PA|7v-F#jLN>h#a`Er9_86!fwPl{6yWR|fh?c%qc44uP~Ocm2V*(* zICMpS*&aJjxutxKC0Tm8+FBz;3;R^=ajXQUB*nTN*Lb;mruQHUE<&=I7pZ@F-O*VMkJbI#FOrBM8`QEL5Uy=q5e2 z_BwVH%c0^uIWO0*_qD;0jlPoA@sI7BPwOr-mrp7y`|EF)j;$GYdOtEPFRAKyUuUZS z(N4)*6R*ux8s@pMdC*TP?Hx`Zh{{Ser;clg&}CXriXZCr2A!wIoh;j=_eq3_%n7V} za?{KhXg2cXPpKHc90t6=`>s@QF-DNcTJRvLTS)E2FTb+og(wTV7?$kI?QZYgVBn)& zdpJf@tZ{j>B;<MVHiPl_U&KlqBT)$ic+M0uUQWK|N1 zCMl~@o|}!!7yyT%7p#G4?T^Azxt=D(KP{tyx^lD_(q&|zNFgO%!i%7T`>mUuU^FeR zHP&uClWgXm6iXgI8*DEA!O&X#X(zdrNctF{T#pyax16EZ5Lt5Z=RtAja!x+0Z31U8 zjfaky?W)wzd+66$L>o`n;DISQNs09g{GAv%8q2k>2n8q)O^M}=5r#^WR^=se#WSCt zQ`7E1w4qdChz4r@v6hgR?nsaE7pg2B6~+i5 zcTTbBQ2ghUbC-PV(@xvIR(a>Kh?{%YAsMV#4gt1nxBF?$FZ2~nFLKMS!aK=(`WllA zHS<_7ugqKw!#0aUtQwd#A$8|kPN3Af?Tkn)dHF?_?r#X68Wj;|$aw)Wj2Dkw{6)*^ zZfy!TWwh=%g~ECDCy1s8tTgWCi}F1BvTJ9p3H6IFq&zn#3FjZoecA_L_bxGWgeQup zAAs~1IPCnI@H>g|6Lp^Bk)mjrA3_qD4(D(65}l=2RzF-8@h>|Aq!2K-qxt(Q9w7c^ z;gtx`I+=gKOl;h=#fzSgw-V*YT~2_nnSz|!9hIxFb{~dKB!{H zSi??dnmr@%(1w^Be=*Jz5bZeofEKKN&@@uHUMFr-DHS!pb1I&;x9*${bmg6=2I4Zt zHb5LSvojY7ubCNGhp)=95jQ00sMAC{IZdAFsN!lAVQDeiec^HAu=8);2AKqNTT!&E zo+FAR`!A1#T6w@0A+o%&*yzkvxsrqbrfVTG+@z8l4+mRi@j<&)U9n6L>uZoezW>qS zA4YfO;_9dQSyEYpkWnsk0IY}Nr2m(ql@KuQjLgY-@g z4=$uai6^)A5+~^TvLdvhgfd+y?@+tRE^AJabamheJFnpA#O*5_B%s=t8<;?I;qJ}j z&g-9?hbwWEez-!GIhqpB>nFvyi{>Yv>dPU=)qXnr;3v-cd`l}BV?6!v{|cHDOx@IG z;TSiQQ(8=vlH^rCEaZ@Yw}?4#a_Qvx=}BJuxACxm(E7tP4hki^jU@8A zUS|4tTLd)gr@T|F$1eQXPY%fXb7u}(>&9gsd3It^B{W#6F2_g40cgo1^)@-xO&R5X z>qKon+Nvp!4v?-rGQu#M_J2v+3e+?N-WbgPQWf`ZL{Xd9KO^s{uIHTJ6~@d=mc7i z+##ya1p+ZHELmi%3C>g5V#yZt*jMv( zc{m*Y;7v*sjVZ-3mBuaT{$g+^sbs8Rp7BU%Ypi+c%JxtC4O}|9pkF-p-}F{Z7-+45 zDaJQx&CNR)8x~0Yf&M|-1rw%KW3ScjWmKH%J1fBxUp(;F%E+w!U470e_3%+U_q7~P zJm9VSWmZ->K`NfswW(|~fGdMQ!K2z%k-XS?Bh`zrjZDyBMu74Fb4q^A=j6+Vg@{Wc zPRd5Vy*-RS4p1OE-&8f^Fo}^yDj$rb+^>``iDy%t)^pHSV=En5B5~*|32#VkH6S%9 zxgIbsG+|{-$v7mhOww#v-ejaS>u(9KV9_*X!AY#N*LXIxor9hDv%aie@+??X6@Et=xz>6ev9U>6Pn$g4^!}w2Z%Kpqpp+M%mk~?GE-jL&0xLC zy(`*|&gm#mLeoRU8IU?Ujsv=;ab*URmsCl+r?%xcS1BVF*rP}XRR%MO_C!a9J^fOe>U;Y&3aj3 zX`3?i12*^W_|D@VEYR;h&b^s#Kd;JMNbZ#*x8*ZXm(jgw3!jyeHo14Zq!@_Q`V;Dv zKik~!-&%xx`F|l^z2A92aCt4x*I|_oMH9oeqsQgQDgI0j2p!W@BOtCTK8Jp#txi}7 z9kz);EX-2~XmxF5kyAa@n_$YYP^Hd4UPQ>O0-U^-pw1*n{*kdX`Jhz6{!W=V8a$0S z9mYboj#o)!d$gs6vf8I$OVOdZu7L5%)Vo0NhN`SwrQFhP3y4iXe2uV@(G{N{yjNG( zKvcN{k@pXkxyB~9ucR(uPSZ7{~sC=lQtz&V(^A^HppuN!@B4 zS>B=kb14>M-sR>{`teApuHlca6YXs6&sRvRV;9G!XI08CHS~M$=%T~g5Xt~$exVk` zWP^*0h{W%`>K{BktGr@+?ZP}2t0&smjKEVw@3=!rSjw5$gzlx`{dEajg$A58m|Okx zG8@BTPODSk@iqLbS*6>FdVqk}KKHuAHb0UJNnPm!(XO{zg--&@#!niF4T!dGVdNif z3_&r^3+rfQuV^8}2U?bkI5Ng*;&G>(O4&M<86GNxZK{IgKNbRfpg>+32I>(h`T&uv zUN{PRP&onFj$tn1+Yh|0AF330en{b~R+#i9^QIbl9fBv>pN|k&IL2W~j7xbkPyTL^ z*TFONZUS2f33w3)fdzr?)Yg;(s|||=aWZV(nkDaACGSxNCF>XLJSZ=W@?$*` z#sUftY&KqTV+l@2AP5$P-k^N`Bme-xcWPS|5O~arUq~%(z8z87JFB|llS&h>a>Som zC34(_uDViE!H2jI3<@d+F)LYhY)hoW6)i=9u~lM*WH?hI(yA$X#ip}yYld3RAv#1+sBt<)V_9c4(SN9Fn#$}_F}A-}P>N+8io}I3mh!}> z*~*N}ZF4Zergb;`R_g49>ZtTCaEsCHiFb(V{9c@X0`YV2O^@c6~LXg2AE zhA=a~!ALnP6aO9XOC^X15(1T)3!1lNXBEVj5s*G|Wm4YBPV`EOhU&)tTI9-KoLI-U zFI@adu6{w$dvT(zu*#aW*4F=i=!7`P!?hZy(9iL;Z^De3?AW`-gYTPALhrZ*K2|3_ zfz;6xQN9?|;#_U=4t^uS2VkQ8$|?Ub5CgKOj#Ni5j|(zX>x#K(h7LgDP-QHwok~-I zOu9rn%y97qrtKdG=ep)4MKF=TY9^n6CugQ3#G2yx;{))hvlxZGE~rzZ$qEHy-8?pU#G;bwufgSN6?*BeA!7N3RZEh{xS>>-G1!C(e1^ zzd#;39~PE_wFX3Tv;zo>5cc=md{Q}(Rb?37{;YPtAUGZo7j*yHfGH|TOVR#4ACaM2 z;1R0hO(Gl}+0gm9Bo}e@lW)J2OU4nukOTVKshHy7u)tLH^9@QI-jAnDBp(|J8&{fKu=_97$v&F67Z zq+QsJ=gUx3_h_%=+q47msQ*Ub=gMzoSa@S2>`Y9Cj*@Op4plTc!jDhu51nSGI z^sfZ(4=yzlR}kP2rcHRzAY9@T7f`z>fdCU0zibx^gVg&fMkcl)-0bRyWe12bT0}<@ z^h(RgGqS|1y#M;mER;8!CVmX!j=rfNa6>#_^j{^C+SxGhbSJ_a0O|ae!ZxiQCN2qA zKs_Z#Zy|9BOw6x{0*APNm$6tYVG2F$K~JNZ!6>}gJ_NLRYhcIsxY1z~)mt#Yl0pvC zO8#Nod;iow5{B*rUn(0WnN_~~M4|guwfkT(xv;z)olmj=f=aH#Y|#f_*d1H!o( z!EXNxKxth9w1oRr0+1laQceWfgi8z`YS#uzg#s9-QlTT7y2O^^M1PZx z3YS7iegfp6Cs0-ixlG93(JW4wuE7)mfihw}G~Uue{Xb+#F!BkDWs#*cHX^%(We}3% zT%^;m&Juw{hLp^6eyM}J({luCL_$7iRFA6^8B!v|B9P{$42F>|M`4Z_yA{kK()WcM zu#xAZWG%QtiANfX?@+QQOtbU;Avr*_>Yu0C2>=u}zhH9VLp6M>fS&yp*-7}yo8ZWB z{h>ce@HgV?^HgwRThCYnHt{Py0MS=Ja{nIj5%z;0S@?nGQ`z`*EVs&WWNwbzlk`(t zxDSc)$dD+4G6N(p?K>iEKXIk>GlGKTH{08WvrehnHhh%tgpp&8db4*FLN zETA@<$V=I7S^_KxvYv$Em4S{gO>(J#(Wf;Y%(NeECoG3n+o;d~Bjme-4dldKukd`S zRVAnKxOGjWc;L#OL{*BDEA8T=zL8^`J=2N)d&E#?OMUqk&9j_`GX*A9?V-G zdA5QQ#(_Eb^+wDkDiZ6RXL`fck|rVy%)BVv;dvY#`msZ}{x5fmd! zInmWSxvRgXbJ{unxAi*7=Lt&7_e0B#8M5a=Ad0yX#0rvMacnKnXgh>4iiRq<&wit93n!&p zeq~-o37qf)L{KJo3!{l9l9AQb;&>)^-QO4RhG>j`rBlJ09~cbfNMR_~pJD1$UzcGp zOEGTzz01j$=-kLC+O$r8B|VzBotz}sj(rUGOa7PDYwX~9Tum^sW^xjjoncxSz;kqz z$Pz$Ze|sBCTjk7oM&`b5g2mFtuTx>xl{dj*U$L%y-xeQL~|i>KzdUHeep-Yd@}p&L*ig< zgg__3l9T=nbM3bw0Sq&Z2*FA)P~sx0h634BXz0AxV69cED7QGTbK3?P?MENkiy-mV zZ1xV5ry3zIpy>xmThBL0Q!g+Wz@#?6fYvzmEczs(rcujrfCN=^!iWQ6$EM zaCnRThqt~gI-&6v@KZ78unqgv9j6-%TOxpbV`tK{KaoBbhc}$h+rK)5h|bT6wY*t6st-4$e99+Egb#3ip+ERbve08G@Ref&hP)qB&?>B94?eq5i3k;dOuU#!y-@+&5>~!FZik=z4&4|YHy=~!F254 zQAOTZr26}Nc7jzgJ;V~+9ry#?7Z0o*;|Q)k+@a^87lC}}1C)S))f5tk+lMNqw>vh( z`A9E~5m#b9!ZDBltf7QIuMh+VheCoD7nCFhuzThlhA?|8NCt3w?oWW|NDin&&eDU6 zwH`aY=))lpWG?{fda=-auXYp1WIPu&3 zwK|t(Qiqvc@<;1_W#ALDJ}bR;3&v4$9rP)eAg`-~iCte`O^MY+SaP!w%~+{{1tMo` zbp?T%ENs|mHP)Lsxno=nWL&qizR+!Ib=9i%4=B@(Umf$|7!WVxkD%hfRjvxV`Co<; zG*g4QG_>;RE{3V_DOblu$GYm&!+}%>G*yO{-|V9GYG|bH2JIU2iO}ZvY>}Fl%1!OE zZFsirH^$G>BDIy`8;R?lZl|uu@qWj2T5}((RG``6*05AWsVVa2Iu>!F5U>~7_Tlv{ zt=Dpgm~0QVa5mxta+fUt)I0gToeEm9eJX{yYZ~3sLR&nCuyuFWuiDIVJ+-lwViO(E zH+@Rg$&GLueMR$*K8kOl>+aF84Hss5p+dZ8hbW$=bWNIk0paB!qEK$xIm5{*^ad&( zgtA&gb&6FwaaR2G&+L+Pp>t^LrG*-B&Hv;-s(h0QTuYWdnUObu8LRSZoAVd7SJ;%$ zh%V?58mD~3G2X<$H7I)@x?lmbeeSY7X~QiE`dfQ5&K^FB#9e!6!@d9vrSt!);@ZQZ zO#84N5yH$kjm9X4iY#f+U`FKhg=x*FiDoUeu1O5LcC2w&$~5hKB9ZnH+8BpbTGh5T zi_nfmyQY$vQh%ildbR7T;7TKPxSs#vhKR|uup`qi1PufMa(tNCjRbllakshQgn1)a8OO-j8W&aBc_#q1hKDF5-X$h`!CeT z+c#Ial~fDsGAenv7~f@!icm(~)a3OKi((=^zcOb^qH$#DVciGXslUwTd$gt{7)&#a`&Lp ze%AnL0#U?lAl8vUkv$n>bxH*`qOujO0HZkPWZnE0;}0DSEu1O!hg-d9#{&#B1Dm)L zvN%r^hdEt1vR<4zwshg*0_BNrDWjo65be1&_82SW8#iKWs7>TCjUT;-K~*NxpG2P% zovXUo@S|fMGudVSRQrP}J3-Wxq;4xIxJJC|Y#TQBr>pwfy*%=`EUNE*dr-Y?9y9xK zmh1zS@z{^|UL}v**LNYY!?1qIRPTvr!gNXzE{%=-`oKclPrfMKwn` zUwPeIvLcxkIV>(SZ-SeBo-yw~{p!<&_}eELG?wxp zee-V59%@BtB+Z&Xs=O(@P$}v_qy1m=+`!~r^aT> zY+l?+6(L-=P%m4ScfAYR8;f9dyVw)@(;v{|nO#lAPI1xDHXMYt~-BGiP&9y2OQsYdh7-Q1(vL<$u6W0nxVn-qh=nwuRk}{d!uACozccRGx6~xZQ;=#JCE?OuA@;4 zadp$sm}jfgW4?La(pb!3f0B=HUI{5A4b$2rsB|ZGb?3@CTA{|zBf07pYpQ$NM({C6Srv6%_{rVkCndT=1nS}qyEf}Wjtg$e{ng7Wgz$7itYy0sWW_$qld);iUm85GBH)fk3b=2|5mvflm?~inoVo zDH_%e;y`DzoNj|NgZ`U%a9(N*=~8!qqy0Etkxo#`r!!{|(NyT0;5= z8nVZ6AiM+SjMG8J@6c4_f-KXd_}{My?Se1GWP|@wROFpD^5_lu?I%CBzpwi(`x~xh B8dv}T delta 17845 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 X49Luk)baa85H9$5YCsTPT`SVRWMtMW diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0f80bbf..69a9715 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 4f906e0..744e882 100755 --- a/gradlew +++ b/gradlew @@ -72,7 +72,7 @@ case "`uname`" in Darwin* ) darwin=true ;; - MINGW* ) + MSYS* | MINGW* ) msys=true ;; NONSTOP* ) From 5dce160cf170265188ad9f0f1fe43e62e0b07768 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 18 Jun 2021 17:53:31 -0700 Subject: [PATCH 231/316] Changed dprecated annotationProcessorGeneratedSourcesDirectory to generatedSourceOutputDirectory. --- .idea/libraries-with-intellij-classes.xml | 65 +++++ .idea/semver.iml | 2 - README.md | 2 +- config/checkstyle/checkstyle.xml | 277 ---------------------- examples/java/build.gradle | 4 +- 5 files changed, 68 insertions(+), 282 deletions(-) create mode 100644 .idea/libraries-with-intellij-classes.xml delete mode 100644 .idea/semver.iml delete mode 100644 config/checkstyle/checkstyle.xml diff --git a/.idea/libraries-with-intellij-classes.xml b/.idea/libraries-with-intellij-classes.xml new file mode 100644 index 0000000..9fa3156 --- /dev/null +++ b/.idea/libraries-with-intellij-classes.xml @@ -0,0 +1,65 @@ + + + + + + \ No newline at end of file diff --git a/.idea/semver.iml b/.idea/semver.iml deleted file mode 100644 index 78b2cc5..0000000 --- a/.idea/semver.iml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/README.md b/README.md index 925e813..1800a7b 100644 --- a/README.md +++ b/README.md @@ -222,7 +222,7 @@ In order to also incorporate the generated source code into the `source tree`, a ```gradle tasks.withType(JavaCompile) { - options.annotationProcessorGeneratedSourcesDirectory = file("${projectDir}/src/generated/java") + options.generatedSourceOutputDirectory.set(file("${projectDir}/src/generated/java")) } ``` diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml deleted file mode 100644 index c5f6465..0000000 --- a/config/checkstyle/checkstyle.xml +++ /dev/null @@ -1,277 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/java/build.gradle b/examples/java/build.gradle index 5521c85..faa5849 100644 --- a/examples/java/build.gradle +++ b/examples/java/build.gradle @@ -27,12 +27,12 @@ dependencies { } tasks.withType(JavaCompile) { - options.annotationProcessorGeneratedSourcesDirectory = file("${projectDir}/src/generated/java") + options.generatedSourceOutputDirectory.set(file("${projectDir}/src/generated/java")) options.compilerArgs += [ "-Asemver.project.dir=$projectDir" ] } task runExample(type: JavaExec) { group = 'application' classpath = sourceSets.main.runtimeClasspath - mainClass = 'com.example.Example' + mainClass.set('com.example.Example') } From 5a422fe50284333a48fe2d1d6dcc71db0dfb7fed Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 18 Jun 2021 18:08:32 -0700 Subject: [PATCH 232/316] Removed checkstyle, using IDEA default code format. --- .idea/compiler.xml | 2 +- .idea/jarRepositories.xml | 5 ++ .idea/misc.xml | 58 ++++++++++++++++++- build.gradle | 12 +--- .../net/thauvin/erik/semver/Constants.java | 1 - .../java/net/thauvin/erik/semver/Version.java | 1 + .../net/thauvin/erik/semver/VersionInfo.java | 12 ++-- .../thauvin/erik/semver/VersionProcessor.java | 48 ++++++--------- .../thauvin/erik/semver/VersionInfoTest.java | 10 ++-- .../erik/semver/VersionProcessorTest.java | 2 +- .../net/thauvin/erik/semver/VersionTest.java | 2 +- 11 files changed, 98 insertions(+), 55 deletions(-) diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 6d140d3..d01a390 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -1,7 +1,7 @@ - + diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml index d32dd97..0d340d7 100644 --- a/.idea/jarRepositories.xml +++ b/.idea/jarRepositories.xml @@ -26,5 +26,10 @@ \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 5ae2566..6d605b0 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,5 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -20,7 +76,7 @@ - + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 50a6664..3e04cc7 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,4 @@ plugins { - id 'checkstyle' id 'java' id 'jacoco' id 'maven-publish' @@ -154,13 +153,6 @@ tasks.withType(SpotBugsTask) { } } -tasks.withType(Checkstyle) { - reports { - xml.enabled = false - html.enabled = true - } -} - task release { group = 'Publishing' description = 'Releases new version to local maven repository.' @@ -194,8 +186,8 @@ task pandoc(type: Exec) { jacocoTestReport { dependsOn(test) reports { - html.enabled = true - xml.enabled = true + html.required = true + xml.required = true } } diff --git a/src/main/java/net/thauvin/erik/semver/Constants.java b/src/main/java/net/thauvin/erik/semver/Constants.java index 5a004a2..51248e7 100644 --- a/src/main/java/net/thauvin/erik/semver/Constants.java +++ b/src/main/java/net/thauvin/erik/semver/Constants.java @@ -39,7 +39,6 @@ package net.thauvin.erik.semver; * @created 2016-01-13 * @since 1.0 */ -@SuppressWarnings("WeakerAccess") public final class Constants { /** * The default metadata prefix. diff --git a/src/main/java/net/thauvin/erik/semver/Version.java b/src/main/java/net/thauvin/erik/semver/Version.java index 8b29cec..fa0f500 100644 --- a/src/main/java/net/thauvin/erik/semver/Version.java +++ b/src/main/java/net/thauvin/erik/semver/Version.java @@ -44,6 +44,7 @@ import java.lang.annotation.Target; * @created 2016-01-13 * @since 1.0 */ +@SuppressWarnings("SameReturnValue") @Retention(RetentionPolicy.SOURCE) @Target(ElementType.TYPE) public @interface Version { diff --git a/src/main/java/net/thauvin/erik/semver/VersionInfo.java b/src/main/java/net/thauvin/erik/semver/VersionInfo.java index c45a062..270f5e7 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionInfo.java +++ b/src/main/java/net/thauvin/erik/semver/VersionInfo.java @@ -330,11 +330,11 @@ public class VersionInfo { */ public String getVersion() { return major - + separator - + minor - + separator - + patch - + (preRelease.length() > 0 ? preReleasePrefix + preRelease : "") - + (buildMeta.length() > 0 ? buildMetaPrefix + buildMeta : ""); + + separator + + minor + + separator + + patch + + (preRelease.length() > 0 ? preReleasePrefix + preRelease : "") + + (buildMeta.length() > 0 ? buildMetaPrefix + buildMeta : ""); } } diff --git a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java index 3e78f54..49cba2c 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java +++ b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java @@ -38,12 +38,7 @@ import com.github.mustachejava.MustacheFactory; import com.github.mustachejava.MustacheNotFoundException; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import javax.annotation.processing.AbstractProcessor; -import javax.annotation.processing.Filer; -import javax.annotation.processing.Messager; -import javax.annotation.processing.ProcessingEnvironment; -import javax.annotation.processing.RoundEnvironment; -import javax.annotation.processing.SupportedOptions; +import javax.annotation.processing.*; import javax.lang.model.SourceVersion; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; @@ -51,12 +46,7 @@ import javax.lang.model.element.PackageElement; import javax.lang.model.element.TypeElement; import javax.tools.Diagnostic; import javax.tools.FileObject; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; -import java.io.Writer; +import java.io.*; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.HashSet; @@ -70,7 +60,7 @@ import java.util.Set; * @created 2016-01-13 * @since 1.0 */ -@SuppressWarnings({ "PMD.GuardLogStatement", "PMD.BeanMembersShouldSerialize"}) +@SuppressWarnings({"PMD.GuardLogStatement", "PMD.BeanMembersShouldSerialize"}) @SupportedOptions({Constants.KAPT_KOTLIN_GENERATED_OPTION_NAME, Constants.SEMVER_PROJECT_DIR_ARG}) public class VersionProcessor extends AbstractProcessor { private Filer filer; @@ -97,27 +87,27 @@ public class VersionProcessor extends AbstractProcessor { final Properties p = new Properties(); try (InputStreamReader reader = new InputStreamReader( - Files.newInputStream(propsFile.toPath()), StandardCharsets.UTF_8)) { + Files.newInputStream(propsFile.toPath()), StandardCharsets.UTF_8)) { p.load(reader); versionInfo.setProject( - p.getProperty(version.keysPrefix() + version.projectKey(), version.project())); + p.getProperty(version.keysPrefix() + version.projectKey(), version.project())); versionInfo.setMajor( - parseIntProperty(p, version.keysPrefix() + version.majorKey(), version.major())); + parseIntProperty(p, version.keysPrefix() + version.majorKey(), version.major())); versionInfo.setMinor( - parseIntProperty(p, version.keysPrefix() + version.minorKey(), version.minor())); + parseIntProperty(p, version.keysPrefix() + version.minorKey(), version.minor())); versionInfo.setPatch( - parseIntProperty(p, version.keysPrefix() + version.patchKey(), version.patch())); + parseIntProperty(p, version.keysPrefix() + version.patchKey(), version.patch())); versionInfo.setBuildMeta( - p.getProperty(version.keysPrefix() + version.buildMetaKey(), version.buildMeta())); + p.getProperty(version.keysPrefix() + version.buildMetaKey(), version.buildMeta())); versionInfo.setBuildMetaPrefix( - p.getProperty(version.keysPrefix() + version.buildMetaPrefixKey(), version.buildMetaPrefix())); + p.getProperty(version.keysPrefix() + version.buildMetaPrefixKey(), version.buildMetaPrefix())); versionInfo.setPreRelease( - p.getProperty(version.keysPrefix() + version.preReleaseKey(), version.preRelease())); + p.getProperty(version.keysPrefix() + version.preReleaseKey(), version.preRelease())); versionInfo.setPreReleasePrefix(p.getProperty(version.keysPrefix() + version.preReleasePrefixKey(), - version.preReleasePrefix())); + version.preReleasePrefix())); versionInfo.setSeparator( - p.getProperty(version.keysPrefix() + version.separatorKey(), version.separator())); + p.getProperty(version.keysPrefix() + version.separatorKey(), version.separator())); } } else { final String findOrRead; @@ -128,7 +118,7 @@ public class VersionProcessor extends AbstractProcessor { } error("Could not " + findOrRead + ": " + propsFile); throw new FileNotFoundException( - "Could not " + findOrRead + " the specified file: `" + propsFile.getAbsolutePath() + '`'); + "Could not " + findOrRead + " the specified file: `" + propsFile.getAbsolutePath() + '`'); } } @@ -197,7 +187,7 @@ public class VersionProcessor extends AbstractProcessor { if (isLocalTemplate && Constants.DEFAULT_JAVA_TEMPLATE.equals(version.template())) { template = Constants.DEFAULT_TEMPLATE_NAME; } else if (Constants.DEFAULT_JAVA_TEMPLATE.equals(version.template()) && Constants.KOTLIN_TYPE - .equals(version.type())) { + .equals(version.type())) { template = Constants.DEFAULT_KOTLIN_TEMPLATE; } else { template = version.template(); @@ -216,7 +206,7 @@ public class VersionProcessor extends AbstractProcessor { private void log(final Diagnostic.Kind kind, final String s) { if (messager != null) { messager.printMessage(kind, - '[' + VersionProcessor.class.getSimpleName() + "] " + s + System.lineSeparator()); + '[' + VersionProcessor.class.getSimpleName() + "] " + s + System.lineSeparator()); } } @@ -239,7 +229,7 @@ public class VersionProcessor extends AbstractProcessor { @SuppressFBWarnings({"PATH_TRAVERSAL_IN", "UAC_UNNECESSARY_API_CONVERSION_FILE_TO_PATH"}) private void writeTemplate(final String type, final VersionInfo versionInfo, final String template) - throws IOException { + throws IOException { final File dir = getLocalFile(""); final MustacheFactory mf = new DefaultMustacheFactory(dir); final Mustache mustache = mf.compile(template); @@ -269,13 +259,13 @@ public class VersionProcessor extends AbstractProcessor { note("Could not create target directory: " + ktFile.getParentFile().getAbsolutePath()); } try (OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(ktFile.toPath()), - StandardCharsets.UTF_8)) { + StandardCharsets.UTF_8)) { mustache.execute(osw, versionInfo).flush(); } note("Generated source: " + fileName + " (" + ktFile.getParentFile().getAbsolutePath() + ')'); } else { final FileObject jfo = filer.createSourceFile( - versionInfo.getPackageName() + '.' + versionInfo.getClassName()); + versionInfo.getPackageName() + '.' + versionInfo.getClassName()); try (Writer writer = jfo.openWriter()) { mustache.execute(writer, versionInfo).flush(); } diff --git a/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java b/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java index be01241..30572e2 100644 --- a/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java +++ b/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java @@ -97,7 +97,7 @@ public class VersionInfoTest { assertEquals(versionInfo.getVersion(), "3-2-1+001", "getVersion(3-2-1+001)"); assertEquals(versionInfo.getVersion(), versionInfo.getSemver(), - "getVersion(3-2-1+001) = getSemver(3-2-1+001) "); + "getVersion(3-2-1+001) = getSemver(3-2-1+001) "); } @Test @@ -175,18 +175,18 @@ public class VersionInfoTest { assertEquals(versionInfo.getPreRelease(), version.preRelease(), "getPreRelease(preRelease)"); assertEquals(versionInfo.getPreReleasePrefix(), version.preReleasePrefix(), - "getPreReleasePrefix(preReleasePrefix)"); + "getPreReleasePrefix(preReleasePrefix)"); assertEquals(versionInfo.getBuildMeta(), version.buildMeta(), "getBuildMeta(buildMeta)"); assertEquals(versionInfo.getBuildMetaPrefix(), version.buildMetaPrefix(), - "getBuildMetaPrefix(buildMetaPrefix)"); + "getBuildMetaPrefix(buildMetaPrefix)"); assertEquals(versionInfo.getPackageName(), version.packageName(), "getPackageName(packageName)"); assertEquals(versionInfo.getVersion(), - version.major() + "." + version.minor() + '.' + version.patch() + '-' + version.preRelease() + '+' - + version.buildMeta(), "getVersion(version)"); + version.major() + "." + version.minor() + '.' + version.patch() + '-' + version.preRelease() + '+' + + version.buildMeta(), "getVersion(version)"); assertEquals(versionInfo.getVersion(), versionInfo.getSemver(), "getVersion(version) = getSemver(version)"); diff --git a/src/test/java/net/thauvin/erik/semver/VersionProcessorTest.java b/src/test/java/net/thauvin/erik/semver/VersionProcessorTest.java index cc77944..3f8ebe0 100644 --- a/src/test/java/net/thauvin/erik/semver/VersionProcessorTest.java +++ b/src/test/java/net/thauvin/erik/semver/VersionProcessorTest.java @@ -73,7 +73,7 @@ public class VersionProcessorTest { p.setProperty("4", " 4 "); final Method method = processor.getClass().getDeclaredMethod("parseIntProperty", Properties.class, String.class, - int.class); + int.class); method.setAccessible(true); assertEquals(method.invoke(processor, p, "1", -1), 1, "parseIntProperty(1)"); diff --git a/src/test/java/net/thauvin/erik/semver/VersionTest.java b/src/test/java/net/thauvin/erik/semver/VersionTest.java index 0df16dd..ed47982 100644 --- a/src/test/java/net/thauvin/erik/semver/VersionTest.java +++ b/src/test/java/net/thauvin/erik/semver/VersionTest.java @@ -41,7 +41,7 @@ import java.lang.annotation.Annotation; * @created 2019-04-02 * @since 1.2.0 */ -@SuppressWarnings({"ClassExplicitlyAnnotation"}) +@SuppressWarnings({"ClassExplicitlyAnnotation", "SameReturnValue"}) class VersionTest implements Version { @Override public Class annotationType() { From 8c5f4a72fadc5ba649adb4322f371f615038e29d Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 18 Jun 2021 19:41:38 -0700 Subject: [PATCH 233/316] CLeaned up examples. --- .editorconfig | 2 +- build.gradle | 4 +-- examples/examples.sh | 25 +++++++++---------- examples/java/.editorconfig | 2 +- examples/java/build.gradle | 3 ++- examples/java/pom.xml | 4 +-- .../java/com/example/ExampleVersion.java | 4 +-- .../java/com/example/GeneratedVersion.java | 4 +-- .../src/main/java/com/example/Example.java | 4 +-- examples/kotlin/.editorconfig | 2 +- examples/kotlin/build.gradle.kts | 3 ++- .../main/java/com/example/JavaExample.java | 2 +- .../src/main/kotlin/com/example/Example.kt | 4 +-- examples/test/.editorconfig | 2 +- examples/test/build.gradle | 4 +-- .../java/com/example/ExampleVersion.java | 2 +- .../src/main/java/com/example/Example.java | 4 +-- 17 files changed, 38 insertions(+), 37 deletions(-) diff --git a/.editorconfig b/.editorconfig index a6971e1..1f808de 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,2 +1,2 @@ [*] -insert_final_newline=true +insert_final_newline = true diff --git a/build.gradle b/build.gradle index 3e04cc7..b6d9447 100644 --- a/build.gradle +++ b/build.gradle @@ -142,8 +142,8 @@ test { } spotbugs { - toolVersion = versions.spotbugs - excludeFilter = file("$projectDir/config/spotbugs/excludeFilter.xml") + toolVersion.set("${versions.spotbugs}") + excludeFilter.set(file("$projectDir/config/spotbugs/excludeFilter.xml")) } tasks.withType(SpotBugsTask) { diff --git a/examples/examples.sh b/examples/examples.sh index 99926d3..23ed5a9 100755 --- a/examples/examples.sh +++ b/examples/examples.sh @@ -3,14 +3,14 @@ # Version 1.0 if [ $# -eq 0 ]; then - echo "Usage: $0 " - exit 1 + echo "Usage: $0 " + exit 1 fi # set the examples directories declare -a examples=( - "java" - "kotlin") + "java" + "kotlin") dir=$(dirname "$(readlink -f "$0")") cyan=$(tput setaf 6) @@ -18,13 +18,12 @@ normal=$(tput sgr0) i=0 for ex in "${examples[@]}"; do - if [ $i -ne 0 ] - then - read -p "Press [Enter] key to continue..." - clear - fi - cd "$dir/$ex" || exit 1 - echo "> Project: ${cyan}${ex}${normal}" - ./gradlew --console=plain --no-build-cache clean "$@" || exit 1 - (( i++ )) + if [ $i -ne 0 ]; then + read -p "Press [Enter] key to continue..." + clear + fi + cd "$dir/$ex" || exit 1 + echo "> Project: ${cyan}${ex}${normal}" + ./gradlew --console=plain --no-build-cache clean "$@" || exit 1 + ((i++)) done diff --git a/examples/java/.editorconfig b/examples/java/.editorconfig index a6971e1..1f808de 100644 --- a/examples/java/.editorconfig +++ b/examples/java/.editorconfig @@ -1,2 +1,2 @@ [*] -insert_final_newline=true +insert_final_newline = true diff --git a/examples/java/build.gradle b/examples/java/build.gradle index faa5849..80e59f5 100644 --- a/examples/java/build.gradle +++ b/examples/java/build.gradle @@ -19,6 +19,7 @@ mainClassName = 'com.example.App' repositories { mavenLocal() mavenCentral() + maven { url = uri("https://oss.sonatype.org/content/repositories/snapshots") } } dependencies { @@ -28,7 +29,7 @@ dependencies { tasks.withType(JavaCompile) { options.generatedSourceOutputDirectory.set(file("${projectDir}/src/generated/java")) - options.compilerArgs += [ "-Asemver.project.dir=$projectDir" ] + options.compilerArgs += ["-Asemver.project.dir=$projectDir"] } task runExample(type: JavaExec) { diff --git a/examples/java/pom.xml b/examples/java/pom.xml index 7c8fbc8..3823de9 100644 --- a/examples/java/pom.xml +++ b/examples/java/pom.xml @@ -1,6 +1,6 @@ - 4.0.0 diff --git a/examples/java/src/generated/java/com/example/ExampleVersion.java b/examples/java/src/generated/java/com/example/ExampleVersion.java index 4d2b300..a72d3a9 100644 --- a/examples/java/src/generated/java/com/example/ExampleVersion.java +++ b/examples/java/src/generated/java/com/example/ExampleVersion.java @@ -2,14 +2,14 @@ * This file is automatically generated. * Do not modify! -- ALL CHANGES WILL BE ERASED! */ - + package com.example; import java.util.Date; public final class ExampleVersion { public static final String PROJECT = "Java Example"; - public static final Date BUILDDATE = new Date(1620017348087L); + public static final Date BUILDDATE = new Date(1624066674216L); public static final String VERSION = "8.4.97-alpha+T800"; /** diff --git a/examples/java/src/generated/java/com/example/GeneratedVersion.java b/examples/java/src/generated/java/com/example/GeneratedVersion.java index b8c80aa..1f0b0a9 100644 --- a/examples/java/src/generated/java/com/example/GeneratedVersion.java +++ b/examples/java/src/generated/java/com/example/GeneratedVersion.java @@ -2,7 +2,7 @@ * This file is automatically generated. * Do not modify! -- ALL CHANGES WILL BE ERASED! */ - + package com.example; import java.util.Date; @@ -14,7 +14,7 @@ import java.util.Date; */ public final class GeneratedVersion { public static final String PROJECT = "Java App"; - public static final Date BUILDDATE = new Date(1620017348189L); + public static final Date BUILDDATE = new Date(1624066674199L); public static final int MAJOR = 11; public static final int MINOR = 11; public static final int PATCH = 20; diff --git a/examples/java/src/main/java/com/example/Example.java b/examples/java/src/main/java/com/example/Example.java index 324030f..c8c8c0b 100644 --- a/examples/java/src/main/java/com/example/Example.java +++ b/examples/java/src/main/java/com/example/Example.java @@ -6,7 +6,7 @@ import java.text.SimpleDateFormat; import java.util.Locale; @Version(properties = "example.properties", template = "example.mustache", className = "ExampleVersion", - keysPrefix = "example.") + keysPrefix = "example.") public final class Example { /** * Command line interface. @@ -19,7 +19,7 @@ public final class Example { System.out.println("-- From Example -------------------------------------"); System.out.println(" " + ExampleVersion.PROJECT + ' ' + ExampleVersion.VERSION - + " (" + sdf.format(ExampleVersion.BUILDDATE) + ')'); + + " (" + sdf.format(ExampleVersion.BUILDDATE) + ')'); System.out.println("-----------------------------------------------------"); } diff --git a/examples/kotlin/.editorconfig b/examples/kotlin/.editorconfig index a6971e1..1f808de 100644 --- a/examples/kotlin/.editorconfig +++ b/examples/kotlin/.editorconfig @@ -1,2 +1,2 @@ [*] -insert_final_newline=true +insert_final_newline = true diff --git a/examples/kotlin/build.gradle.kts b/examples/kotlin/build.gradle.kts index cb842f0..442d77f 100644 --- a/examples/kotlin/build.gradle.kts +++ b/examples/kotlin/build.gradle.kts @@ -31,6 +31,7 @@ kapt { repositories { mavenLocal() mavenCentral() + maven { url = uri("https://oss.sonatype.org/content/repositories/snapshots") } } application { @@ -40,7 +41,7 @@ application { tasks { register("runJava", JavaExec::class) { group = "application" - main = "com.example.JavaApp" + mainClass.set("com.example.JavaApp") classpath = sourceSets.main.get().runtimeClasspath } diff --git a/examples/kotlin/src/main/java/com/example/JavaExample.java b/examples/kotlin/src/main/java/com/example/JavaExample.java index cf6918c..b9aa8a9 100644 --- a/examples/kotlin/src/main/java/com/example/JavaExample.java +++ b/examples/kotlin/src/main/java/com/example/JavaExample.java @@ -15,7 +15,7 @@ public final class JavaExample { System.out.println("-- From JavaExample -----------------------------------"); System.out.println(" " + ExampleVersion.PROJECT + ' ' + ExampleVersion.VERSION - + " (" + sdf.format(ExampleVersion.BUILDDATE) + ')'); + + " (" + sdf.format(ExampleVersion.BUILDDATE) + ')'); System.out.println("-------------------------------------------------------"); } diff --git a/examples/kotlin/src/main/kotlin/com/example/Example.kt b/examples/kotlin/src/main/kotlin/com/example/Example.kt index 81bf914..5db8c0d 100644 --- a/examples/kotlin/src/main/kotlin/com/example/Example.kt +++ b/examples/kotlin/src/main/kotlin/com/example/Example.kt @@ -5,7 +5,7 @@ import java.text.SimpleDateFormat import java.util.Locale @Version(properties = "example.properties", type = "kt", template = "example.mustache", className = "ExampleVersion", - keysPrefix = "example.") + keysPrefix = "example.") class Example { companion object { @JvmStatic @@ -15,7 +15,7 @@ class Example { println("-------------------------------------------------------") println(" ${ExampleVersion.PROJECT} ${ExampleVersion.VERSION} (" - + sdf.format(ExampleVersion.BUILDDATE) + ')') + + sdf.format(ExampleVersion.BUILDDATE) + ')') println("-------------------------------------------------------") } diff --git a/examples/test/.editorconfig b/examples/test/.editorconfig index a6971e1..1f808de 100644 --- a/examples/test/.editorconfig +++ b/examples/test/.editorconfig @@ -1,2 +1,2 @@ [*] -insert_final_newline=true +insert_final_newline = true diff --git a/examples/test/build.gradle b/examples/test/build.gradle index 3ea6896..7ba6d12 100644 --- a/examples/test/build.gradle +++ b/examples/test/build.gradle @@ -27,6 +27,6 @@ dependencies { } tasks.withType(JavaCompile) { - options.annotationProcessorGeneratedSourcesDirectory = file("${projectDir}/src/generated/java") - options.compilerArgs += [ "-Asemver.project.dir=${projectDir}/example" ] + options.generatedSourceOutputDirectory.set(file("${projectDir}/src/generated/java")) + options.compilerArgs += ["-Asemver.project.dir=${projectDir}/example"] } diff --git a/examples/test/src/generated/java/com/example/ExampleVersion.java b/examples/test/src/generated/java/com/example/ExampleVersion.java index 46480b7..ef81de4 100644 --- a/examples/test/src/generated/java/com/example/ExampleVersion.java +++ b/examples/test/src/generated/java/com/example/ExampleVersion.java @@ -2,7 +2,7 @@ * This file is automatically generated. * Do not modify! -- ALL CHANGES WILL BE ERASED! */ - + package com.example; import java.util.Date; diff --git a/examples/test/src/main/java/com/example/Example.java b/examples/test/src/main/java/com/example/Example.java index 324030f..c8c8c0b 100644 --- a/examples/test/src/main/java/com/example/Example.java +++ b/examples/test/src/main/java/com/example/Example.java @@ -6,7 +6,7 @@ import java.text.SimpleDateFormat; import java.util.Locale; @Version(properties = "example.properties", template = "example.mustache", className = "ExampleVersion", - keysPrefix = "example.") + keysPrefix = "example.") public final class Example { /** * Command line interface. @@ -19,7 +19,7 @@ public final class Example { System.out.println("-- From Example -------------------------------------"); System.out.println(" " + ExampleVersion.PROJECT + ' ' + ExampleVersion.VERSION - + " (" + sdf.format(ExampleVersion.BUILDDATE) + ')'); + + " (" + sdf.format(ExampleVersion.BUILDDATE) + ')'); System.out.println("-----------------------------------------------------"); } From e01ea7882f013e62a388cb22f6879f377e65386a Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 3 Jan 2022 14:35:44 -0800 Subject: [PATCH 234/316] Updated dependencies and copyright. --- .circleci/config.yml | 64 +++-- .github/workflows/gradle.yml | 4 +- .gitignore | 39 +-- .idea/copyright/profiles_settings.xml | 6 +- .../inspectionProfiles/profiles_settings.xml | 2 +- .idea/runConfigurations.xml | 10 + LICENSE.txt | 2 +- appveyor.yml | 6 +- build.gradle | 22 +- examples/java/build.gradle | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- examples/java/gradlew | 269 +++++++++++------- examples/kotlin/build.gradle.kts | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- examples/kotlin/gradlew | 269 +++++++++++------- .../gradle/wrapper/gradle-wrapper.properties | 2 +- examples/test/gradlew | 269 +++++++++++------- gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 269 +++++++++++------- preflightcheck.sh | 264 ++++++++--------- .../net/thauvin/erik/semver/Constants.java | 2 +- .../java/net/thauvin/erik/semver/Version.java | 2 +- .../net/thauvin/erik/semver/VersionInfo.java | 2 +- .../thauvin/erik/semver/VersionProcessor.java | 4 +- .../java/net/thauvin/erik/semver/package.html | 32 +++ .../thauvin/erik/semver/ConstantsTest.java | 2 +- .../thauvin/erik/semver/VersionInfoTest.java | 2 +- .../erik/semver/VersionProcessorTest.java | 4 +- .../net/thauvin/erik/semver/VersionTest.java | 4 +- updatewrappers.sh | 54 ++-- 30 files changed, 933 insertions(+), 686 deletions(-) create mode 100644 .idea/runConfigurations.xml diff --git a/.circleci/config.yml b/.circleci/config.yml index 4690865..d753e7d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,44 +1,54 @@ version: 2 defaults: &defaults working_directory: ~/repo - docker: - - image: circleci/openjdk:8-jdk environment: JVM_OPTS: -Xmx3200m TERM: dumb + CI: true -jobs: - build_gradle: - <<: *defaults - - steps: - - checkout - - restore_cache: - keys: - - gradle-dependencies-{{ checksum "build.gradle" }} +defaults_gradle: &defaults_gradle + steps: + - checkout + - restore_cache: + keys: + - gradle-dependencies-{{ checksum "build.gradle.kts" }} # fallback to using the latest cache if no exact match is found - gradle-dependencies- + - run: + name: Gradle Dependencies + command: ./gradlew dependencies + - save_cache: + paths: ~/.m2 + key: gradle-dependencies-{{ checksum "build.gradle.kts" }} + - run: + name: Run All Checks + command: ./gradlew check + - store_artifacts: + path: build/reports/ + destination: reports + - store_test_results: + path: build/reports/ - - run: - name: Gradle Dependencies - command: ./gradlew dependencies +jobs: + build_gradle_jdk17: + <<: *defaults - - save_cache: - paths: ~/.m2 - key: gradle-dependencies-{{ checksum "build.gradle" }} + docker: + - image: cimg/openjdk:17.0 - - run: - name: Run All Checks - command: ./gradlew check + <<: *defaults_gradle - - store_artifacts: - path: build/reports/ - destination: reports - - store_test_results: - path: build/reports/ + build_gradle_jdk8: + <<: *defaults + + docker: + - image: cimg/openjdk:8.0 + + <<: *defaults_gradle workflows: version: 2 - build_gradle_jdk8: + gradle: jobs: - - build_gradle + - build_gradle_jdk8 + - build_gradle_jdk17 diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 251e704..b41ae6a 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -1,6 +1,6 @@ name: gradle-ci -on: [push, pull_request, workflow_dispatch] +on: [ push, pull_request, workflow_dispatch ] jobs: build: @@ -12,7 +12,7 @@ jobs: strategy: matrix: - java-version: [ 1.8, 11, 15 ] + java-version: [ 1.8, 11, 17 ] steps: - uses: actions/checkout@v2 diff --git a/.gitignore b/.gitignore index f007981..5c25369 100644 --- a/.gitignore +++ b/.gitignore @@ -1,22 +1,8 @@ -.vscode/* + !.vscode/extensions.json !.vscode/launch.json !.vscode/settings.json !.vscode/tasks.json - -__pycache__ -.classpath -.DS_Store -.gradle -.history -.kobalt -.mtj.tmp/ -.mvn/timing.properties -.mvn/wrapper/maven-wrapper.jar -.nb-gradle -.project -.scannerwork -.settings *.class *.code-workspace *.ctxt @@ -27,7 +13,21 @@ __pycache__ *.sublime-* *.tar.gz *.zip -/**/.idea_modules/ +.DS_Store +.classpath +.gradle +.history +.kobalt +.mtj.tmp/ +.mvn/timing.properties +.mvn/wrapper/maven-wrapper.jar +.nb-gradle +.project +.scannerwork +.settings +.vscode/* +/**/.idea/$CACHE_FILE$ +/**/.idea/$PRODUCT_WORKSPACE_FILE$ /**/.idea/**/caches/build_file_checksums.ser /**/.idea/**/contentModel.xml /**/.idea/**/dataSources.ids @@ -48,8 +48,10 @@ __pycache__ /**/.idea/**/uiDesigner.xml /**/.idea/**/usage.statistics.xml /**/.idea/**/workspace.xml -/**/.idea/$CACHE_FILE$ -/**/.idea/$PRODUCT_WORKSPACE_FILE$ +/**/.idea/sonarlint* +/**/.idea_modules/ +Thumbs.db +__pycache__ atlassian-ide-plugin.xml bin/ build/ @@ -80,5 +82,4 @@ project.properties release.properties target/ test-output -Thumbs.db venv diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml index 69bc70d..1419e40 100644 --- a/.idea/copyright/profiles_settings.xml +++ b/.idea/copyright/profiles_settings.xml @@ -1,7 +1,3 @@ - - - - - + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml index dc2dcae..dd4c951 100644 --- a/.idea/inspectionProfiles/profiles_settings.xml +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -1,6 +1,6 @@ - diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..797acea --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE.txt index ee0c2ec..95f6892 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (c) 2016-2021, Erik C. Thauvin (erik@thauvin.net) +Copyright (c) 2016-2022, Erik C. Thauvin (erik@thauvin.net) All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/appveyor.yml b/appveyor.yml index dd9bd2a..d902a4e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,5 +1,5 @@ image: - - Visual Studio 2019 + - Visual Studio 2019 version: "{branch} {build}" skip_tags: true @@ -23,8 +23,8 @@ cache: environment: matrix: - - JAVA_HOME: C:\Program Files\Java\jdk15 - - JAVA_HOME: C:\Program Files\Java\jdk11 + - JAVA_HOME: C:\Program Files\Java\jdk15 + - JAVA_HOME: C:\Program Files\Java\jdk11 matrix: fast_finish: true diff --git a/build.gradle b/build.gradle index b6d9447..9c1471e 100644 --- a/build.gradle +++ b/build.gradle @@ -4,9 +4,9 @@ plugins { id 'maven-publish' id 'pmd' id 'signing' - id 'com.github.ben-manes.versions' version '0.39.0' + id 'com.github.ben-manes.versions' version '0.40.0' id 'net.thauvin.erik.gradle.semver' version '1.0.4' - id 'com.github.spotbugs' version '4.7.1' + id 'com.github.spotbugs' version '5.0.3' id 'org.sonarqube' version '3.3' } @@ -25,9 +25,15 @@ final def mavenLicenseUrl = 'http://opensource.org/licenses/BSD-3-Clause' final def mavenScmCon = 'https://github.com/ethauvin/semver.git' final def mavenScmDevCon = 'git@github.com:ethauvin/semver.git' +def isNonStable = { String version -> + def stableKeyword = ['RELEASE', 'FINAL', 'GA'].any { it -> version.toUpperCase().contains(it) } + def regex = /^[0-9,.v-]+(-r)?$/ + return !stableKeyword && !(version ==~ regex) +} + ext.versions = [ - pmd: '6.35.0', - spotbugs: '4.2.3' + pmd: '6.41.0', + spotbugs: '4.5.2' ] repositories { @@ -59,6 +65,12 @@ java { withJavadocJar() } +tasks.named("dependencyUpdates").configure { + rejectVersionIf { + isNonStable(it.candidate.version) + } +} + pmd { toolVersion = versions.pmd ignoreFailures = true @@ -184,7 +196,7 @@ task pandoc(type: Exec) { } jacocoTestReport { - dependsOn(test) + dependsOn test reports { html.required = true xml.required = true diff --git a/examples/java/build.gradle b/examples/java/build.gradle index 80e59f5..d10460e 100644 --- a/examples/java/build.gradle +++ b/examples/java/build.gradle @@ -1,7 +1,7 @@ plugins { id 'java' id 'application' - id 'com.github.ben-manes.versions' version '0.39.0' + id 'com.github.ben-manes.versions' version '0.40.0' } // ./gradlew run diff --git a/examples/java/gradle/wrapper/gradle-wrapper.properties b/examples/java/gradle/wrapper/gradle-wrapper.properties index 69a9715..2e6e589 100644 --- a/examples/java/gradle/wrapper/gradle-wrapper.properties +++ b/examples/java/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/java/gradlew b/examples/java/gradlew index 744e882..1b6c787 100755 --- a/examples/java/gradlew +++ b/examples/java/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,67 +17,101 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MSYS* | MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -98,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -106,80 +140,95 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/examples/kotlin/build.gradle.kts b/examples/kotlin/build.gradle.kts index 442d77f..47a02a2 100644 --- a/examples/kotlin/build.gradle.kts +++ b/examples/kotlin/build.gradle.kts @@ -1,8 +1,8 @@ plugins { id("application") - id("com.github.ben-manes.versions") version "0.39.0" - kotlin("jvm") version "1.5.10" - kotlin("kapt") version "1.5.10" + id("com.github.ben-manes.versions") version "0.40.0" + kotlin("jvm") version "1.6.10" + kotlin("kapt") version "1.6.10" } // ./gradlew diff --git a/examples/kotlin/gradle/wrapper/gradle-wrapper.properties b/examples/kotlin/gradle/wrapper/gradle-wrapper.properties index 69a9715..2e6e589 100644 --- a/examples/kotlin/gradle/wrapper/gradle-wrapper.properties +++ b/examples/kotlin/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/kotlin/gradlew b/examples/kotlin/gradlew index 744e882..1b6c787 100755 --- a/examples/kotlin/gradlew +++ b/examples/kotlin/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,67 +17,101 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MSYS* | MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -98,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -106,80 +140,95 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/examples/test/gradle/wrapper/gradle-wrapper.properties b/examples/test/gradle/wrapper/gradle-wrapper.properties index e5338d3..2e6e589 100644 --- a/examples/test/gradle/wrapper/gradle-wrapper.properties +++ b/examples/test/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/test/gradlew b/examples/test/gradlew index 4f906e0..1b6c787 100755 --- a/examples/test/gradlew +++ b/examples/test/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,67 +17,101 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -98,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -106,80 +140,95 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 69a9715..2e6e589 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 744e882..1b6c787 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,67 +17,101 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MSYS* | MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -98,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -106,80 +140,95 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/preflightcheck.sh b/preflightcheck.sh index 1c8272a..3642481 100755 --- a/preflightcheck.sh +++ b/preflightcheck.sh @@ -8,8 +8,8 @@ ext=".java" java8=true # e.g: declare -a examples=( - "examples/java run runExample" - "examples/kotlin run runJava runExample runJavaExample") + "examples/java run runExample" + "examples/kotlin run runJava runExample runJavaExample") # e.g: empty or javadoc, etc. gradle_doc="javadoc pandoc" # e.g. empty or sonarqube @@ -23,10 +23,9 @@ maven_args="compile exec:java" # Version: 1.1.5 # -if [ "$java8" = true ] -then - export JAVA_HOME="$JAVA8_HOME" - export PATH="$(cygpath "$JAVA_HOME")/bin:$PATH" +if [ "$java8" = true ]; then + export JAVA_HOME="$JAVA8_HOME" + export PATH="$(cygpath "$JAVA_HOME")/bin:$PATH" fi pwd=$PWD @@ -40,174 +39,163 @@ pause() { } checkCopyright() { - if [ "$(grep -c "$date" "$1")" == "0" ] - then - echo -e " Invalid: ${red}$f${std}" - else - echo -e " Checked: $1" - fi + if [ "$(grep -c "$date" "$1")" == "0" ]; then + echo -e " Invalid: ${red}$f${std}" + else + echo -e " Checked: $1" + fi } runGradle() { - cd "$1" || exit 1 - clear - reset - echo -e "> Project: ${cyan}${1}${std} [Gradle]" - shift - ./gradlew $@ || exit 1 - pause - cd "$pwd" + cd "$1" || exit 1 + clear + reset + echo -e "> Project: ${cyan}${1}${std} [Gradle]" + shift + ./gradlew $@ || exit 1 + pause + cd "$pwd" } runKobalt() { - cd "$1" || exit 1 - if [ -f kobalt/src/Build.kt ] - then - clear - reset - echo -e "> Project: ${cyan}${1}${std} [Kobalt]" - shift - ./kobaltw $@ || exit 1 - pause - fi - cd "$pwd" + cd "$1" || exit 1 + if [ -f kobalt/src/Build.kt ]; then + clear + reset + echo -e "> Project: ${cyan}${1}${std} [Kobalt]" + shift + ./kobaltw $@ || exit 1 + pause + fi + cd "$pwd" } runMaven() { - cd "$1" || exit 1 - if [ -f pom.xml ] - then - clear - reset - echo -e "> Project: ${cyan}${1}${std} [Maven]" - shift - mvn $@ || exit 1 - pause - fi - cd "$pwd" + cd "$1" || exit 1 + if [ -f pom.xml ]; then + clear + reset + echo -e "> Project: ${cyan}${1}${std} [Maven]" + shift + mvn $@ || exit 1 + pause + fi + cd "$pwd" } updateWrappers() { - clear - ./updatewrappers.sh - pause + clear + ./updatewrappers.sh + pause } checkDeps() { - clear - echo -e "${cyan}Checking depencencies...${std}" - gradle --console=plain dU || exit 1 - read -p "Check Examples depencencies? [y/n] " cont - clear - case $cont in - [Nn] ) return ;; - * ) for ex in "${!examples[@]}" - do - runGradle $(echo "${examples[ex]}" | cut -d " " -f 1) dU - # runKobalt $(echo "${examples[ex]}" | cut -d " " -f 1) checkVersions - runMaven $(echo "${examples[ex]}" | cut -d " " -f 1) versions:display-dependency-updates - if [ "$ex" -eq "${#examples}" ] - then - read -p "Continue? [y/n]: " cont - clear - case $cont in - * ) continue ;; - [Nn] ) return ;; - esac - fi - done ;; - esac + clear + echo -e "${cyan}Checking depencencies...${std}" + gradle --console=plain dU || exit 1 + read -p "Check Examples depencencies? [y/n] " cont + clear + case $cont in + [Nn]) return ;; + *) for ex in "${!examples[@]}"; do + runGradle $(echo "${examples[ex]}" | cut -d " " -f 1) dU + # runKobalt $(echo "${examples[ex]}" | cut -d " " -f 1) checkVersions + runMaven $(echo "${examples[ex]}" | cut -d " " -f 1) versions:display-dependency-updates + if [ "$ex" -eq "${#examples}" ]; then + read -p "Continue? [y/n]: " cont + clear + case $cont in + *) continue ;; + [Nn]) return ;; + esac + fi + done ;; + esac } gradleCheck() { - clear - echo -e "${cyan}Checking Gradle build....${std}" - gradle $gradle_opts clean check $gradle_doc $gradle_sonar || exit 1 - pause + clear + echo -e "${cyan}Checking Gradle build....${std}" + gradle $gradle_opts clean check $gradle_doc $gradle_sonar || exit 1 + pause } runExamples() { - for ex in "${!examples[@]}" - do - runGradle ${examples[ex]} clean $gradle_opts - # runKobalt ${examples[ex]} clean - runMaven $(echo "${examples[ex]}" | cut -d " " -f 1) clean $maven_args - done + for ex in "${!examples[@]}"; do + runGradle ${examples[ex]} clean $gradle_opts + # runKobalt ${examples[ex]} clean + runMaven $(echo "${examples[ex]}" | cut -d " " -f 1) clean $maven_args + done } examplesMenu() { - clear - echo -e "${cyan}Examples${std}" - for ex in "${!examples[@]}" - do - printf ' %d. %s\n' $(($ex + 1)) $(echo "${examples[ex]}" | cut -d " " -f 1) - done - echo " $((${#examples[@]} + 1)). Run All Examples" - read -p "Enter choice [1-${#examples[@]}]: " choice - clear - case $choice in - [0-9] ) if [ "$choice" -gt "${#examples[@]}" ] - then - runExamples - examplesMenu - else - runGradle ${examples[$(($choice - 1))]} - # runKobalt ${examples[$(($choice - 1))]} - runMaven $(echo "${examples[$(($choice - 1))]}" | cut -d " " -f 1) $maven_args - examplesMenu - fi ;; - * ) return ;; - esac + clear + echo -e "${cyan}Examples${std}" + for ex in "${!examples[@]}"; do + printf ' %d. %s\n' $(($ex + 1)) $(echo "${examples[ex]}" | cut -d " " -f 1) + done + echo " $((${#examples[@]} + 1)). Run All Examples" + read -p "Enter choice [1-${#examples[@]}]: " choice + clear + case $choice in + [0-9]) if [ "$choice" -gt "${#examples[@]}" ]; then + runExamples + examplesMenu + else + runGradle ${examples[$(($choice - 1))]} + # runKobalt ${examples[$(($choice - 1))]} + runMaven $(echo "${examples[$(($choice - 1))]}" | cut -d " " -f 1) $maven_args + examplesMenu + fi ;; + *) return ;; + esac } validateCopyrights() { - clear - echo -e "${cyan}Validating copyrights...${std}" - for f in "LICENSE.txt" ${src}/*${ext} ${test}/*${ext} - do - if [ -f "$f" ] - then - checkCopyright "$f" - fi - done - pause + clear + echo -e "${cyan}Validating copyrights...${std}" + for f in "LICENSE.txt" ${src}/*${ext} ${test}/*${ext}; do + if [ -f "$f" ]; then + checkCopyright "$f" + fi + done + pause } everything() { - updateWrappers - checkDeps - gradleCheck - runExamples - validateCopyrights + updateWrappers + checkDeps + gradleCheck + runExamples + validateCopyrights } showMenu() { - clear - echo "${cyan}Preflight Check${std}" - echo " 1. Update Wrappers" - echo " 2. Check Dependencies" - echo " 3. Check Gradle Build" - echo " 4. Run Examples" - echo " 5. Validate Copyrights" - echo " 6. Check Everything" + clear + echo "${cyan}Preflight Check${std}" + echo " 1. Update Wrappers" + echo " 2. Check Dependencies" + echo " 3. Check Gradle Build" + echo " 4. Run Examples" + echo " 5. Validate Copyrights" + echo " 6. Check Everything" } readOptions() { - local choice - read -p "Enter choice [1-6]: " choice - case $choice in - 1) updateWrappers ;; - 2) checkDeps ;; - 3) gradleCheck ;; - 4) examplesMenu ;; - 5) validateCopyrights ;; - 6) everything ;; - *) exit 0 ;; - esac + local choice + read -p "Enter choice [1-6]: " choice + case $choice in + 1) updateWrappers ;; + 2) checkDeps ;; + 3) gradleCheck ;; + 4) examplesMenu ;; + 5) validateCopyrights ;; + 6) everything ;; + *) exit 0 ;; + esac } -while true -do - showMenu - readOptions +while true; do + showMenu + readOptions done diff --git a/src/main/java/net/thauvin/erik/semver/Constants.java b/src/main/java/net/thauvin/erik/semver/Constants.java index 51248e7..70a0ca7 100644 --- a/src/main/java/net/thauvin/erik/semver/Constants.java +++ b/src/main/java/net/thauvin/erik/semver/Constants.java @@ -1,7 +1,7 @@ /* * Constants.java * - * Copyright (c) 2016-2021, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2022, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/main/java/net/thauvin/erik/semver/Version.java b/src/main/java/net/thauvin/erik/semver/Version.java index fa0f500..e6ec6c1 100644 --- a/src/main/java/net/thauvin/erik/semver/Version.java +++ b/src/main/java/net/thauvin/erik/semver/Version.java @@ -1,7 +1,7 @@ /* * Version.java * - * Copyright (c) 2016-2021, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2022, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/main/java/net/thauvin/erik/semver/VersionInfo.java b/src/main/java/net/thauvin/erik/semver/VersionInfo.java index 270f5e7..95b12b1 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionInfo.java +++ b/src/main/java/net/thauvin/erik/semver/VersionInfo.java @@ -1,7 +1,7 @@ /* * VersionInfo.java * - * Copyright (c) 2016-2021, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2022, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java index 49cba2c..bfc2b89 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java +++ b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java @@ -1,7 +1,7 @@ /* * VersionProcessor.java * - * Copyright (c) 2016-2021, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2022, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -75,7 +75,7 @@ public class VersionProcessor extends AbstractProcessor { log(Diagnostic.Kind.ERROR, t != null ? t.toString() : s); } - @SuppressFBWarnings({"PATH_TRAVERSAL_IN", "UAC_UNNECESSARY_API_CONVERSION_FILE_TO_PATH"}) + @SuppressFBWarnings({"PATH_TRAVERSAL_IN"}) private VersionInfo findValues(final Version version) throws IOException { final VersionInfo versionInfo = new VersionInfo(version); diff --git a/src/main/java/net/thauvin/erik/semver/package.html b/src/main/java/net/thauvin/erik/semver/package.html index 1b1b126..e37a084 100644 --- a/src/main/java/net/thauvin/erik/semver/package.html +++ b/src/main/java/net/thauvin/erik/semver/package.html @@ -1,3 +1,35 @@ + + diff --git a/src/test/java/net/thauvin/erik/semver/ConstantsTest.java b/src/test/java/net/thauvin/erik/semver/ConstantsTest.java index c5a9a34..eb7fabf 100644 --- a/src/test/java/net/thauvin/erik/semver/ConstantsTest.java +++ b/src/test/java/net/thauvin/erik/semver/ConstantsTest.java @@ -1,7 +1,7 @@ /* * ConstantsTest.java * - * Copyright (c) 2016-2021, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2022, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java b/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java index 30572e2..5de7828 100644 --- a/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java +++ b/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java @@ -1,7 +1,7 @@ /* * VersionInfoTest.java * - * Copyright (c) 2016-2021, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2022, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/test/java/net/thauvin/erik/semver/VersionProcessorTest.java b/src/test/java/net/thauvin/erik/semver/VersionProcessorTest.java index 3f8ebe0..8e2315d 100644 --- a/src/test/java/net/thauvin/erik/semver/VersionProcessorTest.java +++ b/src/test/java/net/thauvin/erik/semver/VersionProcessorTest.java @@ -1,7 +1,7 @@ /* * VersionProcessorTest.java * - * Copyright (c) 2016-2021, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2022, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -53,6 +53,7 @@ public class VersionProcessorTest { private final Version version = new VersionTest(); @SuppressFBWarnings("RFI_SET_ACCESSIBLE") + @SuppressWarnings("PMD.AvoidAccessibilityAlteration") @Test public void testFindValues() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { final Method method = processor.getClass().getDeclaredMethod("findValues", Version.class); @@ -64,6 +65,7 @@ public class VersionProcessorTest { } @SuppressFBWarnings("RFI_SET_ACCESSIBLE") + @SuppressWarnings("PMD.AvoidAccessibilityAlteration") @Test public void testParseIntProperty() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { final Properties p = new Properties(); diff --git a/src/test/java/net/thauvin/erik/semver/VersionTest.java b/src/test/java/net/thauvin/erik/semver/VersionTest.java index ed47982..ea311ac 100644 --- a/src/test/java/net/thauvin/erik/semver/VersionTest.java +++ b/src/test/java/net/thauvin/erik/semver/VersionTest.java @@ -1,7 +1,7 @@ /* * VersionTest.java * - * Copyright (c) 2016-2021, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2022, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -41,7 +41,7 @@ import java.lang.annotation.Annotation; * @created 2019-04-02 * @since 1.2.0 */ -@SuppressWarnings({"ClassExplicitlyAnnotation", "SameReturnValue"}) +@SuppressWarnings({"ClassExplicitlyAnnotation", "SameReturnValue", "java:S2187"}) class VersionTest implements Version { @Override public Class annotationType() { diff --git a/updatewrappers.sh b/updatewrappers.sh index 000f0b6..b841e09 100755 --- a/updatewrappers.sh +++ b/updatewrappers.sh @@ -6,9 +6,9 @@ # set the examples directories declare -a dirs=( - "${PWD##*/}" - "examples/java" - "examples/kotlin") + "${PWD##*/}" + "examples/java" + "examples/kotlin") java8=true ### @@ -27,34 +27,34 @@ std=$(tput sgr0) #kVer=$(kobaltw --version | awk '{print substr($2, 1, length($2)-1)}') updateWrappers() { - curVer="$(gradle --version | awk '/Gradle/ {print $2}')" - if [ -d gradle ]; then - if [ "$curVer" != "$(./gradlew --version | awk '/Gradle/ {print $2}')" ]; then - gradle -q --console=plain wrapper - echo -e " $(./gradlew --version | awk '/Gradle/') ${green}UPDATED${std}" - else - echo -e " Gradle $curVer UP-TO-DATE" - fi + curVer="$(gradle --version | awk '/Gradle/ {print $2}')" + if [ -d gradle ]; then + if [ "$curVer" != "$(./gradlew --version | awk '/Gradle/ {print $2}')" ]; then + gradle -q --console=plain wrapper + echo -e " $(./gradlew --version | awk '/Gradle/') ${green}UPDATED${std}" + else + echo -e " Gradle $curVer UP-TO-DATE" fi -# if [ -d kobalt ]; then -# kw=$(cut -d "=" -f 2 kobalt/wrapper/kobalt-wrapper.properties) -# if [ "$kw" = "$kVer" ] -# then -# echo -e " Kobalt $kw UP-TO-DATE" -# else -# echo -e "kobalt.version=$kVer" > kobalt/wrapper/kobalt-wrapper.properties -# echo -e " Kobalt $kVer ${green}UPDATED${std}" -# fi -# fi + fi + # if [ -d kobalt ]; then + # kw=$(cut -d "=" -f 2 kobalt/wrapper/kobalt-wrapper.properties) + # if [ "$kw" = "$kVer" ] + # then + # echo -e " Kobalt $kw UP-TO-DATE" + # else + # echo -e "kobalt.version=$kVer" > kobalt/wrapper/kobalt-wrapper.properties + # echo -e " Kobalt $kVer ${green}UPDATED${std}" + # fi + # fi } echo -e "Updating wrappers..." for d in "${!dirs[@]}"; do - if [ "$d" -ne 0 ]; then - cd "${dirs[d]}" || exit 1 - fi - echo -e " ${cyan}${dirs[d]}${std}" - updateWrappers - cd "$pwd" + if [ "$d" -ne 0 ]; then + cd "${dirs[d]}" || exit 1 + fi + echo -e " ${cyan}${dirs[d]}${std}" + updateWrappers + cd "$pwd" done From 2ce19a215f7e40a6df822e181b8bdf7392109324 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Thu, 28 Apr 2022 21:55:25 -0700 Subject: [PATCH 235/316] Updated dependencies --- README.md | 4 ++-- build.gradle | 17 +++++++++++------ examples/java/build.gradle | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- examples/kotlin/build.gradle.kts | 6 +++--- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 8 files changed, 21 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 1800a7b..06f05fd 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ # Semantic Version Annotation Processor -[![License (3-Clause BSD)](https://img.shields.io/badge/license-BSD%203--Clause-blue.svg?style=flat-square)](http://opensource.org/licenses/BSD-3-Clause) [![release](https://img.shields.io/github/release/ethauvin/semver.svg)](https://github.com/ethauvin/semver/releases/latest) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver/badge.svg)](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver) +[![License (3-Clause BSD)](https://img.shields.io/badge/license-BSD%203--Clause-blue.svg?style=flat-square)](https://opensource.org/licenses/BSD-3-Clause) [![release](https://img.shields.io/github/release/ethauvin/semver.svg)](https://github.com/ethauvin/semver/releases/latest) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver/badge.svg)](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver) [![Known Vulnerabilities](https://snyk.io/test/github/ethauvin/semver/badge.svg?targetFile=build.gradle)](https://snyk.io/test/github/ethauvin/semver?targetFile=build.gradle) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=ethauvin_semver&metric=alert_status)](https://sonarcloud.io/dashboard?id=ethauvin_semver) [![GitHub CI](https://github.com/ethauvin/semver/actions/workflows/gradle.yml/badge.svg)](https://github.com/ethauvin/semver/actions/workflows/gradle.yml) [![Build status](https://ci.appveyor.com/api/projects/status/nbv4mxd1gpxtx69o?svg=true)](https://ci.appveyor.com/project/ethauvin/semver) [![CircleCI](https://circleci.com/gh/ethauvin/semver/tree/master.svg?style=shield)](https://circleci.com/gh/ethauvin/semver/tree/master) -An [annotation processor](https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html) that automatically generates a `GeneratedVersion` class based on a [Mustache](https://mustache.github.io/) template and containing the [semantic version](http://semver.org/) (major, minor, patch, etc.) that is read from a [Properties](https://docs.oracle.com/javase/tutorial/essential/environment/properties.html) file or defined in the [annotation](https://docs.oracle.com/javase/tutorial/java/annotations/basics.html). +An [annotation processor](https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html) that automatically generates a `GeneratedVersion` class based on a [Mustache](https://mustache.github.io/) template and containing the [semantic version](https://semver.org/) (major, minor, patch, etc.) that is read from a [Properties](https://docs.oracle.com/javase/tutorial/essential/environment/properties.html) file or defined in the [annotation](https://docs.oracle.com/javase/tutorial/java/annotations/basics.html). This processor was inspired by Cédric Beust's [version-processor](https://github.com/cbeust/version-processor) and works well in conjunction with the [__Semantic Version Plugin for Gradle__](https://github.com/ethauvin/semver-gradle). diff --git a/build.gradle b/build.gradle index 9c1471e..50bd1db 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { id 'maven-publish' id 'pmd' id 'signing' - id 'com.github.ben-manes.versions' version '0.40.0' + id 'com.github.ben-manes.versions' version '0.42.0' id 'net.thauvin.erik.gradle.semver' version '1.0.4' id 'com.github.spotbugs' version '5.0.3' id 'org.sonarqube' version '3.3' @@ -32,13 +32,14 @@ def isNonStable = { String version -> } ext.versions = [ - pmd: '6.41.0', - spotbugs: '4.5.2' + pmd: '6.44.0', + spotbugs: '4.5.3' ] repositories { mavenLocal() mavenCentral() + maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } } dependencies { @@ -50,7 +51,7 @@ dependencies { compileOnly "com.github.spotbugs:spotbugs-annotations:$versions.spotbugs" testCompileOnly "com.github.spotbugs:spotbugs-annotations:$versions.spotbugs" - testImplementation 'org.testng:testng:7.4.0' + testImplementation 'org.testng:testng:7.5' } @@ -160,8 +161,8 @@ spotbugs { tasks.withType(SpotBugsTask) { reports { - xml.enabled = false - html.enabled = true + xml.required = false + html.required = true } } @@ -195,6 +196,10 @@ task pandoc(type: Exec) { } } +jacoco { + toolVersion = '0.8.9-SNAPSHOT' +} + jacocoTestReport { dependsOn test reports { diff --git a/examples/java/build.gradle b/examples/java/build.gradle index d10460e..7204d13 100644 --- a/examples/java/build.gradle +++ b/examples/java/build.gradle @@ -1,7 +1,7 @@ plugins { id 'java' id 'application' - id 'com.github.ben-manes.versions' version '0.40.0' + id 'com.github.ben-manes.versions' version '0.42.0' } // ./gradlew run diff --git a/examples/java/gradle/wrapper/gradle-wrapper.properties b/examples/java/gradle/wrapper/gradle-wrapper.properties index 2e6e589..aa991fc 100644 --- a/examples/java/gradle/wrapper/gradle-wrapper.properties +++ b/examples/java/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/kotlin/build.gradle.kts b/examples/kotlin/build.gradle.kts index 47a02a2..2c0f39d 100644 --- a/examples/kotlin/build.gradle.kts +++ b/examples/kotlin/build.gradle.kts @@ -1,8 +1,8 @@ plugins { id("application") - id("com.github.ben-manes.versions") version "0.40.0" - kotlin("jvm") version "1.6.10" - kotlin("kapt") version "1.6.10" + id("com.github.ben-manes.versions") version "0.42.0" + kotlin("jvm") version "1.6.21" + kotlin("kapt") version "1.6.21" } // ./gradlew diff --git a/examples/kotlin/gradle/wrapper/gradle-wrapper.properties b/examples/kotlin/gradle/wrapper/gradle-wrapper.properties index 2e6e589..aa991fc 100644 --- a/examples/kotlin/gradle/wrapper/gradle-wrapper.properties +++ b/examples/kotlin/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/test/gradle/wrapper/gradle-wrapper.properties b/examples/test/gradle/wrapper/gradle-wrapper.properties index 2e6e589..aa991fc 100644 --- a/examples/test/gradle/wrapper/gradle-wrapper.properties +++ b/examples/test/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2e6e589..aa991fc 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From d7d641f2072840fb1794c4b2ea4f856cc09c9c47 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 14 Jul 2023 19:27:07 -0700 Subject: [PATCH 236/316] Disabled SpotBugs for now. Updated dependencies and copyright --- .github/workflows/gradle.yml | 28 +++----- .gitignore | 1 - .idea/compiler.xml | 2 +- .idea/jarRepositories.xml | 10 +++ .idea/misc.xml | 40 ++++++++++- .idea/runConfigurations.xml | 10 --- LICENSE.txt | 2 +- README.md | 7 +- build.gradle | 62 +++++++++--------- config/pmd.xml | 1 - examples/java/build.gradle | 2 +- .../java/gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 63375 bytes .../gradle/wrapper/gradle-wrapper.properties | 4 +- examples/java/gradlew | 30 ++++++--- examples/java/gradlew.bat | 15 +++-- examples/kotlin/build.gradle.kts | 10 +-- .../kotlin/gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 63375 bytes .../gradle/wrapper/gradle-wrapper.properties | 4 +- examples/kotlin/gradlew | 30 ++++++--- examples/kotlin/gradlew.bat | 15 +++-- examples/test/build.gradle | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 4 +- examples/test/gradlew | 30 ++++++--- examples/test/gradlew.bat | 15 +++-- gradle.properties | 0 gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 63375 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 30 ++++++--- gradlew.bat | 15 +++-- preflightcheck.sh | 2 +- .../net/thauvin/erik/semver/Constants.java | 2 +- .../java/net/thauvin/erik/semver/Version.java | 2 +- .../net/thauvin/erik/semver/VersionInfo.java | 2 +- .../thauvin/erik/semver/VersionProcessor.java | 23 ++----- .../thauvin/erik/semver/ConstantsTest.java | 2 +- .../thauvin/erik/semver/VersionInfoTest.java | 4 +- .../erik/semver/VersionProcessorTest.java | 5 +- .../net/thauvin/erik/semver/VersionTest.java | 4 +- 38 files changed, 253 insertions(+), 166 deletions(-) delete mode 100644 .idea/runConfigurations.xml create mode 100644 gradle.properties diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index b41ae6a..7250671 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -15,13 +15,14 @@ jobs: java-version: [ 1.8, 11, 17 ] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: fetch-depth: 0 - name: Set up JDK ${{ matrix.java-version }} - uses: actions/setup-java@v1 + uses: actions/setup-java@v3 with: + distribution: 'zulu' java-version: ${{ matrix.java-version }} - name: Grant execute permission for gradlew @@ -29,33 +30,20 @@ jobs: - name: Cache SonarCloud packages if: matrix.java-version == env.SONAR_JDK - uses: actions/cache@v1 + uses: actions/cache@v3 with: path: ~/.sonar/cache key: ${{ runner.os }}-sonar restore-keys: ${{ runner.os }}-sonar - - name: Cache Gradle packages - uses: actions/cache@v2 - with: - path: | - ~/.gradle/caches - ~/.gradle/wrapper - key: ${{ runner.os }}-gradle-${{ matrix.java-version }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} - restore-keys: | - ${{ runner.os }}-gradle-${{ matrix.java-version }}- - - name: Test with Gradle - run: ./gradlew build check --stacktrace + uses: gradle/gradle-build-action@v2 + with: + arguments: build check --stacktrace - name: SonarCloud if: success() && matrix.java-version == env.SONAR_JDK env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - run: ./gradlew sonarqube - - - name: Cleanup Gradle Cache - run: | - rm -f ~/.gradle/caches/modules-2/modules-2.lock - rm -f ~/.gradle/caches/modules-2/gc.properties + run: ./gradlew sonar --info diff --git a/.gitignore b/.gitignore index 5c25369..097f727 100644 --- a/.gitignore +++ b/.gitignore @@ -65,7 +65,6 @@ dist/ ehthumbs.db fabric.properties gen/ -gradle.properties hs_err_pid* kobaltBuild kobaltw*-test diff --git a/.idea/compiler.xml b/.idea/compiler.xml index d01a390..a857b2a 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -1,7 +1,7 @@ - + diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml index 0d340d7..b23fa44 100644 --- a/.idea/jarRepositories.xml +++ b/.idea/jarRepositories.xml @@ -31,5 +31,15 @@ \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 6d605b0..90755e7 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -55,6 +55,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -71,12 +107,12 @@ - + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 797acea..0000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE.txt index 95f6892..3214597 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (c) 2016-2022, Erik C. Thauvin (erik@thauvin.net) +Copyright (c) 2016-2023, Erik C. Thauvin (erik@thauvin.net) All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/README.md b/README.md index 06f05fd..84e3efc 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@ # Semantic Version Annotation Processor [![License (3-Clause BSD)](https://img.shields.io/badge/license-BSD%203--Clause-blue.svg?style=flat-square)](https://opensource.org/licenses/BSD-3-Clause) [![release](https://img.shields.io/github/release/ethauvin/semver.svg)](https://github.com/ethauvin/semver/releases/latest) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver/badge.svg)](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver) -[![Known Vulnerabilities](https://snyk.io/test/github/ethauvin/semver/badge.svg?targetFile=build.gradle)](https://snyk.io/test/github/ethauvin/semver?targetFile=build.gradle) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=ethauvin_semver&metric=alert_status)](https://sonarcloud.io/dashboard?id=ethauvin_semver) [![GitHub CI](https://github.com/ethauvin/semver/actions/workflows/gradle.yml/badge.svg)](https://github.com/ethauvin/semver/actions/workflows/gradle.yml) [![Build status](https://ci.appveyor.com/api/projects/status/nbv4mxd1gpxtx69o?svg=true)](https://ci.appveyor.com/project/ethauvin/semver) [![CircleCI](https://circleci.com/gh/ethauvin/semver/tree/master.svg?style=shield)](https://circleci.com/gh/ethauvin/semver/tree/master) + +[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=ethauvin_semver&metric=alert_status)](https://sonarcloud.io/dashboard?id=ethauvin_semver) [![GitHub CI](https://github.com/ethauvin/semver/actions/workflows/gradle.yml/badge.svg)](https://github.com/ethauvin/semver/actions/workflows/gradle.yml) [![Build status](https://ci.appveyor.com/api/projects/status/nbv4mxd1gpxtx69o?svg=true)](https://ci.appveyor.com/project/ethauvin/semver) [![CircleCI](https://circleci.com/gh/ethauvin/semver/tree/master.svg?style=shield)](https://circleci.com/gh/ethauvin/semver/tree/master) An [annotation processor](https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html) that automatically generates a `GeneratedVersion` class based on a [Mustache](https://mustache.github.io/) template and containing the [semantic version](https://semver.org/) (major, minor, patch, etc.) that is read from a [Properties](https://docs.oracle.com/javase/tutorial/essential/environment/properties.html) file or defined in the [annotation](https://docs.oracle.com/javase/tutorial/java/annotations/basics.html). @@ -200,6 +201,10 @@ mvn verify To install and run from [Gradle](https://gradle.org/), add the following to [build.gradle](https://github.com/ethauvin/semver/blob/master/examples/java/build.gradle): ```gradle +repositories { + mavenCentral() +} + dependencies { annotationProcessor 'net.thauvin.erik:semver:1.2.0' compileOnly 'net.thauvin.erik:semver:1.2.0' diff --git a/build.gradle b/build.gradle index 50bd1db..6e7d0d4 100644 --- a/build.gradle +++ b/build.gradle @@ -1,18 +1,18 @@ +// import com.github.spotbugs.snom.SpotBugsTask +import org.apache.tools.ant.taskdefs.condition.Os + plugins { id 'java' id 'jacoco' id 'maven-publish' id 'pmd' id 'signing' - id 'com.github.ben-manes.versions' version '0.42.0' + id 'com.github.ben-manes.versions' version '0.47.0' id 'net.thauvin.erik.gradle.semver' version '1.0.4' - id 'com.github.spotbugs' version '5.0.3' - id 'org.sonarqube' version '3.3' + // id 'com.github.spotbugs' version '5.0.14' + id 'org.sonarqube' version '4.2.1.3168' } -import com.github.spotbugs.snom.SpotBugsTask -import org.apache.tools.ant.taskdefs.condition.Os - defaultTasks 'check' group = 'net.thauvin.erik' @@ -32,8 +32,8 @@ def isNonStable = { String version -> } ext.versions = [ - pmd: '6.44.0', - spotbugs: '4.5.3' + pmd: '6.54.0', + // spotbugs: '4.7.3' ] repositories { @@ -45,13 +45,13 @@ repositories { dependencies { implementation 'com.github.spullara.mustache.java:compiler:0.9.10' - spotbugsPlugins 'com.h3xstream.findsecbugs:findsecbugs-plugin:1.11.0' - spotbugsPlugins 'com.mebigfatguy.sb-contrib:sb-contrib:7.4.7' + // spotbugsPlugins 'com.h3xstream.findsecbugs:findsecbugs-plugin:1.12.0' + // spotbugsPlugins 'com.mebigfatguy.sb-contrib:sb-contrib:7.6.0' - compileOnly "com.github.spotbugs:spotbugs-annotations:$versions.spotbugs" - testCompileOnly "com.github.spotbugs:spotbugs-annotations:$versions.spotbugs" + // compileOnly "com.github.spotbugs:spotbugs-annotations:$versions.spotbugs" + // testCompileOnly "com.github.spotbugs:spotbugs-annotations:$versions.spotbugs" - testImplementation 'org.testng:testng:7.5' + testImplementation 'org.testng:testng:7.8.0' } @@ -60,8 +60,8 @@ tasks.withType(JavaCompile) { } java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 withSourcesJar() withJavadocJar() } @@ -136,11 +136,11 @@ javadoc { title = "$mavenDescription $project.version API" } options.with { - source = '8' + source = '17' tags = ['created'] author = true //addBooleanOption('html4', true) - links('https://docs.oracle.com/javase/8/docs/api/') + links('https://docs.oracle.com/en/java/javase/17/docs/api/') //addStringOption('Xdoclint:none', '-quiet') } } @@ -154,19 +154,19 @@ test { useTestNG() } -spotbugs { - toolVersion.set("${versions.spotbugs}") - excludeFilter.set(file("$projectDir/config/spotbugs/excludeFilter.xml")) -} +// spotbugs { +// toolVersion.set("${versions.spotbugs}") +// excludeFilter.set(file("$projectDir/config/spotbugs/excludeFilter.xml")) +// } -tasks.withType(SpotBugsTask) { - reports { - xml.required = false - html.required = true - } -} +// tasks.withType(SpotBugsTask).configureEach { +// reports { +// xml.required = false +// html.required = true +// } +// } -task release { +tasks.register('release') { group = 'Publishing' description = 'Releases new version to local maven repository.' dependsOn(wrapper, clean, publishToMavenLocal) @@ -175,7 +175,7 @@ task release { } } -task pandoc(type: Exec) { +tasks.register('pandoc', Exec) { group = 'Documentation' def pandoc_args = ['--from', 'gfm', '--to', 'html5', @@ -197,7 +197,7 @@ task pandoc(type: Exec) { } jacoco { - toolVersion = '0.8.9-SNAPSHOT' + //toolVersion = '0.8.9' } jacocoTestReport { @@ -217,6 +217,6 @@ sonarqube { } } -tasks.sonarqube { +tasks.sonar { dependsOn 'jacocoTestReport' } diff --git a/config/pmd.xml b/config/pmd.xml index 890a490..e23c3fa 100644 --- a/config/pmd.xml +++ b/config/pmd.xml @@ -72,7 +72,6 @@ - diff --git a/examples/java/build.gradle b/examples/java/build.gradle index 7204d13..9c3c528 100644 --- a/examples/java/build.gradle +++ b/examples/java/build.gradle @@ -1,7 +1,7 @@ plugins { id 'java' id 'application' - id 'com.github.ben-manes.versions' version '0.42.0' + id 'com.github.ben-manes.versions' version '0.46.0' } // ./gradlew run diff --git a/examples/java/gradle/wrapper/gradle-wrapper.jar b/examples/java/gradle/wrapper/gradle-wrapper.jar index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..033e24c4cdf41af1ab109bc7f253b2b887023340 100644 GIT binary patch delta 41451 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 delta 37613 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�aus#JUD;nS;yy5u_yvon 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 F@Bb2_FB|{> diff --git a/examples/java/gradle/wrapper/gradle-wrapper.properties b/examples/java/gradle/wrapper/gradle-wrapper.properties index aa991fc..9f4197d 100644 --- a/examples/java/gradle/wrapper/gradle-wrapper.properties +++ b/examples/java/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/java/gradlew b/examples/java/gradlew index 1b6c787..fcb6fca 100755 --- a/examples/java/gradlew +++ b/examples/java/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,13 +80,10 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,22 +130,29 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -193,6 +197,10 @@ if "$cygwin" || "$msys" ; then done fi + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + # Collect all arguments for the java command; # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # shell script including quotes and variable substitutions, so put them in @@ -205,6 +213,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/examples/java/gradlew.bat b/examples/java/gradlew.bat index 107acd3..93e3f59 100644 --- a/examples/java/gradlew.bat +++ b/examples/java/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/examples/kotlin/build.gradle.kts b/examples/kotlin/build.gradle.kts index 2c0f39d..9529c16 100644 --- a/examples/kotlin/build.gradle.kts +++ b/examples/kotlin/build.gradle.kts @@ -1,8 +1,8 @@ plugins { id("application") - id("com.github.ben-manes.versions") version "0.42.0" - kotlin("jvm") version "1.6.21" - kotlin("kapt") version "1.6.21" + id("com.github.ben-manes.versions") version "0.46.0" + kotlin("jvm") version "1.7.22" + kotlin("kapt") version "1.7.22" } // ./gradlew @@ -48,13 +48,13 @@ tasks { register("runJavaExample", JavaExec::class) { group = "application" - main = "com.example.JavaExample" + mainClass.set("com.example.JavaExample") classpath = sourceSets.main.get().runtimeClasspath } register("runExample", JavaExec::class) { group = "application" - main = "com.example.Example" + mainClass.set("com.example.Example") classpath = sourceSets.main.get().runtimeClasspath } } diff --git a/examples/kotlin/gradle/wrapper/gradle-wrapper.jar b/examples/kotlin/gradle/wrapper/gradle-wrapper.jar index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..033e24c4cdf41af1ab109bc7f253b2b887023340 100644 GIT binary patch delta 41451 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 delta 37613 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�aus#JUD;nS;yy5u_yvon zFl=|q@4QknbD7D^U@V$o9oL?qtHV>=p5N4hw__`KIg=M$Ze-nNY;mr#lWCold+0N@ z>!`(+y_OnUyXf+7i`XM?O%=RL!YD|ARX&^klDWyp(AY(-9imkku*SY^TGlc{Jj>#B zL(sHSr*}tvz7Ik{1DBWI(z+65K!3Vhy=iI&?^_@Gh_3V2?J!IXjiO)uOeVg5p8Cs` zAE|*7&c$y!FRO#i@|=5i=^58sre+Z&1Wr3VRD2OWKCs529TDEmRp`!QP$o@8y@*O2 z{Ep>hLQHmj31kTm(8S_KY-)2JN=Yvwk&dFhP7&jgxVW>aH|P=XIsFnIn_<=?cTKo% zU++_bo0kf1Aj0?dZ5CAniEU}%#Y%UCnc<~T1u_F-?6ZMNG%afY#4 zhWB@Ibs!jpoQZ%3svo~%IpqMsVl`~fn<9t*i-Ij2d0_iZC3`#zycV#`%6NIbz z;qDcV={I=;3KCo6q8^0t^Lc9s(Cdf)s^bmVs^f{Z!^FAs2N%=S9ln#1T~V(h(AQVL02?SLjZ32o znn|1ELC^kDx+Oh%VMhJiJ8~2%!KmECRCz#&FlLPo5H#m_Bqq%$p*o8X&1Zf*H3x%y z!IXO;N4@atBKK}srZZa_lHD#MDfh#($x0b2#NAZwS8zf&9P z=VK!QVhOn{mr)bY{!>w20_Ekg%%X~tu{HJ7oGu~B#$lR;M`~+p3cepIr^_kReq3C} zS>?IU)gxOs!dhzDH7IK@eU9ck!9Eu5spB|FE#8f#U3G=0ZYs^6zG3a%JW*GB9v7cH z_>(%B^?pVelGBD(Zzj57k2@GnKY!_V$OS>@@ZPHm{y^Z4|-{s9UhY- zJZG8RZf7cl4q0c8#;x`}laeq@8)%BG?1fkG%=sHAe_k{Da!?FGY?(c$NAahUlpN|V zA!E4TWfdW#X@nLZRxaepY07(upeImeEEHQSUVkl9?BtO9=>_b>es7sfeh-ZocBCS>f2HTR|>kD--IadAi&4v>12=f8pSG@f1>MeUW zo1Dvi)6Ir4OzpNh5uK(nSw38|_tGASK2gmH9(fgo=nG7c)?Nte!;MalbRe!!2=hf2 z7qiU@F6{VighNmgjkVCW4W>yPLftHvXjtyR8Zv~jCe#!-_Jz?70OJTwS)#>p}iK(>Ec@r zB)Bm8W4pMlT?rJ&bnA_zFHw{&lm$adO|T8dmf_Opi;N-S<~CtYYov2)-R3j^+?Jk6 z5hScyS9lz}5w>8aF|KWE+`5!=YlcFm`A)+Sx< zB(`e{-=niyBHvlKXNcxtTU2FRQ7(w1{*c$>3UVfx1fvdJ{TWD4fB3FPVbQ)ros0vY zWSyZR!eqst@B?~L?hZ9xY|P~m=751OkTcn! zMjmRZ+A4kWnsbpssGM}fzoudm^Z0`us4aYuOMIz{@Cfe%L7w){<_v zig{dDv~r|YTdG7yByF6muINfSD}SW7MoQwQdv3v1&&3qm0#+>LEvhz8eDE?MFeL?`)Gq-IRl6c;eIwrd zMYJ0`Qmxujg_2pWKXYn@iPkEHEf?18tyw_q1kVm1biQT_)uvF-m+)IF7sW@1hTNIe zIEV>NPTA8d($6`Zjw|NaD>L~Vxk&Kj)>KwGBfW@$zK)?Mn*{91lyq0l5;(~Wrpi!U zYb?u%-Z_unhgF!*dZs;FjI^8cjH78EX#Fd$&0s%coS(pf=3?pSf@GgQ_bl>kfT@NP~=xbV*87O$3$%#RTiY1nQY9ockJfwgN1kIUW-45Tz$Gm1v)M zoHU*qBH>kr9;^rsup_-QA?^~MJ4>4+XAnpBP)n~pO`$HYogNo#GBW9-x2oovY}~fK z`QZpFn@isq^IXf^f$F1SY=s#&JhnY^GP zzG=O;+lCCBoH27!)MM`t6F&}@bD9i3*Em)q=iD0=O-vCk94q^47xVF?6Z(_pvhtguf+!SB)U+G(wH)@}4&|Pfe_1F>Mll>*a-#kRA z16qp)ydg|t)unLaKH~QhZL=wY2@X6$U;ndQ>HY`*tMu!}iWkTbF{zAr;%TwN6Uh1# zX!lVmv#sw-RDAiDxW65^cNyh~*lM)hMF|u?yvO``!@N zfO&TLq&+KtGmo@O$VrX^v?q9Ie~`im6Uc2}G%>>MMl`bfElZ5?@2eq@S?Tr%$p8F~ zOR>d@Q{sr_0WB3o0-9h!v`&H1Bx7R#h{@396D7Qin_4Wnd#|&u3SW>v82S>$$QMTt z|3t9N8O*yZC4-t~U(U_UeOXv|I=tVnw-W+cIBx~UD}!3cx~H(!6y-(Wf66m ztVZE0hojwkl-CtF%wf=0NbP~~oYwn!>l!Bwn6_pzyXk$fe?5x3@e-+=7TIu_JdO*O zuX1N{A+tyf#f!f#ueo>s3RpIH?0m?P2>)taqWwzOWx!;&UCoHEppSKABI~HBJo=4+ z?ZbyG3^>a)KeL^ht!Oz@g~!F8z&9DiTpZIly$O4@L5?nR=nlfrswZFYBN^;XP z)e;!OA2+oO7Fh5oTNTph^h>3O8>?!kr+pHYd>j?ZnNO`^ih*mg>G&ni35WkfPn(|G z9<=`3jY81m^x8;{W-dRpz-VWhXY#IrFw5kc18lO+5cIR3-Ny;4hcC9_@?ZABI0wKH z^02=FtTL?#zihkgozL%&S1&^F4ewYy+pk0o0$E@l^vcfROC^OK(WLbke!PoIBU&U& ztl2E(+8}4?0)$O6)ZlyBo=Ajw^NV9@hmCM2lI#o4oF&mWNP91`3OL?zzqv-_Q0;hO46s& zOHzG-vcx{jHJeH+2bv`_{#At<8yHJ7Q6)Al6A~%8nqh_r-p`Ygql#Ih{0%#x*mdG8 za;;p{aNy%*CA3%wEI7~}2BkS5a$S^pbYlW{JfioTC2!BH&PgZ1AV;jZ5?gqFmZ9%GEY!!&)}kAPN_A8zR>w1%0)m zu{54;xep{^KsWVA3&pbV6|#@-g@*Mc)=_3;ZgrgPj(lN;4&ulA9s#>rx@)=-_j>M_3XRPV0a;$AY~kQ?qC za&lcV{B(!c?Aa;G$oXxSxK?AIx1Wk+$7W-`(^sBeO%`=RFJJ3W)kgdzUr6?c1+Ml2 zkzTjocmv>GzCp!l&qCEMuiCy|Wz$=i^1Fy}!b?*W&033B=}JVwk`4|uUE57VIfzB&1Cs@$vSO@lmEaFsstiu*>fqh;rt zSaSP61S?&uEejv_9!IZ+uqu(|apldUbEqMx);55vr2l1rUOdV09PT9THuhr$Lq{B)Mi^EQZ(cmH;WC;T^<0zZISAht;nY>@N<&r1)b&?eEZ!s5Anu(>VDNJ z)+RhUhziagq{;?;$CzsmW_dbQ(^FR*5((|95N(mx{j@yjxR& zw4SukMWIq#H7dQ7fr}7tb|v7P;KD`o<$XB6<*7dq(D~h8A&WmwW3s{vuRJ|Uf~?$Q zjV>m%;=ut%xKu-yEJ&OvRpx>G5%dJy^CR|i9y?ha$3U{c{KqgEejfY4ECXoU zud7H;j@<{%b=3KU#q(#Y_Dz(TMB5VIlQ@tB`&BIX$m#{eh&&}jx^$EII6~Pc>4xY+ zExqLw{E%kpi$x`_DARwSMxDtZAZdmf!uW(lUn*ImspH7+3W}n%N19x@6*ns*X6$+D3-eAu*^w=`fK? zq@0up#4@K4LrSwKt9!c<^!hE#nB$a3!HecSp1XCxQg0mZp263oH4yfCz4PpMN9eP) zfp}z}QTh-pk-~ik+1n9a@(RK{lxh-^Sbh)0BDke9WKsUyfhlz$qt%y6@;Bc9ve#^( zsn(JIp{s9x5-cQAjM4E^j3gjaF3!mTrKTecXkMg6M>)YINtG8&4X7Y-C)-NW2&hMXKn%lBE`U~8elB(J zB7q~vQiEL|vENkdL`58jDVjYi8SBWQQG6nJeb_V#~biIrs8d?$m@wY18A(1P)F#}LqJ$(qtF6T4( z59Tm4nti~@Yhj7cJ8XP}IimwywYA151-SiOxKYOSuJ~&_dm5FF*d3D}z%#sW$bjSu zW|CsVtQ#%d(oMb1AHlM&I@>2^@pJs2GMlq9EA5aT(7k!YgZc&w37Ku_E9JCj9dKBk z%USB~<_@s&^oHF}vaIDPc#aR2Os@f?SKom*EO;@kX^IoIcQ;_Khy9UM6jw4vkS8k1 z5qPyLz+D?bSzt~awg^8r^D{Qx$jg>i>><8h)M@+1HH~N1s5~fR+$Y$7A}GI0mAM57 zARr3llpA)+6oU&qz^vA}C#pKycQ40m$uh8P5{Z& z{bM_j&TUw%&o+56u%~Q?qy#lbDyrC_IVq#F0ZPwVY?rhMfF&3hIy_cXJDZ!%o^WjlWT0q!58tcr9;~ivN5t zuFJo=jafXgih;JS^o?!n&kYck3nZM2`XkOV4zqtPh4=T}0Sp=i`TS)1rUT`2NY^=x zo^JllZg^HWN0Irf`tgsWig@HL{mySCqaC~WFpF;fH;oK6WGx**)2!x{F5i%oBRc9@ z$BtoEKs;513XgB)j4bz*-ZcKgRjY6%m8bz1Yrgk+3g#6NEm;qdaYQI4c)?pfP9VHd*-SFdudUy9> z067Gm!Jc5JHE%-atHwDoW$^dgve0(4o;Xjmo|qjNgg^Y?H?CyAyOycf3vi~JJXVl* z*2-r;hy;}W5$k><3;a5A@7F`~8$$R-%a?x96QbAPgF)DD7$~*eKn2$+*Pcy@JV6U& zpRJ&WVw)=|1Ggz(ud0AQt*TjGwV!RZ1K_-j!s-+_;MC6E;H@}W!>iUnvS0LPU}lp2 z?JmPWgU4Fzp`5QqU-S0@y;EX)26E+UT2=mQJ+m#N*tR*@wZJ_XYqA*0|F0Y z=Bs*){i~9s5wXWR63kVo-h!VE)%``kU>hiKtL0p?keVZtX7?|oN3ymlAeI78{`m%r zW$$`;_=^VUG%TY=Z5Im@H&)xz^0&99e^`-M1^H=hoj~`ML;^ z>F2^Z8<)eb@)}vJj4sb@UoN=!0A#!GD!3x4DY`KXqC+jq9HtOyBAZcuzEBtUa?r#V zk@>)teo7+q1UFe-LJcjBktP<&OCm+hQ5wA(CrIMf!V&|UFiwpSs70?cEA|B8G$LX~ zerl2Ij;w|@51q!^I??~h(^B2f(^^Nl8Tp;=L%GH&_Ke@buy9SEJfy|H2woxlfM<$taX>(cGc~_R_Yg9c(WvP zK6yflD^s-gxYEwNfxzj48GziP`Srk6Ek;yn6!VwSs3jVd!PP!YTHu2lbV=*doK%v~ zZ_3S$P;7-@msk>D(m_Pp%T~rAEHf6^$mm1Fn;3M|AAy|WPXF}N38NKY;SVFu=6c% z01Dubrt{FfW~yIP%w1c~fnN0CQ76Ha+T1*95aLz?sI9YVA~-BkeBKe|`Yfd~!+v_d zvMWloCs#j;npHc*KH#^Q9Q7uVq-mV|y{IHHf+F+=?Jp2}0S%60vuzBtxY)h|E3+Ed zXo;~agT;T9gr149C^gS7yHOPL@Wvy53X-lh7Xq9kzpI=U6!v;&`dCDyuZiHlI7bGX ziC+c(^Y$Yf=_@Mzfn5(jHz41CXNRS{v+w}y6_=IJ#=kvrch=CcX(AKk#5O^j;FE|e zpywj6D6@^21~oC)X0op_9C?dw;~XEBUqn#CMlb__1XFLf+h%}eA*PeBbGKXrP8+ZC z`}+exGe?u-!CZKfCn%+9sN8iVVK`SeW0RwuQx7xE7jo(6UBvL(vBC{s?qnJCRqFsg z+pO5JXJ`r)0~q`0HuNA6p64!<=TFW7SQR&3LmK>H_26Un1p)=|>Bh~YGj#*3KG<9a-Rr?NbIr4JrxO27*4wqDXys++fbyBYmPj*pNGdnAdinu!Fzp#|M%5LQw^SVRh^Nd&k3Eklh6_j$h}OD^ zx`f{U223H-#%~~|@i6T{?zr6GpBM$Ukn+e8MDeWtnynpW9{*QXANBl1{jQ7rs-%*^ zGJNE$hxMRdPR=9{&23 z9%=kW_GzBU?+uDg;nN;se1SC#jg!}~{RzJGY3;aK2BSLl%S+d-AHBAWnlD_A(bDYf zDy`%hhhN$Ths-*%0(xq{Y7;sme4>1}Jp|;7m?xcE*t|G^ zXDJ=bNKIF~#~mBCFp5-l4BHKe^tZid>q2bX8C?902Y>23c)E}tnrn%c&oW^21zFUM zMJ0D5@*V*7JUMO-GR)z?G(s&+NiA|`9vkt;*Em=jybSL!qA;J=MXs%I(jy*Q4_+DF z5K%ex@bCB4avJY@FxdOWVeA0YK&h~52ZjhivN@a82EoQ$p;r*;R;2oDVw4QaSXd z$V;f@cVvGHQTIAgql=>#5`l};IO2|{=yK2lMtZqWCMp-0Xgt@|d}1pnO!dOzp}|vV z(Bx>TDk4oagp~)~!$bGka<=Qz=(fxz((#lTSHSDpXMz_SU=%x@W`AE0&Y*~{_*!>% zW)Ykr=)D&to|#X#_3*+W-VgpWdcB1aHCwGzZjwIVuwt(+^BSv$zk^G~3*n^E(^`50 zS#m#3Az=3DY#tJfwz_X|jM{{B*GYGT4bZvvW}WG)%73-lB$M~}!woC- zJw*4Pgh90b4QryL>+WOw$|ar=*QeMR*aRoS&txxdXMw>~>NyFgFCKh~Ry+WlyFedBBkXx=UL zaH+FnVn{BWFO?u%LV`H<1FcNW^|}j1E+obQ8pdvt358nDUZV6EbbCT4_IJVDSNzgm z(2j1VQ{xCGn>LR0vyNWG)|m&r%3Fa#J_Uz+pNTP(Ra47<37&`$?V}nUyu;^P6#YfT zaDXz3%|Lp1e_2o;M{|*nOi?9ZqqE5=wny9xX|AfnB9b+}OWGOnQs!7ixaCO8u0Ao-!&?_Q&jJp_5>qRoPb7S0JZ6{M9L*utzb=d=FNdplo?Np{QAAfEFQ^K%Sz@_ ztRJ)SzbLOv@;@^v*IYi}-(wYqan1JJAt3)_KXPOtnwj#&>jnzrkJs$Z=LP&fQmBf? zp2e$EKKP{o$5YO!I$&bT$T2OF)5;_HL^!r`u}~CL5Z}6W87^MEw$}*72?wYzjAS5D z6as-aCC(nYNOmbADRb8|bAI=;GuNMQ_n(x3+a%o#)W`@Hr0b>Y5n&;)B(P19Q+r0smy>ou(aF1OF$Afk#3kvjwBvqgWqZ&8NT z`gZDfRJ1IWXoXjev9vt=EzQgO&O;qv%1$HYf@XW&3A#iau~)sOX@q;{KC7f|vm=sFPZY*ffzPv11zn57#|7*E@f>$% zGP=fCs;0)QKn~yZC7H- zb$o)d`)MEC-HVM*{`4Er_NSe+;Y{1%Or#=kdO~AD7$G8jY)pZ0%#3MpbVf9-Y$3xp5#3DJ-b`< z`}uw&50GfMJ(x;FFkr%a|Malh%;a%WxOb=g+Dbz~;YgxhyFTxaF6J&wAENc(N*7L) zeXI3XTRh;2?z?ltm5NpG9%pD1y^sEot1=wYV<2&p8^M0QHlpu}gLZeZ@t^qFE1blt zJAMB_BvAuYyT<)T+2+G&pJ^8SI0v*Z*|z`YW!68?>3My_%9#T8qR8yIBio1rvCMd< z91BS8>p8S4x3QS2G_rSwf#WBVC?q_u04c7gJ4t}hrW!w5oTlQ4Gv8I(7_V=H1}UAV zC5$?J406Y5LupfLZoh%i#3yWaVZQ^XK5|8kyh1Tah ztQ(+IOOh@;>F2M?t3;9%I?|lX zULb%Z!Z=c`bk-5f(h)8`kb_YuUCP}^grI04UxPYdL{VQ*SzlO{-OMLWZN;YQS@8un zN>3ht$~85L%{%A{<|RlJNnwgTO_5mK_&J~%_}2iDBFQwn+`Yh2XFLkw0E(h`XgaUF zsmM}y*cS36{Wfs|YA1Q@KEvt^NrdlFg@^AD@^p?1XV`@*WWmcHIv! z`}lyB=#mgj8uI_t1{4zqx=DXxy8OVn9|oBwQCBl!Szu%DLg_#q)#{vQd+euWH3Q{8i1QbPMuphkmr4cuDc zMn~qv!d>mfj-^16mz%H%-W=X#SZH84UfcGN_@*@UTO5J>2KuHt?4-}xArj7RIhE|c z&%4Rp`ue)R#|#8*u{Tq0P7lo?y!!2W!TS)f=*zPr2TI zHTzSAXz~Z(TDAlmJ|u`SwS3EFEm3YDMb(2z$H|@cwWNKM6 zGU1t5c*DJ8#DeTn!b|4XfHHxW6Gl;(`=aTVKV!{OesutFw&>6nB~FY8>Op$<+2xbHp-!Zp zz~ydgklnDRJMmsyl(hE?kg51a%r<%sabt^$`(VG0O*TH*GBeW3tEzwZf&`*@s$T=)t;y&N zJ!QXmZlur|^gP5P3_&f@g>@e;y1F} z2mPDQ+}3ccDgcBn%aPugggB$+lPp0nADM;R#wF4*gdC3)Z-fdGWE24w+-U|Iv?<>) zgfelBvN79aycxnD2v2MWG(H~ixtp^%bA}!Dq2#IPsqU`szPi4uSdZ`fgcPWKr$)eY z+i3Fz&}8plZ^X#AdI>>b6j;2a{;F_&V}<`N-&cHnffraWJcPyfeo+}V#wWc!^}`!n z^t&8qUd3AvMbnIVA(tG-np_^O z(jU84qBQR2HQKv6+a0G3;F^s6R2N=7l}Ce@FRF=gXV z1x1Scic}*-`9&tJDqB|7Bpd#{c~`s+x4iP)LW$V8iI1?1`$}aR4)t=0-na|-Kl`ks z3>Y7AnpK%J!>UyVR(01dhUOzU_UzipT)&!hoc`R(Nj>)5^0u1CX}{8EkbXL~eoX5o zfR-dH_%sUMvDAeZ*i?-LcKxJEKb@)v{d%LiM#Z9b0JpC9DW3j?c`3u`6iq*y66&uA zwu>g6wU=YQ)((vniXdgesLV$5eIq`HG4MkTPjZn(DOD1T=oZG9>ob_K;3zA(6!+lC z>0sw(0TfQsTO|^=s4RIhs)o+x*Evi%0GD7BKgtevBj!4osWa{yt71c& zFw<}IHxOZEQ7VGdwI>_>njM`YdUtzhR*U&Dc595-R*N~9(SxY6Yx@;jNv0(kVA(WZ`QVS(sM&3%9o=B&>h+px!<~-S#yaECHFo#EYqeTi04k`O z3pfLmnrns7p;hMQoo)4Aip&Cyq}O0&W!=qEerfFDr3&0&{gO#rm{!T)sB0{Gy`;{r zfiG+XiQm=s!1tQsrdO+1jYhT`H4e}bRrp&PVI*a>mmlJ(+&owalAau)9$B^V-C$F1 z%xivQ-p=MTZ0PvRf7kDn_&VtA083GQ;Du6DjZ%raDpRfxbTMt&GJxxqjb76nY~6Aw z@UZG4`oVv1Msy_syeYrLBqNi{{ldE1nk#GCW#hms)9rBV9Ie~HVrtpt5y+3);XX>Z z8B8LjX+2sqCl@wJGIf(B)aUP2q7fZ=hgCLiYmA-}B@}ScPE!w9No!;60R(dVAw=1+ zY{yENkK|+vc16pRxb9DL@HEh-J95ToZsxQ%E+h^R7Z}AU?&_jB8P*#eGl6I4G7w=o zdD9H0*xfHCz;jAo{7;um(Y?q5>)zNS|sa%2tcBkGD zONu3R)iJ>Kl*s!-krqOy8&)-|vE;5}ztpGPM`t+xLM5|;TTj)(jHdNYzaph4T)Eu!{10*b{|&jw@Pl<2vR4aahVm01F#j|m^P zh(QN(V7>xTF(~TexpD*3?X67_LEF`ixn0RJyBTDS%BfTtZm;dGmB*h86~?7+)mZVc zzX+c134#P;pi=#%4Y+hj(!ncJHsmc;&8mdd)tT|~`<v6X3L|KOsahndQomJ&nVU}++@nS1}K;p&TQ)Yfdf?GMo(hhL_45O5STUgsI1}YIc@Z#X9Fh z=uKYOiPK@kVFO&^RD3@Ev_OUFs*gckb!pVG9_hOD5_3{XZc}Muxup1QCFUI4h&l{j zg>TceW8dME)4Xp(j5ZOsPkU->bqO}x$DocdDjImM`&Zf^HHYS-YCuHg>RF4 zQpUM8ur}@3xq~EVbIa{-CSZy7Q9hexs$j=OlIwRjDf_yM+TyO zjL%js`9Yk=km1|;qrX6GMG2JlPqGN|2__?XaDm}pe_r2Bgxn!LXF1?6CSZx*9+-?8 zO$^hFj&+*mQTU>N3TS{?lOr|O@MBp(Z}x_GnpE|eTbt$>@R|DfNjOs(;K7a07}+X1 z)871!+yv;9w!AdD+>?fXh?R<5H5rki$fH5(>c$jX_XyufB(u_U$nzn`l1F=nqu`IS z(paitzhKm@AC-sm(Ii;kv8Ev?50)9r(8Ws(@sH9kN|9hiD=pT=8-<>Xh|rJHrsJN~Anr zAvTR7e@-Tj3ilJ3$5k1LGFTdp@_hDeGg?~*>721hqM z^=83qnD=|g$j{s*e}sVy9P}yDIu#%(Rxo3})JU;N)JEcDX?FTqu>x5!yZR4y^m6bQ z%K)6C>y`#bTjptsC%Fqt9>m2v^2aitT0m?rB+Mz-?M6pf3pQ7v zI=*+tJ|UkM;m_a+zLjv*9D1u8^qEF&42Y$tcBj>W^#JqzKV@BcJd|A|s0`&Uj2iPFj%>z){#u-x%fp`3$Pog~sYKBM=6ZO$VrD4BX#&c8s zN{jY0PY{JUp9riy*#+XaH7;EJh$E>f(O;98(^ve*7NK1(P?L_ZlaRb;RVdr1vvQqJ zmX8>&1*Gltt2Nq6kEcBDf8wQ_xo2_Gzo%vzQ-rHDjqVanUU3#y$Y=M1AIr>&e}P;( z6ZlEMe#>EpRC+7i@sdyVp0$GU#lxwioKF_qzuF&mksovEr}b#w9Cc8k8If%CtQo`K z&wkJKm<~EQrW?VS$mKqId;K!0)CVdQ^EzN2=3rv7yU5L#Y3Z#S{ZW9mfHKpSQ|O=z4fV37CI z4=4HvemYpgy0mIuWLARDITPStS@Za+qjl9lXnq+n->)Pu13rHD#WU{lMA+Pe1|Jvh zbh>gmJ6T;`>niOrz*{1}2fnm6#>Qf-i}63pu6C*FT3#L;u)il`eOTxrEStR@vPCRy z98-?fu>tHJ*1Kh?&yf^T**KRrFSr58b=}H>ylYYy7S()J(^dp^y|HM%tTmxRx(b!n z#+0%KAtMzV4Q)j{u`%Z(TB|JupH;xk&vxrbshL3u$*Y<6dXAFkdVEk0= zL@!mJyZJ7w;~H=|Cf(R@`=7~9;hhV2VZE~nymvHGaV$n3JsfcJiaTQ}=rqwsIXQ(D z(5|3P?ZY!Y(QUT|-EZBn7Sqk`b5sw0n0`#ZdR%0&126y14K(9@RoDIO(u0j{T<)EibVO<#+J7ihwEe~P8$nhs-%|@Ie_Z8 zmwX_ntIOj!;dSnM+gV~Q)Jb)qOdJ7T_e3g(>GwQ6)5ho>`>xN8!#&Y|9|?2FEyPm7 z_kR&eH;db@uDOmV*<5^hS!jmG<=*ttrd@w}UyD5V?1a($c;l-Ap#&e~LPKPNGwTFO z$v;_KHof`VhLChyy=9YINrrDj$M{ntKYvTX-l+7^n@ry#%_0IN>I-ecRQ*{ZBA(;2 z1FvgjbeN+RT5Y#j(kGFDk+nq_bP0C$Ktyt#0W-2~H0%^ZcIyhGOUt@VN_+Ojoi|c! zok+6`^4Y{&N6FnZGcy-*qgl6?& zqvDE(R=T+8`zo#Ps{`%J!@iANS~ZV&mfyLTCoI=ZJmU{LaxP1UH-UMSet^I9gOg%S-c}a3 zYhnx3jLW$s&O@m(VX5>J4TfFDFwL(N8af^7i%wgN>-G{p?%vI^g$x4ERfNX9H;)zg zZwS?2Ii!_wC62A&=_$iQEK=9BO#b;0U0@Q9ywwZayy(qU72`L;^mNmSJz$}B0!w^e z-9q@XcPqe#yH0*EK)72ZUko+!sC?hmQ7v5$h$n41bZSxMS?wzKsL z98$Twb|1bU5F>jZ-#@NdgoqqzmBW7uxyWeJ+<0L+hTw5Pyh|IwUzo>j z|2SD~(&oWTF@SK9b)CTYHVpAJ^gAL}@wF;`2`S4ffcWH7Lo$dBjA9Xscl9cYZjr&;3GK@;E$f z7%I*r<{};Go#Y>nekYyU--29n=B_=Z8D3@_93OK32}6&Si4$g38{csLJpd=kdL$Vg zib^MmEKga)4Tj2IQSi(lt#|-NQ^f^mh>6)vxduDJ*-p|f*8ai&pJE^ZzwB)Aq*;%0}v7P~G z-Db&;mUMp*K)_5~_c`Lq_V4U0Yk>jIr(u}jYpwbOae|XmDYV%Xo9jf(Dp0wlm76F& zl$m(5Jbhlxgud2pC6M6`+)@9QuIDFpOR{wT*dLvku zw$Dg^BH_|p@yVgN7(J}-EeBD2<5^|LF10;SGtSTx^kT=G)_UgGj+qNP7Oy?`i9FpE zea$_VhB4Hz z0C(Z}@5;(w4%k1_>j+dGbIG|Lt}4-@ViSQ;oA~<3(_8KigJp;Lkg!QkMBcLIkZ{n2 zl4hPM!_rur%;n>rLAHcXC880ij2nKsDq)$XRo-msh8QVHzI65t(&7em>PF6uTxQ); zxi1~BORAq1DfYMAntE@wqqh}*&{cQ6wkGLo<#qQs^ZC}sZ^_-Pb|J-(Jq(K8`AKlB z4YyLMp7~AljeqVc(Yr2P%kn@WROa zVyQ^cnQ121 z8gq2UkX6WpMBM)2zXzBblbZh3c( ztU*AR9|T}P@`?ZmG=RV*G$4^I_SbAsRq3J{10eq@z96*2rO9pbLU?A{{9RYwT(ji{{WN;Y# zQRvrfl8}^3P!$XkP=MJq6UDaK4Ykt-PeLV_AVHDpv0jCc>D)8)K-n}Wg=9B;=sD={ z5C9L4B$Y%j{HNpy1)Utd0giCz;E&rvzZ9w1Q&D8P-wY3h|C)TK8_1i1K_16|&6)so zmhve6xp_-Nqx`EY@HG{CHlEy@$t*8LZ{({=K;$e8;)WwPH_h@;*tUE1BMW?#I&kk( z_vV^HrsL-J0!SHlKyQxHh+Xe|87RvFWwKO8c%=T6At^@Lb=RkZABQi%S&*Zm2dDoY z<-k0g!tNhle6e{LBp~xQrG0)c=Z``z|2@NGw(y^~8=#)lKxv8j(aLOf1q!-{6 zHt%{VhQLR(2NzkDie8sbrrVt1`p>LTxh<$9J4K*`7xZB4{k=7rKcgU52mp_<;BUwR zgseY+5HE1v>dz*|gK$VEF#7ovxY?n02tav}0dlCKMh`B)?kBhujTY!H5%1ak F@Bb2_FB|{> diff --git a/examples/kotlin/gradle/wrapper/gradle-wrapper.properties b/examples/kotlin/gradle/wrapper/gradle-wrapper.properties index aa991fc..9f4197d 100644 --- a/examples/kotlin/gradle/wrapper/gradle-wrapper.properties +++ b/examples/kotlin/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/kotlin/gradlew b/examples/kotlin/gradlew index 1b6c787..fcb6fca 100755 --- a/examples/kotlin/gradlew +++ b/examples/kotlin/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,13 +80,10 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,22 +130,29 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -193,6 +197,10 @@ if "$cygwin" || "$msys" ; then done fi + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + # Collect all arguments for the java command; # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # shell script including quotes and variable substitutions, so put them in @@ -205,6 +213,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/examples/kotlin/gradlew.bat b/examples/kotlin/gradlew.bat index 107acd3..93e3f59 100644 --- a/examples/kotlin/gradlew.bat +++ b/examples/kotlin/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/examples/test/build.gradle b/examples/test/build.gradle index 7ba6d12..9444d47 100644 --- a/examples/test/build.gradle +++ b/examples/test/build.gradle @@ -1,7 +1,7 @@ plugins { id 'java' id 'application' - id 'com.github.ben-manes.versions' version '0.38.0' + id 'com.github.ben-manes.versions' version '0.46.0' } // ./gradlew run diff --git a/examples/test/gradle/wrapper/gradle-wrapper.properties b/examples/test/gradle/wrapper/gradle-wrapper.properties index aa991fc..9f4197d 100644 --- a/examples/test/gradle/wrapper/gradle-wrapper.properties +++ b/examples/test/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/test/gradlew b/examples/test/gradlew index 1b6c787..fcb6fca 100755 --- a/examples/test/gradlew +++ b/examples/test/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,13 +80,10 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,22 +130,29 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -193,6 +197,10 @@ if "$cygwin" || "$msys" ; then done fi + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + # Collect all arguments for the java command; # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # shell script including quotes and variable substitutions, so put them in @@ -205,6 +213,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/examples/test/gradlew.bat b/examples/test/gradlew.bat index 107acd3..93e3f59 100644 --- a/examples/test/gradlew.bat +++ b/examples/test/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..e69de29 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..033e24c4cdf41af1ab109bc7f253b2b887023340 100644 GIT binary patch delta 41451 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 delta 37613 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�aus#JUD;nS;yy5u_yvon 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 F@Bb2_FB|{> diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index aa991fc..9f4197d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 1b6c787..fcb6fca 100755 --- a/gradlew +++ b/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,13 +80,10 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,22 +130,29 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -193,6 +197,10 @@ if "$cygwin" || "$msys" ; then done fi + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + # Collect all arguments for the java command; # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # shell script including quotes and variable substitutions, so put them in @@ -205,6 +213,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/gradlew.bat b/gradlew.bat index 107acd3..93e3f59 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/preflightcheck.sh b/preflightcheck.sh index 3642481..76c698d 100755 --- a/preflightcheck.sh +++ b/preflightcheck.sh @@ -13,7 +13,7 @@ declare -a examples=( # e.g: empty or javadoc, etc. gradle_doc="javadoc pandoc" # e.g. empty or sonarqube -gradle_sonar="sonarqube" +gradle_sonar="sonar" # gradle options for examples gradle_opts="--console=plain --no-build-cache --no-daemon" # maven arguments for examples diff --git a/src/main/java/net/thauvin/erik/semver/Constants.java b/src/main/java/net/thauvin/erik/semver/Constants.java index 70a0ca7..27c0733 100644 --- a/src/main/java/net/thauvin/erik/semver/Constants.java +++ b/src/main/java/net/thauvin/erik/semver/Constants.java @@ -1,7 +1,7 @@ /* * Constants.java * - * Copyright (c) 2016-2022, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2023, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/main/java/net/thauvin/erik/semver/Version.java b/src/main/java/net/thauvin/erik/semver/Version.java index e6ec6c1..98b18db 100644 --- a/src/main/java/net/thauvin/erik/semver/Version.java +++ b/src/main/java/net/thauvin/erik/semver/Version.java @@ -1,7 +1,7 @@ /* * Version.java * - * Copyright (c) 2016-2022, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2023, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/main/java/net/thauvin/erik/semver/VersionInfo.java b/src/main/java/net/thauvin/erik/semver/VersionInfo.java index 95b12b1..297dc08 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionInfo.java +++ b/src/main/java/net/thauvin/erik/semver/VersionInfo.java @@ -1,7 +1,7 @@ /* * VersionInfo.java * - * Copyright (c) 2016-2022, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2023, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java index bfc2b89..878f478 100644 --- a/src/main/java/net/thauvin/erik/semver/VersionProcessor.java +++ b/src/main/java/net/thauvin/erik/semver/VersionProcessor.java @@ -1,7 +1,7 @@ /* * VersionProcessor.java * - * Copyright (c) 2016-2022, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2023, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -36,7 +36,6 @@ import com.github.mustachejava.DefaultMustacheFactory; import com.github.mustachejava.Mustache; import com.github.mustachejava.MustacheFactory; import com.github.mustachejava.MustacheNotFoundException; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import javax.annotation.processing.*; import javax.lang.model.SourceVersion; @@ -75,7 +74,6 @@ public class VersionProcessor extends AbstractProcessor { log(Diagnostic.Kind.ERROR, t != null ? t.toString() : s); } - @SuppressFBWarnings({"PATH_TRAVERSAL_IN"}) private VersionInfo findValues(final Version version) throws IOException { final VersionInfo versionInfo = new VersionInfo(version); @@ -125,7 +123,6 @@ public class VersionProcessor extends AbstractProcessor { return versionInfo; } - @SuppressFBWarnings("PATH_TRAVERSAL_IN") private File getLocalFile(final String fileName) { if (processingEnv != null) { // null when testing. final String prop = processingEnv.getOptions().get(Constants.SEMVER_PROJECT_DIR_ARG); @@ -227,25 +224,17 @@ public class VersionProcessor extends AbstractProcessor { log(Diagnostic.Kind.WARNING, s); } - @SuppressFBWarnings({"PATH_TRAVERSAL_IN", "UAC_UNNECESSARY_API_CONVERSION_FILE_TO_PATH"}) private void writeTemplate(final String type, final VersionInfo versionInfo, final String template) throws IOException { final File dir = getLocalFile(""); final MustacheFactory mf = new DefaultMustacheFactory(dir); final Mustache mustache = mf.compile(template); - final String templateName; - switch (mustache.getName()) { - case Constants.DEFAULT_JAVA_TEMPLATE: - templateName = "default (Java)"; - break; - case Constants.DEFAULT_KOTLIN_TEMPLATE: - templateName = "default (Kotlin)"; - break; - default: - templateName = mustache.getName() + " (" + dir.getAbsolutePath() + ')'; - break; - } + final String templateName = switch (mustache.getName()) { + case Constants.DEFAULT_JAVA_TEMPLATE -> "default (Java)"; + case Constants.DEFAULT_KOTLIN_TEMPLATE -> "default (Kotlin)"; + default -> mustache.getName() + " (" + dir.getAbsolutePath() + ')'; + }; note("Loaded template: " + templateName); final String fileName = versionInfo.getClassName() + '.' + type; diff --git a/src/test/java/net/thauvin/erik/semver/ConstantsTest.java b/src/test/java/net/thauvin/erik/semver/ConstantsTest.java index eb7fabf..0847819 100644 --- a/src/test/java/net/thauvin/erik/semver/ConstantsTest.java +++ b/src/test/java/net/thauvin/erik/semver/ConstantsTest.java @@ -1,7 +1,7 @@ /* * ConstantsTest.java * - * Copyright (c) 2016-2022, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2023, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java b/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java index 5de7828..47b0436 100644 --- a/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java +++ b/src/test/java/net/thauvin/erik/semver/VersionInfoTest.java @@ -1,7 +1,7 @@ /* * VersionInfoTest.java * - * Copyright (c) 2016-2022, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2023, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,7 +32,6 @@ package net.thauvin.erik.semver; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.testng.Assert; import org.testng.annotations.Test; @@ -47,7 +46,6 @@ import static org.testng.Assert.assertEquals; * @created 2016-02-03 * @since 1.0 */ -@SuppressFBWarnings("PRMC_POSSIBLY_REDUNDANT_METHOD_CALLS") public class VersionInfoTest { private VersionInfo versionInfo = new VersionInfo(); diff --git a/src/test/java/net/thauvin/erik/semver/VersionProcessorTest.java b/src/test/java/net/thauvin/erik/semver/VersionProcessorTest.java index 8e2315d..5fe3e12 100644 --- a/src/test/java/net/thauvin/erik/semver/VersionProcessorTest.java +++ b/src/test/java/net/thauvin/erik/semver/VersionProcessorTest.java @@ -1,7 +1,7 @@ /* * VersionProcessorTest.java * - * Copyright (c) 2016-2022, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2023, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,7 +32,6 @@ package net.thauvin.erik.semver; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.testng.annotations.Test; import java.lang.reflect.InvocationTargetException; @@ -52,7 +51,6 @@ public class VersionProcessorTest { private final VersionProcessor processor = new VersionProcessor(); private final Version version = new VersionTest(); - @SuppressFBWarnings("RFI_SET_ACCESSIBLE") @SuppressWarnings("PMD.AvoidAccessibilityAlteration") @Test public void testFindValues() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { @@ -64,7 +62,6 @@ public class VersionProcessorTest { assertEquals(versionInfo.getProject(), "James Bond", "getProject(James Bond)"); } - @SuppressFBWarnings("RFI_SET_ACCESSIBLE") @SuppressWarnings("PMD.AvoidAccessibilityAlteration") @Test public void testParseIntProperty() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { diff --git a/src/test/java/net/thauvin/erik/semver/VersionTest.java b/src/test/java/net/thauvin/erik/semver/VersionTest.java index ea311ac..8c2a76e 100644 --- a/src/test/java/net/thauvin/erik/semver/VersionTest.java +++ b/src/test/java/net/thauvin/erik/semver/VersionTest.java @@ -1,7 +1,7 @@ /* * VersionTest.java * - * Copyright (c) 2016-2022, Erik C. Thauvin (erik@thauvin.net) + * Copyright (c) 2016-2023, Erik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -41,7 +41,7 @@ import java.lang.annotation.Annotation; * @created 2019-04-02 * @since 1.2.0 */ -@SuppressWarnings({"ClassExplicitlyAnnotation", "SameReturnValue", "java:S2187"}) +@SuppressWarnings({"ClassExplicitlyAnnotation", "SameReturnValue", "java:S2187", "PMD.TestClassWithoutTestCases"}) class VersionTest implements Version { @Override public Class annotationType() { From 01b16c211d6e733a7704367dd65c3a458957356a Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 14 Jul 2023 20:26:21 -0700 Subject: [PATCH 237/316] Updated CI/CD workflows --- .circleci/config.yml | 6 +++--- .github/workflows/gradle.yml | 2 +- appveyor.yml | 6 +++--- build.gradle | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d753e7d..8631e86 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -38,11 +38,11 @@ jobs: <<: *defaults_gradle - build_gradle_jdk8: + build_gradle_jdk11: <<: *defaults docker: - - image: cimg/openjdk:8.0 + - image: cimg/openjdk:11.0 <<: *defaults_gradle @@ -50,5 +50,5 @@ workflows: version: 2 gradle: jobs: - - build_gradle_jdk8 + - build_gradle_jdk11 - build_gradle_jdk17 diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 7250671..50d91fe 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -12,7 +12,7 @@ jobs: strategy: matrix: - java-version: [ 1.8, 11, 17 ] + java-version: [ 11, 17, 20 ] steps: - uses: actions/checkout@v3 diff --git a/appveyor.yml b/appveyor.yml index d902a4e..0d75649 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,5 +1,5 @@ image: - - Visual Studio 2019 + - Visual Studio 2022 version: "{branch} {build}" skip_tags: true @@ -23,8 +23,8 @@ cache: environment: matrix: - - JAVA_HOME: C:\Program Files\Java\jdk15 - - JAVA_HOME: C:\Program Files\Java\jdk11 + - JAVA_HOME: C:\Program Files\Java\jdk17 + - JAVA_HOME: C:\Program Files\Java\jdk19 matrix: fast_finish: true diff --git a/build.gradle b/build.gradle index 6e7d0d4..1924cb3 100644 --- a/build.gradle +++ b/build.gradle @@ -60,8 +60,8 @@ tasks.withType(JavaCompile) { } java { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 withSourcesJar() withJavadocJar() } From ad17e7edef86cdfa869260fb149477c84c039a66 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 14 Jul 2023 20:31:30 -0700 Subject: [PATCH 238/316] Reverted to JDK >= 17 --- .circleci/config.yml | 2 +- .github/workflows/gradle.yml | 4 ++-- build.gradle | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 8631e86..64d62be 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -50,5 +50,5 @@ workflows: version: 2 gradle: jobs: - - build_gradle_jdk11 + - build_gradle_jdk20 - build_gradle_jdk17 diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 50d91fe..13384a8 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -8,11 +8,11 @@ jobs: env: GRADLE_OPTS: "-Dorg.gradle.jvmargs=-XX:MaxMetaspaceSize=512m" - SONAR_JDK: "11" + SONAR_JDK: "17" strategy: matrix: - java-version: [ 11, 17, 20 ] + java-version: [ 17, 20 ] steps: - uses: actions/checkout@v3 diff --git a/build.gradle b/build.gradle index 1924cb3..6e7d0d4 100644 --- a/build.gradle +++ b/build.gradle @@ -60,8 +60,8 @@ tasks.withType(JavaCompile) { } java { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 withSourcesJar() withJavadocJar() } From 4e096b3dad60ec861dfcaa8edb0ad5a890140937 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Mon, 17 Jul 2023 13:13:06 -0700 Subject: [PATCH 239/316] Fixed Jacoco reports generation --- build.gradle | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index 6e7d0d4..478fc4b 100644 --- a/build.gradle +++ b/build.gradle @@ -152,6 +152,8 @@ test { } useTestNG() + + finalizedBy jacocoTestReport } // spotbugs { @@ -196,18 +198,15 @@ tasks.register('pandoc', Exec) { } } -jacoco { - //toolVersion = '0.8.9' -} - jacocoTestReport { dependsOn test reports { - html.required = true xml.required = true + html.required = true } } + sonarqube { properties { property('sonar.organization', 'ethauvin-github') From 4858c58978cdea500a6c80690513efb153fd705f Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 18 Aug 2023 18:12:44 -0700 Subject: [PATCH 240/316] Move from Gradle to bld. Close #7 --- .circleci/config.yml | 53 +- .github/workflows/bld.yml | 53 ++ .github/workflows/gradle.yml | 49 -- .gitignore | 137 ++--- .idea/app.iml | 29 + .idea/bld.iml | 14 + .idea/checkstyle-idea.xml | 18 - .idea/checkstyleidea-libs/readme.txt | 6 - .idea/codeStyles/codeStyleConfig.xml | 5 - .idea/compiler.xml | 10 - .idea/copyright/BSD_3_Clause.xml | 6 + .idea/copyright/Erik_s_Copyright_Notice.xml | 6 - .idea/copyright/profiles_settings.xml | 3 - .idea/encodings.xml | 6 - .idea/inspectionProfiles/Project_Default.xml | 8 + .../inspectionProfiles/profiles_settings.xml | 7 - .idea/jarRepositories.xml | 45 -- .idea/kotlinc.xml | 7 - .idea/libraries-with-intellij-classes.xml | 65 --- .idea/libraries/bld.xml | 17 + .idea/libraries/compile.xml | 13 + .idea/libraries/runtime.xml | 14 + .idea/libraries/test.xml | 14 + .idea/misc.xml | 115 +--- .idea/modules.xml | 9 + .idea/modules/examples-kotlin_main.iml | 41 -- .idea/modules/examples-kotlin_test.iml | 48 -- .idea/runConfigurations/Run Tests.xml | 9 + .idea/scopes/Copyright.xml | 3 - .idea/vcs.xml | 2 +- .vscode/launch.json | 11 + .vscode/settings.json | 15 + README.md | 12 +- appveyor.yml | 9 +- .../javax.annotation.processing.Processor | 33 ++ .../net/thauvin/erik/semver/Constants.class | Bin 0 -> 1771 bytes .../net/thauvin/erik/semver/Version.class | Bin 0 -> 1302 bytes .../net/thauvin/erik/semver/VersionInfo.class | Bin 0 -> 4393 bytes .../erik/semver/VersionProcessor.class | Bin 0 -> 13084 bytes bin/main/net/thauvin/erik/semver/package.html | 12 + bin/main/semver-kt.mustache | 38 ++ bin/main/semver.mustache | 34 ++ .../thauvin/erik/semver/ConstantsTest.class | Bin 0 -> 1583 bytes .../thauvin/erik/semver/VersionInfoTest.class | Bin 0 -> 5276 bytes .../erik/semver/VersionProcessorTest.class | Bin 0 -> 2718 bytes .../net/thauvin/erik/semver/VersionTest.class | Bin 0 -> 2517 bytes bld | 2 + bld.bat | 4 + build.gradle | 221 -------- config/pmd.xml | 1 - docs/README.html | 517 +++++++++++------- gradle.properties | 0 gradlew | 248 --------- gradlew.bat | 92 ---- lib/bld/bld-wrapper.jar | Bin 0 -> 27266 bytes lib/bld/bld-wrapper.properties | 9 + pandoc.sh | 9 + pom.xml | 38 ++ preflightcheck.sh | 201 ------- settings.gradle | 19 - sonar-project.properties | 7 + .../net/thauvin/erik/semver/SemverBuild.java | 147 +++++ .../net/thauvin/erik/semver/Constants.java | 3 +- .../java/net/thauvin/erik/semver/Version.java | 2 +- .../net/thauvin/erik/semver/VersionInfo.java | 204 +++---- .../thauvin/erik/semver/VersionProcessor.java | 28 +- .../java/net/thauvin/erik/semver/package.html | 32 -- .../javax.annotation.processing.Processor | 32 ++ src/main/resources/semver-kt.mustache | 60 +- src/main/resources/semver.mustache | 50 +- .../thauvin/erik/semver/ConstantsTest.java | 4 +- .../thauvin/erik/semver/VersionInfoTest.java | 4 +- .../erik/semver/VersionProcessorTest.java | 4 +- .../net/thauvin/erik/semver/VersionTest.java | 2 +- updatewrappers.sh | 60 -- 75 files changed, 1183 insertions(+), 1793 deletions(-) create mode 100644 .github/workflows/bld.yml delete mode 100644 .github/workflows/gradle.yml create mode 100644 .idea/app.iml create mode 100644 .idea/bld.iml delete mode 100644 .idea/checkstyle-idea.xml delete mode 100644 .idea/checkstyleidea-libs/readme.txt delete mode 100644 .idea/codeStyles/codeStyleConfig.xml delete mode 100644 .idea/compiler.xml create mode 100644 .idea/copyright/BSD_3_Clause.xml delete mode 100644 .idea/copyright/Erik_s_Copyright_Notice.xml delete mode 100644 .idea/copyright/profiles_settings.xml delete mode 100644 .idea/encodings.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml delete mode 100644 .idea/inspectionProfiles/profiles_settings.xml delete mode 100644 .idea/jarRepositories.xml delete mode 100644 .idea/kotlinc.xml delete mode 100644 .idea/libraries-with-intellij-classes.xml create mode 100644 .idea/libraries/bld.xml create mode 100644 .idea/libraries/compile.xml create mode 100644 .idea/libraries/runtime.xml create mode 100644 .idea/libraries/test.xml create mode 100644 .idea/modules.xml delete mode 100644 .idea/modules/examples-kotlin_main.iml delete mode 100644 .idea/modules/examples-kotlin_test.iml create mode 100644 .idea/runConfigurations/Run Tests.xml delete mode 100644 .idea/scopes/Copyright.xml create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 bin/main/META-INF/services/javax.annotation.processing.Processor create mode 100644 bin/main/net/thauvin/erik/semver/Constants.class create mode 100644 bin/main/net/thauvin/erik/semver/Version.class create mode 100644 bin/main/net/thauvin/erik/semver/VersionInfo.class create mode 100644 bin/main/net/thauvin/erik/semver/VersionProcessor.class create mode 100644 bin/main/net/thauvin/erik/semver/package.html create mode 100644 bin/main/semver-kt.mustache create mode 100644 bin/main/semver.mustache create mode 100644 bin/test/net/thauvin/erik/semver/ConstantsTest.class create mode 100644 bin/test/net/thauvin/erik/semver/VersionInfoTest.class create mode 100644 bin/test/net/thauvin/erik/semver/VersionProcessorTest.class create mode 100644 bin/test/net/thauvin/erik/semver/VersionTest.class create mode 100755 bld create mode 100644 bld.bat delete mode 100644 build.gradle delete mode 100644 gradle.properties delete mode 100755 gradlew delete mode 100644 gradlew.bat create mode 100644 lib/bld/bld-wrapper.jar create mode 100644 lib/bld/bld-wrapper.properties create mode 100755 pandoc.sh create mode 100644 pom.xml delete mode 100755 preflightcheck.sh delete mode 100644 settings.gradle create mode 100644 sonar-project.properties create mode 100644 src/bld/java/net/thauvin/erik/semver/SemverBuild.java delete mode 100755 updatewrappers.sh diff --git a/.circleci/config.yml b/.circleci/config.yml index 64d62be..65723f0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,54 +1,41 @@ -version: 2 +inversion: 2 defaults: &defaults working_directory: ~/repo environment: JVM_OPTS: -Xmx3200m TERM: dumb - CI: true + CI_NAME: "CircleCI" -defaults_gradle: &defaults_gradle +defaults_gradle: &defaults_bld steps: - checkout - - restore_cache: - keys: - - gradle-dependencies-{{ checksum "build.gradle.kts" }} - # fallback to using the latest cache if no exact match is found - - gradle-dependencies- - run: - name: Gradle Dependencies - command: ./gradlew dependencies - - save_cache: - paths: ~/.m2 - key: gradle-dependencies-{{ checksum "build.gradle.kts" }} + name: Download the dependencies + command: ./bld download - run: - name: Run All Checks - command: ./gradlew check - - store_artifacts: - path: build/reports/ - destination: reports - - store_test_results: - path: build/reports/ + name: Run tests with bld + command: ./bld compile test jobs: - build_gradle_jdk17: + bld_jdk20: + <<: *defaults + + docker: + - image: cimg/openjdk:20.0 + + <<: *defaults_bld + + bld_jdk17: <<: *defaults docker: - image: cimg/openjdk:17.0 - <<: *defaults_gradle - - build_gradle_jdk11: - <<: *defaults - - docker: - - image: cimg/openjdk:11.0 - - <<: *defaults_gradle + <<: *defaults_bld workflows: version: 2 - gradle: + bld: jobs: - - build_gradle_jdk20 - - build_gradle_jdk17 + - bld_jdk17 + - bld_jdk20 diff --git a/.github/workflows/bld.yml b/.github/workflows/bld.yml new file mode 100644 index 0000000..79093d1 --- /dev/null +++ b/.github/workflows/bld.yml @@ -0,0 +1,53 @@ +name: bld-ci + +on: [ push, pull_request, workflow_dispatch ] + +jobs: + build-bld-project: + runs-on: ubuntu-latest + + env: + COVERAGE_SDK: "17" + + strategy: + matrix: + java-version: [ 17, 20 ] + + steps: + - name: Checkout source repository + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Set up JDK ${{ matrix.java-version }} + uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: ${{ matrix.java-version }} + + - name: Grant execute permission for bld + run: chmod +x bld + + - name: Download the dependencies + run: ./bld download + + - name: Run tests with bld + run: ./bld compile jacoco + + - name: Remove pom.xml + if: success() && matrix.java-version == env.COVERAGE_SDK + run: rm -rf pom.xml + + - name: SonarCloud Scan + uses: sonarsource/sonarcloud-github-action@master + if: success() && matrix.java-version == env.COVERAGE_SDK + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@v3 + if: success() && matrix.java-version == env.COVERAGE_SDK + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml deleted file mode 100644 index 13384a8..0000000 --- a/.github/workflows/gradle.yml +++ /dev/null @@ -1,49 +0,0 @@ -name: gradle-ci - -on: [ push, pull_request, workflow_dispatch ] - -jobs: - build: - runs-on: ubuntu-latest - - env: - GRADLE_OPTS: "-Dorg.gradle.jvmargs=-XX:MaxMetaspaceSize=512m" - SONAR_JDK: "17" - - strategy: - matrix: - java-version: [ 17, 20 ] - - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Set up JDK ${{ matrix.java-version }} - uses: actions/setup-java@v3 - with: - distribution: 'zulu' - java-version: ${{ matrix.java-version }} - - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - - name: Cache SonarCloud packages - if: matrix.java-version == env.SONAR_JDK - uses: actions/cache@v3 - with: - path: ~/.sonar/cache - key: ${{ runner.os }}-sonar - restore-keys: ${{ runner.os }}-sonar - - - name: Test with Gradle - uses: gradle/gradle-build-action@v2 - with: - arguments: build check --stacktrace - - - name: SonarCloud - if: success() && matrix.java-version == env.SONAR_JDK - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - run: ./gradlew sonar --info diff --git a/.gitignore b/.gitignore index 097f727..091e664 100644 --- a/.gitignore +++ b/.gitignore @@ -1,84 +1,57 @@ - -!.vscode/extensions.json -!.vscode/launch.json -!.vscode/settings.json -!.vscode/tasks.json -*.class -*.code-workspace -*.ctxt -*.iws -*.log -*.nar -*.rar -*.sublime-* -*.tar.gz -*.zip -.DS_Store -.classpath .gradle -.history -.kobalt -.mtj.tmp/ -.mvn/timing.properties -.mvn/wrapper/maven-wrapper.jar -.nb-gradle -.project -.scannerwork -.settings -.vscode/* -/**/.idea/$CACHE_FILE$ -/**/.idea/$PRODUCT_WORKSPACE_FILE$ -/**/.idea/**/caches/build_file_checksums.ser -/**/.idea/**/contentModel.xml -/**/.idea/**/dataSources.ids -/**/.idea/**/dataSources.local.xml -/**/.idea/**/dataSources/ -/**/.idea/**/dbnavigator.xml -/**/.idea/**/dictionaries -/**/.idea/**/dynamic.xml -/**/.idea/**/gradle.xml -/**/.idea/**/httpRequests -/**/.idea/**/libraries -/**/.idea/**/mongoSettings.xml -/**/.idea/**/replstate.xml -/**/.idea/**/shelf -/**/.idea/**/shelf/ -/**/.idea/**/sqlDataSources.xml -/**/.idea/**/tasks.xml -/**/.idea/**/uiDesigner.xml -/**/.idea/**/usage.statistics.xml -/**/.idea/**/workspace.xml -/**/.idea/sonarlint* -/**/.idea_modules/ -Thumbs.db -__pycache__ +.DS_Store +build +lib/bld/** +!lib/bld/bld-wrapper.properties +!lib/bld/bld-wrapper.jar +lib/compile/ +lib/runtime/ +lib/standalone/ +lib/test/ + +# IDEA ignores + +# User-specific +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin atlassian-ide-plugin.xml -bin/ -build/ -cmake-build-*/ -com_crashlytics_export_strings.xml -crashlytics-build.properties -crashlytics.properties -dependency-reduced-pom.xml -deploy/ -dist/ -ehthumbs.db -fabric.properties -gen/ -hs_err_pid* -kobaltBuild -kobaltw*-test -lib/kotlin* -libs/ -local.properties -out/ -pom.xml.next -pom.xml.releaseBackup -pom.xml.tag -pom.xml.versionsBackup -proguard-project.txt -project.properties -release.properties -target/ -test-output -venv + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Editor-based Rest Client +.idea/httpRequests + +local.properties \ No newline at end of file diff --git a/.idea/app.iml b/.idea/app.iml new file mode 100644 index 0000000..787b59b --- /dev/null +++ b/.idea/app.iml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/bld.iml b/.idea/bld.iml new file mode 100644 index 0000000..e63e11e --- /dev/null +++ b/.idea/bld.iml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/checkstyle-idea.xml b/.idea/checkstyle-idea.xml deleted file mode 100644 index 17101f8..0000000 --- a/.idea/checkstyle-idea.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/checkstyleidea-libs/readme.txt b/.idea/checkstyleidea-libs/readme.txt deleted file mode 100644 index 71cc7ff..0000000 --- a/.idea/checkstyleidea-libs/readme.txt +++ /dev/null @@ -1,6 +0,0 @@ -This folder contains libraries copied from the "semver" project. -It is managed by the CheckStyle-IDEA IDE plugin. -Do not modify this folder while the IDE is running. -When the IDE is stopped, you may delete this folder at any time. It will be recreated as needed. -In order to prevent the CheckStyle-IDEA IDE plugin from creating this folder, -uncheck the "Copy libraries from project directory" option in the CheckStyle-IDEA settings dialog. diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml deleted file mode 100644 index d91f848..0000000 --- a/.idea/codeStyles/codeStyleConfig.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index a857b2a..0000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/copyright/BSD_3_Clause.xml b/.idea/copyright/BSD_3_Clause.xml new file mode 100644 index 0000000..956f692 --- /dev/null +++ b/.idea/copyright/BSD_3_Clause.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/copyright/Erik_s_Copyright_Notice.xml b/.idea/copyright/Erik_s_Copyright_Notice.xml deleted file mode 100644 index ef51a2d..0000000 --- a/.idea/copyright/Erik_s_Copyright_Notice.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml deleted file mode 100644 index 1419e40..0000000 --- a/.idea/copyright/profiles_settings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index 97626ba..0000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..7e0a3c7 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index dd4c951..0000000 --- a/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml deleted file mode 100644 index b23fa44..0000000 --- a/.idea/jarRepositories.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml deleted file mode 100644 index 5806fb3..0000000 --- a/.idea/kotlinc.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/libraries-with-intellij-classes.xml b/.idea/libraries-with-intellij-classes.xml deleted file mode 100644 index 9fa3156..0000000 --- a/.idea/libraries-with-intellij-classes.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/libraries/bld.xml b/.idea/libraries/bld.xml new file mode 100644 index 0000000..abca604 --- /dev/null +++ b/.idea/libraries/bld.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/compile.xml b/.idea/libraries/compile.xml new file mode 100644 index 0000000..9bd86aa --- /dev/null +++ b/.idea/libraries/compile.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/runtime.xml b/.idea/libraries/runtime.xml new file mode 100644 index 0000000..2ae5c4b --- /dev/null +++ b/.idea/libraries/runtime.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/test.xml b/.idea/libraries/test.xml new file mode 100644 index 0000000..b80486a --- /dev/null +++ b/.idea/libraries/test.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 90755e7..ea78ec7 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,118 +1,13 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..55adcb9 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/examples-kotlin_main.iml b/.idea/modules/examples-kotlin_main.iml deleted file mode 100644 index 4aeac9a..0000000 --- a/.idea/modules/examples-kotlin_main.iml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules/examples-kotlin_test.iml b/.idea/modules/examples-kotlin_test.iml deleted file mode 100644 index 4b23562..0000000 --- a/.idea/modules/examples-kotlin_test.iml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/runConfigurations/Run Tests.xml b/.idea/runConfigurations/Run Tests.xml new file mode 100644 index 0000000..4f6af10 --- /dev/null +++ b/.idea/runConfigurations/Run Tests.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/.idea/scopes/Copyright.xml b/.idea/scopes/Copyright.xml deleted file mode 100644 index 7fb840b..0000000 --- a/.idea/scopes/Copyright.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 94a25f7..35eb1dd 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..7a56afd --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "java", + "name": "Run Tests", + "request": "launch", + "mainClass": "net.thauvin.erik.semver.SemverTest" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..c83239c --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,15 @@ +{ + "java.project.sourcePaths": [ + "src/main/java", + "src/main/resources", + "src/test/java", + "src/bld/java" + ], + "java.configuration.updateBuildConfiguration": "automatic", + "java.project.referencedLibraries": [ + "${HOME}/.bld/dist/bld-1.7.1.jar", + "lib/compile/*.jar", + "lib/runtime/*.jar", + "lib/test/*.jar" + ] +} diff --git a/README.md b/README.md index 84e3efc..d993dd6 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,16 @@ # Semantic Version Annotation Processor -[![License (3-Clause BSD)](https://img.shields.io/badge/license-BSD%203--Clause-blue.svg?style=flat-square)](https://opensource.org/licenses/BSD-3-Clause) [![release](https://img.shields.io/github/release/ethauvin/semver.svg)](https://github.com/ethauvin/semver/releases/latest) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver/badge.svg)](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver) +[![License (3-Clause BSD)](https://img.shields.io/badge/license-BSD%203--Clause-blue.svg?style=flat-square)](https://opensource.org/licenses/BSD-3-Clause) +[![Java](https://img.shields.io/badge/java-17%2B-blue)](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html) +[![bld](https://img.shields.io/badge/1.7.1-FA9052?label=bld&labelColor=2392FF)](https://rife2.com/bld) +[![release](https://img.shields.io/github/release/ethauvin/semver.svg)](https://github.com/ethauvin/semver/releases/latest) +[![Maven Central](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver/badge.svg)](https://maven-badges.herokuapp.com/maven-central/net.thauvin.erik/semver) +![Sonatype Nexus (Snapshots)](https://img.shields.io/nexus/s/net.thauvin.erik.httpstatus/httpstatus?server=https%3A%2F%2Foss.sonatype.org) -[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=ethauvin_semver&metric=alert_status)](https://sonarcloud.io/dashboard?id=ethauvin_semver) [![GitHub CI](https://github.com/ethauvin/semver/actions/workflows/gradle.yml/badge.svg)](https://github.com/ethauvin/semver/actions/workflows/gradle.yml) [![Build status](https://ci.appveyor.com/api/projects/status/nbv4mxd1gpxtx69o?svg=true)](https://ci.appveyor.com/project/ethauvin/semver) [![CircleCI](https://circleci.com/gh/ethauvin/semver/tree/master.svg?style=shield)](https://circleci.com/gh/ethauvin/semver/tree/master) +[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=ethauvin_semver&metric=alert_status)](https://sonarcloud.io/dashboard?id=ethauvin_semver) +[![GitHub CI](https://github.com/ethauvin/semver/actions/workflows/gradle.yml/badge.svg)](https://github.com/ethauvin/semver/actions/workflows/gradle.yml) +[![Build status](https://ci.appveyor.com/api/projects/status/nbv4mxd1gpxtx69o?svg=true)](https://ci.appveyor.com/project/ethauvin/semver) +[![CircleCI](https://circleci.com/gh/ethauvin/semver/tree/master.svg?style=shield)](https://circleci.com/gh/ethauvin/semver/tree/master) An [annotation processor](https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html) that automatically generates a `GeneratedVersion` class based on a [Mustache](https://mustache.github.io/) template and containing the [semantic version](https://semver.org/) (major, minor, patch, etc.) that is read from a [Properties](https://docs.oracle.com/javase/tutorial/essential/environment/properties.html) file or defined in the [annotation](https://docs.oracle.com/javase/tutorial/java/annotations/basics.html). diff --git a/appveyor.yml b/appveyor.yml index 0d75649..3eebf3d 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -8,23 +8,20 @@ build: verbosity: detailed build_script: - - gradlew.bat assemble --info --no-daemon + - bld.bat download compile test_script: - - gradlew.bat check --info --no-daemon + - bld.bat test branches: only: - master - 1.2.1-dev -cache: - - C:\Users\appveyor\.gradle - environment: matrix: - JAVA_HOME: C:\Program Files\Java\jdk17 - - JAVA_HOME: C:\Program Files\Java\jdk19 + - JAVA_HOME: C:\Program Files\Java\jdk20 matrix: fast_finish: true diff --git a/bin/main/META-INF/services/javax.annotation.processing.Processor b/bin/main/META-INF/services/javax.annotation.processing.Processor new file mode 100644 index 0000000..5ae1016 --- /dev/null +++ b/bin/main/META-INF/services/javax.annotation.processing.Processor @@ -0,0 +1,33 @@ +# +# javax.annotation.processing.Processor +# +# Copyright (c) 2016-2023, Erik C. Thauvin (erik@thauvin.net) +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# Neither the name of this project nor the names of its contributors may be +# used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +net.thauvin.erik.semver.VersionProcessor diff --git a/bin/main/net/thauvin/erik/semver/Constants.class b/bin/main/net/thauvin/erik/semver/Constants.class new file mode 100644 index 0000000000000000000000000000000000000000..b2993072af612ad38c72cef451680df8ee1988f8 GIT binary patch literal 1771 zcmai!`*Pbv6vodwNv*iKv!NV&$Cl>Q zzG1YH8$m{k8(gz_k=YiU-It28c}uf2$FvlB2TRDd5GU7VBIRvJnb$N`XAa^y9fj_) zER(GRt>w4}<1+VnlfyNyyJpML&E~`pqObM5C{=rdH1I?9BtIT}hlp;QTXtq$bb~@4 zFq%Ia`oVEuq|p4vE6s`$KSH8~wHn3ZSN|C*mN$)LRp?VjbA9h@5Wl#biL1~T*|HzL zv^eUOD;HvCXDhy5cF zJKj+MomY$jcDKFQ&v^22Ha+zdMz@Ury{d4_RP4bp?uuPMbGMXVIfK&<%-ig5P|B-;(xkV*PE2 zZ-L*H_&xBp#CO2=Bz_;PN?Zj$koZIJ#}a=6{!HS}!Cy-J5d28u$KbCe*1$E1>)>69 z_rSWu`(Q)j29zpg9f<#LaUwf7C0tCjboV(~f0EN#X+Ni@e~-@U2RtjVCi;zL>38}O TZwq5<`iXu9F>>)N(J%i2PDOQJ literal 0 HcmV?d00001 diff --git a/bin/main/net/thauvin/erik/semver/Version.class b/bin/main/net/thauvin/erik/semver/Version.class new file mode 100644 index 0000000000000000000000000000000000000000..239b8a216bbbdd2ff65989948fd56e55d92ae657 GIT binary patch literal 1302 zcmaizYflqF6o${xmKG>dZVDoTsFjLzyhNI??gr(rp?)9x*^vyJ_0e((qQ zqm1t^y-Wy+ADW$c&il@}%=FLSU%!dyExj(%n4q8ikCtvXK3ewVd#%sN(K zP^7$|N?UfNtR>O*Rm2Tpr)`*hlsw^aoM?==;HL74xASeg$0l z68<4YDq%N)T`s0cfGHc40j6zm1z^So6@XbA%mK{XU;$u}t`4&7(KUc2Td@eRY%8t< ztk{ZWfEzYQD_y;4xoIm_p;)s)YFW3zEr1Oh+y=N~gS!A#8>DC4vq2SL(*~)cW`p|x uTQ;ZxJg~twK-~rojnPBg$QV7M$M~*b^#t>K%Jht$(~ETZg9Ot{di4*(IUSz> literal 0 HcmV?d00001 diff --git a/bin/main/net/thauvin/erik/semver/VersionInfo.class b/bin/main/net/thauvin/erik/semver/VersionInfo.class new file mode 100644 index 0000000000000000000000000000000000000000..8351bcffd22f36dddae0af8ec78fffc5b46a908f GIT binary patch literal 4393 zcma)9TXP)675+xImDgiz)&|EIYy(8JQ}b?RdQ63mh1}@s+EQ3|y_rD^n^zW`sjG|b z(^M%}oFF*uR28YJ&LzK2s-j@m6TGqJl;@lo6|bl{p=_3|)z!GFC?}xWmet8JYo=EB zBl9){s^-+4P`KLebv-vcY@xZcYtll?h(E2eXvSA;Y{N}i+=5#(*ty2b(qa&*s*T&Q z%fgN2`FdS>;e=aNV{WD52Ab;B23WY=Ml0IdvDX4*zTZX$?d`aO?sSWw)25t)Jo)ce zo}x`^I*zZrztct*?Sgu3Y=SN5E*m#Qvaj0M9Lc_BV~g;BH`EgbBc+=%;8%;2Pj-Pd82(D5{F>+EVgL&7pDp*$t%v;<9~GveS`osXitDM=8| z3VKL_sMnm6AZpno5=1S#Akow4F^Qf=Pe|BkK!#U9j=zOH*Y(eWJ)^>7iSwVFE}u(T zGqQT%+c`ZRT_1sC(ec+XI{i0LdM0@RQHB6S{o&X+~;WYVh&AsPWE`-!V{gvM#V2DYSc4qXkk++ zWcbINT6{6=U`>*5GPok8C6`>boC?uRCZE$d<1L*<(P|e-oOr^uiPr*M{5AV#)+4$SF*~Cm;Cv9S)FjD0BlJV`Ch5n6dm*ZFbL~TjkSE%pANEk4L{G|XT0jG zRo(R#{5e&K&O?;x6Hb|xRv&?1Sa>}dop^Obc+&BvD=OGO>icu^wZX<@BqVDTCl+hU zu>3+|ebkr+lj)2pMx08erKC2yX@EBY1KiEZ&wOOZ01sVL7MX5%kD@phtEC zJ+cYtku5-vto$5zawj%7K5ypiPu!Ia3J>J}g6;XgV#gA8=W~0OurHrGu!N3$u4@V1 z`Q|0`XmLT{K@I!zxvwvwU*my%Zg2@h`IaRN|5p@EupLL) zJC9*6M$n1-(1YXX!wC$qFc0G-XGNUi|6|m&Bh$F@KF-AKKF8=paDUT3mQs$c{cWP zoS`jYHzv@9hv?ZPzp2jAw}){SkKh8%L-Fb3Q7qyy?d8ppC$X3G3EzN2KP^l#4pEv4 zdJeSa-^af9=y(&u2%Zzkok|3&btPD3qjE=D*)u9n8jgp0x67M&((f&xN$lZyJ?d5Pv=Kc#vb?71ZCrR-%5HUB%PDAJLlI!`Z%-cO5djif_g5uHsohENRxaY_G1H zpYVczO7t1a(m(mJ_%D{Df8#Fv2c!5TVdZ#y120qmJX)@y7gmNgw(=S1-!;y(sBJ~W zSJ$w^D2>-?MsnDs!)VOzeN*LNfO-B1@Z6(*Xb-1Ko z3fD_!uAa1Aw~|X*6u7UBY9e0JbA{_=vyX)|*8y_fu@0B?ZQ**wY}dgwS1-8=>u^c$ z7p_;$cJ-yX`pI=@9WMEP5U%f=x%$&wN62+_9WMC>5w0JYxdzf)MRG;WzcKdm9V1*n zG;<|da&#uf$yHj%F8LOcFRmXk%T4$(e!_7Z=f9-%SBdAZ@h0EMA4k8z@9;Ku{12CW B25tZV literal 0 HcmV?d00001 diff --git a/bin/main/net/thauvin/erik/semver/VersionProcessor.class b/bin/main/net/thauvin/erik/semver/VersionProcessor.class new file mode 100644 index 0000000000000000000000000000000000000000..38b56762ba015bd17d9e380a9de42f16f3291a53 GIT binary patch literal 13084 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 + + + Semantic Version Annotation Processor + + +An annotation processor that automatically generates a GeneratedVersion class containing the semantic +version (major, minor, patch, etc.) that is read from a Properties file or defined in the annotation. + +@since 1.0 + + diff --git a/bin/main/semver-kt.mustache b/bin/main/semver-kt.mustache new file mode 100644 index 0000000..0a58f86 --- /dev/null +++ b/bin/main/semver-kt.mustache @@ -0,0 +1,38 @@ +/* +* This file is automatically generated. +* Do not modify! -- ALL CHANGES WILL BE ERASED! +*/ + +package {{packageName}} + +import java.util.Date + +/** +* Provides semantic version information. +* +* @author Semantic Version Annotation Processor +*/ +object {{className}} { +@JvmField +val PROJECT = "{{project}}" +@JvmField +val BUILDDATE = Date({{epoch}}L) +@JvmField +val MAJOR = {{major}} +@JvmField +val MINOR = {{minor}} +@JvmField +val PATCH = {{patch}} +@JvmField +val PRERELEASE = "{{preRelease}}" +@JvmField +val PRERELEASE_PREFIX = "{{preReleasePrefix}}" +@JvmField +val BUILDMETA = "{{buildMeta}}" +@JvmField +val BUILDMEATA_PREFIX = "{{buildMetaPrefix}}" +@JvmField +val SEPARATOR = "{{separator}}" +@JvmField +val VERSION = "{{version}}" +} diff --git a/bin/main/semver.mustache b/bin/main/semver.mustache new file mode 100644 index 0000000..cd7c567 --- /dev/null +++ b/bin/main/semver.mustache @@ -0,0 +1,34 @@ +/* +* This file is automatically generated. +* Do not modify! -- ALL CHANGES WILL BE ERASED! +*/ + +package {{packageName}}; + +import java.util.Date; + +/** +* Provides semantic version information. +* +* @author Semantic Version Annotation Processor +*/ +public final class {{className}} { +public static final String PROJECT = "{{project}}"; +public static final Date BUILDDATE = new Date({{epoch}}L); +public static final int MAJOR = {{major}}; +public static final int MINOR = {{minor}}; +public static final int PATCH = {{patch}}; +public static final String PRERELEASE = "{{preRelease}}"; +public static final String PRERELEASE_PREFIX = "{{preReleasePrefix}}"; +public static final String BUILDMETA = "{{buildMeta}}"; +public static final String BUILDMETA_PREFIX = "{{buildMetaPrefix}}"; +public static final String SEPARATOR = "{{separator}}"; +public static final String VERSION = "{{version}}"; + +/** +* Disables the default constructor. +*/ +private {{className}}() { +throw new UnsupportedOperationException("Illegal constructor call."); +} +} diff --git a/bin/test/net/thauvin/erik/semver/ConstantsTest.class b/bin/test/net/thauvin/erik/semver/ConstantsTest.class new file mode 100644 index 0000000000000000000000000000000000000000..c8c9fdee06825dd20f0e81d4e482e065ffcb7024 GIT binary patch literal 1583 zcma)6+fo}x5IrLVyND$Qaf_Xp_!=aGSmVUTSQr~~aWDcWpomzx)gVpKg0xb0XQ}vC z@&kF!OAJm`D$jY#PvkS=oLxyEOdecYHPdrDeY*Sf{`K$cKL9+$_Xc7DH(jM|U6H|| zjpSNnP8YXfnCfqi)>?W%P5?B~1ts-y*a<{j733j$rKbU`4# zR4=Opy3lK(8$ALSa*nGugW9h0@^ZJT1d_RWNmdKebHa6NGp;L+FEEjNCo)+9OOw>H z`auR&&4(Aa0#`dVRd9TVsEe*!*HSx-K;Uw&?(Ny(ee#y4Cw3TD)b zQpLo$fXJA*B9Lf!YD-m>^qH<CJKRR-5OmhS z(=$46mej-=^LIiifmN(q$YFz&lw0<999?-U+O`&oVR@fh_#9ub>P`9Ny?~7{nkt?z zZMqOfux%laF9nQ>^fx22Y_B3I=yu6SvLpO3@yuOJH^TlpCrJ7_+jK7*?Z&(D7Rvnj z*9%1M-)7YhHe{pKuZit?;FZ*>6Ls{NKgD$D9#=sP@Gk?7)IWMS8eG|&1?TQtuVDU4 zBZdUW@EEv*K8{xN0_T3NC@`MJaG`Z;fO81sN5H^LJf0jp!cbRN@?vxPfK&1^zmJY^ zHF<;I$DxtpcZk3H$PNj6sUy5}x2Xl{||Tu9oo(Pa~>VqJ*!vsG3+p0Xxj!EK$C~3sNi+C(Lg1 f>}y)zaAz2?H|+Dc0b#J$41!{aXW#NHhVT9ZXs&N& literal 0 HcmV?d00001 diff --git a/bin/test/net/thauvin/erik/semver/VersionInfoTest.class b/bin/test/net/thauvin/erik/semver/VersionInfoTest.class new file mode 100644 index 0000000000000000000000000000000000000000..8c5f8b425d3329db982cadd38abb544806ef3bfe GIT binary patch literal 5276 zcma)A33yyZ9sf$xUn*D;Ic>L>Afi=76ctfW3mR+m|+=tE41`@gd0&O1PH@s?QihbwsA>v#7e+!r20_aE`z@ZCfCFE@QH*S)oNP z#Zt|v2} zR&`pqm^05{j&foqE>T@}slXJcvvc=03YzA_5+8~51!aGEs7bAyHtoxm5+5^MVU>S8 z;LV)W$$M41G=g|A#t5@emqSoSG9%f1sX;{juz3I+$ixWB_qiYE76;S9*Phr zsKQ&ge_w7WWZWntFaz;xV<`B;{)~Wz2R@1T$n;f|KHYo6LSGqtHT$ z#|#yXaz7%gOl+0dW>OhzpB;=PH2*~OtzWXgP%eX(MFO5On(6EJX8F%&CDJ!DpZwn-1YQH1#T{8!kW_Vhe zg8H7s_l<`U!NQ9{eMg8B)Af?XkMQH5b(iIHeH=h+-4hddg%Qx_>#(2Bv>fO9EZLV) zr#@bl_?ePP(Ee3C)vI|$;=jt*E&PI8^{Pp(1R9$gv$+cz7dEyQRpBsIbm|uJu89V@A=-Nt`N0&U70QMrn)b^B{0j` z(^aM;*;9u<;V%jNS>V7u+^r=3s-{r&kUHHh{5>cqJq8_(C6%s!O8hHe3+CCsLpD9n zhSaBKdspH=nk^q3+wTQz!9dfPV&gaxY<7k+AGM7oDuV_nH;hxJYN=`|YLwK(GEQc7 zE((j+QC*GZtPcn=4FRC_)JjpO^o-M))@QaD&xuY2(Qt4gnii>-VxkhMk6^R2%`CCHY>Jg2UM7Wi}%sqAhYpXjqTa8hbC zu#%SKa(>Y-xOrB=KyFR3R?HJ^3DL?fD__pj*^%6!*Am>(gYYkR`*?R*ukz9^a9jLZ z8FB{-PjItqGG1|3S1va=obT8@_%URZ;Hvd`Zw&UcWBkFZtRw!62vsa~GnwwR?{(DI zh!#s6!BQ6~{%;md>^s?+&3XkLVy~DG3)nil`8t;M3DF@ioKF+|)OE|&6C)q0ud`bzY8hDl6W8gDG*j^pe_5u5Y zhJIcNy++Kl`wdKO8n!8)HuQ|04e9hX0P}W{P&t-sF^#dA&zLS?v^sc&U4*$f21j8r zGqDsau?%P7c=V$ad7Okxu>x1&6l}n$xQ7ptjW`{faR#0u*Yh|VFX0@#hI8>IT)cx` z4t*EzqpzGJrpe@Jc&r>%OxN`Qky8fSbXU8>kca6Rsj@HHiVrDjIXjnC+aC=KY2E2CjT}V`IL{+8z^R4)$Dv3(nUKe2o zfA_Ot(p(R6HH6v7p&jS5K#Dj4!%Y4KO!9gR;9`v65?sdr*YRz0Coab$xDs1fBs+06 zUc|L{m6SJdJ>JHR95OeFdTbB};8rmkw~NDYr&xr$#YwnVWN}}tOmbnF{Fb)xZ&dG! zfn)jZ#P7zc8F9a2VShL5!0YtzjV?VmnzrB%92`L?Mw+(ak9+|9Ev$$VE+g^}B5y~? z6-3@4^4|!#mdN`&sYFE-#YdX9i7EvpBIpJ};}j$#=mA0#6tqtS-9c!Qf+k1M)WE2~ zkYMv*!$9G7F_qmS_Am2?6*ozku~ouO@-`~92S;o#5IRIb4xw_d_k!whKO^`6r{qQ^ z^+6nohxn(8huO7{VjW*CL;TL;38rxqZeVBM#P3^}&IkF#cnsU|EOzjYzMYBP!Ta?# zyn-k3mU=<(l`sj<=mbsm_&P0U@Tn9Kbuc-o}+&3VuC3vsxZ&s8md9Vw0y H3o-3~xTS0A literal 0 HcmV?d00001 diff --git a/bin/test/net/thauvin/erik/semver/VersionProcessorTest.class b/bin/test/net/thauvin/erik/semver/VersionProcessorTest.class new file mode 100644 index 0000000000000000000000000000000000000000..5166fb7ce0118d1cc550c6ad4c7f9900aa28fa20 GIT binary patch literal 2718 zcma)8YgZFj6y29ZW{88zsQ9WCYi$#PM37bmMNvV6;i1sjU~M~uOBe|=I5VMY-|y!y zX!|GHRnb*fyV|e)6a7~IMOXJt1~WXmaIseA-gC}9XPasw~+~Mtb&q#+M6A(#zzf=i9C`?zu(j`>r=B{Xj!pV8?B1$;y;1r<56+zAcM^ zK-1!il|Xy$Sv~d%XpE$y2prz*7_A%6*p40a3&fJCyg>Y-J0lZ_q1iwa5*oG(B%d{S z0^88s1Od~)7Bp(uC2(Yu!-|3gcGk}AF`z*g*q*Z;Ia*nmmfoZ_U6%BibBk6vZ+W)b zhr)O;XZr%3o29vmZ|1x$V9+7knaNw_ilm3c;N7BJ3`m-<;gGnSt3m3XVUUYGKd^FBG6VpkS&*G$tn*NRUbUH64-aW;so}B z%-g=rJO>=d4XXYK@?g&ON*M*6U1HTW8AV~As@cm1l1K^Y41KX|`8>2Unab6}R)u{! z(oA{wY5p3Hk@7WG8ZzWzlj0@Nfi45xI3du&pqFH^Y8?`A|) z!xKfg!eq?@vw8(5HM}aYw~lYMje%1*Ezs=Cphl-6j*Xn0O6Aq@J_BcPmW^(+IP=t; zj)JO9+bU3@D2gf+X*joeLuZ{?H-UZ(7`T9oB$~X0b1$%KRXIXNbPQ5+{MhkhCwrIN znRzRnUa-7?bE)Gpi%@rv+`uT6Ko(au46_801{v^u=>-OI7!feo3)~IfsaRz;#VQ6u z5Rt0ZOj%sMLiBGbO7;U+cJ2C4*hITOll=_fFSW*u(| zh%U8$+kk~>24^>|oEA70?U?^(Cz4IrFgj-Fxm(99@7M0mE**2+pU`oe4SHXCu8uMV zJvw+>$J%<@bS&~QSX_tSTlGZLAT%Msl7AFt`DF#Sl_^^%asR9?rY z0=w6_CtWEWpA*$Om12&%FE=_y64_#cG`7~lucis=C=* zbrI)pH{v*f?dZXNuJ=)5&>3BDe}G?s=jc9$gIw$UK94rMfET%Ir0yucD)0~7DS+Ab zU(m9Qm(2F~Z|Eq*%+85r9M7fW%jiif9mTOijH^~EdjCNGNXIhHo0rU?N4Ub}sCmtt z;Ia;Le>LCJXhkmp^%3M*{`KPu&Q;;I)dGibTbayj$P-#O_TUCyCuahM%~KGCFoh?N zF-5N4$feC&=B;JCbt7#SO<7x%OuM$2Hy6}mC0)0%mhRL-n#7I+~zMxT^;9mZ( z1YBZu2hoBd5_uU%NN)#*DY?o!eHbGgt?L-&ERW$wUb=s>)&8MG^-HY)Pr?G|_#0p0 TYmz>K@2jOy1^9+`4fysyUe(o; literal 0 HcmV?d00001 diff --git a/bin/test/net/thauvin/erik/semver/VersionTest.class b/bin/test/net/thauvin/erik/semver/VersionTest.class new file mode 100644 index 0000000000000000000000000000000000000000..0047ff2e10bbbcca280af20cac1aa963856e6a30 GIT binary patch literal 2517 zcmai!OH&g;5XXB0fdwLO-w#kkUXlexQQn9TknoTo<;BA!4q+j?8+Rv^DKB2Uc=6)J zix)2*Jm|?P4}JhYlx5E(Y~t8e95%bt-M@eLbkF4XpP#<~U>2S>LX1J5C!{U+c=6Ej zY!NsIb|~CK5!gE-2p!+s7NKl}dIs(L{E*vu?&a)_%)ZE?wShs;F*t*U8OL+v9D};S zp&bVGOa2Sd40X_wfJU$ww51$RtQXyk2)219FBo*D{4CG!@W4^)im_hqIU$4o)G-NF zz0(X@x##(kOSOYi0Y$q8hf>uYEaiC^Vpvn!$$4BB1B{sbKVoL2hN&vri;?*BoKndY zo&1Y6AvuHYe^k;kaJ<~K1*dWUV`GyH5>f1`C|Ph0JK}1vEpluIV%K?P!9@ma1lwUa zG}p_ZMRCc34#pa?YD??f6&Cbi*Vjs_6AYRUL@7K{yoL^~mShlj`Mw|Mv8*t#^h!$) zD4*jgpQYd0iiNZkc=mwjL^;VAjxOuF$z9)1idWn%sL{m>TxRzW)Nc)rV+~m3mdFbp zVsW=|#~Hoj6IHX0yjzY8%8_{Ds{W%5%wS7KahRq@^YaWk&{5%|&NLPRU!7MA?qSJm zrC!yT-p#U6r_^pOu~1$YL?9gzTJQ)7iQy>bSB%)|P!xE;r5{-E7z@H?CL)uTS;h`X zfi2+@cf5f!bW3=r)O||2#ZdC>9yY69;>omNi$Ux_O)BjdgRFSys7AKeT)(6`x6lhX zD}3U3dC%d4mj_o(_+{gp;X6M31De0%M+_49+n|l3a00&*q`=yAkbSTdPt&^1bW9r zUz6w*fliy~8xox*&^Z%*OQH(|x@e;BNOXxn@0;j*5`93R4^8v~i7pf9iiv(C(NzLX dndm1HT_ezS6a7r0n*{pAM8A+|TK^$z{{@|4QCt83 literal 0 HcmV?d00001 diff --git a/bld b/bld new file mode 100755 index 0000000..824b742 --- /dev/null +++ b/bld @@ -0,0 +1,2 @@ +#!/usr/bin/env sh +java -jar "$(dirname "$0")/lib/bld/bld-wrapper.jar" "$0" --build net.thauvin.erik.semver.SemverBuild "$@" \ No newline at end of file diff --git a/bld.bat b/bld.bat new file mode 100644 index 0000000..ab43bcd --- /dev/null +++ b/bld.bat @@ -0,0 +1,4 @@ +@echo off +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +java -jar "%DIRNAME%/lib/bld/bld-wrapper.jar" "%0" --build net.thauvin.erik.semver.SemverBuild %* \ No newline at end of file diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 478fc4b..0000000 --- a/build.gradle +++ /dev/null @@ -1,221 +0,0 @@ -// import com.github.spotbugs.snom.SpotBugsTask -import org.apache.tools.ant.taskdefs.condition.Os - -plugins { - id 'java' - id 'jacoco' - id 'maven-publish' - id 'pmd' - id 'signing' - id 'com.github.ben-manes.versions' version '0.47.0' - id 'net.thauvin.erik.gradle.semver' version '1.0.4' - // id 'com.github.spotbugs' version '5.0.14' - id 'org.sonarqube' version '4.2.1.3168' -} - -defaultTasks 'check' - -group = 'net.thauvin.erik' - -final def mavenName = 'SemVer' -final def mavenDescription = 'Semantic Version Annotation Processor' -final def mavenUrl = 'https://github.com/ethauvin/semver' -final def mavenLicense = 'The BSD 3-Clause License' -final def mavenLicenseUrl = 'http://opensource.org/licenses/BSD-3-Clause' -final def mavenScmCon = 'https://github.com/ethauvin/semver.git' -final def mavenScmDevCon = 'git@github.com:ethauvin/semver.git' - -def isNonStable = { String version -> - def stableKeyword = ['RELEASE', 'FINAL', 'GA'].any { it -> version.toUpperCase().contains(it) } - def regex = /^[0-9,.v-]+(-r)?$/ - return !stableKeyword && !(version ==~ regex) -} - -ext.versions = [ - pmd: '6.54.0', - // spotbugs: '4.7.3' -] - -repositories { - mavenLocal() - mavenCentral() - maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } -} - -dependencies { - implementation 'com.github.spullara.mustache.java:compiler:0.9.10' - - // spotbugsPlugins 'com.h3xstream.findsecbugs:findsecbugs-plugin:1.12.0' - // spotbugsPlugins 'com.mebigfatguy.sb-contrib:sb-contrib:7.6.0' - - // compileOnly "com.github.spotbugs:spotbugs-annotations:$versions.spotbugs" - // testCompileOnly "com.github.spotbugs:spotbugs-annotations:$versions.spotbugs" - - testImplementation 'org.testng:testng:7.8.0' -} - - -tasks.withType(JavaCompile) { - options.encoding = 'UTF-8' -} - -java { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - withSourcesJar() - withJavadocJar() -} - -tasks.named("dependencyUpdates").configure { - rejectVersionIf { - isNonStable(it.candidate.version) - } -} - -pmd { - toolVersion = versions.pmd - ignoreFailures = true - ruleSets = [] - ruleSetFiles = files("${projectDir}/config/pmd.xml") - consoleOutput = true -} - -publishing { - publications { - mavenJava(MavenPublication) { - from components.java - groupId = project.group - artifactId = rootProject.name - - pom { - name = mavenName - description = mavenDescription - url = mavenUrl - licenses { - license { - name = mavenLicense - url = mavenLicenseUrl - } - } - developers { - developer { - id = 'ethauvin' - name = 'Erik C. Thauvin' - email = 'erik@thauvin.net' - url = 'https://erik.thauvin.net/' - } - } - scm { - connection = 'scm:git:' + mavenScmCon - developerConnection = 'scm:git:' + mavenScmDevCon - url = mavenUrl - } - } - } - } - repositories { - maven { - name = 'ossrh' - project.afterEvaluate { - url = project.version.contains('SNAPSHOT') - ? 'https://oss.sonatype.org/content/repositories/snapshots/' - : 'https://oss.sonatype.org/service/local/staging/deploy/maven2/' - } - credentials(PasswordCredentials) - } - } -} - -signing { - useGpgCmd() - sign publishing.publications.mavenJava -} - -javadoc { - doFirst { - title = "$mavenDescription $project.version API" - } - options.with { - source = '17' - tags = ['created'] - author = true - //addBooleanOption('html4', true) - links('https://docs.oracle.com/en/java/javase/17/docs/api/') - //addStringOption('Xdoclint:none', '-quiet') - } -} - -test { - testLogging { - exceptionFormat = 'full' - events('passed', 'skipped', 'failed') - } - - useTestNG() - - finalizedBy jacocoTestReport -} - -// spotbugs { -// toolVersion.set("${versions.spotbugs}") -// excludeFilter.set(file("$projectDir/config/spotbugs/excludeFilter.xml")) -// } - -// tasks.withType(SpotBugsTask).configureEach { -// reports { -// xml.required = false -// html.required = true -// } -// } - -tasks.register('release') { - group = 'Publishing' - description = 'Releases new version to local maven repository.' - dependsOn(wrapper, clean, publishToMavenLocal) - doFirst { - println "Version: $version" - } -} - -tasks.register('pandoc', Exec) { - group = 'Documentation' - def pandoc_args = ['--from', 'gfm', - '--to', 'html5', - '--metadata', "pagetitle=$mavenDescription", - '-s', - '-c', 'github-pandoc.css', - '-o', 'docs/README.html', - 'README.md'] - if (Os.isFamily(Os.FAMILY_WINDOWS)) { - commandLine(['cmd', '/c', 'pandoc'] + pandoc_args) - } else { - executable = 'pandoc' - args(pandoc_args) - } - standardOutput = new ByteArrayOutputStream() - ext.output = { - return standardOutput.toString() - } -} - -jacocoTestReport { - dependsOn test - reports { - xml.required = true - html.required = true - } -} - - -sonarqube { - properties { - property('sonar.organization', 'ethauvin-github') - property('sonar.projectKey', 'ethauvin_semver') - property('sonar.host.url', 'https://sonarcloud.io') - property('sonar.sourceEncoding', 'UTF-8') - } -} - -tasks.sonar { - dependsOn 'jacocoTestReport' -} diff --git a/config/pmd.xml b/config/pmd.xml index e23c3fa..add20da 100644 --- a/config/pmd.xml +++ b/config/pmd.xml @@ -25,7 +25,6 @@ - diff --git a/docs/README.html b/docs/README.html index 2eab8e6..8758e21 100644 --- a/docs/README.html +++ b/docs/README.html @@ -5,83 +5,135 @@ Semantic Version Annotation Processor - - - + + -

    Semantic Version Annotation Processor

    -

    License (3-Clause BSD) release Maven Central
    -Known Vulnerabilities Quality Gate Status Build Status Build status CircleCI

    -

    An annotation processor that automatically generates a GeneratedVersion class based on a Mustache template and containing the semantic version (major, minor, patch, etc.) that is read from a Properties file or defined in the annotation.

    -

    This processor was inspired by Cédric Beust's version-processor and works well in conjunction with the Semantic Version Plugin for Gradle.

    +

    Semantic Version +Annotation Processor

    +

    Java

    +

    +

    An annotation +processor that automatically generates a +GeneratedVersion class based on a Mustache template and containing +the semantic version (major, minor, +patch, etc.) that is read from a Properties +file or defined in the annotation.

    +

    This processor was inspired by Cédric Beust's version-processor +and works well in conjunction with the Semantic +Version Plugin for Gradle.

    Table of Contents