Skip to content

Commit e526cfb

Browse files
author
Michael Black Ritter
authored
fix: duplicate generation of changesets (#26) (#27)
1 parent b825ee5 commit e526cfb

File tree

4 files changed

+128
-3
lines changed

4 files changed

+128
-3
lines changed

.changeset/wet-adults-taste.md

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
---
2+
'changeset-conventional-commits': patch
3+
---
4+
5+
fix: duplicate generation of changesets (#26)
6+
7+
The same changesets were generated again, because the duplicate detection failed on trailing line breaks (`\n`) it got from `git`.
8+
9+
<details>
10+
<summary>Details</summary>
11+
Imagine this data it holds while duplicate checking:
12+
13+
`const changesets = ...:`
14+
15+
```ts
16+
// Data from Commits
17+
[
18+
{
19+
releases: [[Object], [Object]],
20+
summary: 'chore(root): add two test packages\n',
21+
packagesChanged: [[Object], [Object]],
22+
},
23+
];
24+
```
25+
26+
`const currentChangesets = ...:`
27+
28+
```ts
29+
// Data from Changesets
30+
[
31+
{
32+
releases: [[Object], [Object]],
33+
summary: 'chore(root): add two test packages',
34+
packagesChanged: [[Object], [Object]],
35+
},
36+
];
37+
```
38+
39+
Truncating the linebreak at [line 165](https://github.com/iamchathu/changeset-conventional-commits/blob/a4d324693eca549b0d016a162442eef49477ec75/src/utils/index.ts#L165) of `src/utils/index.ts` fixed it:
40+
41+
```ts
42+
const compareChangeSet = (a: Changeset, b: Changeset): boolean => {
43+
// return a.summary === b.summary && JSON.stringify(a.releases) == JSON.stringify(b.releases);
44+
return a.summary.replace(/\n$/, '') === b.summary && JSON.stringify(a.releases) == JSON.stringify(b.releases);
45+
};
46+
```
47+
</details>

src/types/index.ts

+10
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { Changeset } from '@changesets/types';
2+
13
export interface PkgJson {
24
name?: string;
35
version?: string;
@@ -30,3 +32,11 @@ export interface ManyPkgPackages {
3032
packages: ManyPkgPackage[];
3133
root: ManyPkgPackage;
3234
}
35+
36+
export type ChangesetConventionalCommit = Changeset & {
37+
packagesChanged: {
38+
dir: string;
39+
relativeDir: string;
40+
packageJson: PkgJson;
41+
}[];
42+
};

src/utils/index.spec.ts

+68
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { describe, expect, it } from '@jest/globals';
2+
import { ChangesetConventionalCommit } from '../types';
23
import {
34
associateCommitsToConventionalCommitMessages,
5+
difference,
46
getRepoRoot,
57
gitFetch,
68
isBreakingChange,
@@ -201,6 +203,72 @@ describe('associate-commits-to-conventional-commit-messages', () => {
201203
});
202204
});
203205

206+
describe('difference', () => {
207+
const changesets = [
208+
{
209+
releases: [
210+
{ name: 'changeset-cc-test-01', type: 'minor' },
211+
{ name: 'changeset-cc-test-02', type: 'minor' },
212+
],
213+
summary: 'feat: add cli helper and flags',
214+
packagesChanged: [
215+
{
216+
dir: '/z/merge-requests/changeset-conventional-commits/packages/test-01',
217+
relativeDir: 'packages/test-01',
218+
packageJson: {},
219+
},
220+
{
221+
dir: '/z/merge-requests/changeset-conventional-commits/packages/test-02',
222+
relativeDir: 'packages/test-02',
223+
packageJson: {},
224+
},
225+
],
226+
},
227+
{
228+
releases: [{ name: 'changeset-cc-test-01', type: 'minor' }],
229+
summary: 'docs(changeset-cc-test-01): add update #2 and #3',
230+
packagesChanged: [
231+
{
232+
dir: '/z/merge-requests/changeset-conventional-commits/packages/test-01',
233+
relativeDir: 'packages/test-01',
234+
packageJson: {},
235+
},
236+
],
237+
},
238+
] as ChangesetConventionalCommit[];
239+
240+
const currentChangesets = [
241+
{
242+
releases: [
243+
{ name: 'changeset-cc-test-01', type: 'minor' },
244+
{ name: 'changeset-cc-test-02', type: 'minor' },
245+
],
246+
summary: 'feat: add cli helper and flags',
247+
packagesChanged: [
248+
{
249+
dir: '/z/merge-requests/changeset-conventional-commits/packages/test-01',
250+
relativeDir: 'packages/test-01',
251+
packageJson: {},
252+
},
253+
{
254+
dir: '/z/merge-requests/changeset-conventional-commits/packages/test-02',
255+
relativeDir: 'packages/test-02',
256+
packageJson: {},
257+
},
258+
],
259+
},
260+
] as ChangesetConventionalCommit[];
261+
262+
it('correctly detects equal changesets *without* trailing new line/line break within `summary`', () => {
263+
expect(difference(changesets, currentChangesets)).toEqual([changesets[1]]);
264+
});
265+
266+
it('correctly detects equal changesets *with* trailing new line/line break within `summary`', () => {
267+
changesets[0].summary += '\n';
268+
expect(difference(changesets, currentChangesets)).toEqual([changesets[1]]);
269+
});
270+
});
271+
204272
describe('get-repo-root', () => {
205273
it('correctly gets the repo root', () => {
206274
expect(getRepoRoot().endsWith('changeset-conventional-commits')).toBe(true);

src/utils/index.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,8 @@ export const conventionalMessagesWithCommitsToChangesets = (
119119
type: isBreakingChange(entry.changelogMessage)
120120
? 'major'
121121
: entry.changelogMessage.startsWith('feat')
122-
? 'minor'
123-
: 'patch',
122+
? 'minor'
123+
: 'patch',
124124
};
125125
}),
126126
summary: entry.changelogMessage,
@@ -162,7 +162,7 @@ export const getCommitsSinceRef = (branch: string) => {
162162
};
163163

164164
const compareChangeSet = (a: Changeset, b: Changeset): boolean => {
165-
return a.summary === b.summary && JSON.stringify(a.releases) == JSON.stringify(b.releases);
165+
return a.summary.replace(/\n$/, '') === b.summary && JSON.stringify(a.releases) == JSON.stringify(b.releases);
166166
};
167167

168168
export const difference = (a: Changeset[], b: Changeset[]): Changeset[] => {

0 commit comments

Comments
 (0)