Skip to content

Generate release note pages from git commit history.

Notifications You must be signed in to change notification settings

mosling/git-release-notes

 
 

Repository files navigation

Release Notes

Generate release note pages from git commit history.

Installation

It's preferable to install it globally through npm

npm install -g git-release-notes

Usage

The basic usage is

cd <your_git_project>
git-release-notes <since>..<until> <template>

Where

  • <since>..<until> specifies the range of commits as in git log, see gitrevisions(7)
  • <template> is an ejs template file used to generate the release notes

Three sample templates are included as a reference in the templates folder

This for example is the release notes generated for joyent/node by running

git-release-notes v0.9.8..v0.9.9 html > changelog.html

Node's release notes

Custom template

The second parameter of git-release-notes can be any path to a valid ejs template files.

Template Variables

Several template variables are made available to the script running inside the template.

commits is an array of commits, each containing

  • sha1 commit hash (%H)
  • authorName author name (%an)
  • authorEmail author email (%ae)
  • authorDate author date (%aD)
  • committerName committer name (%cn)
  • committerEmail committer email (%ce)
  • committerDate committer date (%cD)
  • title subject (%s)
  • messageLines array of body lines (%b)

dateFnsFormat is the date-fns format function. See the html-bootstrap for sample usage.

range is the commits range as passed to the command line

Options

More advanced options are

  • p or path Git project path, defaults to the current working path
  • b or branch Git branch, defaults to master
  • t or title Regular expression to parse the commit title (see next chapter)
  • m or meaning Meaning of capturing block in title's regular expression
  • f or file JSON Configuration file, better option when you don't want to pass all parameters to the command line, for an example see options.json
  • s or script External script for post-processing commits
  • c or merge-commits List only merge commits, git log command is executed with the --merges flag instead of --no-merges
  • o or gitlog-option to add some additional git log options and ignores the merge-commits option, this is direct given to git log by adding a -- to each longname option from the array (e.g. -o first-parent).
  • i or info to add some information which are unchanged given to the template processor as callOptions.i

Info Example

The info can be used to tunnel some JSON with additional information for the template processor. For example we have an project name independent from git and a git url to generate a direct link to the git commit.

-i '{"project":"sample project", "url":"https://github.com/"}'

And unpack the JSON at the template side by

<%
  var info = JSON.parse(callOptions.i)
  var gitProject = info.project
  var gitUrl = info.url
%>

Title Parsing

Some projects might have special naming conventions for the commit title.

The options t and m allow to specify this logic and extract additional information from the title.

For instance, Aria Templates has the following convention

fix #123 Title of a bug fix commit
feat #234 Title of a cool new feature

In this case using

git-release-notes -t "^([a-z]+) #(\d+) (.*)$" -m type -m issue -m title v1.3.6..HEAD html

generates the additional fields on the commit object

  • type first capturing block
  • issue second capturing block
  • title third capturing block (redefines the title)

Another project using similar conventions is AngularJs, commit message conventions.

git-release-notes -t "^(\w*)(?:\(([\w\$\.]*)\))?\: (.*)$" -m type -m scope -m title v1.1.2..v1.1.3 markdown

Post Processing

The advanced options cover the most basic use cases, however sometimes you might need some additional processing, for instance to get commit metadata from external sources (Jira, GitHub, Waffle...)

Using -s script_file.js you can invoke any arbitrary node script with the following signature:

module.exports = function(data, callback) {
  /**
   * Here `data` contains exactly the same values your template will normally receive. e.g.
   *
   * {
   *   commits: [], // the array of commits as described above
   *   range: '<since>..<until>',
   *   dateFnsFormat: function () {},
   *   debug: function() {}, // utility function to log debug messages
   * }
   *
   * Do all the processing you need and when ready call the callback passing the new data structure
   */
  callback({
    commits: data.commits.map(doSomething),
    extra: { additional: 'data' },
  });
  //
};

The object passed to the callback will be merged with the input data and passed back to the template.

For an example check samples/post-processing.js

Debug

If your post processing script or template throws an exception, the JSON data will be written to the file system in the same folder as the processing script.

The DEBUG environment variable can also be useful for fault diagnosis:

Linux

DEBUG=release-notes:*
git-release-notes ...

Windows

SET DEBUG=release-notes:cli,release-notes:externalscript
git-release-notes ...

Note the filtering options available: release-notes:cli, release-notes:externalscript, release-notes:data

About

Generate release note pages from git commit history.

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages

  • JavaScript 62.5%
  • HTML 37.5%