You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
170 lines
2.6 KiB
170 lines
2.6 KiB
'use strict'; |
|
var fs = require('fs'); |
|
var archiveType = require('archive-type'); |
|
var execSeries = require('exec-series'); |
|
var Decompress = require('decompress'); |
|
var Download = require('download'); |
|
var rimraf = require('rimraf'); |
|
var tempfile = require('tempfile'); |
|
var urlRegex = require('url-regex'); |
|
|
|
/** |
|
* Initialize new `BinBuild` |
|
* |
|
* @param {Object} opts |
|
* @api public |
|
*/ |
|
|
|
function BinBuild(opts) { |
|
if (!(this instanceof BinBuild)) { |
|
return new BinBuild(opts); |
|
} |
|
|
|
this.opts = opts || {}; |
|
this.tmp = tempfile(); |
|
|
|
if (this.opts.strip <= 0) { |
|
this.opts.strip = 0; |
|
} else if (!this.opts.strip) { |
|
this.opts.strip = 1; |
|
} |
|
} |
|
|
|
module.exports = BinBuild; |
|
|
|
/** |
|
* Define the source archive to download |
|
* |
|
* @param {String} str |
|
* @api public |
|
*/ |
|
|
|
BinBuild.prototype.src = function (str) { |
|
if (!arguments.length) { |
|
return this._src; |
|
} |
|
|
|
this._src = str; |
|
return this; |
|
}; |
|
|
|
/** |
|
* Add a command to run |
|
* |
|
* @param {String} str |
|
* @api public |
|
*/ |
|
|
|
BinBuild.prototype.cmd = function (str) { |
|
if (!arguments.length) { |
|
return this._cmd; |
|
} |
|
|
|
this._cmd = this._cmd || []; |
|
this._cmd.push(str); |
|
|
|
return this; |
|
}; |
|
|
|
/** |
|
* Build |
|
* |
|
* @param {Function} cb |
|
* @api public |
|
*/ |
|
|
|
BinBuild.prototype.run = function (cb) { |
|
cb = cb || function () {}; |
|
|
|
if (urlRegex().test(this.src())) { |
|
return this.download(function (err) { |
|
if (err) { |
|
cb(err); |
|
return; |
|
} |
|
|
|
this.exec(this.tmp, cb); |
|
}.bind(this)); |
|
} |
|
|
|
fs.readFile(this.src(), function (err, data) { |
|
if (err && err.code !== 'EISDIR') { |
|
cb(err); |
|
return; |
|
} |
|
|
|
if (archiveType(data)) { |
|
this.extract(function (err) { |
|
if (err) { |
|
cb(err); |
|
return; |
|
} |
|
|
|
this.exec(this.tmp, cb); |
|
}.bind(this)); |
|
|
|
return; |
|
} |
|
|
|
this.exec(this.src(), cb); |
|
}.bind(this)); |
|
}; |
|
|
|
/** |
|
* Execute commands |
|
* |
|
* @param {String} cwd |
|
* @param {Function} cb |
|
* @api private |
|
*/ |
|
|
|
BinBuild.prototype.exec = function (cwd, cb) { |
|
execSeries(this.cmd(), {cwd: cwd}, function (err) { |
|
if (err) { |
|
err.message = [this.cmd().join(' && '), err.message].join('\n'); |
|
cb(err); |
|
return; |
|
} |
|
|
|
rimraf(this.tmp, cb); |
|
}.bind(this)); |
|
}; |
|
|
|
/** |
|
* Decompress source |
|
* |
|
* @param {Function} cb |
|
* @api private |
|
*/ |
|
|
|
BinBuild.prototype.extract = function (cb) { |
|
var decompress = new Decompress({ |
|
mode: '777', |
|
strip: this.opts.strip |
|
}); |
|
|
|
decompress |
|
.src(this.src()) |
|
.dest(this.tmp) |
|
.run(cb); |
|
}; |
|
|
|
/** |
|
* Download source file |
|
* |
|
* @param {Function} cb |
|
* @api private |
|
*/ |
|
|
|
BinBuild.prototype.download = function (cb) { |
|
var download = new Download({ |
|
strip: this.opts.strip, |
|
extract: true, |
|
mode: '777' |
|
}); |
|
|
|
download |
|
.get(this.src()) |
|
.dest(this.tmp) |
|
.run(cb); |
|
};
|
|
|