From 39631fb09fb016c53579921ffa15a0567efaebb9 Mon Sep 17 00:00:00 2001 From: Volker Gropp Date: Fri, 5 Feb 2021 12:27:50 +0100 Subject: [PATCH 01/22] use gitlab api request as preperation to support auth for private repositories #14 --- .../com/diffplug/blowdryer/BlowdryerSetup.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java index 513a4a7..d5c2ce1 100644 --- a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java +++ b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java @@ -19,6 +19,8 @@ import com.diffplug.common.base.Errors; import groovy.lang.Closure; import java.io.File; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; import java.util.Objects; import java.util.function.Function; @@ -65,8 +67,10 @@ public void github(String repoOrg, GitAnchorType anchorType, String anchor) { public void gitlab(String repoOrg, GitAnchorType anchorType, String anchor) { assertNoLeadingOrTrailingSlash(repoOrg); assertNoLeadingOrTrailingSlash(anchor); - String root = "https://gitlab.com/" + repoOrg + "/-/raw/" + anchor + "/" + repoSubfolder + "/"; - Blowdryer.setResourcePlugin(resource -> root + resource); + Blowdryer.setResourcePlugin(resource -> "https://gitlab.com/api/v4/projects/" + + encodeUrlPart(repoOrg) + "/repository/files/" + + encodeUrlPart((repoSubfolder.isEmpty() ? "" : repoSubfolder + "/") + resource) + "/raw?ref=" + + encodeUrlPart(anchor)); } /** Sets the mapping from `file(String)` to `immutableUrl(String)`. */ @@ -108,4 +112,12 @@ private static String assertNoLeadingOrTrailingSlash(String input) { } return input; } + + private static String encodeUrlPart(String part) { + try { + return URLEncoder.encode(part, "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new IllegalArgumentException("error encoding part", e); + } + } } From 34d9a4343bcc9e8f7778971b5a045cc2e0394f97 Mon Sep 17 00:00:00 2001 From: Volker Gropp Date: Fri, 5 Feb 2021 12:55:04 +0100 Subject: [PATCH 02/22] support self hosted gitlab hosts --- src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java | 7 ++++++- .../java/com/diffplug/blowdryer/BlowdryerPluginTest.java | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java index d5c2ce1..0c19a81 100644 --- a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java +++ b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java @@ -65,9 +65,14 @@ public void github(String repoOrg, GitAnchorType anchorType, String anchor) { /** Sets the source where we will grab these scripts. */ public void gitlab(String repoOrg, GitAnchorType anchorType, String anchor) { + gitlab("https://gitlab.com", repoOrg, anchorType, anchor); + } + + public void gitlab(String host, String repoOrg, GitAnchorType anchorType, String anchor) { assertNoLeadingOrTrailingSlash(repoOrg); assertNoLeadingOrTrailingSlash(anchor); - Blowdryer.setResourcePlugin(resource -> "https://gitlab.com/api/v4/projects/" + assertNoLeadingOrTrailingSlash(host); + Blowdryer.setResourcePlugin(resource -> host + "/api/v4/projects/" + encodeUrlPart(repoOrg) + "/repository/files/" + encodeUrlPart((repoSubfolder.isEmpty() ? "" : repoSubfolder + "/") + resource) + "/raw?ref=" + encodeUrlPart(anchor)); diff --git a/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java b/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java index d19480e..9e122ac 100644 --- a/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java +++ b/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java @@ -33,10 +33,11 @@ private void settingsGithub(String tag, String... extra) throws IOException { private void settingsGitlab(String tag, String... extra) throws IOException { write("settings.gradle", "plugins { id 'com.diffplug.blowdryerSetup' }", - "blowdryerSetup { gitlab('vgropp/blowdryer-test', 'tag', '" + tag + "') }", + "blowdryerSetup { gitlab('https://gitlab.com', 'vgropp/blowdryer-test', 'tag', '" + tag + "') }", Arrays.stream(extra).collect(Collectors.joining("\n"))); } + @Test public void githubTag() throws IOException { settingsGithub("test/2/a"); From 1b655809434ab04df89a863b60555def9749286d Mon Sep 17 00:00:00 2001 From: Volker Gropp Date: Fri, 5 Feb 2021 13:20:35 +0100 Subject: [PATCH 03/22] fix empty repoSubfolder --- .../java/com/diffplug/blowdryer/BlowdryerSetup.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java index 0c19a81..d2a6956 100644 --- a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java +++ b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java @@ -18,6 +18,8 @@ import com.diffplug.common.base.Errors; import groovy.lang.Closure; +import org.jetbrains.annotations.NotNull; + import java.io.File; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; @@ -59,8 +61,8 @@ public enum GitAnchorType { public void github(String repoOrg, GitAnchorType anchorType, String anchor) { assertNoLeadingOrTrailingSlash(repoOrg); assertNoLeadingOrTrailingSlash(anchor); - String root = "https://raw.githubusercontent.com/" + repoOrg + "/" + anchor + "/" + repoSubfolder + "/"; - Blowdryer.setResourcePlugin(resource -> root + resource); + String root = "https://raw.githubusercontent.com/" + repoOrg + "/" + anchor + "/"; + Blowdryer.setResourcePlugin(resource -> root + getFullResourcePath(resource)); } /** Sets the source where we will grab these scripts. */ @@ -74,10 +76,15 @@ public void gitlab(String host, String repoOrg, GitAnchorType anchorType, String assertNoLeadingOrTrailingSlash(host); Blowdryer.setResourcePlugin(resource -> host + "/api/v4/projects/" + encodeUrlPart(repoOrg) + "/repository/files/" - + encodeUrlPart((repoSubfolder.isEmpty() ? "" : repoSubfolder + "/") + resource) + "/raw?ref=" + + encodeUrlPart(getFullResourcePath(resource)) + "/raw?ref=" + encodeUrlPart(anchor)); } + @NotNull + private String getFullResourcePath(String resource) { + return (repoSubfolder.isEmpty() ? "" : repoSubfolder + "/") + resource; + } + /** Sets the mapping from `file(String)` to `immutableUrl(String)`. */ public void experimental(Closure function) { experimental(function::call); From 178bced850d7cff22008451258baf3d2b24daf22 Mon Sep 17 00:00:00 2001 From: Volker Gropp Date: Fri, 5 Feb 2021 13:24:13 +0100 Subject: [PATCH 04/22] add github and gitlab token based auth support #14 --- .../com/diffplug/blowdryer/Blowdryer.java | 15 ++++++++++- .../diffplug/blowdryer/BlowdryerSetup.java | 25 +++++++++++++++++-- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/diffplug/blowdryer/Blowdryer.java b/src/main/java/com/diffplug/blowdryer/Blowdryer.java index 81705c6..a9e9543 100644 --- a/src/main/java/com/diffplug/blowdryer/Blowdryer.java +++ b/src/main/java/com/diffplug/blowdryer/Blowdryer.java @@ -24,6 +24,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.net.MalformedURLException; import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.util.Base64; @@ -132,7 +133,7 @@ private static Map loadPropertyFile(File file) throws IOExceptio private static void download(String url, File dst) throws IOException { OkHttpClient client = new OkHttpClient.Builder().build(); - Request req = new Request.Builder().url(url).build(); + Request req = authPlugin.addAuthToken(url, new Request.Builder().url(url)).build(); try (Response response = client.newCall(req).execute()) { if (!response.isSuccessful()) { throw new IllegalArgumentException(url + "\nreceived http code " + response.code() + "\n" + response.body().string()); @@ -204,6 +205,18 @@ private static void assertInitialized() { } } + static interface AuthPlugin { + Request.Builder addAuthToken(String url, Request.Builder builder) throws MalformedURLException; + } + + private static AuthPlugin authPlugin = (url, builder) -> builder; + + public static void setAuthPlugin(AuthPlugin authPlugin) { + synchronized (Blowdryer.class) { + Blowdryer.authPlugin = authPlugin; + } + } + /** Returns the given resource as a File (as configured by {@link BlowdryerSetup}. */ public static File file(String resourcePath) { synchronized (Blowdryer.class) { diff --git a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java index d2a6956..8f2670d 100644 --- a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java +++ b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java @@ -22,6 +22,7 @@ import java.io.File; import java.io.UnsupportedEncodingException; +import java.net.URL; import java.net.URLEncoder; import java.util.Objects; import java.util.function.Function; @@ -30,6 +31,9 @@ public class BlowdryerSetup { static final String NAME = "blowdryerSetup"; + private static final String GITHUB_HOST = "raw.githubusercontent.com"; + private static final String GITLAB_HOST = "gitlab.com"; + private final File referenceDirectory; /** Pass in the directory that will be used to resolve string arguments to devLocal. */ @@ -61,13 +65,13 @@ public enum GitAnchorType { public void github(String repoOrg, GitAnchorType anchorType, String anchor) { assertNoLeadingOrTrailingSlash(repoOrg); assertNoLeadingOrTrailingSlash(anchor); - String root = "https://raw.githubusercontent.com/" + repoOrg + "/" + anchor + "/"; + String root = "https://" + GITHUB_HOST + "/" + repoOrg + "/" + anchor + "/"; Blowdryer.setResourcePlugin(resource -> root + getFullResourcePath(resource)); } /** Sets the source where we will grab these scripts. */ public void gitlab(String repoOrg, GitAnchorType anchorType, String anchor) { - gitlab("https://gitlab.com", repoOrg, anchorType, anchor); + gitlab("https://" + GITLAB_HOST, repoOrg, anchorType, anchor); } public void gitlab(String host, String repoOrg, GitAnchorType anchorType, String anchor) { @@ -85,6 +89,23 @@ private String getFullResourcePath(String resource) { return (repoSubfolder.isEmpty() ? "" : repoSubfolder + "/") + resource; } + public void githubAuth(String authToken) { + authToken(GITHUB_HOST, authToken); + } + + public void gitlabAuth(String authToken) { + authToken(GITLAB_HOST, authToken); + } + + public void authToken(String host, String authToken) { + Blowdryer.setAuthPlugin((url, builder) -> { + if (new URL(url).getHost().equals(host)) { + builder.addHeader("Authorization", "Bearer " + authToken); + } + return builder; + }); + } + /** Sets the mapping from `file(String)` to `immutableUrl(String)`. */ public void experimental(Closure function) { experimental(function::call); From 6df64aa186be3c61d85e630b887072e35653e0b3 Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Fri, 5 Feb 2021 09:34:15 -0800 Subject: [PATCH 05/22] First step of refactoring GitHub into a fluent interface. --- .../diffplug/blowdryer/BlowdryerSetup.java | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java index 8f2670d..622eedb 100644 --- a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java +++ b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java @@ -18,14 +18,13 @@ import com.diffplug.common.base.Errors; import groovy.lang.Closure; -import org.jetbrains.annotations.NotNull; - import java.io.File; import java.io.UnsupportedEncodingException; import java.net.URL; import java.net.URLEncoder; import java.util.Objects; import java.util.function.Function; +import org.jetbrains.annotations.NotNull; /** Configures where {@link Blowdryer#file(String)} downloads files from. */ public class BlowdryerSetup { @@ -62,11 +61,28 @@ public enum GitAnchorType { } /** Sets the source where we will grab these scripts. */ - public void github(String repoOrg, GitAnchorType anchorType, String anchor) { - assertNoLeadingOrTrailingSlash(repoOrg); - assertNoLeadingOrTrailingSlash(anchor); - String root = "https://" + GITHUB_HOST + "/" + repoOrg + "/" + anchor + "/"; - Blowdryer.setResourcePlugin(resource -> root + getFullResourcePath(resource)); + public GitHub github(String repoOrg, GitAnchorType anchorType, String anchor) { + // anchorType isn't used right now, but makes it easier to read what "anchor" is + return new GitHub(repoOrg, anchor); + } + + public class GitHub { + private String repoOrg; + private String anchor; + + private GitHub(String repoOrg, String anchor) { + assertNoLeadingOrTrailingSlash(repoOrg); + assertNoLeadingOrTrailingSlash(anchor); + this.repoOrg = repoOrg; + this.anchor = anchor; + setGlobals(); + } + + private GitHub setGlobals() { + String root = "https://" + GITHUB_HOST + "/" + repoOrg + "/" + anchor + "/"; + Blowdryer.setResourcePlugin(resource -> root + getFullResourcePath(resource)); + return this; + } } /** Sets the source where we will grab these scripts. */ From 4d1312dd7278b697f7c1c16784973708bf9027c7 Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Fri, 5 Feb 2021 09:39:03 -0800 Subject: [PATCH 06/22] GitHub can now handle auth with fluent interface. --- .../java/com/diffplug/blowdryer/Blowdryer.java | 5 +++-- .../com/diffplug/blowdryer/BlowdryerSetup.java | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/diffplug/blowdryer/Blowdryer.java b/src/main/java/com/diffplug/blowdryer/Blowdryer.java index a9e9543..de4723f 100644 --- a/src/main/java/com/diffplug/blowdryer/Blowdryer.java +++ b/src/main/java/com/diffplug/blowdryer/Blowdryer.java @@ -209,11 +209,12 @@ static interface AuthPlugin { Request.Builder addAuthToken(String url, Request.Builder builder) throws MalformedURLException; } - private static AuthPlugin authPlugin = (url, builder) -> builder; + private static final AuthPlugin authPluginNone = (url, builder) -> builder;; + private static AuthPlugin authPlugin = authPluginNone; public static void setAuthPlugin(AuthPlugin authPlugin) { synchronized (Blowdryer.class) { - Blowdryer.authPlugin = authPlugin; + Blowdryer.authPlugin = authPlugin == null ? authPluginNone : authPlugin; } } diff --git a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java index 622eedb..08ab528 100644 --- a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java +++ b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java @@ -24,6 +24,7 @@ import java.net.URLEncoder; import java.util.Objects; import java.util.function.Function; +import javax.annotation.Nullable; import org.jetbrains.annotations.NotNull; /** Configures where {@link Blowdryer#file(String)} downloads files from. */ @@ -69,6 +70,7 @@ public GitHub github(String repoOrg, GitAnchorType anchorType, String anchor) { public class GitHub { private String repoOrg; private String anchor; + private @Nullable String authToken; private GitHub(String repoOrg, String anchor) { assertNoLeadingOrTrailingSlash(repoOrg); @@ -78,9 +80,24 @@ private GitHub(String repoOrg, String anchor) { setGlobals(); } + public GitHub authToken(String authToken) { + this.authToken = authToken; + return setGlobals(); + } + private GitHub setGlobals() { String root = "https://" + GITHUB_HOST + "/" + repoOrg + "/" + anchor + "/"; Blowdryer.setResourcePlugin(resource -> root + getFullResourcePath(resource)); + if (authToken == null) { + Blowdryer.setAuthPlugin((url, builder) -> { + if (builder.getUrl$okhttp().host().equals(GITHUB_HOST)) { + builder.addHeader("Authorization", "Bearer " + authToken); + } + return builder; + }); + } else { + Blowdryer.setAuthPlugin(null); + } return this; } } From f9e526f840727eb0c2ff139da5fe7ff26a90ada2 Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Fri, 5 Feb 2021 09:45:09 -0800 Subject: [PATCH 07/22] GitLab can now handle auth with fluent interface, but not yet custom domain/protocol. --- .../diffplug/blowdryer/BlowdryerSetup.java | 70 +++++++++++-------- 1 file changed, 41 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java index 08ab528..7d16e74 100644 --- a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java +++ b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java @@ -20,7 +20,6 @@ import groovy.lang.Closure; import java.io.File; import java.io.UnsupportedEncodingException; -import java.net.URL; import java.net.URLEncoder; import java.util.Objects; import java.util.function.Function; @@ -88,7 +87,7 @@ public GitHub authToken(String authToken) { private GitHub setGlobals() { String root = "https://" + GITHUB_HOST + "/" + repoOrg + "/" + anchor + "/"; Blowdryer.setResourcePlugin(resource -> root + getFullResourcePath(resource)); - if (authToken == null) { + if (authToken != null) { Blowdryer.setAuthPlugin((url, builder) -> { if (builder.getUrl$okhttp().host().equals(GITHUB_HOST)) { builder.addHeader("Authorization", "Bearer " + authToken); @@ -103,40 +102,53 @@ private GitHub setGlobals() { } /** Sets the source where we will grab these scripts. */ - public void gitlab(String repoOrg, GitAnchorType anchorType, String anchor) { - gitlab("https://" + GITLAB_HOST, repoOrg, anchorType, anchor); + public GitLab gitlab(String repoOrg, GitAnchorType anchorType, String anchor) { + // anchorType isn't used right now, but makes it easier to read what "anchor" is + return new GitLab(repoOrg, anchor); } - public void gitlab(String host, String repoOrg, GitAnchorType anchorType, String anchor) { - assertNoLeadingOrTrailingSlash(repoOrg); - assertNoLeadingOrTrailingSlash(anchor); - assertNoLeadingOrTrailingSlash(host); - Blowdryer.setResourcePlugin(resource -> host + "/api/v4/projects/" - + encodeUrlPart(repoOrg) + "/repository/files/" - + encodeUrlPart(getFullResourcePath(resource)) + "/raw?ref=" - + encodeUrlPart(anchor)); - } + public class GitLab { + private String protocol = "https://"; + private String host = GITLAB_HOST; + private String repoOrg; + private String anchor; + private @Nullable String authToken; - @NotNull - private String getFullResourcePath(String resource) { - return (repoSubfolder.isEmpty() ? "" : repoSubfolder + "/") + resource; - } + private GitLab(String repoOrg, String anchor) { + assertNoLeadingOrTrailingSlash(repoOrg); + assertNoLeadingOrTrailingSlash(anchor); + this.repoOrg = repoOrg; + this.anchor = anchor; + setGlobals(); + } - public void githubAuth(String authToken) { - authToken(GITHUB_HOST, authToken); - } + public GitLab authToken(String authToken) { + this.authToken = authToken; + return setGlobals(); + } - public void gitlabAuth(String authToken) { - authToken(GITLAB_HOST, authToken); + private GitLab setGlobals() { + Blowdryer.setResourcePlugin(resource -> protocol + host + "/api/v4/projects/" + + encodeUrlPart(repoOrg) + "/repository/files/" + + encodeUrlPart(getFullResourcePath(resource)) + "/raw?ref=" + + encodeUrlPart(anchor)); + if (authToken != null) { + Blowdryer.setAuthPlugin((url, builder) -> { + if (builder.getUrl$okhttp().host().equals(host)) { + builder.addHeader("Authorization", "Bearer " + authToken); + } + return builder; + }); + } else { + Blowdryer.setAuthPlugin(null); + } + return this; + } } - public void authToken(String host, String authToken) { - Blowdryer.setAuthPlugin((url, builder) -> { - if (new URL(url).getHost().equals(host)) { - builder.addHeader("Authorization", "Bearer " + authToken); - } - return builder; - }); + @NotNull + private String getFullResourcePath(String resource) { + return (repoSubfolder.isEmpty() ? "" : repoSubfolder + "/") + resource; } /** Sets the mapping from `file(String)` to `immutableUrl(String)`. */ From fa82f52e3c63ae20ab206837894cc06f79640ad2 Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Fri, 5 Feb 2021 09:53:29 -0800 Subject: [PATCH 08/22] GitLab can now handle custom domains and protocols. --- .../diffplug/blowdryer/BlowdryerSetup.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java index 7d16e74..fb562a4 100644 --- a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java +++ b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java @@ -108,18 +108,17 @@ public GitLab gitlab(String repoOrg, GitAnchorType anchorType, String anchor) { } public class GitLab { - private String protocol = "https://"; - private String host = GITLAB_HOST; private String repoOrg; private String anchor; private @Nullable String authToken; + private String protocol, host; private GitLab(String repoOrg, String anchor) { assertNoLeadingOrTrailingSlash(repoOrg); assertNoLeadingOrTrailingSlash(anchor); this.repoOrg = repoOrg; this.anchor = anchor; - setGlobals(); + customDomainHttps(GITLAB_HOST); } public GitLab authToken(String authToken) { @@ -127,6 +126,20 @@ public GitLab authToken(String authToken) { return setGlobals(); } + public GitLab customDomainHttp(String domain) { + return customProtocolAndDomain("http://", domain); + } + + public GitLab customDomainHttps(String domain) { + return customProtocolAndDomain("https://", domain); + } + + public GitLab customProtocolAndDomain(String protocol, String domain) { + this.protocol = protocol; + this.host = domain; + return setGlobals(); + } + private GitLab setGlobals() { Blowdryer.setResourcePlugin(resource -> protocol + host + "/api/v4/projects/" + encodeUrlPart(repoOrg) + "/repository/files/" From ea28cb464a0d949302462d3dab3829c9ba68ff2a Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Fri, 5 Feb 2021 10:01:05 -0800 Subject: [PATCH 09/22] Fix security vuln where GitHub and GitLab could have sent auth over HTTP. --- .../java/com/diffplug/blowdryer/BlowdryerSetup.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java index fb562a4..f839c85 100644 --- a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java +++ b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java @@ -89,7 +89,7 @@ private GitHub setGlobals() { Blowdryer.setResourcePlugin(resource -> root + getFullResourcePath(resource)); if (authToken != null) { Blowdryer.setAuthPlugin((url, builder) -> { - if (builder.getUrl$okhttp().host().equals(GITHUB_HOST)) { + if (url.startsWith(root)) { builder.addHeader("Authorization", "Bearer " + authToken); } return builder; @@ -134,20 +134,19 @@ public GitLab customDomainHttps(String domain) { return customProtocolAndDomain("https://", domain); } - public GitLab customProtocolAndDomain(String protocol, String domain) { + private GitLab customProtocolAndDomain(String protocol, String domain) { this.protocol = protocol; this.host = domain; return setGlobals(); } private GitLab setGlobals() { - Blowdryer.setResourcePlugin(resource -> protocol + host + "/api/v4/projects/" - + encodeUrlPart(repoOrg) + "/repository/files/" - + encodeUrlPart(getFullResourcePath(resource)) + "/raw?ref=" - + encodeUrlPart(anchor)); + String urlStart = protocol + host + "/api/v4/projects/" + encodeUrlPart(repoOrg) + "/repository/files/"; + String urlEnd = "/raw?ref=" + encodeUrlPart(anchor); + Blowdryer.setResourcePlugin(resource -> urlStart + encodeUrlPart(getFullResourcePath(resource)) + urlEnd); if (authToken != null) { Blowdryer.setAuthPlugin((url, builder) -> { - if (builder.getUrl$okhttp().host().equals(host)) { + if (url.startsWith(urlStart)) { builder.addHeader("Authorization", "Bearer " + authToken); } return builder; From 92875894828863cea4b7edcc86bb0340fc122f5a Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Fri, 5 Feb 2021 10:01:17 -0800 Subject: [PATCH 10/22] Fixup GitLab test. --- src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java b/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java index 9e122ac..d19480e 100644 --- a/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java +++ b/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java @@ -33,11 +33,10 @@ private void settingsGithub(String tag, String... extra) throws IOException { private void settingsGitlab(String tag, String... extra) throws IOException { write("settings.gradle", "plugins { id 'com.diffplug.blowdryerSetup' }", - "blowdryerSetup { gitlab('https://gitlab.com', 'vgropp/blowdryer-test', 'tag', '" + tag + "') }", + "blowdryerSetup { gitlab('vgropp/blowdryer-test', 'tag', '" + tag + "') }", Arrays.stream(extra).collect(Collectors.joining("\n"))); } - @Test public void githubTag() throws IOException { settingsGithub("test/2/a"); From 9e3967c0deddde314042f9f38d4a0e9a767bf5fd Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Fri, 5 Feb 2021 10:05:32 -0800 Subject: [PATCH 11/22] Minor fixup. --- .../java/com/diffplug/blowdryer/BlowdryerSetup.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java index f839c85..3a4f3aa 100644 --- a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java +++ b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java @@ -72,10 +72,8 @@ public class GitHub { private @Nullable String authToken; private GitHub(String repoOrg, String anchor) { - assertNoLeadingOrTrailingSlash(repoOrg); - assertNoLeadingOrTrailingSlash(anchor); - this.repoOrg = repoOrg; - this.anchor = anchor; + this.repoOrg = assertNoLeadingOrTrailingSlash(repoOrg); + this.anchor = assertNoLeadingOrTrailingSlash(anchor); setGlobals(); } @@ -114,10 +112,8 @@ public class GitLab { private String protocol, host; private GitLab(String repoOrg, String anchor) { - assertNoLeadingOrTrailingSlash(repoOrg); - assertNoLeadingOrTrailingSlash(anchor); - this.repoOrg = repoOrg; - this.anchor = anchor; + this.repoOrg = assertNoLeadingOrTrailingSlash(repoOrg); + this.anchor = assertNoLeadingOrTrailingSlash(anchor); customDomainHttps(GITLAB_HOST); } From 9bcddffd0e241015cf94cb63f0346c498f96475f Mon Sep 17 00:00:00 2001 From: Volker Gropp Date: Sun, 7 Feb 2021 13:06:21 +0100 Subject: [PATCH 12/22] extract authToken Support to interface --- CHANGELOG.md | 2 + .../diffplug/blowdryer/BlowdryerSetup.java | 80 +++++++++---------- .../blowdryer/BlowdryerPluginAuthTest.java | 73 +++++++++++++++++ .../blowdryer/BlowdryerPluginTest.java | 66 +++++++++++++++ 4 files changed, 179 insertions(+), 42 deletions(-) create mode 100644 src/test/java/com/diffplug/blowdryer/BlowdryerPluginAuthTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index f9d7f0d..02273d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] - Support for gitlab public repo #13 +- Support for gitlab custom host for self hosted +- Support for Token based Authorization for gitlab and github private repositories #14 ## [1.0.0] - 2020-01-09 diff --git a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java index 3a4f3aa..c9e1a34 100644 --- a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java +++ b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java @@ -23,7 +23,6 @@ import java.net.URLEncoder; import java.util.Objects; import java.util.function.Function; -import javax.annotation.Nullable; import org.jetbrains.annotations.NotNull; /** Configures where {@link Blowdryer#file(String)} downloads files from. */ @@ -60,42 +59,51 @@ public enum GitAnchorType { TAG, COMMIT, TREE } + public interface AuthTokenSupport { + /** + * leading part of the URL which has to match to add the Authorization header + * @return leading part of the URL which matches the host and repo + */ + String getRepoUrl(); + + default void setupAuthToken(String authToken) { + if (authToken != null) { + Blowdryer.setAuthPlugin((url, builder) -> { + if (url.startsWith(getRepoUrl())) { + builder.addHeader("Authorization", "Bearer " + authToken); + } + return builder; + }); + } else { + Blowdryer.setAuthPlugin(null); + } + } + } + /** Sets the source where we will grab these scripts. */ public GitHub github(String repoOrg, GitAnchorType anchorType, String anchor) { // anchorType isn't used right now, but makes it easier to read what "anchor" is return new GitHub(repoOrg, anchor); } - public class GitHub { + public class GitHub implements AuthTokenSupport { private String repoOrg; private String anchor; - private @Nullable String authToken; private GitHub(String repoOrg, String anchor) { this.repoOrg = assertNoLeadingOrTrailingSlash(repoOrg); this.anchor = assertNoLeadingOrTrailingSlash(anchor); - setGlobals(); + Blowdryer.setResourcePlugin(resource -> getRepoUrl() + getFullResourcePath(resource)); } public GitHub authToken(String authToken) { - this.authToken = authToken; - return setGlobals(); + setupAuthToken(authToken); + return this; } - private GitHub setGlobals() { - String root = "https://" + GITHUB_HOST + "/" + repoOrg + "/" + anchor + "/"; - Blowdryer.setResourcePlugin(resource -> root + getFullResourcePath(resource)); - if (authToken != null) { - Blowdryer.setAuthPlugin((url, builder) -> { - if (url.startsWith(root)) { - builder.addHeader("Authorization", "Bearer " + authToken); - } - return builder; - }); - } else { - Blowdryer.setAuthPlugin(null); - } - return this; + @Override + public String getRepoUrl() { + return "https://" + GITHUB_HOST + "/" + repoOrg + "/" + anchor + "/"; } } @@ -105,21 +113,21 @@ public GitLab gitlab(String repoOrg, GitAnchorType anchorType, String anchor) { return new GitLab(repoOrg, anchor); } - public class GitLab { + public class GitLab implements AuthTokenSupport { private String repoOrg; - private String anchor; - private @Nullable String authToken; + private String protocol, host; private GitLab(String repoOrg, String anchor) { this.repoOrg = assertNoLeadingOrTrailingSlash(repoOrg); - this.anchor = assertNoLeadingOrTrailingSlash(anchor); + String urlEnd = "/raw?ref=" + encodeUrlPart(assertNoLeadingOrTrailingSlash(anchor)); customDomainHttps(GITLAB_HOST); + Blowdryer.setResourcePlugin(resource -> getRepoUrl() + encodeUrlPart(getFullResourcePath(resource)) + urlEnd); } public GitLab authToken(String authToken) { - this.authToken = authToken; - return setGlobals(); + setupAuthToken(authToken); + return this; } public GitLab customDomainHttp(String domain) { @@ -133,24 +141,12 @@ public GitLab customDomainHttps(String domain) { private GitLab customProtocolAndDomain(String protocol, String domain) { this.protocol = protocol; this.host = domain; - return setGlobals(); + return this; } - private GitLab setGlobals() { - String urlStart = protocol + host + "/api/v4/projects/" + encodeUrlPart(repoOrg) + "/repository/files/"; - String urlEnd = "/raw?ref=" + encodeUrlPart(anchor); - Blowdryer.setResourcePlugin(resource -> urlStart + encodeUrlPart(getFullResourcePath(resource)) + urlEnd); - if (authToken != null) { - Blowdryer.setAuthPlugin((url, builder) -> { - if (url.startsWith(urlStart)) { - builder.addHeader("Authorization", "Bearer " + authToken); - } - return builder; - }); - } else { - Blowdryer.setAuthPlugin(null); - } - return this; + @NotNull + public String getRepoUrl() { + return protocol + host + "/api/v4/projects/" + encodeUrlPart(repoOrg) + "/repository/files/"; } } diff --git a/src/test/java/com/diffplug/blowdryer/BlowdryerPluginAuthTest.java b/src/test/java/com/diffplug/blowdryer/BlowdryerPluginAuthTest.java new file mode 100644 index 0000000..81ff869 --- /dev/null +++ b/src/test/java/com/diffplug/blowdryer/BlowdryerPluginAuthTest.java @@ -0,0 +1,73 @@ +/* + * Copyright 2020 DiffPlug + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.diffplug.blowdryer; + + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.Arrays; +import java.util.stream.Collectors; +import org.junit.Ignore; +import org.junit.Test; + +@Ignore("has to be filled with prvate tokens and repos") +public class BlowdryerPluginAuthTest extends GradleHarness { + + private void settingsGitlabAuth(String tag, String... extra) throws IOException { + write("settings.gradle", + "plugins { id 'com.diffplug.blowdryerSetup' }", + "blowdryerSetup { repoSubfolder(''); " + + "gitlab('private/repo', 'tag', '" + tag + "').authToken('foobar');" + + " }", + Arrays.stream(extra).collect(Collectors.joining("\n"))); + } + + private void settingsGithubAuth(String tag, String... extra) throws IOException { + write("settings.gradle", + "plugins { id 'com.diffplug.blowdryerSetup' }", + "blowdryerSetup { github('private/repo', 'tag', '" + tag + "').authToken('foobar');" + + " }", + Arrays.stream(extra).collect(Collectors.joining("\n"))); + } + + @Test + public void githubAuthTag() throws IOException { + settingsGithubAuth("master"); + write("build.gradle", + "apply plugin: 'com.diffplug.blowdryer'", + "assert 干.file('sample').text == 'a'"); + gradleRunner().build(); + } + + @Test + public void gitlabAuthTag() throws IOException { + settingsGitlabAuth("init-test-for-auth"); + write("build.gradle", + "apply plugin: 'com.diffplug.blowdryer'", + "assert 干.file('sample').text == 'a'"); + gradleRunner().build(); + } + + /** Writes the given content to the given path. */ + protected File write(String path, String... lines) throws IOException { + File file = file(path); + file.getParentFile().mkdirs(); + Files.write(file.toPath(), Arrays.asList(lines), StandardCharsets.UTF_8); + return file; + } +} diff --git a/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java b/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java index d19480e..6b2313e 100644 --- a/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java +++ b/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java @@ -37,6 +37,20 @@ private void settingsGitlab(String tag, String... extra) throws IOException { Arrays.stream(extra).collect(Collectors.joining("\n"))); } + private void settingsCustomGitlab(String tag, String... extra) throws IOException { + write("settings.gradle", + "plugins { id 'com.diffplug.blowdryerSetup' }", + "blowdryerSetup { gitlab('vgropp/blowdryer-test', 'tag', '" + tag + "').customDomainHttps('gitlab.com') }", + Arrays.stream(extra).collect(Collectors.joining("\n"))); + } + + private void settingsGitlabRootFolder(String tag, String... extra) throws IOException { + write("settings.gradle", + "plugins { id 'com.diffplug.blowdryerSetup' }", + "blowdryerSetup { repoSubfolder(''); gitlab('vgropp/blowdryer-test', 'tag', '" + tag + "') }", + Arrays.stream(extra).collect(Collectors.joining("\n"))); + } + @Test public void githubTag() throws IOException { settingsGithub("test/2/a"); @@ -89,6 +103,58 @@ public void gitlabTag() throws IOException { gradleRunner().buildAndFail(); } + @Test + public void customGitlabTag() throws IOException { + settingsCustomGitlab("test/2/a"); + write("build.gradle", + "apply plugin: 'com.diffplug.blowdryer'", + "assert 干.file('sample').text == 'a'", + "assert 干.prop('sample', 'name') == 'test'", + "assert 干.prop('sample', 'ver_spotless') == '1.2.0'"); + gradleRunner().build(); + + settingsCustomGitlab("test/2/b"); + write("build.gradle", + "apply plugin: 'com.diffplug.blowdryer'", + "assert 干.file('sample').text == 'b'", + "assert 干.prop('sample', 'name') == 'testB'", + "assert 干.prop('sample', 'group') == 'com.diffplug.gradleB'"); + gradleRunner().build(); + + // double-check that failures do fail + settingsCustomGitlab("test/2/b"); + write("build.gradle", + "plugins { id 'com.diffplug.blowdryer' }", + "assert Blowdryer.file('sample').text == 'a'"); + gradleRunner().buildAndFail(); + } + + @Test + public void rootfolderGitlabTag() throws IOException { + settingsGitlabRootFolder("test/2/a"); + write("build.gradle", + "apply plugin: 'com.diffplug.blowdryer'", + "assert 干.file('src/main/resources/sample').text == 'a'", + "assert 干.prop('src/main/resources/sample', 'name') == 'test'", + "assert 干.prop('src/main/resources/sample', 'ver_spotless') == '1.2.0'"); + gradleRunner().build(); + + settingsGitlabRootFolder("test/2/b"); + write("build.gradle", + "apply plugin: 'com.diffplug.blowdryer'", + "assert 干.file('src/main/resources/sample').text == 'b'", + "assert 干.prop('src/main/resources/sample', 'name') == 'testB'", + "assert 干.prop('src/main/resources/sample', 'group') == 'com.diffplug.gradleB'"); + gradleRunner().build(); + + // double-check that failures do fail + settingsGitlabRootFolder("test/2/b"); + write("build.gradle", + "plugins { id 'com.diffplug.blowdryer' }", + "assert Blowdryer.file('src/main/resources/sample').text == 'a'"); + gradleRunner().buildAndFail(); + } + @Test public void devLocal() throws IOException { write("../blowdryer-script/src/main/resources/sample", "c"); From 98a19e23159c59457bc1ca23bea150989a0383d4 Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Mon, 8 Feb 2021 10:55:09 -0800 Subject: [PATCH 13/22] Revert "extract authToken Support to interface" This reverts commit 9bcddffd0e241015cf94cb63f0346c498f96475f. --- CHANGELOG.md | 2 - .../diffplug/blowdryer/BlowdryerSetup.java | 80 ++++++++++--------- .../blowdryer/BlowdryerPluginAuthTest.java | 73 ----------------- .../blowdryer/BlowdryerPluginTest.java | 66 --------------- 4 files changed, 42 insertions(+), 179 deletions(-) delete mode 100644 src/test/java/com/diffplug/blowdryer/BlowdryerPluginAuthTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 02273d6..f9d7f0d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] - Support for gitlab public repo #13 -- Support for gitlab custom host for self hosted -- Support for Token based Authorization for gitlab and github private repositories #14 ## [1.0.0] - 2020-01-09 diff --git a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java index c9e1a34..3a4f3aa 100644 --- a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java +++ b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java @@ -23,6 +23,7 @@ import java.net.URLEncoder; import java.util.Objects; import java.util.function.Function; +import javax.annotation.Nullable; import org.jetbrains.annotations.NotNull; /** Configures where {@link Blowdryer#file(String)} downloads files from. */ @@ -59,51 +60,42 @@ public enum GitAnchorType { TAG, COMMIT, TREE } - public interface AuthTokenSupport { - /** - * leading part of the URL which has to match to add the Authorization header - * @return leading part of the URL which matches the host and repo - */ - String getRepoUrl(); - - default void setupAuthToken(String authToken) { - if (authToken != null) { - Blowdryer.setAuthPlugin((url, builder) -> { - if (url.startsWith(getRepoUrl())) { - builder.addHeader("Authorization", "Bearer " + authToken); - } - return builder; - }); - } else { - Blowdryer.setAuthPlugin(null); - } - } - } - /** Sets the source where we will grab these scripts. */ public GitHub github(String repoOrg, GitAnchorType anchorType, String anchor) { // anchorType isn't used right now, but makes it easier to read what "anchor" is return new GitHub(repoOrg, anchor); } - public class GitHub implements AuthTokenSupport { + public class GitHub { private String repoOrg; private String anchor; + private @Nullable String authToken; private GitHub(String repoOrg, String anchor) { this.repoOrg = assertNoLeadingOrTrailingSlash(repoOrg); this.anchor = assertNoLeadingOrTrailingSlash(anchor); - Blowdryer.setResourcePlugin(resource -> getRepoUrl() + getFullResourcePath(resource)); + setGlobals(); } public GitHub authToken(String authToken) { - setupAuthToken(authToken); - return this; + this.authToken = authToken; + return setGlobals(); } - @Override - public String getRepoUrl() { - return "https://" + GITHUB_HOST + "/" + repoOrg + "/" + anchor + "/"; + private GitHub setGlobals() { + String root = "https://" + GITHUB_HOST + "/" + repoOrg + "/" + anchor + "/"; + Blowdryer.setResourcePlugin(resource -> root + getFullResourcePath(resource)); + if (authToken != null) { + Blowdryer.setAuthPlugin((url, builder) -> { + if (url.startsWith(root)) { + builder.addHeader("Authorization", "Bearer " + authToken); + } + return builder; + }); + } else { + Blowdryer.setAuthPlugin(null); + } + return this; } } @@ -113,21 +105,21 @@ public GitLab gitlab(String repoOrg, GitAnchorType anchorType, String anchor) { return new GitLab(repoOrg, anchor); } - public class GitLab implements AuthTokenSupport { + public class GitLab { private String repoOrg; - + private String anchor; + private @Nullable String authToken; private String protocol, host; private GitLab(String repoOrg, String anchor) { this.repoOrg = assertNoLeadingOrTrailingSlash(repoOrg); - String urlEnd = "/raw?ref=" + encodeUrlPart(assertNoLeadingOrTrailingSlash(anchor)); + this.anchor = assertNoLeadingOrTrailingSlash(anchor); customDomainHttps(GITLAB_HOST); - Blowdryer.setResourcePlugin(resource -> getRepoUrl() + encodeUrlPart(getFullResourcePath(resource)) + urlEnd); } public GitLab authToken(String authToken) { - setupAuthToken(authToken); - return this; + this.authToken = authToken; + return setGlobals(); } public GitLab customDomainHttp(String domain) { @@ -141,12 +133,24 @@ public GitLab customDomainHttps(String domain) { private GitLab customProtocolAndDomain(String protocol, String domain) { this.protocol = protocol; this.host = domain; - return this; + return setGlobals(); } - @NotNull - public String getRepoUrl() { - return protocol + host + "/api/v4/projects/" + encodeUrlPart(repoOrg) + "/repository/files/"; + private GitLab setGlobals() { + String urlStart = protocol + host + "/api/v4/projects/" + encodeUrlPart(repoOrg) + "/repository/files/"; + String urlEnd = "/raw?ref=" + encodeUrlPart(anchor); + Blowdryer.setResourcePlugin(resource -> urlStart + encodeUrlPart(getFullResourcePath(resource)) + urlEnd); + if (authToken != null) { + Blowdryer.setAuthPlugin((url, builder) -> { + if (url.startsWith(urlStart)) { + builder.addHeader("Authorization", "Bearer " + authToken); + } + return builder; + }); + } else { + Blowdryer.setAuthPlugin(null); + } + return this; } } diff --git a/src/test/java/com/diffplug/blowdryer/BlowdryerPluginAuthTest.java b/src/test/java/com/diffplug/blowdryer/BlowdryerPluginAuthTest.java deleted file mode 100644 index 81ff869..0000000 --- a/src/test/java/com/diffplug/blowdryer/BlowdryerPluginAuthTest.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2020 DiffPlug - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.diffplug.blowdryer; - - -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.util.Arrays; -import java.util.stream.Collectors; -import org.junit.Ignore; -import org.junit.Test; - -@Ignore("has to be filled with prvate tokens and repos") -public class BlowdryerPluginAuthTest extends GradleHarness { - - private void settingsGitlabAuth(String tag, String... extra) throws IOException { - write("settings.gradle", - "plugins { id 'com.diffplug.blowdryerSetup' }", - "blowdryerSetup { repoSubfolder(''); " - + "gitlab('private/repo', 'tag', '" + tag + "').authToken('foobar');" - + " }", - Arrays.stream(extra).collect(Collectors.joining("\n"))); - } - - private void settingsGithubAuth(String tag, String... extra) throws IOException { - write("settings.gradle", - "plugins { id 'com.diffplug.blowdryerSetup' }", - "blowdryerSetup { github('private/repo', 'tag', '" + tag + "').authToken('foobar');" - + " }", - Arrays.stream(extra).collect(Collectors.joining("\n"))); - } - - @Test - public void githubAuthTag() throws IOException { - settingsGithubAuth("master"); - write("build.gradle", - "apply plugin: 'com.diffplug.blowdryer'", - "assert 干.file('sample').text == 'a'"); - gradleRunner().build(); - } - - @Test - public void gitlabAuthTag() throws IOException { - settingsGitlabAuth("init-test-for-auth"); - write("build.gradle", - "apply plugin: 'com.diffplug.blowdryer'", - "assert 干.file('sample').text == 'a'"); - gradleRunner().build(); - } - - /** Writes the given content to the given path. */ - protected File write(String path, String... lines) throws IOException { - File file = file(path); - file.getParentFile().mkdirs(); - Files.write(file.toPath(), Arrays.asList(lines), StandardCharsets.UTF_8); - return file; - } -} diff --git a/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java b/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java index 6b2313e..d19480e 100644 --- a/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java +++ b/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java @@ -37,20 +37,6 @@ private void settingsGitlab(String tag, String... extra) throws IOException { Arrays.stream(extra).collect(Collectors.joining("\n"))); } - private void settingsCustomGitlab(String tag, String... extra) throws IOException { - write("settings.gradle", - "plugins { id 'com.diffplug.blowdryerSetup' }", - "blowdryerSetup { gitlab('vgropp/blowdryer-test', 'tag', '" + tag + "').customDomainHttps('gitlab.com') }", - Arrays.stream(extra).collect(Collectors.joining("\n"))); - } - - private void settingsGitlabRootFolder(String tag, String... extra) throws IOException { - write("settings.gradle", - "plugins { id 'com.diffplug.blowdryerSetup' }", - "blowdryerSetup { repoSubfolder(''); gitlab('vgropp/blowdryer-test', 'tag', '" + tag + "') }", - Arrays.stream(extra).collect(Collectors.joining("\n"))); - } - @Test public void githubTag() throws IOException { settingsGithub("test/2/a"); @@ -103,58 +89,6 @@ public void gitlabTag() throws IOException { gradleRunner().buildAndFail(); } - @Test - public void customGitlabTag() throws IOException { - settingsCustomGitlab("test/2/a"); - write("build.gradle", - "apply plugin: 'com.diffplug.blowdryer'", - "assert 干.file('sample').text == 'a'", - "assert 干.prop('sample', 'name') == 'test'", - "assert 干.prop('sample', 'ver_spotless') == '1.2.0'"); - gradleRunner().build(); - - settingsCustomGitlab("test/2/b"); - write("build.gradle", - "apply plugin: 'com.diffplug.blowdryer'", - "assert 干.file('sample').text == 'b'", - "assert 干.prop('sample', 'name') == 'testB'", - "assert 干.prop('sample', 'group') == 'com.diffplug.gradleB'"); - gradleRunner().build(); - - // double-check that failures do fail - settingsCustomGitlab("test/2/b"); - write("build.gradle", - "plugins { id 'com.diffplug.blowdryer' }", - "assert Blowdryer.file('sample').text == 'a'"); - gradleRunner().buildAndFail(); - } - - @Test - public void rootfolderGitlabTag() throws IOException { - settingsGitlabRootFolder("test/2/a"); - write("build.gradle", - "apply plugin: 'com.diffplug.blowdryer'", - "assert 干.file('src/main/resources/sample').text == 'a'", - "assert 干.prop('src/main/resources/sample', 'name') == 'test'", - "assert 干.prop('src/main/resources/sample', 'ver_spotless') == '1.2.0'"); - gradleRunner().build(); - - settingsGitlabRootFolder("test/2/b"); - write("build.gradle", - "apply plugin: 'com.diffplug.blowdryer'", - "assert 干.file('src/main/resources/sample').text == 'b'", - "assert 干.prop('src/main/resources/sample', 'name') == 'testB'", - "assert 干.prop('src/main/resources/sample', 'group') == 'com.diffplug.gradleB'"); - gradleRunner().build(); - - // double-check that failures do fail - settingsGitlabRootFolder("test/2/b"); - write("build.gradle", - "plugins { id 'com.diffplug.blowdryer' }", - "assert Blowdryer.file('src/main/resources/sample').text == 'a'"); - gradleRunner().buildAndFail(); - } - @Test public void devLocal() throws IOException { write("../blowdryer-script/src/main/resources/sample", "c"); From b2c7f351e01c30ee30c6aa4ac8ab4de62787ce81 Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Mon, 8 Feb 2021 10:48:36 -0800 Subject: [PATCH 14/22] Rework the "assertPluginNotSet()" state management for the fluent configurator. --- .../com/diffplug/blowdryer/Blowdryer.java | 20 ++++++---- .../diffplug/blowdryer/BlowdryerSetup.java | 38 ++++++++----------- 2 files changed, 28 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/diffplug/blowdryer/Blowdryer.java b/src/main/java/com/diffplug/blowdryer/Blowdryer.java index de4723f..dfa86de 100644 --- a/src/main/java/com/diffplug/blowdryer/Blowdryer.java +++ b/src/main/java/com/diffplug/blowdryer/Blowdryer.java @@ -186,16 +186,26 @@ static void assertPluginNotSet(String errorMessage) { } } + static void assertPluginNotSet() { + assertPluginNotSet("You already initialized the `blowdryer` plugin, you can't do this twice."); + } + static void setResourcePluginNull() { synchronized (Blowdryer.class) { Blowdryer.plugin = null; + Blowdryer.authPlugin = authPluginNone; } } static void setResourcePlugin(ResourcePlugin plugin) { + setResourcePlugin(plugin, null); + } + + static void setResourcePlugin(ResourcePlugin plugin, AuthPlugin authPlugin) { synchronized (Blowdryer.class) { - assertPluginNotSet("You already initialized the `blowdryer` plugin, you can't do this twice."); + assertPluginNotSet(); Blowdryer.plugin = plugin; + Blowdryer.authPlugin = authPlugin == null ? authPluginNone : authPlugin; } } @@ -209,15 +219,9 @@ static interface AuthPlugin { Request.Builder addAuthToken(String url, Request.Builder builder) throws MalformedURLException; } - private static final AuthPlugin authPluginNone = (url, builder) -> builder;; + private static final AuthPlugin authPluginNone = (url, builder) -> builder; private static AuthPlugin authPlugin = authPluginNone; - public static void setAuthPlugin(AuthPlugin authPlugin) { - synchronized (Blowdryer.class) { - Blowdryer.authPlugin = authPlugin == null ? authPluginNone : authPlugin; - } - } - /** Returns the given resource as a File (as configured by {@link BlowdryerSetup}. */ public static File file(String resourcePath) { synchronized (Blowdryer.class) { diff --git a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java index 3a4f3aa..b78f04b 100644 --- a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java +++ b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java @@ -72,6 +72,7 @@ public class GitHub { private @Nullable String authToken; private GitHub(String repoOrg, String anchor) { + Blowdryer.assertPluginNotSet(); this.repoOrg = assertNoLeadingOrTrailingSlash(repoOrg); this.anchor = assertNoLeadingOrTrailingSlash(anchor); setGlobals(); @@ -83,18 +84,14 @@ public GitHub authToken(String authToken) { } private GitHub setGlobals() { + Blowdryer.setResourcePluginNull(); String root = "https://" + GITHUB_HOST + "/" + repoOrg + "/" + anchor + "/"; - Blowdryer.setResourcePlugin(resource -> root + getFullResourcePath(resource)); - if (authToken != null) { - Blowdryer.setAuthPlugin((url, builder) -> { - if (url.startsWith(root)) { - builder.addHeader("Authorization", "Bearer " + authToken); - } - return builder; - }); - } else { - Blowdryer.setAuthPlugin(null); - } + Blowdryer.setResourcePlugin(resource -> root + getFullResourcePath(resource), authToken == null ? null : (url, builder) -> { + if (url.startsWith(root)) { + builder.addHeader("Authorization", "Bearer " + authToken); + } + return builder; + }); return this; } } @@ -112,6 +109,7 @@ public class GitLab { private String protocol, host; private GitLab(String repoOrg, String anchor) { + Blowdryer.assertPluginNotSet(); this.repoOrg = assertNoLeadingOrTrailingSlash(repoOrg); this.anchor = assertNoLeadingOrTrailingSlash(anchor); customDomainHttps(GITLAB_HOST); @@ -137,19 +135,15 @@ private GitLab customProtocolAndDomain(String protocol, String domain) { } private GitLab setGlobals() { + Blowdryer.setResourcePluginNull(); String urlStart = protocol + host + "/api/v4/projects/" + encodeUrlPart(repoOrg) + "/repository/files/"; String urlEnd = "/raw?ref=" + encodeUrlPart(anchor); - Blowdryer.setResourcePlugin(resource -> urlStart + encodeUrlPart(getFullResourcePath(resource)) + urlEnd); - if (authToken != null) { - Blowdryer.setAuthPlugin((url, builder) -> { - if (url.startsWith(urlStart)) { - builder.addHeader("Authorization", "Bearer " + authToken); - } - return builder; - }); - } else { - Blowdryer.setAuthPlugin(null); - } + Blowdryer.setResourcePlugin(resource -> urlStart + encodeUrlPart(getFullResourcePath(resource)) + urlEnd, authToken == null ? null : (url, builder) -> { + if (url.startsWith(urlStart)) { + builder.addHeader("Authorization", "Bearer " + authToken); + } + return builder; + }); return this; } } From f3edc220cf97aa1c413473dc1d8aeb778a12ff5d Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Mon, 8 Feb 2021 10:51:29 -0800 Subject: [PATCH 15/22] AuthPlugin ought to return void, because `Request.Builder` is mutable, so we weren't really functional anyway. --- src/main/java/com/diffplug/blowdryer/Blowdryer.java | 9 +++++---- src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java | 2 -- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/diffplug/blowdryer/Blowdryer.java b/src/main/java/com/diffplug/blowdryer/Blowdryer.java index dfa86de..a08eb25 100644 --- a/src/main/java/com/diffplug/blowdryer/Blowdryer.java +++ b/src/main/java/com/diffplug/blowdryer/Blowdryer.java @@ -133,8 +133,9 @@ private static Map loadPropertyFile(File file) throws IOExceptio private static void download(String url, File dst) throws IOException { OkHttpClient client = new OkHttpClient.Builder().build(); - Request req = authPlugin.addAuthToken(url, new Request.Builder().url(url)).build(); - try (Response response = client.newCall(req).execute()) { + Request.Builder req = new Request.Builder().url(url); + authPlugin.addAuthToken(url, req); + try (Response response = client.newCall(req.build()).execute()) { if (!response.isSuccessful()) { throw new IllegalArgumentException(url + "\nreceived http code " + response.code() + "\n" + response.body().string()); } @@ -216,10 +217,10 @@ private static void assertInitialized() { } static interface AuthPlugin { - Request.Builder addAuthToken(String url, Request.Builder builder) throws MalformedURLException; + void addAuthToken(String url, Request.Builder builder) throws MalformedURLException; } - private static final AuthPlugin authPluginNone = (url, builder) -> builder; + private static final AuthPlugin authPluginNone = (url, builder) -> {}; private static AuthPlugin authPlugin = authPluginNone; /** Returns the given resource as a File (as configured by {@link BlowdryerSetup}. */ diff --git a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java index b78f04b..30f8259 100644 --- a/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java +++ b/src/main/java/com/diffplug/blowdryer/BlowdryerSetup.java @@ -90,7 +90,6 @@ private GitHub setGlobals() { if (url.startsWith(root)) { builder.addHeader("Authorization", "Bearer " + authToken); } - return builder; }); return this; } @@ -142,7 +141,6 @@ private GitLab setGlobals() { if (url.startsWith(urlStart)) { builder.addHeader("Authorization", "Bearer " + authToken); } - return builder; }); return this; } From d4717dbbb445d1c414d10b6036867caf5727d562 Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Fri, 12 Feb 2021 10:13:23 -0800 Subject: [PATCH 16/22] Update changelog. --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f9d7f0d..960cccc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,9 +5,12 @@ 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] -- Support for gitlab public repo #13 +### Added +- Support for GitLab, self-hosted and `gitlab.com` ([#18](https://github.com/diffplug/blowdryer/pull/18)). +- Support for private GitHub and GitLab script repositories via auth tokens ([#18](https://github.com/diffplug/blowdryer/pull/18)). ## [1.0.0] - 2020-01-09 +Same as `0.2.0`, just committing to API back-compat from here. ## [0.2.0] - 2020-01-09 ### Added From a85a5e9f2bca2bdd0d17cf5bd3bd14c3752854ab Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Fri, 12 Feb 2021 10:13:38 -0800 Subject: [PATCH 17/22] Remove the ben-manes.versions plugin. --- build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/build.gradle b/build.gradle index 05d58cb..9d7eab2 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,6 @@ plugins { id 'com.diffplug.blowdryer' id 'com.diffplug.gradle.spotless' id 'com.diffplug.spotless-changelog' - id 'com.github.ben-manes.versions' id 'com.gradle.plugin-publish' id 'com.jfrog.bintray' } From 938daaf736ef9fef09e6f81660e02481d5ceeee3 Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Fri, 12 Feb 2021 10:14:16 -0800 Subject: [PATCH 18/22] Re-add the tests that @vgropp added which I accidentally reverted. --- .../blowdryer/BlowdryerPluginAuthTest.java | 73 +++++++++++++++++++ .../blowdryer/BlowdryerPluginTest.java | 66 +++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 src/test/java/com/diffplug/blowdryer/BlowdryerPluginAuthTest.java diff --git a/src/test/java/com/diffplug/blowdryer/BlowdryerPluginAuthTest.java b/src/test/java/com/diffplug/blowdryer/BlowdryerPluginAuthTest.java new file mode 100644 index 0000000..81ff869 --- /dev/null +++ b/src/test/java/com/diffplug/blowdryer/BlowdryerPluginAuthTest.java @@ -0,0 +1,73 @@ +/* + * Copyright 2020 DiffPlug + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.diffplug.blowdryer; + + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.Arrays; +import java.util.stream.Collectors; +import org.junit.Ignore; +import org.junit.Test; + +@Ignore("has to be filled with prvate tokens and repos") +public class BlowdryerPluginAuthTest extends GradleHarness { + + private void settingsGitlabAuth(String tag, String... extra) throws IOException { + write("settings.gradle", + "plugins { id 'com.diffplug.blowdryerSetup' }", + "blowdryerSetup { repoSubfolder(''); " + + "gitlab('private/repo', 'tag', '" + tag + "').authToken('foobar');" + + " }", + Arrays.stream(extra).collect(Collectors.joining("\n"))); + } + + private void settingsGithubAuth(String tag, String... extra) throws IOException { + write("settings.gradle", + "plugins { id 'com.diffplug.blowdryerSetup' }", + "blowdryerSetup { github('private/repo', 'tag', '" + tag + "').authToken('foobar');" + + " }", + Arrays.stream(extra).collect(Collectors.joining("\n"))); + } + + @Test + public void githubAuthTag() throws IOException { + settingsGithubAuth("master"); + write("build.gradle", + "apply plugin: 'com.diffplug.blowdryer'", + "assert 干.file('sample').text == 'a'"); + gradleRunner().build(); + } + + @Test + public void gitlabAuthTag() throws IOException { + settingsGitlabAuth("init-test-for-auth"); + write("build.gradle", + "apply plugin: 'com.diffplug.blowdryer'", + "assert 干.file('sample').text == 'a'"); + gradleRunner().build(); + } + + /** Writes the given content to the given path. */ + protected File write(String path, String... lines) throws IOException { + File file = file(path); + file.getParentFile().mkdirs(); + Files.write(file.toPath(), Arrays.asList(lines), StandardCharsets.UTF_8); + return file; + } +} diff --git a/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java b/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java index d19480e..6b2313e 100644 --- a/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java +++ b/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java @@ -37,6 +37,20 @@ private void settingsGitlab(String tag, String... extra) throws IOException { Arrays.stream(extra).collect(Collectors.joining("\n"))); } + private void settingsCustomGitlab(String tag, String... extra) throws IOException { + write("settings.gradle", + "plugins { id 'com.diffplug.blowdryerSetup' }", + "blowdryerSetup { gitlab('vgropp/blowdryer-test', 'tag', '" + tag + "').customDomainHttps('gitlab.com') }", + Arrays.stream(extra).collect(Collectors.joining("\n"))); + } + + private void settingsGitlabRootFolder(String tag, String... extra) throws IOException { + write("settings.gradle", + "plugins { id 'com.diffplug.blowdryerSetup' }", + "blowdryerSetup { repoSubfolder(''); gitlab('vgropp/blowdryer-test', 'tag', '" + tag + "') }", + Arrays.stream(extra).collect(Collectors.joining("\n"))); + } + @Test public void githubTag() throws IOException { settingsGithub("test/2/a"); @@ -89,6 +103,58 @@ public void gitlabTag() throws IOException { gradleRunner().buildAndFail(); } + @Test + public void customGitlabTag() throws IOException { + settingsCustomGitlab("test/2/a"); + write("build.gradle", + "apply plugin: 'com.diffplug.blowdryer'", + "assert 干.file('sample').text == 'a'", + "assert 干.prop('sample', 'name') == 'test'", + "assert 干.prop('sample', 'ver_spotless') == '1.2.0'"); + gradleRunner().build(); + + settingsCustomGitlab("test/2/b"); + write("build.gradle", + "apply plugin: 'com.diffplug.blowdryer'", + "assert 干.file('sample').text == 'b'", + "assert 干.prop('sample', 'name') == 'testB'", + "assert 干.prop('sample', 'group') == 'com.diffplug.gradleB'"); + gradleRunner().build(); + + // double-check that failures do fail + settingsCustomGitlab("test/2/b"); + write("build.gradle", + "plugins { id 'com.diffplug.blowdryer' }", + "assert Blowdryer.file('sample').text == 'a'"); + gradleRunner().buildAndFail(); + } + + @Test + public void rootfolderGitlabTag() throws IOException { + settingsGitlabRootFolder("test/2/a"); + write("build.gradle", + "apply plugin: 'com.diffplug.blowdryer'", + "assert 干.file('src/main/resources/sample').text == 'a'", + "assert 干.prop('src/main/resources/sample', 'name') == 'test'", + "assert 干.prop('src/main/resources/sample', 'ver_spotless') == '1.2.0'"); + gradleRunner().build(); + + settingsGitlabRootFolder("test/2/b"); + write("build.gradle", + "apply plugin: 'com.diffplug.blowdryer'", + "assert 干.file('src/main/resources/sample').text == 'b'", + "assert 干.prop('src/main/resources/sample', 'name') == 'testB'", + "assert 干.prop('src/main/resources/sample', 'group') == 'com.diffplug.gradleB'"); + gradleRunner().build(); + + // double-check that failures do fail + settingsGitlabRootFolder("test/2/b"); + write("build.gradle", + "plugins { id 'com.diffplug.blowdryer' }", + "assert Blowdryer.file('src/main/resources/sample').text == 'a'"); + gradleRunner().buildAndFail(); + } + @Test public void devLocal() throws IOException { write("../blowdryer-script/src/main/resources/sample", "c"); From 12b2bbad5d4229d0543848210f29200a79815c62 Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Fri, 12 Feb 2021 10:24:02 -0800 Subject: [PATCH 19/22] Add gradle wrapper validation. --- .github/workflows/gradle-wrapper-validation.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .github/workflows/gradle-wrapper-validation.yml diff --git a/.github/workflows/gradle-wrapper-validation.yml b/.github/workflows/gradle-wrapper-validation.yml new file mode 100644 index 0000000..b7256f2 --- /dev/null +++ b/.github/workflows/gradle-wrapper-validation.yml @@ -0,0 +1,10 @@ +name: "Validate Gradle Wrapper" +on: [push, pull_request] + +jobs: + validation: + name: "Validation" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: gradle/wrapper-validation-action@v1.0.3 From 0cee4e820f9ac33f62c9579ed1c6bff0cde15646 Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Fri, 12 Feb 2021 10:41:53 -0800 Subject: [PATCH 20/22] Replace vgropp test repo with diffplug test repo. --- .../java/com/diffplug/blowdryer/BlowdryerPluginTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java b/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java index 6b2313e..2ddb3da 100644 --- a/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java +++ b/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java @@ -33,21 +33,21 @@ private void settingsGithub(String tag, String... extra) throws IOException { private void settingsGitlab(String tag, String... extra) throws IOException { write("settings.gradle", "plugins { id 'com.diffplug.blowdryerSetup' }", - "blowdryerSetup { gitlab('vgropp/blowdryer-test', 'tag', '" + tag + "') }", + "blowdryerSetup { gitlab('diffplug/blowdryer-test', 'tag', '" + tag + "') }", Arrays.stream(extra).collect(Collectors.joining("\n"))); } private void settingsCustomGitlab(String tag, String... extra) throws IOException { write("settings.gradle", "plugins { id 'com.diffplug.blowdryerSetup' }", - "blowdryerSetup { gitlab('vgropp/blowdryer-test', 'tag', '" + tag + "').customDomainHttps('gitlab.com') }", + "blowdryerSetup { gitlab('diffplug/blowdryer-test', 'tag', '" + tag + "').customDomainHttps('gitlab.com') }", Arrays.stream(extra).collect(Collectors.joining("\n"))); } private void settingsGitlabRootFolder(String tag, String... extra) throws IOException { write("settings.gradle", "plugins { id 'com.diffplug.blowdryerSetup' }", - "blowdryerSetup { repoSubfolder(''); gitlab('vgropp/blowdryer-test', 'tag', '" + tag + "') }", + "blowdryerSetup { repoSubfolder(''); gitlab('diffplug/blowdryer-test', 'tag', '" + tag + "') }", Arrays.stream(extra).collect(Collectors.joining("\n"))); } From a2769d2fbfd2fa7c012f8861dc68abf6bde4cd03 Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Fri, 12 Feb 2021 11:46:54 -0800 Subject: [PATCH 21/22] Reduce the number of repositories to maintain. --- .../java/com/diffplug/blowdryer/BlowdryerPluginTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java b/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java index 2ddb3da..320c223 100644 --- a/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java +++ b/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java @@ -33,21 +33,21 @@ private void settingsGithub(String tag, String... extra) throws IOException { private void settingsGitlab(String tag, String... extra) throws IOException { write("settings.gradle", "plugins { id 'com.diffplug.blowdryerSetup' }", - "blowdryerSetup { gitlab('diffplug/blowdryer-test', 'tag', '" + tag + "') }", + "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", "plugins { id 'com.diffplug.blowdryerSetup' }", - "blowdryerSetup { gitlab('diffplug/blowdryer-test', 'tag', '" + tag + "').customDomainHttps('gitlab.com') }", + "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", "plugins { id 'com.diffplug.blowdryerSetup' }", - "blowdryerSetup { repoSubfolder(''); gitlab('diffplug/blowdryer-test', 'tag', '" + tag + "') }", + "blowdryerSetup { repoSubfolder(''); gitlab('diffplug/blowdryer', 'tag', '" + tag + "') }", Arrays.stream(extra).collect(Collectors.joining("\n"))); } From e50316f744a3b16fa0f688cbc6aa454c92ff7e88 Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Fri, 12 Feb 2021 11:49:30 -0800 Subject: [PATCH 22/22] Fix test on windows. --- src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java b/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java index 320c223..e477aca 100644 --- a/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java +++ b/src/test/java/com/diffplug/blowdryer/BlowdryerPluginTest.java @@ -166,7 +166,8 @@ public void devLocal() throws IOException { "blowdryerSetup { devLocal('../blowdryer-script') }"); write("build.gradle", "apply plugin: 'com.diffplug.blowdryer'", - "assert 干.file('sample').text == 'c\\n'", + // .replace('\\r', '') fixes test on windows + "assert 干.file('sample').text.replace('\\r', '') == 'c\\n'", "assert 干.prop('sample', 'name') == 'test'", "assert 干.prop('sample', 'group') == 'com.diffplug.gradle'"); gradleRunner().build();