Skip to content
Snippets Groups Projects
Commit 67cbbba8 authored by Rhys Arkins's avatar Rhys Arkins
Browse files

fix: Revert "feat(gradle): use maven datasource (#3062)"

This reverts commit 0a2b212c.
parent 0a2b212c
No related branches found
No related tags found
No related merge requests found
...@@ -1364,7 +1364,6 @@ const options = [ ...@@ -1364,7 +1364,6 @@ const options = [
enabled: false, enabled: false,
fileMatch: ['\\.gradle$', '(^|/)gradle.properties$'], fileMatch: ['\\.gradle$', '(^|/)gradle.properties$'],
timeout: 300, timeout: 300,
versionScheme: 'maven',
}, },
mergeable: true, mergeable: true,
cli: false, cli: false,
......
const path = require('path');
const fs = require('fs-extra');
const GRADLE_DEPENDENCY_REPORT_FILENAME = 'gradle-renovate-report.json';
async function createRenovateGradlePlugin(localDir) {
const content = `
import groovy.json.JsonOutput
import org.gradle.api.internal.artifacts.dependencies.DefaultExternalModuleDependency
import java.util.concurrent.ConcurrentLinkedQueue
def output = new ConcurrentLinkedQueue<>();
allprojects {
tasks.register("renovate") {
doLast {
def project = ['project': project.name]
output << project
def repos = repositories
.collect { "$it.url" }
.findAll { !it.startsWith('file:') }
project.repositories = repos
def deps = configurations.collect { config ->
config.dependencies
.find { it instanceof DefaultExternalModuleDependency }
.collect { ['name':it.name, 'group':it.group, 'version':it.version] }
}.flatten()
project.dependencies = deps
}
}
}
gradle.buildFinished {
def outputFile = new File('${GRADLE_DEPENDENCY_REPORT_FILENAME}')
def json = JsonOutput.toJson(output)
outputFile.write json
} `;
const gradleInitFile = path.join(localDir, 'renovate-plugin.gradle');
logger.debug(
'Creating renovate-plugin.gradle file with renovate gradle plugin'
);
await fs.writeFile(gradleInitFile, content);
}
async function extractDependenciesFromUpdatesReport(localDir) {
const gradleProjectConfigurations = await readGradleReport(localDir);
const dependencies = gradleProjectConfigurations
.map(mergeDependenciesWithRepositories, [])
.reduce(flatternDependencies, [])
.reduce(combineReposOnDuplicatedDependencies, []);
return dependencies.map(gradleModule => buildDependency(gradleModule));
}
async function readGradleReport(localDir) {
const renovateReportFilename = path.join(
localDir,
GRADLE_DEPENDENCY_REPORT_FILENAME
);
if (!(await fs.exists(renovateReportFilename))) {
return [];
}
const contents = await fs.readFile(renovateReportFilename, 'utf8');
try {
return JSON.parse(contents);
} catch (e) {
logger.error('Invalid JSON', e);
return [];
}
}
function mergeDependenciesWithRepositories(project) {
if (!project.dependencies) {
return [];
}
return project.dependencies.map(dep => ({
...dep,
repos: [...project.repositories],
}));
}
function flatternDependencies(accumulator, currentValue) {
accumulator.push(...currentValue);
return accumulator;
}
function combineReposOnDuplicatedDependencies(accumulator, currentValue) {
const existingDependency = accumulator.find(
dep => dep.name === currentValue.name
);
if (!existingDependency) {
accumulator.push(currentValue);
} else {
existingDependency.repos.push(...currentValue.repos);
}
return accumulator;
}
function buildDependency(gradleModule) {
const repositories = gradleModule.repos.join(',');
return {
name: gradleModule.name,
depGroup: gradleModule.group,
depName: `${gradleModule.group}:${gradleModule.name}`,
currentValue: gradleModule.version,
purl: `pkg:maven/${gradleModule.group}/${
gradleModule.name
}?repository_url=${repositories}`,
};
}
module.exports = {
extractDependenciesFromUpdatesReport,
createRenovateGradlePlugin,
GRADLE_DEPENDENCY_REPORT_FILENAME,
};
...@@ -3,10 +3,10 @@ const fs = require('fs-extra'); ...@@ -3,10 +3,10 @@ const fs = require('fs-extra');
const path = require('path'); const path = require('path');
const gradle = require('./build-gradle'); const gradle = require('./build-gradle');
const updatesReport = require('./gradle-updates-report');
const GRADLE_DEPENDENCY_REPORT_COMMAND = const GRADLE_DEPENDENCY_REPORT_COMMAND =
'gradle --init-script renovate-plugin.gradle renovate'; 'gradle --init-script init.gradle dependencyUpdates -Drevision=release';
const GRADLE_DEPENDENCY_REPORT_FILENAME = 'build/dependencyUpdates/report.json';
const TIMEOUT_CODE = 143; const TIMEOUT_CODE = 143;
async function extractAllPackageFiles(config, packageFiles) { async function extractAllPackageFiles(config, packageFiles) {
...@@ -25,56 +25,125 @@ async function extractAllPackageFiles(config, packageFiles) { ...@@ -25,56 +25,125 @@ async function extractAllPackageFiles(config, packageFiles) {
} }
} }
await updatesReport.createRenovateGradlePlugin(config.localDir); await configureUseLatestVersionPlugin(config.localDir);
const gradleSuccess = await executeGradle(config); const gradleSuccess = await executeGradle(config);
if (!gradleSuccess) { if (!gradleSuccess) {
logger.warn('No gradle dependencies found');
return null; return null;
} }
gradle.init(); gradle.init();
const dependencies = await updatesReport.extractDependenciesFromUpdatesReport(
config.localDir
);
if (dependencies.length === 0) {
return [];
}
const gradleFiles = []; const gradleFiles = [];
for (const packageFile of packageFiles) { for (const packageFile of packageFiles) {
const content = await platform.getFile(packageFile); const content = await platform.getFile(packageFile);
if (content) { if (content) {
const deps = await extractPackageFile(content, packageFile, config);
if (deps) {
gradleFiles.push({ gradleFiles.push({
packageFile, packageFile,
manager: 'gradle', manager: 'gradle',
deps: dependencies, ...deps,
}); });
}
gradle.collectVersionVariables(dependencies, content);
} else { } else {
logger.info({ packageFile }, 'packageFile has no content'); logger.info({ packageFile }, 'packageFile has no content');
} }
} }
return gradleFiles; return gradleFiles;
} }
async function extractPackageFile(content, fileName, config) {
logger.debug(`gradle.extractPackageFile(filename=${fileName})`);
const gradleFile = path.join(config.localDir, fileName);
const baseDir = path.dirname(gradleFile);
const deps = await extractDependenciesFromUpdatesReport(baseDir);
gradle.collectVersionVariables(deps, content);
return deps.length > 0 ? { deps } : null;
}
function getPackageUpdates(config) {
logger.debug(`gradle.getPackageUpdates(depName=${config.depName})`);
if (config.available) {
return [
{
depName: config.depName,
newValue: config.available.release,
},
];
}
return [];
}
function updateDependency(fileContent, upgrade) { function updateDependency(fileContent, upgrade) {
// prettier-ignore // prettier-ignore
logger.debug(`gradle.updateDependency(): packageFile:${upgrade.packageFile} depName:${upgrade.depName}, version:${upgrade.version} ==> ${upgrade.newValue}`); logger.debug(`gradle.updateDependency(): packageFile:${upgrade.packageFile} depName:${upgrade.depName}, version:${upgrade.version} ==> ${upgrade.newValue}`);
return gradle.updateGradleVersion( const newFileContent = gradle.updateGradleVersion(
fileContent, fileContent,
buildGradleDependency(upgrade), buildGradleDependency(upgrade),
upgrade.newValue upgrade.available.release
); );
return newFileContent;
}
async function configureUseLatestVersionPlugin(localDir) {
const content = `
gradle.projectsLoaded {
rootProject.allprojects {
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath "gradle.plugin.se.patrikerdes:gradle-use-latest-versions-plugin:0.2.3"
classpath 'com.github.ben-manes:gradle-versions-plugin:0.17.0'
}
}
afterEvaluate { project ->
project.apply plugin: 'com.github.ben-manes.versions'
project.apply plugin: 'se.patrikerdes.use-latest-versions'
}
}
}
`;
const gradleInitFile = path.join(localDir, 'init.gradle');
logger.debug('Creating init.gradle file');
await fs.writeFile(gradleInitFile, content);
} }
function buildGradleDependency(config) { function buildGradleDependency(config) {
return { group: config.depGroup, name: config.name, version: config.version }; return { group: config.depGroup, name: config.name, version: config.version };
} }
async function extractDependenciesFromUpdatesReport(localDir) {
const filename = path.join(localDir, GRADLE_DEPENDENCY_REPORT_FILENAME);
if (!(await fs.exists(filename))) {
return [];
}
const contents = await fs.readFile(
path.join(localDir, GRADLE_DEPENDENCY_REPORT_FILENAME),
'utf8'
);
const dependencies = JSON.parse(contents);
const combinedGradleDeps = dependencies.current.dependencies.concat(
dependencies.exceeded.dependencies,
dependencies.outdated.dependencies,
dependencies.unresolved.dependencies
);
return combinedGradleDeps.map(gradleModule => {
const dependency = { ...gradleModule };
delete dependency.group;
dependency.depGroup = gradleModule.group;
dependency.depName = `${gradleModule.group}:${gradleModule.name}`;
dependency.currentValue = gradleModule.version;
return dependency;
});
}
async function executeGradle(config) { async function executeGradle(config) {
let stdout; let stdout;
let stderr; let stderr;
...@@ -115,6 +184,7 @@ function getDockerRenovateGradleCommandLine(localDir) { ...@@ -115,6 +184,7 @@ function getDockerRenovateGradleCommandLine(localDir) {
module.exports = { module.exports = {
extractAllPackageFiles, extractAllPackageFiles,
getPackageUpdates,
updateDependency, updateDependency,
language: 'java', language: 'java',
}; };
[
{
"project": "project1",
"repositories": [
"https://repo.maven.apache.org/maven2/"
],
"dependencies": [
{
"name": "spring-boot-starter-jersey",
"group": "org.springframework.boot",
"version": null
},
{
"name": "cglib-nodep",
"group": "cglib",
"version": "3.1"
}
]
},
{
"project": "project2",
"repositories": [
"https://jitpack.io"
],
"dependencies": [
{
"name": "spring-boot-starter-jersey",
"group": "org.springframework.boot",
"version": null
},
{
"name": "spock-core",
"group": "org.spockframework",
"version": "1.0-groovy-2.4"
}
]
}
]
[
{ {
"project": "telegram-images", "current": {
"repositories": [
"https://repo.maven.apache.org/maven2/",
"https://jitpack.io"
],
"dependencies": [ "dependencies": [
{ {
"name": "spring-boot-starter-jersey", "group": "com.fkorotkov",
"group": "org.springframework.boot", "version": "0.1",
"version": null "name": "gradle-libraries-plugin"
}, },
{ {
"name": "spock-core", "group": "gradle.plugin.se.patrikerdes",
"group": "org.spockframework", "version": "0.2.3",
"version": "1.0-groovy-2.4" "name": "gradle-use-latest-versions-plugin"
}, },
{ {
"name": "cglib-nodep", "group": "org.hamcrest",
"version": "1.3",
"name": "hamcrest-core"
}
],
"count": 3
},
"exceeded": {
"dependencies": [
],
"count": 0
},
"outdated": {
"dependencies": [
{
"group": "cglib", "group": "cglib",
"version": "3.1" "available": {
"release": "3.2.8",
"milestone": null,
"integration": null
},
"version": "3.1",
"name": "cglib-nodep"
},
{
"group": "org.grails",
"available": {
"release": "6.1.10.RELEASE",
"milestone": null,
"integration": null
},
"version": "6.0.9.RELEASE",
"name": "gorm-hibernate5-spring-boot"
},
{
"group": "mysql",
"available": {
"release": "8.0.12",
"milestone": null,
"integration": null
},
"version": "5.1.41",
"name": "mysql-connector-java"
},
{
"group": "org.springframework.boot",
"available": {
"release": "2.0.5.RELEASE",
"milestone": null,
"integration": null
},
"version": "1.5.2.RELEASE",
"name": "spring-boot-starter-test"
} }
] ],
"count": 4
},
"unresolved": {
"dependencies": [
],
"count": 0
},
"count": 7
} }
]
[
{ {
"project": "telegram-images", "current": {
"repositories": [ "dependencies": [
"https://repo.maven.apache.org/maven2/", ],
"https://jitpack.io" "count": 0
] },
"exceeded": {
"dependencies": [
],
"count": 0
},
"outdated": {
"dependencies": [
],
"count": 0
},
"unresolved": {
"dependencies": [
],
"count": 0
},
"count": 0
} }
]
...@@ -33,7 +33,6 @@ const config = { ...@@ -33,7 +33,6 @@ const config = {
describe('datasource/maven', () => { describe('datasource/maven', () => {
beforeEach(() => { beforeEach(() => {
nock.disableNetConnect();
nock('http://central.maven.org') nock('http://central.maven.org')
.get('/maven2/mysql/mysql-connector-java/maven-metadata.xml') .get('/maven2/mysql/mysql-connector-java/maven-metadata.xml')
.reply(200, MYSQL_MAVEN_METADATA); .reply(200, MYSQL_MAVEN_METADATA);
...@@ -50,10 +49,6 @@ describe('datasource/maven', () => { ...@@ -50,10 +49,6 @@ describe('datasource/maven', () => {
.reply(200, 'non-sense'); .reply(200, 'non-sense');
}); });
afterEach(() => {
nock.enableNetConnect();
});
describe('getPkgReleases', () => { describe('getPkgReleases', () => {
it('should return empty if library is not found', async () => { it('should return empty if library is not found', async () => {
const releases = await datasource.getPkgReleases({ const releases = await datasource.getPkgReleases({
......
...@@ -5,84 +5,73 @@ Array [ ...@@ -5,84 +5,73 @@ Array [
Object { Object {
"deps": Array [ "deps": Array [
Object { Object {
"currentValue": null, "currentValue": "0.1",
"depGroup": "org.springframework.boot", "depGroup": "com.fkorotkov",
"depName": "org.springframework.boot:spring-boot-starter-jersey", "depName": "com.fkorotkov:gradle-libraries-plugin",
"name": "spring-boot-starter-jersey", "name": "gradle-libraries-plugin",
"purl": "pkg:maven/org.springframework.boot/spring-boot-starter-jersey?repository_url=https://repo.maven.apache.org/maven2/,https://jitpack.io", "version": "0.1",
}, },
Object { Object {
"currentValue": "1.0-groovy-2.4", "currentValue": "0.2.3",
"depGroup": "org.spockframework", "depGroup": "gradle.plugin.se.patrikerdes",
"depName": "org.spockframework:spock-core", "depName": "gradle.plugin.se.patrikerdes:gradle-use-latest-versions-plugin",
"name": "spock-core", "name": "gradle-use-latest-versions-plugin",
"purl": "pkg:maven/org.spockframework/spock-core?repository_url=https://repo.maven.apache.org/maven2/,https://jitpack.io", "version": "0.2.3",
}, },
Object { Object {
"currentValue": "3.1", "currentValue": "1.3",
"depGroup": "cglib", "depGroup": "org.hamcrest",
"depName": "cglib:cglib-nodep", "depName": "org.hamcrest:hamcrest-core",
"name": "cglib-nodep", "name": "hamcrest-core",
"purl": "pkg:maven/cglib/cglib-nodep?repository_url=https://repo.maven.apache.org/maven2/,https://jitpack.io", "version": "1.3",
},
],
"manager": "gradle",
"packageFile": "build.gradle",
}, },
Object { Object {
"deps": Array [ "available": Object {
Object { "integration": null,
"currentValue": null, "milestone": null,
"depGroup": "org.springframework.boot", "release": "3.2.8",
"depName": "org.springframework.boot:spring-boot-starter-jersey",
"name": "spring-boot-starter-jersey",
"purl": "pkg:maven/org.springframework.boot/spring-boot-starter-jersey?repository_url=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",
"purl": "pkg:maven/org.spockframework/spock-core?repository_url=https://repo.maven.apache.org/maven2/,https://jitpack.io",
}, },
Object {
"currentValue": "3.1", "currentValue": "3.1",
"depGroup": "cglib", "depGroup": "cglib",
"depName": "cglib:cglib-nodep", "depName": "cglib:cglib-nodep",
"name": "cglib-nodep", "name": "cglib-nodep",
"purl": "pkg:maven/cglib/cglib-nodep?repository_url=https://repo.maven.apache.org/maven2/,https://jitpack.io", "version": "3.1",
}, },
],
"manager": "gradle",
"packageFile": "subproject/build.gradle",
},
]
`;
exports[`manager/gradle extractPackageFile should use repositories only for current project 1`] = `
Array [
Object {
"deps": Array [
Object { Object {
"currentValue": null, "available": Object {
"depGroup": "org.springframework.boot", "integration": null,
"depName": "org.springframework.boot:spring-boot-starter-jersey", "milestone": null,
"name": "spring-boot-starter-jersey", "release": "6.1.10.RELEASE",
"purl": "pkg:maven/org.springframework.boot/spring-boot-starter-jersey?repository_url=https://repo.maven.apache.org/maven2/,https://jitpack.io", },
"currentValue": "6.0.9.RELEASE",
"depGroup": "org.grails",
"depName": "org.grails:gorm-hibernate5-spring-boot",
"name": "gorm-hibernate5-spring-boot",
"version": "6.0.9.RELEASE",
}, },
Object { Object {
"currentValue": "3.1", "available": Object {
"depGroup": "cglib", "integration": null,
"depName": "cglib:cglib-nodep", "milestone": null,
"name": "cglib-nodep", "release": "8.0.12",
"purl": "pkg:maven/cglib/cglib-nodep?repository_url=https://repo.maven.apache.org/maven2/", },
"currentValue": "5.1.41",
"depGroup": "mysql",
"depName": "mysql:mysql-connector-java",
"name": "mysql-connector-java",
"version": "5.1.41",
}, },
Object { Object {
"currentValue": "1.0-groovy-2.4", "available": Object {
"depGroup": "org.spockframework", "integration": null,
"depName": "org.spockframework:spock-core", "milestone": null,
"name": "spock-core", "release": "2.0.5.RELEASE",
"purl": "pkg:maven/org.spockframework/spock-core?repository_url=https://jitpack.io", },
"currentValue": "1.5.2.RELEASE",
"depGroup": "org.springframework.boot",
"depName": "org.springframework.boot:spring-boot-starter-test",
"name": "spring-boot-starter-test",
"version": "1.5.2.RELEASE",
}, },
], ],
"manager": "gradle", "manager": "gradle",
......
...@@ -5,9 +5,6 @@ const { toUnix } = require('upath'); ...@@ -5,9 +5,6 @@ const { toUnix } = require('upath');
const fs = require('fs-extra'); const fs = require('fs-extra');
const fsReal = require('fs'); const fsReal = require('fs');
const { exec } = require('child-process-promise'); const { exec } = require('child-process-promise');
const { initLogger } = require('../../../lib/logger');
initLogger();
const manager = require('../../../lib/manager/gradle/index'); const manager = require('../../../lib/manager/gradle/index');
...@@ -37,7 +34,6 @@ describe('manager/gradle', () => { ...@@ -37,7 +34,6 @@ describe('manager/gradle', () => {
it('should return gradle dependencies', async () => { it('should return gradle dependencies', async () => {
const dependencies = await manager.extractAllPackageFiles(config, [ const dependencies = await manager.extractAllPackageFiles(config, [
'build.gradle', 'build.gradle',
'subproject/build.gradle',
]); ]);
expect(dependencies).toMatchSnapshot(); expect(dependencies).toMatchSnapshot();
}); });
...@@ -76,36 +72,11 @@ describe('manager/gradle', () => { ...@@ -76,36 +72,11 @@ describe('manager/gradle', () => {
expect(dependencies).toEqual([]); expect(dependencies).toEqual([]);
}); });
it('should return empty if renovate report is invalid', async () => {
const renovateReport = `
Invalid JSON]
`;
fs.readFile.mockReturnValue(renovateReport);
const dependencies = await manager.extractAllPackageFiles(config, [
'build.gradle',
]);
expect(dependencies).toEqual([]);
});
it('should use repositories only for current project', async () => {
const multiProjectUpdatesReport = fsReal.readFileSync(
'test/_fixtures/gradle/MultiProjectUpdatesReport.json',
'utf8'
);
fs.readFile.mockReturnValue(multiProjectUpdatesReport);
const dependencies = await manager.extractAllPackageFiles(config, [
'build.gradle',
]);
expect(dependencies).toMatchSnapshot();
});
it('should execute gradle with the proper parameters', async () => { it('should execute gradle with the proper parameters', async () => {
await manager.extractAllPackageFiles(config, ['build.gradle']); await manager.extractAllPackageFiles(config, ['build.gradle']);
expect(exec.mock.calls[0][0]).toBe( expect(exec.mock.calls[0][0]).toBe(
'gradle --init-script renovate-plugin.gradle renovate' 'gradle --init-script init.gradle dependencyUpdates -Drevision=release'
); );
expect(exec.mock.calls[0][1]).toMatchObject({ expect(exec.mock.calls[0][1]).toMatchObject({
cwd: 'localDir', cwd: 'localDir',
...@@ -122,6 +93,14 @@ describe('manager/gradle', () => { ...@@ -122,6 +93,14 @@ describe('manager/gradle', () => {
expect(exec.mock.calls.length).toBe(0); expect(exec.mock.calls.length).toBe(0);
}); });
it('should return empty if not content', async () => {
platform.getFile.mockReturnValue(null);
const res = await manager.extractAllPackageFiles(config, [
'build.gradle',
]);
expect(res).toEqual([]);
});
it('should write files before extracting', async () => { it('should write files before extracting', async () => {
const packageFiles = ['build.gradle', 'foo/build.gradle']; const packageFiles = ['build.gradle', 'foo/build.gradle'];
await manager.extractAllPackageFiles(config, packageFiles); await manager.extractAllPackageFiles(config, packageFiles);
...@@ -146,11 +125,11 @@ describe('manager/gradle', () => { ...@@ -146,11 +125,11 @@ describe('manager/gradle', () => {
expect(fs.outputFile.mock.calls.length).toBe(0); expect(fs.outputFile.mock.calls.length).toBe(0);
}); });
it('should configure the renovate report plugin', async () => { it('should configure the useLatestVersion plugin', async () => {
await manager.extractAllPackageFiles(config, ['build.gradle']); await manager.extractAllPackageFiles(config, ['build.gradle']);
expect(toUnix(fs.writeFile.mock.calls[0][0])).toBe( expect(toUnix(fs.writeFile.mock.calls[0][0])).toBe(
'localDir/renovate-plugin.gradle' 'localDir/init.gradle'
); );
}); });
...@@ -162,11 +141,41 @@ describe('manager/gradle', () => { ...@@ -162,11 +141,41 @@ describe('manager/gradle', () => {
await manager.extractAllPackageFiles(configWithDocker, ['build.gradle']); await manager.extractAllPackageFiles(configWithDocker, ['build.gradle']);
expect(exec.mock.calls[0][0]).toBe( expect(exec.mock.calls[0][0]).toBe(
'docker run --rm -v localDir:localDir -w localDir renovate/gradle gradle --init-script renovate-plugin.gradle renovate' 'docker run --rm -v localDir:localDir -w localDir renovate/gradle gradle --init-script init.gradle dependencyUpdates -Drevision=release'
); );
}); });
}); });
describe('getPackageUpdates', () => {
it('should return the new version if it is available', async () => {
const newVersion = {
...config,
depName: 'cglib:cglib-nodep',
available: {
release: '3.2.8',
},
};
const outdatedDependencies = await manager.getPackageUpdates(newVersion);
expect(outdatedDependencies).toMatchObject([
{
depName: 'cglib:cglib-nodep',
newValue: '3.2.8',
},
]);
});
it('should return empty if there is no new version', async () => {
const newVersion = {
...config,
depName: 'cglib:cglib-nodep',
};
const outdatedDependencies = await manager.getPackageUpdates(newVersion);
expect(outdatedDependencies).toMatchObject([]);
});
});
describe('updateDependency', () => { describe('updateDependency', () => {
it('should update an existing dependency', () => { it('should update an existing dependency', () => {
const buildGradleContent = fsReal.readFileSync( const buildGradleContent = fsReal.readFileSync(
...@@ -175,7 +184,8 @@ describe('manager/gradle', () => { ...@@ -175,7 +184,8 @@ describe('manager/gradle', () => {
); );
// prettier-ignore // prettier-ignore
const upgrade = { const upgrade = {
depGroup: 'cglib', name: 'cglib-nodep', version: '3.1', newValue: '3.2.8' depGroup: 'cglib', name: 'cglib-nodep', version: '3.1',
available: { release: '3.2.8', milestone: null, integration: null },
}; };
const buildGradleContentUpdated = manager.updateDependency( const buildGradleContentUpdated = manager.updateDependency(
buildGradleContent, buildGradleContent,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment