diff --git a/docs/usage/configuration-options.md b/docs/usage/configuration-options.md index 689a999d3efcf40f36f0bfc3931a3707f8ddf569..12e9cf481e1cde5e5280e09796b6adeba68a57bd 100644 --- a/docs/usage/configuration-options.md +++ b/docs/usage/configuration-options.md @@ -716,7 +716,7 @@ By default, Renovate will use group names in Pull Request titles only when the P ## lockFileMaintenance -This feature can be used to refresh lock files and keep them up-to-date. "Maintaining" a lock file means recreating it so that every dependency version within it is updated to the latest. Supported lock files are `package-lock.json`, `yarn.lock` and `composer.lock`. Others may be added via feature request. +This feature can be used to refresh lock files and keep them up-to-date. "Maintaining" a lock file means recreating it so that every dependency version within it is updated to the latest. Supported lock files are `package-lock.json`, `yarn.lock`, `composer.lock` and `poetry.lock`. Others may be added via feature request. This feature is disabled by default. If you wish to enable this feature then you could add this to your configuration: diff --git a/lib/manager/poetry/__snapshots__/artifacts.spec.ts.snap b/lib/manager/poetry/__snapshots__/artifacts.spec.ts.snap index 4bedb2d680c751243d3ce653006bb290936eb671..00eef48ef4fe7147534d7200cc498454f1ba16d9 100644 --- a/lib/manager/poetry/__snapshots__/artifacts.spec.ts.snap +++ b/lib/manager/poetry/__snapshots__/artifacts.spec.ts.snap @@ -80,3 +80,24 @@ Array [ }, ] `; + +exports[`.updateArtifacts() returns updated poetry.lock when doing lockfile maintenance 1`] = ` +Array [ + Object { + "cmd": "poetry update --lock --no-interaction", + "options": Object { + "cwd": "/tmp/github/some/repo", + "encoding": "utf-8", + "env": Object { + "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", + }, + }, + }, +] +`; diff --git a/lib/manager/poetry/artifacts.spec.ts b/lib/manager/poetry/artifacts.spec.ts index 4f287b2e83369b44d4480d1042d54415e629d742..196c99fbd0396867ea983d39ace271ce7f3c80bb 100644 --- a/lib/manager/poetry/artifacts.spec.ts +++ b/lib/manager/poetry/artifacts.spec.ts @@ -116,4 +116,21 @@ describe('.updateArtifacts()', () => { }) ).toMatchSnapshot(); }); + it('returns updated poetry.lock when doing lockfile maintenance', async () => { + fs.readFile.mockResolvedValueOnce('Old poetry.lock' as any); + const execSnapshots = mockExecAll(exec); + fs.readFile.mockReturnValueOnce('New poetry.lock' as any); + expect( + await updateArtifacts({ + packageFileName: 'pyproject.toml', + updatedDeps: [], + newPackageFileContent: '{}', + config: { + ...config, + isLockFileMaintenance: true, + }, + }) + ).not.toBeNull(); + expect(execSnapshots).toMatchSnapshot(); + }); }); diff --git a/lib/manager/poetry/artifacts.ts b/lib/manager/poetry/artifacts.ts index 7e46960ccba077d53c1cfed62ea7301eed2b4dc3..cbc475c8a7ed29916a6db89d2d16379f02e6cc9d 100644 --- a/lib/manager/poetry/artifacts.ts +++ b/lib/manager/poetry/artifacts.ts @@ -1,4 +1,5 @@ import is from '@sindresorhus/is'; +import fs from 'fs-extra'; import { exec, ExecOptions } from '../../util/exec'; import { logger } from '../../logger'; import { UpdateArtifact, UpdateArtifactsResult } from '../common'; @@ -13,9 +14,10 @@ export async function updateArtifacts({ packageFileName, updatedDeps, newPackageFileContent, + config, }: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> { logger.debug(`poetry.updateArtifacts(${packageFileName})`); - if (!is.nonEmptyArray(updatedDeps)) { + if (!is.nonEmptyArray(updatedDeps) && !config.isLockFileMaintenance) { logger.debug('No updated poetry deps - returning null'); return null; } @@ -36,9 +38,14 @@ export async function updateArtifacts({ try { await writeLocalFile(packageFileName, newPackageFileContent); const cmd: string[] = []; - for (let i = 0; i < updatedDeps.length; i += 1) { - const dep = updatedDeps[i]; - cmd.push(`poetry update --lock --no-interaction ${dep}`); + if (config.isLockFileMaintenance) { + await fs.remove(lockFileName); + cmd.push('poetry update --lock --no-interaction'); + } else { + for (let i = 0; i < updatedDeps.length; i += 1) { + const dep = updatedDeps[i]; + cmd.push(`poetry update --lock --no-interaction ${dep}`); + } } const execOptions: ExecOptions = { subDirectory, diff --git a/lib/manager/poetry/index.ts b/lib/manager/poetry/index.ts index d5d3b9c9a8c6ff020de4d6ace8cc5c5593ff3e6c..c7622cab76f8fcd136274e9d58ad0a1e2abbb7e8 100644 --- a/lib/manager/poetry/index.ts +++ b/lib/manager/poetry/index.ts @@ -5,4 +5,4 @@ export { updateDependency } from './update'; export { updateArtifacts } from './artifacts'; export const language = LANGUAGE_PYTHON; -export const supportsLockFileMaintenance = false; +export const supportsLockFileMaintenance = true;