standard-version icon indicating copy to clipboard operation
standard-version copied to clipboard

Add switch to include commit body

Open derekgreer opened this issue 6 years ago • 28 comments

Currently standard-version only includes the commit header. Is there a way to optionally include the commit body in the CHANGELOG.md? Is there a sister tool I should be using to generate release notes to end users that provide all the details?

derekgreer avatar May 11 '18 19:05 derekgreer

@derekgreer Interesting no one noticed this, it's a great idea. When we squash our PRs on GitHub, it puts the squashed commits into the body, e.g.:

commit c18e83e1c45644ef7c81adae7fa7ed4581292b25
Author: Person
Date:   Wed Mar 20 16:46:13 2019 -0500

    feat(Downloads): Download modal improvements (#87)

    * fix: Some fix

    * fix: Updated things

    * fix: Did another thing

It would be cool if that body could be put into the changelog as an indented list underneath the main commit message.

ffxsam avatar Mar 22 '19 16:03 ffxsam

@bcoe @stevemao Thoughts on this?

ffxsam avatar Mar 22 '19 16:03 ffxsam

Even just having extra detail beyond the first line, other than only breaking changes would be useful. Whether that's a list of commits in a PR being merged in, or descriptive text added manually as part of the commit message.

Some new features, or involved fixes may warrant additional description above and beyond the one line. Suggesting "you can manually edit the changelog" as has been mentioned in other issues, to my mind, kind of largely defeats the purpose of using an automated tool... if the info is already in the commit, it should be able to be pulled out of the commit log and injected into the change log. Especially if changelogs aren't being generated immediately every time there's a PR merge, or whatever.. having to then go back and manually add some description to the generated file, sometime in the future, is not very reasonable.

willvincent avatar Mar 22 '19 16:03 willvincent

see motivation for a more flexible preset: https://github.com/conventional-changelog/conventional-changelog/pull/421

bcoe avatar Mar 22 '19 22:03 bcoe

Maybe, we can use <details> tag for commit body?

stevemao avatar Mar 23 '19 01:03 stevemao

@stevemao this seems clever 😄 (in the good sense of the word). I might still be inclined to make it a config option that gets turned on.

bcoe avatar Mar 25 '19 01:03 bcoe

Was any progress made on this? This tool is fab but I require the full commit message in the Changelog, rather than just the header.

@stevemao Can you elaborate on what you meant re the <details> tag please?

joshtoper avatar Nov 01 '19 12:11 joshtoper

@joshtoper see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/details I was just throwing random idea.

stevemao avatar Nov 04 '19 00:11 stevemao

I'm really in favour of this idea. I've done away with the develop branch in my projects as I tend to work myself from feature/issue to feature/issue and publish asap. Having the commit body included in the changelog would be very helpful in providing some context to the changelog.

polaroidkidd avatar Mar 25 '20 19:03 polaroidkidd

Any progress or plan on supporting this? I'm also very interested in being able to customize changelog generation, as I may want to only include a section of the commit body in the changelog.

Feiyang1 avatar May 05 '20 22:05 Feiyang1

This would be extremely helpful for many of my projects. I'd love to be able to outline a majority of the changes in my CHANGELOG by using a commit body without ejecting:

https://github.com/crutchcorn/react-native-button-toggle-group/commit/9b79bc6bbf5a2055af890336faec6defab1b58b0

crutchcorn avatar Jul 05 '20 00:07 crutchcorn

@crutchcorn Perfect use case scenario.

willvincent avatar Jul 05 '20 04:07 willvincent

I'm going to be looking into adding this functionality. Linking related issues:

https://github.com/conventional-changelog/conventional-changelog/issues/338

https://github.com/conventional-changelog/conventional-changelog/issues/423

crutchcorn avatar Jul 08 '20 21:07 crutchcorn

@crutchcorn I've been slammed with various other projects recently, but would appreciate the patch 👍

this chat can potentially be a good place to coordinate.

bcoe avatar Jul 09 '20 21:07 bcoe

@crutchcorn do you intend to make a simple option to enable this feature instead of needing to create a customized template?

patrickmichalina avatar Jul 19 '20 18:07 patrickmichalina

@patrickmichalina I plan on making it a simple toggle.

I've been reading through the source code of the dependencies and have an idea of how to add to this, but it's kinda down my priority list. I'll try taking a stab throughout the week or two, but it might take me a bit to get through

crutchcorn avatar Jul 19 '20 21:07 crutchcorn

Looking forward to this feature as well

Oloremo avatar Aug 24 '20 16:08 Oloremo

Any updates?

derekgreer avatar Oct 26 '20 20:10 derekgreer

I've some changes: https://github.com/conventional-changelog/standard-version/pull/675 In my implementation, you can define own templates to show a body per commit message.

mheunem avatar Nov 02 '20 17:11 mheunem

Any news?

A11oW avatar Oct 04 '21 08:10 A11oW

Would love to see this feature get merged. The body text describes rich information that's absolutely worthy of going in the release notes.

kyranjamie avatar Oct 28 '21 09:10 kyranjamie

Just a heads up if anyone needs to implement this now to their project, it's possible with a little configuration and a custom commit template. It's a bit tricky with whitespace handling in Handlebars + Markdown formatting, mine is definitely a little rough around the edges and YMMV based on how you format commit messages, but it works for us :) Suggestions welcome.

First, you need your semantic-release config in a release.config.js file, so you can use Node to inject the template into the config:

const { readFileSync } = require('fs')
const { join } = require('path')

module.exports = {
  plugins: [
    ...
    [
      '@semantic-release/release-notes-generator',
      {
        writerOpts: {
          commitPartial: readFileSync(join(__dirname, 'path/to/commit.hbs'), 'utf-8')
        }
      }
    ],
    ...
  ]
}

And here's my modified commit.hbs:

✅{{#if scope}} **{{scope}}:**
{{~/if}} {{#if subject}}
  {{~subject}}
{{~else}}
  {{~header}}
{{~/if}}

{{~!-- commit link --}} {{#if @root.linkReferences~}}
  ([{{shortHash}}](
  {{~#if @root.repository}}
    {{~#if @root.host}}
      {{[email protected]}}/
    {{~/if}}
    {{~#if @root.owner}}
      {{[email protected]}}/
    {{~/if}}
    {{[email protected]}}
  {{~else}}
    {{[email protected]}}
  {{~/if}}/
  {{[email protected]}}/{{hash}}))
{{~else}}
  {{~shortHash}}
{{~/if}}

{{~!-- commit references --}}
{{~#if references~}}
  , closes
  {{~#each references}} {{#if @root.linkReferences~}}
    [
    {{~#if this.owner}}
      {{~this.owner}}/
    {{~/if}}
    {{~this.repository}}#{{this.issue}}](
    {{~#if @root.repository}}
      {{~#if @root.host}}
        {{[email protected]}}/
      {{~/if}}
      {{~#if this.repository}}
        {{~#if this.owner}}
          {{~this.owner}}/
        {{~/if}}
        {{~this.repository}}
      {{~else}}
        {{~#if @root.owner}}
          {{[email protected]}}/
        {{~/if}}
          {{[email protected]}}
        {{~/if}}
    {{~else}}
      {{[email protected]}}
    {{~/if}}/
    {{[email protected]}}/{{this.issue}})
  {{~else}}
    {{~#if this.owner}}
      {{~this.owner}}/
    {{~/if}}
    {{~this.repository}}#{{this.issue}}
  {{~/if}}{{/each}}
{{~/if}}
 
{{~#if body}}
{{{{raw}}}}
  
{{{{/raw}}}}
{{body}}
{{~/if}}

{{{{raw}}}}
  
{{{{/raw}}}}

ddx32 avatar Jun 01 '22 10:06 ddx32

Thank you very much, @ddx32 !! Your solution works fine for me!

kevinbreaker avatar Oct 28 '22 01:10 kevinbreaker

My team uses semantic-release for a large number of projects and this feature would be awesome to provide more detail in Changelogs. Any plans to deliver this feature?

padamstx avatar Nov 10 '22 22:11 padamstx

I'm using lerna, which relies on conventional-changelog for automated changelogs.

Being able to include commit body in changelog would be an amazing improvement.

Is there any plans to add this feature, super-easy research (among devs in my company) reveals that this is a VERY popular improvement 💪🏻

Thanks for all your good work!

aasen avatar Feb 28 '23 14:02 aasen

Also looking to how to add body to lerna's changelog.

ipleten avatar Mar 29 '23 17:03 ipleten

I would like to add that having a way to specify a section of the commit message body that goes into the changelog would be extra valuable to me.

This way, you can add both a message directed at other developers of the same project (which doesn't show up in the changelog), and a message directed at the readers of the changelog (be they end users or developers of some code consuming your project).

In the meanwhile, big thanks to @ddx32! Your suggestion seems to solve most of what I need 🙏 ❤️

EDIT: here's the commit where I implemented ddx32's suggestion in our project, in case anyone finds it helpful to see it used in a real world situation.

adrianschmidt avatar Aug 10 '23 08:08 adrianschmidt

Just a heads up if anyone needs to implement this now to their project, it's possible with a little configuration and a custom commit template. It's a bit tricky with whitespace handling in Handlebars + Markdown formatting, mine is definitely a little rough around the edges and YMMV based on how you format commit messages, but it works for us :) Suggestions welcome.

First, you need your semantic-release config in a release.config.js file, so you can use Node to inject the template into the config:

const { readFileSync } = require('fs')
const { join } = require('path')

module.exports = {
  plugins: [
    ...
    [
      '@semantic-release/release-notes-generator',
      {
        writerOpts: {
          commitPartial: readFileSync(join(__dirname, 'path/to/commit.hbs'), 'utf-8')
        }
      }
    ],
    ...
  ]
}

And here's my modified commit.hbs:

✅{{#if scope}} **{{scope}}:**
{{~/if}} {{#if subject}}
  {{~subject}}
{{~else}}
  {{~header}}
{{~/if}}

{{~!-- commit link --}} {{#if @root.linkReferences~}}
  ([{{shortHash}}](
  {{~#if @root.repository}}
    {{~#if @root.host}}
      {{[email protected]}}/
    {{~/if}}
    {{~#if @root.owner}}
      {{[email protected]}}/
    {{~/if}}
    {{[email protected]}}
  {{~else}}
    {{[email protected]}}
  {{~/if}}/
  {{[email protected]}}/{{hash}}))
{{~else}}
  {{~shortHash}}
{{~/if}}

{{~!-- commit references --}}
{{~#if references~}}
  , closes
  {{~#each references}} {{#if @root.linkReferences~}}
    [
    {{~#if this.owner}}
      {{~this.owner}}/
    {{~/if}}
    {{~this.repository}}#{{this.issue}}](
    {{~#if @root.repository}}
      {{~#if @root.host}}
        {{[email protected]}}/
      {{~/if}}
      {{~#if this.repository}}
        {{~#if this.owner}}
          {{~this.owner}}/
        {{~/if}}
        {{~this.repository}}
      {{~else}}
        {{~#if @root.owner}}
          {{[email protected]}}/
        {{~/if}}
          {{[email protected]}}
        {{~/if}}
    {{~else}}
      {{[email protected]}}
    {{~/if}}/
    {{[email protected]}}/{{this.issue}})
  {{~else}}
    {{~#if this.owner}}
      {{~this.owner}}/
    {{~/if}}
    {{~this.repository}}#{{this.issue}}
  {{~/if}}{{/each}}
{{~/if}}
 
{{~#if body}}
{{{{raw}}}}
  
{{{{/raw}}}}
{{body}}
{{~/if}}

{{{{raw}}}}
  
{{{{/raw}}}}

Works pretty well! Thank you soo much @ddx32 for sharing your solution! Saved me days of googling and trial and error... 🙏🏻🙌🏻

arijitcodes avatar Oct 11 '23 19:10 arijitcodes