diff --git a/.changeset/fresh-zebras-eat.md b/.changeset/fresh-zebras-eat.md new file mode 100644 index 000000000..d8cef540e --- /dev/null +++ b/.changeset/fresh-zebras-eat.md @@ -0,0 +1,5 @@ +--- +"@scaleway/changesets-renovate": minor +--- + +Add `SKIP_BRANCH_CHECK` as an option to not check branch name diff --git a/packages/changesets-renovate/README.md b/packages/changesets-renovate/README.md index 3287233e0..da823e30b 100644 --- a/packages/changesets-renovate/README.md +++ b/packages/changesets-renovate/README.md @@ -22,4 +22,16 @@ To skip committing the changeset. SKIP_COMMIT=TRUE changesets-renovate ``` +To have a custom prefix for renovate branch name instead of `renovate/` + +```bash +BRANCH_PREFIX=dep-upgrade changesets-renovate +``` + +To skip checking the branch name starts `renovate/` + +```bash +SKIP_BRANCH_CHECK=TRUE changesets-renovate +``` + It's inspired by this GitHub Action from Backstage: https://github.com/backstage/backstage/blob/master/.github/workflows/sync_renovate-changesets.yml diff --git a/packages/changesets-renovate/src/__tests__/__snapshots__/generate-changeset.test.ts.snap b/packages/changesets-renovate/src/__tests__/__snapshots__/generate-changeset.test.ts.snap index 7bac09101..3d400f5a3 100644 --- a/packages/changesets-renovate/src/__tests__/__snapshots__/generate-changeset.test.ts.snap +++ b/packages/changesets-renovate/src/__tests__/__snapshots__/generate-changeset.test.ts.snap @@ -45,3 +45,49 @@ Updated dependency \`package2\` to \`version2\`. ], } `; + +exports[`generate changeset file > should not skip if branch starts with custom branch prefix 1`] = ` +[MockFunction spy] { + "calls": [ + [ + ".changeset/renovate-test.md", + "--- +'packageName': patch +--- + +Updated dependency \`package\` to \`version\`. +Updated dependency \`package2\` to \`version2\`. +", + ], + ], + "results": [ + { + "type": "return", + "value": undefined, + }, + ], +} +`; + +exports[`generate changeset file > should not skip if not in renovate branch, when branch check skip is true 1`] = ` +[MockFunction spy] { + "calls": [ + [ + ".changeset/renovate-test.md", + "--- +'packageName': patch +--- + +Updated dependency \`package\` to \`version\`. +Updated dependency \`package2\` to \`version2\`. +", + ], + ], + "results": [ + { + "type": "return", + "value": undefined, + }, + ], +} +`; diff --git a/packages/changesets-renovate/src/__tests__/generate-changeset.test.ts b/packages/changesets-renovate/src/__tests__/generate-changeset.test.ts index c6fb131f3..ca9b644f4 100644 --- a/packages/changesets-renovate/src/__tests__/generate-changeset.test.ts +++ b/packages/changesets-renovate/src/__tests__/generate-changeset.test.ts @@ -25,6 +25,106 @@ describe('generate changeset file', () => { expect(console.log).toHaveBeenCalledWith('Not a renovate branch, skipping') }) + it('should not skip if branch starts with custom branch prefix', async () => { + const rev = 'test' + const fileName = `.changeset/renovate-${rev}.md` + const file = 'test/package.json' + const revparse = vi.fn().mockReturnValue(rev) + const add = vi.fn() + const commit = vi.fn() + const push = vi.fn() + + mockSimpleGit.mockReturnValue({ + branch: () => ({ + current: 'dep-upgrade/test', + }), + diffSummary: () => ({ + files: [ + { + file, + }, + ], + }), + show: () => ` ++ "package": "version" ++ "package2": "version2" +`, + revparse, + add, + commit, + push, + }) + + fs.readFile = vi + .fn() + .mockResolvedValueOnce(`{}`) + .mockResolvedValueOnce(`{"name":"packageName","version":"1.0.0"}`) + fs.writeFile = vi.fn() + + process.env['BRANCH_PREFIX'] = 'dep-upgrade/' + await run() + process.env['BRANCH_PREFIX'] = undefined + + expect(console.log).not.toHaveBeenCalledWith( + 'Not a renovate branch, skipping', + ) + expect(fs.readFile).toHaveBeenCalledWith(file, 'utf8') + expect(fs.writeFile).toMatchSnapshot() + expect(add).toHaveBeenCalledWith(fileName) + expect(commit).toHaveBeenCalledWith(`chore: add changeset renovate-${rev}`) + expect(push).toHaveBeenCalledTimes(1) + }) + + it('should not skip if not in renovate branch, when branch check skip is true', async () => { + const rev = 'test' + const fileName = `.changeset/renovate-${rev}.md` + const file = 'test/package.json' + const revparse = vi.fn().mockReturnValue(rev) + const add = vi.fn() + const commit = vi.fn() + const push = vi.fn() + + mockSimpleGit.mockReturnValue({ + branch: () => ({ + current: 'main', + }), + diffSummary: () => ({ + files: [ + { + file, + }, + ], + }), + show: () => ` ++ "package": "version" ++ "package2": "version2" +`, + revparse, + add, + commit, + push, + }) + + fs.readFile = vi + .fn() + .mockResolvedValueOnce(`{}`) + .mockResolvedValueOnce(`{"name":"packageName","version":"1.0.0"}`) + fs.writeFile = vi.fn() + + process.env['SKIP_BRANCH_CHECK'] = 'TRUE' + await run() + process.env['SKIP_BRANCH_CHECK'] = undefined + + expect(console.log).not.toHaveBeenCalledWith( + 'Not a renovate branch, skipping', + ) + expect(fs.readFile).toHaveBeenCalledWith(file, 'utf8') + expect(fs.writeFile).toMatchSnapshot() + expect(add).toHaveBeenCalledWith(fileName) + expect(commit).toHaveBeenCalledWith(`chore: add changeset renovate-${rev}`) + expect(push).toHaveBeenCalledTimes(1) + }) + it('should skip if .changeset is already modified', async () => { mockSimpleGit.mockReturnValue({ ...defaultGitValues, diff --git a/packages/changesets-renovate/src/index.ts b/packages/changesets-renovate/src/index.ts index 98d9e9244..25682b429 100644 --- a/packages/changesets-renovate/src/index.ts +++ b/packages/changesets-renovate/src/index.ts @@ -94,10 +94,14 @@ async function getBumps(files: string[]): Promise> { export async function run() { const branch = await simpleGit().branch() + const branchPrefix = process.env['BRANCH_PREFIX'] ?? 'renovate/' console.log('Detected branch:', branch) - if (!branch.current.startsWith('renovate/')) { + if ( + !branch.current.startsWith(branchPrefix) && + !process.env['SKIP_BRANCH_CHECK'] + ) { console.log('Not a renovate branch, skipping') return