Skip to content
Snippets Groups Projects
Unverified Commit 0a4be4a9 authored by Sebastian Poxhofer's avatar Sebastian Poxhofer Committed by GitHub
Browse files

fix(manager/pep621): group pdm binary calls based on dependency groups (#22489)

parent f32b04f8
No related merge requests found
...@@ -7,6 +7,7 @@ import type { ...@@ -7,6 +7,7 @@ import type {
} from '../types'; } from '../types';
import { processors } from './processors'; import { processors } from './processors';
import { import {
depTypes,
parseDependencyGroupRecord, parseDependencyGroupRecord,
parseDependencyList, parseDependencyList,
parsePyProject, parsePyProject,
...@@ -32,11 +33,11 @@ export function extractPackageFile( ...@@ -32,11 +33,11 @@ export function extractPackageFile(
// pyProject standard definitions // pyProject standard definitions
deps.push( deps.push(
...parseDependencyList('project.dependencies', def.project?.dependencies) ...parseDependencyList(depTypes.dependencies, def.project?.dependencies)
); );
deps.push( deps.push(
...parseDependencyGroupRecord( ...parseDependencyGroupRecord(
'project.optional-dependencies', depTypes.optionalDependencies,
def.project?.['optional-dependencies'] def.project?.['optional-dependencies']
) )
); );
......
...@@ -5,6 +5,7 @@ import { GlobalConfig } from '../../../../config/global'; ...@@ -5,6 +5,7 @@ import { GlobalConfig } from '../../../../config/global';
import type { RepoGlobalConfig } from '../../../../config/types'; import type { RepoGlobalConfig } from '../../../../config/types';
import { getPkgReleases as _getPkgReleases } from '../../../datasource'; import { getPkgReleases as _getPkgReleases } from '../../../datasource';
import type { UpdateArtifactsConfig } from '../../types'; import type { UpdateArtifactsConfig } from '../../types';
import { depTypes } from '../utils';
import { PdmProcessor } from './pdm'; import { PdmProcessor } from './pdm';
jest.mock('../../../../util/fs'); jest.mock('../../../../util/fs');
...@@ -130,7 +131,28 @@ describe('modules/manager/pep621/processors/pdm', () => { ...@@ -130,7 +131,28 @@ describe('modules/manager/pep621/processors/pdm', () => {
releases: [{ version: 'v2.6.1' }, { version: 'v2.5.0' }], releases: [{ version: 'v2.6.1' }, { version: 'v2.5.0' }],
}); });
const updatedDeps = [{ packageName: 'dep1' }, { packageName: 'dep2' }]; const updatedDeps = [
{
packageName: 'dep1',
depType: depTypes.dependencies,
},
{ packageName: 'dep2', depType: depTypes.dependencies },
{
depName: 'group1/dep3',
depType: depTypes.optionalDependencies,
},
{ depName: 'group1/dep4', depType: depTypes.optionalDependencies },
{
depName: 'group2/dep5',
depType: depTypes.pdmDevDependencies,
},
{ depName: 'group2/dep6', depType: depTypes.pdmDevDependencies },
{
depName: 'group3/dep7',
depType: depTypes.pdmDevDependencies,
},
{ depName: 'group3/dep8', depType: depTypes.pdmDevDependencies },
];
const result = await processor.updateArtifacts( const result = await processor.updateArtifacts(
{ {
packageFileName: 'pyproject.toml', packageFileName: 'pyproject.toml',
...@@ -153,6 +175,15 @@ describe('modules/manager/pep621/processors/pdm', () => { ...@@ -153,6 +175,15 @@ describe('modules/manager/pep621/processors/pdm', () => {
{ {
cmd: 'pdm update dep1 dep2', cmd: 'pdm update dep1 dep2',
}, },
{
cmd: 'pdm update -G group1 dep3 dep4',
},
{
cmd: 'pdm update -dG group2 dep5 dep6',
},
{
cmd: 'pdm update -dG group3 dep7 dep8',
},
]); ]);
}); });
......
...@@ -9,9 +9,10 @@ import type { ...@@ -9,9 +9,10 @@ import type {
PackageDependency, PackageDependency,
UpdateArtifact, UpdateArtifact,
UpdateArtifactsResult, UpdateArtifactsResult,
Upgrade,
} from '../../types'; } from '../../types';
import type { PyProject } from '../schema'; import type { PyProject } from '../schema';
import { parseDependencyGroupRecord } from '../utils'; import { depTypes, parseDependencyGroupRecord } from '../utils';
import type { PyProjectProcessor } from './types'; import type { PyProjectProcessor } from './types';
export class PdmProcessor implements PyProjectProcessor { export class PdmProcessor implements PyProjectProcessor {
...@@ -23,7 +24,7 @@ export class PdmProcessor implements PyProjectProcessor { ...@@ -23,7 +24,7 @@ export class PdmProcessor implements PyProjectProcessor {
deps.push( deps.push(
...parseDependencyGroupRecord( ...parseDependencyGroupRecord(
'tool.pdm.dev-dependencies', depTypes.pdmDevDependencies,
pdm['dev-dependencies'] pdm['dev-dependencies']
) )
); );
...@@ -84,13 +85,13 @@ export class PdmProcessor implements PyProjectProcessor { ...@@ -84,13 +85,13 @@ export class PdmProcessor implements PyProjectProcessor {
// on lockFileMaintenance do not specify any packages and update the complete lock file // on lockFileMaintenance do not specify any packages and update the complete lock file
// else only update specific packages // else only update specific packages
let packageList = ''; const cmds: string[] = [];
if (!isLockFileMaintenance) { if (isLockFileMaintenance) {
packageList = ' '; cmds.push('pdm update');
packageList += updatedDeps.map((value) => value.packageName).join(' '); } else {
cmds.push(...generateCMDs(updatedDeps));
} }
const cmd = `pdm update${packageList}`; await exec(cmds, execOptions);
await exec(cmd, execOptions);
// check for changes // check for changes
const fileChanges: UpdateArtifactsResult[] = []; const fileChanges: UpdateArtifactsResult[] = [];
...@@ -126,3 +127,44 @@ export class PdmProcessor implements PyProjectProcessor { ...@@ -126,3 +127,44 @@ export class PdmProcessor implements PyProjectProcessor {
} }
} }
} }
function generateCMDs(updatedDeps: Upgrade[]): string[] {
const cmds: string[] = [];
const packagesByCMD: Record<string, string[]> = {};
for (const dep of updatedDeps) {
switch (dep.depType) {
case depTypes.optionalDependencies: {
const [group, name] = dep.depName!.split('/');
addPackageToCMDRecord(packagesByCMD, `pdm update -G ${group}`, name);
break;
}
case depTypes.pdmDevDependencies: {
const [group, name] = dep.depName!.split('/');
addPackageToCMDRecord(packagesByCMD, `pdm update -dG ${group}`, name);
break;
}
default: {
addPackageToCMDRecord(packagesByCMD, `pdm update`, dep.packageName!);
}
}
}
for (const commandPrefix in packagesByCMD) {
const packageList = packagesByCMD[commandPrefix].join(' ');
const cmd = `${commandPrefix} ${packageList}`;
cmds.push(cmd);
}
return cmds;
}
function addPackageToCMDRecord(
packagesByCMD: Record<string, string[]>,
commandPrefix: string,
packageName: string
): void {
if (is.nullOrUndefined(packagesByCMD[commandPrefix])) {
packagesByCMD[commandPrefix] = [];
}
packagesByCMD[commandPrefix].push(packageName);
}
...@@ -11,6 +11,12 @@ const pep508Regex = regEx( ...@@ -11,6 +11,12 @@ const pep508Regex = regEx(
/^(?<packageName>[A-Z0-9._-]+)\s*(\[(?<extras>[A-Z0-9,._-]+)\])?\s*(?<currentValue>[^;]+)?(;\s*(?<marker>.*))?/i /^(?<packageName>[A-Z0-9._-]+)\s*(\[(?<extras>[A-Z0-9,._-]+)\])?\s*(?<currentValue>[^;]+)?(;\s*(?<marker>.*))?/i
); );
export const depTypes = {
dependencies: 'project.dependencies',
optionalDependencies: 'project.optional-dependencies',
pdmDevDependencies: 'tool.pdm.dev-dependencies',
};
export function parsePEP508( export function parsePEP508(
value: string | null | undefined value: string | null | undefined
): Pep508ParseResult | null { ): Pep508ParseResult | null {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment