Skip to content

Commit 5a3b008

Browse files
committed
fix(release): process project dependents in other release groups despite group filter #31273
1 parent 79ac44d commit 5a3b008

File tree

2 files changed

+111
-1
lines changed

2 files changed

+111
-1
lines changed

packages/nx/src/command-line/release/version/release-group-processor.spec.ts

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1258,6 +1258,75 @@ describe('ReleaseGroupProcessor', () => {
12581258
* will have already been caught and handled by filterReleaseGroups(), so that is not repeated here.
12591259
*/
12601260
describe('filters', () => {
1261+
it('should bump projects across release groups when one release group is selected but all projects are in nx release config', async () => {
1262+
const {
1263+
nxReleaseConfig,
1264+
projectGraph,
1265+
releaseGroups,
1266+
releaseGroupToFilteredProjects,
1267+
filters,
1268+
} = await createNxReleaseConfigAndPopulateWorkspace(
1269+
tree,
1270+
`
1271+
projectJ ({ "projectsRelationship": "independent" }):
1272+
- projectJ@1.0.0 [js]
1273+
-> depends on projectK
1274+
projectK ({ "projectsRelationship": "independent" }):
1275+
- projectK@2.0.0 [js]
1276+
`,
1277+
{
1278+
version: {
1279+
conventionalCommits: true,
1280+
updateDependents: 'auto',
1281+
},
1282+
},
1283+
mockResolveCurrentVersion,
1284+
{
1285+
// Apply the groups filter to only include projectL in versioning.
1286+
groups: ['projectK'],
1287+
}
1288+
);
1289+
1290+
const processor = new ReleaseGroupProcessor(
1291+
tree,
1292+
projectGraph,
1293+
nxReleaseConfig,
1294+
releaseGroups,
1295+
releaseGroupToFilteredProjects,
1296+
{
1297+
dryRun: false,
1298+
verbose: false,
1299+
firstRelease: false,
1300+
preid: undefined,
1301+
filters,
1302+
}
1303+
);
1304+
await processor.init();
1305+
1306+
mockDeriveSpecifierFromConventionalCommits.mockImplementation(
1307+
() => 'minor'
1308+
);
1309+
await processor.processGroups();
1310+
1311+
// projectJ should not be bumped because updateDependents is set to "never"
1312+
expect(readJson(tree, 'projectJ/package.json')).toMatchInlineSnapshot(`
1313+
{
1314+
"dependencies": {
1315+
"projectK": "2.1.0",
1316+
},
1317+
"name": "projectJ",
1318+
"version": "1.0.1",
1319+
}
1320+
`);
1321+
// projectK should not be bumped because updateDependents is set to "never"
1322+
expect(readJson(tree, 'projectK/package.json')).toMatchInlineSnapshot(`
1323+
{
1324+
"name": "projectK",
1325+
"version": "2.1.0",
1326+
}
1327+
`);
1328+
});
1329+
12611330
it('should filter out projects with no dependency relationships within a single independent release group based on the provided user filter', async () => {
12621331
const {
12631332
nxReleaseConfig,

packages/nx/src/command-line/release/version/release-group-processor.ts

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,18 @@ export class ReleaseGroupProcessor {
323323
});
324324
}
325325

326+
for (const [groupName, group] of Object.entries(
327+
this.nxReleaseConfig.groups
328+
)) {
329+
if (!this.groupGraph.has(groupName)) {
330+
this.groupGraph.set(groupName, {
331+
group: { ...group, name: groupName, resolvedVersionPlans: false },
332+
dependencies: new Set(),
333+
dependents: new Set(),
334+
});
335+
}
336+
}
337+
326338
// Process each project within each release group
327339
for (const [, releaseGroupNode] of this.groupGraph) {
328340
for (const projectName of releaseGroupNode.group.projects) {
@@ -423,6 +435,26 @@ export class ReleaseGroupProcessor {
423435
this.projectToUpdateDependentsSetting.set(project, updateDependents);
424436
}
425437
}
438+
439+
for (const [groupName, group] of Object.entries(
440+
this.nxReleaseConfig.groups
441+
)) {
442+
for (const project of group.projects) {
443+
if (!this.projectToReleaseGroup.has(project)) {
444+
this.projectToReleaseGroup.set(project, {
445+
...group,
446+
name: groupName,
447+
resolvedVersionPlans: false,
448+
});
449+
450+
// Cache updateDependents setting relevant for each project
451+
const updateDependents =
452+
((group.version as NxReleaseVersionConfiguration)
453+
?.updateDependents as 'auto' | 'never') || 'auto';
454+
this.projectToUpdateDependentsSetting.set(project, updateDependents);
455+
}
456+
}
457+
}
426458
}
427459

428460
/**
@@ -1064,7 +1096,8 @@ export class ReleaseGroupProcessor {
10641096
for (const project of sortedProjects) {
10651097
if (
10661098
projectsToUpdate.has(project) &&
1067-
releaseGroupFilteredProjects.has(project)
1099+
(releaseGroupFilteredProjects?.has(project) ||
1100+
this.isDependentUpdate(project))
10681101
) {
10691102
await this.updateDependenciesForProject(project);
10701103
}
@@ -1722,4 +1755,12 @@ Valid values are: ${validReleaseVersionPrefixes
17221755
private getProjectDependencies(project: string): Set<string> {
17231756
return this.projectToDependencies.get(project) || new Set();
17241757
}
1758+
1759+
private isDependentUpdate(project: string) {
1760+
return (
1761+
Array.from(this.projectToDependents.values()).some((dependents) =>
1762+
dependents.has(project)
1763+
) && this.hasAutoUpdateDependents(project)
1764+
);
1765+
}
17251766
}

0 commit comments

Comments
 (0)