tre-compile
Version:
compile js to a static web-executable (single html file)
62 lines (53 loc) • 1.67 kB
JavaScript
const {spawn} = require('child_process')
const BufferList = require('bl');
const multicb = require('multicb')
module.exports = {workingDirIsClean, gitInfo, exec}
function exec(cmdline, opts, cb) {
let [cmd, ...args] = cmdline.split(' ')
if (cmd == 'git' && process.env.GIT_EXECUTABLE_PATH) {
cmd = process.env.GIT_EXECUTABLE_PATH
}
const done = multicb({pluck: 1, spread: true})
const git = spawn(cmd, args, opts)
git.stdout.pipe(BufferList(done()))
git.stderr.pipe(process.stderr)
const cb2 = done()
git.on('close', code=>{
if (code !== 0) return cb2(new Error(`${cmd} excitied with code ${code}`), code)
cb2(null)
})
done ((err, output, code)=>{
if (err) return cb(err)
cb(null, output.toString('utf-8'))
})
}
async function workingDirIsClean(cwd) {
return new Promise( (resolve, reject)=>{
exec('git status --porcelain', {cwd}, (err, status) => {
if (err) {
err = new Error('git status failed: ' + err.message)
return rejet(err)
}
if (status.replace(/\n/g,'').length) {
return resolve(false)
}
resolve(true)
})
})
}
function gitInfo(cwd, cb) {
return new Promise( (resolve, reject)=>{
const done = multicb({pluck: 1, spread: true})
exec('git describe --dirty --always', {cwd}, done())
exec('git remote get-url origin', {cwd}, done())
exec('git symbolic-ref --short HEAD', {cwd}, done())
done( (err, ref, url, branch) => {
if (err) return reject(err)
resolve({
commit: ref.replace(/\n/,''),
repositoryUrl: url.replace(/\n/,''),
repositoryBranch: branch.replace(/\n/,'')
})
})
})
}