From 64127779fccc6564d35cd2a568cb28556a333704 Mon Sep 17 00:00:00 2001
From: Sergei Zharinov <zharinov@users.noreply.github.com>
Date: Thu, 13 Jan 2022 17:22:28 +0300
Subject: [PATCH] fix(gradle): Resolve vars in plugin versions (#13541)

---
 lib/manager/gradle/shallow/parser.spec.ts | 16 +++++----
 lib/manager/gradle/shallow/parser.ts      | 43 +++++++++++++++++------
 2 files changed, 43 insertions(+), 16 deletions(-)

diff --git a/lib/manager/gradle/shallow/parser.spec.ts b/lib/manager/gradle/shallow/parser.spec.ts
index d3b844772b..0b9a710799 100644
--- a/lib/manager/gradle/shallow/parser.spec.ts
+++ b/lib/manager/gradle/shallow/parser.spec.ts
@@ -63,12 +63,16 @@ describe('manager/gradle/shallow/parser', () => {
 
     describe('plugins', () => {
       test.each`
-        input                               | output
-        ${'id "foo.bar" version "1.2.3"'}   | ${{ depName: 'foo.bar', lookupName: 'foo.bar:foo.bar.gradle.plugin', currentValue: '1.2.3' }}
-        ${'id("foo.bar") version "1.2.3"'}  | ${{ depName: 'foo.bar', lookupName: 'foo.bar:foo.bar.gradle.plugin', currentValue: '1.2.3' }}
-        ${'kotlin("jvm") version "1.3.71"'} | ${{ depName: 'org.jetbrains.kotlin.jvm', lookupName: 'org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin', currentValue: '1.3.71' }}
-      `('$input', ({ input, output }) => {
-        const { deps } = parseGradle(input);
+        def                 | input                               | output
+        ${''}               | ${'id "foo.bar" version "1.2.3"'}   | ${{ depName: 'foo.bar', lookupName: 'foo.bar:foo.bar.gradle.plugin', currentValue: '1.2.3' }}
+        ${''}               | ${'id("foo.bar") version "1.2.3"'}  | ${{ depName: 'foo.bar', lookupName: 'foo.bar:foo.bar.gradle.plugin', currentValue: '1.2.3' }}
+        ${''}               | ${'kotlin("jvm") version "1.3.71"'} | ${{ depName: 'org.jetbrains.kotlin.jvm', lookupName: 'org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin', currentValue: '1.3.71' }}
+        ${''}               | ${'id "foo.bar" version something'} | ${{ depName: 'foo.bar', currentValue: 'something', skipReason: SkipReason.UnknownVersion }}
+        ${'baz = "1.2.3"'}  | ${'id "foo.bar" version baz'}       | ${{ depName: 'foo.bar', lookupName: 'foo.bar:foo.bar.gradle.plugin', currentValue: '1.2.3' }}
+        ${'baz = "1.2.3"'}  | ${'id("foo.bar") version baz'}      | ${{ depName: 'foo.bar', lookupName: 'foo.bar:foo.bar.gradle.plugin', currentValue: '1.2.3' }}
+        ${'baz = "1.3.71"'} | ${'kotlin("jvm") version baz'}      | ${{ depName: 'org.jetbrains.kotlin.jvm', lookupName: 'org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin', currentValue: '1.3.71' }}
+      `('$input', ({ def, input, output }) => {
+        const { deps } = parseGradle([def, input].join('\n'));
         expect(deps).toMatchObject([output].filter(Boolean));
       });
     });
diff --git a/lib/manager/gradle/shallow/parser.ts b/lib/manager/gradle/shallow/parser.ts
index f3044a3002..a3762d1ffd 100644
--- a/lib/manager/gradle/shallow/parser.ts
+++ b/lib/manager/gradle/shallow/parser.ts
@@ -203,6 +203,7 @@ function processDepInterpolation({
 function processPlugin({
   tokenMap,
   packageFile,
+  variables,
 }: SyntaxHandlerInput): SyntaxHandlerOutput {
   const { pluginName, pluginVersion, methodName } = tokenMap;
   const plugin = pluginName.value;
@@ -212,20 +213,36 @@ function processPlugin({
     methodName.value === 'kotlin'
       ? `org.jetbrains.kotlin.${plugin}:org.jetbrains.kotlin.${plugin}.gradle.plugin`
       : `${plugin}:${plugin}.gradle.plugin`;
-  const currentValue = pluginVersion.value;
-  const fileReplacePosition = pluginVersion.offset;
-  const dep = {
+
+  const dep: PackageDependency<GradleManagerData> = {
     depType: 'plugin',
     depName,
     lookupName,
     registryUrls: ['https://plugins.gradle.org/m2/'],
-    currentValue,
     commitMessageTopic: `plugin ${depName}`,
-    managerData: {
-      fileReplacePosition,
-      packageFile,
-    },
   };
+
+  if (pluginVersion.type === TokenType.Word) {
+    const varData = variables[pluginVersion.value];
+    if (varData) {
+      const currentValue = varData.value;
+      const fileReplacePosition = varData.fileReplacePosition;
+      dep.currentValue = currentValue;
+      dep.managerData = { fileReplacePosition, packageFile };
+    } else {
+      const currentValue = pluginVersion.value;
+      const fileReplacePosition = pluginVersion.offset;
+      dep.currentValue = currentValue;
+      dep.managerData = { fileReplacePosition, packageFile };
+      dep.skipReason = SkipReason.UnknownVersion;
+    }
+  } else {
+    const currentValue = pluginVersion.value;
+    const fileReplacePosition = pluginVersion.offset;
+    dep.currentValue = currentValue;
+    dep.managerData = { fileReplacePosition, packageFile };
+  }
+
   return { deps: [dep] };
 }
 
@@ -363,7 +380,10 @@ const matcherConfigs: SyntaxMatchConfig[] = [
       },
       { matchType: TokenType.String, tokenMapKey: 'pluginName' },
       { matchType: TokenType.Word, matchValue: 'version' },
-      { matchType: TokenType.String, tokenMapKey: 'pluginVersion' },
+      {
+        matchType: [TokenType.String, TokenType.Word],
+        tokenMapKey: 'pluginVersion',
+      },
       endOfInstruction,
     ],
     handler: processPlugin,
@@ -380,7 +400,10 @@ const matcherConfigs: SyntaxMatchConfig[] = [
       { matchType: TokenType.String, tokenMapKey: 'pluginName' },
       { matchType: TokenType.RightParen },
       { matchType: TokenType.Word, matchValue: 'version' },
-      { matchType: TokenType.String, tokenMapKey: 'pluginVersion' },
+      {
+        matchType: [TokenType.String, TokenType.Word],
+        tokenMapKey: 'pluginVersion',
+      },
       endOfInstruction,
     ],
     handler: processPlugin,
-- 
GitLab