diff --git a/.changeset/clean-ghosts-leave.md b/.changeset/clean-ghosts-leave.md new file mode 100644 index 000000000..4896e560f --- /dev/null +++ b/.changeset/clean-ghosts-leave.md @@ -0,0 +1,8 @@ +--- +"@changesets/apply-release-plan": minor +"@changesets/config": minor +"@changesets/types": minor +"@changesets/git": minor +--- + +Allow attributing changesets to merge commits diff --git a/packages/apply-release-plan/src/index.ts b/packages/apply-release-plan/src/index.ts index d12496c00..767cc9ae9 100644 --- a/packages/apply-release-plan/src/index.ts +++ b/packages/apply-release-plan/src/index.ts @@ -35,7 +35,8 @@ function stringDefined(s: string | undefined): s is string { } async function getCommitsThatAddChangesets( changesetIds: string[], - cwd: string + cwd: string, + useMergeCommits: boolean ) { const paths = changesetIds.map((id) => `.changeset/${id}.md`); const commits = await git.getCommitsThatAddFiles(paths, { cwd }); @@ -53,6 +54,7 @@ async function getCommitsThatAddChangesets( const legacyPaths = missingIds.map((id) => `.changeset/${id}/changes.json`); const commitsForLegacyPaths = await git.getCommitsThatAddFiles(legacyPaths, { cwd, + useMergeCommits, }); // Fill in the blanks in the array of commits @@ -230,7 +232,8 @@ async function getNewChangelogEntry( let commits = await getCommitsThatAddChangesets( changesets.map((cs) => cs.id), - cwd + cwd, + config.useMergeCommits ); let moddedChangesets = changesets.map((cs, i) => ({ ...cs, diff --git a/packages/config/schema.json b/packages/config/schema.json index 459e45106..b4dc17454 100644 --- a/packages/config/schema.json +++ b/packages/config/schema.json @@ -75,6 +75,11 @@ "description": "Determines whether Changesets should commit the results of the add and version command.", "default": false }, + "useMergeCommits": { + "type": "boolean", + "description": "Determines whether changesets should be attributed to merge commits.", + "default": false + }, "privatePackages": { "anyOf": [ { diff --git a/packages/config/src/index.test.ts b/packages/config/src/index.test.ts index b8b7f8835..90e193a8f 100644 --- a/packages/config/src/index.test.ts +++ b/packages/config/src/index.test.ts @@ -43,6 +43,7 @@ test("read reads the config", async () => { linked: [], changelog: false, commit: ["@changesets/cli/commit", { skipCI: "version" }], + useMergeCommits: false, access: "restricted", baseBranch: "master", changedFilePatterns: ["**"], @@ -69,6 +70,7 @@ let defaults: Config = { linked: [], changelog: ["@changesets/cli/changelog", null], commit: false, + useMergeCommits: false, access: "restricted", baseBranch: "master", changedFilePatterns: ["**"], diff --git a/packages/config/src/index.ts b/packages/config/src/index.ts index 07e913ec2..939da151e 100644 --- a/packages/config/src/index.ts +++ b/packages/config/src/index.ts @@ -431,6 +431,8 @@ export let parse = (json: WrittenConfig, packages: Packages): Config => { commit: getNormalizedCommitOption( json.commit === undefined ? defaultWrittenConfig.commit : json.commit ), + useMergeCommits: + json.useMergeCommits === undefined ? false : json.useMergeCommits, fixed, linked, baseBranch: diff --git a/packages/git/src/index.ts b/packages/git/src/index.ts index 7e3aee534..76529e47f 100644 --- a/packages/git/src/index.ts +++ b/packages/git/src/index.ts @@ -63,7 +63,11 @@ export async function getDivergedCommit(cwd: string, ref: string) { */ export async function getCommitsThatAddFiles( gitPaths: string[], - { cwd, short = false }: { cwd: string; short?: boolean } + { + cwd, + short = false, + useMergeCommits = false, + }: { cwd: string; short?: boolean; useMergeCommits?: boolean } ): Promise<(string | undefined)[]> { // Maps gitPath to commit SHA const map = new Map(); @@ -83,8 +87,9 @@ export async function getCommitsThatAddFiles( "--diff-filter=A", "--max-count=1", short ? "--pretty=format:%h:%p" : "--pretty=format:%H:%p", + useMergeCommits ? "--first-parent" : "", gitPath, - ], + ].filter(Boolean), { cwd } ) ).stdout diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index 17bb849eb..0932e6dd0 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -69,6 +69,7 @@ export interface PrivatePackages { export type Config = { changelog: false | readonly [string, any]; commit: false | readonly [string, any]; + useMergeCommits: boolean; fixed: Fixed; linked: Linked; access: AccessType; @@ -94,6 +95,7 @@ export type Config = { export type WrittenConfig = { changelog?: false | readonly [string, any] | string; commit?: boolean | readonly [string, any] | string; + useMergeCommits?: boolean; fixed?: Fixed; linked?: Linked; access?: AccessType;