Skip to content

Commit 9814837

Browse files
mpsanchisFrozenPandaz
authored andcommitted
fix(release): sort groups topologically bottom-up and fix typo to allow multi-level group dependencies (#31374)
(cherry picked from commit fa9290a)
1 parent 28df73c commit 9814837

File tree

8 files changed

+140
-28
lines changed

8 files changed

+140
-28
lines changed

e2e/release/src/independent-projects.test.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,12 @@ describe('nx release - independent projects', () => {
343343
"scripts": {
344344
345345
346+
"name": "@proj/{project-name}",
347+
- "version": "999.9.9-version-git-operations-test.2",
348+
+ "version": "999.9.9-version-git-operations-test.3",
349+
"scripts": {
350+
351+
346352
"name": "@proj/{project-name}",
347353
- "version": "999.9.9",
348354
+ "version": "999.9.9-version-git-operations-test.3",
@@ -354,12 +360,6 @@ describe('nx release - independent projects', () => {
354360
}
355361
356362
357-
"name": "@proj/{project-name}",
358-
- "version": "999.9.9-version-git-operations-test.2",
359-
+ "version": "999.9.9-version-git-operations-test.3",
360-
"scripts": {
361-
362-
363363
Skipped lock file update because {package-manager} workspaces are not enabled.
364364
365365
NX Committing changes with git
@@ -906,7 +906,7 @@ describe('nx release - independent projects', () => {
906906
expect(
907907
releaseOutput.match(new RegExp(`New version 1\.4\.1 written`, 'g'))
908908
.length
909-
).toEqual(1);
909+
).toEqual(2);
910910

911911
expect(
912912
releaseOutput.match(new RegExp(`New version 1\.6\.1 written`, 'g'))

e2e/release/src/multiple-release-branches.test.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,9 @@ describe('nx release multiple release branches', () => {
191191
+ "version": "0.1.0",
192192
"scripts": {
193193
194+
}
195+
+
196+
194197
195198
"name": "@proj/{project-name}",
196199
- "version": "0.0.7",
@@ -203,9 +206,6 @@ describe('nx release multiple release branches', () => {
203206
+ "version": "0.1.0",
204207
"scripts": {
205208
206-
}
207-
+
208-
209209
210210
NX Committing changes with git
211211
@@ -330,6 +330,9 @@ describe('nx release multiple release branches', () => {
330330
+ "version": "0.1.0",
331331
"scripts": {
332332
333+
}
334+
+
335+
333336
334337
"name": "@proj/{project-name}",
335338
- "version": "0.0.0",
@@ -342,9 +345,6 @@ describe('nx release multiple release branches', () => {
342345
+ "version": "0.1.0",
343346
"scripts": {
344347
345-
}
346-
+
347-
348348
349349
NX Committing changes with git
350350

e2e/release/src/preserve-local-dependency-protocols.test.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -149,16 +149,16 @@ describe('nx release preserve local dependency protocols', () => {
149149
- "version": "0.0.0",
150150
+ "version": "0.1.0",
151151
"scripts": {
152+
"name": "@proj/{project-name}",
153+
- "version": "0.0.0",
154+
+ "version": "0.1.0",
155+
"scripts": {
152156
"dependencies": {
153157
- "@proj/{project-name}": "workspace:*"
154158
+ "@proj/{project-name}": "0.1.0"
155159
}
156160
}
157161
+
158-
"name": "@proj/{project-name}",
159-
- "version": "0.0.0",
160-
+ "version": "0.1.0",
161-
"scripts": {
162162
NX Updating PM lock file
163163
Would update pnpm-lock.yaml with the following command, but --dry-run was set:
164164
pnpm install --lockfile-only
@@ -194,12 +194,12 @@ describe('nx release preserve local dependency protocols', () => {
194194
- "version": "0.0.0",
195195
+ "version": "0.1.0",
196196
"scripts": {
197-
}
198-
+
199197
"name": "@proj/{project-name}",
200198
- "version": "0.0.0",
201199
+ "version": "0.1.0",
202200
"scripts": {
201+
}
202+
+
203203
NX Updating PM lock file
204204
Would update pnpm-lock.yaml with the following command, but --dry-run was set:
205205
pnpm install --lockfile-only

e2e/release/src/version-plans.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -954,7 +954,7 @@ Update packages in both groups with a mix #2
954954
);
955955

956956
expect(versionResult).toContain(
957-
`git add ${pkg5}/package.json ${pkg4}/package.json ${pkg3}/package.json ${pkg2}/package.json ${pkg1}/package.json`
957+
`git add ${pkg1}/package.json ${pkg2}/package.json ${pkg3}/package.json ${pkg4}/package.json ${pkg5}/package.json`
958958
);
959959

960960
expect(readdirSync(versionPlansDir).length).toEqual(2);

packages/nx/src/command-line/release/version/multiple-release-groups.spec.ts

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,118 @@ describe('Multiple Release Groups', () => {
434434
});
435435
});
436436

437+
describe('Three related groups, all fixed relationship, just JS', () => {
438+
it('should correctly version projects across transitive group boundaries', async () => {
439+
const {
440+
nxReleaseConfig,
441+
projectGraph,
442+
releaseGroups,
443+
releaseGroupToFilteredProjects,
444+
filters,
445+
} = await createNxReleaseConfigAndPopulateWorkspace(
446+
tree,
447+
`
448+
group1 ({ "projectsRelationship": "fixed" }):
449+
- pkg-a@1.0.0 [js]
450+
-> depends on pkg-c
451+
- pkg-b@1.0.0 [js]
452+
group2 ({ "projectsRelationship": "fixed" }):
453+
- pkg-c@2.0.0 [js]
454+
-> depends on pkg-e
455+
- pkg-d@2.0.0 [js]
456+
group3 ({ "projectsRelationship": "fixed" }):
457+
- pkg-e@3.0.0 [js]
458+
- pkg-f@3.0.0 [js]
459+
`,
460+
{
461+
version: {
462+
conventionalCommits: true,
463+
},
464+
},
465+
mockResolveCurrentVersion
466+
);
467+
468+
mockDeriveSpecifierFromConventionalCommits.mockImplementation(
469+
(_, __, ___, ____, { name: projectName }) => {
470+
// pkg-e has a bump, which should cause pkg-f to bump because they are in a fixed group
471+
// pkg-c depends on pkg-e so should also bump, and pkg-d is in a fixed group with pkg-c so should also bump
472+
// pkg-a depends on pkg-c so should also bump, and pkg-b is in a fixed group with pkg-a so should also bump
473+
if (projectName === 'pkg-e') return 'patch';
474+
return 'none';
475+
}
476+
);
477+
478+
const processor = new ReleaseGroupProcessor(
479+
tree,
480+
projectGraph,
481+
nxReleaseConfig,
482+
releaseGroups,
483+
releaseGroupToFilteredProjects,
484+
{
485+
dryRun: false,
486+
verbose: false,
487+
firstRelease: false,
488+
preid: undefined,
489+
filters,
490+
}
491+
);
492+
493+
await processor.init();
494+
await processor.processGroups();
495+
496+
expect(mockResolveVersionActionsForProject).toHaveBeenCalledTimes(6);
497+
498+
expect(tree.read('pkg-a/package.json', 'utf-8')).toMatchInlineSnapshot(`
499+
"{
500+
"name": "pkg-a",
501+
"version": "1.0.1",
502+
"dependencies": {
503+
"pkg-c": "2.0.1"
504+
}
505+
}
506+
"
507+
`);
508+
expect(tree.read('pkg-b/package.json', 'utf-8')).toMatchInlineSnapshot(`
509+
"{
510+
"name": "pkg-b",
511+
"version": "1.0.1"
512+
}
513+
"
514+
`);
515+
expect(tree.read('pkg-c/package.json', 'utf-8')).toMatchInlineSnapshot(`
516+
"{
517+
"name": "pkg-c",
518+
"version": "2.0.1",
519+
"dependencies": {
520+
"pkg-e": "3.0.1"
521+
}
522+
}
523+
"
524+
`);
525+
expect(tree.read('pkg-d/package.json', 'utf-8')).toMatchInlineSnapshot(`
526+
"{
527+
"name": "pkg-d",
528+
"version": "2.0.1"
529+
}
530+
"
531+
`);
532+
expect(tree.read('pkg-e/package.json', 'utf-8')).toMatchInlineSnapshot(`
533+
"{
534+
"name": "pkg-e",
535+
"version": "3.0.1"
536+
}
537+
"
538+
`);
539+
expect(tree.read('pkg-f/package.json', 'utf-8')).toMatchInlineSnapshot(`
540+
"{
541+
"name": "pkg-f",
542+
"version": "3.0.1"
543+
}
544+
"
545+
`);
546+
});
547+
});
548+
437549
describe('Two related groups, both independent relationship, just JS', () => {
438550
const graphDefinition = `
439551
group1 ({ "projectsRelationship": "independent" }):

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1504,7 +1504,7 @@ Valid values are: ${validReleaseVersionPrefixes
15041504

15051505
if (releaseGroup.projectsRelationship === 'fixed') {
15061506
// For fixed groups, we only need to check one project
1507-
const project = releaseGroupFilteredProjects[0];
1507+
const project = releaseGroupFilteredProjects.values().next().value;
15081508
const dependencies = this.projectGraph.dependencies[project] || [];
15091509
const hasDependencyInChangedGroup = dependencies.some(
15101510
(dep) =>

packages/nx/src/command-line/release/version/topological-sort.spec.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ describe('topologicalSort', () => {
2525
const indexC = result.indexOf('C');
2626
const indexD = result.indexOf('D');
2727

28-
expect(indexA).toBeLessThan(indexB); // A before B
29-
expect(indexA).toBeLessThan(indexD); // A before D
30-
expect(indexB).toBeLessThan(indexC); // B before C
31-
expect(indexD).toBeLessThan(indexC); // D before C
28+
expect(indexB).toBeLessThan(indexA); // B before A
29+
expect(indexD).toBeLessThan(indexA); // D before A
30+
expect(indexC).toBeLessThan(indexB); // C before B
31+
expect(indexC).toBeLessThan(indexD); // C before D
3232
});
3333

3434
it('should handle cycles by breaking them', () => {
@@ -149,8 +149,8 @@ describe('topologicalSort', () => {
149149
const indexC = result.indexOf('C');
150150
const indexD = result.indexOf('D');
151151

152-
expect(indexA).toBeLessThan(indexB); // A before B
153-
expect(indexC).toBeLessThan(indexD); // C before D
152+
expect(indexB).toBeLessThan(indexA); // B before A
153+
expect(indexD).toBeLessThan(indexC); // D before C
154154
});
155155

156156
it('should handle circular dependencies between two nodes', () => {

packages/nx/src/command-line/release/version/topological-sort.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,5 +44,5 @@ export function topologicalSort<T>(
4444
}
4545
}
4646

47-
return result.reverse();
47+
return result;
4848
}

0 commit comments

Comments
 (0)