From 4e68e6a9315ab09b7f97a7b7359fc8c30b9c2be4 Mon Sep 17 00:00:00 2001
From: Sho Ikeda <suicaicoca@gmail.com>
Date: Wed, 24 Jul 2019 23:18:32 +0900
Subject: [PATCH] feat(gradle): Support updating plugin dependencies

---
 lib/manager/gradle/build-gradle.ts          | 19 +++++++++++++
 lib/manager/gradle/gradle-updates-report.ts |  2 +-
 test/manager/gradle/index.spec.ts           | 31 ++++++++++++++++++++-
 3 files changed, 50 insertions(+), 2 deletions(-)

diff --git a/lib/manager/gradle/build-gradle.ts b/lib/manager/gradle/build-gradle.ts
index d3f406b984..0bd1f5ed5c 100644
--- a/lib/manager/gradle/build-gradle.ts
+++ b/lib/manager/gradle/build-gradle.ts
@@ -30,6 +30,7 @@ export function updateGradleVersion(
   if (dependency) {
     const updateFunctions: UpdateFunction[] = [
       updateVersionStringFormat,
+      updatePluginVersionStringFormat,
       updateVersionMapFormat,
       updateVersionMapVariableFormat,
       updateVersionStringVariableFormat,
@@ -94,6 +95,18 @@ function updateVersionStringFormat(
   return null;
 }
 
+function updatePluginVersionStringFormat(
+  dependency: GradleDependency,
+  buildGradleContent: string,
+  newVersion: string
+) {
+  const regex = pluginStringVersionFormatMatch(dependency);
+  if (buildGradleContent.match(regex)) {
+    return buildGradleContent.replace(regex, `$1${newVersion}$2`);
+  }
+  return null;
+}
+
 function updateVersionMapFormat(
   dependency: GradleDependency,
   buildGradleContent: string,
@@ -196,6 +209,12 @@ function moduleStringVersionFormatMatch(dependency: GradleDependency) {
   );
 }
 
+function pluginStringVersionFormatMatch(dependency: GradleDependency) {
+  return new RegExp(
+    `(id\\s+["']${dependency.group}["']\\s+version\\s+["'])[^$].*?(["'])`
+  );
+}
+
 function moduleMapVersionFormatMatch(dependency: GradleDependency) {
   // prettier-ignore
   return new RegExp(
diff --git a/lib/manager/gradle/gradle-updates-report.ts b/lib/manager/gradle/gradle-updates-report.ts
index 1dcf9da855..d83000462f 100644
--- a/lib/manager/gradle/gradle-updates-report.ts
+++ b/lib/manager/gradle/gradle-updates-report.ts
@@ -44,7 +44,7 @@ allprojects {
            .collect { "$it.url" }
            .findAll { !it.startsWith('file:') }
         project.repositories = repos
-        def deps = configurations
+        def deps = (buildscript.configurations + configurations)
           .collect { it.dependencies }
           .flatten()
           .findAll { it instanceof DefaultExternalModuleDependency }
diff --git a/test/manager/gradle/index.spec.ts b/test/manager/gradle/index.spec.ts
index f2f27b37ab..81a2ca3fe3 100644
--- a/test/manager/gradle/index.spec.ts
+++ b/test/manager/gradle/index.spec.ts
@@ -153,7 +153,7 @@ describe('manager/gradle', () => {
   });
 
   describe('updateDependency', () => {
-    it('should update an existing dependency', () => {
+    it('should update an existing module dependency', () => {
       const buildGradleContent = fsReal.readFileSync(
         'test/datasource/gradle/_fixtures/build.gradle.example1',
         'utf8'
@@ -172,5 +172,34 @@ describe('manager/gradle', () => {
       expect(buildGradleContentUpdated).toMatch('cglib:cglib-nodep:3.2.8');
       expect(buildGradleContentUpdated).not.toMatch('cglib:cglib-nodep:3.1');
     });
+
+    it('should update an existing plugin dependency', () => {
+      const buildGradleContent = `
+        plugins {
+            id "com.github.ben-manes.versions" version "0.20.0"
+        }
+        `;
+      const upgrade = {
+        depGroup: 'com.github.ben-manes.versions',
+        name: 'com.github.ben-manes.versions.gradle.plugin',
+        version: '0.20.0',
+        newValue: '0.21.0',
+      };
+      const buildGradleContentUpdated = manager.updateDependency(
+        buildGradleContent,
+        upgrade
+      );
+
+      expect(buildGradleContent).not.toMatch(
+        'id "com.github.ben-manes.versions" version "0.21.0"'
+      );
+
+      expect(buildGradleContentUpdated).toMatch(
+        'id "com.github.ben-manes.versions" version "0.21.0"'
+      );
+      expect(buildGradleContentUpdated).not.toMatch(
+        'id "com.github.ben-manes.versions" version "0.20.0"'
+      );
+    });
   });
 });
-- 
GitLab