Skip to content

Commit

Permalink
Fix a bug where packages that shouldn't get released get patch releas…
Browse files Browse the repository at this point in the history
…es when the pre mode is exit (#382)

* fix pre mode exit bug

* Create large-rings-invite.md

* fix the bug properly and add integration test

* run prettier
  • Loading branch information
Feiyang1 committed Jun 4, 2020
1 parent 64a9017 commit 00e768e
Show file tree
Hide file tree
Showing 9 changed files with 123 additions and 18 deletions.
5 changes: 5 additions & 0 deletions .changeset/large-rings-invite.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@changesets/assemble-release-plan": patch
---

Fix a bug where packages that shouldn't get released get patch releases when the pre mode is exit
3 changes: 3 additions & 0 deletions __fixtures__/simple-project-caret-dep/.changeset/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# We just want a file in here so git collects it

For this we have deliberately not included a config file, as we want to test the defaults
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{}
11 changes: 11 additions & 0 deletions __fixtures__/simple-project-caret-dep/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"private": true,
"name": "simple-project",
"description": "three projects, each depending on one other",
"version": "1.0.0",
"bolt": {
"workspaces": [
"packages/*"
]
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"name": "pkg-a",
"version": "1.0.0",
"dependencies": {
"pkg-b": "^1.0.0"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"name": "pkg-b",
"version": "1.0.0"
}
21 changes: 21 additions & 0 deletions packages/assemble-release-plan/src/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,27 @@ describe("assemble-release-plan", () => {
expect(releases[1].name).toEqual("pkg-b");
expect(releases[1].newVersion).toEqual("2.0.0");
});
describe("pre mode exit", () => {
it("should not generate a release for package that has no changesets and is not a dependent of any packages being released", () => {
const { releases } = assembleReleasePlan(
setup.changesets,
setup.packages,
{
...defaultConfig
},
{
changesets: [],
tag: "next",
initialVersions: {},
mode: "exit"
}
);

expect(releases.length).toEqual(1);
expect(releases[0].name).toEqual("pkg-a");
expect(releases[0].newVersion).toEqual("1.0.1");
});
});
});

describe("version update thoroughness", () => {
Expand Down
41 changes: 23 additions & 18 deletions packages/assemble-release-plan/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,27 +88,29 @@ function assembleReleasePlan(
changesets = changesets.filter(
changeset => !usedChangesetIds.has(changeset.id)
);
for (let pkg of packages.packages) {
preVersions.set(
pkg.packageJson.name,
getPreVersion(pkg.packageJson.version)
}

// Populate preVersion
// preVersion is the map between package name and its next pre version number.
for (let pkg of packages.packages) {
preVersions.set(
pkg.packageJson.name,
getPreVersion(pkg.packageJson.version)
);
}
for (let linkedGroup of config.linked) {
let highestPreVersion = 0;
for (let linkedPackage of linkedGroup) {
highestPreVersion = Math.max(
getPreVersion(packagesByName.get(linkedPackage)!.packageJson.version),
highestPreVersion
);
}
for (let linkedGroup of config.linked) {
let highestPreVersion = 0;
for (let linkedPackage of linkedGroup) {
highestPreVersion = Math.max(
getPreVersion(
packagesByName.get(linkedPackage)!.packageJson.version
),
highestPreVersion
);
}
for (let linkedPackage of linkedGroup) {
preVersions.set(linkedPackage, highestPreVersion);
}
for (let linkedPackage of linkedGroup) {
preVersions.set(linkedPackage, highestPreVersion);
}
}

for (let pkg of packages.packages) {
packagesByName.set(pkg.packageJson.name, {
...pkg,
Expand All @@ -128,7 +130,10 @@ function assembleReleasePlan(
if (updatedPreState !== undefined) {
if (updatedPreState.mode === "exit") {
for (let pkg of packages.packages) {
if (preVersions.get(pkg.packageJson.name) !== -1) {
// If a package had a prerelease, but didn't trigger a version bump in the regular release,
// we want to give it a patch release.
// Detailed explaination at https://github.com/atlassian/changesets/pull/382#discussion_r434434182
if (preVersions.get(pkg.packageJson.name) !== 0) {
if (!releases.has(pkg.packageJson.name)) {
releases.set(pkg.packageJson.name, {
type: "patch",
Expand Down
48 changes: 48 additions & 0 deletions packages/cli/src/commands/version/version.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,54 @@ describe("running version in a simple project", () => {
});
});

describe("running version in a simple project with caret dependencies", () => {
it("should bump patch version for packages that had prereleases, but dependencies are still in range", async () => {
let cwd = f.copy("simple-project-caret-dep");
await pre(cwd, { command: "enter", tag: "next" });
await writeChangeset(
{
releases: [{ name: "pkg-b", type: "patch" }],
summary: "a very useful summary for the first change"
},
cwd
);
await version(cwd, defaultOptions, modifiedDefaultConfig);

let packages = (await getPackages(cwd))!;
expect(packages.packages.map(x => x.packageJson)).toEqual([
{
dependencies: {
"pkg-b": "^1.0.1-next.0"
},
name: "pkg-a",
version: "1.0.1-next.0"
},
{
name: "pkg-b",
version: "1.0.1-next.0"
}
]);

await pre(cwd, { command: "exit" });
await version(cwd, defaultOptions, modifiedDefaultConfig);

packages = (await getPackages(cwd))!;
expect(packages.packages.map(x => x.packageJson)).toEqual([
{
dependencies: {
"pkg-b": "^1.0.1"
},
name: "pkg-a",
version: "1.0.1"
},
{
name: "pkg-b",
version: "1.0.1"
}
]);
});
});

describe("running version in a simple project with workspace range", () => {
temporarilySilenceLogs();
let cwd: string;
Expand Down

0 comments on commit 00e768e

Please sign in to comment.