diff --git a/lib/hook.template.js b/lib/hook.template.js index bf16381..112dc7c 100644 --- a/lib/hook.template.js +++ b/lib/hook.template.js @@ -2,9 +2,9 @@ const fs = require('fs') const resolve = require('path').resolve const join = require('path').join -exports.generatedMessage = 'Generated by ghooks. Do not edit this file.' +const generatedMessage = require('./message.template.js').generatedMessage exports.content = fs .readFileSync(resolve(`${__dirname}/hook.template.raw`), 'UTF-8') - .replace('{{generated_message}}', exports.generatedMessage) + .replace('{{generated_message}}', generatedMessage) .replace('{{node_modules_path}}', join(process.cwd(), '..').replace(/\\/g, '\\\\')) diff --git a/lib/install.js b/lib/install.js index e28841d..37c3da4 100644 --- a/lib/install.js +++ b/lib/install.js @@ -1,7 +1,11 @@ const fs = require('fs') const resolve = require('path').resolve const findup = require('findup') -const template = require('./hook.template') +const generatedMessage = require('./message.template.js').generatedMessage +const packageTemplate = require('./package.template') +const hookTemplate = require('./hook.template') + +const JSON_INDENTATION = 2 const hooks = [ 'applypatch-msg', @@ -27,12 +31,17 @@ function installHooks() { const gitRoot = findGitRoot() if (gitRoot) { const hooksDir = resolve(gitRoot, 'hooks') - hooks.forEach(install.bind(null, hooksDir)) + installHooksIntoDir(hooksDir) } else { warnAboutGit() } } +function installHooksIntoDir(dir) { + installPackageJSON(dir) + hooks.forEach(install.bind(null, dir)) +} + function findGitRoot() { try { return getGitRoot() @@ -74,6 +83,13 @@ function warnAboutGit() { ) } +function installPackageJSON(dir) { + ensureDirExists(dir) + const file = resolve(dir, 'package.json') + needsBackup(file) && backup(file) + fs.writeFileSync(file, JSON.stringify(packageTemplate.content, null, JSON_INDENTATION)) +} + function install(dir, hook) { ensureDirExists(dir) const file = resolve(dir, hook) @@ -90,7 +106,7 @@ function needsBackup(file) { } function generatedByGHooks(file) { - return !!fs.readFileSync(file, 'UTF-8').match(template.generatedMessage) + return !!fs.readFileSync(file, 'UTF-8').match(generatedMessage) } function backup(file) { @@ -98,7 +114,7 @@ function backup(file) { } function createExecutableHook(file) { - fs.writeFileSync(file, template.content) + fs.writeFileSync(file, hookTemplate.content) fs.chmodSync(file, '755') } diff --git a/lib/message.template.js b/lib/message.template.js new file mode 100644 index 0000000..4a1f32f --- /dev/null +++ b/lib/message.template.js @@ -0,0 +1 @@ +exports.generatedMessage = 'Generated by ghooks. Do not edit this file.' diff --git a/lib/package.template.js b/lib/package.template.js new file mode 100644 index 0000000..8ff3ccf --- /dev/null +++ b/lib/package.template.js @@ -0,0 +1,8 @@ +const generatedMessage = require('./message.template.js').generatedMessage + +exports.content = { + type: 'commonjs', + '//': [ + generatedMessage + ] +} diff --git a/test/hook.template.test.js b/test/hook.template.test.js index 986c305..fa92c54 100644 --- a/test/hook.template.test.js +++ b/test/hook.template.test.js @@ -1,10 +1,11 @@ require('./setup')() describe('hook.template', () => { + const generatedMessage = require('../lib/message.template').generatedMessage const template = require('../lib/hook.template') it('replaces the {{generated_message}} token', () => { - expect(template.content).to.match(new RegExp(template.generatedMessage)) + expect(template.content).to.match(new RegExp(generatedMessage)) }) }) diff --git a/test/install.test.js b/test/install.test.js index 65d7616..be9110b 100644 --- a/test/install.test.js +++ b/test/install.test.js @@ -17,6 +17,16 @@ describe('install', function describeInstall() { expect(fs.existsSync('.git/hooks')).to.be.true }) + it('creates a package.json', () => { + fsStub({'.git/hooks': {}}) + install() + + const hooks = fs.readdirSync('.git/hooks') + const packageContent = require('../lib/package.template').content + expect(hooks).to.include('package.json') + expect(JSON.parse(fs.readFileSync('.git/hooks/package.json', 'UTF-8'))).to.deep.equal(packageContent) + }) + it('creates hook files', () => { fsStub({'.git/hooks': {}}) install() @@ -49,6 +59,38 @@ describe('install', function describeInstall() { expectHook('post-rewrite', '.git/hooks/post-rewrite', '755') }) + describe('backs up an existing package.json', () => { + + const existingGHookPackage = '// Generated by ghooks. Do not edit this file.' + const existingUserPackage = '# existing content' + + it('does not keep a copy of an existing GHook package.json', () => { + fsStub({'.git/hooks': { + 'package.json': existingGHookPackage, + }}) + + install() + const files = fs.readdirSync('.git/hooks') + + expect(files).to.not.include('package.json.bkp') + expect(files).to.include('package.json') + }) + + it('backs up an existing user package.json', () => { + fsStub({'.git/hooks': { + 'package.json': existingUserPackage, + }}) + + install() + const files = fs.readdirSync('.git/hooks') + + expect(files).to.include('package.json.bkp') + expect(files).to.include('package.json') + expect(fs.readFileSync('.git/hooks/package.json.bkp', 'UTF-8')).to.equal(existingUserPackage) + }) + + }) + describe('backing up existing hooks', () => { const existingGHook = '// Generated by ghooks. Do not edit this file.' diff --git a/test/package.template.test.js b/test/package.template.test.js new file mode 100644 index 0000000..392d8c9 --- /dev/null +++ b/test/package.template.test.js @@ -0,0 +1,11 @@ +require('./setup')() + +describe('package.template', () => { + const generatedMessage = require('../lib/message.template').generatedMessage + const template = require('../lib/package.template') + + it('replaces the {{generated_message}} token', () => { + expect(template.content).to.match(new RegExp(generatedMessage)) + }) + +})