From 512abc0f9f4fa011a2266b6c3c42eb0ec7d2d30b Mon Sep 17 00:00:00 2001
From: Mikhail Yakushin <driver733@gmail.com>
Date: Thu, 26 Mar 2020 19:33:11 +0300
Subject: [PATCH] feat(gradle): gradle-wrapper url is now inferred from the
 distributionUrl from the gradle-wrapper.properties (#5786)

Signed-off-by: Mikhail Yakushin <driver733@gmail.com>

Co-authored-by: Michael Kriese <michael.kriese@visualon.de>
---
 ...wrapper-custom-distribution-url.properties |  7 +++++++
 .../__snapshots__/update.spec.ts.snap         | 11 ++++++++++
 lib/manager/gradle-wrapper/search.ts          |  2 ++
 lib/manager/gradle-wrapper/update.spec.ts     | 21 +++++++++++++++++++
 lib/manager/gradle-wrapper/update.ts          | 11 ++++++++--
 5 files changed, 50 insertions(+), 2 deletions(-)
 create mode 100644 lib/manager/gradle-wrapper/__fixtures__/gradle-wrapper-custom-distribution-url.properties

diff --git a/lib/manager/gradle-wrapper/__fixtures__/gradle-wrapper-custom-distribution-url.properties b/lib/manager/gradle-wrapper/__fixtures__/gradle-wrapper-custom-distribution-url.properties
new file mode 100644
index 0000000000..9953c8e108
--- /dev/null
+++ b/lib/manager/gradle-wrapper/__fixtures__/gradle-wrapper-custom-distribution-url.properties
@@ -0,0 +1,7 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+# @See https://gradle.org/releases/
+distributionUrl=https\://artifactory/gradle-wrapper-cache/distributions/gradle-4.8-bin.zip
+distributionSha256Sum=336b6898b491f6334502d8074a6b8c2d73ed83b92123106bd4bf837f04111043
diff --git a/lib/manager/gradle-wrapper/__snapshots__/update.spec.ts.snap b/lib/manager/gradle-wrapper/__snapshots__/update.spec.ts.snap
index c79a1881ce..576ae8c81a 100644
--- a/lib/manager/gradle-wrapper/__snapshots__/update.spec.ts.snap
+++ b/lib/manager/gradle-wrapper/__snapshots__/update.spec.ts.snap
@@ -1,5 +1,16 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
+exports[`manager/gradle-wrapper/update updateDependency replaces existing value (custom distributionUrl) 1`] = `
+"distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+# @See https://gradle.org/releases/
+distributionUrl=https\\\\://artifactory/gradle-wrapper-cache/distributions/gradle-5.0-bin.zip
+distributionSha256Sum=17847c8e12b2bcfce26a79f425f082c31d4ded822f99a66127eee2d96bf18216
+"
+`;
+
 exports[`manager/gradle-wrapper/update updateDependency replaces existing value 1`] = `
 "distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
diff --git a/lib/manager/gradle-wrapper/search.ts b/lib/manager/gradle-wrapper/search.ts
index d046f3e2d1..2470a71db7 100644
--- a/lib/manager/gradle-wrapper/search.ts
+++ b/lib/manager/gradle-wrapper/search.ts
@@ -1,2 +1,4 @@
 export const DISTRIBUTION_URL_REGEX = /^(?<assignment>distributionUrl\s*=\s*)\S*-(?<version>(\d|\.)+)-(?<type>bin|all)\.zip\s*$/;
 export const DISTRIBUTION_CHECKSUM_REGEX = /^(?<assignment>distributionSha256Sum\s*=\s*)(?<checksum>(\w){64}).*$/;
+export const DOWNLOAD_URL_REGEX = /^(?<http>http)\S*-(?<version>(\d|\.)+)-(?<type>bin|all)\.zip\s*$/;
+export const VERSION_REGEX = /-(?<version>(\d|\.)+)-/;
diff --git a/lib/manager/gradle-wrapper/update.spec.ts b/lib/manager/gradle-wrapper/update.spec.ts
index bf13af66d6..9e18ac17ad 100644
--- a/lib/manager/gradle-wrapper/update.spec.ts
+++ b/lib/manager/gradle-wrapper/update.spec.ts
@@ -11,6 +11,10 @@ const propertiesFile2 = fs.readFileSync(
   'lib/manager/gradle-wrapper/__fixtures__/gradle-wrapper-2.properties',
   'utf8'
 );
+const propertiesFileCustomDistUrl = fs.readFileSync(
+  'lib/manager/gradle-wrapper/__fixtures__/gradle-wrapper-custom-distribution-url.properties',
+  'utf8'
+);
 const whitespacePropertiesFile = readFileSync(
   resolve(__dirname, './__fixtures__/gradle-wrapper-whitespace.properties'),
   'utf8'
@@ -75,6 +79,23 @@ describe('manager/gradle-wrapper/update', () => {
       expect(res).toMatch(testUpgrades[5].checksum);
     });
 
+    it('replaces existing value (custom distributionUrl)', async () => {
+      got.mockReturnValueOnce({
+        body: testUpgrades[5].checksum,
+      });
+      const res = await dcUpdate.updateDependency({
+        fileContent: propertiesFileCustomDistUrl,
+        upgrade: testUpgrades[5].data,
+      });
+      expect(res).toMatchSnapshot();
+      expect(res).not.toBeNull();
+      expect(res).not.toEqual(propertiesFileCustomDistUrl);
+      expect(res).toMatch(
+        'https\\://artifactory/gradle-wrapper-cache/distributions/gradle-5.0-bin.zip'
+      );
+      expect(res).toMatch(testUpgrades[5].checksum);
+    });
+
     it('replaces in property files with whitespace', async () => {
       got.mockReturnValueOnce({
         body: testUpgrades[5].checksum,
diff --git a/lib/manager/gradle-wrapper/update.ts b/lib/manager/gradle-wrapper/update.ts
index 4911d45d37..fe9e77d612 100644
--- a/lib/manager/gradle-wrapper/update.ts
+++ b/lib/manager/gradle-wrapper/update.ts
@@ -1,7 +1,11 @@
 import got from '../../util/got';
 import { logger } from '../../logger';
 import { UpdateDependencyConfig } from '../common';
-import { DISTRIBUTION_CHECKSUM_REGEX, DISTRIBUTION_URL_REGEX } from './search';
+import {
+  DISTRIBUTION_CHECKSUM_REGEX,
+  DOWNLOAD_URL_REGEX,
+  VERSION_REGEX,
+} from './search';
 
 function replaceType(url: string): string {
   return url.replace('bin', 'all');
@@ -41,7 +45,10 @@ export async function updateDependency({
 
     lines[upgrade.managerData.lineNumber] = lines[
       upgrade.managerData.lineNumber
-    ].replace(DISTRIBUTION_URL_REGEX, `$<assignment>${downloadUrl}`);
+    ].replace(
+      VERSION_REGEX,
+      `-${DOWNLOAD_URL_REGEX.exec(downloadUrl).groups.version}-`
+    );
 
     if (upgrade.managerData.checksumLineNumber) {
       lines[upgrade.managerData.checksumLineNumber] = lines[
-- 
GitLab