diff --git a/.changelogrc b/.changelogrc index 3ace601..626d55b 100644 --- a/.changelogrc +++ b/.changelogrc @@ -3,6 +3,7 @@ "logo": "https://github.com/rafinskipg/git-changelog/raw/master/images/git-changelog-logo.png", "intro": "Git changelog is a utility tool for generating changelogs. It is free and opensource. :)", "debug": "true", + "template": "templates/template.md", "sections": [ { "title": "Bug Fixes", diff --git a/.travis.yml b/.travis.yml index ea39459..a46a4cf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,8 @@ language: node_js node_js: - - "0.12" - "4.4" - "6.1" + - "7.3.0" notifications: email: diff --git a/CHANGELOG.md b/CHANGELOG.md index f63ec15..d8cd1ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,31 +1,42 @@ -__Git changelog__ +# Git changelog _Git changelog is a utility tool for generating changelogs. It is free and opensource. :)_ -# (2016-07-29) +## Bug Fixes + - fix error messages + ([ee5068bf](https://github.com/rafinskipg/git-changelog/commit/ee5068bffdbb9c0e45c8ce9ce0c2f790440f19e3)) + + - **git tag** + - get latest tag, regardless of branch for workflows that rely on git-flow releases + ([48800306](https://github.com/rafinskipg/git-changelog/commit/48800306fa5ac19b7e9a4c6d7f2f432ee8ae4d84)) + + - **options** + - Use version_name instead of version + ([43fdac85](https://github.com/rafinskipg/git-changelog/commit/43fdac855bfd2f67a43acc93ecc8ef2e7a81f45c)) ---- -## Bug Fixes -- **git log:** Ignores letter case - ([d4cff0a8](https://github.com/rafinskipg/git-changelog/commit/d4cff0a86c5ce46405f3c0dd03f9c49a7d620792), - [#54](https://github.com/rafinskipg/git-changelog/issues/54)) + +## Features + + - **template** + - Load default template if no custom template is found + ([41d5128b](https://github.com/rafinskipg/git-changelog/commit/41d5128b922efe3ced883a37bb4e170410160f4f)) + + ## Documentation + - updating documentation with template info + ([70fb9774](https://github.com/rafinskipg/git-changelog/commit/70fb97742ea2182a9d25ca92d6eeab081b44cc63)) + -- **readme:** - - Unuseful commit - ([4373f472](https://github.com/rafinskipg/git-changelog/commit/4373f4726eedad6d450c8255f5e57036a3e5e223)) - - fix link to the `.changelogrc` section - ([2975171d](https://github.com/rafinskipg/git-changelog/commit/2975171d89e1823253399bbe87a184e9164e9799)) --- -*Generated with [git-changelog](https://github.com/rafinskipg/git-changelog). If you have any problems or suggestions, create an issue.* :) **Thanks** \ No newline at end of file +*Generated with [git-changelog](https://github.com/rafinskipg/git-changelog). If you have any problems or suggestions, create an issue.* :) **Thanks** diff --git a/EXTENDEDCHANGELOG.md b/EXTENDEDCHANGELOG.md index d5e73b4..1cb00a8 100644 --- a/EXTENDEDCHANGELOG.md +++ b/EXTENDEDCHANGELOG.md @@ -1,312 +1,386 @@ -__Git changelog extended__ +# Git changelog extended _Git changelog is a utility tool for generating changelogs. It is free and opensource. :)_ -# (2016-07-29) - ---- - ## Bug Fixes - -- Fix generation of logs + - fix error messages + ([ee5068bf](https://github.com/rafinskipg/git-changelog/commit/ee5068bffdbb9c0e45c8ce9ce0c2f790440f19e3)) + - Fix generation of logs ([cddb2408](https://github.com/rafinskipg/git-changelog/commit/cddb2408fa3017be704acac51dabbba9f477a547)) -- correctly get branch name from the command line + - correctly get branch name from the command line ([4baa075b](https://github.com/rafinskipg/git-changelog/commit/4baa075bd93f878ee708817f911fe89c102dec02)) -- correctly detect when running under grunt on Windows + - correctly detect when running under grunt on Windows ([4205ea49](https://github.com/rafinskipg/git-changelog/commit/4205ea49a893e4d1807a39268739c13754d40cf2)) -- fixed tests + - fixed tests ([2e60172a](https://github.com/rafinskipg/git-changelog/commit/2e60172a4666c70d27e66d15dad297b89fff9583)) -- Stream didn't close properly + - Stream didn't close properly ([99f228cf](https://github.com/rafinskipg/git-changelog/commit/99f228cfa5cb26c46ef9e3b00171a5e3d38fd844)) -- Github commit url + - Github commit url ([c186f2d8](https://github.com/rafinskipg/git-changelog/commit/c186f2d877e7907305953610bcaaef331406178a)) -- **checkpath:** add missing require('path') + + - **checkpath** + - add missing require('path') ([e5dab826](https://github.com/rafinskipg/git-changelog/commit/e5dab826062bd22dd37c8c3d3c24a4d9b4701f6d)) -- **generate:** create path to file if it does not already exist + + - **generate** + - create path to file if it does not already exist ([62f6210f](https://github.com/rafinskipg/git-changelog/commit/62f6210f6895bcf5f9984b26948178b1a93cbc9e)) -- **git log:** Ignores letter case + + - **git log** + - Ignores letter case ([d4cff0a8](https://github.com/rafinskipg/git-changelog/commit/d4cff0a86c5ce46405f3c0dd03f9c49a7d620792), [#54](https://github.com/rafinskipg/git-changelog/issues/54)) -- **git_changelog_generate:** pass tag if it exists to gitReadLog + + - **git tag** + - get latest tag, regardless of branch for workflows that rely on git-flow releases + ([48800306](https://github.com/rafinskipg/git-changelog/commit/48800306fa5ac19b7e9a4c6d7f2f432ee8ae4d84)) + + - **git_changelog_generate** + - pass tag if it exists to gitReadLog ([7c801927](https://github.com/rafinskipg/git-changelog/commit/7c801927672792fc9a818653b74c78d77c7bff9e), [#5](https://github.com/rafinskipg/git-changelog/issues/5)) -- **nested lists:** nested list fix. Closes #9 + + - **nested lists** + - nested list fix. Closes #9 ([22855518](https://github.com/rafinskipg/git-changelog/commit/2285551810919bd4d8a749ae3ddd88f9cedcdd0e), [#9](https://github.com/rafinskipg/git-changelog/issues/9)) -- **options:** use repo_url instead of url + + - **options** + - Use version_name instead of version + ([43fdac85](https://github.com/rafinskipg/git-changelog/commit/43fdac855bfd2f67a43acc93ecc8ef2e7a81f45c)) + - use repo_url instead of url ([346b3949](https://github.com/rafinskipg/git-changelog/commit/346b39491923a49a3421f174a566b204d5fc7db9)) -- **package.json:** move q to dependancies since it is required to run + + - **package.json** + - move q to dependancies since it is required to run ([257119cf](https://github.com/rafinskipg/git-changelog/commit/257119cf2bb6d8f341a5d65a2f47bcf803dff205)) -- **params:** Restores versionName in CLI + + - **params** + - Restores versionName in CLI ([1d97f952](https://github.com/rafinskipg/git-changelog/commit/1d97f952bd5d37f67c1febdf161f4ce9b310eebf)) -## Features -- Show pull requests merged + +## Features + - Show pull requests merged ([65f5504c](https://github.com/rafinskipg/git-changelog/commit/65f5504ce8e92fa39ced7da308e471cc85f750b5)) -- improve `git log` synthax command to use the branch name + - improve `git log` synthax command to use the branch name ([4ce61281](https://github.com/rafinskipg/git-changelog/commit/4ce6128103ece64b44695ac196b457e63649229b)) -- CLI option with git-changelog + - CLI option with git-changelog ([50af9f0a](https://github.com/rafinskipg/git-changelog/commit/50af9f0aeba14e88254aaf1bfd6433c4c6bc9fbe)) -- Working on new API + - Working on new API ([121b9928](https://github.com/rafinskipg/git-changelog/commit/121b99285d2a04f9159951fa0e3f849d0d618fef)) -- **bootstrap:** creating initial structure + + - **bootstrap** + - creating initial structure ([dea45d68](https://github.com/rafinskipg/git-changelog/commit/dea45d68ce9555e876680bf7c0778add2f367a30)) -- **grunt-plugin:** - - Commit for research purposes + + - **grunt-plugin** + - Commit for research purposes ([5afbb7a9](https://github.com/rafinskipg/git-changelog/commit/5afbb7a95c9f0e985f78666e7e231967524a8928)) - - Now it is ready to be a grunt plugin + - Now it is ready to be a grunt plugin ([6422e055](https://github.com/rafinskipg/git-changelog/commit/6422e0552b30f6e94d11b03310a23c1342aa5965)) -- **options:** Added ignore tags option + + - **options** + - Added ignore tags option ([95362e8b](https://github.com/rafinskipg/git-changelog/commit/95362e8b57a673e810ffe54ff3337de1ea5109a8)) -- **output:** added logo in printHeader + + - **output** + - added logo in printHeader ([6b489450](https://github.com/rafinskipg/git-changelog/commit/6b489450a90172dc57059d7fd55fb4c6110152b2)) -- **package:** Added global install so you can run via command + + - **package** + - Added global install so you can run via command ([86eae3f0](https://github.com/rafinskipg/git-changelog/commit/86eae3f013ace1c5c23afc32b2e8f878a69629f1)) + - **template** + - Load default template if no custom template is found + ([41d5128b](https://github.com/rafinskipg/git-changelog/commit/41d5128b922efe3ced883a37bb4e170410160f4f)) + + -## Documentation -- Updated readme with the correct specification +## Documentation + - updating documentation with template info + ([70fb9774](https://github.com/rafinskipg/git-changelog/commit/70fb97742ea2182a9d25ca92d6eeab081b44cc63)) + - Updated readme with the correct specification ([ec2de4bf](https://github.com/rafinskipg/git-changelog/commit/ec2de4bf599dfc77c24c9b86ee9c0d86fe37e5b8)) -- Updated options and tagging info + - Updated options and tagging info ([1ad3b6be](https://github.com/rafinskipg/git-changelog/commit/1ad3b6bedc6431b70e3a2e93e5967bad9a7830ee)) -- added documentation for explaining the commit message + - added documentation for explaining the commit message ([d516c2fb](https://github.com/rafinskipg/git-changelog/commit/d516c2fb464072fc1f4c86ec71a910eeab3e830c)) -- Added docs + - Added docs ([e0ba50c0](https://github.com/rafinskipg/git-changelog/commit/e0ba50c0bb0b13e9b39a59b8f4dda96e86d55644)) -- **readme:** - - Unuseful commit + + - **readme** + - Unuseful commit ([4373f472](https://github.com/rafinskipg/git-changelog/commit/4373f4726eedad6d450c8255f5e57036a3e5e223)) - - fix link to the `.changelogrc` section + - fix link to the `.changelogrc` section ([2975171d](https://github.com/rafinskipg/git-changelog/commit/2975171d89e1823253399bbe87a184e9164e9799)) - - Follow proper style in example commits + - Follow proper style in example commits ([6fef01ba](https://github.com/rafinskipg/git-changelog/commit/6fef01ba8a71bb5cd779ddb84f52b8f75296618d)) - - Reorder contents + - Reorder contents ([14e8a772](https://github.com/rafinskipg/git-changelog/commit/14e8a772c3a05c32bc9fba6f75565132025d4942)) - - TOC + - TOC ([d6338ab4](https://github.com/rafinskipg/git-changelog/commit/d6338ab45f6e45e5562e5e6f4f1db86f39ca458d)) - - Added more information on the new specification + - Added more information on the new specification ([f984eedd](https://github.com/rafinskipg/git-changelog/commit/f984eedde6be5db804d0b6bf2e238ab2e7ca15fb)) - - added more commit examples and npm versioning usage + - added more commit examples and npm versioning usage ([51341b7a](https://github.com/rafinskipg/git-changelog/commit/51341b7aae082c6c1a1caaa77dfdbfdc2622a56f)) - - add logo + - add logo ([1af36c9b](https://github.com/rafinskipg/git-changelog/commit/1af36c9b0dad5cc0c2a321e3f280a89d76a8fb2b)) - - Final readme Fixes #1 Closes #1 + - Final readme Fixes #1 Closes #1 ([e725d8f4](https://github.com/rafinskipg/git-changelog/commit/e725d8f4bf477b517ca6185a75fdfa0aa660b3be), [#1](https://github.com/rafinskipg/git-changelog/issues/1)) -## Refactor -- Refactor branch name + +## Refactor + - Refactor branch name ([8774b963](https://github.com/rafinskipg/git-changelog/commit/8774b963fd5e15de1cc1066c91034f9b1d34c4bc)) -- added debug messages and refactored some additional code + - added debug messages and refactored some additional code ([70e48caf](https://github.com/rafinskipg/git-changelog/commit/70e48caf330b7f76fdea474ce58bcf96cb11ccbc)) -- modified the task using a factory pattern to improve testability + - modified the task using a factory pattern to improve testability ([1a0f25d3](https://github.com/rafinskipg/git-changelog/commit/1a0f25d3d9bbedd029c810c4dd2d35419cbb9276)) -- Removed ignore tags and updated documentation + - Removed ignore tags and updated documentation ([cb17b55d](https://github.com/rafinskipg/git-changelog/commit/cb17b55de2ba0b597147fe4ce15e6883feb82a88)) -- removed deprecated options + - removed deprecated options ([7d05b632](https://github.com/rafinskipg/git-changelog/commit/7d05b632af6be3db2c00925b7cf28cd990c19a71)) -- **delete:** deleted some files + + - **delete** + - deleted some files ([b9c72f57](https://github.com/rafinskipg/git-changelog/commit/b9c72f57c4920420fef8c486bfccf5798870e06b)) -- **docs:** - - Angular document commits + + - **docs** + - Angular document commits ([01e8c1ba](https://github.com/rafinskipg/git-changelog/commit/01e8c1ba4c29fcddcfc237f4e6185682b9ced67d)) - - Added docs + - Added docs ([0a155845](https://github.com/rafinskipg/git-changelog/commit/0a1558458c46574c5b0e6ec3749668fad1c8647a)) -- **generate:** replace `#getStream` with `fse#createOutputStream` + + - **generate** + - replace `#getStream` with `fse#createOutputStream` ([2d252d89](https://github.com/rafinskipg/git-changelog/commit/2d252d89017a70008896497e36f03e9d2add2c97)) -- **lib:** simplify methods and refactor into separate files + + - **lib** + - simplify methods and refactor into separate files ([7a3600bf](https://github.com/rafinskipg/git-changelog/commit/7a3600bf9a5487cb26e3eb4b65ac774a68b6b91e)) -- **writechangelog:** method now returns a promise + + - **writechangelog** + - method now returns a promise ([69fa1b0b](https://github.com/rafinskipg/git-changelog/commit/69fa1b0b11a603683342a9e0626cb69550b92002)) + + ## Style -- **message:** Added a message on the changelog for referencing the github + - **message** + - Added a message on the changelog for referencing the github ([d20031a9](https://github.com/rafinskipg/git-changelog/commit/d20031a9dc6fd92cba205903b2fd9d25feae6ea7)) -## Test -- Tests fixed + +## Test + - Tests fixed ([b9edae3b](https://github.com/rafinskipg/git-changelog/commit/b9edae3bfc64f2a8c2320f6f27326225bd586cc7)) -- added test for .init(), .getPreviousTag(), getRepoUrl(), .log() and .warn() + - added test for .init(), .getPreviousTag(), getRepoUrl(), .log() and .warn() ([fd099a85](https://github.com/rafinskipg/git-changelog/commit/fd099a858b44e67e28f4e18f07c520803f3ac55e)) -- removed unnecessary debug setting (was using for "debugging") + - removed unnecessary debug setting (was using for "debugging") ([83cd52b1](https://github.com/rafinskipg/git-changelog/commit/83cd52b1e8b79dd6bff13dc0d2003e802f8e45e6)) -- updated test to cover promise return from .generate() + - updated test to cover promise return from .generate() ([c182ee47](https://github.com/rafinskipg/git-changelog/commit/c182ee47a4ec36a453420f8cc04358ec6e98e381)) -- ensure changelog has default setting at the beginning of spec + - ensure changelog has default setting at the beginning of spec ([31f81e26](https://github.com/rafinskipg/git-changelog/commit/31f81e262440aa10efafd90c74d98569df418795)) -- changed spy on changelog.generate() to stub, to avoid polluting following tests + - changed spy on changelog.generate() to stub, to avoid polluting following tests ([0aa35588](https://github.com/rafinskipg/git-changelog/commit/0aa35588cf944b2f84b842d66220d50e8f5d96a8)) -- added test for .writeChageLog() and .organizeCommits() + - added test for .writeChageLog() and .organizeCommits() ([b07f28e1](https://github.com/rafinskipg/git-changelog/commit/b07f28e1e92bdf20be669596651b344d2f70855e)) -- added default mocha options + - added default mocha options ([595c8347](https://github.com/rafinskipg/git-changelog/commit/595c8347fd4e2b697ceac247babe7ece7c90c4fa)) -- added missing done() callback on .catch() + - added missing done() callback on .catch() ([0da53e9c](https://github.com/rafinskipg/git-changelog/commit/0da53e9c8ad8a967753ac06dc1c23302c7956017)) -- added tests for tag option equals to false + - added tests for tag option equals to false ([1fc1e809](https://github.com/rafinskipg/git-changelog/commit/1fc1e809dcca7d499f870c314d2860121fcb6bab)) -- Added unit tests for commit parsing + - Added unit tests for commit parsing ([504a61a7](https://github.com/rafinskipg/git-changelog/commit/504a61a715ed541feee4570810c2153ba8984420)) -- **writechangelog:** updated test to reflect changes to method + + - **writechangelog** + - updated test to reflect changes to method ([b999948f](https://github.com/rafinskipg/git-changelog/commit/b999948f2c38f5d002fa0dc535429a80acdf2d75)) -## Chore -- updated grunt contrib clean + +## Chore + - updated grunt contrib clean ([e28c0c76](https://github.com/rafinskipg/git-changelog/commit/e28c0c763b7953861c05bcbedf04c3d6d48f8243)) -- Remove grunt from peer dependencies + - Remove grunt from peer dependencies ([f6111d31](https://github.com/rafinskipg/git-changelog/commit/f6111d31f0c70f8368d2a57ea708bf58990f6bfd)) -- Updated jshint + - Updated jshint ([1d5f6b1d](https://github.com/rafinskipg/git-changelog/commit/1d5f6b1d471e9d48ac2b4c7c8b78e3e5a8021ff4)) -- typos and grammar + - typos and grammar ([5ae2ee52](https://github.com/rafinskipg/git-changelog/commit/5ae2ee52d1f096d375d077299047684eae2cd5e2)) -- a couple of spelling corrections [ci skip] + - a couple of spelling corrections [ci skip] ([1486a845](https://github.com/rafinskipg/git-changelog/commit/1486a84537c5fd2d7997721820981c7949487af2)) -- minor edits to README + - minor edits to README ([481c6c80](https://github.com/rafinskipg/git-changelog/commit/481c6c80d49e5e11c72d8378976d5d3ee1d581d2)) -- fixing lint errors + - fixing lint errors ([3a8e8d48](https://github.com/rafinskipg/git-changelog/commit/3a8e8d486a2b89b9f04d01200fe4f9f7851d0123)) -- added chai-as-promise to handle methods that return promises + - added chai-as-promise to handle methods that return promises ([1d384257](https://github.com/rafinskipg/git-changelog/commit/1d3842576839b763b28a777e96b061dbd4d01a80)) -- updated travis config + - updated travis config ([d6a7ef94](https://github.com/rafinskipg/git-changelog/commit/d6a7ef945f600ec787b515486bd3abfa2f86a25b)) -- stopped tracking test output files + - stopped tracking test output files ([1d12bccb](https://github.com/rafinskipg/git-changelog/commit/1d12bccb9f7dce07ff45318304dc5ab82620b6f1)) -- added istanbul configuration file + - added istanbul configuration file ([88c945e6](https://github.com/rafinskipg/git-changelog/commit/88c945e6d8ddddfe6ee3bdf808ae2c749b4eabf3)) -- updated travis configuration for code climate + - updated travis configuration for code climate ([fbd651dd](https://github.com/rafinskipg/git-changelog/commit/fbd651dd765a1ee26293dd03543e578181462e3f)) -- fixed lint issues in tests + - fixed lint issues in tests ([2edb0199](https://github.com/rafinskipg/git-changelog/commit/2edb019910a421cd94868397a0f5881e90af4ed5)) -- add tests to lint task + - add tests to lint task ([1d789792](https://github.com/rafinskipg/git-changelog/commit/1d789792143d2f68820c16426e772857e45ba181)) -- add lint rules for mocha test + - add lint rules for mocha test ([bbea9341](https://github.com/rafinskipg/git-changelog/commit/bbea9341acb37f729e7f83d59d784cb4ff7969e1)) -- ignore files generated by tests + - ignore files generated by tests ([3ccbff47](https://github.com/rafinskipg/git-changelog/commit/3ccbff47ee2dd655da95ea3a9b95cb156f8f6956)) -- update dependencies + - update dependencies ([3036d803](https://github.com/rafinskipg/git-changelog/commit/3036d8037f4af6aa34fb137037a9eb9d0ce34297)) -- removed unused dependency + - removed unused dependency ([cdd9f0d5](https://github.com/rafinskipg/git-changelog/commit/cdd9f0d5623f839eaaf646d4de0cf72816cf00af)) -- fixed typo + - fixed typo ([081a8f96](https://github.com/rafinskipg/git-changelog/commit/081a8f963104711b5f15bb8468489ee13927e226)) -- added commits fixture for tests + - added commits fixture for tests ([b7d16b68](https://github.com/rafinskipg/git-changelog/commit/b7d16b682a8167cd4a90e59c4f511774f6572ce1)) -- added missing development dependencies + - added missing development dependencies ([e52e3ec6](https://github.com/rafinskipg/git-changelog/commit/e52e3ec6234db4cc9055c6e0abd5f32b587f67d6)) -- adding missing newline at the end of file + - adding missing newline at the end of file ([da4b5492](https://github.com/rafinskipg/git-changelog/commit/da4b54920e1be490fb47a25906eece63229b0094)) -- removed testing from grunt file (causing recursion issues during some tests) + - removed testing from grunt file (causing recursion issues during some tests) ([8e94e8ac](https://github.com/rafinskipg/git-changelog/commit/8e94e8ac23e73709495cf0c6851fbaf1a84c0c9b)) -- install mocha before travis scripts + - install mocha before travis scripts ([9be62aae](https://github.com/rafinskipg/git-changelog/commit/9be62aaeb7d50959cff870e0cabb08277d1c512b)) -- updated npm scripts and added debug + - updated npm scripts and added debug ([aa4f2a2d](https://github.com/rafinskipg/git-changelog/commit/aa4f2a2d7b834484f65239ceccdf4f973dbe0cee)) -- moved fixtures to the test folder + - moved fixtures to the test folder ([e59d429b](https://github.com/rafinskipg/git-changelog/commit/e59d429b032451f75ef986e2d1b3c63fb8672a1c)) -- removed unused test/hacky.js + - removed unused test/hacky.js ([500fdf3c](https://github.com/rafinskipg/git-changelog/commit/500fdf3c37e72c98f4809806e85926035eb46792)) -- rename changelog.spec.js to match file being tested + - rename changelog.spec.js to match file being tested ([41757850](https://github.com/rafinskipg/git-changelog/commit/417578507b39aeffe826922ad3eccfcc13ad6ed0)) -- fixed lint errors + - fixed lint errors ([71a5eae2](https://github.com/rafinskipg/git-changelog/commit/71a5eae2212e7abf87c97a569f8251a56b5474a6)) -- added grunt coverage task + - added grunt coverage task ([ef6cf2cf](https://github.com/rafinskipg/git-changelog/commit/ef6cf2cf14b69fe4200eb0eeb9319fb4bcdffcc2)) -- added node.js `0.12` to travis-ci config + - added node.js `0.12` to travis-ci config ([24d9c58a](https://github.com/rafinskipg/git-changelog/commit/24d9c58a0a4ea349709719c431ca9878a2f01bc4)) -- Updated readme + - Updated readme ([fca6ecba](https://github.com/rafinskipg/git-changelog/commit/fca6ecbac686661ece15acdb41d23e86011457f2)) -- package json version 1.1.3 + - package json version 1.1.3 ([9d600386](https://github.com/rafinskipg/git-changelog/commit/9d6003868e352ae21383913f671bc091afc9d8c7)) -- **cleanup:** - - remove unnecessary code [skip ci] + + - **cleanup** + - remove unnecessary code [skip ci] ([80dbe3ec](https://github.com/rafinskipg/git-changelog/commit/80dbe3ec7a28e7c20d99e89009856c70138350b0)) - - remove `#getStream` and `#checkPath` + - remove `#getStream` and `#checkPath` ([cd75ebc4](https://github.com/rafinskipg/git-changelog/commit/cd75ebc44e39242b7e9c8ef2363c86d3f1cabc0e)) -- **deps:** install fs-extra@0.18.4 + + - **deps** + - install fs-extra@0.18.4 ([7c8e257b](https://github.com/rafinskipg/git-changelog/commit/7c8e257b81f0daeba7e347d175583af1a7a9bfa0)) -- **images:** - - add logo in JPEG format + + - **images** + - add logo in JPEG format ([50338b9a](https://github.com/rafinskipg/git-changelog/commit/50338b9a8b5540e42273857448e803d8b85c689d)) - - add logo in PNG format + - add logo in PNG format ([bb5fbbdb](https://github.com/rafinskipg/git-changelog/commit/bb5fbbdba7ef2b9466c185c12ef426d82fe25bcf)) -- **lint:** - - add missing semicolon + + - **lint** + - add missing semicolon ([2888af48](https://github.com/rafinskipg/git-changelog/commit/2888af4803f85da1afbb8c9832314f53cc4ca131)) - - fix indentation + - fix indentation ([4cf9b6e6](https://github.com/rafinskipg/git-changelog/commit/4cf9b6e69a1426d48f18da45614f8f01994707b7)) - - have jshint ignore false positives + - have jshint ignore false positives ([ed8e9df4](https://github.com/rafinskipg/git-changelog/commit/ed8e9df48720c42086186fa4219262a351bbc3e4)) - - fixing jshint errors + - fixing jshint errors ([987366f0](https://github.com/rafinskipg/git-changelog/commit/987366f02517c9cfdb62264d0f6ea7d0b20d6634)) -- **package:** Package json version + + - **package** + - Package json version ([990b8ea0](https://github.com/rafinskipg/git-changelog/commit/990b8ea04ca04f3c907653b0fa89ae6ddd601092)) -- **package.json:** Added preversion script + + - **package.json** + - Added preversion script ([b3f1e44a](https://github.com/rafinskipg/git-changelog/commit/b3f1e44a900b00bda1facaee5354ba1ff58166aa)) -- **release:** - - 1.0.0 codename(magnificent-goldman) + + - **release** + - 1.0.0 codename(magnificent-goldman) ([6b836fbe](https://github.com/rafinskipg/git-changelog/commit/6b836fbea9405727bfc6d8e83349ea5cf8965b05)) - - 0.1.8 codename(furious-stallman) + - 0.1.8 codename(furious-stallman) ([b9432318](https://github.com/rafinskipg/git-changelog/commit/b943231854ffd6cb0c5f32e5482cadd99c96f3e9)) -- **task:** cleanup unused requires + + - **task** + - cleanup unused requires ([8a41d4e7](https://github.com/rafinskipg/git-changelog/commit/8a41d4e7b245b2698749279765bcef4748e18ac7)) -## Branchs merged -- Merge branch 'feature/add-logo' + +## Branchs merged + - Merge branch 'feature/add-logo' ([e29b2dd8](https://github.com/rafinskipg/git-changelog/commit/e29b2dd8e088386eeec3f0c125973de6c8cdc2c6)) -- Merge branch 'development' into feature/code-refactoring + - Merge branch 'development' into feature/code-refactoring ([34ea0198](https://github.com/rafinskipg/git-changelog/commit/34ea0198b976c72c638fd815be5a5913c67ef80a)) -## Pull requests merged -- Merge pull request #55 from kerimdzhanov/patch-1 + +## Pull requests merged + - Merge pull request #60 from seivan/feature/latest_tag_regardless_of_branch + ([1ff50d0d](https://github.com/rafinskipg/git-changelog/commit/1ff50d0dc03f8c0db9961c034945c3ef8f4268f7)) + - Merge pull request #58 from olamothe/master + ([3fed7270](https://github.com/rafinskipg/git-changelog/commit/3fed727077168815f24aad7bbf5768913e3843ab)) + - Merge pull request #55 from kerimdzhanov/patch-1 ([31d13896](https://github.com/rafinskipg/git-changelog/commit/31d1389637b59ac3a6c68c3f8fca99045675c36c)) -- Merge pull request #50 from rafinskipg/changelogrc + - Merge pull request #50 from rafinskipg/changelogrc ([fd07a4bf](https://github.com/rafinskipg/git-changelog/commit/fd07a4bf039c7c8ddbb496c644dfd5fcc1627904)) -- Merge pull request #41 from pmiossec/fix_branch_option + - Merge pull request #41 from pmiossec/fix_branch_option ([6247118a](https://github.com/rafinskipg/git-changelog/commit/6247118a573259cbe71c6fdd28cb53dcb7f1b855)) -- Merge pull request #45 from xcambar/versionName + - Merge pull request #45 from xcambar/versionName ([2e50373a](https://github.com/rafinskipg/git-changelog/commit/2e50373a6f42e53598612f0e474c008624d6e80c)) -- Merge pull request #47 from Sjors/patch-1 + - Merge pull request #47 from Sjors/patch-1 ([d786fd08](https://github.com/rafinskipg/git-changelog/commit/d786fd084d7c1c250c866bec3c5d0c73b9abe271)) -- Merge pull request #46 from zoner14/master + - Merge pull request #46 from zoner14/master ([0485a1fd](https://github.com/rafinskipg/git-changelog/commit/0485a1fd4bf01662f50b93098c6b535eb7c527eb)) -- Merge pull request #37 from richardthombs/fix-grunt-on-windows + - Merge pull request #37 from richardthombs/fix-grunt-on-windows ([5f024339](https://github.com/rafinskipg/git-changelog/commit/5f02433963b5b603c5763bd5c1a37cf8ca9e3598)) -- Merge pull request #33 from richardthombs/fix-typos + - Merge pull request #33 from richardthombs/fix-typos ([2656d150](https://github.com/rafinskipg/git-changelog/commit/2656d150eb95c6ad9326e4265ba64edf8e49a11c)) -- Merge pull request #30 from JohnnyEstilles/refactor/get-stream + - Merge pull request #30 from JohnnyEstilles/refactor/get-stream ([a52b1169](https://github.com/rafinskipg/git-changelog/commit/a52b1169a2510d83d6d4fd5113ce157f30c4d4d0)) -- Merge pull request #25 from JohnnyEstilles/code-climate + - Merge pull request #25 from JohnnyEstilles/code-climate ([28053b92](https://github.com/rafinskipg/git-changelog/commit/28053b9292d3d61fb33a004f6088c244e653b76b)) -- Merge pull request #23 from JohnnyEstilles/docs/readme-updates + - Merge pull request #23 from JohnnyEstilles/docs/readme-updates ([3079151a](https://github.com/rafinskipg/git-changelog/commit/3079151a8d5f90d0830aab4437a65dff4d837b2a)) -- Merge pull request #20 from JohnnyEstilles/feature/code-refactoring + - Merge pull request #20 from JohnnyEstilles/feature/code-refactoring ([be209f04](https://github.com/rafinskipg/git-changelog/commit/be209f04c22f1ce2cb82e6412c4ddf117897a9e7)) -- Merge pull request #12 from jodybrewster/master + - Merge pull request #12 from jodybrewster/master ([219ea809](https://github.com/rafinskipg/git-changelog/commit/219ea8091ac81a55b0210c9a7fd41a7f0ee5660f)) -- Merge pull request #7 from colegleason/fix-tags + - Merge pull request #7 from colegleason/fix-tags ([1d4f6043](https://github.com/rafinskipg/git-changelog/commit/1d4f604363094d4eee3b4d7b1ca01133edaad344)) -- Merge pull request #6 from colegleason/add-q + - Merge pull request #6 from colegleason/add-q ([2a712b9c](https://github.com/rafinskipg/git-changelog/commit/2a712b9cfd912f36b6f7f70d16b336575881881a)) + + --- -*Generated with [git-changelog](https://github.com/rafinskipg/git-changelog). If you have any problems or suggestions, create an issue.* :) **Thanks** \ No newline at end of file +*Generated with [git-changelog](https://github.com/rafinskipg/git-changelog). If you have any problems or suggestions, create an issue.* :) **Thanks** diff --git a/Gruntfile.js b/Gruntfile.js index 048767b..7805420 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -43,6 +43,7 @@ module.exports = function(grunt) { tag1: { options: { app_name : 'Since tag 1 changelog', + intro: 'This changelog is from the previous tag', file: 'output/tag1.md', logo : 'https://github.com/rafinskipg/git-changelog/raw/master/images/git-changelog-logo.png', version : 'squeezy potatoe', @@ -60,6 +61,18 @@ module.exports = function(grunt) { ] } }, + customTemplate: { + options: { + app_name : 'Custom Template', + intro: 'This changelog is generated with a custom template', + file: 'output/customTemplate.md', + template: 'templates/template_two.md', + logo : 'https://github.com/rafinskipg/git-changelog/raw/master/images/git-changelog-logo.png', + version : 'squeezy potatoe', + tag: 'v0.0.1', + debug: true + } + }, extended: { options: { app_name : 'Git changelog extended', diff --git a/README.md b/README.md index 47a0809..db49f94 100644 --- a/README.md +++ b/README.md @@ -43,11 +43,16 @@ Since version `1.0.0` git-changelog has included the [`.changelogrc` specification](#changelogrc-specification) and has discontinued the next options: - `grep_commits` option has been removed in favour of the `.changelogrc` options -- `tag = false`, in addition to pick logs from the begining of the project, now groups the commits by tag [see example]. **TODO** -- `tag = false` && `group=false` will log from the begining of the project, without grouping by tag **TODO** - `repo_url` fixed as parameter - `branch_name` changed to `branch` +### v1.1.0 +- `version_name` instead of `version` + + +**ATTENTION: Help wanted, there are some easy issues that you can contribute to. WINK WINK** + + ## `.changelogrc` specification The `.changelogrc` file contains the "standard commit guideliness" that you and your team are following. @@ -61,8 +66,9 @@ This specification is used to grep the commits on your log, it contains a valid "intro": "Git changelog is a utility tool for generating changelogs. It is free and opensource. :)", "branch" : "", "repo_url": "", - "version" : "v1.0.0", + "version_name" : "v1.0.0", "file": "CHANGELOG.md", + "template": "myCustomTemplate.md", "sections": [ { "title": "Bug Fixes", @@ -112,12 +118,13 @@ This specification is used to grep the commits on your log, it contains a valid * **branch** : The name of the branch. Defaults to ` ` * **repo_url** : The url of the project. For issues and commits links. Defaults to `git config --get remote.origin.url` -* **version**: The version of the project. Defaults to ` `, *DEPRECATED* will default to the tag name +* **version_name**: The version name of the project. * **file**: The name of the file that will be generated. Defaults to `CHANGELOG.md`, +* **template**: The template for generating the changelog. It defaults to the one inside this project (/templates/template.md) * **app_name** : The name of the project. Defaults to `My App - Changelog` * **intro** : The introduction text on the header of the changelog. Defaults to `null` * **logo** : A logo URL to be included in the header of the changelog. Defaults to `null` -* **changelogrc ** : Relative path indicating the location of the .changelogrc file, defaults to current dir. +* **changelogrc** : Relative path indicating the location of the .changelogrc file, defaults to current dir. * **tag**: You can select from which tag to generate the log, it defaults to the last one. Set it to false for log since the beginning of the project * **debug**: Debug mode, false by default * **sections**: Group the commit by sections. The sections included by default are the ones that are on the previous example of .changelogrc file. @@ -161,7 +168,7 @@ grunt.initConfig({ options: { app_name : 'Git changelog extended', file : 'EXTENDEDCHANGELOG.md', - version : 'squeezy potatoe', + version_name : 'squeezy potatoe', sections : [ { "title": "Test commits", @@ -183,6 +190,18 @@ grunt.initConfig({ file : 'tags/certainTag.md', tag : 'v0.0.1' } + }, + customTemplate: { + options: { + app_name : 'Custom Template', + intro: 'This changelog is generated with a custom template', + file: 'output/customTemplate.md', + template: 'templates/template_two.md', + logo : 'https://github.com/rafinskipg/git-changelog/raw/master/images/git-changelog-logo.png', + version_name : 'squeezy potatoe', + tag: 'v0.0.1', + debug: true + } } } }) @@ -206,19 +225,21 @@ Use it directly with the common options Options: - -h, --help output usage information - -V, --version output the version number - -e, --extended Extended log - -a, --app_name [app_name] Name [app_name] - -b, --branch [branch] Branch name [branch] - -f, --file [file] File [file] - -r, --repo_url [url] Repo url [url] - -l, --logo [logo] Logo path [logo] - -i, --intro [intro] intro text [intro] - -t, --tag [tag] Since tag [tag] - -rc, --changelogrc [changelogrc] .changelogrc relative path [changelogrc] - -g, --grep [grep] Grep commits for [grep] - -d, --debug Debugger + -h, --help output usage information + -V, --version output the version number of the package + -e, --extended Extended log + -n, --version_name [version_name] Name of the version + -a, --app_name [app_name] Name [app_name] + -b, --branch [branch] Branch name [branch] + -f, --file [file] File [file] + -tpl, --template [template] Template [template] + -r, --repo_url [repo_url] Repo url [repo_url] + -l, --logo [logo] Logo path [logo] + -i, --intro [intro] intro text [intro] + -t, --tag [tag] Since tag [tag] + -rc, --changelogrc [changelogrc] .changelogrc relative path [changelogrc] + -g, --grep [grep] Grep commits for [grep] + -d, --debug Debugger ``` diff --git a/output/customTemplate.md b/output/customTemplate.md new file mode 100644 index 0000000..38ba4ee --- /dev/null +++ b/output/customTemplate.md @@ -0,0 +1,167 @@ + + +# Custom Template + +_This changelog is generated with a custom template_ + +## v0.0.1 ( Sun Dec 25 2016 13:33:22 GMT+0100 (CET) ) + + +## Bug Fixes + - fix error messages (ee5068bffdbb9c0e45c8ce9ce0c2f790440f19e3 + - Fix generation of logs (cddb2408fa3017be704acac51dabbba9f477a547 + - correctly get branch name from the command line (4baa075bd93f878ee708817f911fe89c102dec02 + - correctly detect when running under grunt on Windows (4205ea49a893e4d1807a39268739c13754d40cf2 + - fixed tests (2e60172a4666c70d27e66d15dad297b89fff9583 + - Stream didn't close properly (99f228cfa5cb26c46ef9e3b00171a5e3d38fd844 + - Github commit url (c186f2d877e7907305953610bcaaef331406178a + - **checkpath** + - add missing require('path') (e5dab826062bd22dd37c8c3d3c24a4d9b4701f6d) + - **generate** + - create path to file if it does not already exist (62f6210f6895bcf5f9984b26948178b1a93cbc9e) + - **git log** + - Ignores letter case (d4cff0a86c5ce46405f3c0dd03f9c49a7d620792, Closes: [#54](https://github.com/rafinskipg/git-changelog/issues/54)) + - **git tag** + - get latest tag, regardless of branch for workflows that rely on git-flow releases (48800306fa5ac19b7e9a4c6d7f2f432ee8ae4d84) + - **git_changelog_generate** + - pass tag if it exists to gitReadLog (7c801927672792fc9a818653b74c78d77c7bff9e, Closes: [#5](https://github.com/rafinskipg/git-changelog/issues/5)) + - **nested lists** + - nested list fix. Closes #9 (2285551810919bd4d8a749ae3ddd88f9cedcdd0e, Closes: [#9](https://github.com/rafinskipg/git-changelog/issues/9)) + - **options** + - Use version_name instead of version (43fdac855bfd2f67a43acc93ecc8ef2e7a81f45c) - use repo_url instead of url (346b39491923a49a3421f174a566b204d5fc7db9) + - **package.json** + - move q to dependancies since it is required to run (257119cf2bb6d8f341a5d65a2f47bcf803dff205) + - **params** + - Restores versionName in CLI (1d97f952bd5d37f67c1febdf161f4ce9b310eebf) + + + +## Features + - Show pull requests merged (65f5504ce8e92fa39ced7da308e471cc85f750b5 + - improve `git log` synthax command to use the branch name (4ce6128103ece64b44695ac196b457e63649229b + - CLI option with git-changelog (50af9f0aeba14e88254aaf1bfd6433c4c6bc9fbe + - Working on new API (121b99285d2a04f9159951fa0e3f849d0d618fef + - **bootstrap** + - creating initial structure (dea45d68ce9555e876680bf7c0778add2f367a30) + - **grunt-plugin** + - Commit for research purposes (5afbb7a95c9f0e985f78666e7e231967524a8928) - Now it is ready to be a grunt plugin (6422e0552b30f6e94d11b03310a23c1342aa5965) + - **options** + - Added ignore tags option (95362e8b57a673e810ffe54ff3337de1ea5109a8) + - **output** + - added logo in printHeader (6b489450a90172dc57059d7fd55fb4c6110152b2) + - **package** + - Added global install so you can run via command (86eae3f013ace1c5c23afc32b2e8f878a69629f1) + - **template** + - Load default template if no custom template is found (41d5128b922efe3ced883a37bb4e170410160f4f) + + + +## Documentation + - updating documentation with template info (70fb97742ea2182a9d25ca92d6eeab081b44cc63 + - Updated readme with the correct specification (ec2de4bf599dfc77c24c9b86ee9c0d86fe37e5b8 + - Updated options and tagging info (1ad3b6bedc6431b70e3a2e93e5967bad9a7830ee + - added documentation for explaining the commit message (d516c2fb464072fc1f4c86ec71a910eeab3e830c + - Added docs (e0ba50c0bb0b13e9b39a59b8f4dda96e86d55644 + - **readme** + - Unuseful commit (4373f4726eedad6d450c8255f5e57036a3e5e223) - fix link to the `.changelogrc` section (2975171d89e1823253399bbe87a184e9164e9799) - Follow proper style in example commits (6fef01ba8a71bb5cd779ddb84f52b8f75296618d) - Reorder contents (14e8a772c3a05c32bc9fba6f75565132025d4942) - TOC (d6338ab45f6e45e5562e5e6f4f1db86f39ca458d) - Added more information on the new specification (f984eedde6be5db804d0b6bf2e238ab2e7ca15fb) - added more commit examples and npm versioning usage (51341b7aae082c6c1a1caaa77dfdbfdc2622a56f) - add logo (1af36c9b0dad5cc0c2a321e3f280a89d76a8fb2b) - Final readme Fixes #1 Closes #1 (e725d8f4bf477b517ca6185a75fdfa0aa660b3be, Closes: [#1](https://github.com/rafinskipg/git-changelog/issues/1)) + + + +## Refactor + - Refactor branch name (8774b963fd5e15de1cc1066c91034f9b1d34c4bc + - added debug messages and refactored some additional code (70e48caf330b7f76fdea474ce58bcf96cb11ccbc + - modified the task using a factory pattern to improve testability (1a0f25d3d9bbedd029c810c4dd2d35419cbb9276 + - Removed ignore tags and updated documentation (cb17b55de2ba0b597147fe4ce15e6883feb82a88 + - removed deprecated options (7d05b632af6be3db2c00925b7cf28cd990c19a71 + - **delete** + - deleted some files (b9c72f57c4920420fef8c486bfccf5798870e06b) + - **docs** + - Angular document commits (01e8c1ba4c29fcddcfc237f4e6185682b9ced67d) - Added docs (0a1558458c46574c5b0e6ec3749668fad1c8647a) + - **generate** + - replace `#getStream` with `fse#createOutputStream` (2d252d89017a70008896497e36f03e9d2add2c97) + - **lib** + - simplify methods and refactor into separate files (7a3600bf9a5487cb26e3eb4b65ac774a68b6b91e) + - **writechangelog** + - method now returns a promise (69fa1b0b11a603683342a9e0626cb69550b92002) + + + +## Style + - **message** + - Added a message on the changelog for referencing the github (d20031a9dc6fd92cba205903b2fd9d25feae6ea7) + + + +## Test + - Tests fixed (b9edae3bfc64f2a8c2320f6f27326225bd586cc7 + - added test for .init(), .getPreviousTag(), getRepoUrl(), .log() and .warn() (fd099a858b44e67e28f4e18f07c520803f3ac55e + - removed unnecessary debug setting (was using for "debugging") (83cd52b1e8b79dd6bff13dc0d2003e802f8e45e6 + - updated test to cover promise return from .generate() (c182ee47a4ec36a453420f8cc04358ec6e98e381 + - ensure changelog has default setting at the beginning of spec (31f81e262440aa10efafd90c74d98569df418795 + - changed spy on changelog.generate() to stub, to avoid polluting following tests (0aa35588cf944b2f84b842d66220d50e8f5d96a8 + - added test for .writeChageLog() and .organizeCommits() (b07f28e1e92bdf20be669596651b344d2f70855e + - added default mocha options (595c8347fd4e2b697ceac247babe7ece7c90c4fa + - added missing done() callback on .catch() (0da53e9c8ad8a967753ac06dc1c23302c7956017 + - added tests for tag option equals to false (1fc1e809dcca7d499f870c314d2860121fcb6bab + - Added unit tests for commit parsing (504a61a715ed541feee4570810c2153ba8984420 + - **writechangelog** + - updated test to reflect changes to method (b999948f2c38f5d002fa0dc535429a80acdf2d75) + + + +## Chore + - updated grunt contrib clean (e28c0c763b7953861c05bcbedf04c3d6d48f8243 + - Remove grunt from peer dependencies (f6111d31f0c70f8368d2a57ea708bf58990f6bfd + - Updated jshint (1d5f6b1d471e9d48ac2b4c7c8b78e3e5a8021ff4 + - typos and grammar (5ae2ee52d1f096d375d077299047684eae2cd5e2 + - a couple of spelling corrections [ci skip] (1486a84537c5fd2d7997721820981c7949487af2 + - minor edits to README (481c6c80d49e5e11c72d8378976d5d3ee1d581d2 + - fixing lint errors (3a8e8d486a2b89b9f04d01200fe4f9f7851d0123 + - added chai-as-promise to handle methods that return promises (1d3842576839b763b28a777e96b061dbd4d01a80 + - updated travis config (d6a7ef945f600ec787b515486bd3abfa2f86a25b + - stopped tracking test output files (1d12bccb9f7dce07ff45318304dc5ab82620b6f1 + - added istanbul configuration file (88c945e6d8ddddfe6ee3bdf808ae2c749b4eabf3 + - updated travis configuration for code climate (fbd651dd765a1ee26293dd03543e578181462e3f + - fixed lint issues in tests (2edb019910a421cd94868397a0f5881e90af4ed5 + - add tests to lint task (1d789792143d2f68820c16426e772857e45ba181 + - add lint rules for mocha test (bbea9341acb37f729e7f83d59d784cb4ff7969e1 + - ignore files generated by tests (3ccbff47ee2dd655da95ea3a9b95cb156f8f6956 + - update dependencies (3036d8037f4af6aa34fb137037a9eb9d0ce34297 + - removed unused dependency (cdd9f0d5623f839eaaf646d4de0cf72816cf00af + - fixed typo (081a8f963104711b5f15bb8468489ee13927e226 + - added commits fixture for tests (b7d16b682a8167cd4a90e59c4f511774f6572ce1 + - added missing development dependencies (e52e3ec6234db4cc9055c6e0abd5f32b587f67d6 + - adding missing newline at the end of file (da4b54920e1be490fb47a25906eece63229b0094 + - removed testing from grunt file (causing recursion issues during some tests) (8e94e8ac23e73709495cf0c6851fbaf1a84c0c9b + - install mocha before travis scripts (9be62aaeb7d50959cff870e0cabb08277d1c512b + - updated npm scripts and added debug (aa4f2a2d7b834484f65239ceccdf4f973dbe0cee + - moved fixtures to the test folder (e59d429b032451f75ef986e2d1b3c63fb8672a1c + - removed unused test/hacky.js (500fdf3c37e72c98f4809806e85926035eb46792 + - rename changelog.spec.js to match file being tested (417578507b39aeffe826922ad3eccfcc13ad6ed0 + - fixed lint errors (71a5eae2212e7abf87c97a569f8251a56b5474a6 + - added grunt coverage task (ef6cf2cf14b69fe4200eb0eeb9319fb4bcdffcc2 + - added node.js `0.12` to travis-ci config (24d9c58a0a4ea349709719c431ca9878a2f01bc4 + - Updated readme (fca6ecbac686661ece15acdb41d23e86011457f2 + - package json version 1.1.3 (9d6003868e352ae21383913f671bc091afc9d8c7 + - **cleanup** + - remove unnecessary code [skip ci] (80dbe3ec7a28e7c20d99e89009856c70138350b0) - remove `#getStream` and `#checkPath` (cd75ebc44e39242b7e9c8ef2363c86d3f1cabc0e) + - **deps** + - install fs-extra@0.18.4 (7c8e257b81f0daeba7e347d175583af1a7a9bfa0) + - **images** + - add logo in JPEG format (50338b9a8b5540e42273857448e803d8b85c689d) - add logo in PNG format (bb5fbbdba7ef2b9466c185c12ef426d82fe25bcf) + - **lint** + - add missing semicolon (2888af4803f85da1afbb8c9832314f53cc4ca131) - fix indentation (4cf9b6e69a1426d48f18da45614f8f01994707b7) - have jshint ignore false positives (ed8e9df48720c42086186fa4219262a351bbc3e4) - fixing jshint errors (987366f02517c9cfdb62264d0f6ea7d0b20d6634) + - **package** + - Package json version (990b8ea04ca04f3c907653b0fa89ae6ddd601092) + - **package.json** + - Added preversion script (b3f1e44a900b00bda1facaee5354ba1ff58166aa) + - **release** + - 1.0.0 codename(magnificent-goldman) (6b836fbea9405727bfc6d8e83349ea5cf8965b05) - 0.1.8 codename(furious-stallman) (b943231854ffd6cb0c5f32e5482cadd99c96f3e9) + - **task** + - cleanup unused requires (8a41d4e7b245b2698749279765bcef4748e18ac7) + + + + +--- +*Generated with [git-changelog](https://github.com/rafinskipg/git-changelog). If you have any problems or suggestions, create an issue.* :) **Thanks** diff --git a/output/tag1.md b/output/tag1.md index cd884a1..987710c 100644 --- a/output/tag1.md +++ b/output/tag1.md @@ -1,82 +1,111 @@ -__Since tag 1 changelog__ +# Since tag 1 changelog -# squeezy potatoe (2016-07-29) +_This changelog is from the previous tag_ +## v0.0.1 ( Sun Dec 25 2016 13:33:21 GMT+0100 (CET) ) ---- - ## Bug Fixes - -- Fix generation of logs + - fix error messages + ([ee5068bf](https://github.com/rafinskipg/git-changelog/commit/ee5068bffdbb9c0e45c8ce9ce0c2f790440f19e3)) + - Fix generation of logs ([cddb2408](https://github.com/rafinskipg/git-changelog/commit/cddb2408fa3017be704acac51dabbba9f477a547)) -- correctly get branch name from the command line + - correctly get branch name from the command line ([4baa075b](https://github.com/rafinskipg/git-changelog/commit/4baa075bd93f878ee708817f911fe89c102dec02)) -- correctly detect when running under grunt on Windows + - correctly detect when running under grunt on Windows ([4205ea49](https://github.com/rafinskipg/git-changelog/commit/4205ea49a893e4d1807a39268739c13754d40cf2)) -- fixed tests + - fixed tests ([2e60172a](https://github.com/rafinskipg/git-changelog/commit/2e60172a4666c70d27e66d15dad297b89fff9583)) -- Stream didn't close properly + - Stream didn't close properly ([99f228cf](https://github.com/rafinskipg/git-changelog/commit/99f228cfa5cb26c46ef9e3b00171a5e3d38fd844)) -- Github commit url + - Github commit url ([c186f2d8](https://github.com/rafinskipg/git-changelog/commit/c186f2d877e7907305953610bcaaef331406178a)) -- **checkpath:** add missing require('path') + + - **checkpath** + - add missing require('path') ([e5dab826](https://github.com/rafinskipg/git-changelog/commit/e5dab826062bd22dd37c8c3d3c24a4d9b4701f6d)) -- **generate:** create path to file if it does not already exist + + - **generate** + - create path to file if it does not already exist ([62f6210f](https://github.com/rafinskipg/git-changelog/commit/62f6210f6895bcf5f9984b26948178b1a93cbc9e)) -- **git log:** Ignores letter case + + - **git log** + - Ignores letter case ([d4cff0a8](https://github.com/rafinskipg/git-changelog/commit/d4cff0a86c5ce46405f3c0dd03f9c49a7d620792), [#54](https://github.com/rafinskipg/git-changelog/issues/54)) -- **git_changelog_generate:** pass tag if it exists to gitReadLog + + - **git tag** + - get latest tag, regardless of branch for workflows that rely on git-flow releases + ([48800306](https://github.com/rafinskipg/git-changelog/commit/48800306fa5ac19b7e9a4c6d7f2f432ee8ae4d84)) + + - **git_changelog_generate** + - pass tag if it exists to gitReadLog ([7c801927](https://github.com/rafinskipg/git-changelog/commit/7c801927672792fc9a818653b74c78d77c7bff9e), [#5](https://github.com/rafinskipg/git-changelog/issues/5)) -- **nested lists:** nested list fix. Closes #9 + + - **nested lists** + - nested list fix. Closes #9 ([22855518](https://github.com/rafinskipg/git-changelog/commit/2285551810919bd4d8a749ae3ddd88f9cedcdd0e), [#9](https://github.com/rafinskipg/git-changelog/issues/9)) -- **options:** use repo_url instead of url + + - **options** + - Use version_name instead of version + ([43fdac85](https://github.com/rafinskipg/git-changelog/commit/43fdac855bfd2f67a43acc93ecc8ef2e7a81f45c)) + - use repo_url instead of url ([346b3949](https://github.com/rafinskipg/git-changelog/commit/346b39491923a49a3421f174a566b204d5fc7db9)) -- **package.json:** move q to dependancies since it is required to run + + - **package.json** + - move q to dependancies since it is required to run ([257119cf](https://github.com/rafinskipg/git-changelog/commit/257119cf2bb6d8f341a5d65a2f47bcf803dff205)) -- **params:** Restores versionName in CLI + + - **params** + - Restores versionName in CLI ([1d97f952](https://github.com/rafinskipg/git-changelog/commit/1d97f952bd5d37f67c1febdf161f4ce9b310eebf)) -## Pull requests merged -- Merge pull request #55 from kerimdzhanov/patch-1 + +## Pull requests merged + - Merge pull request #60 from seivan/feature/latest_tag_regardless_of_branch + ([1ff50d0d](https://github.com/rafinskipg/git-changelog/commit/1ff50d0dc03f8c0db9961c034945c3ef8f4268f7)) + - Merge pull request #58 from olamothe/master + ([3fed7270](https://github.com/rafinskipg/git-changelog/commit/3fed727077168815f24aad7bbf5768913e3843ab)) + - Merge pull request #55 from kerimdzhanov/patch-1 ([31d13896](https://github.com/rafinskipg/git-changelog/commit/31d1389637b59ac3a6c68c3f8fca99045675c36c)) -- Merge pull request #50 from rafinskipg/changelogrc + - Merge pull request #50 from rafinskipg/changelogrc ([fd07a4bf](https://github.com/rafinskipg/git-changelog/commit/fd07a4bf039c7c8ddbb496c644dfd5fcc1627904)) -- Merge pull request #41 from pmiossec/fix_branch_option + - Merge pull request #41 from pmiossec/fix_branch_option ([6247118a](https://github.com/rafinskipg/git-changelog/commit/6247118a573259cbe71c6fdd28cb53dcb7f1b855)) -- Merge pull request #45 from xcambar/versionName + - Merge pull request #45 from xcambar/versionName ([2e50373a](https://github.com/rafinskipg/git-changelog/commit/2e50373a6f42e53598612f0e474c008624d6e80c)) -- Merge pull request #47 from Sjors/patch-1 + - Merge pull request #47 from Sjors/patch-1 ([d786fd08](https://github.com/rafinskipg/git-changelog/commit/d786fd084d7c1c250c866bec3c5d0c73b9abe271)) -- Merge pull request #46 from zoner14/master + - Merge pull request #46 from zoner14/master ([0485a1fd](https://github.com/rafinskipg/git-changelog/commit/0485a1fd4bf01662f50b93098c6b535eb7c527eb)) -- Merge pull request #37 from richardthombs/fix-grunt-on-windows + - Merge pull request #37 from richardthombs/fix-grunt-on-windows ([5f024339](https://github.com/rafinskipg/git-changelog/commit/5f02433963b5b603c5763bd5c1a37cf8ca9e3598)) -- Merge pull request #33 from richardthombs/fix-typos + - Merge pull request #33 from richardthombs/fix-typos ([2656d150](https://github.com/rafinskipg/git-changelog/commit/2656d150eb95c6ad9326e4265ba64edf8e49a11c)) -- Merge pull request #30 from JohnnyEstilles/refactor/get-stream + - Merge pull request #30 from JohnnyEstilles/refactor/get-stream ([a52b1169](https://github.com/rafinskipg/git-changelog/commit/a52b1169a2510d83d6d4fd5113ce157f30c4d4d0)) -- Merge pull request #25 from JohnnyEstilles/code-climate + - Merge pull request #25 from JohnnyEstilles/code-climate ([28053b92](https://github.com/rafinskipg/git-changelog/commit/28053b9292d3d61fb33a004f6088c244e653b76b)) -- Merge pull request #23 from JohnnyEstilles/docs/readme-updates + - Merge pull request #23 from JohnnyEstilles/docs/readme-updates ([3079151a](https://github.com/rafinskipg/git-changelog/commit/3079151a8d5f90d0830aab4437a65dff4d837b2a)) -- Merge pull request #20 from JohnnyEstilles/feature/code-refactoring + - Merge pull request #20 from JohnnyEstilles/feature/code-refactoring ([be209f04](https://github.com/rafinskipg/git-changelog/commit/be209f04c22f1ce2cb82e6412c4ddf117897a9e7)) -- Merge pull request #12 from jodybrewster/master + - Merge pull request #12 from jodybrewster/master ([219ea809](https://github.com/rafinskipg/git-changelog/commit/219ea8091ac81a55b0210c9a7fd41a7f0ee5660f)) -- Merge pull request #7 from colegleason/fix-tags + - Merge pull request #7 from colegleason/fix-tags ([1d4f6043](https://github.com/rafinskipg/git-changelog/commit/1d4f604363094d4eee3b4d7b1ca01133edaad344)) -- Merge pull request #6 from colegleason/add-q + - Merge pull request #6 from colegleason/add-q ([2a712b9c](https://github.com/rafinskipg/git-changelog/commit/2a712b9cfd912f36b6f7f70d16b336575881881a)) + + --- -*Generated with [git-changelog](https://github.com/rafinskipg/git-changelog). If you have any problems or suggestions, create an issue.* :) **Thanks** \ No newline at end of file +*Generated with [git-changelog](https://github.com/rafinskipg/git-changelog). If you have any problems or suggestions, create an issue.* :) **Thanks** diff --git a/tasks/command.js b/tasks/command.js index c834552..838885b 100755 --- a/tasks/command.js +++ b/tasks/command.js @@ -18,6 +18,7 @@ if (process.argv.join('').replace(/\\/g,'/').indexOf('/grunt') === -1) { .option('-a, --app_name [app_name]', 'Name [app_name]') .option('-b, --branch [branch]', 'Branch name [branch]') .option('-f, --file [file]', 'File [file]') + .option('-tpl, --template [template]', 'Template [template]') .option('-r, --repo_url [repo_url]', 'Repo url [repo_url]') .option('-l, --logo [logo]', 'Logo path [logo]') .option('-i, --intro [intro]', 'intro text [intro]') @@ -35,7 +36,7 @@ if (process.argv.join('').replace(/\\/g,'/').indexOf('/grunt') === -1) { } if (program.version_name){ - options.versionName = program.version_name; + options.version_name = program.version_name; } if (program.app_name){ @@ -55,6 +56,10 @@ if (process.argv.join('').replace(/\\/g,'/').indexOf('/grunt') === -1) { options.file = program.file; } + if (program.template){ + options.template = program.template; + } + if (program.changelogrc){ options.changelogrc = program.changelogrc; } diff --git a/tasks/defaults.js b/tasks/defaults.js index fb8f70c..5bc5a76 100644 --- a/tasks/defaults.js +++ b/tasks/defaults.js @@ -3,13 +3,14 @@ module.exports = { branch : '', //[G]ithub [B]itbucket supported at the momment repo_url: '', - version : '', + version_name : '', file: 'CHANGELOG.md', app_name : 'My app - Changelog', tag: null, logo : null, intro : null, debug: false, + template: 'templates/template.md', changelogrc : '.changelogrc', sections: [ { diff --git a/tasks/git_changelog_generate.js b/tasks/git_changelog_generate.js index 33e00ed..6a0b501 100644 --- a/tasks/git_changelog_generate.js +++ b/tasks/git_changelog_generate.js @@ -19,6 +19,7 @@ Changelog.prototype.setDefaults = require('./lib/set-defaults'); Changelog.prototype.message = require('./lib/message'); Changelog.prototype.getProviderLinks = require('./lib/get-provider-links'); Changelog.prototype.loadChangelogRc = require('./lib/load-changelog-rc'); +Changelog.prototype.loadTemplate = require('./lib/load-template'); Changelog.prototype.getGitLogCommands = require('./lib/get-gitlog-commands'); Changelog.prototype.parseRawCommit = require('./lib/parse-raw-commit'); Changelog.prototype.linkToIssue = require('./lib/link-to-issue'); @@ -26,6 +27,7 @@ Changelog.prototype.linkToCommit = require('./lib/link-to-commit'); Changelog.prototype.currentDate = require('./lib/current-date'); Changelog.prototype.printHeader = require('./lib/print-header'); Changelog.prototype.printSection = require('./lib/print-section'); +Changelog.prototype.printCommit = require('./lib/print-commit'); Changelog.prototype.printSalute = require('./lib/print-salute'); Changelog.prototype.readGitLog = require('./lib/read-gitlog'); Changelog.prototype.writeChangelog = require('./lib/write-change-log'); diff --git a/tasks/lib/generate.js b/tasks/lib/generate.js index 599cc64..4934d7f 100644 --- a/tasks/lib/generate.js +++ b/tasks/lib/generate.js @@ -1,30 +1,19 @@ 'use strict'; var debug = require('debug')('changelog:generate'); -var q = require('q'); -var fse = require('fs-extra'); - -function generateFromCommits(deferred, commits, sections) { - var stream; +function generateFromCommits(commits, sections) { this.message('parsed commits', commits.length); this.log('debug', 'Parsed', commits.length, 'commits'); - this.log('info','Generating changelog to', this.options.file || 'stdout', '(', this.options.version, ')'); - - if (this.options.file) { - stream = fse.createOutputStream(this.options.file); - } else { - stream = process.stdout; - } + this.log('info','Generating changelog to', this.options.file || 'stdout', '(', this.options.version_name, ')'); - this.writeChangelog(stream, commits, sections) - .then(deferred.resolve.bind(deferred, this.options)); + return this.writeChangelog(commits, sections); } -function generateFromTag(deferred, tag) { +function generateFromTag(tag) { var readGitLog; - - if (typeof(tag) !== 'undefined' && tag !== false) { + + if (typeof(tag) !== 'undefined' && tag && tag !== false) { this.log('info', 'Reading git log since', tag); this.message('since tag', tag); readGitLog = this.readGitLog.bind(this, this.cmd.gitLog, tag); @@ -34,25 +23,25 @@ function generateFromTag(deferred, tag) { readGitLog = this.readGitLog.bind(this, this.cmd.gitLogNoTag); } - readGitLog() - .then(generateFromCommits.bind(this, deferred)) + return readGitLog() + .then(generateFromCommits.bind(this)) .catch(console.log.bind(console, 'error')); } function generate(params, loadRC) { debug('generating ...'); var self = this; - var deferred = q.defer(); - this.init(params, loadRC) + return this.init(params, loadRC) .then(this.getPreviousTag.bind(this)) - .then(generateFromTag.bind(this, deferred)) + .then(generateFromTag.bind(this)) + .then(function(){ + return self.options; + }) .catch(function(err){ self.log('error', err); - deferred.reject(err); + throw(err); }); - - return deferred.promise; } module.exports = generate; diff --git a/tasks/lib/get-previous-tag.js b/tasks/lib/get-previous-tag.js index e5e06d2..c4b3020 100644 --- a/tasks/lib/get-previous-tag.js +++ b/tasks/lib/get-previous-tag.js @@ -2,32 +2,33 @@ var debug = require('debug')('changelog:getPreviousTag'); var child = require('child_process'); -var q = require('q'); -function cmdDone(deferred, code, stdout, stderr) { +function cmdDone(resolve, reject, code, stdout, stderr) { debug('returning from git tag'); + //I think this command it's actually not working and always return empty + // Consider trying git describe --abbrev=0 --tags if (code) { - deferred.reject(); + reject(); } else { - deferred.resolve(stdout.replace('\n', '')); + resolve(stdout.replace('\n', '')); } } function getPreviousTag() { - var deferred = q.defer(); + var module = this; - if (this.options.tag) { - deferred.resolve(this.options.tag); - } else if (this.options.tag === false) { - deferred.resolve(false); - } else { - this.log('debug', 'Getting last tag'); - //IF we dont find a previous tag, we get all the commits from the beggining - The bigbang of the code - debug('calling git tag command'); - child.exec(this.cmd.gitTag, cmdDone.bind(null, deferred)); - } - - return deferred.promise; + return new Promise(function(resolve, reject){ + if (module.options.tag) { + resolve(module.options.tag); + } else if (module.options.tag === false) { + resolve(false); + } else { + module.log('debug', 'Getting last tag'); + //IF we dont find a previous tag, we get all the commits from the beggining - The bigbang of the code + debug('calling git tag command'); + child.exec(module.cmd.gitTag, cmdDone.bind(null, resolve, reject)); + } + }); } module.exports = getPreviousTag; diff --git a/tasks/lib/get-repo-url.js b/tasks/lib/get-repo-url.js index be1fc53..999af7f 100644 --- a/tasks/lib/get-repo-url.js +++ b/tasks/lib/get-repo-url.js @@ -7,7 +7,7 @@ var q = require('q'); function cmdDone(deferred, code, stdout, stderr) { debug('returning git repo url command'); if (code) { - deferred.reject(); + deferred.reject("Sorry, you've not configured an origin remote or passed a `repo_url` config value"); } else { stdout = stdout.replace('\n', '').replace('.git', ''); deferred.resolve(stdout); diff --git a/tasks/lib/init-options.js b/tasks/lib/init-options.js index 53306d9..d97d8ea 100644 --- a/tasks/lib/init-options.js +++ b/tasks/lib/init-options.js @@ -15,10 +15,11 @@ function initOptions(params) { this.message('name', this.options.app_name); this.message('intro', this.options.intro); this.message('file', this.options.file); + this.message('template', this.options.template); this.message('logo', this.options.logo); this.message('sections', this.options.sections); this.message('debug', this.options.debug); - this.message('version', this.options.version); + this.message('version_name', this.options.version_name); this.message('changelogrc', this.options.changelogrc); } diff --git a/tasks/lib/init.js b/tasks/lib/init.js index a2a8b4a..7ef85b7 100644 --- a/tasks/lib/init.js +++ b/tasks/lib/init.js @@ -16,7 +16,7 @@ function getRepoSuccess(deferred, url) { function getRepoFailure(deferred, err) { this.message('not remote'); - deferred.reject("Sorry, you've not configured an origin remote or passed a `repo_url` config value"); + deferred.reject(err); } function init(params, loadRC) { @@ -35,13 +35,14 @@ function init(params, loadRC) { module.log('info', ' - The APP name is', module.options.app_name); module.log('info', ' - The output file is', module.options.file); + module.log('info', ' - The template file is', module.options.template); module.options.grep_commits = module.options.sections.map(function(section) { return section.grep; }).join('|'); module.log('debug', 'Grep commits: ', module.options.grep_commits); - + return module.getRepoUrl(); }) .then(getRepoSuccess.bind(this, deferred)) diff --git a/tasks/lib/load-changelog-rc.js b/tasks/lib/load-changelog-rc.js index 77928fa..629d117 100644 --- a/tasks/lib/load-changelog-rc.js +++ b/tasks/lib/load-changelog-rc.js @@ -5,7 +5,7 @@ var q = require('q'), fs = require('fs'); function readChangelogRcFile(changelogrc, logger) { - debug('returning git repo url command'); + debug('finding changelogrc file'); if(!changelogrc){ return q.reject(); @@ -40,8 +40,8 @@ function loadChangelogRc() { deferred.resolve(contents); }catch(e){ - module.log('warn', 'Invalid changelogrc file', e); - return deferred.reject(e); + module.log('error', 'Invalid changelogrc file', e); + return deferred.reject('Invalid changelogrc file' + e); } }) @@ -50,7 +50,7 @@ function loadChangelogRc() { return section.title; }).join(', '); - module.log('warn', 'No .changelog.rc file found, using default settings'); + module.log('error', 'No .changelog.rc file found, using default settings'); module.log('info', 'Sections: ', sectionNames); deferred.resolve({}); }.bind(this)); diff --git a/tasks/lib/load-template.js b/tasks/lib/load-template.js new file mode 100644 index 0000000..2de5751 --- /dev/null +++ b/tasks/lib/load-template.js @@ -0,0 +1,87 @@ +'use strict'; + +var debug = require('debug')('changelog:loadTemplateFile'); +var q = require('q'); +var _ = require('lodash'); +var fs = require('fs'); + + +function loadDefaultTemplate(logger){ + return new Promise(function(resolve, reject){ + + debug('loading default template'); + + fs.readFile(__dirname +'/../../templates/template.md', 'utf8', function(err, data){ + if (err) { + logger('error', 'No default template found', err); + resolve(null); + }else{ + logger('info', 'Found default template'); + resolve(data); + } + }); + + }); +} + + +function readTemplateFile(template, logger) { + debug('finding template file'); + + if(!template){ + return Promise.resolve(null); + } + + var dfd = q.defer(); + + fs.readFile(template, 'utf8' ,function (err, data) { + if (err) { + logger('error', 'No custom template found', err); + loadDefaultTemplate(logger) + .then(dfd.resolve) + .catch(dfd.reject); + }else{ + logger('info', 'Found template'); + dfd.resolve(data); + } + }); + + return dfd.promise; +} + + +function loadTemplateFile(data) { + this.log('debug','loading template from', this.options.template); + + var module = this; + + var viewHelpers = { + getCommitLinks: function(commit){ + return module.linkToCommit(commit.hash); + }, + getCommitCloses: function(commit){ + return commit.closes.map(module.linkToIssue, module); + }, + printCommit: this.printCommit.bind(this) + }; + + _.extend(data, viewHelpers); + + return readTemplateFile(this.options.template, this.log.bind(this)) + .then(function(contents){ + if(contents){ + try{ + var fn = _.template(contents, data); + var tpl = fn(data); + return tpl; + }catch(e){ + module.log('error', 'Invalid template file', e); + throw 'Invalid template file \n' + e; + } + }else{ + return null; + } + }); +} + +module.exports = loadTemplateFile; diff --git a/tasks/lib/organize-commits.js b/tasks/lib/organize-commits.js index a0c23e9..198379d 100644 --- a/tasks/lib/organize-commits.js +++ b/tasks/lib/organize-commits.js @@ -2,6 +2,7 @@ var debug = require('debug')('changelog:organizeCommits'); var format = require('util').format; +var _ = require('lodash'); function grepSection(sections, commit){ //TODO: MONKEY METHOD, please use the regexp greps @@ -21,25 +22,78 @@ function organizeCommit(sections, commit) { var section = commit.type ? sections[commit.type] : grepSection(sections, commit) ; var component = commit.component ? commit.component.toLowerCase() : this.emptyComponent; + if (section) { - section[component] = section[component] || []; - section[component].push(commit); + section.commitsCount++; + + if(component === this.emptyComponent){ + section.commits.push(commit); + }else{ + section.components[component] = section.components[component] || []; + section.components[component].push(commit); + } } if (commit.breaking) { - sections.BREAKING[component] = sections.BREAKING[component] || []; - sections.BREAKING[component].push({ + //Add it to the breaking list)) + sections.BREAKING.commitsCount++; + var breakingCommit = { subject: format("due to %s,\n %s", this.linkToCommit(commit.hash), commit.breaking), hash: commit.hash, closes: [] - }); + }; + + if(component === this.emptyComponent){ + sections.BREAKING.commits.push(breakingCommit); + }else{ + sections.BREAKING.components[component] = sections.BREAKING.components[component] || []; + sections.BREAKING.components[component].push(breakingCommit); + } } } -function organizeCommits(commits, sections) { +function organizeCommits(commits, defaultSections) { + commits = commits ? commits : []; + + var sections = { + BREAKING : { + components: {}, + commitsCount: 0, + title: 'Breaking Changes', + commits: [], + type: 'BREAKING', + printCommitLinks: false + } + }; + + defaultSections.forEach(function(sectionInfo){ + var sectionType = sectionInfo.grep.replace('^', ''); + + sections[sectionType] = { + title: sectionInfo.title, + components: {}, + commits: [], + commitsCount: 0, + type: sectionType, + printCommitLinks: sectionInfo.printCommitLinks === false ? false : true + }; + }); + debug('organizaing commits'); + commits.forEach(organizeCommit.bind(this, sections), this); - return sections; + + return _.compact(Object.keys(sections).map(function(key){ + var section = sections[key]; + + section.components = Object.keys(section.components).sort().map(function(key){ + return { name: key, + commits: section.components[key] + }; + }); + + return section.commitsCount > 0 ? section : null; + })); } module.exports = organizeCommits; diff --git a/tasks/lib/print-commit.js b/tasks/lib/print-commit.js new file mode 100644 index 0000000..3b3d349 --- /dev/null +++ b/tasks/lib/print-commit.js @@ -0,0 +1,23 @@ + +var debug = require('debug')('changelog:printSection'); +var format = require('util').format; + +function printCommit(commit, printCommitLinks) { + var prefix = ''; + var result = ''; + + if (printCommitLinks) { + result += format('%s\n (%s', commit.subject, this.linkToCommit(commit.hash)); + + if (commit.closes.length) { + result += ',\n ' + commit.closes.map(this.linkToIssue, this).join(', '); + } + result += ')\n'; + } else { + result += format('%s\n', commit.subject); + } + + return result; +} + +module.exports = printCommit; \ No newline at end of file diff --git a/tasks/lib/print-header.js b/tasks/lib/print-header.js index 8c8845b..607cfd3 100644 --- a/tasks/lib/print-header.js +++ b/tasks/lib/print-header.js @@ -7,7 +7,7 @@ var format = require('util').format; var logoTemplate = '\n\n'; var titleTemplate = '__%s__\n\n'; var subtitleTemplate = '_%s_\n\n'; -var versionTemplate = '# %s %s (%s)\n\n'; +var versionTemplate = '# %s (%s)\n\n'; function printHeader(stream, options, date) { @@ -22,7 +22,7 @@ function printHeader(stream, options, date) { stream.write(format(subtitleTemplate, options.intro)); } - stream.write(format(versionTemplate, options.version || '', options.versionName || '', date)); + stream.write(format(versionTemplate, options.version_name || '', date)); stream.write('\n\n---\n'); } diff --git a/tasks/lib/print-section.js b/tasks/lib/print-section.js index bf64820..75a6563 100644 --- a/tasks/lib/print-section.js +++ b/tasks/lib/print-section.js @@ -3,7 +3,7 @@ var debug = require('debug')('changelog:printSection'); var format = require('util').format; -function printCommit(stream, printCommitLinks, prefix, commit) { +function printCommitStream(stream, printCommitLinks, prefix, commit) { if (printCommitLinks) { stream.write(format('%s %s\n (%s', prefix, commit.subject, this.linkToCommit(commit.hash))); @@ -16,36 +16,41 @@ function printCommit(stream, printCommitLinks, prefix, commit) { } } -function printComponent(stream, section, printCommitLinks, name) { +function printComponent(stream, printCommitLinks, component) { var prefix = '-'; - var nested = section[name].length > 1; - - if (name !== this.emptyComponent) { - if (nested) { - stream.write(format('- **%s:**\n', name)); - prefix = ' -'; - } else { - prefix = format('- **%s:**', name); - } + + var nested = component.commits.length > 1; + if (nested) { + stream.write(format('- **%s:**\n', component.name)); + prefix = ' -'; + } else { + prefix = format('- **%s:**', component.name); } - section[name].forEach(printCommit.bind(this, stream, printCommitLinks, prefix), this); + component.commits.forEach(printCommitStream.bind(this, stream, printCommitLinks, prefix), this); } -function printSection(stream, title, section, printCommitLinks) { +function printSection(stream, section) { + try{ + debug('printing section ...'); - printCommitLinks = printCommitLinks === undefined ? true : printCommitLinks; - var components = Object.keys(section).sort(); - if (!components.length) { + if (!section.commits.length && !section.components.length) { return; } - stream.write(format('\n## %s\n\n', title)); - components.forEach(printComponent.bind(this, stream, section, printCommitLinks), this); + stream.write(format('\n## %s\n\n', section.title)); + + section.commits.forEach(printCommitStream.bind(this, stream, section.printCommitLinks, '-'), this); + + section.components.forEach(printComponent.bind(this, stream, section.printCommitLinks), this); stream.write('\n'); + + }catch(e){ + console.log(e); + } } module.exports = printSection; diff --git a/tasks/lib/write-change-log.js b/tasks/lib/write-change-log.js index c3b3f9e..7ebf297 100644 --- a/tasks/lib/write-change-log.js +++ b/tasks/lib/write-change-log.js @@ -2,45 +2,80 @@ var debug = require('debug')('changelog:writeChangelog'); var format = require('util').format; -var q = require('q'); +var _ = require('lodash'); +var fse = require('fs-extra'); -function sendToStream(stream, sections, deferred) { +function sendToStream(stream, sections) { var module = this; this.printHeader(stream, this.options, this.currentDate()); - - this.options.sections.forEach(function(section){ - var sectionType = section.grep.replace('^', ''); - if(sectionType !== 'BREAKING'){ - module.printSection(stream, section.title, sections[sectionType]); - }else if (sections.BREAKING[module.emptyComponent].length > 0 ) { - module.printSection(stream, 'Breaking Changes', sections.BREAKING, false); - } + + sections.forEach(function(section){ + module.printSection(stream, section); }); this.printSalute(stream); stream.end(); - stream.on('finish', deferred.resolve); } -function writeChangelog(stream, commits) { +function writeChangelog(commits) { + var module = this; + debug('writing change log'); - var deferred = q.defer(); - var sections = { - BREAKING : {} + var sections = this.organizeCommits(commits, this.options.sections); + var stream; + + var data = { + logo: module.options.logo, + sections: sections, + intro: module.options.intro, + title: module.options.app_name, + version:{ + number: module.options.tag, + name: module.options.version_name, + date: new Date()//Todo get the date of the tag + } }; - this.options.sections.forEach(function(sectionInfo){ - var sectionType = sectionInfo.grep.replace('^', ''); - sections[sectionType] = {}; - }); + return new Promise(function(resolve, reject){ + + module.loadTemplate(data) + .then(function(template){ + + if (module.options.file) { + stream = fse.createOutputStream(module.options.file); + } else { + stream = process.stdout; + } + + if(template){ + debug('Proceding with template'); - sections.BREAKING[this.emptyComponent] = []; - this.organizeCommits(commits, sections); - stream.on('open', sendToStream.bind(this, stream, sections, deferred)); + stream.on('open', function(){ + var lines = template.split('\n'); - return deferred.promise; + lines.forEach(function(line){ + stream.write(line); + stream.write('\n'); + }); + + stream.end(); + stream.on('finish', resolve); + }); + }else{ + debug('Proceding with legacy output'); + + stream.on('open', sendToStream.bind(module, stream, sections)); + stream.on('finish', resolve); + } + + }) + .catch(reject); + }); } + + + module.exports = writeChangelog; diff --git a/templates/template.md b/templates/template.md new file mode 100644 index 0000000..576cf38 --- /dev/null +++ b/templates/template.md @@ -0,0 +1,15 @@ +<% if(logo) { %><%= '\n\n' %><% } %># <%= title %> +<% if(intro) { %><%= '\n' %>_<%= intro %>_<%= '\n' %><% } %> +<% if(version && (version.name || version.number)) { %>##<% if(version.name){%><%= version.name %><% } %> <%= version.number %> <% if(version.date){ %>( <%= version.date %> )<% } %><%= '\n' %><% } %> +<% _.forEach(sections, function(section){ + if(section.commitsCount > 0) { %> +## <%= section.title %> +<% _.forEach(section.commits, function(commit){ %> - <%= printCommit(commit, true) %><% }) %> +<% _.forEach(section.components, function(component){ %> - **<%= component.name %>** +<% _.forEach(component.commits, function(commit){ %> - <%= printCommit(commit, true) %><% }) %> +<% }) %> +<% } %> +<% }) %> + +--- +*Generated with [git-changelog](https://github.com/rafinskipg/git-changelog). If you have any problems or suggestions, create an issue.* :) **Thanks** \ No newline at end of file diff --git a/templates/template_two.md b/templates/template_two.md new file mode 100644 index 0000000..cca9294 --- /dev/null +++ b/templates/template_two.md @@ -0,0 +1,15 @@ +<% if(logo) { %><%= '\n\n' %><% } %># <%= title %> +<% if(intro) { %><%= '\n' %>_<%= intro %>_<%= '\n' %><% } %> +<% if(version) { %>## <%= version.name %> <%= version.number %> ( <%= version.date %> )<%= '\n' %><% } %> +<% _.forEach(sections, function(section){ + if(section.commitsCount > 0) { %> +## <%= section.title %> +<% _.forEach(section.commits, function(commit){ %> - <%= commit.subject %> (<%= commit.hash %><% if(commit.closes.length){ %>, Closes: <%= getCommitCloses(commit).join(',') %><% } %> +<% }) %><% _.forEach(section.components, function(component){ %> - **<%= component.name %>** +<% _.forEach(component.commits, function(commit){ %> - <%= commit.subject %> (<%= commit.hash %><% if(commit.closes.length){ %>, Closes: <%= getCommitCloses(commit).join(',') %><% } %>)<% }) %> +<% }) %> +<% } %> +<% }) %> + +--- +*Generated with [git-changelog](https://github.com/rafinskipg/git-changelog). If you have any problems or suggestions, create an issue.* :) **Thanks** \ No newline at end of file diff --git a/test/changelogrc.spec.js b/test/changelogrc.spec.js index 365500e..575a021 100644 --- a/test/changelogrc.spec.js +++ b/test/changelogrc.spec.js @@ -82,9 +82,10 @@ describe('changelogrc.spec.js', function() { 'BREAKING CHANGE: first breaking change\nsomething else\n' + 'another line with more info\n'); - var sections = { - fix: {} - }; + var sections = [{ + title: 'Bug Fixes', + grep: '^fix' + }]; var commits = []; @@ -96,8 +97,8 @@ describe('changelogrc.spec.js', function() { } sections = changelog.organizeCommits(commits, sections); - - expect(sections.fix.mymodule.length).to.equal(10); + expect(sections[0].components[0].name).to.equal('mymodule'); + expect(sections[0].components[0].commits.length).to.equal(10); }); }); diff --git a/test/fixtures/commits.js b/test/fixtures/commits.js index 0ab49b9..560ff99 100644 --- a/test/fixtures/commits.js +++ b/test/fixtures/commits.js @@ -84,7 +84,7 @@ exports.withBreaking = [ component: '$scope' }, { closes: [], - breaks: [], + breaks: [3, 4], hash: '1d4f604363094d4eee3b4d7b1ca01133edaad344', subject: 'did 4 thing', body: '', @@ -93,7 +93,7 @@ exports.withBreaking = [ }, { closes: [], - breaks: [], + breaks: [2,3], hash: '1d4f604363094d4eee3b4d7b1ca01133edaad344', subject: 'did 5 thing', body: '', diff --git a/test/git_changelog_generate.spec.js b/test/git_changelog_generate.spec.js index 382ef03..5b44d4d 100644 --- a/test/git_changelog_generate.spec.js +++ b/test/git_changelog_generate.spec.js @@ -126,10 +126,10 @@ describe('git_changelog_generate.js', function() { expect(changelog.options.msg).to.contain('debug: test'); }); - it('should store "version" if passed as an option', function() { - changelog.initOptions({ version: 'test' }); - expect(changelog.options.version).to.equal('test'); - expect(changelog.options.msg).to.contain('version: test'); + it('should store "version_name" if passed as an option', function() { + changelog.initOptions({ version_name: 'test' }); + expect(changelog.options.version_name).to.equal('test'); + expect(changelog.options.msg).to.contain('version_name: test'); }); it('should store any other option, but not save in msg', function() { @@ -270,6 +270,16 @@ describe('git_changelog_generate.js', function() { expect(msg.breaking).to.equal(' first breaking change\nsomething else\nanother line with more info\n'); }); + it('should add everything as a message if there are 2 sections', function(){ + var msg = changelog.parseRawCommit( + '13f31602f396bc269076ab4d389cfd8ca94b20ba\n'+ + 'feat(ad): make new ad\n' + + 'some note here\n' + + 'reg(ad): need a walk through\n'); + + expect(msg.body).to.equals('some note here\nreg(ad): need a walk through\n'); + }); + it('should organize commits', function() { var msg = changelog.parseRawCommit( '13f31602f396bc269076ab4d389cfd8ca94b20ba\n' + @@ -278,9 +288,10 @@ describe('git_changelog_generate.js', function() { 'BREAKING CHANGE: first breaking change\nsomething else\n' + 'another line with more info\n'); - var sections = { - fix: {} - }; + var sections = [{ + title: 'Bug Fixes', + grep: '^fix' + }]; var commits = []; @@ -292,8 +303,8 @@ describe('git_changelog_generate.js', function() { } sections = changelog.organizeCommits(commits, sections); - - expect(sections.fix.mymodule.length).to.equal(10); + expect(sections[0].components[0].name).to.equal('mymodule'); + expect(sections[0].components[0].commits.length).to.equal(10); }); }); @@ -446,64 +457,44 @@ describe('git_changelog_generate.js', function() { { title: 'Breaking changes', grep: 'BREAKING' - } + } ]; before(function(done) { - this.stream = { - write: sinon.stub(), - end : function(){ - - }, - on: sinon.spy(function(event, callback) { - callback(); - }) - }; + this.timeout = 10000; + this.commits = require('./fixtures/commits.js').withoutBreaking; - sinon.stub(changelog, 'organizeCommits'); sinon.stub(changelog, 'printSalute'); sinon.stub(changelog, 'printSection'); sinon.stub(changelog, 'printHeader'); - changelog.initOptions({ app_name: 'app', version: 'version', sections: sections }); - changelog.writeChangelog(this.stream, this.commits).then(function() { + changelog.initOptions({ app_name: 'app', version_name: 'version_name', sections: sections, template: false }); + changelog.writeChangelog(this.commits) + .then(function() { done(); + }) + .catch(function(err){ + console.log('error', err); }); }); after(function() { - changelog.organizeCommits.restore(); changelog.printSection.restore(); changelog.printHeader.restore(); changelog.printSalute.restore(); }); - it('should organize commits', function() { - expect(changelog.organizeCommits).to.have.been.calledOnce; - expect(changelog.organizeCommits).to.have.been.calledWith(this.commits); - }); - it('should write the header to the stream', function() { expect(changelog.printHeader).to.have.been.calledOnce; - expect(changelog.printSalute).to.have.been.calledWith(this.stream); }); - it('should print 7 sections', function() { - expect(changelog.printSection.callCount).to.equal(7); - sections.forEach(function(section, index) { - var call = changelog.printSection.getCall(index); - if(!call){ - expect(section.title).to.equals('Breaking changes'); - }else{ - expect(call.args).to.include(section.title); - } - }); + it('should print 3 sections', function() { + expect(changelog.printSection.callCount).to.equal(3); }); it('should print salute', function() { expect(changelog.printSalute).to.have.been.calledOnce; - expect(changelog.printSalute).to.have.been.calledWith(this.stream); }); }); @@ -545,26 +536,43 @@ describe('git_changelog_generate.js', function() { ]; before(function(done) { - this.stream = { - write: sinon.stub(), - end : function(){ - - }, - on: sinon.spy(function(event, callback) { - callback(); - }) - }; + this.commits = require('./fixtures/commits.js').withBreaking; sinon.stub(changelog, 'organizeCommits', function(commits, sections) { - sections.BREAKING[changelog.emptyComponent] = [ 'breaking commit']; + return [{ + type: 'BREAKING', + commits: [{ + closes: [], + breaks: [], + hash: '1d4f604363094d4eee3b4d7b1ca01133edaad344', + subject: 'did 2 thing', + body: '', + type: 'feat', + component: '', + breaking: true + }], + components:[{ + name: '$scope', + commits: [{ + closes: [], + breaks: [], + hash: '1d4f604363012394d4eee3b4d7b1ca01133edaad344', + subject: 'did 4 thing', + body: '', + type: 'feat', + component: '$scope', + breaking: true + }] + }] + }]; }); sinon.stub(changelog, 'printSalute'); sinon.stub(changelog, 'printSection'); sinon.stub(changelog, 'printHeader'); - changelog.initOptions({ app_name: 'app', version: 'version', sections: sections }); - changelog.writeChangelog(this.stream, this.commits).then(function() { + changelog.initOptions({ app_name: 'app', version_name: 'version_name', sections: sections, template:false }); + changelog.writeChangelog(this.commits).then(function() { done(); }); }); @@ -583,20 +591,14 @@ describe('git_changelog_generate.js', function() { it('should write the header to the stream', function() { expect(changelog.printHeader).to.have.been.calledOnce; - expect(changelog.printHeader).to.have.been.calledWith(this.stream, changelog.options); }); - it('should print 8 sections', function() { - expect(changelog.printSection.callCount).to.equal(8); - sections.forEach(function(section, index) { - var call = changelog.printSection.getCall(index); - expect(call.args).to.include(section.title); - }); + it('should print 1 sections', function() { + expect(changelog.printSection.callCount).to.equal(1); }); it('should print salute', function() { expect(changelog.printSalute).to.have.been.calledOnce; - expect(changelog.printSalute).to.have.been.calledWith(this.stream); }); }); @@ -604,59 +606,89 @@ describe('git_changelog_generate.js', function() { }); describe('.organizeCommits()', function() { + function findItem(key, value){ + return function (item){ + return item[key] === value; + }; + } describe('without breaking commits', function () { before(function() { changelog.setDefaults(); - this.sections = { - fix: {}, - feat: {}, - BREAKING: {}, - style: {}, - refactor: {}, - test: {}, - chore: {}, - docs: {} - }; + this.sections = [ + { + title: 'Bug Fixes', + grep: '^fix' + }, + { + title: 'Features', + grep: '^feat' + }, + { + title: 'Documentation', + grep: '^docs' + }, + { + title: 'Breaking changes', + grep: 'BREAKING' + }, + { + title: 'Refactor', + grep: '^refactor' + }, + { + title: 'Style', + grep: '^style' + }, + { + title: 'Test', + grep: '^test' + }, + { + title: 'Chore', + grep: '^chore' + } + ]; + this.commits = require('./fixtures/commits.js').withoutBreaking; this.sections = changelog.organizeCommits(this.commits, this.sections); }); - it('should return 8 sections', function() { - expect(Object.keys(this.sections).length).to.equal(8); + it('should return 3 sections', function() { + expect(this.sections.length).to.equal(3); }); it('should fix section to have 1 commit', function() { - expect(this.sections.fix.$scope.length).to.equal(1); + expect(this.sections.find(findItem('type', 'fix')).components.find(findItem('name', '$scope')).commits.length).to.equal(1); }); it('should feat section to have 1 commit', function() { - expect(this.sections.feat.$scope.length).to.equal(1); + expect(this.sections.find(findItem('type', 'feat')).components.find(findItem('name', '$scope')).commits.length).to.equal(1); }); it('should breaks section to be empty', function() { - expect(this.sections.BREAKING).to.deep.equal({}); + expect(this.sections.find(findItem('type', 'BREAKING'))).to.equal(undefined); }); it('should style section to be empty', function() { - expect(this.sections.style).to.deep.equal({}); + expect(this.sections.find(findItem('type', 'style'))).to.equal(undefined); }); it('should refactor section be empty', function() { - expect(this.sections.refactor).to.deep.equal({}); + expect(this.sections.find(findItem('type', 'refactor'))).to.equal(undefined); }); it('should test section to be empty', function() { - expect(this.sections.test).to.deep.equal({}); + expect(this.sections.find(findItem('type', 'test'))).to.equal(undefined); }); it('should chore section to have 1 commit', function() { - expect(this.sections.chore.$scope.length).to.equal(3); + expect(this.sections.find(findItem('type', 'chore')).components.find(findItem('name', '$scope')).commits.length).to.equal(3); }); it('should docs section to be empty', function() { - expect(this.sections.docs).to.deep.equal({}); + expect(this.sections.find(findItem('type', 'docs'))).to.equal(undefined); }); }); @@ -665,16 +697,40 @@ describe('git_changelog_generate.js', function() { before(function() { changelog.setDefaults(); - this.sections = { - fix: {}, - feat: {}, - BREAKING: {}, - style: {}, - refactor: {}, - test: {}, - chore: {}, - docs: {} - }; + this.sections = [ + { + title: 'Bug Fixes', + grep: '^fix' + }, + { + title: 'Features', + grep: '^feat' + }, + { + title: 'Documentation', + grep: '^docs' + }, + { + title: 'Breaking changes', + grep: 'BREAKING' + }, + { + title: 'Refactor', + grep: '^refactor' + }, + { + title: 'Style', + grep: '^style' + }, + { + title: 'Test', + grep: '^test' + }, + { + title: 'Chore', + grep: '^chore' + } + ]; var repo_url = 'https://github.com/owner/repo'; changelog.options.repo_url = repo_url; changelog.getProviderLinks(); @@ -683,40 +739,25 @@ describe('git_changelog_generate.js', function() { this.sections = changelog.organizeCommits(this.commits, this.sections); }); - it('should return 8 sections', function() { - expect(Object.keys(this.sections).length).to.equal(8); + it('should return 4 sections', function() { + expect(this.sections.length).to.equal(4); }); it('should fix section to have 1 commit', function() { - expect(this.sections.fix.$scope.length).to.equal(1); + expect(this.sections.find(findItem('type', 'fix')).components.find(findItem('name', '$scope')).commits.length).to.equal(1); }); it('should feat section to have 1 commit', function() { - expect(this.sections.feat.$scope.length).to.equal(1); - }); - - it('should breaks section to be empty', function() { - expect(this.sections.BREAKING.$scope.length).to.equal(1); + expect(this.sections.find(findItem('type', 'feat')).components.find(findItem('name', '$scope')).commits.length).to.equal(1); }); - it('should style section to be empty', function() { - expect(this.sections.style).to.deep.equal({}); - }); - - it('should refactor section be empty', function() { - expect(this.sections.refactor).to.deep.equal({}); - }); - - it('should test section to be empty', function() { - expect(this.sections.test).to.deep.equal({}); + it('should breaks have 1 component and 2 comits', function() { + expect(this.sections.find(findItem('type', 'BREAKING')).components.length).to.equals(1); + expect(this.sections.find(findItem('type', 'BREAKING')).components.find(findItem('name', '$scope')).commits.length).to.equal(1); }); - it('should chore section to have 1 commit', function() { - expect(this.sections.chore.$scope.length).to.equal(3); - }); - - it('should docs section to be empty', function() { - expect(this.sections.docs).to.deep.equal({}); + it('should chore section to have 3 commit', function() { + expect(this.sections.find(findItem('type', 'chore')).components.find(findItem('name', '$scope')).commits.length).to.equal(3); }); }); @@ -878,7 +919,7 @@ describe('git_changelog_generate.js', function() { }) .catch(function(err){ console.log('error', err); - done(); + done(err); }); }); @@ -896,7 +937,7 @@ describe('git_changelog_generate.js', function() { }) .catch(function(err){ console.log('error', err); - done(); + done(err); }); }); @@ -914,7 +955,7 @@ describe('git_changelog_generate.js', function() { }) .catch(function(err){ console.log('error', err); - done(); + done(err); }); }); diff --git a/test/mocha.opts b/test/mocha.opts index 727f2d7..3fbc269 100644 --- a/test/mocha.opts +++ b/test/mocha.opts @@ -1,3 +1,2 @@ ---recursive --reporter spec --ui bdd