As in many teams, me and my coworkers are putting ticket number into beginning of each commit message. If your branches are starting with ticket number it is easy to create prepare-commit-msg
hook to automate this action, and since I'm a front-end deveoper, I decided to write it as a nodejs script. Look at what I came up with and tell me how to make it better if you will.
#.git/hooks/prepare-commit-msg
#!/usr/bin/env node
const fs = require('fs')
const { exec } = require('child_process')
const COMMIT_EDITMSG = process.argv[2]
exec('git symbolic-ref --short HEAD', (err, stdout) => {
if (err) throw err
fs.readFile(
COMMIT_EDITMSG,
'utf8',
(err, message) => {
if (err) throw err
fs.writeFile(
COMMIT_EDITMSG,
`${stdout.replace(/(-|_).*/, '')} ${message}`.replace(/\n/, ''),
err => {
if (err) throw err
}
)
}
)
})
1 Answer 1
Outwith the improved error handling as per the comments, another improvement on this be to write the hook using a more synchronous approach e.g.
#.git/hooks/prepare-commit-msg
#!/usr/bin/env node
const { readFileSync, writeFileSync } = require('fs')
const { execSync } = require('child_process')
const COMMIT_EDITMSG = process.argv[2];
const stdout = execSync('git symbolic-ref --short HEAD');
const message = readFileSync(COMMIT_EDITMSG, 'utf-8');
writeFileSync(COMMIT_EDITMSG, `${stdout.replace(/(-|_).*/, '')} ${message}`.replace(/\n/, ''));
This completely eliminates the need for callbacks and, naturally, if an error occurs the commit should be blocked - it's also a lot more succinct and easier to read.
-
\$\begingroup\$ Thank you, to my shame I wasn't been aware of syncronous versions of this functions \$\endgroup\$askhat– askhat2018年06月28日 11:13:54 +00:00Commented Jun 28, 2018 at 11:13
-
\$\begingroup\$ @askhat whoops, that's a mistake, it should be using that! Updated. \$\endgroup\$James– James2018年06月28日 11:24:11 +00:00Commented Jun 28, 2018 at 11:24
return console.error(...)
in all those error scenarios :) \$\endgroup\$console.error
? \$\endgroup\$