Skip to content

Commit 418a8af

Browse files
committed
Merge pull request #583 from brunobowden/refactor
Gradle 2.9 unsupported error
2 parents c6d56bb + f99a3fe commit 418a8af

File tree

6 files changed

+87
-14
lines changed

6 files changed

+87
-14
lines changed

src/main/groovy/com/github/j2objccontrib/j2objcgradle/J2objcConfig.groovy

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -733,6 +733,20 @@ class J2objcConfig {
733733
*/
734734
@VisibleForTesting
735735
void finalConfigure() {
736+
737+
// Gradle 2.9 build will fail if it calls configureNativeCompilation:
738+
// https://github.com/j2objc-contrib/j2objc-gradle/issues/568
739+
// Return early without error to avoid deadlock:
740+
// https://github.com/j2objc-contrib/j2objc-gradle/issues/585
741+
// Exception is thrown when TranslateTask is run. Safest approach is to disable
742+
// all setup logic even though only NativeCompilation appears to cause any issue.
743+
if (Utils.checkGradleVersion(false)) {
744+
configureNativeCompilationForUnsupported()
745+
// Avoid misleading error message that finalConfigured() wasn't in build.gradle
746+
finalConfigured = true
747+
return
748+
}
749+
736750
validateConfiguration()
737751
// Conversion of compile and testCompile dependencies occurs optionally.
738752
if (autoConfigureDeps) {
@@ -840,6 +854,10 @@ class J2objcConfig {
840854
project.file("${project.buildDir}/j2objcSrcGenTest"))
841855
}
842856

857+
protected void configureNativeCompilationForUnsupported() {
858+
nativeCompilation.applyWhenUnsupported()
859+
}
860+
843861
protected void convertDeps() {
844862
new DependencyConverter(project, this).configureAll()
845863
}

src/main/groovy/com/github/j2objccontrib/j2objcgradle/J2objcPlugin.groovy

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import org.gradle.api.Project
3232
import org.gradle.api.Task
3333
import org.gradle.api.plugins.JavaPlugin
3434
import org.gradle.api.logging.LogLevel
35-
import org.gradle.util.GradleVersion
3635

3736
/*
3837
* Main plugin class for creation of extension object and all the tasks.
@@ -56,7 +55,6 @@ class J2objcPlugin implements Plugin<Project> {
5655

5756
// This avoids a lot of "project." prefixes, such as "project.tasks.create"
5857
project.with {
59-
Utils.checkMinGradleVersion(GradleVersion.current())
6058
getPluginManager().apply(JavaPlugin)
6159

6260
extensions.create('j2objcConfig', J2objcConfig, project)

src/main/groovy/com/github/j2objccontrib/j2objcgradle/NativeCompilation.groovy

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package com.github.j2objccontrib.j2objcgradle
1919
import com.github.j2objccontrib.j2objcgradle.tasks.Utils
2020
import groovy.transform.PackageScope
2121
import org.gradle.api.Action
22+
import org.gradle.api.DefaultTask
2223
import org.gradle.api.InvalidUserDataException
2324
import org.gradle.api.NamedDomainObjectContainer
2425
import org.gradle.api.Project
@@ -121,6 +122,18 @@ class NativeCompilation {
121122
})
122123
}
123124

125+
// Creates fake tasks to satisfy dependencies for J2objcPlugin.apply(...)
126+
// Should only be used as an alternative to NativeComplication.apply(...) when
127+
// the Gradle Version is unsupported and no J2ObjC is possible.
128+
void applyWhenUnsupported() {
129+
project.with {
130+
tasks.create(name: 'debugTestJ2objcExecutable', type: DefaultTask)
131+
tasks.create(name: 'releaseTestJ2objcExecutable', type: DefaultTask)
132+
tasks.create(name: 'j2objcBuildObjcDebug', type: DefaultTask)
133+
tasks.create(name: 'j2objcBuildObjcRelease', type: DefaultTask)
134+
}
135+
}
136+
124137
@PackageScope
125138
@SuppressWarnings("grvy:org.codenarc.rule.size.NestedBlockDepthRule")
126139
void apply(File srcGenMainDir, File srcGenTestDir) {

src/main/groovy/com/github/j2objccontrib/j2objcgradle/tasks/TranslateTask.groovy

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,11 @@ class TranslateTask extends DefaultTask {
135135

136136
@TaskAction
137137
void translate(IncrementalTaskInputs inputs) {
138+
// Exceptions must be delayed until Plugin tasks are run
139+
// Doing it earlier causes Gradle deadlock:
140+
// https://github.com/j2objc-contrib/j2objc-gradle/issues/585
141+
Utils.checkGradleVersion(true)
142+
138143
List<String> translateArgs = getTranslateArgs()
139144
// Don't evaluate this expensive property multiple times.
140145
FileCollection originalMainSrcFiles = getMainSrcFiles()

src/main/groovy/com/github/j2objccontrib/j2objcgradle/tasks/Utils.groovy

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,33 @@ class Utils {
5555
// Prevent construction of this class, confines usage to static methods
5656
private Utils() { }
5757

58-
static void checkMinGradleVersion(GradleVersion gradleVersion) {
58+
static boolean checkGradleVersion(boolean throwIfUnsupported) {
59+
return checkGradleVersion(GradleVersion.current(), throwIfUnsupported)
60+
}
61+
62+
@VisibleForTesting
63+
static boolean checkGradleVersion(GradleVersion gradleVersion, boolean throwIfUnsupported) {
64+
String errorMsg = ''
65+
5966
final GradleVersion minGradleVersion = GradleVersion.version('2.4')
60-
if (gradleVersion.compareTo(minGradleVersion) < 0) {
61-
throw new InvalidUserDataException(
62-
"J2ObjC Gradle Plugin requires minimum Gradle version: $minGradleVersion")
67+
if (gradleVersion.compareTo(GradleVersion.version('2.4')) < 0) {
68+
errorMsg = "J2ObjC Gradle Plugin requires minimum Gradle version: $minGradleVersion"
69+
}
70+
71+
final GradleVersion unsupportedGradleVersion = GradleVersion.version('2.9')
72+
if (gradleVersion.compareTo(unsupportedGradleVersion) >= 0) {
73+
errorMsg = "Please use Gradle 2.8 as $unsupportedGradleVersion is unsupported:\n" +
74+
"https://github.com/j2objc-contrib/j2objc-gradle/issues/568"
75+
}
76+
77+
if (!errorMsg.isEmpty()) {
78+
if (throwIfUnsupported) {
79+
throw new InvalidUserDataException(errorMsg)
80+
} else {
81+
return true
82+
}
6383
}
84+
return false
6485
}
6586

6687
static List<Integer> parseVersionComponents(String ver) {

src/test/groovy/com/github/j2objccontrib/j2objcgradle/tasks/UtilsTest.groovy

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,17 +58,35 @@ class UtilsTest {
5858
}
5959

6060
@Test
61-
void testCheckMinGradleVersion_valid() {
62-
Utils.checkMinGradleVersion(GradleVersion.version('2.4'))
63-
Utils.checkMinGradleVersion(GradleVersion.version('2.4.1'))
64-
Utils.checkMinGradleVersion(GradleVersion.version('2.5'))
65-
Utils.checkMinGradleVersion(GradleVersion.version('3.0'))
66-
Utils.checkMinGradleVersion(GradleVersion.version('10.0'))
61+
void testCheckGradleVersion_valid() {
62+
assert !Utils.checkGradleVersion(GradleVersion.version('2.4'), false)
63+
assert !Utils.checkGradleVersion(GradleVersion.version('2.4.1'), false)
64+
assert !Utils.checkGradleVersion(GradleVersion.version('2.5'), false)
65+
assert !Utils.checkGradleVersion(GradleVersion.version('2.8'), false)
66+
}
67+
68+
@Test
69+
void testCheckGradleVersion_validAndThrowIfUnsupported() {
70+
assert !Utils.checkGradleVersion(GradleVersion.version('2.4'), true)
71+
assert !Utils.checkGradleVersion(GradleVersion.version('2.4.1'), true)
72+
assert !Utils.checkGradleVersion(GradleVersion.version('2.5'), true)
73+
assert !Utils.checkGradleVersion(GradleVersion.version('2.8'), true)
74+
}
75+
76+
@Test
77+
void testCheckGradleVersion_invalid() {
78+
assert Utils.checkGradleVersion(GradleVersion.version('2.3'), false)
79+
assert Utils.checkGradleVersion(GradleVersion.version('2.9'), false)
80+
}
81+
82+
@Test(expected=InvalidUserDataException)
83+
void testCheckGradleVersion_invalidBelowMinimum() {
84+
Utils.checkGradleVersion(GradleVersion.version('2.3'), true)
6785
}
6886

6987
@Test(expected=InvalidUserDataException)
70-
void testCheckMinGradleVersion_invalid() {
71-
Utils.checkMinGradleVersion(GradleVersion.version('2.3'))
88+
void testCheckGradleVersion_invalidAboveMaximum() {
89+
Utils.checkGradleVersion(GradleVersion.version('2.9'), true)
7290
}
7391

7492
@Test

0 commit comments

Comments
 (0)