From effffd8e3b977594feb532e7f88719aee2162f69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Schalk=20W=2E=20Cronj=C3=A9?= Date: Fri, 29 Sep 2017 21:32:41 +0200 Subject: [PATCH 01/14] Upgradle to 4.2 --- build.gradle | 4 ++-- gradle/wrapper/gradle-wrapper.jar | Bin 51010 -> 53637 bytes gradle/wrapper/gradle-wrapper.properties | 4 ++-- gradlew | 10 +++------- 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/build.gradle b/build.gradle index 109f503..febb0e1 100644 --- a/build.gradle +++ b/build.gradle @@ -23,7 +23,7 @@ buildscript { } } dependencies { - classpath "com.gradle.publish:plugin-publish-plugin:0.9.0" + classpath "com.gradle.publish:plugin-publish-plugin:0.9.7" classpath 'org.ysb33r.gradle:gradletest:0.5.5' classpath 'gradle.plugin.nl.javadude.gradle.plugins:license-gradle-plugin:0.12.1' } @@ -37,7 +37,7 @@ apply plugin : 'org.ysb33r.gradletest' apply from: 'gradle/integration-tests.gradle' -version = '0.4' +version = '0.5-SNAPSHOT' group = 'org.ysb33r.gradle' sourceCompatibility = 1.6 targetCompatibility = 1.6 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 2322723c7ed5f591adfa4c87b6c51932f591249a..05ef575b0cd0173fc735f2857ce4bd594ce4f6bd 100644 GIT binary patch delta 25549 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 Aa{vGU delta 23039 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 V{l?)U6+o9S?H~gH>}r1h_&- +cd "`dirname \"$PRG\"`/" >/dev/null APP_HOME="`pwd -P`" -cd "$SAVED" >&- +cd "$SAVED" >/dev/null CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -114,6 +109,7 @@ fi if $cygwin ; 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` From 7c6a57b8d54c91309ff2fcb4ba9aea8377b8c089 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Schalk=20W=2E=20Cronj=C3=A9?= Date: Fri, 29 Sep 2017 21:37:38 +0200 Subject: [PATCH 02/14] Update buildscript to be modern 4.x --- build.gradle | 62 ++++++++++++---------------------------------------- 1 file changed, 14 insertions(+), 48 deletions(-) diff --git a/build.gradle b/build.gradle index febb0e1..e7a0326 100644 --- a/build.gradle +++ b/build.gradle @@ -14,26 +14,14 @@ // PLEASE NOTE: Integration Tests and Gradle Compatibility tests download a number of files. -buildscript { - repositories { - jcenter() - mavenLocal() - maven { - url "https://plugins.gradle.org/m2/" - } - } - dependencies { - classpath "com.gradle.publish:plugin-publish-plugin:0.9.7" - classpath 'org.ysb33r.gradle:gradletest:0.5.5' - classpath 'gradle.plugin.nl.javadude.gradle.plugins:license-gradle-plugin:0.12.1' - } -} -apply plugin : 'groovy' -apply plugin : 'maven' -apply plugin : 'com.gradle.plugin-publish' -apply plugin : 'com.github.hierynomus.license' -apply plugin : 'org.ysb33r.gradletest' +plugins { + id 'groovy' + id 'maven' + id 'com.gradle.plugin-publish' version '0.9.7' + id 'com.github.hierynomus.license' version '0.12.1' + id 'ort.ysb33r.gradletest' version '1.0' +} apply from: 'gradle/integration-tests.gradle' @@ -43,18 +31,6 @@ sourceCompatibility = 1.6 targetCompatibility = 1.6 -plugins.withType(JavaPlugin) { - - project.tasks.withType(JavaCompile) { task -> - task.sourceCompatibility = project.sourceCompatibility - task.targetCompatibility = project.targetCompatibility - } - - project.tasks.withType(GroovyCompile) { task -> - task.sourceCompatibility = project.sourceCompatibility - task.targetCompatibility = project.targetCompatibility - } -} repositories { jcenter() @@ -64,12 +40,9 @@ dependencies { compile gradleApi() compile localGroovy() - testCompile 'org.spockframework:spock-core:1.0-groovy-2.3', { + testCompile 'org.spockframework:spock-core:1.1-groovy-2.4', { exclude module : 'groovy-all' } - testCompile( 'com.athaydes:spock-reports:1.2.10' ) { - transitive = false // this avoids affecting your version of Groovy/Spock - } testCompile 'org.slf4j:slf4j-api:1.7.13' testCompile 'org.slf4j:slf4j-simple:1.7.13' } @@ -89,8 +62,8 @@ license { mapping { groovy ='DOUBLESLASH_STYLE' } - ext.year = '2013-2015' - excludes(['**/*.ad', '**/*.asciidoc', '**/*.adoc', '**/*.md','**/*.properties']) + ext.year = '2013-2017' + excludes(['**/*.ad', '**/*.asciidoc', '**/*.adoc', '**/*.md','**/*.properties','**/*CompatibilitySpec.groovy']) } pluginBundle { @@ -118,18 +91,11 @@ publishPlugins { onlyIf { !version.endsWith("SNAPSHOT") } } -gradleLocations { - downloadToGradleUserHome = true -} - gradleTest { - versions '2.0' - versions '2.2' - versions '2.3' - versions '2.4' - versions '2.8' - versions '2.10' - versions '2.12', '2.13-rc-1' + versions '2.0', '2.2', '2.4', '2.8', '2.10' + versions '2.12', '2.14.1' + versions '3.0', '3.1', '3.5' + versions '4.0', '4.1', '4.2' inputs.files jar inputs.dir file('gradleTest') From 2f77c7aed9d67d1c05cd7b2f167db2b14ef8edac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Schalk=20W=2E=20Cronj=C3=A9?= Date: Fri, 29 Sep 2017 21:46:01 +0200 Subject: [PATCH 03/14] Update license header files --- build.gradle | 2 +- .../gradle/ivypot/OfflineRepositorySyncIntegrationSpec.groovy | 2 +- src/main/groovy/org/ysb33r/gradle/ivypot/IvyXml.groovy | 2 +- .../org/ysb33r/gradle/ivypot/OfflineRepositoryPlugin.groovy | 2 +- .../org/ysb33r/gradle/ivypot/OfflineRepositorySync.groovy | 2 +- .../ysb33r/gradle/ivypot/internal/BaseRepositoryFactory.groovy | 2 +- .../groovy/org/ysb33r/gradle/ivypot/internal/Credentials.groovy | 2 +- .../org/ysb33r/gradle/ivypot/internal/IvyRepository.groovy | 2 +- .../groovy/org/ysb33r/gradle/ivypot/internal/JCenter.groovy | 2 +- .../org/ysb33r/gradle/ivypot/internal/MavenCentral.groovy | 2 +- .../groovy/org/ysb33r/gradle/ivypot/internal/MavenLocal.groovy | 2 +- .../org/ysb33r/gradle/ivypot/internal/MavenRepository.groovy | 2 +- .../ysb33r/gradle/ivypot/internal/PatternBasedResolver.groovy | 2 +- .../org/ysb33r/gradle/ivypot/internal/RepositoryTraits.groovy | 2 +- .../org/ysb33r/gradle/ivypot/OfflineRepositoryPluginSpec.groovy | 2 +- .../org/ysb33r/gradle/ivypot/OfflineRepositorySyncSpec.groovy | 2 +- .../gradle/ivypot/internal/PatternBasedResolverSpec.groovy | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/build.gradle b/build.gradle index e7a0326..c391bc7 100644 --- a/build.gradle +++ b/build.gradle @@ -20,7 +20,7 @@ plugins { id 'maven' id 'com.gradle.plugin-publish' version '0.9.7' id 'com.github.hierynomus.license' version '0.12.1' - id 'ort.ysb33r.gradletest' version '1.0' + id 'org.ysb33r.gradletest' version '1.0-beta12' } apply from: 'gradle/integration-tests.gradle' diff --git a/src/integrationTest/groovy/org/ysb33r/gradle/ivypot/OfflineRepositorySyncIntegrationSpec.groovy b/src/integrationTest/groovy/org/ysb33r/gradle/ivypot/OfflineRepositorySyncIntegrationSpec.groovy index eb6d70e..5b812f6 100644 --- a/src/integrationTest/groovy/org/ysb33r/gradle/ivypot/OfflineRepositorySyncIntegrationSpec.groovy +++ b/src/integrationTest/groovy/org/ysb33r/gradle/ivypot/OfflineRepositorySyncIntegrationSpec.groovy @@ -1,6 +1,6 @@ // // ============================================================================ -// (C) Copyright Schalk W. Cronje 2013-2015 +// (C) Copyright Schalk W. Cronje 2013-2017 // // This software is licensed under the Apache License 2.0 // See http://www.apache.org/licenses/LICENSE-2.0 for license details diff --git a/src/main/groovy/org/ysb33r/gradle/ivypot/IvyXml.groovy b/src/main/groovy/org/ysb33r/gradle/ivypot/IvyXml.groovy index 0b6cdf1..a9a6795 100644 --- a/src/main/groovy/org/ysb33r/gradle/ivypot/IvyXml.groovy +++ b/src/main/groovy/org/ysb33r/gradle/ivypot/IvyXml.groovy @@ -1,6 +1,6 @@ // // ============================================================================ -// (C) Copyright Schalk W. Cronje 2013-2015 +// (C) Copyright Schalk W. Cronje 2013-2017 // // This software is licensed under the Apache License 2.0 // See http://www.apache.org/licenses/LICENSE-2.0 for license details diff --git a/src/main/groovy/org/ysb33r/gradle/ivypot/OfflineRepositoryPlugin.groovy b/src/main/groovy/org/ysb33r/gradle/ivypot/OfflineRepositoryPlugin.groovy index 6597fdf..137d22d 100644 --- a/src/main/groovy/org/ysb33r/gradle/ivypot/OfflineRepositoryPlugin.groovy +++ b/src/main/groovy/org/ysb33r/gradle/ivypot/OfflineRepositoryPlugin.groovy @@ -1,6 +1,6 @@ // // ============================================================================ -// (C) Copyright Schalk W. Cronje 2013-2015 +// (C) Copyright Schalk W. Cronje 2013-2017 // // This software is licensed under the Apache License 2.0 // See http://www.apache.org/licenses/LICENSE-2.0 for license details diff --git a/src/main/groovy/org/ysb33r/gradle/ivypot/OfflineRepositorySync.groovy b/src/main/groovy/org/ysb33r/gradle/ivypot/OfflineRepositorySync.groovy index 4ecab74..22bbe92 100644 --- a/src/main/groovy/org/ysb33r/gradle/ivypot/OfflineRepositorySync.groovy +++ b/src/main/groovy/org/ysb33r/gradle/ivypot/OfflineRepositorySync.groovy @@ -1,6 +1,6 @@ // // ============================================================================ -// (C) Copyright Schalk W. Cronje 2013-2015 +// (C) Copyright Schalk W. Cronje 2013-2017 // // This software is licensed under the Apache License 2.0 // See http://www.apache.org/licenses/LICENSE-2.0 for license details diff --git a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/BaseRepositoryFactory.groovy b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/BaseRepositoryFactory.groovy index 7eab676..ad487ba 100644 --- a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/BaseRepositoryFactory.groovy +++ b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/BaseRepositoryFactory.groovy @@ -1,6 +1,6 @@ // // ============================================================================ -// (C) Copyright Schalk W. Cronje 2013-2015 +// (C) Copyright Schalk W. Cronje 2013-2017 // // This software is licensed under the Apache License 2.0 // See http://www.apache.org/licenses/LICENSE-2.0 for license details diff --git a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/Credentials.groovy b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/Credentials.groovy index 66cd843..3cc1756 100644 --- a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/Credentials.groovy +++ b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/Credentials.groovy @@ -1,6 +1,6 @@ // // ============================================================================ -// (C) Copyright Schalk W. Cronje 2013-2015 +// (C) Copyright Schalk W. Cronje 2013-2017 // // This software is licensed under the Apache License 2.0 // See http://www.apache.org/licenses/LICENSE-2.0 for license details diff --git a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/IvyRepository.groovy b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/IvyRepository.groovy index 4221015..f5c4a25 100644 --- a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/IvyRepository.groovy +++ b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/IvyRepository.groovy @@ -1,6 +1,6 @@ // // ============================================================================ -// (C) Copyright Schalk W. Cronje 2013-2015 +// (C) Copyright Schalk W. Cronje 2013-2017 // // This software is licensed under the Apache License 2.0 // See http://www.apache.org/licenses/LICENSE-2.0 for license details diff --git a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/JCenter.groovy b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/JCenter.groovy index f540c76..bea7849 100644 --- a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/JCenter.groovy +++ b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/JCenter.groovy @@ -1,6 +1,6 @@ // // ============================================================================ -// (C) Copyright Schalk W. Cronje 2013-2015 +// (C) Copyright Schalk W. Cronje 2013-2017 // // This software is licensed under the Apache License 2.0 // See http://www.apache.org/licenses/LICENSE-2.0 for license details diff --git a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/MavenCentral.groovy b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/MavenCentral.groovy index 54fcda5..d2c0240 100644 --- a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/MavenCentral.groovy +++ b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/MavenCentral.groovy @@ -1,6 +1,6 @@ // // ============================================================================ -// (C) Copyright Schalk W. Cronje 2013-2015 +// (C) Copyright Schalk W. Cronje 2013-2017 // // This software is licensed under the Apache License 2.0 // See http://www.apache.org/licenses/LICENSE-2.0 for license details diff --git a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/MavenLocal.groovy b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/MavenLocal.groovy index 57d4410..9e5e464 100644 --- a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/MavenLocal.groovy +++ b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/MavenLocal.groovy @@ -1,6 +1,6 @@ // // ============================================================================ -// (C) Copyright Schalk W. Cronje 2013-2015 +// (C) Copyright Schalk W. Cronje 2013-2017 // // This software is licensed under the Apache License 2.0 // See http://www.apache.org/licenses/LICENSE-2.0 for license details diff --git a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/MavenRepository.groovy b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/MavenRepository.groovy index 328d58c..c60f31b 100644 --- a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/MavenRepository.groovy +++ b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/MavenRepository.groovy @@ -1,6 +1,6 @@ // // ============================================================================ -// (C) Copyright Schalk W. Cronje 2013-2015 +// (C) Copyright Schalk W. Cronje 2013-2017 // // This software is licensed under the Apache License 2.0 // See http://www.apache.org/licenses/LICENSE-2.0 for license details diff --git a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/PatternBasedResolver.groovy b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/PatternBasedResolver.groovy index 8029cac..a610c50 100644 --- a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/PatternBasedResolver.groovy +++ b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/PatternBasedResolver.groovy @@ -1,6 +1,6 @@ // // ============================================================================ -// (C) Copyright Schalk W. Cronje 2013-2015 +// (C) Copyright Schalk W. Cronje 2013-2017 // // This software is licensed under the Apache License 2.0 // See http://www.apache.org/licenses/LICENSE-2.0 for license details diff --git a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/RepositoryTraits.groovy b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/RepositoryTraits.groovy index d960c0a..2597dba 100644 --- a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/RepositoryTraits.groovy +++ b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/RepositoryTraits.groovy @@ -1,6 +1,6 @@ // // ============================================================================ -// (C) Copyright Schalk W. Cronje 2013-2015 +// (C) Copyright Schalk W. Cronje 2013-2017 // // This software is licensed under the Apache License 2.0 // See http://www.apache.org/licenses/LICENSE-2.0 for license details diff --git a/src/test/groovy/org/ysb33r/gradle/ivypot/OfflineRepositoryPluginSpec.groovy b/src/test/groovy/org/ysb33r/gradle/ivypot/OfflineRepositoryPluginSpec.groovy index bd7b81b..d7a2a97 100644 --- a/src/test/groovy/org/ysb33r/gradle/ivypot/OfflineRepositoryPluginSpec.groovy +++ b/src/test/groovy/org/ysb33r/gradle/ivypot/OfflineRepositoryPluginSpec.groovy @@ -1,6 +1,6 @@ // // ============================================================================ -// (C) Copyright Schalk W. Cronje 2013-2015 +// (C) Copyright Schalk W. Cronje 2013-2017 // // This software is licensed under the Apache License 2.0 // See http://www.apache.org/licenses/LICENSE-2.0 for license details diff --git a/src/test/groovy/org/ysb33r/gradle/ivypot/OfflineRepositorySyncSpec.groovy b/src/test/groovy/org/ysb33r/gradle/ivypot/OfflineRepositorySyncSpec.groovy index 778c104..39c3694 100644 --- a/src/test/groovy/org/ysb33r/gradle/ivypot/OfflineRepositorySyncSpec.groovy +++ b/src/test/groovy/org/ysb33r/gradle/ivypot/OfflineRepositorySyncSpec.groovy @@ -1,6 +1,6 @@ // // ============================================================================ -// (C) Copyright Schalk W. Cronje 2013-2015 +// (C) Copyright Schalk W. Cronje 2013-2017 // // This software is licensed under the Apache License 2.0 // See http://www.apache.org/licenses/LICENSE-2.0 for license details diff --git a/src/test/groovy/org/ysb33r/gradle/ivypot/internal/PatternBasedResolverSpec.groovy b/src/test/groovy/org/ysb33r/gradle/ivypot/internal/PatternBasedResolverSpec.groovy index 8966ca1..8740fa9 100644 --- a/src/test/groovy/org/ysb33r/gradle/ivypot/internal/PatternBasedResolverSpec.groovy +++ b/src/test/groovy/org/ysb33r/gradle/ivypot/internal/PatternBasedResolverSpec.groovy @@ -1,6 +1,6 @@ // // ============================================================================ -// (C) Copyright Schalk W. Cronje 2013-2015 +// (C) Copyright Schalk W. Cronje 2013-2017 // // This software is licensed under the Apache License 2.0 // See http://www.apache.org/licenses/LICENSE-2.0 for license details From bfeb8443fe69d60508fa1401ec79f9306c118eb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Schalk=20W=2E=20Cronj=C3=A9?= Date: Fri, 29 Sep 2017 21:54:43 +0200 Subject: [PATCH 04/14] Remove deprecation warning related to multiple output directories --- gradle/integration-tests.gradle | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gradle/integration-tests.gradle b/gradle/integration-tests.gradle index 21943c7..2d75b78 100644 --- a/gradle/integration-tests.gradle +++ b/gradle/integration-tests.gradle @@ -12,16 +12,16 @@ configurations { sourceSets { integrationTest { - java.srcDir file("src/integTest/java") - groovy.srcDir file("src/integTest/groovy") - resources.srcDir file("src/integTest/resources") + java.srcDir file('src/integTest/java') + groovy.srcDir file('src/integTest/groovy') + resources.srcDir file('src/integTest/resources') compileClasspath = sourceSets.main.output + configurations.integrationTestCompile runtimeClasspath = output + compileClasspath + configurations.integrationTestRuntime } } task integrationTest(type: Test, dependsOn: jar) { - testClassesDir = sourceSets.integrationTest.output.classesDir + testClassesDirs = sourceSets.integrationTest.output.classesDirs classpath = sourceSets.integrationTest.runtimeClasspath mustRunAfter test } From 25f79f207e07c360d07ebb7160d6776410165df6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Schalk=20W=2E=20Cronj=C3=A9?= Date: Fri, 29 Sep 2017 21:55:41 +0200 Subject: [PATCH 05/14] Implement new GoogleRepository method, but always thrown an exception (#22) --- .../gradle/ivypot/internal/BaseRepositoryFactory.groovy | 5 +++++ .../gradle/ivypot/internal/PatternBasedResolver.groovy | 1 - 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/BaseRepositoryFactory.groovy b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/BaseRepositoryFactory.groovy index ad487ba..e40fde5 100644 --- a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/BaseRepositoryFactory.groovy +++ b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/BaseRepositoryFactory.groovy @@ -14,6 +14,7 @@ package org.ysb33r.gradle.ivypot.internal +import org.gradle.api.GradleException import org.gradle.api.artifacts.repositories.FlatDirectoryArtifactRepository import org.gradle.api.artifacts.repositories.IvyArtifactRepository import org.gradle.api.artifacts.repositories.MavenArtifactRepository @@ -32,6 +33,10 @@ class BaseRepositoryFactory implements org.gradle.api.internal.artifacts.BaseRep new MavenCentral() } + MavenArtifactRepository createGoogleRepository() { + throw new GradleException('Google repositories are not supported as yet. Register your interest at https://github.com/ysb33r/ivypot-gradle-plugin/issues/22') + } + @Override MavenArtifactRepository createMavenRepository() { new MavenRepository() diff --git a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/PatternBasedResolver.groovy b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/PatternBasedResolver.groovy index a610c50..3ccd363 100644 --- a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/PatternBasedResolver.groovy +++ b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/PatternBasedResolver.groovy @@ -14,7 +14,6 @@ package org.ysb33r.gradle.ivypot.internal -import org.apache.commons.lang.NotImplementedException import org.gradle.api.internal.artifacts.repositories.resolver.IvyResourcePattern import org.gradle.api.internal.artifacts.repositories.resolver.M2ResourcePattern import org.gradle.api.internal.artifacts.repositories.resolver.ResourcePattern From 9badda84478f5e0e2f7f924065b3ef0884cee0f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Schalk=20W=2E=20Cronj=C3=A9?= Date: Sat, 30 Sep 2017 11:01:41 +0200 Subject: [PATCH 06/14] Make plugin work with Gradle 4.2 (#20) --- README.adoc | 29 +++++--- build.gradle | 5 +- .../ivypot/internal/IvyRepository.groovy | 55 ++++++++++++-- .../ivypot/internal/MavenRepository.groovy | 14 ++++ .../ivypot/internal/RepositoryTraits.groovy | 74 ++++++++++++++++++- 5 files changed, 152 insertions(+), 25 deletions(-) diff --git a/README.adoc b/README.adoc index a59b20f..dbbb66b 100644 --- a/README.adoc +++ b/README.adoc @@ -1,4 +1,5 @@ = IvyPot - A Gradle plugin for Off-line Repositories +:revnumber: 0.5 Not all development teams have the luxury of relying on Maven Central, Bintray for day to day development. Some of them are still fortunate to proxy public repositories via in-house Artifactory or Nexus instances. Others have even more @@ -6,6 +7,8 @@ strict requirements including the ability to be able to build an isolated enviro for pubic dependencies, including transitive dependencies, to be downloaded in a controlled manner and the internal security processes to be applied to the binary files before committing them to an internal storage area. +As from 0.5 the minimum supported Gradle version in 2.8. + == Previous versions * https://github.com/ysb33r/ivypot-gradle-plugin/tree/RELEASE_0_3_7[Release 0.3.7] @@ -17,7 +20,18 @@ security processes to be applied to the binary files before committing them to a == Adding the plugin -[source,groovy] +.build.gradle +[source,groovy,subs="+attributes"] +---- +plugins { + id 'org.ysb33r.ivypot' version '{revnumber}' +} +---- + +Or for special cases you might want to do + +.build.gradle +[source,groovy,subs="+attributes"] ---- buildscript { repositories { @@ -26,16 +40,14 @@ buildscript { } } dependencies { - classpath 'org.ysb33r.gradle:ivypot:0.3.2' + classpath 'org.ysb33r.gradle:ivypot:{revnumber}' } } apply plugin : 'org.ysb33r.ivypot' ---- -or if you use Gradle 2.1+ - -If you are in a restricted environment, you might want to use approach number #1 and conditionally add the remote reference +If you are in a restricted environment, you might want to use the second approach and conditionally add the remote reference to work only when you are in a non-restricted environment. i.e. [source,groovy] @@ -49,12 +61,7 @@ to work only when you are in a non-restricted environment. i.e. } ---- -[source,groovy] ----- -plugins { - id 'org.ysb33r.ivypot' version '0.4' -} ----- +You might also consider using link:https://docs.gradle.org/current/userguide/plugins.html#customPluginRepositories[pluginManagement] in `settings.gradle` for this case. == Defining Remote Repositories diff --git a/build.gradle b/build.gradle index c391bc7..3341629 100644 --- a/build.gradle +++ b/build.gradle @@ -20,7 +20,7 @@ plugins { id 'maven' id 'com.gradle.plugin-publish' version '0.9.7' id 'com.github.hierynomus.license' version '0.12.1' - id 'org.ysb33r.gradletest' version '1.0-beta12' + id 'org.ysb33r.gradletest' version '1.0' } apply from: 'gradle/integration-tests.gradle' @@ -37,6 +37,7 @@ repositories { } dependencies { + compile 'org.ysb33r.gradle:grolifant:0.3' compile gradleApi() compile localGroovy() @@ -92,7 +93,7 @@ publishPlugins { } gradleTest { - versions '2.0', '2.2', '2.4', '2.8', '2.10' + versions '2.8', '2.10' versions '2.12', '2.14.1' versions '3.0', '3.1', '3.5' versions '4.0', '4.1', '4.2' diff --git a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/IvyRepository.groovy b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/IvyRepository.groovy index f5c4a25..cc87b41 100644 --- a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/IvyRepository.groovy +++ b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/IvyRepository.groovy @@ -14,14 +14,23 @@ package org.ysb33r.gradle.ivypot.internal +import groovy.transform.CompileDynamic +import groovy.transform.CompileStatic import groovy.transform.TypeChecked +import org.gradle.api.Action +import org.gradle.api.ActionConfiguration +import org.gradle.api.GradleException +import org.gradle.api.artifacts.ComponentMetadataSupplier +import org.gradle.api.artifacts.repositories.AuthenticationContainer import org.gradle.api.artifacts.repositories.IvyArtifactRepository import org.gradle.api.artifacts.repositories.IvyArtifactRepositoryMetaDataProvider +import org.gradle.api.artifacts.repositories.PasswordCredentials +import org.gradle.api.artifacts.repositories.RepositoryLayout import org.ysb33r.gradle.ivypot.IvyXml /** - * @author Schalk W. Cronjé */ +@CompileStatic class IvyRepository implements IvyArtifactRepository, IvyXml, RepositoryTraits { String artifactPattern @@ -41,7 +50,7 @@ class IvyRepository implements IvyArtifactRepository, IvyXml, RepositoryTraits { */ @Override void artifactPattern(String pattern) { - this.artifactPattern += pattern + this.artifactPattern+= pattern } /** @@ -66,7 +75,6 @@ class IvyRepository implements IvyArtifactRepository, IvyXml, RepositoryTraits { * @param layoutName The name of the layout to use. */ @Override - @TypeChecked void layout(final String layoutName) { final String namespace = 'org.gradle.api.internal.artifacts.repositories.layout.' String repositoryLayoutName @@ -93,7 +101,7 @@ class IvyRepository implements IvyArtifactRepository, IvyXml, RepositoryTraits { } } - repositoryLayout = layoutClass.newInstance() + setLayoutClass(layoutClass) } /** @@ -146,11 +154,23 @@ class IvyRepository implements IvyArtifactRepository, IvyXml, RepositoryTraits { @Override void layout(String layoutName, Closure config) { layout(layoutName) - def cfg = config.clone() + Closure cfg = (Closure)(config.clone()) cfg.delegate = repositoryLayout cfg() } + /** Specifies how the items of the repository are organized. + * + * @param layoutName The name of the layout to use. + * @param action The action used to configure the layout. Takes a {@code RepositoryLayout} as parameter. + * + * @since 0.5 + */ + void layout(String layoutName, Action action) { + layout(layoutName) + action.execute(repositoryLayout) + } + /** * Returns the meta-data provider used when resolving artifacts from this repository. The provider is responsible for locating and interpreting the meta-data * for the modules and artifacts contained in this repository. Using this provider, you can fine tune how this resolution happens. @@ -173,8 +193,8 @@ class IvyRepository implements IvyArtifactRepository, IvyXml, RepositoryTraits { throw new UnsupportedOperationException('layout has not seen set for Ivy repository') } - def patterns = new PatternBasedResolver() - repositoryLayout.apply(url, patterns) + PatternBasedResolver patterns = new PatternBasedResolver() + applyPatterns(patterns) String ret = "" patterns.ivyPatterns.each { @@ -186,5 +206,24 @@ class IvyRepository implements IvyArtifactRepository, IvyXml, RepositoryTraits { ret += '' } - private def repositoryLayout + void setMetadataSupplier(Class aClass) { + throw new GradleException("Metadata is not implemented. If this is a requirement for your use case then register your interest at https://github.com/ysb33r/ivypot-gradle-plugin/issues/23") + } + + void setMetadataSupplier(Class aClass, Action action) { + throw new GradleException("Metadata is not implemented. If this is a requirement for your use case then register your interest at https://github.com/ysb33r/ivypot-gradle-plugin/issues/23") + } + + @CompileDynamic + private void applyPatterns(final PatternBasedResolver patterns) { + repositoryLayout.apply(url, patterns) + } + + @CompileDynamic + private void setLayoutClass(Class layoutClass) { + repositoryLayout = layoutClass.newInstance() + } + + private RepositoryLayout repositoryLayout + } diff --git a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/MavenRepository.groovy b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/MavenRepository.groovy index c60f31b..eb84f87 100644 --- a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/MavenRepository.groovy +++ b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/MavenRepository.groovy @@ -52,6 +52,20 @@ class MavenRepository implements MavenArtifactRepository, IvyXml, RepositoryTrai artifactUrls.addAll(urls as List) } + /** + * Sets the additional URLs to use to find artifact files. Note that these URLs are not used to find POM files. + * + *

The provided values are evaluated as per {@link org.gradle.api.Project#uri(Object)}. This means, for example, you can pass in a {@code File} object, or a relative path to be evaluated + * relative to the project directory. + * + * @param urls The URLs. + */ + @Override + void setArtifactUrls(Set urls) { + artifactUrls.clear() + artifactUrls.addAll(urls) + } + /** * Sets the additional URLs to use to find artifact files. Note that these URLs are not used to find POM files. * diff --git a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/RepositoryTraits.groovy b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/RepositoryTraits.groovy index 2597dba..192d33b 100644 --- a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/RepositoryTraits.groovy +++ b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/RepositoryTraits.groovy @@ -15,11 +15,17 @@ package org.ysb33r.gradle.ivypot.internal import groovy.transform.CompileDynamic +import groovy.transform.CompileStatic +import org.gradle.api.Action +import org.gradle.api.GradleException +import org.gradle.api.artifacts.repositories.AuthenticationContainer import org.gradle.api.artifacts.repositories.PasswordCredentials +import org.ysb33r.gradle.olifant.UriUtils /** - * @author Schalk W. Cronjé + * */ +@CompileStatic trait RepositoryTraits { /** * The base URL of this repository. This URL is used to find both POMs and artifact files. You can add additional URLs to use to look for artifact files, such as jars, using {@link @@ -28,7 +34,7 @@ trait RepositoryTraits { * @return The URL. */ URI getUrl() { - this.url.toString().toURI() + UriUtils.urize(this.url) } /** @@ -44,6 +50,21 @@ trait RepositoryTraits { this.url = url_ } + /** + * Sets the base URL of this repository. This URL is used to find both POMs and artifact files. You can add additional URLs to use to look for artifact files, such as jars, using {@link + * # setArtifactUrls ( Iterable )}. + * + *

The provided value is evaluated as per {@link org.gradle.api.Project#uri(Object)}. This means, for example, you can pass in a {@code File} object, or a relative path to be evaluated relative + * to the project directory. + * + * @param uri The base URI. + * + * @since 0.5 + */ + void setUrl(URI uri_) { + this.url = uri_ + } + /** * Sets the base URL of this repository. This URL is used to find both POMs and artifact files. You can add additional URLs to use to look for artifact files, such as jars, using {@link * # setArtifactUrls ( Iterable )}. @@ -79,13 +100,49 @@ trait RepositoryTraits { * } * @endcode */ - @CompileDynamic void credentials(Closure closure) { - def cfg = closure.clone() + Closure cfg = (Closure)(closure.clone()) cfg.delegate = this.credentials cfg() } + /** Configure the credientials for this repository using the supplied action. + * + * @param action + * + * @since 0.5 + */ + void credentials(Action action) { + action.execute(this.credentials) + } + + /** Access to the credentials class that is in use. + * + * @param aClass + * @return + * + * @since 0.5 + */ + def T getCredentials(Class aClass) { + if (this.credentials instanceof T) { + return (T)(this.credentials) + } else { + throw new IllegalArgumentException("${Credentials.class.name} cannot be converted to ${aClass.name}") + } + } + + /** + * + * @param aClass + * @param action + * + * @since 0.5 + */ + def void credentials(Class aClass, Action action) { + T creds = getCredentials(aClass) + action.execute(creds) + } + /** * Returns the name for this repository. A name must be unique amongst a repository set. A default name is provided for the repository if none * is provided. @@ -112,6 +169,15 @@ trait RepositoryTraits { this.name = name } + void authentication(Action action) { + throw new GradleException("Authentication containers are not implemented. If this is a requirement for your use case then register your interest at https://github.com/ysb33r/ivypot-gradle-plugin/issues/24") + } + + AuthenticationContainer getAuthentication() { + throw new GradleException("Authentication containers are not implemented. If this is a requirement for your use case then register your interest at https://github.com/ysb33r/ivypot-gradle-plugin/issues/24") + } + + private String name private Object url private Credentials credentials = new Credentials() From c149d064570d13e0313f1563817af6fdb9afd35a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Schalk=20W=2E=20Cronj=C3=A9?= Date: Sat, 30 Sep 2017 11:36:29 +0200 Subject: [PATCH 07/14] Adjust the way Ivy JAR is found for unittests (#20) Adjust the way Ivy JAR is found for unittests (#20) --- build.gradle | 20 ++++++++++++++++++- .../ivypot/OfflineRepositorySync.groovy | 3 +-- .../ivypot/OfflineRepositoryPluginSpec.groovy | 2 +- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 3341629..f82cb18 100644 --- a/build.gradle +++ b/build.gradle @@ -30,8 +30,20 @@ group = 'org.ysb33r.gradle' sourceCompatibility = 1.6 targetCompatibility = 1.6 +ext { + groovyLongVer = GroovySystem.version + groovyShortVer = GroovySystem.version.replaceAll(/\.\d+$/,'') + ivyJar = fileTree("${gradle.gradleHomeDir}/lib/plugins") { + include 'ivy*.jar' + } +} +task foo { + doLast { + println ivyJar.files + } +} repositories { jcenter() } @@ -41,11 +53,17 @@ dependencies { compile gradleApi() compile localGroovy() - testCompile 'org.spockframework:spock-core:1.1-groovy-2.4', { + testCompile "org.spockframework:spock-core:1.1-groovy-${groovyShortVer}", { exclude module : 'groovy-all' } testCompile 'org.slf4j:slf4j-api:1.7.13' testCompile 'org.slf4j:slf4j-simple:1.7.13' + + testRuntime ivyJar +} + +test { + systemProperties DONT_LOOK_FOR_IVY_JAR : 1 } integrationTest { diff --git a/src/main/groovy/org/ysb33r/gradle/ivypot/OfflineRepositorySync.groovy b/src/main/groovy/org/ysb33r/gradle/ivypot/OfflineRepositorySync.groovy index 22bbe92..05d7e90 100644 --- a/src/main/groovy/org/ysb33r/gradle/ivypot/OfflineRepositorySync.groovy +++ b/src/main/groovy/org/ysb33r/gradle/ivypot/OfflineRepositorySync.groovy @@ -335,6 +335,5 @@ class OfflineRepositorySync extends DefaultTask { new DefaultRepositoryHandler(new BaseRepositoryFactory(), instantiator) } - @PackageScope - static boolean DONT_LOOK_FOR_IVY_JAR = false + static private boolean DONT_LOOK_FOR_IVY_JAR = System.getProperty('DONT_LOOK_FOR_IVY_JAR') } diff --git a/src/test/groovy/org/ysb33r/gradle/ivypot/OfflineRepositoryPluginSpec.groovy b/src/test/groovy/org/ysb33r/gradle/ivypot/OfflineRepositoryPluginSpec.groovy index d7a2a97..b1cfbd1 100644 --- a/src/test/groovy/org/ysb33r/gradle/ivypot/OfflineRepositoryPluginSpec.groovy +++ b/src/test/groovy/org/ysb33r/gradle/ivypot/OfflineRepositoryPluginSpec.groovy @@ -24,7 +24,7 @@ import spock.lang.Specification class OfflineRepositoryPluginSpec extends Specification { void setupSpec() { - OfflineRepositorySync.DONT_LOOK_FOR_IVY_JAR = true +// OfflineRepositorySync.DONT_LOOK_FOR_IVY_JAR = true } def "Can the plugin be applied"() { From b39193faf4079fec5cfaf073bab7df66b12f4521 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Schalk=20W=2E=20Cronj=C3=A9?= Date: Sat, 30 Sep 2017 11:38:55 +0200 Subject: [PATCH 08/14] Throw exception if Gradle version is too old (#20) --- .../ysb33r/gradle/ivypot/OfflineRepositoryPlugin.groovy | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/groovy/org/ysb33r/gradle/ivypot/OfflineRepositoryPlugin.groovy b/src/main/groovy/org/ysb33r/gradle/ivypot/OfflineRepositoryPlugin.groovy index 137d22d..a78fb08 100644 --- a/src/main/groovy/org/ysb33r/gradle/ivypot/OfflineRepositoryPlugin.groovy +++ b/src/main/groovy/org/ysb33r/gradle/ivypot/OfflineRepositoryPlugin.groovy @@ -14,14 +14,23 @@ package org.ysb33r.gradle.ivypot +import org.gradle.api.GradleException import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.util.GradleVersion /** * @author Schalk W. Cronjé */ class OfflineRepositoryPlugin implements Plugin { + + final static String MINIMUM_GRADLE = '2.8' + void apply(Project project) { + + if(GradleVersion.current() < GradleVersion.version(MINIMUM_GRADLE)) { + throw new GradleException("Ivypot can only be used with Gradle ${MINIMUM_GRADLE} or later") + } project.tasks.create 'syncRemoteRepositories', OfflineRepositorySync } } From de883c6ef187f22473d26f21529719a2a4d4e57c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Schalk=20W=2E=20Cronj=C3=A9?= Date: Sat, 30 Sep 2017 12:05:56 +0200 Subject: [PATCH 09/14] CHANGELOG updated (#20) --- CHANGELOG.adoc | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 8d2a941..0815448 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -1,34 +1,49 @@ = CHANGELOG +:issue: link:https://github.com/ysb33r/ivypot-gradle-plugin/issues/ -== 0.4 - Roadmap +== 0.5 - Roadmap -* https://github.com/ysb33r/ivypot-gradle-plugin/issues/12[Issue #12] - Make default layout 'gradle'. +=== Bugs + +* {issue}28[#28] - Unable to create task extending org.ysb33r.gradle.ivypot.OfflineRepositorySync + +=== Breaking changes + +* Minimum supported version is Gradle 2.8 + +=== Compatibility + +* Gradle compatibility tested 2.8 - 4.2 + +== 0.4 + +* {issue}12[#12] - Make default layout 'gradle'. == 0.3.7 -* https://github.com/ysb33r/ivypot-gradle-plugin/issues/10[Issue #11] - Patterns for writing artifacts is now configurable. +* {issue}11[#11] - Patterns for writing artifacts is now configurable. == 0.3.6 -* https://github.com/ysb33r/ivypot-gradle-plugin/issues/10[Issue #10] - Fixes issues that was suppose to be fixed by https://github.com/ysb33r/ivypot-gradle-plugin/issues/8[Issue #9]. +* {issue}10[#10] - Fixes issues that was suppose to be fixed by {issue}9[#9]. * Compatibility check up to Gradle 2.11 == 0.3.5 -* https://github.com/ysb33r/ivypot-gradle-plugin/issues/8[Issue #9] - Cannot use pattern-based Ivy Resolver since Gradle 2.3. +* {issue}9[#9] - Cannot use pattern-based Ivy Resolver since Gradle 2.3. == 0.3.4 -* https://github.com/ysb33r/ivypot-gradle-plugin/issues/8[Issue #8] - Transitive dependencies are not copied to local repository. +* {issue}8[#8] - Transitive dependencies are not copied to local repository. == 0.3.3 (Avoid this release) -* https://github.com/ysb33r/ivypot-gradle-plugin/issues/7[Issue #7] - When using two `OfflineRepositorySync` tasks, the build fails. +* {issue}7[#7] - When using two `OfflineRepositorySync` tasks, the build fails. == 0.3.2 -* https://github.com/ysb33r/ivypot-gradle-plugin/issues/5[Issue #5] - Don't mix cache data with artifacts. -* https://github.com/ysb33r/ivypot-gradle-plugin/issues/6[Issue #6] - Specifying ivy repositories with only a URL does not work. +* {issue}5[#5] - Don't mix cache data with artifacts. +* {issue}6[#6] - Specifying ivy repositories with only a URL does not work. == 0.3.1 From df6b2ad127a8aa4c85103509ce8450088461c81e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Schalk=20W=2E=20Cronj=C3=A9?= Date: Sat, 30 Sep 2017 12:06:38 +0200 Subject: [PATCH 10/14] Update compatibility test to deal with enhanced GradleTest syntax (#20) --- build.gradle | 4 ++++ src/gradleTest/basicTest/build.gradle | 6 ------ 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index f82cb18..be86bca 100644 --- a/build.gradle +++ b/build.gradle @@ -118,4 +118,8 @@ gradleTest { inputs.files jar inputs.dir file('gradleTest') + + beforeTest { + println " ${it.name}" + } } diff --git a/src/gradleTest/basicTest/build.gradle b/src/gradleTest/basicTest/build.gradle index 327f29e..90ef09b 100644 --- a/src/gradleTest/basicTest/build.gradle +++ b/src/gradleTest/basicTest/build.gradle @@ -1,9 +1,3 @@ -buildscript { - dependencies { - classpath 'org.ysb33r.gradle:ivypot:%%VERSION%%' - } -} - apply plugin : 'org.ysb33r.ivypot' configurations { From d6294e6cfb3e9e9f85a51d2d06eaaa3f605b3505 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Schalk=20W=2E=20Cronj=C3=A9?= Date: Sat, 30 Sep 2017 12:09:34 +0200 Subject: [PATCH 11/14] Added a release task --- build.gradle | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/build.gradle b/build.gradle index be86bca..82d15ff 100644 --- a/build.gradle +++ b/build.gradle @@ -107,7 +107,9 @@ pluginBundle { } publishPlugins { + group 'release' onlyIf { !version.endsWith("SNAPSHOT") } + mustRunAfter build } gradleTest { @@ -123,3 +125,9 @@ gradleTest { println " ${it.name}" } } + +task release { + group 'release' + description 'Life-cycle task for relasing the plugin' + dependsOn build publishPlugins +} \ No newline at end of file From 5bb0f147d6065f0f1998e8b1b6b0bd29faf416ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Schalk=20W=2E=20Cronj=C3=A9?= Date: Sat, 30 Sep 2017 12:15:21 +0200 Subject: [PATCH 12/14] Maintenance fix to CI builds --- .travis.yml | 14 ++++---------- appveyor.yml | 6 ++---- build.gradle | 6 +++--- 3 files changed, 9 insertions(+), 17 deletions(-) diff --git a/.travis.yml b/.travis.yml index f7ddeb1..e05e64d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,22 +1,16 @@ language: groovy -install: - - ./gradlew -S clean --info +sudo: true + +install: true script: - - ./gradlew -S build gradleTest --info + - ./gradlew -S clean build --console=plain --info jdk: - - oraclejdk7 - oraclejdk8 - - openjdk7 - - openjdk6 os: - linux -env: - - TERM=dumb - -#after_success: ./gradlew coveralls -PbintrayUser= -PbintrayApiKey diff --git a/appveyor.yml b/appveyor.yml index 6bd0eb7..6d9e573 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -4,10 +4,10 @@ build: verbosity: detailed build_script: - - gradlew.bat -PTRAVIS_CI=1 assemble --info --no-daemon -PbintrayUserName -PbintrayApiKey + - gradlew.bat assemble --info --no-daemon test_script: - - gradlew.bat check gradleTest -PTRAVIS_CI=1 --info --no-daemon -PbintrayUserName -PbintrayApiKey + - gradlew.bat build --info --no-daemon branches: only: @@ -17,9 +17,7 @@ branches: environment: matrix: - - JAVA_HOME: C:\Program Files\Java\jdk1.7.0 - JAVA_HOME: C:\Program Files\Java\jdk1.8.0 - - JAVA_HOME: C:\Program Files (x86)\Java\jdk1.7.0 - JAVA_HOME: C:\Program Files (x86)\Java\jdk1.8.0 matrix: diff --git a/build.gradle b/build.gradle index 82d15ff..cb9b5fb 100644 --- a/build.gradle +++ b/build.gradle @@ -25,7 +25,7 @@ plugins { apply from: 'gradle/integration-tests.gradle' -version = '0.5-SNAPSHOT' +version = '0.5' group = 'org.ysb33r.gradle' sourceCompatibility = 1.6 targetCompatibility = 1.6 @@ -129,5 +129,5 @@ gradleTest { task release { group 'release' description 'Life-cycle task for relasing the plugin' - dependsOn build publishPlugins -} \ No newline at end of file + dependsOn build, publishPlugins +} From 45f79a092adaa8f022903c67a8db4188342a970a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Schalk=20W=2E=20Cronj=C3=A9?= Date: Sat, 30 Sep 2017 12:25:44 +0200 Subject: [PATCH 13/14] Add 0.4.0 link --- README.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/README.adoc b/README.adoc index dbbb66b..3ff3998 100644 --- a/README.adoc +++ b/README.adoc @@ -11,6 +11,7 @@ As from 0.5 the minimum supported Gradle version in 2.8. == Previous versions +* https://github.com/ysb33r/ivypot-gradle-plugin/tree/RELEASE_0_4_0[Release 0.4.0] * https://github.com/ysb33r/ivypot-gradle-plugin/tree/RELEASE_0_3_7[Release 0.3.7] * https://github.com/ysb33r/ivypot-gradle-plugin/tree/RELEASE_0_3_6[Release 0.3.6] * https://github.com/ysb33r/ivypot-gradle-plugin/tree/RELEASE_0_3_5[Release 0.3.5] From e3bc0512f99653d3c2a3d99e48f2c0f10dc03ebb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Schalk=20W=2E=20Cronj=C3=A9?= Date: Sat, 30 Sep 2017 12:48:38 +0200 Subject: [PATCH 14/14] Revert to build with Gradle 3.5 as it give us compatibily 2.8-4.2 (#20) --- gradle/integration-tests.gradle | 6 +++++- gradle/wrapper/gradle-wrapper.properties | 2 +- .../ivypot/internal/IvyRepository.groovy | 20 +++++++------------ .../ivypot/internal/MavenRepository.groovy | 2 +- 4 files changed, 14 insertions(+), 16 deletions(-) diff --git a/gradle/integration-tests.gradle b/gradle/integration-tests.gradle index 2d75b78..37e560d 100644 --- a/gradle/integration-tests.gradle +++ b/gradle/integration-tests.gradle @@ -21,7 +21,11 @@ sourceSets { } task integrationTest(type: Test, dependsOn: jar) { - testClassesDirs = sourceSets.integrationTest.output.classesDirs + if(GradleVersion.current() < GradleVersion.version('4.0')) { + testClassesDir = sourceSets.integrationTest.output.classesDir + } else { + testClassesDirs = sourceSets.integrationTest.output.classesDirs + } classpath = sourceSets.integrationTest.runtimeClasspath mustRunAfter test } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 7a099b0..86c6b99 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-bin.zip diff --git a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/IvyRepository.groovy b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/IvyRepository.groovy index cc87b41..b292bc1 100644 --- a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/IvyRepository.groovy +++ b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/IvyRepository.groovy @@ -16,15 +16,9 @@ package org.ysb33r.gradle.ivypot.internal import groovy.transform.CompileDynamic import groovy.transform.CompileStatic -import groovy.transform.TypeChecked import org.gradle.api.Action -import org.gradle.api.ActionConfiguration -import org.gradle.api.GradleException -import org.gradle.api.artifacts.ComponentMetadataSupplier -import org.gradle.api.artifacts.repositories.AuthenticationContainer import org.gradle.api.artifacts.repositories.IvyArtifactRepository import org.gradle.api.artifacts.repositories.IvyArtifactRepositoryMetaDataProvider -import org.gradle.api.artifacts.repositories.PasswordCredentials import org.gradle.api.artifacts.repositories.RepositoryLayout import org.ysb33r.gradle.ivypot.IvyXml @@ -206,13 +200,13 @@ class IvyRepository implements IvyArtifactRepository, IvyXml, RepositoryTraits { ret += '' } - void setMetadataSupplier(Class aClass) { - throw new GradleException("Metadata is not implemented. If this is a requirement for your use case then register your interest at https://github.com/ysb33r/ivypot-gradle-plugin/issues/23") - } - - void setMetadataSupplier(Class aClass, Action action) { - throw new GradleException("Metadata is not implemented. If this is a requirement for your use case then register your interest at https://github.com/ysb33r/ivypot-gradle-plugin/issues/23") - } +// void setMetadataSupplier(Class aClass) { +// throw new GradleException("Metadata is not implemented. If this is a requirement for your use case then register your interest at https://github.com/ysb33r/ivypot-gradle-plugin/issues/23") +// } +// +// void setMetadataSupplier(Class aClass, Action action) { +// throw new GradleException("Metadata is not implemented. If this is a requirement for your use case then register your interest at https://github.com/ysb33r/ivypot-gradle-plugin/issues/23") +// } @CompileDynamic private void applyPatterns(final PatternBasedResolver patterns) { diff --git a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/MavenRepository.groovy b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/MavenRepository.groovy index eb84f87..1f6c9ae 100644 --- a/src/main/groovy/org/ysb33r/gradle/ivypot/internal/MavenRepository.groovy +++ b/src/main/groovy/org/ysb33r/gradle/ivypot/internal/MavenRepository.groovy @@ -60,7 +60,7 @@ class MavenRepository implements MavenArtifactRepository, IvyXml, RepositoryTrai * * @param urls The URLs. */ - @Override +// @Override void setArtifactUrls(Set urls) { artifactUrls.clear() artifactUrls.addAll(urls)