Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/clean-cougars-thank.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@scaleway/changesets-renovate": minor
---

add an option to sort the message
32 changes: 32 additions & 0 deletions packages/changesets-renovate/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,36 @@ To skip checking the branch name starts `renovate/`
SKIP_BRANCH_CHECK=TRUE changesets-renovate
```

To sort both the package bumps and update messages alphabetically

```bash
SORT_CHANGESETS=TRUE changesets-renovate
```

Example:

Unsorted:
```
---
'package-z': patch
'package-a': patch
---

Updated dependency `@company/zzz` to `0.228.0`.
Updated dependency `@company/aaa` to `1.1.15`.
Updated dependency `@company/zzz-backend` to `^0.228.0`.
```

Sorted:
```
---
'package-a': patch
'package-z': patch
---

Updated dependency `@company/aaa` to `1.1.15`.
Updated dependency `@company/zzz-backend` to `^0.228.0`.
Updated dependency `@company/zzz` to `0.228.0`.
```

It's inspired by this GitHub Action from Backstage: https://github.com/backstage/backstage/blob/master/.github/workflows/sync_renovate-changesets.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,32 @@ exports[`generate changeset file > should generate changeset file, commit and pu
'packageName': patch
---

Updated dependency \`package\` to \`version\`.
Updated dependency \`package2\` to \`version2\`.
Updated dependency \`packagez\` to \`version2\`.
Updated dependency \`packagea\` to \`version\`.
",
],
],
"results": [
{
"type": "return",
"value": undefined,
},
],
}
`;

exports[`generate changeset file > should generate sorted changeset file, but skip commit and push 1`] = `
[MockFunction spy] {
"calls": [
[
".changeset/renovate-test.md",
"---
'packageNameA': patch
'packageNameB': patch
---

Updated dependency \`packagea\` to \`version\`.
Updated dependency \`packagez\` to \`version2\`.
",
],
],
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,13 @@ beforeEach(() => {
})

describe('generate changeset file', () => {
beforeEach(() => {
delete process.env['SKIP_BRANCH_CHECK']
delete process.env['SKIP_COMMIT']
delete process.env['BRANCH_PREFIX']
delete process.env['SORT_CHANGESETS']
})

it('should skip if not in renovate branch', async () => {
mockSimpleGit.mockReturnValue({
...defaultGitValues,
Expand Down Expand Up @@ -63,7 +70,6 @@ describe('generate changeset file', () => {

process.env['BRANCH_PREFIX'] = 'dep-upgrade/'
await run()
process.env['BRANCH_PREFIX'] = undefined

expect(console.log).not.toHaveBeenCalledWith(
'Not a renovate branch, skipping',
Expand Down Expand Up @@ -113,7 +119,6 @@ describe('generate changeset file', () => {

process.env['SKIP_BRANCH_CHECK'] = 'TRUE'
await run()
process.env['SKIP_BRANCH_CHECK'] = undefined

expect(console.log).not.toHaveBeenCalledWith(
'Not a renovate branch, skipping',
Expand Down Expand Up @@ -188,8 +193,8 @@ describe('generate changeset file', () => {
],
}),
show: () => `
+ "package": "version"
+ "package2": "version2"
+ "packagez": "version2"
+ "packagea": "version"
`,
revparse,
add,
Expand Down Expand Up @@ -260,6 +265,61 @@ describe('generate changeset file', () => {
expect(push).not.toHaveBeenCalledTimes(1)
})

it('should generate sorted changeset file, but skip commit and push', async () => {
const rev = 'test'
const fileName = `.changeset/renovate-${rev}.md`
const fileA = 'test-a/package.json'
const fileB = 'test-b/package.json'
const revparse = vi.fn().mockReturnValue(rev)
const add = vi.fn()
const commit = vi.fn()
const push = vi.fn()

mockSimpleGit.mockReturnValue({
branch: () => ({
current: 'renovate/test',
}),
diffSummary: () => ({
files: [
{
file: fileB,
},
{
file: fileA,
},
],
}),
show: () => `
+ "packagez": "version2"
+ "packagea": "version"
`,
revparse,
add,
commit,
push,
})

fs.readFile = vi
.fn()
.mockResolvedValueOnce(`{}`)
.mockResolvedValueOnce(`{"name":"packageNameB","version":"1.1.1"}`)
.mockResolvedValueOnce(`{"name":"packageNameA","version":"1.0.0"}`)
fs.writeFile = vi.fn()

process.env['SKIP_COMMIT'] = 'TRUE'
process.env['SORT_CHANGESETS'] = 'TRUE'
await run()

expect(fs.readFile).toHaveBeenCalledWith(fileA, 'utf8')
expect(fs.readFile).toHaveBeenCalledWith(fileB, 'utf8')
expect(fs.writeFile).toMatchSnapshot()
expect(add).not.toHaveBeenCalledWith(fileName)
expect(commit).not.toHaveBeenCalledWith(
`chore: add changeset renovate-${rev}`,
)
expect(push).not.toHaveBeenCalledTimes(1)
})

it('should ignore workspace package.json', async () => {
const file = 'package.json'

Expand Down
10 changes: 8 additions & 2 deletions packages/changesets-renovate/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,12 +59,18 @@ async function createChangeset(
packageBumps: Map<string, string>,
packages: string[],
) {
let message = ''
const messageLines = []

for (const [pkg, bump] of packageBumps) {
message += `Updated dependency \`${pkg}\` to \`${bump}\`.\n`
messageLines.push(`Updated dependency \`${pkg}\` to \`${bump}\`.`)
}

if (process.env['SORT_CHANGESETS']) {
packages.sort()
messageLines.sort()
}

const message = messageLines.join('\n')
const pkgs = packages.map(pkg => `'${pkg}': patch`).join('\n')
const body = `---\n${pkgs}\n---\n\n${message.trim()}\n`
await fs.writeFile(fileName, body)
Expand Down
Loading