diff --git a/lib/manager/gradle/__snapshots__/index.spec.ts.snap b/lib/manager/gradle/__snapshots__/index.spec.ts.snap index 90c0b8faaa6e27..d6062cf2335dab 100644 --- a/lib/manager/gradle/__snapshots__/index.spec.ts.snap +++ b/lib/manager/gradle/__snapshots__/index.spec.ts.snap @@ -1,35 +1,104 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`manager/gradle/index extractPackageFile should configure the renovate report plugin 1`] = ` +exports[`manager/gradle/index extractPackageFile should execute gradle if gradlew is not available 1`] = ` Array [ Object { - "cmd": " --init-script renovate-plugin.gradle renovate", - "options": Object { - "cwd": "localDir", - "encoding": "utf-8", - "env": Object { - "GRADLE_OPTS": "-Dorg.gradle.parallel=true -Dorg.gradle.configureondemand=true -Dorg.gradle.daemon=false -Dorg.gradle.caching=false", - "HOME": "/home/user", - "HTTPS_PROXY": "https://example.com", - "HTTP_PROXY": "http://example.com", - "LANG": "en_US.UTF-8", - "LC_ALL": "en_US", - "NO_PROXY": "localhost", - "PATH": "/tmp/path", + "datasource": "maven", + "deps": Array [ + Object { + "currentValue": null, + "depGroup": "org.springframework.boot", + "depName": "org.springframework.boot:spring-boot-starter-jersey", + "name": "spring-boot-starter-jersey", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], }, - "maxBuffer": 10485760, - "timeout": 60000, - }, + Object { + "currentValue": "1.0-groovy-2.4", + "depGroup": "org.spockframework", + "depName": "org.spockframework:spock-core", + "name": "spock-core", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + }, + Object { + "currentValue": "3.1", + "depGroup": "cglib", + "depName": "cglib:cglib-nodep", + "name": "cglib-nodep", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + }, + Object { + "currentValue": "%scala-version%", + "depGroup": "org.scala-lang", + "depName": "org.scala-lang:scala-library", + "name": "scala-library", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + "skipReason": "version-placeholder", + }, + Object { + "currentValue": "3.9.0", + "datasource": "sbt-package", + "depGroup": "com.typesafe.scala-logging", + "depName": "com.typesafe.scala-logging:scala-logging", + "name": "scala-logging_%%", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + }, + Object { + "currentValue": "1.2.3", + "depGroup": "foo", + "depName": "foo:foo", + "name": "foo", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + }, + Object { + "currentValue": "This.Is.Valid.Version.Good.Luck", + "depGroup": "bar", + "depName": "bar:bar", + "name": "bar", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + }, + Object { + "currentValue": null, + "depGroup": "baz", + "depName": "baz:baz", + "name": "baz", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + }, + ], + "packageFile": "build.gradle", }, ] `; -exports[`manager/gradle/index extractPackageFile should execute gradle if gradlew is not available 1`] = ` +exports[`manager/gradle/index extractPackageFile should execute gradle if gradlew is not available 2`] = ` Array [ Object { "cmd": "gradle --init-script renovate-plugin.gradle renovate", "options": Object { - "cwd": "localDir", + "cwd": "/foo/bar", "encoding": "utf-8", "env": Object { "GRADLE_OPTS": "-Dorg.gradle.parallel=true -Dorg.gradle.configureondemand=true -Dorg.gradle.daemon=false -Dorg.gradle.caching=false", @@ -49,11 +118,104 @@ Array [ `; exports[`manager/gradle/index extractPackageFile should execute gradlew when available 1`] = ` +Array [ + Object { + "datasource": "maven", + "deps": Array [ + Object { + "currentValue": null, + "depGroup": "org.springframework.boot", + "depName": "org.springframework.boot:spring-boot-starter-jersey", + "name": "spring-boot-starter-jersey", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + }, + Object { + "currentValue": "1.0-groovy-2.4", + "depGroup": "org.spockframework", + "depName": "org.spockframework:spock-core", + "name": "spock-core", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + }, + Object { + "currentValue": "3.1", + "depGroup": "cglib", + "depName": "cglib:cglib-nodep", + "name": "cglib-nodep", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + }, + Object { + "currentValue": "%scala-version%", + "depGroup": "org.scala-lang", + "depName": "org.scala-lang:scala-library", + "name": "scala-library", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + "skipReason": "version-placeholder", + }, + Object { + "currentValue": "3.9.0", + "datasource": "sbt-package", + "depGroup": "com.typesafe.scala-logging", + "depName": "com.typesafe.scala-logging:scala-logging", + "name": "scala-logging_%%", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + }, + Object { + "currentValue": "1.2.3", + "depGroup": "foo", + "depName": "foo:foo", + "name": "foo", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + }, + Object { + "currentValue": "This.Is.Valid.Version.Good.Luck", + "depGroup": "bar", + "depName": "bar:bar", + "name": "bar", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + }, + Object { + "currentValue": null, + "depGroup": "baz", + "depName": "baz:baz", + "name": "baz", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + }, + ], + "packageFile": "build.gradle", + }, +] +`; + +exports[`manager/gradle/index extractPackageFile should execute gradlew when available 2`] = ` Array [ Object { "cmd": " --init-script renovate-plugin.gradle renovate", "options": Object { - "cwd": "localDir", + "cwd": "/foo/bar", "encoding": "utf-8", "env": Object { "GRADLE_OPTS": "-Dorg.gradle.parallel=true -Dorg.gradle.configureondemand=true -Dorg.gradle.daemon=false -Dorg.gradle.caching=false", @@ -65,19 +227,112 @@ Array [ "NO_PROXY": "localhost", "PATH": "/tmp/path", }, - "maxBuffer": 10485760, - "timeout": 60000, - }, + "maxBuffer": 10485760, + "timeout": 60000, + }, + }, +] +`; + +exports[`manager/gradle/index extractPackageFile should execute gradlew.bat when available on Windows 1`] = ` +Array [ + Object { + "datasource": "maven", + "deps": Array [ + Object { + "currentValue": null, + "depGroup": "org.springframework.boot", + "depName": "org.springframework.boot:spring-boot-starter-jersey", + "name": "spring-boot-starter-jersey", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + }, + Object { + "currentValue": "1.0-groovy-2.4", + "depGroup": "org.spockframework", + "depName": "org.spockframework:spock-core", + "name": "spock-core", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + }, + Object { + "currentValue": "3.1", + "depGroup": "cglib", + "depName": "cglib:cglib-nodep", + "name": "cglib-nodep", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + }, + Object { + "currentValue": "%scala-version%", + "depGroup": "org.scala-lang", + "depName": "org.scala-lang:scala-library", + "name": "scala-library", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + "skipReason": "version-placeholder", + }, + Object { + "currentValue": "3.9.0", + "datasource": "sbt-package", + "depGroup": "com.typesafe.scala-logging", + "depName": "com.typesafe.scala-logging:scala-logging", + "name": "scala-logging_%%", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + }, + Object { + "currentValue": "1.2.3", + "depGroup": "foo", + "depName": "foo:foo", + "name": "foo", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + }, + Object { + "currentValue": "This.Is.Valid.Version.Good.Luck", + "depGroup": "bar", + "depName": "bar:bar", + "name": "bar", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + }, + Object { + "currentValue": null, + "depGroup": "baz", + "depName": "baz:baz", + "name": "baz", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + }, + ], + "packageFile": "build.gradle", }, ] `; -exports[`manager/gradle/index extractPackageFile should execute gradlew.bat when available on Windows 1`] = ` +exports[`manager/gradle/index extractPackageFile should execute gradlew.bat when available on Windows 2`] = ` Array [ Object { "cmd": " --init-script renovate-plugin.gradle renovate", "options": Object { - "cwd": "localDir", + "cwd": "/foo/bar", "encoding": "utf-8", "env": Object { "GRADLE_OPTS": "-Dorg.gradle.parallel=true -Dorg.gradle.configureondemand=true -Dorg.gradle.daemon=false -Dorg.gradle.caching=false", @@ -101,7 +356,7 @@ Array [ Object { "cmd": " --init-script renovate-plugin.gradle renovate", "options": Object { - "cwd": "localDir", + "cwd": "/foo/bar", "encoding": "utf-8", "env": Object { "GRADLE_OPTS": "-Dorg.gradle.parallel=true -Dorg.gradle.configureondemand=true -Dorg.gradle.daemon=false -Dorg.gradle.caching=false", @@ -125,7 +380,7 @@ Array [ Object { "cmd": " --init-script renovate-plugin.gradle renovate", "options": Object { - "cwd": "localDir", + "cwd": "/foo/bar", "encoding": "utf-8", "env": Object { "GRADLE_OPTS": "-Dorg.gradle.parallel=true -Dorg.gradle.configureondemand=true -Dorg.gradle.daemon=false -Dorg.gradle.caching=false", @@ -149,7 +404,7 @@ Array [ Object { "cmd": " --init-script renovate-plugin.gradle renovate", "options": Object { - "cwd": "localDir", + "cwd": "/foo/bar", "encoding": "utf-8", "env": Object { "GRADLE_OPTS": "-Dorg.gradle.parallel=true -Dorg.gradle.configureondemand=true -Dorg.gradle.daemon=false -Dorg.gradle.caching=false", @@ -168,7 +423,7 @@ Array [ ] `; -exports[`manager/gradle/index extractPackageFile should return gradle dependencies 1`] = ` +exports[`manager/gradle/index extractPackageFile should return gradle dependencies for build.gradle in subdirectories if there is gradlew in the same directory 1`] = ` Array [ Object { "datasource": "maven", @@ -256,8 +511,37 @@ Array [ ], }, ], - "packageFile": "build.gradle", + "packageFile": "baz/qux/build.gradle", + }, +] +`; + +exports[`manager/gradle/index extractPackageFile should return gradle dependencies for build.gradle in subdirectories if there is gradlew in the same directory 2`] = ` +Array [ + Object { + "cmd": " --init-script renovate-plugin.gradle renovate", + "options": Object { + "cwd": "/foo/bar/baz/qux", + "encoding": "utf-8", + "env": Object { + "GRADLE_OPTS": "-Dorg.gradle.parallel=true -Dorg.gradle.configureondemand=true -Dorg.gradle.daemon=false -Dorg.gradle.caching=false", + "HOME": "/home/user", + "HTTPS_PROXY": "https://example.com", + "HTTP_PROXY": "http://example.com", + "LANG": "en_US.UTF-8", + "LC_ALL": "en_US", + "NO_PROXY": "localhost", + "PATH": "/tmp/path", + }, + "maxBuffer": 10485760, + "timeout": 60000, + }, }, +] +`; + +exports[`manager/gradle/index extractPackageFile should return gradle.kts dependencies 1`] = ` +Array [ Object { "datasource": "maven", "deps": Array [ @@ -344,17 +628,17 @@ Array [ ], }, ], - "packageFile": "subproject/build.gradle", + "packageFile": "build.gradle.kts", }, ] `; -exports[`manager/gradle/index extractPackageFile should return gradle dependencies 2`] = ` +exports[`manager/gradle/index extractPackageFile should return gradle.kts dependencies 2`] = ` Array [ Object { "cmd": " --init-script renovate-plugin.gradle renovate", "options": Object { - "cwd": "localDir", + "cwd": "/foo/bar", "encoding": "utf-8", "env": Object { "GRADLE_OPTS": "-Dorg.gradle.parallel=true -Dorg.gradle.configureondemand=true -Dorg.gradle.daemon=false -Dorg.gradle.caching=false", @@ -373,7 +657,7 @@ Array [ ] `; -exports[`manager/gradle/index extractPackageFile should return gradle dependencies for build.gradle in subdirectories if there is gradlew in the same directory 1`] = ` +exports[`manager/gradle/index extractPackageFile should update an existing module dependency 1`] = ` Array [ Object { "datasource": "maven", @@ -461,17 +745,17 @@ Array [ ], }, ], - "packageFile": "foo/build.gradle", + "packageFile": "build.gradle", }, ] `; -exports[`manager/gradle/index extractPackageFile should return gradle dependencies for build.gradle in subdirectories if there is gradlew in the same directory 2`] = ` +exports[`manager/gradle/index extractPackageFile should update an existing module dependency 2`] = ` Array [ Object { "cmd": " --init-script renovate-plugin.gradle renovate", "options": Object { - "cwd": "localDir/foo", + "cwd": "/foo/bar", "encoding": "utf-8", "env": Object { "GRADLE_OPTS": "-Dorg.gradle.parallel=true -Dorg.gradle.configureondemand=true -Dorg.gradle.daemon=false -Dorg.gradle.caching=false", @@ -490,7 +774,7 @@ Array [ ] `; -exports[`manager/gradle/index extractPackageFile should return gradle.kts dependencies 1`] = ` +exports[`manager/gradle/index extractPackageFile should use docker even if gradlew is available 1`] = ` Array [ Object { "datasource": "maven", @@ -578,8 +862,55 @@ Array [ ], }, ], - "packageFile": "build.gradle.kts", + "packageFile": "build.gradle", + }, +] +`; + +exports[`manager/gradle/index extractPackageFile should use docker even if gradlew is available 2`] = ` +Array [ + Object { + "cmd": "docker pull renovate/gradle", + "options": Object { + "encoding": "utf-8", + }, + }, + Object { + "cmd": "docker ps --filter name=renovate_gradle -aq", + "options": Object { + "encoding": "utf-8", + }, + }, + Object { + "cmd": "docker rm -f gradle output", + "options": Object { + "encoding": "utf-8", + }, + }, + Object { + "cmd": "docker run --rm --name=renovate_gradle --label=renovate_child -v \\"/foo/bar\\":\\"/foo/bar\\" -e GRADLE_OPTS -w \\"/foo/bar\\" renovate/gradle bash -l -c \\" --init-script renovate-plugin.gradle renovate\\"", + "options": Object { + "cwd": "/foo/bar", + "encoding": "utf-8", + "env": Object { + "GRADLE_OPTS": "-Dorg.gradle.parallel=true -Dorg.gradle.configureondemand=true -Dorg.gradle.daemon=false -Dorg.gradle.caching=false", + "HOME": "/home/user", + "HTTPS_PROXY": "https://example.com", + "HTTP_PROXY": "http://example.com", + "LANG": "en_US.UTF-8", + "LC_ALL": "en_US", + "NO_PROXY": "localhost", + "PATH": "/tmp/path", + }, + "maxBuffer": 10485760, + "timeout": 60000, + }, }, +] +`; + +exports[`manager/gradle/index extractPackageFile should use docker even if gradlew.bat is available on Windows 1`] = ` +Array [ Object { "datasource": "maven", "deps": Array [ @@ -666,38 +997,12 @@ Array [ ], }, ], - "packageFile": "subproject/build.gradle.kts", - }, -] -`; - -exports[`manager/gradle/index extractPackageFile should return gradle.kts dependencies 2`] = ` -Array [ - Object { - "cmd": " --init-script renovate-plugin.gradle renovate", - "options": Object { - "cwd": "localDir", - "encoding": "utf-8", - "env": Object { - "GRADLE_OPTS": "-Dorg.gradle.parallel=true -Dorg.gradle.configureondemand=true -Dorg.gradle.daemon=false -Dorg.gradle.caching=false", - "HOME": "/home/user", - "HTTPS_PROXY": "https://example.com", - "HTTP_PROXY": "http://example.com", - "LANG": "en_US.UTF-8", - "LC_ALL": "en_US", - "NO_PROXY": "localhost", - "PATH": "/tmp/path", - }, - "maxBuffer": 10485760, - "timeout": 60000, - }, + "packageFile": "build.gradle", }, ] `; -exports[`manager/gradle/index extractPackageFile should return null and gradle should not be executed if no root build.gradle 1`] = `Array []`; - -exports[`manager/gradle/index extractPackageFile should use docker even if gradlew is available 1`] = ` +exports[`manager/gradle/index extractPackageFile should use docker even if gradlew.bat is available on Windows 2`] = ` Array [ Object { "cmd": "docker pull renovate/gradle", @@ -718,9 +1023,9 @@ Array [ }, }, Object { - "cmd": "docker run --rm --name=renovate_gradle --label=renovate_child -v \\"localDir\\":\\"localDir\\" -e GRADLE_OPTS -w \\"localDir\\" renovate/gradle bash -l -c \\" --init-script renovate-plugin.gradle renovate\\"", + "cmd": "docker run --rm --name=renovate_gradle --label=renovate_child -v \\"/foo/bar\\":\\"/foo/bar\\" -e GRADLE_OPTS -w \\"/foo/bar\\" renovate/gradle bash -l -c \\" --init-script renovate-plugin.gradle renovate\\"", "options": Object { - "cwd": "localDir", + "cwd": "/foo/bar", "encoding": "utf-8", "env": Object { "GRADLE_OPTS": "-Dorg.gradle.parallel=true -Dorg.gradle.configureondemand=true -Dorg.gradle.daemon=false -Dorg.gradle.caching=false", @@ -739,49 +1044,100 @@ Array [ ] `; -exports[`manager/gradle/index extractPackageFile should use docker even if gradlew.bat is available on Windows 1`] = ` +exports[`manager/gradle/index extractPackageFile should use docker if required 1`] = ` Array [ Object { - "cmd": "docker pull renovate/gradle", - "options": Object { - "encoding": "utf-8", - }, - }, - Object { - "cmd": "docker ps --filter name=renovate_gradle -aq", - "options": Object { - "encoding": "utf-8", - }, - }, - Object { - "cmd": "docker rm -f gradle output", - "options": Object { - "encoding": "utf-8", - }, - }, - Object { - "cmd": "docker run --rm --name=renovate_gradle --label=renovate_child -v \\"localDir\\":\\"localDir\\" -e GRADLE_OPTS -w \\"localDir\\" renovate/gradle bash -l -c \\" --init-script renovate-plugin.gradle renovate\\"", - "options": Object { - "cwd": "localDir", - "encoding": "utf-8", - "env": Object { - "GRADLE_OPTS": "-Dorg.gradle.parallel=true -Dorg.gradle.configureondemand=true -Dorg.gradle.daemon=false -Dorg.gradle.caching=false", - "HOME": "/home/user", - "HTTPS_PROXY": "https://example.com", - "HTTP_PROXY": "http://example.com", - "LANG": "en_US.UTF-8", - "LC_ALL": "en_US", - "NO_PROXY": "localhost", - "PATH": "/tmp/path", + "datasource": "maven", + "deps": Array [ + Object { + "currentValue": null, + "depGroup": "org.springframework.boot", + "depName": "org.springframework.boot:spring-boot-starter-jersey", + "name": "spring-boot-starter-jersey", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], }, - "maxBuffer": 10485760, - "timeout": 60000, - }, + Object { + "currentValue": "1.0-groovy-2.4", + "depGroup": "org.spockframework", + "depName": "org.spockframework:spock-core", + "name": "spock-core", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + }, + Object { + "currentValue": "3.1", + "depGroup": "cglib", + "depName": "cglib:cglib-nodep", + "name": "cglib-nodep", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + }, + Object { + "currentValue": "%scala-version%", + "depGroup": "org.scala-lang", + "depName": "org.scala-lang:scala-library", + "name": "scala-library", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + "skipReason": "version-placeholder", + }, + Object { + "currentValue": "3.9.0", + "datasource": "sbt-package", + "depGroup": "com.typesafe.scala-logging", + "depName": "com.typesafe.scala-logging:scala-logging", + "name": "scala-logging_%%", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + }, + Object { + "currentValue": "1.2.3", + "depGroup": "foo", + "depName": "foo:foo", + "name": "foo", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + }, + Object { + "currentValue": "This.Is.Valid.Version.Good.Luck", + "depGroup": "bar", + "depName": "bar:bar", + "name": "bar", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + }, + Object { + "currentValue": null, + "depGroup": "baz", + "depName": "baz:baz", + "name": "baz", + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2/", + "https://jitpack.io", + ], + }, + ], + "packageFile": "build.gradle", }, ] `; -exports[`manager/gradle/index extractPackageFile should use docker if required 1`] = ` +exports[`manager/gradle/index extractPackageFile should use docker if required 2`] = ` Array [ Object { "cmd": "docker pull renovate/gradle", @@ -802,9 +1158,9 @@ Array [ }, }, Object { - "cmd": "docker run --rm --name=renovate_gradle --label=renovate_child -v \\"localDir\\":\\"localDir\\" -e GRADLE_OPTS -w \\"localDir\\" renovate/gradle bash -l -c \\"gradle --init-script renovate-plugin.gradle renovate\\"", + "cmd": "docker run --rm --name=renovate_gradle --label=renovate_child -v \\"/foo/bar\\":\\"/foo/bar\\" -e GRADLE_OPTS -w \\"/foo/bar\\" renovate/gradle bash -l -c \\"gradle --init-script renovate-plugin.gradle renovate\\"", "options": Object { - "cwd": "localDir", + "cwd": "/foo/bar", "encoding": "utf-8", "env": Object { "GRADLE_OPTS": "-Dorg.gradle.parallel=true -Dorg.gradle.configureondemand=true -Dorg.gradle.daemon=false -Dorg.gradle.caching=false", @@ -868,7 +1224,7 @@ Array [ Object { "cmd": " --init-script renovate-plugin.gradle renovate", "options": Object { - "cwd": "localDir", + "cwd": "/foo/bar", "encoding": "utf-8", "env": Object { "GRADLE_OPTS": "-Dorg.gradle.parallel=true -Dorg.gradle.configureondemand=true -Dorg.gradle.daemon=false -Dorg.gradle.caching=false", @@ -886,11 +1242,3 @@ Array [ }, ] `; - -exports[`manager/gradle/index updateDependency should update an existing module dependency 1`] = `Array []`; - -exports[`manager/gradle/index updateDependency should update an existing plugin dependency 1`] = `Array []`; - -exports[`manager/gradle/index updateDependency should update an existing plugin dependency with Kotlin DSL 1`] = `Array []`; - -exports[`manager/gradle/index updateDependency should update dependencies in same file 1`] = `Array []`; diff --git a/lib/manager/gradle/index.spec.ts b/lib/manager/gradle/index.spec.ts index 7acc18ec57b410..771bac71aed3bd 100644 --- a/lib/manager/gradle/index.spec.ts +++ b/lib/manager/gradle/index.spec.ts @@ -1,173 +1,140 @@ import { exec as _exec } from 'child_process'; +import type { Stats } from 'fs'; import os from 'os'; -import fsExtra from 'fs-extra'; -import tmp from 'tmp-promise'; -import * as upath from 'upath'; +import _fs from 'fs-extra'; +import { join } from 'upath'; import { envMock, mockExecAll } from '../../../test/exec-util'; import { addReplacingSerializer, getName, - replacingSerializer, + loadFixture, + mocked, } from '../../../test/util'; -import * as _util from '../../util'; +import { setUtilConfig } from '../../util'; +import { setExecConfig } from '../../util/exec'; import { BinarySource } from '../../util/exec/common'; -import * as _docker from '../../util/exec/docker'; +import * as docker from '../../util/exec/docker'; import * as _env from '../../util/exec/env'; -import * as _fs from '../../util/fs'; -import type { ExtractConfig } from '../types'; -import { GRADLE_DEPENDENCY_REPORT_FILENAME } from './gradle-updates-report'; -import * as _manager from '.'; - -const fixtures = 'lib/manager/gradle/__fixtures__'; -const standardUpdatesReport = () => - fsExtra.readFile(`${fixtures}/updatesReport.json`, 'utf8'); -const emptyUpdatesReport = () => - fsExtra.readFile(`${fixtures}/updatesReportEmpty.json`, 'utf8'); -const multiProjectUpdatesReport = () => - fsExtra.readFile(`${fixtures}/MultiProjectUpdatesReport.json`, 'utf8'); - -const baseConfig = { - gradle: { - timeout: 60, - }, -}; +import { extractAllPackageFiles, updateDependency } from '.'; + +jest.mock('child_process'); +const exec: jest.Mock = _exec as never; + +jest.mock('fs-extra'); +const fs = mocked(_fs); + +jest.mock('../../util/exec/env'); +const env = mocked(_env); const gradleOutput = { stdout: 'gradle output', stderr: '', }; -addReplacingSerializer('gradlew.bat', ''); -addReplacingSerializer('./gradlew', ''); - -function resetMocks() { - jest.resetAllMocks(); - jest.resetModules(); -} - -async function setupMocks() { - resetMocks(); - - jest.mock('child_process'); - jest.mock('../../util/exec/env'); - jest.mock('../../util/fs'); +const utilConfig = { + localDir: join('/foo/bar'), +}; - const fs: jest.Mocked = require('../../util/fs'); - const env: jest.Mocked = require('../../util/exec/env'); - const exec: jest.Mock = require('child_process').exec; - const util: jest.Mocked = require('../../util'); +const config = { + ...utilConfig, + gradle: { + timeout: 60, + }, +}; - fs.readLocalFile.mockResolvedValue(` - dependency 'foo:foo:1.2.3' - dependency "bar:bar:This.Is.Valid.Version.Good.Luck" - dependency "baz:baz:\${bazVersion}" - `); - env.getChildProcessEnv.mockReturnValue(envMock.basic); - await util.setUtilConfig(baseConfig); +const buildGradle = ` +dependency 'foo:foo:1.2.3' +dependency "bar:bar:This.Is.Valid.Version.Good.Luck" +dependency "baz:baz:\${bazVersion}" +`; - return [require('.'), exec, util]; -} +addReplacingSerializer('gradlew.bat', ''); +addReplacingSerializer('./gradlew', ''); describe(getName(), () => { - describe('extractPackageFile', () => { - let manager: typeof _manager; - let exec: jest.Mock; - let util: jest.Mocked; - let docker: typeof _docker; - let config: ExtractConfig; - - beforeAll(async () => { - [manager, exec, util] = await setupMocks(); - docker = require('../../util/exec/docker'); - }); - - afterAll(resetMocks); - - beforeEach(async () => { - exec.mockReset(); - docker.resetPrefetchedImages(); - - const gradleDir = await tmp.dir({ unsafeCleanup: true }); - config = { ...baseConfig, localDir: gradleDir.path }; - expect.addSnapshotSerializer( - replacingSerializer(upath.toUnix(gradleDir.path), 'localDir') - ); - }); - - async function initializeWorkingDir( - addGradleWrapper: boolean, - updatesReport: Promise | string | null, - dir: string = config.localDir - ) { - if (addGradleWrapper) { - await fsExtra.copy(`${fixtures}/gradle-wrappers/6`, dir); + const updatesReport = loadFixture('updatesReport.json'); + + function setupMocks({ + baseDir = '/foo/bar', + wrapperFilename = `gradlew`, + pluginFilename = 'renovate-plugin.gradle', + report = updatesReport, + reportFilename = 'gradle-renovate-report.json', + packageFilename = 'build.gradle', + output = gradleOutput, + } = {}) { + fs.stat.mockImplementationOnce((dirname) => { + if (wrapperFilename) { + return Promise.resolve({ + isFile: () => true, + } as Stats); } - if (updatesReport) { - await fsExtra.writeFile( - `${dir}/${GRADLE_DEPENDENCY_REPORT_FILENAME}`, - await updatesReport - ); - } - } + return Promise.reject(); + }); + fs.writeFile.mockImplementationOnce((_filename, _content) => {}); + fs.exists.mockImplementationOnce((_filename) => Promise.resolve(!!report)); + fs.readFile.mockImplementationOnce((filename) => + report ? Promise.resolve(report as never) : Promise.reject() + ); + fs.readFile.mockImplementationOnce((filename) => + Promise.resolve(buildGradle as never) + ); + return mockExecAll(exec, output); + } + + beforeAll(async () => { + await setUtilConfig(utilConfig); + }); - it('should return gradle dependencies', async () => { - const execSnapshots = mockExecAll(exec, gradleOutput); - await initializeWorkingDir(true, standardUpdatesReport()); + beforeEach(() => { + jest.resetAllMocks(); + jest.resetModules(); + docker.resetPrefetchedImages(); + env.getChildProcessEnv.mockReturnValue(envMock.basic); + }); - const dependencies = await manager.extractAllPackageFiles(config, [ + describe('extractPackageFile', () => { + it('should update an existing module dependency', async () => { + const execSnapshots = setupMocks(); + const dependencies = await extractAllPackageFiles(config, [ 'build.gradle', - 'subproject/build.gradle', ]); expect(dependencies).toMatchSnapshot(); expect(execSnapshots).toMatchSnapshot(); }); it('should return gradle.kts dependencies', async () => { - const execSnapshots = mockExecAll(exec, gradleOutput); - await initializeWorkingDir(true, standardUpdatesReport()); - - const dependencies = await manager.extractAllPackageFiles(config, [ + const execSnapshots = setupMocks(); + const dependencies = await extractAllPackageFiles(config, [ 'build.gradle.kts', - 'subproject/build.gradle.kts', ]); expect(dependencies).toMatchSnapshot(); expect(execSnapshots).toMatchSnapshot(); }); it('should return empty if there are no dependencies', async () => { - const execSnapshots = mockExecAll(exec, gradleOutput); - await initializeWorkingDir(true, emptyUpdatesReport()); - - const dependencies = await manager.extractAllPackageFiles(config, [ + const execSnapshots = setupMocks({ + report: loadFixture('updatesReportEmpty.json'), + }); + const dependencies = await extractAllPackageFiles(config, [ 'build.gradle', ]); - expect(dependencies).toEqual([]); expect(execSnapshots).toMatchSnapshot(); }); it('should return empty if there is no dependency report', async () => { - const execSnapshots = mockExecAll(exec, gradleOutput); - await initializeWorkingDir(true, null); - - const dependencies = await manager.extractAllPackageFiles(config, [ + const execSnapshots = setupMocks({ report: null }); + const dependencies = await extractAllPackageFiles(config, [ 'build.gradle', ]); - expect(dependencies).toEqual([]); expect(execSnapshots).toMatchSnapshot(); }); it('should return empty if renovate report is invalid', async () => { - const execSnapshots = mockExecAll(exec, gradleOutput); - await initializeWorkingDir( - true, - ` - Invalid JSON] - ` - ); - - const dependencies = await manager.extractAllPackageFiles(config, [ + const execSnapshots = setupMocks({ report: '!@#$%' }); + const dependencies = await extractAllPackageFiles(config, [ 'build.gradle', ]); expect(dependencies).toEqual([]); @@ -175,10 +142,10 @@ describe(getName(), () => { }); it('should use repositories only for current project', async () => { - const execSnapshots = mockExecAll(exec, gradleOutput); - await initializeWorkingDir(true, multiProjectUpdatesReport()); - - const dependencies = await manager.extractAllPackageFiles(config, [ + const execSnapshots = setupMocks({ + report: loadFixture(`MultiProjectUpdatesReport.json`), + }); + const dependencies = await extractAllPackageFiles(config, [ 'build.gradle', ]); expect(dependencies).toMatchSnapshot(); @@ -186,136 +153,104 @@ describe(getName(), () => { }); it('should execute gradlew when available', async () => { - const execSnapshots = mockExecAll(exec, gradleOutput); - await initializeWorkingDir(true, standardUpdatesReport()); - - await manager.extractAllPackageFiles(config, ['build.gradle']); + const execSnapshots = setupMocks(); + const dependencies = await extractAllPackageFiles(config, [ + 'build.gradle', + ]); + expect(dependencies).toMatchSnapshot(); expect(execSnapshots).toMatchSnapshot(); }); it('should execute gradlew.bat when available on Windows', async () => { - const execSnapshots = mockExecAll(exec, gradleOutput); - await initializeWorkingDir(true, standardUpdatesReport()); - + const execSnapshots = setupMocks({ wrapperFilename: 'gradlew.bat' }); jest.spyOn(os, 'platform').mockReturnValueOnce('win32'); - - await manager.extractAllPackageFiles(config, ['build.gradle']); + const dependencies = await extractAllPackageFiles(config, [ + 'build.gradle', + ]); + expect(dependencies).toMatchSnapshot(); expect(execSnapshots).toMatchSnapshot(); }); it('should execute gradle if gradlew is not available', async () => { - const execSnapshots = mockExecAll(exec, gradleOutput); - await initializeWorkingDir(false, standardUpdatesReport()); - - await manager.extractAllPackageFiles(config, ['build.gradle']); + const execSnapshots = setupMocks({ wrapperFilename: null }); + const dependencies = await extractAllPackageFiles(config, [ + 'build.gradle', + ]); + expect(dependencies).toMatchSnapshot(); expect(execSnapshots).toMatchSnapshot(); }); it('should return null and gradle should not be executed if no root build.gradle', async () => { - const execSnapshots = mockExecAll(exec, gradleOutput); - await initializeWorkingDir(false, null); - + const execSnapshots = setupMocks({ wrapperFilename: null, report: null }); const packageFiles = ['foo/build.gradle']; - expect( - await manager.extractAllPackageFiles(config, packageFiles) - ).toBeNull(); - - expect(exec).toHaveBeenCalledTimes(0); - expect(execSnapshots).toMatchSnapshot(); + expect(await extractAllPackageFiles(config, packageFiles)).toBeNull(); + expect(execSnapshots).toBeEmpty(); }); it('should return gradle dependencies for build.gradle in subdirectories if there is gradlew in the same directory', async () => { - const execSnapshots = mockExecAll(exec, gradleOutput); - await initializeWorkingDir(true, standardUpdatesReport()); - await fsExtra.mkdirs(`${config.localDir}/foo`); - await initializeWorkingDir( - true, - standardUpdatesReport(), - `${config.localDir}/foo` - ); + const execSnapshots = setupMocks({ + baseDir: '/foo/bar/', + wrapperFilename: 'baz/qux/gradlew', + packageFilename: 'baz/qux/build.gradle', + reportFilename: 'baz/qux/gradle-renovate-report.json', + pluginFilename: 'baz/qux/renovate-plugin.gradle', + }); - const dependencies = await manager.extractAllPackageFiles(config, [ - 'foo/build.gradle', + const dependencies = await extractAllPackageFiles(config, [ + 'baz/qux/build.gradle', ]); expect(dependencies).toMatchSnapshot(); expect(execSnapshots).toMatchSnapshot(); }); - it('should configure the renovate report plugin', async () => { - const execSnapshots = mockExecAll(exec, gradleOutput); - await initializeWorkingDir(true, standardUpdatesReport()); - - jest.spyOn(os, 'platform').mockReturnValueOnce('linux'); - await manager.extractAllPackageFiles(config, ['build.gradle']); - - await expect( - fsExtra.access( - `${config.localDir}/renovate-plugin.gradle`, - fsExtra.constants.F_OK - ) - ).resolves.toBeUndefined(); - expect(execSnapshots).toMatchSnapshot(); - }); - it('should use docker if required', async () => { - const configWithDocker = { binarySource: BinarySource.Docker, ...config }; + const dockerConfig = { ...config, binarySource: BinarySource.Docker }; jest.spyOn(docker, 'removeDanglingContainers').mockResolvedValueOnce(); - await util.setUtilConfig(configWithDocker); - await initializeWorkingDir(false, standardUpdatesReport()); - const execSnapshots = mockExecAll(exec, gradleOutput); - - await manager.extractAllPackageFiles(configWithDocker, ['build.gradle']); - + await setExecConfig(dockerConfig); + const execSnapshots = setupMocks({ wrapperFilename: null }); + const dependencies = await extractAllPackageFiles(config, [ + 'build.gradle', + ]); + expect(dependencies).toMatchSnapshot(); expect(execSnapshots).toMatchSnapshot(); }); it('should use docker even if gradlew is available', async () => { - const configWithDocker = { binarySource: BinarySource.Docker, ...config }; + const dockerConfig = { ...config, binarySource: BinarySource.Docker }; jest.spyOn(docker, 'removeDanglingContainers').mockResolvedValueOnce(); - await util.setUtilConfig(configWithDocker); - await initializeWorkingDir(true, standardUpdatesReport()); - - const execSnapshots = mockExecAll(exec, gradleOutput); - await manager.extractAllPackageFiles(configWithDocker, ['build.gradle']); - + await setExecConfig(dockerConfig); + const execSnapshots = setupMocks(); + const dependencies = await extractAllPackageFiles(config, [ + 'build.gradle', + ]); + expect(dependencies).toMatchSnapshot(); expect(execSnapshots).toMatchSnapshot(); }); it('should use docker even if gradlew.bat is available on Windows', async () => { - const configWithDocker = { binarySource: BinarySource.Docker, ...config }; + const dockerConfig = { ...config, binarySource: BinarySource.Docker }; jest.spyOn(docker, 'removeDanglingContainers').mockResolvedValueOnce(); - await util.setUtilConfig(configWithDocker); + await setExecConfig(dockerConfig); jest.spyOn(os, 'platform').mockReturnValueOnce('win32'); - await initializeWorkingDir(true, standardUpdatesReport()); - const execSnapshots = mockExecAll(exec, gradleOutput); - - await manager.extractAllPackageFiles(configWithDocker, ['build.gradle']); - + const execSnapshots = setupMocks({ wrapperFilename: 'gradlew.bat' }); + const dependencies = await extractAllPackageFiles(config, [ + 'build.gradle', + ]); + expect(dependencies).toMatchSnapshot(); expect(execSnapshots).toMatchSnapshot(); }); }); describe('updateDependency', () => { - let manager: typeof _manager; - let exec: jest.Mock; - - beforeAll(async () => { - [manager, exec] = await setupMocks(); - }); - afterAll(resetMocks); - - it('should update an existing module dependency', async () => { + it('should update an existing module dependency', () => { const execSnapshots = mockExecAll(exec, gradleOutput); - const buildGradleContent = await fsExtra.readFile( - `${fixtures}/build.gradle.example1`, - 'utf8' - ); + const buildGradleContent = loadFixture(`build.gradle.example1`); // prettier-ignore const upgrade = { depGroup: 'cglib', name: 'cglib-nodep', version: '3.1', newValue: '3.2.8', }; - const buildGradleContentUpdated = manager.updateDependency({ + const buildGradleContentUpdated = updateDependency({ fileContent: buildGradleContent, upgrade, }); @@ -325,7 +260,7 @@ describe(getName(), () => { expect(buildGradleContentUpdated).toMatch('cglib:cglib-nodep:3.2.8'); expect(buildGradleContentUpdated).not.toMatch('cglib:cglib-nodep:3.1'); - expect(execSnapshots).toMatchSnapshot(); + expect(execSnapshots).toBeEmpty(); }); it('should update an existing plugin dependency', () => { @@ -342,7 +277,7 @@ describe(getName(), () => { version: '0.20.0', newValue: '0.21.0', }; - const buildGradleContentUpdated = manager.updateDependency({ + const buildGradleContentUpdated = updateDependency({ fileContent: buildGradleContent, upgrade, }); @@ -358,7 +293,7 @@ describe(getName(), () => { 'id "com.github.ben-manes.versions" version "0.20.0"' ); - expect(execSnapshots).toMatchSnapshot(); + expect(execSnapshots).toBeEmpty(); }); it('should update an existing plugin dependency with Kotlin DSL', () => { @@ -375,7 +310,7 @@ describe(getName(), () => { version: '0.20.0', newValue: '0.21.0', }; - const buildGradleContentUpdated = manager.updateDependency({ + const buildGradleContentUpdated = updateDependency({ fileContent: buildGradleContent, upgrade, }); @@ -391,16 +326,13 @@ describe(getName(), () => { 'id("com.github.ben-manes.versions") version "0.20.0"' ); - expect(execSnapshots).toMatchSnapshot(); + expect(execSnapshots).toBeEmpty(); }); - it('should update dependencies in same file', async () => { + it('should update dependencies in same file', () => { const execSnapshots = mockExecAll(exec, gradleOutput); - const buildGradleContent = await fsExtra.readFile( - `${fixtures}/build.gradle.example1`, - 'utf8' - ); + const buildGradleContent = loadFixture(`build.gradle.example1`); const upgrade = { depGroup: 'org.apache.openjpa', @@ -409,7 +341,7 @@ describe(getName(), () => { newValue: '3.1.2', }; - const buildGradleContentUpdated = manager.updateDependency({ + const buildGradleContentUpdated = updateDependency({ fileContent: buildGradleContent, upgrade, }); @@ -432,7 +364,7 @@ describe(getName(), () => { "classpath 'org.apache.openjpa:openjpa:3.1.2'" ); - expect(execSnapshots).toMatchSnapshot(); + expect(execSnapshots).toBeEmpty(); }); }); });