diff --git a/lib/modules/manager/gradle/extract.spec.ts b/lib/modules/manager/gradle/extract.spec.ts index 88ad473a74ccd3a21962be4658ccbc0f1b9e22aa..d31b8633f2424c62d6dbf4118788f393a86e9eb3 100644 --- a/lib/modules/manager/gradle/extract.spec.ts +++ b/lib/modules/manager/gradle/extract.spec.ts @@ -199,6 +199,10 @@ describe('modules/manager/gradle/extract', () => { maven { url = "\${repositoryBaseURL}/repository-build" } + maven { + name = "baz" + url = "\${repositoryBaseURL}/\${name}" + } } dependencies { @@ -230,13 +234,14 @@ describe('modules/manager/gradle/extract', () => { depName: 'com.google.protobuf:protobuf-java', currentValue: '2.17.0', managerData: { - fileReplacePosition: 227, + fileReplacePosition: 335, packageFile: 'build.gradle', }, - fileReplacePosition: 227, + fileReplacePosition: 335, registryUrls: [ 'https://repo.maven.apache.org/maven2', 'https://dummy.org/whatever/repository-build', + 'https://dummy.org/whatever/baz', ], }, ], diff --git a/lib/modules/manager/gradle/parser.spec.ts b/lib/modules/manager/gradle/parser.spec.ts index 779d9bf10a0c43da8c243be2affa24fa597546e1..358384df5df273fa28c1a42c85815674fc49f6a6 100644 --- a/lib/modules/manager/gradle/parser.spec.ts +++ b/lib/modules/manager/gradle/parser.spec.ts @@ -107,26 +107,27 @@ describe('modules/manager/gradle/parser', () => { describe('registryUrls', () => { test.each` - def | input | url - ${''} | ${'url ""'} | ${null} - ${''} | ${'url "#!@"'} | ${null} - ${''} | ${'url "https://example.com"'} | ${'https://example.com'} - ${'base="https://foo.bar"'} | ${'url "${base}/baz"'} | ${'https://foo.bar/baz'} - ${''} | ${'url("https://example.com")'} | ${'https://example.com'} - ${'base="https://foo.bar"'} | ${'url("${base}/baz")'} | ${'https://foo.bar/baz'} - ${''} | ${'mavenCentral()'} | ${MAVEN_REPO} - ${''} | ${'jcenter()'} | ${JCENTER_REPO} - ${''} | ${'google()'} | ${GOOGLE_REPO} - ${''} | ${'google { content { includeGroup "foo" } }'} | ${GOOGLE_REPO} - ${''} | ${'gradlePluginPortal()'} | ${GRADLE_PLUGIN_PORTAL_REPO} - ${''} | ${'maven("https://foo.bar/baz/qux")'} | ${'https://foo.bar/baz/qux'} - ${'base="https://foo.bar"'} | ${'maven("${base}/baz/qux")'} | ${'https://foo.bar/baz/qux'} - ${''} | ${'maven { url = uri("https://foo.bar/baz")'} | ${'https://foo.bar/baz'} - ${'base="https://foo.bar"'} | ${'maven { url = uri("${base}/baz")'} | ${'https://foo.bar/baz'} - ${''} | ${"maven { url 'https://foo.bar/baz'"} | ${'https://foo.bar/baz'} - ${'base="https://foo.bar"'} | ${'maven { url "${base}/baz"'} | ${'https://foo.bar/baz'} - ${''} | ${"maven { url = 'https://foo.bar/baz'"} | ${'https://foo.bar/baz'} - ${'base="https://foo.bar"'} | ${'maven { url = "${base}/baz"'} | ${'https://foo.bar/baz'} + def | input | url + ${''} | ${'url ""'} | ${null} + ${''} | ${'url "#!@"'} | ${null} + ${''} | ${'url "https://example.com"'} | ${'https://example.com'} + ${'base="https://foo.bar"'} | ${'url "${base}/baz"'} | ${'https://foo.bar/baz'} + ${''} | ${'url("https://example.com")'} | ${'https://example.com'} + ${'base="https://foo.bar"'} | ${'url("${base}/baz")'} | ${'https://foo.bar/baz'} + ${''} | ${'mavenCentral()'} | ${MAVEN_REPO} + ${''} | ${'jcenter()'} | ${JCENTER_REPO} + ${''} | ${'google()'} | ${GOOGLE_REPO} + ${''} | ${'google { content { includeGroup "foo" } }'} | ${GOOGLE_REPO} + ${''} | ${'gradlePluginPortal()'} | ${GRADLE_PLUGIN_PORTAL_REPO} + ${''} | ${'maven("https://foo.bar/baz/qux")'} | ${'https://foo.bar/baz/qux'} + ${'base="https://foo.bar"'} | ${'maven("${base}/baz/qux")'} | ${'https://foo.bar/baz/qux'} + ${''} | ${'maven { url = uri("https://foo.bar/baz")'} | ${'https://foo.bar/baz'} + ${'base="https://foo.bar"'} | ${'maven { url = uri("${base}/baz")'} | ${'https://foo.bar/baz'} + ${''} | ${"maven { url 'https://foo.bar/baz'"} | ${'https://foo.bar/baz'} + ${'base="https://foo.bar"'} | ${'maven { url "${base}/baz"'} | ${'https://foo.bar/baz'} + ${''} | ${"maven { url = 'https://foo.bar/baz'"} | ${'https://foo.bar/baz'} + ${'base="https://foo.bar"'} | ${'maven { url = "${base}/baz"'} | ${'https://foo.bar/baz'} + ${'base="https://foo.bar"'} | ${'maven { name = "baz"\nurl = "${base}/${name}"'} | ${'https://foo.bar/baz'} `('$def | $input', ({ def, input, url }) => { const expected = [url].filter(Boolean); const { urls } = parseGradle([def, input].join('\n')); diff --git a/lib/modules/manager/gradle/parser.ts b/lib/modules/manager/gradle/parser.ts index cb33ef3c111c9d0976ce9fdce86fee1391e29580..3f5d30940b7ccdd4757bd356b42c89253fe8f305 100644 --- a/lib/modules/manager/gradle/parser.ts +++ b/lib/modules/manager/gradle/parser.ts @@ -278,10 +278,21 @@ function processCustomRegistryUrl({ tokenMap, variables, }: SyntaxHandlerInput): SyntaxHandlerOutput { + let localVariables = variables; + if (tokenMap.keyToken?.value === 'name') { + localVariables = { + ...variables, + name: { + key: 'name', + value: tokenMap.valToken.value, + }, + }; + } + let registryUrl: string | null = tokenMap.registryUrl?.value; if (tokenMap.registryUrl?.type === TokenType.StringInterpolation) { const token = tokenMap.registryUrl as StringInterpolation; - registryUrl = interpolateString(token.children, variables); + registryUrl = interpolateString(token.children, localVariables); } try { @@ -556,6 +567,37 @@ const matcherConfigs: SyntaxMatchConfig[] = [ ], handler: processCustomRegistryUrl, }, + { + // maven { name = "baz"; url = "https://maven.springframework.org/${name}" } + matchers: [ + { + matchType: TokenType.Word, + matchValue: 'maven', + }, + { matchType: TokenType.LeftBrace }, + { + matchType: TokenType.Word, + matchValue: 'name', + tokenMapKey: 'keyToken', + }, + { matchType: TokenType.Assignment }, + { + matchType: [TokenType.String, TokenType.StringInterpolation], + tokenMapKey: 'valToken', + }, + { + matchType: TokenType.Word, + matchValue: 'url', + }, + { matchType: TokenType.Assignment }, + { + matchType: [TokenType.String, TokenType.StringInterpolation], + tokenMapKey: 'registryUrl', + }, + endOfInstruction, + ], + handler: processCustomRegistryUrl, + }, { // maven { url = "https://maven.springframework.org/release" matchers: [