diff --git a/lib/config/presets/internal/custom-managers.spec.ts b/lib/config/presets/internal/custom-managers.spec.ts index e869acdabe1e20..505206ba9faf11 100644 --- a/lib/config/presets/internal/custom-managers.spec.ts +++ b/lib/config/presets/internal/custom-managers.spec.ts @@ -515,6 +515,79 @@ describe('config/presets/internal/custom-managers', () => { }); }); + describe('Update `_VERSION` variables in Makefiles', () => { + const customManager = presets['makefileVersions'].customManagers?.[0]; + + it(`find dependencies in file`, async () => { + const fileContent = codeBlock` + # renovate: datasource=node depName=node versioning=node + NODE_VERSION=18.13.0 + # renovate: datasource=npm depName=pnpm + PNPM_VERSION = "7.25.1" + # renovate: datasource=npm depName=yarn + YARN_VERSION := '3.3.1' + # renovate: datasource=custom.hashicorp depName=consul + CONSUL_VERSION ?= 1.3.1 + + lint: + \tnpm install -g pnpm@$(PNPM_VERSION) + `; + + const res = await extractPackageFile( + fileContent, + 'gitlab-ci.yml', + customManager!, + ); + + expect(res?.deps).toMatchObject([ + { + currentValue: '18.13.0', + datasource: 'node-version', + depName: 'node', + replaceString: + '# renovate: datasource=node depName=node versioning=node\nNODE_VERSION=18.13.0\n', + versioning: 'node', + }, + { + currentValue: '7.25.1', + datasource: 'npm', + depName: 'pnpm', + replaceString: + '# renovate: datasource=npm depName=pnpm\nPNPM_VERSION = "7.25.1"\n', + }, + { + currentValue: '3.3.1', + datasource: 'npm', + depName: 'yarn', + replaceString: + "# renovate: datasource=npm depName=yarn\nYARN_VERSION := '3.3.1'\n", + }, + { + currentValue: '1.3.1', + datasource: 'custom.hashicorp', + depName: 'consul', + replaceString: + '# renovate: datasource=custom.hashicorp depName=consul\nCONSUL_VERSION ?= 1.3.1\n', + }, + ]); + }); + + describe('matches regexes patterns', () => { + it.each` + path | expected + ${'Makefile'} | ${true} + ${'makefile'} | ${true} + ${'GNUMakefile'} | ${true} + ${'sub/dir/Makefile'} | ${true} + ${'versions.mk'} | ${true} + ${'Dockerfile'} | ${false} + ${'MakefileGenerator.ts'} | ${false} + `('$path', ({ path, expected }) => { + expect(regexMatches(path, customManager!.fileMatch)).toBe(expected); + }); + }); + }); + describe('finds dependencies in pom.xml properties', () => { const customManager = presets['mavenPropertyVersions'].customManagers?.[0]; diff --git a/lib/config/presets/internal/custom-managers.ts b/lib/config/presets/internal/custom-managers.ts index 6d772d39debe06..5a3fc8b244d53c 100644 --- a/lib/config/presets/internal/custom-managers.ts +++ b/lib/config/presets/internal/custom-managers.ts @@ -87,6 +87,23 @@ export const presets: Record = { ], description: 'Update `appVersion` value in Helm chart `Chart.yaml`.', }, + makefileVersions: { + customManagers: [ + { + customType: 'regex', + fileMatch: [ + '(^|/)Makefile$', + '(^|/)makefile$', + '(^|/)GNUMakefile$', + '\\.mk$', + ], + matchStrings: [ + '# renovate: datasource=(?[a-z-.]+?) depName=(?[^\\s]+?)(?: (?:packageName)=(?[^\\s]+?))?(?: versioning=(?[^\\s]+?))?(?: extractVersion=(?[^\\s]+?))?(?: registryUrl=(?[^\\s]+?))?\\s+[A-Za-z0-9_]+?_VERSION\\s*:*\\??=\\s*["\']?(?.+?)["\']?\\s', + ], + }, + ], + description: 'Update `_VERSION` variables in Makefiles.', + }, mavenPropertyVersions: { customManagers: [ {