From 6af2a120b40825c0d01c4868ed004d5b478cecf5 Mon Sep 17 00:00:00 2001 From: Alexander Lisianoi Date: Thu, 7 Jul 2016 14:19:52 +0300 Subject: [PATCH] chore(commit message): use commitplease to validate commit messages Remove validate-commit-msg.js and its tests --- changelog.js | 1 - init-repo.sh | 3 - package.json | 4 ++ validate-commit-msg.js | 111 ------------------------------------ validate-commit-msg.spec.js | 82 -------------------------- 5 files changed, 4 insertions(+), 197 deletions(-) delete mode 100755 validate-commit-msg.js delete mode 100644 validate-commit-msg.spec.js diff --git a/changelog.js b/changelog.js index ccaae08d9df3..fb93e08979ac 100755 --- a/changelog.js +++ b/changelog.js @@ -1,6 +1,5 @@ #!/usr/bin/env node -// TODO(vojta): pre-commit hook for validating messages // TODO(vojta): report errors, currently Q silence everything which really sucks 'use strict'; diff --git a/init-repo.sh b/init-repo.sh index ab7a9d53944e..d19e1f6f0a96 100755 --- a/init-repo.sh +++ b/init-repo.sh @@ -27,6 +27,3 @@ if [ $? -ne 0 ]; then echo "Installing Karma..." npm install -g karma fi - -echo "Installing git hooks..." -ln -sf ../../validate-commit-msg.js .git/hooks/commit-msg diff --git a/package.json b/package.json index 9889ac229eb1..ea471c3172fa 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "canonical-path": "0.0.2", "cheerio": "^0.17.0", "commitizen": "^2.3.0", + "commitplease": "^2.6.0", "cz-conventional-changelog": "1.1.4", "dgeni": "^0.4.0", "dgeni-packages": "^0.14.0", @@ -87,5 +88,8 @@ "commitizen": { "path": "node_modules/cz-conventional-changelog" } + }, + "commitplease": { + "style": "angular" } } diff --git a/validate-commit-msg.js b/validate-commit-msg.js deleted file mode 100755 index d65345b35642..000000000000 --- a/validate-commit-msg.js +++ /dev/null @@ -1,111 +0,0 @@ -#!/usr/bin/env node - -/** - * Git COMMIT-MSG hook for validating commit message - * See https://docs.google.com/document/d/1rk04jEuGfk9kYzfqCuOlPTSJw3hEDZJTBN5E5f1SALo/edit - * - * Installation: - * >> cd - * >> ln -s ../../validate-commit-msg.js .git/hooks/commit-msg - */ - -'use strict'; - -var fs = require('fs'); -var util = require('util'); - - -var MAX_LENGTH = 100; -var PATTERN = /^(?:fixup!\s*)?(\w*)(\(([\w\$\.\*/-]*)\))?: (.*)$/; -var IGNORED = /^WIP:/; -var TYPES = { - feat: true, - fix: true, - docs: true, - style: true, - refactor: true, - perf: true, - test: true, - chore: true, - revert: true -}; - - -var error = function() { - // gitx does not display it - // http://gitx.lighthouseapp.com/projects/17830/tickets/294-feature-display-hook-error-message-when-hook-fails - // https://groups.google.com/group/gitx/browse_thread/thread/a03bcab60844b812 - console.error('INVALID COMMIT MSG: ' + util.format.apply(null, arguments)); -}; - - -var validateMessage = function(message) { - var isValid = true; - - if (IGNORED.test(message)) { - console.log('Commit message validation ignored.'); - return true; - } - - if (message.length > MAX_LENGTH) { - error('is longer than %d characters !', MAX_LENGTH); - isValid = false; - } - - var match = PATTERN.exec(message); - - if (!match) { - error('does not match "(): " ! was: ' + message); - return false; - } - - var type = match[1]; - - if (!TYPES.hasOwnProperty(type)) { - error('"%s" is not allowed type !', type); - return false; - } - - // Some more ideas, do want anything like this ? - // - allow only specific scopes (eg. fix(docs) should not be allowed ? - // - auto correct the type to lower case ? - // - auto correct first letter of the subject to lower case ? - // - auto add empty line after subject ? - // - auto remove empty () ? - // - auto correct typos in type ? - // - store incorrect messages, so that we can learn - - return isValid; -}; - - -var firstLineFromBuffer = function(buffer) { - return buffer.toString().split('\n').shift(); -}; - - - -// publish for testing -exports.validateMessage = validateMessage; - -// hacky start if not run by jasmine :-D -if (process.argv.join('').indexOf('jasmine-node') === -1) { - var commitMsgFile = process.argv[2]; - var incorrectLogFile = commitMsgFile.replace('COMMIT_EDITMSG', 'logs/incorrect-commit-msgs'); - - fs.readFile(commitMsgFile, function(err, buffer) { - if (err) { - console.error(err); - process.exit(1); - } - var msg = firstLineFromBuffer(buffer); - - if (!validateMessage(msg)) { - fs.appendFile(incorrectLogFile, msg + '\n', function() { - process.exit(1); - }); - } else { - process.exit(0); - } - }); -} diff --git a/validate-commit-msg.spec.js b/validate-commit-msg.spec.js deleted file mode 100644 index 5a8ab1dc409e..000000000000 --- a/validate-commit-msg.spec.js +++ /dev/null @@ -1,82 +0,0 @@ -/* global describe: false, beforeEach: false, it: false, expect: false, spyOn: false */ -'use strict'; - -describe('validate-commit-msg.js', function() { - var m = require('./validate-commit-msg'); - var errors = []; - var logs = []; - - var VALID = true; - var INVALID = false; - - beforeEach(function() { - errors.length = 0; - logs.length = 0; - - spyOn(console, 'error').andCallFake(function(msg) { - // eslint-disable-next-line no-control-regex - errors.push(msg.replace(/\x1B\[\d+m/g, '')); // uncolor - }); - - spyOn(console, 'log').andCallFake(function(msg) { - // eslint-disable-next-line no-control-regex - logs.push(msg.replace(/\x1B\[\d+m/g, '')); // uncolor - }); - }); - - describe('validateMessage', function() { - - it('should be valid', function() { - expect(m.validateMessage('fixup! fix($compile): something')).toBe(VALID); - expect(m.validateMessage('fix($compile): something')).toBe(VALID); - expect(m.validateMessage('feat($location): something')).toBe(VALID); - expect(m.validateMessage('docs($filter): something')).toBe(VALID); - expect(m.validateMessage('style($http): something')).toBe(VALID); - expect(m.validateMessage('refactor($httpBackend): something')).toBe(VALID); - expect(m.validateMessage('test($resource): something')).toBe(VALID); - expect(m.validateMessage('chore($controller): something')).toBe(VALID); - expect(m.validateMessage('chore(foo-bar): something')).toBe(VALID); - expect(m.validateMessage('chore(*): something')).toBe(VALID); - expect(m.validateMessage('chore(guide/location): something')).toBe(VALID); - expect(m.validateMessage('revert(foo): something')).toBe(VALID); - expect(errors).toEqual([]); - }); - - - it('should validate 100 characters length', function() { - var msg = 'fix($compile): something super mega extra giga tera long, maybe even longer and longer and longer... '; - - expect(m.validateMessage(msg)).toBe(INVALID); - expect(errors).toEqual(['INVALID COMMIT MSG: is longer than 100 characters !']); - }); - - - it('should validate "(): " format', function() { - var msg = 'not correct format'; - - expect(m.validateMessage(msg)).toBe(INVALID); - expect(errors).toEqual(['INVALID COMMIT MSG: does not match "(): " ! was: not correct format']); - }); - - - it('should validate type', function() { - expect(m.validateMessage('weird($filter): something')).toBe(INVALID); - expect(errors).toEqual(['INVALID COMMIT MSG: "weird" is not allowed type !']); - }); - - - it('should allow empty scope', function() { - expect(m.validateMessage('fix: blablabla')).toBe(VALID); - }); - - - it('should allow dot in scope', function() { - expect(m.validateMessage('chore(mocks.$httpBackend): something')).toBe(VALID); - }); - - - it('should ignore msg prefixed with "WIP: "', function() { - expect(m.validateMessage('WIP: bullshit')).toBe(VALID); - }); - }); -});