From 316458a7a583739a467863ccfc36086c36d63fdf Mon Sep 17 00:00:00 2001 From: Austin Shalit Date: Thu, 3 Aug 2017 16:34:26 -0700 Subject: [PATCH] Update to Gradle 4.0.2 (#859) --- .travis.yml | 4 +- build.gradle | 38 +++++++++--------- .../composite/SaveImageOperation.java | 3 +- .../wpi/grip/core/sources/CameraSource.java | 3 +- .../core/sources/NetworkTableEntrySource.java | 3 +- .../edu/wpi/grip/core/CoreSanityTest.java | 1 + .../grip/core/operations/OperationsUtil.java | 6 ++- gradle.properties | 3 -- gradle/wrapper/gradle-wrapper.jar | Bin 54227 -> 54712 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 6 +-- pmd-ruleset.xml | 3 +- .../grip/ui/pipeline/SocketHandleView.java | 4 +- .../grip/ui/util/StyleClassNameUtility.java | 5 ++- .../FilterLinesGenerationTesting.java | 3 +- .../FindLinesGenerationTesting.java | 3 +- .../tools/PythonPipelineInterfacer.java | 3 +- 17 files changed, 52 insertions(+), 40 deletions(-) delete mode 100644 gradle.properties diff --git a/.travis.yml b/.travis.yml index 310b4c7bd8..0bde2b5f38 100644 --- a/.travis.yml +++ b/.travis.yml @@ -38,8 +38,8 @@ script: # will not be able to run MainWindowTest.testDragOperationFromPaletteToPipeline - | if [[ "$TRAVIS_OS_NAME" == "osx" ]]; - then ./gradlew check jacocoTestReport jacocoRootReport --stacktrace -Pheadless=true -PlogTests -Dscan -Pgeneration -PjniLocation=$HOME/opencv/jni; - else ./gradlew check jacocoTestReport jacocoRootReport --stacktrace -Pheadless=true -PlogTests -Dscan; + then ./gradlew check jacocoTestReport jacocoRootReport --stacktrace -Pheadless=true -PlogTests --scan -Pgeneration -PjniLocation=$HOME/opencv/jni; + else ./gradlew check jacocoTestReport jacocoRootReport --stacktrace -Pheadless=true -PlogTests --scan; fi after_success: diff --git a/build.gradle b/build.gradle index 165e12b700..e1ba42be5e 100644 --- a/build.gradle +++ b/build.gradle @@ -14,9 +14,9 @@ buildscript { } dependencies { - classpath group: 'de.dynamicfiles.projects.gradle.plugins', name: 'javafx-gradle-plugin', version: '8.5.2' - classpath 'com.netflix.nebula:gradle-aggregate-javadocs-plugin:2.2.+' - classpath 'net.ltgt.gradle:gradle-errorprone-plugin:0.0.8' + classpath group: 'de.dynamicfiles.projects.gradle.plugins', name: 'javafx-gradle-plugin', version: '8.8.0' + classpath 'com.netflix.nebula:gradle-aggregate-javadocs-plugin:3.0.1' + classpath 'net.ltgt.gradle:gradle-errorprone-plugin:0.0.11' classpath group: 'edu.wpi.first.wpilib.opencv', name: 'opencv-installer', version: '2.0.0' } } @@ -25,15 +25,15 @@ import edu.wpi.first.wpilib.opencv.installer.Installer import edu.wpi.first.wpilib.opencv.installer.platform.Platform plugins { - id 'com.gradle.build-scan' version '1.3' + id 'com.gradle.build-scan' version '1.8' id 'java' id 'idea' id 'eclipse' id 'jacoco' id 'com.google.osdetector' version '1.4.0' - id 'com.github.johnrengelman.shadow' version '1.2.3' - id "com.dorongold.task-tree" version "1.2.2" - id 'org.ajoberstar.grgit' version '1.6.0' apply false + id 'com.github.johnrengelman.shadow' version '1.2.4' + id 'com.dorongold.task-tree' version '1.3' + id 'org.ajoberstar.grgit' version '1.7.1' apply false } apply plugin: 'nebula-aggregate-javadocs' apply from: 'git.gradle' @@ -89,7 +89,7 @@ configure(subprojects - project(':ui:linuxLauncher')) { apply plugin: 'findbugs' configurations.errorprone { - resolutionStrategy.force 'com.google.errorprone:error_prone_core:2.0.15' + resolutionStrategy.force 'com.google.errorprone:error_prone_core:2.0.21' } checkstyle { @@ -127,12 +127,16 @@ configure(subprojects - project(':ui:linuxLauncher')) { } } - task findbugsMainReport << { - printReportSafe(findbugsMain.reports.getXml().destination) + task findbugsMainReport { + doLast { + printReportSafe(findbugsMain.reports.getXml().destination) + } } - task findbugsTestReport << { - printReportSafe(findbugsTest.reports.getXml().destination) + task findbugsTestReport { + doLast { + printReportSafe(findbugsTest.reports.getXml().destination) + } } findbugsMain.finalizedBy findbugsMainReport @@ -142,18 +146,14 @@ configure(subprojects - project(':ui:linuxLauncher')) { mavenCentral() jcenter() } - jacoco { - toolVersion = "0.7.5.201505241946" - } - dependencies { compile group: 'com.google.code.findbugs', name: 'annotations', version: '3.0.1' testCompile group: 'net.jodah', name: 'concurrentunit', version: '0.4.2' testCompile group: 'org.hamcrest', name: 'hamcrest-all', version: '1.3' testCompile group: 'junit', name: 'junit', version: '4.12' - testCompile group: 'com.google.truth', name: 'truth', version: '0.30' - testCompile group: 'com.google.guava', name: 'guava-testlib', version: '20.0' + testCompile group: 'com.google.truth', name: 'truth', version: '0.34' + testCompile group: 'com.google.guava', name: 'guava-testlib', version: '22.0' } version = getVersionName() @@ -582,7 +582,7 @@ task jacocoRootReport(type: JacocoReport, group: 'Coverage reports') { } task wrapper(type: Wrapper) { - gradleVersion = '3.2.1' + gradleVersion = '4.0.2' // We want the sources with the wrapper. distributionType = DistributionType.ALL } diff --git a/core/src/main/java/edu/wpi/grip/core/operations/composite/SaveImageOperation.java b/core/src/main/java/edu/wpi/grip/core/operations/composite/SaveImageOperation.java index 37b179481a..f948bbec73 100644 --- a/core/src/main/java/edu/wpi/grip/core/operations/composite/SaveImageOperation.java +++ b/core/src/main/java/edu/wpi/grip/core/operations/composite/SaveImageOperation.java @@ -18,6 +18,7 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; +import java.util.Locale; import java.util.concurrent.TimeUnit; import static org.bytedeco.javacpp.opencv_core.Mat; @@ -69,7 +70,7 @@ private enum FileTypes { @Override public String toString() { - return super.toString().toLowerCase(); + return super.toString().toLowerCase(Locale.ENGLISH); } } diff --git a/core/src/main/java/edu/wpi/grip/core/sources/CameraSource.java b/core/src/main/java/edu/wpi/grip/core/sources/CameraSource.java index b17f96e5b5..3e3a95bba6 100644 --- a/core/src/main/java/edu/wpi/grip/core/sources/CameraSource.java +++ b/core/src/main/java/edu/wpi/grip/core/sources/CameraSource.java @@ -31,6 +31,7 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.List; +import java.util.Locale; import java.util.Optional; import java.util.Properties; import java.util.concurrent.Executor; @@ -352,7 +353,7 @@ public void onSourceRemovedEvent(SourceRemovedEvent event) throws InterruptedExc // a new camera source is added. For webcam sources, this means that the video stream // won't be freed and new sources won't be able to connect to the webcam until the // application is closed. - if (StandardSystemProperty.OS_NAME.value().toLowerCase().contains("mac")) { + if (StandardSystemProperty.OS_NAME.value().toLowerCase(Locale.ENGLISH).contains("mac")) { // Workaround for #716. This affects webcams as well as IP camera sources. // Use only stopAsync() to avoid blocking. Since we have no way of knowing when // the capture has actually been freed, we use a dumb delay to try to make sure it's diff --git a/core/src/main/java/edu/wpi/grip/core/sources/NetworkTableEntrySource.java b/core/src/main/java/edu/wpi/grip/core/sources/NetworkTableEntrySource.java index 9742a4392c..423a6e0471 100644 --- a/core/src/main/java/edu/wpi/grip/core/sources/NetworkTableEntrySource.java +++ b/core/src/main/java/edu/wpi/grip/core/sources/NetworkTableEntrySource.java @@ -20,6 +20,7 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; import java.util.List; +import java.util.Locale; import java.util.Properties; /** @@ -75,7 +76,7 @@ public String toString() { } public String toProperty() { - return toString().toUpperCase(); + return toString().toUpperCase(Locale.ENGLISH); } } diff --git a/core/src/test/java/edu/wpi/grip/core/CoreSanityTest.java b/core/src/test/java/edu/wpi/grip/core/CoreSanityTest.java index 9041b2c2df..30cbca1eae 100644 --- a/core/src/test/java/edu/wpi/grip/core/CoreSanityTest.java +++ b/core/src/test/java/edu/wpi/grip/core/CoreSanityTest.java @@ -42,5 +42,6 @@ public CoreSanityTest() { () -> null)); setDefault(OperationDescription.class, OperationDescription.builder().name("").summary("") .build()); + setDefault(Step.class, new MockStep()); } } diff --git a/core/src/test/java/edu/wpi/grip/core/operations/OperationsUtil.java b/core/src/test/java/edu/wpi/grip/core/operations/OperationsUtil.java index 2eb460762b..8920b3cbdc 100644 --- a/core/src/test/java/edu/wpi/grip/core/operations/OperationsUtil.java +++ b/core/src/test/java/edu/wpi/grip/core/operations/OperationsUtil.java @@ -20,9 +20,11 @@ public ImmutableList operations() { public OperationMetaData getMetaData(String opName) { Locale locOpName = new Locale(opName); - String newOpName = locOpName.toString().toLowerCase().replaceAll("[^a-zA-Z]", ""); + String newOpName + = locOpName.toString().toLowerCase(Locale.ENGLISH).replaceAll("[^a-zA-Z]", ""); for (OperationMetaData data : operations()) { - String dataName = data.getDescription().name().toLowerCase().replaceAll("[^a-zA-Z]", ""); + String dataName + = data.getDescription().name().toLowerCase(Locale.ENGLISH).replaceAll("[^a-zA-Z]", ""); if (dataName.equals(newOpName)) { return data; } diff --git a/gradle.properties b/gradle.properties deleted file mode 100644 index e54844dd1c..0000000000 --- a/gradle.properties +++ /dev/null @@ -1,3 +0,0 @@ -org.gradle.parallel=true -org.gradle.configureondemand=true -org.gradle.cache.tasks=true diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 51288f9c2f05faf8d42e1a751a387ca7923882c3..140e48c45fbc9728266d4b6a06ea013a0ca2fd86 100644 GIT binary patch delta 20024 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 SV=x<3Fb|l}5m(#rr~d(?E+bt4 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d10cf03efd..42ac071913 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Dec 09 22:08:14 EST 2016 +#Wed Aug 02 23:12:11 PDT 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.2.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.0.2-all.zip diff --git a/gradlew b/gradlew index 4453ccea33..cccdd3d517 100755 --- a/gradlew +++ b/gradlew @@ -33,11 +33,11 @@ DEFAULT_JVM_OPTS="" # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" -warn ( ) { +warn () { echo "$*" } -die ( ) { +die () { echo echo "$*" echo @@ -155,7 +155,7 @@ if $cygwin ; then fi # Escape application args -save ( ) { +save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } diff --git a/pmd-ruleset.xml b/pmd-ruleset.xml index 3a8ffb335d..bd92a94192 100644 --- a/pmd-ruleset.xml +++ b/pmd-ruleset.xml @@ -7,6 +7,7 @@ + @@ -37,4 +38,4 @@ - \ No newline at end of file + diff --git a/ui/src/main/java/edu/wpi/grip/ui/pipeline/SocketHandleView.java b/ui/src/main/java/edu/wpi/grip/ui/pipeline/SocketHandleView.java index cca5e113b1..08646d7c4a 100644 --- a/ui/src/main/java/edu/wpi/grip/ui/pipeline/SocketHandleView.java +++ b/ui/src/main/java/edu/wpi/grip/ui/pipeline/SocketHandleView.java @@ -16,6 +16,7 @@ import com.google.inject.Singleton; import com.google.inject.assistedinject.Assisted; +import java.util.Locale; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -54,7 +55,8 @@ public class SocketHandleView extends Button { this.setTooltip(new Tooltip("Drag to connect")); - this.getStyleClass().addAll("socket-handle", socket.getDirection().toString().toLowerCase()); + this.getStyleClass().addAll("socket-handle", + socket.getDirection().toString().toLowerCase(Locale.ENGLISH)); this.connectingProperty.addListener((observableValue, oldValue, isConnecting) -> this.pseudoClassStateChanged(CONNECTING_PSEUDO_CLASS, isConnecting)); diff --git a/ui/src/main/java/edu/wpi/grip/ui/util/StyleClassNameUtility.java b/ui/src/main/java/edu/wpi/grip/ui/util/StyleClassNameUtility.java index f90501ef6f..341af852e0 100644 --- a/ui/src/main/java/edu/wpi/grip/ui/util/StyleClassNameUtility.java +++ b/ui/src/main/java/edu/wpi/grip/ui/util/StyleClassNameUtility.java @@ -5,6 +5,8 @@ import edu.wpi.grip.core.OperationDescription; import edu.wpi.grip.core.Step; +import java.util.Locale; + /** * Creates CSS style classes and ID's for nodes. This makes it possible to use CSS selectors to * retrieve nodes in unit tests. @@ -81,6 +83,7 @@ public static String cssSelectorForInputSocketHandleOn(Step step) { } private static StringBuilder shortNameFor(OperationDescription operationDescription) { - return new StringBuilder(operationDescription.name().toLowerCase().replace(" ", "-")); + return new StringBuilder(operationDescription.name().toLowerCase(Locale.ENGLISH) + .replace(" ", "-")); } } diff --git a/ui/src/test/java/edu/wpi/grip/ui/codegeneration/FilterLinesGenerationTesting.java b/ui/src/test/java/edu/wpi/grip/ui/codegeneration/FilterLinesGenerationTesting.java index 6a378c7613..37eac1b3ce 100644 --- a/ui/src/test/java/edu/wpi/grip/ui/codegeneration/FilterLinesGenerationTesting.java +++ b/ui/src/test/java/edu/wpi/grip/ui/codegeneration/FilterLinesGenerationTesting.java @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Locale; import java.util.Optional; import static org.junit.Assert.assertTrue; @@ -48,7 +49,7 @@ public FilterLinesGenerationTesting() { @Before public void ignoreIfWindows() { assumeFalse("OpenCV JNI bindings crash in Windows using Line segment detector", - System.getProperty("os.name").toLowerCase().contains("windows")); + System.getProperty("os.name").toLowerCase(Locale.ENGLISH).contains("windows")); } void generatePipeline() { diff --git a/ui/src/test/java/edu/wpi/grip/ui/codegeneration/FindLinesGenerationTesting.java b/ui/src/test/java/edu/wpi/grip/ui/codegeneration/FindLinesGenerationTesting.java index 25f79bc2ef..53cb0d9f34 100644 --- a/ui/src/test/java/edu/wpi/grip/ui/codegeneration/FindLinesGenerationTesting.java +++ b/ui/src/test/java/edu/wpi/grip/ui/codegeneration/FindLinesGenerationTesting.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.Optional; import java.util.logging.Logger; @@ -46,7 +47,7 @@ public FindLinesGenerationTesting() { @Before public void ignoreIfWindows() { assumeFalse("OpenCV JNI bindings crash in Windows using Line segment detector", - System.getProperty("os.name").toLowerCase().contains("windows")); + System.getProperty("os.name").toLowerCase(Locale.ENGLISH).contains("windows")); } void generatePipeline() { diff --git a/ui/src/test/java/edu/wpi/grip/ui/codegeneration/tools/PythonPipelineInterfacer.java b/ui/src/test/java/edu/wpi/grip/ui/codegeneration/tools/PythonPipelineInterfacer.java index f773781109..44b85640cc 100644 --- a/ui/src/test/java/edu/wpi/grip/ui/codegeneration/tools/PythonPipelineInterfacer.java +++ b/ui/src/test/java/edu/wpi/grip/ui/codegeneration/tools/PythonPipelineInterfacer.java @@ -22,6 +22,7 @@ import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Matcher; @@ -50,7 +51,7 @@ public class PythonPipelineInterfacer implements PipelineInterfacer { fail("Could not load code directory"); logger.log(Level.WARNING, e.getMessage(), e); } - if (System.getProperty("os.name").toLowerCase().contains("windows")) { + if (System.getProperty("os.name").toLowerCase(Locale.ENGLISH).contains("windows")) { pythonCmd = "python"; } else { pythonCmd = "python3";