From 5089d7876721b83d836ed7acf8f08378d63c32af Mon Sep 17 00:00:00 2001 From: Chris Serra Date: Tue, 25 May 2021 18:30:37 -0700 Subject: [PATCH 1/5] Ignore IntelliJ directory --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index f66f34c..b53d5d8 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,6 @@ build/ .classpath .settings/ bin/ + +# IntelliJ +.idea/ From a70959e1b026b8d686c76b5c1ea917ad87acbd9d Mon Sep 17 00:00:00 2001 From: Chris Serra Date: Tue, 25 May 2021 22:41:54 -0700 Subject: [PATCH 2/5] Added functionality to retrieve a resource from a local JAR file. --- .gitignore | 1 + build.gradle | 1 + .../com/diffplug/blowdryer/Blowdryer.java | 39 +++++++++- .../diffplug/blowdryer/BlowdryerSetup.java | 11 +++ .../blowdryer/BlowdryerPluginTest.java | 68 ++++++++++++------ .../com/diffplug/blowdryer/BlowdryerTest.java | 6 ++ .../diffplug/blowdryer/test-dependency.jar | Bin 0 -> 6067 bytes 7 files changed, 100 insertions(+), 26 deletions(-) create mode 100644 src/test/resources/com/diffplug/blowdryer/test-dependency.jar diff --git a/.gitignore b/.gitignore index b53d5d8..6cc8670 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ bin/ # IntelliJ .idea/ +out/ \ No newline at end of file diff --git a/build.gradle b/build.gradle index f888bee..9322ae0 100644 --- a/build.gradle +++ b/build.gradle @@ -4,6 +4,7 @@ plugins { id 'com.diffplug.spotless-changelog' id 'com.gradle.plugin-publish' id 'com.jfrog.bintray' + id "com.palantir.idea-test-fix" version "0.1.0" // Added to run tests successfully in IntelliJ } apply from: 干.file('base/changelog.gradle') diff --git a/src/main/java/com/diffplug/blowdryer/Blowdryer.java b/src/main/java/com/diffplug/blowdryer/Blowdryer.java index 8fa3150..3981e7d 100644 --- a/src/main/java/com/diffplug/blowdryer/Blowdryer.java +++ b/src/main/java/com/diffplug/blowdryer/Blowdryer.java @@ -21,10 +21,13 @@ import com.diffplug.common.hash.Hashing; import com.diffplug.common.io.Files; import java.io.File; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.util.Base64; @@ -34,6 +37,8 @@ import java.util.Map; import java.util.Objects; import java.util.Properties; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; @@ -111,7 +116,7 @@ public static File immutableUrl(String url) { urlToContent.put(url, dataFile); return dataFile; } - } catch (IOException e) { + } catch (IOException | URISyntaxException e) { throw Errors.asRuntime(e); } } @@ -131,7 +136,35 @@ private static Map loadPropertyFile(File file) throws IOExceptio private static final String PROP_URL = "url"; - private static void download(String url, File dst) throws IOException { + private static void download(String url, File dst) throws IOException, URISyntaxException { + if (url != null && url.startsWith("file:///")) { + downloadLocal(url, dst); + } else { + downloadRemote(url, dst); + } + } + + private static void downloadLocal(String url, File dst) throws IOException, URISyntaxException { + + String[] splitUrl = url.split("!/"); + if (splitUrl.length != 2) { + throw new IllegalArgumentException("Expected a file URL in the format: file:///path-to-dependency.jar!/path-to-file.ext"); + } + + String jarPath = splitUrl[0]; + String filename = splitUrl[1]; + + URI jarPathUri = new URI(jarPath); + try (ZipFile jar = new ZipFile(new File(jarPathUri))) { + ZipEntry foundEntry = jar.stream() + .filter(s -> s.getName().equals(filename)).findAny() + .orElseThrow(() -> new FileNotFoundException("Could not find '" + filename + "' in '" + jarPath + "'")); + + java.nio.file.Files.copy(jar.getInputStream(foundEntry), dst.toPath()); + } + } + + private static void downloadRemote(String url, File dst) throws IOException { OkHttpClient client = new OkHttpClient.Builder().build(); Request.Builder req = new Request.Builder().url(url); authPlugin.addAuthToken(url, req); @@ -154,7 +187,7 @@ private static void download(String url, File dst) throws IOException { /** Returns either the filename safe URL, or (first40)--(Base64 filenamesafe)(last40). */ static String filenameSafe(String url) { - String allSafeCharacters = url.replaceAll("[^a-zA-Z0-9-+_\\.]", "-"); + String allSafeCharacters = url.replaceAll("[^a-zA-Z0-9-+_.]", "-"); String noDuplicateDash = allSafeCharacters.replaceAll("-+", "-"); if (noDuplicateDash.length() <= MAX_FILE_LENGTH) { return noDuplicateDash; diff --git a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java index 47f0e0a..06d0cd7 100644 --- a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java +++ b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java @@ -146,6 +146,17 @@ private GitLab setGlobals() { } } + /** + * Uses the provided {@code jarFilePath} to extract a file resource. + * @param jarFilePath Absolute path to JAR on the file system. + */ + public void localJar(String jarFilePath) { + Blowdryer.setResourcePluginNull(); + File localJar = new File(jarFilePath);//findLocalJar(dependency); + String rootUrl = "file:///" + localJar.getAbsolutePath() + "!/"; + Blowdryer.setResourcePlugin(resource -> rootUrl + resource); + } + @NotNull private String getFullResourcePath(String resource) { return (repoSubfolder.isEmpty() ? "" : repoSubfolder + "/") + resource; diff --git a/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java b/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java index dd095e2..40b4d40 100644 --- a/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java +++ b/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java @@ -23,38 +23,48 @@ import org.junit.Test; public class BlowdryerPluginTest extends GradleHarness { + + private static final String SETTINGS_GRADLE = "settings.gradle"; + private static final String BUILD_GRADLE = "build.gradle"; + private void settingsGithub(String tag, String... extra) throws IOException { - write("settings.gradle", + write(SETTINGS_GRADLE, "plugins { id 'com.diffplug.blowdryerSetup' }", "blowdryerSetup { github('diffplug/blowdryer', 'tag', '" + tag + "') }", Arrays.stream(extra).collect(Collectors.joining("\n"))); } private void settingsGitlab(String tag, String... extra) throws IOException { - write("settings.gradle", + write(SETTINGS_GRADLE, "plugins { id 'com.diffplug.blowdryerSetup' }", "blowdryerSetup { gitlab('diffplug/blowdryer', 'tag', '" + tag + "') }", Arrays.stream(extra).collect(Collectors.joining("\n"))); } private void settingsCustomGitlab(String tag, String... extra) throws IOException { - write("settings.gradle", + write(SETTINGS_GRADLE, "plugins { id 'com.diffplug.blowdryerSetup' }", "blowdryerSetup { gitlab('diffplug/blowdryer', 'tag', '" + tag + "').customDomainHttps('gitlab.com') }", Arrays.stream(extra).collect(Collectors.joining("\n"))); } private void settingsGitlabRootFolder(String tag, String... extra) throws IOException { - write("settings.gradle", + write(SETTINGS_GRADLE, "plugins { id 'com.diffplug.blowdryerSetup' }", "blowdryerSetup { repoSubfolder(''); gitlab('diffplug/blowdryer', 'tag', '" + tag + "') }", Arrays.stream(extra).collect(Collectors.joining("\n"))); } + private void settingsLocalJar(String dependency) throws IOException { + write(SETTINGS_GRADLE, + "plugins { id 'com.diffplug.blowdryerSetup' }", + "blowdryerSetup { localJar('" + dependency + "') }"); + } + @Test public void githubTag() throws IOException { settingsGithub("test/2/a"); - write("build.gradle", + write(BUILD_GRADLE, "apply plugin: 'com.diffplug.blowdryer'", "assert 干.file('sample').text == 'a'", "assert 干.prop('sample', 'name') == 'test'", @@ -62,7 +72,7 @@ public void githubTag() throws IOException { gradleRunner().build(); settingsGithub("test/2/b"); - write("build.gradle", + write(BUILD_GRADLE, "apply plugin: 'com.diffplug.blowdryer'", "assert 干.file('sample').text == 'b'", "assert 干.prop('sample', 'name') == 'testB'", @@ -71,7 +81,7 @@ public void githubTag() throws IOException { // double-check that failures do fail settingsGithub("test/2/b"); - write("build.gradle", + write(BUILD_GRADLE, "plugins { id 'com.diffplug.blowdryer' }", "assert Blowdryer.file('sample').text == 'a'"); gradleRunner().buildAndFail(); @@ -80,7 +90,7 @@ public void githubTag() throws IOException { @Test public void gitlabTag() throws IOException { settingsGitlab("test/2/a"); - write("build.gradle", + write(BUILD_GRADLE, "apply plugin: 'com.diffplug.blowdryer'", "assert 干.file('sample').text == 'a'", "assert 干.prop('sample', 'name') == 'test'", @@ -88,7 +98,7 @@ public void gitlabTag() throws IOException { gradleRunner().build(); settingsGitlab("test/2/b"); - write("build.gradle", + write(BUILD_GRADLE, "apply plugin: 'com.diffplug.blowdryer'", "assert 干.file('sample').text == 'b'", "assert 干.prop('sample', 'name') == 'testB'", @@ -97,7 +107,7 @@ public void gitlabTag() throws IOException { // double-check that failures do fail settingsGitlab("test/2/b"); - write("build.gradle", + write(BUILD_GRADLE, "plugins { id 'com.diffplug.blowdryer' }", "assert Blowdryer.file('sample').text == 'a'"); gradleRunner().buildAndFail(); @@ -106,7 +116,7 @@ public void gitlabTag() throws IOException { @Test public void customGitlabTag() throws IOException { settingsCustomGitlab("test/2/a"); - write("build.gradle", + write(BUILD_GRADLE, "apply plugin: 'com.diffplug.blowdryer'", "assert 干.file('sample').text == 'a'", "assert 干.prop('sample', 'name') == 'test'", @@ -114,7 +124,7 @@ public void customGitlabTag() throws IOException { gradleRunner().build(); settingsCustomGitlab("test/2/b"); - write("build.gradle", + write(BUILD_GRADLE, "apply plugin: 'com.diffplug.blowdryer'", "assert 干.file('sample').text == 'b'", "assert 干.prop('sample', 'name') == 'testB'", @@ -123,7 +133,7 @@ public void customGitlabTag() throws IOException { // double-check that failures do fail settingsCustomGitlab("test/2/b"); - write("build.gradle", + write(BUILD_GRADLE, "plugins { id 'com.diffplug.blowdryer' }", "assert Blowdryer.file('sample').text == 'a'"); gradleRunner().buildAndFail(); @@ -132,7 +142,7 @@ public void customGitlabTag() throws IOException { @Test public void rootfolderGitlabTag() throws IOException { settingsGitlabRootFolder("test/2/a"); - write("build.gradle", + write(BUILD_GRADLE, "apply plugin: 'com.diffplug.blowdryer'", "assert 干.file('src/main/resources/sample').text == 'a'", "assert 干.prop('src/main/resources/sample', 'name') == 'test'", @@ -140,7 +150,7 @@ public void rootfolderGitlabTag() throws IOException { gradleRunner().build(); settingsGitlabRootFolder("test/2/b"); - write("build.gradle", + write(BUILD_GRADLE, "apply plugin: 'com.diffplug.blowdryer'", "assert 干.file('src/main/resources/sample').text == 'b'", "assert 干.prop('src/main/resources/sample', 'name') == 'testB'", @@ -149,7 +159,7 @@ public void rootfolderGitlabTag() throws IOException { // double-check that failures do fail settingsGitlabRootFolder("test/2/b"); - write("build.gradle", + write(BUILD_GRADLE, "plugins { id 'com.diffplug.blowdryer' }", "assert Blowdryer.file('src/main/resources/sample').text == 'a'"); gradleRunner().buildAndFail(); @@ -161,10 +171,10 @@ public void devLocal() throws IOException { write("../blowdryer-script/src/main/resources/sample.properties", "name=test", "group=com.diffplug.gradle"); - write("settings.gradle", + write(SETTINGS_GRADLE, "plugins { id 'com.diffplug.blowdryerSetup' }", "blowdryerSetup { devLocal('../blowdryer-script') }"); - write("build.gradle", + write(BUILD_GRADLE, "apply plugin: 'com.diffplug.blowdryer'", // .replace('\\r', '') fixes test on windows "assert 干.file('sample').text.replace('\\r', '') == 'c\\n'", @@ -177,7 +187,7 @@ public void devLocal() throws IOException { public void multiproject() throws IOException { settingsGithub("test/2/a", "include 'subproject'"); - write("build.gradle", + write(BUILD_GRADLE, "apply plugin: 'com.diffplug.blowdryer'", "assert 干.file('sample').text == 'a'", "assert 干.prop('sample', 'name') == 'test'", @@ -199,7 +209,7 @@ public void multiproject() throws IOException { @Test public void missingResourceThrowsError() throws IOException { settingsGithub("test/2/a"); - write("build.gradle", + write(BUILD_GRADLE, "plugins { id 'com.diffplug.blowdryer' }", "干.file('notPresent')"); Assertions.assertThat(gradleRunner().buildAndFail().getOutput().replace("\r\n", "\n")).contains( @@ -213,7 +223,7 @@ public void cfgTestGroovy() throws IOException { write("../blowdryer-script/src/main/resources/sample.properties", "name=test", "group=com.diffplug.gradle"); - write("settings.gradle", + write(SETTINGS_GRADLE, "plugins { id 'com.diffplug.blowdryerSetup' }", "blowdryerSetup { devLocal('../blowdryer-script') }"); write("../blowdryer-script/src/main/resources/script.gradle", @@ -223,7 +233,7 @@ public void cfgTestGroovy() throws IOException { "println 干.proj(File.class, 'keyFile', 'location of the keyFile')", "println 干.prop('sample', 'group')", ""); - write("build.gradle", + write(BUILD_GRADLE, "apply plugin: 'com.diffplug.blowdryer'", "ext.pluginPass = 'supersecret'", "ext.keyFile = new File('keyFile.txt')", @@ -267,7 +277,7 @@ public void cfgTestKotlin() throws IOException { @Test public void settingsTest() throws IOException { - write("settings.gradle", + write(SETTINGS_GRADLE, "plugins { id 'com.diffplug.blowdryerSetup' }", "blowdryerSetup { github('diffplug/blowdryer', 'tag', 'test/2/a') }", "import com.diffplug.blowdryer.干", @@ -277,4 +287,16 @@ public void settingsTest() throws IOException { "println 'test was success'"); Assertions.assertThat(gradleRunner().build().getOutput().replace("\r\n", "\n")); } + + @Test + public void localJarFileDownloadExists() throws IOException { + String jarFile = BlowdryerPluginTest.class.getResource("test-dependency.jar").getFile(); + settingsLocalJar(jarFile); + + write(BUILD_GRADLE, + "apply plugin: 'com.diffplug.blowdryer'", + "assert 干.file('spotless/license-header.java').exists()"); + + gradleRunner().build(); + } } diff --git a/src/test/java/com/diffplug/blowdryer/BlowdryerTest.java b/src/test/java/com/diffplug/blowdryer/BlowdryerTest.java index 14109a6..da718d3 100644 --- a/src/test/java/com/diffplug/blowdryer/BlowdryerTest.java +++ b/src/test/java/com/diffplug/blowdryer/BlowdryerTest.java @@ -38,4 +38,10 @@ public void cachedFileDeleted_issue_11() { Blowdryer.immutableUrl(test).delete(); Assertions.assertThat(Blowdryer.immutableUrl(test)).hasContent("b"); } + + @Test + public void immutableUrlOfLocalJar() { + String jarFile = BlowdryerPluginTest.class.getResource("test-dependency.jar").getFile(); + Assertions.assertThat(Blowdryer.immutableUrl("file:///" + jarFile + "!/spotless/license-header.java")).exists(); + } } diff --git a/src/test/resources/com/diffplug/blowdryer/test-dependency.jar b/src/test/resources/com/diffplug/blowdryer/test-dependency.jar new file mode 100644 index 0000000000000000000000000000000000000000..9012a57958f180925ed42f75891d89ccf037d5a9 GIT binary patch literal 6067 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 CI6D>q literal 0 HcmV?d00001 From 90cdd32d7e2ade149dc71471bae58906a955892e Mon Sep 17 00:00:00 2001 From: Chris Serra Date: Wed, 26 May 2021 19:09:50 -0700 Subject: [PATCH 3/5] Updated CHANGELOG --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d2db51b..916d7f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [1.1.2] - 2021-05-26 +### Added +- Support for local JAR file ([#20](https://github.com/diffplug/blowdryer/pull/20)) + ## [1.1.1] - 2021-02-12 ### Fixed - Occasionally a file would be deleted from temp storage while a long-lived gradle daemon kept it in cache ([#11](https://github.com/diffplug/blowdryer/pull/18)). From f1447ccdca28cc2a43758a4e519b357ec0e29f19 Mon Sep 17 00:00:00 2001 From: Chris Serra Date: Wed, 26 May 2021 20:05:09 -0700 Subject: [PATCH 4/5] Added simpler jar for testing --- README.md | 18 +++++++++--------- .../blowdryer/BlowdryerPluginTest.java | 16 ++++++++++++++-- .../com/diffplug/blowdryer/BlowdryerTest.java | 4 ++-- .../diffplug/blowdryer/test-dependency.jar | Bin 6067 -> 0 bytes .../resources/com/diffplug/blowdryer/test.jar | Bin 0 -> 164 bytes 5 files changed, 25 insertions(+), 13 deletions(-) delete mode 100644 src/test/resources/com/diffplug/blowdryer/test-dependency.jar create mode 100644 src/test/resources/com/diffplug/blowdryer/test.jar diff --git a/README.md b/README.md index 677d289..edae00e 100644 --- a/README.md +++ b/README.md @@ -16,8 +16,8 @@ output = [ [![Maven central](https://img.shields.io/badge/mavencentral-available-blue.svg)](https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22com.diffplug%22%20AND%20a%3A%22blowdryer%22) [![License Apache 2.0](https://img.shields.io/badge/license-apache--2.0-blue.svg)](https://tldrlegal.com/license/apache-license-2.0-(apache-2.0)) -[![Changelog](https://img.shields.io/badge/changelog-1.1.1-brightgreen.svg)](CHANGELOG.md) -[![Javadoc](https://img.shields.io/badge/javadoc-yes-brightgreen.svg)](https://javadoc.io/doc/com.diffplug/blowdryer/1.1.1/index.html) +[![Changelog](https://img.shields.io/badge/changelog-1.1.2-brightgreen.svg)](CHANGELOG.md) +[![Javadoc](https://img.shields.io/badge/javadoc-yes-brightgreen.svg)](https://javadoc.io/doc/com.diffplug/blowdryer/1.1.2/index.html) [![Live chat](https://img.shields.io/badge/gitter-chat-brightgreen.svg)](https://gitter.im/diffplug/blowdryer) [![JitCI](https://jitci.com/gh/diffplug/blowdryer/svg)](https://jitci.com/gh/diffplug/blowdryer) @@ -47,7 +47,7 @@ Then, in the `settings.gradle` for the project that you want to suck these into, ```gradle plugins { - id 'com.diffplug.blowdryerSetup' version '1.1.1' + id 'com.diffplug.blowdryerSetup' version '1.1.2' } blowdryerSetup { @@ -156,8 +156,8 @@ static String 干.proj(Project proj, String String key, String description) static T 干.proj(Project proj, Class clazz, String String key, String description) ``` -- [javadoc `BlowdryerSetup`](https://javadoc.io/static/com.diffplug/blowdryer/1.1.1/com/diffplug/blowdryer/BlowdryerSetup.html) -- [javadoc `Blowdryer`](https://javadoc.io/static/com.diffplug/blowdryer/1.1.1/com/diffplug/blowdryer/Blowdryer.html) +- [javadoc `BlowdryerSetup`](https://javadoc.io/static/com.diffplug/blowdryer/1.1.2/com/diffplug/blowdryer/BlowdryerSetup.html) +- [javadoc `Blowdryer`](https://javadoc.io/static/com.diffplug/blowdryer/1.1.2/com/diffplug/blowdryer/Blowdryer.html) If you do `apply plugin: 'com.diffplug.blowdryer'` then every project gets an extension object ([code](https://github.com/diffplug/blowdryer/blob/master/src/main/java/com/diffplug/blowdryer/BlowdryerPlugin.java)) where the project field has been filled in for you, which is why we don't pass it explicitly in the examples before this section. If you don't apply the plugin, you can still call these static methods and pass `project` explicitly for the `proj()` methods. @@ -168,7 +168,7 @@ The Gradle Kotlin DSL doesn't play well with the name-based extension object tha ```kotlin // settings.gradle.kts plugins { - id("com.diffplug.blowdryerSetup") version "1.1.1" + id("com.diffplug.blowdryerSetup") version "1.1.2" } import com.diffplug.blowdryer.BlowdryerSetup import com.diffplug.blowdryer.BlowdryerSetup.GitAnchorType @@ -191,9 +191,9 @@ somePlugin { ### Setup with something besides GitHub -[`Blowdryer.immutableUrl`](https://javadoc.io/static/com.diffplug/blowdryer/1.1.1/com/diffplug/blowdryer/Blowdryer.html#immutableUrl-java.lang.String-) returns a `File` containing the downloaded content of the given URL. It's on you to guarantee that the content of that URL is immutable. +[`Blowdryer.immutableUrl`](https://javadoc.io/static/com.diffplug/blowdryer/1.1.2/com/diffplug/blowdryer/Blowdryer.html#immutableUrl-java.lang.String-) returns a `File` containing the downloaded content of the given URL. It's on you to guarantee that the content of that URL is immutable. -When you setup the Blowdryer plugin in your `settings.gradle`, you're telling Blowdryer what URL scheme to use when resolving a call to [`Blowdryer.file`](https://javadoc.io/static/com.diffplug/blowdryer/1.1.1/com/diffplug/blowdryer/Blowdryer.html#file-java.lang.String-), for example: +When you setup the Blowdryer plugin in your `settings.gradle`, you're telling Blowdryer what URL scheme to use when resolving a call to [`Blowdryer.file`](https://javadoc.io/static/com.diffplug/blowdryer/1.1.2/com/diffplug/blowdryer/Blowdryer.html#file-java.lang.String-), for example: ```java //blowdryer { @@ -238,7 +238,7 @@ repositories { mavenCentral() } dependencies { - implementation 'com.diffplug:blowdryer:1.1.1' + implementation 'com.diffplug:blowdryer:1.1.2' } // settings.gradle diff --git a/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java b/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java index 40b4d40..4b311e6 100644 --- a/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java +++ b/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java @@ -290,13 +290,25 @@ public void settingsTest() throws IOException { @Test public void localJarFileDownloadExists() throws IOException { - String jarFile = BlowdryerPluginTest.class.getResource("test-dependency.jar").getFile(); + String jarFile = BlowdryerPluginTest.class.getResource("test.jar").getFile(); settingsLocalJar(jarFile); write(BUILD_GRADLE, "apply plugin: 'com.diffplug.blowdryer'", - "assert 干.file('spotless/license-header.java').exists()"); + "assert 干.file('sample').exists()"); gradleRunner().build(); } + + @Test + public void localJarFileDownloadDoesNotExist() throws IOException { + String jarFile = BlowdryerPluginTest.class.getResource("test.jar").getFile(); + settingsLocalJar(jarFile); + + write(BUILD_GRADLE, + "apply plugin: 'com.diffplug.blowdryer'", + "assert 干.file('invalid-file.txt').exists()"); + + gradleRunner().buildAndFail(); + } } diff --git a/src/test/java/com/diffplug/blowdryer/BlowdryerTest.java b/src/test/java/com/diffplug/blowdryer/BlowdryerTest.java index da718d3..fa775df 100644 --- a/src/test/java/com/diffplug/blowdryer/BlowdryerTest.java +++ b/src/test/java/com/diffplug/blowdryer/BlowdryerTest.java @@ -41,7 +41,7 @@ public void cachedFileDeleted_issue_11() { @Test public void immutableUrlOfLocalJar() { - String jarFile = BlowdryerPluginTest.class.getResource("test-dependency.jar").getFile(); - Assertions.assertThat(Blowdryer.immutableUrl("file:///" + jarFile + "!/spotless/license-header.java")).exists(); + String jarFile = BlowdryerPluginTest.class.getResource("test.jar").getFile(); + Assertions.assertThat(Blowdryer.immutableUrl("file:///" + jarFile + "!/sample")).exists(); } } diff --git a/src/test/resources/com/diffplug/blowdryer/test-dependency.jar b/src/test/resources/com/diffplug/blowdryer/test-dependency.jar deleted file mode 100644 index 9012a57958f180925ed42f75891d89ccf037d5a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6067 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 CI6D>q diff --git a/src/test/resources/com/diffplug/blowdryer/test.jar b/src/test/resources/com/diffplug/blowdryer/test.jar new file mode 100644 index 0000000000000000000000000000000000000000..0777c4f8f330a02317c9a86800615f450d2d7c54 GIT binary patch literal 164 zcmWIWW@h1H0D;mpgA7A)Vs1fBYG?>21G6vZ`UHO Date: Fri, 28 May 2021 00:12:56 -0700 Subject: [PATCH 5/5] PR Feedback. --- CHANGELOG.md | 2 -- README.md | 18 +++++++++--------- .../java/com/diffplug/blowdryer/Blowdryer.java | 8 ++++++-- .../com/diffplug/blowdryer/BlowdryerSetup.java | 11 ++++++----- .../blowdryer/BlowdryerPluginTest.java | 2 +- .../com/diffplug/blowdryer/BlowdryerTest.java | 5 ++++- 6 files changed, 26 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 916d7f4..0710a14 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,8 +5,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] - -## [1.1.2] - 2021-05-26 ### Added - Support for local JAR file ([#20](https://github.com/diffplug/blowdryer/pull/20)) diff --git a/README.md b/README.md index edae00e..677d289 100644 --- a/README.md +++ b/README.md @@ -16,8 +16,8 @@ output = [ [![Maven central](https://img.shields.io/badge/mavencentral-available-blue.svg)](https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22com.diffplug%22%20AND%20a%3A%22blowdryer%22) [![License Apache 2.0](https://img.shields.io/badge/license-apache--2.0-blue.svg)](https://tldrlegal.com/license/apache-license-2.0-(apache-2.0)) -[![Changelog](https://img.shields.io/badge/changelog-1.1.2-brightgreen.svg)](CHANGELOG.md) -[![Javadoc](https://img.shields.io/badge/javadoc-yes-brightgreen.svg)](https://javadoc.io/doc/com.diffplug/blowdryer/1.1.2/index.html) +[![Changelog](https://img.shields.io/badge/changelog-1.1.1-brightgreen.svg)](CHANGELOG.md) +[![Javadoc](https://img.shields.io/badge/javadoc-yes-brightgreen.svg)](https://javadoc.io/doc/com.diffplug/blowdryer/1.1.1/index.html) [![Live chat](https://img.shields.io/badge/gitter-chat-brightgreen.svg)](https://gitter.im/diffplug/blowdryer) [![JitCI](https://jitci.com/gh/diffplug/blowdryer/svg)](https://jitci.com/gh/diffplug/blowdryer) @@ -47,7 +47,7 @@ Then, in the `settings.gradle` for the project that you want to suck these into, ```gradle plugins { - id 'com.diffplug.blowdryerSetup' version '1.1.2' + id 'com.diffplug.blowdryerSetup' version '1.1.1' } blowdryerSetup { @@ -156,8 +156,8 @@ static String 干.proj(Project proj, String String key, String description) static T 干.proj(Project proj, Class clazz, String String key, String description) ``` -- [javadoc `BlowdryerSetup`](https://javadoc.io/static/com.diffplug/blowdryer/1.1.2/com/diffplug/blowdryer/BlowdryerSetup.html) -- [javadoc `Blowdryer`](https://javadoc.io/static/com.diffplug/blowdryer/1.1.2/com/diffplug/blowdryer/Blowdryer.html) +- [javadoc `BlowdryerSetup`](https://javadoc.io/static/com.diffplug/blowdryer/1.1.1/com/diffplug/blowdryer/BlowdryerSetup.html) +- [javadoc `Blowdryer`](https://javadoc.io/static/com.diffplug/blowdryer/1.1.1/com/diffplug/blowdryer/Blowdryer.html) If you do `apply plugin: 'com.diffplug.blowdryer'` then every project gets an extension object ([code](https://github.com/diffplug/blowdryer/blob/master/src/main/java/com/diffplug/blowdryer/BlowdryerPlugin.java)) where the project field has been filled in for you, which is why we don't pass it explicitly in the examples before this section. If you don't apply the plugin, you can still call these static methods and pass `project` explicitly for the `proj()` methods. @@ -168,7 +168,7 @@ The Gradle Kotlin DSL doesn't play well with the name-based extension object tha ```kotlin // settings.gradle.kts plugins { - id("com.diffplug.blowdryerSetup") version "1.1.2" + id("com.diffplug.blowdryerSetup") version "1.1.1" } import com.diffplug.blowdryer.BlowdryerSetup import com.diffplug.blowdryer.BlowdryerSetup.GitAnchorType @@ -191,9 +191,9 @@ somePlugin { ### Setup with something besides GitHub -[`Blowdryer.immutableUrl`](https://javadoc.io/static/com.diffplug/blowdryer/1.1.2/com/diffplug/blowdryer/Blowdryer.html#immutableUrl-java.lang.String-) returns a `File` containing the downloaded content of the given URL. It's on you to guarantee that the content of that URL is immutable. +[`Blowdryer.immutableUrl`](https://javadoc.io/static/com.diffplug/blowdryer/1.1.1/com/diffplug/blowdryer/Blowdryer.html#immutableUrl-java.lang.String-) returns a `File` containing the downloaded content of the given URL. It's on you to guarantee that the content of that URL is immutable. -When you setup the Blowdryer plugin in your `settings.gradle`, you're telling Blowdryer what URL scheme to use when resolving a call to [`Blowdryer.file`](https://javadoc.io/static/com.diffplug/blowdryer/1.1.2/com/diffplug/blowdryer/Blowdryer.html#file-java.lang.String-), for example: +When you setup the Blowdryer plugin in your `settings.gradle`, you're telling Blowdryer what URL scheme to use when resolving a call to [`Blowdryer.file`](https://javadoc.io/static/com.diffplug/blowdryer/1.1.1/com/diffplug/blowdryer/Blowdryer.html#file-java.lang.String-), for example: ```java //blowdryer { @@ -238,7 +238,7 @@ repositories { mavenCentral() } dependencies { - implementation 'com.diffplug:blowdryer:1.1.2' + implementation 'com.diffplug:blowdryer:1.1.1' } // settings.gradle diff --git a/src/main/java/com/diffplug/blowdryer/Blowdryer.java b/src/main/java/com/diffplug/blowdryer/Blowdryer.java index 3981e7d..1bdc949 100644 --- a/src/main/java/com/diffplug/blowdryer/Blowdryer.java +++ b/src/main/java/com/diffplug/blowdryer/Blowdryer.java @@ -52,6 +52,10 @@ * determined by {@link BlowdryerSetup}. */ public class Blowdryer { + + private static final String FILE_PROTOCOL = "file:///"; + private static final String JAR_FILE_RESOURCE_SEPARATOR = "!/"; + private Blowdryer() {} static { @@ -137,7 +141,7 @@ private static Map loadPropertyFile(File file) throws IOExceptio private static final String PROP_URL = "url"; private static void download(String url, File dst) throws IOException, URISyntaxException { - if (url != null && url.startsWith("file:///")) { + if (url.startsWith(FILE_PROTOCOL)) { downloadLocal(url, dst); } else { downloadRemote(url, dst); @@ -146,7 +150,7 @@ private static void download(String url, File dst) throws IOException, URISyntax private static void downloadLocal(String url, File dst) throws IOException, URISyntaxException { - String[] splitUrl = url.split("!/"); + String[] splitUrl = url.split(JAR_FILE_RESOURCE_SEPARATOR); if (splitUrl.length != 2) { throw new IllegalArgumentException("Expected a file URL in the format: file:///path-to-dependency.jar!/path-to-file.ext"); } diff --git a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java index 06d0cd7..53b52ec 100644 --- a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java +++ b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java @@ -147,13 +147,14 @@ private GitLab setGlobals() { } /** - * Uses the provided {@code jarFilePath} to extract a file resource. - * @param jarFilePath Absolute path to JAR on the file system. + * Uses the provided {@code jarFile} to extract a file resource. + * @param jarFile Absolute path to JAR on the file system. */ - public void localJar(String jarFilePath) { + public void localJar(File jarFile) { + Objects.requireNonNull(jarFile, "jarFile must not be null."); Blowdryer.setResourcePluginNull(); - File localJar = new File(jarFilePath);//findLocalJar(dependency); - String rootUrl = "file:///" + localJar.getAbsolutePath() + "!/"; + + String rootUrl = "file:///" + jarFile.getAbsolutePath() + "!/"; Blowdryer.setResourcePlugin(resource -> rootUrl + resource); } diff --git a/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java b/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java index 4b311e6..7326bf2 100644 --- a/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java +++ b/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java @@ -58,7 +58,7 @@ private void settingsGitlabRootFolder(String tag, String... extra) throws IOExce private void settingsLocalJar(String dependency) throws IOException { write(SETTINGS_GRADLE, "plugins { id 'com.diffplug.blowdryerSetup' }", - "blowdryerSetup { localJar('" + dependency + "') }"); + "blowdryerSetup { localJar(file('" + dependency + "')) }"); } @Test diff --git a/src/test/java/com/diffplug/blowdryer/BlowdryerTest.java b/src/test/java/com/diffplug/blowdryer/BlowdryerTest.java index fa775df..3d126d6 100644 --- a/src/test/java/com/diffplug/blowdryer/BlowdryerTest.java +++ b/src/test/java/com/diffplug/blowdryer/BlowdryerTest.java @@ -20,6 +20,9 @@ import org.junit.Test; public class BlowdryerTest { + private static final String JAR_FILE_RESOURCE_SEPARATOR = "!/"; + private static final String FILE_PROTOCOL = "file:///"; + @Test public void filenameSafe() { filenameSafe("http://shortName.com/a+b-0-9~Z", "http-shortName.com-a+b-0-9-Z"); @@ -42,6 +45,6 @@ public void cachedFileDeleted_issue_11() { @Test public void immutableUrlOfLocalJar() { String jarFile = BlowdryerPluginTest.class.getResource("test.jar").getFile(); - Assertions.assertThat(Blowdryer.immutableUrl("file:///" + jarFile + "!/sample")).exists(); + Assertions.assertThat(Blowdryer.immutableUrl(FILE_PROTOCOL + jarFile + JAR_FILE_RESOURCE_SEPARATOR + "sample")).exists(); } }