diff --git a/.didntcomefromthenpmregistry b/.didntcomefromthenpmregistry new file mode 100644 index 000000000..e69de29bb diff --git a/.npmignore b/.npmignore index b3d2f9d9d..50b42bb8c 100644 --- a/.npmignore +++ b/.npmignore @@ -3,9 +3,6 @@ /examples/ /generate/ /test/ -/vendor/libgit2/ -/vendor/libssh2/ -/vendor/http_parser/ /vendor/Release/ .astylerc @@ -15,6 +12,7 @@ .jshintrc .travis.yml .appveyor.yml +.didntcomefromthenpmregistry *.vcxproj *.filters diff --git a/generate/index.js b/generate/index.js index 9eea74ecf..5ca590172 100644 --- a/generate/index.js +++ b/generate/index.js @@ -1,3 +1,13 @@ -require("./scripts/generateJson"); -require("./scripts/generateNativeCode"); -require("./scripts/generateMissingTests"); +var generateJson = require("./scripts/generateJson"); +var generateNativeCode = require("./scripts/generateNativeCode"); +var generateMissingTests = require("./scripts/generateMissingTests"); + +module.exports = function generate() { + generateJson(); + generateNativeCode(); + generateMissingTests(); +} + +if (require.main === module) { + module.exports(); +} diff --git a/generate/scripts/generateJson.js b/generate/scripts/generateJson.js index 35430bff4..4ef0b75dd 100644 --- a/generate/scripts/generateJson.js +++ b/generate/scripts/generateJson.js @@ -1,15 +1,17 @@ const fs = require("fs"); const path = require("path"); -const helpers = require("./helpers"); const utils = require("./utils"); -const _ = require("lodash"); +var _; var version = require("../../package.json").libgit2.version; var libgit2 = require("../input/v" + version + ".json"); var descriptor = require("../input/descriptor.json"); - var supplement = require("../input/libgit2-supplement.json"); +var supplement = require("../input/libgit2-supplement.json"); + +module.exports = function generateJson() { + var helpers = require("./helpers"); + _ = require("lodash"); -module.exports = (function generateJson() { libgit2.types.forEach(function(type) { if (supplement.types[type[0]]){ _.merge(type[1], supplement.types[type[0]]); @@ -219,4 +221,8 @@ module.exports = (function generateJson() { utils.writeFile("output/idefs.json", output); -}()); +}; + +if (require.main === module) { + module.exports(); +} diff --git a/generate/scripts/generateMissingTests.js b/generate/scripts/generateMissingTests.js index 1b6c7aae2..0a89c7bd8 100644 --- a/generate/scripts/generateMissingTests.js +++ b/generate/scripts/generateMissingTests.js @@ -5,10 +5,9 @@ const fse = promisify(require("fs-extra")); const utils = require("./utils"); const testFilesPath = "../test/tests"; -const idefs = require("../output/idefs"); const missingFileIgnores = require("../input/ignored-missing-tests"); -module.exports = (function generateMissingTests() { +module.exports = function generateMissingTests() { var output = {}; function findMissingTest(idef) { @@ -55,10 +54,9 @@ module.exports = (function generateMissingTests() { }); }; - var promises = []; - - idefs.forEach(function(idef) { - promises.push(findMissingTest(idef)); + const idefs = require("../output/idefs"); + var promises = idefs.map(function(idef) { + return findMissingTest(idef); }); Promise.all(promises).then( @@ -66,9 +64,12 @@ module.exports = (function generateMissingTests() { utils.writeFile("output/missing-tests.json", output); }, function(fail) { - console.log(fail); + console.error(fail); } ); -}()); +}; +if (require.main === module) { + module.exports(); +} diff --git a/generate/scripts/generateNativeCode.js b/generate/scripts/generateNativeCode.js index c277e0e9f..0944ffca5 100644 --- a/generate/scripts/generateNativeCode.js +++ b/generate/scripts/generateNativeCode.js @@ -1,26 +1,25 @@ const path = require("path"); -const combyne = require("combyne"); const promisify = require("promisify-node"); const fse = promisify(require("fs-extra")); -const js_beautify = require("js-beautify").js_beautify; -const beautify = function (input) { - return js_beautify(input, { - "brace_style": "end-expand", - "max_preserve_newlines": 2, - "preserve_newlines": true, - "indent_size": 2, - "indent_char": " " - }); -} const exec = promisify(function(command, opts, callback) { return require("child_process").exec(command, opts, callback); }); - const utils = require("./utils"); -const idefs = require("../output/idefs"); -module.exports = (function generateNativeCode() { +module.exports = function generateNativeCode() { + const combyne = require("combyne"); + const js_beautify = require("js-beautify").js_beautify; + const beautify = function (input) { + return js_beautify(input, { + "brace_style": "end-expand", + "max_preserve_newlines": 2, + "preserve_newlines": true, + "indent_size": 2, + "indent_char": " " + }); + }; + // Customize the delimiters so as to not process `{{{` or `}}}`. combyne.settings.delimiters = { START_RAW: "{{=", @@ -91,6 +90,7 @@ module.exports = (function generateNativeCode() { // Determine which definitions to actually include in the source code. // This might not be needed anymore but to be frank I'm not totally positive + const idefs = require("../output/idefs"); var enabled = idefs.filter(function(idef) { return !idef.ignore; }); @@ -119,7 +119,7 @@ module.exports = (function generateNativeCode() { } catch (e) { if (process.env.BUILD_ONLY) { - console.log(e); + console.error(e); } } }); @@ -143,4 +143,8 @@ module.exports = (function generateNativeCode() { }) }); -}()); +}; + +if (require.main === module) { + module.exports(); +} diff --git a/install.js b/install.js deleted file mode 100644 index d270f9de8..000000000 --- a/install.js +++ /dev/null @@ -1,269 +0,0 @@ -var os = require("os"); -var path = require("path"); -var zlib = require("zlib"); -var tar; -var request; - -var Promise = require("nodegit-promise"); -var promisify = require("promisify-node"); -var fse = promisify(require("fs-extra")); -var findParentDir = promisify(require('find-parent-dir')); - -var exec = promisify(function(command, opts, callback) { - return require("child_process").exec(command, opts, callback); -}); - - -var NODE_VERSION = Number(process.version.match(/^v(\d+\.\d+)/)[1]); - -// If the build only flag is set. -var buildOnly = process.env.BUILD_ONLY; -var nodeWebkit = false; - -// This will take in an object and find any matching keys in the environment -// to use as overrides. -// -// ENV variables: -// -// PKG: Location of `package.json` sans `.json`. -// LIBGIT2: Location of libgit2 source. -// BUILD: Location of nodegit build directory. -function envOverride(obj) { - // Look through all keys. - return Object.keys(obj).reduce(function(obj, key) { - var normalize = key.toUpperCase(); - - // Check for process environment existence. - if (normalize in process.env) { - obj[key] = process.env[normalize]; - } - - return obj; - }, obj); -} - -// Convert to the correct system path. -function systemPath(parts) { - return parts.join(path.sep); -} - -// Will be used near the end to configure `node-gyp`. -var pythonPath = ""; - -var local = path.join.bind(path, __dirname); - -// Common reusable paths that can be overwritten by environment variables. -var paths = envOverride({ - pkg: local("package"), - libgit2: local("vendor/libgit2/"), - libssh2: local("vendor/libssh2/"), - http_parser: local("vendor/http_parser/"), - release: local("build/Release/"), -}); - -// Load the package.json. -var pkg = require(paths.pkg); - -if (NODE_VERSION === 0.1) { - pkg.http_parser = pkg.http_parser["0.10"]; -} - -// ensureDir doesn't promisify correctly so right now just use the callback -fse.ensureDir(path.resolve(__dirname, paths.release), function(err) { - if (err) { - console.log(err); - } - else { - detectNodeWebkit.call(null, __dirname) - .then(fetch) - .then(finish, compile); - } -}); - -function fetch() { - console.info("[nodegit] Fetching binary from S3."); - - if (nodeWebkit) { - throw new Error("Must build for node-webkit"); - } - - if (buildOnly) { - throw new Error("BUILD_ONLY is set to true, no fetching allowed."); - } - - // Using the node-pre-gyp module, attempt to fetch a compatible build. - return exec("node-pre-gyp install"); -} - -function compile(err) { - if (buildOnly || nodeWebkit) { - console.info("[nodegit] " + err.message); - } - else { - console.info("[nodegit] Failed to install prebuilt, attempting compile."); - } - - tar = require("tar"); - request = require("request"); - - console.info("[nodegit] Installing all devDependencies"); - return exec("npm install --ignore-scripts --dont-prepublish") - .then(function() { - console.info("[nodegit] Determining source dependencies."); - return Promise.all([ - python(), - getVendorLib("libgit2", "https://github.com/libgit2/libgit2/tarball/" + pkg.libgit2.sha), - getVendorLib("libssh2", pkg.libssh2.url), - getVendorLib("http_parser", pkg.http_parser.url), - guardGenerated() - ]); - }) - .then(buildNative) - .then(finish, fail); -} - -function python() { - var pathFinderCommand = process.platform === "win32" ? "where" : "which"; - - return exec(pathFinderCommand + " python2") - .then(function(which){ - return which; - }, function(err) { - return null; - }) - .then(function(path) { - return path || exec(pathFinderCommand + " python"); - }) - .then(function(path) { - return path; - }, function(err) { - return null; - }) - .then(function(path) { - if (!path) { - throw new Error("Python is required to build libgit2."); - } - return path.trim(); - }, function(err) { - throw new Error("Error finding python."); - }) - .then(function(path) { - pythonPath = path; - return exec(path + " -V 2>&1"); - }) - .then(function(version) { - if (version.trim().indexOf("Python 3") === 0) { - throw new Error("Incorrect version of Python, gyp requires < 3."); - } - }); -} - -function getVendorLib(name, url) { - var version = pkg[name].sha || pkg[name].version; - console.info("[nodegit] Detecting vendor/" + name + "."); - if (fse.existsSync(paths[name] + version)) { - console.info("[nodegit] vendor/" + name + " already exists."); - return Promise.resolve(); - } - else { - console.info("[nodegit] Removing outdated vendor/" + name + "."); - return fse.remove(paths[name]) - .then(function() { - return new Promise(function (resolve, reject) { - - console.info("[nodegit] Fetching vendor/" + name + "."); - - var extract = tar.Extract({ - path: paths[name], - strip: true - }); - - request.get(url).pipe(zlib.createUnzip()).pipe(extract) - .on("error", reject) - .on("end", resolve); - }); - }).then(function() { - return fse.writeFile(paths[name] + version, ""); - }).then(function() { - if ((name == "libssh2") && (process.platform !== "win32")) { - return exec(paths[name] + "configure", {cwd: paths[name]}); - } - }); - } -} - -function guardGenerated() { - return Promise.all([ - fse.stat(path.resolve(__dirname, "src/")), - fse.stat(path.resolve(__dirname, "include/")) - ]).then(function() { - return Promise.resolve(); - }, function() { - console.info("[nodegit] C++ files not found, generating now."); - return exec("node generate"); - }); -} - -function buildNative() { - return exec("cd " + __dirname).then(function() { - if (nodeWebkit) { - console.info("[nodegit] Building native node-webkit module."); - } - else { - console.info("[nodegit] Building native node module."); - } - - var builder = nodeWebkit ? "nw-gyp" : "node-gyp"; - - var cmd = path.resolve(".", "node_modules", ".bin", builder) - + " clean configure " - + (nodeWebkit ? "--target=\"" + nodeWebkit + "\"": "") - + " build --python \"" + pythonPath + "\"" - - var opts = { - cwd: __dirname, - maxBuffer: Number.MAX_VALUE - }; - return exec(cmd, opts); - }) -} - -function detectNodeWebkit(directory) { - if (directory) { - var pkg = require(path.resolve(directory, "package.json")); - - nodeWebkit = pkg.engines && pkg.engines["node-webkit"]; - - return findParentDir(path.resolve(directory, ".."), "package.json") - .then(detectNodeWebkit); - } - else { - return Promise.resolve(); - } -} - -function finish() { - console.info("[nodegit] Completed installation successfully."); - if (!buildOnly) { - console.info("[nodegit] Cleaning up"); - return Promise.all([ - fse.remove(path.resolve(__dirname, "src")), - fse.remove(path.resolve(__dirname, "include")), - fse.remove(path.resolve(__dirname, "generate/output")), - fse.remove(path.resolve(__dirname, paths.libgit2)), - fse.remove(path.resolve(__dirname, paths.libssh2)), - fse.remove(path.resolve(__dirname, paths.http_parser)) - // exec("npm prune --production") - ]).done(); - } - else { - return Promise.resolve().done(); - } -} - -function fail(message) { - console.info("[nodegit] Failed to build and install nodegit."); - console.info(message.message); - - return Promise.resolve().done(); -} diff --git a/lifecycleScripts/checkPrepared.js b/lifecycleScripts/checkPrepared.js new file mode 100644 index 000000000..ffb1a5c28 --- /dev/null +++ b/lifecycleScripts/checkPrepared.js @@ -0,0 +1,67 @@ +var Promise = require("nodegit-promise"); +var path = require("path"); +var fs = require("fs"); +var rooted = path.join.bind(path, __dirname, ".."); +var pkg = require(rooted("package")); + +var NODE_VERSION = Number(process.version.match(/^v(\d+\.\d+)/)[1]); + +module.exports.checkAll = function checkAll() { + return Promise.all([ + checkVendor("libgit2"), + checkVendor("libssh2"), + checkVendor("http_parser"), + + checkExists("lib/nodegit.js"), + checkExists("lib/enums.js"), + checkExists("src"), + checkExists("include") + ]).then(function(checks) { + return checks.reduce(function(soFar, currentCheck) { + return soFar && currentCheck; + }, true); + }); +}; + +function checkExists(name) { + return new Promise(function(resolve, reject) { + fs.exists(rooted(name), function(exists) { + resolve(exists); + }); + }); +} +module.exports.checkExists = checkExists; + +function checkVendor(name, skipVersion) { + var version = ""; + if (!skipVersion) { + var vendorPackage = pkg[name]; + if (NODE_VERSION === 0.1 && vendorPackage["0.10"]) { + vendorPackage = vendorPackage["0.10"]; + } + version = vendorPackage.sha || vendorPackage.version; + } + + var vendorPath = "vendor/" + name + "/" + version; + return checkExists(vendorPath); +} +module.exports.checkVendor = checkVendor; + +function checkGenerated() { + return Promise.all([ + checkExists("lib/nodegit.js"), + checkExists("lib/enums.js"), + checkExists("src"), + checkExists("include") + ]).then(function(checks) { + return checks.reduce(function(soFar, currentCheck) { + return soFar && currentCheck; + }, true); + }); +} +module.exports.checkGenerated = checkGenerated; + +// Called on the command line +if (require.main === module) { + module.exports.checkAll(); +} diff --git a/lifecycleScripts/clean.js b/lifecycleScripts/clean.js new file mode 100644 index 000000000..d3a21c001 --- /dev/null +++ b/lifecycleScripts/clean.js @@ -0,0 +1,139 @@ +var fse = require("fs-extra"); +var path = require("path"); +var npm = require("npm"); +var Promise = require("nodegit-promise"); + +var rooted = path.join.bind(path, __dirname, ".."); +if (fse.existsSync(rooted(".didntcomefromthenpmregistry"))) { + console.error("[nodegit] We only clean when downloaded from the npm " + + "registry. Skipping clean."); + return; +} + +npm.load({ + "production": true +}, function() { + + var filesToDelete = [ + "build/Makefile", + "build/binding.Makefile", + "build/config.gypi", + "build/gyp-mac-tool", + "build/nodegit.target.mk", + "build/vendor", + + "build/Release/git2.a", + "build/Release/http_parser.a", + "build/Release/linker.lock", + "build/Release/obj.target", + "build/Release/openssl.a", + "build/Release/ssh2.a", + "build/Release/zlib.a", + + "build/Debug/git2.a", + "build/Debug/http_parser.a", + "build/Debug/linker.lock", + "build/Debug/obj.target", + "build/Debug/openssl.a", + "build/Debug/ssh2.a", + "build/Debug/zlib.a", + + "example", + "generate", + "include", + "lifecycleScripts", + "src", + "test", + "vendor", + + ".astylerc", + ".editorconfig", + ".gitingore", + ".gitmodules", + ".jshintrc", + ".npmignore", + ".travis.yml", + "appveyor.yml", + "binding.gyp", + "TESTING.md" + ]; + + var modulesToPrune = [ + "for-node-webkit", + "fs-extra", + "node-pre-gyp", + "npm" + ]; + + console.info("[nodegit] Cleaning up after ourselves."); + + Promise.all([ + cleanFiles(), + pruneDevDependencies(), + pruneOtherDependencies() + ]).then( + function success() { + console.info("[nodegit] Done cleaning, enjoy!"); + }, + function failure() { + console.error("[nodegit] Couldn't finish cleaning."); + } + ); + + function cleanFiles() { + console.info("[nodegit] Deleting unneeded files."); + return new Promise(function(resolve, reject) { + var failures = filesToDelete.some(function(deletable) { + try { + fse.removeSync(rooted(deletable)); + return false; + } + catch (e) { + console.info("[nodegit] Error deleting files. Errored on " + + rooted(deletable) + "."); + console.error(e); + + reject(e); + return true; + } + }); + + if (!failures) { + console.info("[nodegit] Finished deleting files."); + resolve(); + } + }); + } + + function pruneDevDependencies() { + console.info("[nodegit] Pruning devdependencies."); + return new Promise(function (resolve, reject) { + npm.commands.prune(function(err) { + if (err) { + console.error("[nodegit] Failed pruning devdependencies."); + reject(err); + } + else { + console.info("[nodegit] Successfully pruned devdependencies."); + resolve(); + } + }); + }); + } + + function pruneOtherDependencies() { + console.info("[nodegit] Cleaning unneeded dependencies."); + return new Promise(function (resolve, reject) { + npm.commands.uninstall(modulesToPrune, function(err) { + if (err) { + console.drror("[nodegit] Failed cleaning unneeded dependencies."); + reject(err); + } + else { + console.info("[nodegit] Successfully cleaned unneeded dependencies."); + resolve(); + } + }); + }); + } +}); diff --git a/lifecycleScripts/install.js b/lifecycleScripts/install.js new file mode 100644 index 000000000..c5451b3c6 --- /dev/null +++ b/lifecycleScripts/install.js @@ -0,0 +1,103 @@ +var Promise = require("nodegit-promise"); +var promisify = require("promisify-node"); +var path = require("path"); +var fs = require("fs"); + +var local = path.join.bind(path, __dirname); + +var checkPrepared = require(local("checkPrepared")); +var forNodeWebkit = require("for-node-webkit"); +var prepareForBuild = require(local("prepareForBuild")); + +var exec = promisify(function(command, opts, callback) { + return require("child_process").exec(command, opts, callback); +}); + +return forNodeWebkit(local("..")) + .then(function(results) { + return results.nwVersion; + }) + .then(function(nodeWebkitVersion) { + if (nodeWebkitVersion) { + console.info("[nodegit] Must build for node-webkit"); + return checkAndBuild(nodeWebkitVersion); + } + if (fs.existsSync(local("../.didntcomefromthenpmregistry"))) { + return checkAndBuild(); + } + if (process.env.BUILD_DEBUG) { + console.info("[nodegit] Doing a debug build, no fetching allowed."); + return checkAndBuild(); + } + if (process.env.BUILD_ONLY) { + console.info("[nodegit] BUILD_ONLY is set to true, no fetching allowed."); + return checkAndBuild(); + } + console.info("[nodegit] Fetching binary from S3."); + return exec("node-pre-gyp build") + .then( + function() { + console.info("[nodegit] Completed installation successfully."); + }, + function() { + console.info("[nodegit] Failed to install prebuilt binary, " + + "building manually."); + return checkAndBuild(); + } + ); + }); + + +function checkAndBuild(nwVersion) { + console.info("[nodegit] Making sure dependencies are available and native " + + "code is generated"); + + return checkPrepared.checkAll() + .then(function(allGood) { + if (allGood) { + return Promise.resolve(); + } + else { + console.info("[nodegit] Something is missing, retrieving " + + "dependencies and regenerating code"); + return prepareForBuild(); + } + }) + .then(function() { + return build(nwVersion); + }); +} + +function build(nwVersion) { + console.info("[nodegit] Everything is ready to go, attempting compilation"); + if (nwVersion) { + console.info("[nodegit] Building native node-webkit module."); + } + else { + console.info("[nodegit] Building native node module."); + } + + var opts = { + cwd: local(".."), + maxBuffer: Number.MAX_VALUE + }; + + var builder = nwVersion ? "nw-gyp" : "node-gyp"; + var target = (nwVersion ? "--target=\"" + nwVersion + "\"": ""); + var debug = (process.env.BUILD_DEBUG ? " --debug" : ""); + var cmd = path.resolve(".", "node_modules", ".bin", builder) + + " clean configure" + + debug + + target + + " build"; + + return exec(cmd, opts) + .then(function() { + console.info("[nodegit] Compilation complete."); + console.info("[nodegit] Completed installation successfully."); + }, + function(err, stderr) { + console.error(err); + console.error(stderr); + }); +} diff --git a/lifecycleScripts/prepareForBuild.js b/lifecycleScripts/prepareForBuild.js new file mode 100644 index 000000000..e32653157 --- /dev/null +++ b/lifecycleScripts/prepareForBuild.js @@ -0,0 +1,62 @@ +var Promise = require("nodegit-promise"); +var cp = require("child_process"); +var path = require("path"); + +var local = path.join.bind(path, __dirname); + +var check = require(local("checkPrepared")).checkGenerated; +var retrieve = require(local("retrieveExternalDependencies")); +var generate = require(local("../generate")); + +module.exports = function prepareForBuild() { + + return new Promise(function(resolve, reject) { + cp.exec("npm install --ignore-scripts", function(err, stdout, stderr) { + if (err) { + console.error(stderr); + reject(err, stderr); + } + else { + resolve(); + console.info(stdout); + } + }); + }).then(function() { + return Promise.all([ + retrieve(), + doGenerate() + ]); + }); +}; + +function doGenerate() { + console.info("[nodegit] Detecting generated code."); + return check().then(function(allThere) { + if (allThere) { + console.info("[nodegit] Generated code is intact."); + return Promise.resolve(); + } + else { + console.info("[nodegit] Generated code is missing or incomplete, " + + "regenerating now."); + + return new Promise(function(resolve, reject) { + try { + generate(); + console.info("[nodegit] Code regenerated."); + resolve(); + } + catch (e) { + console.info("[nodegit] Error generating code."); + console.info(e); + //console.info(stderr); + reject(e); + } + }); + } + }); +} +// Called on the command line +if (require.main === module) { + module.exports(); +} diff --git a/lifecycleScripts/retrieveExternalDependencies.js b/lifecycleScripts/retrieveExternalDependencies.js new file mode 100644 index 000000000..30bbf4e98 --- /dev/null +++ b/lifecycleScripts/retrieveExternalDependencies.js @@ -0,0 +1,113 @@ +var Promise = require("nodegit-promise"); +var promisify = require("promisify-node"); +var fse = promisify("fs-extra"); +var zlib = require("zlib"); +var cp = require("child_process"); +var path = require("path"); + +var local = path.join.bind(path, __dirname); +var rooted = path.join.bind(path, __dirname, ".."); + +var check = require(local("checkPrepared")).checkVendor; +var pkg = require(rooted("package")); +var tar; +var request; + +var NODE_VERSION = Number(process.version.match(/^v(\d+\.\d+)/)[1]); + +module.exports = function retrieveExternalDependencies() { + tar = require("tar"); + request = require("request"); + return Promise.all([ + getVendorLib("libgit2"), + getVendorLib("libssh2"), + getVendorLib("http_parser") + ]); +}; + + +function getVendorLib(name) { + var vendorPath = "vendor/" + name + "/"; + var vendorPackage = pkg[name]; + if (NODE_VERSION === 0.1 && vendorPackage["0.10"]) { + vendorPackage = vendorPackage["0.10"]; + } + + var version = vendorPackage.sha || vendorPackage.version; + + console.info("[nodegit] Detecting " + vendorPath + version + "."); + return check(name) + .then(function(exists) { + if (exists) { + console.info("[nodegit] " + vendorPath + version + " already exists."); + return Promise.resolve(); + } + else { + return check(name, true) + .then(function(exists) { + if (exists) { + console.info("[nodegit] Removing outdated " + vendorPath + "."); + return fse.remove(rooted(vendorPath)); + } + else { + console.info("[nodegit] " + vendorPath + " not found."); + return Promise.resolve(); + } + }) + .then(function() { + return new Promise(function (resolve, reject) { + console.info("[nodegit] Retrieving " + vendorPath + "."); + + var extract = tar.Extract({ + path: rooted("vendor/" + name + "/"), + strip: true + }); + + request.get(vendorPackage.url) + .pipe(zlib.createUnzip()) + .pipe(extract) + .on("error", reject) + .on("end", resolve); + }); + + }) + .then(function() { + return fse.writeFile(rooted(vendorPath + version), ""); + }) + .then(function() { + if ((name == "libssh2") && (process.platform !== "win32")) { + return new Promise(function(resolve, reject) { + console.info("[nodegit] Configuring libssh2."); + cp.exec( + rooted(vendorPath) + "configure", + {cwd: rooted(vendorPath)}, + function(err, stdout, stderr) { + if (err) { + console.error(err); + console.error(stderr); + reject(err, stderr); + } + else { + resolve(stdout); + } + } + ); + }); + } + else { + return Promise.resolve(); + } + }) + .then(function() { + console.info("[nodegit] Successfully updated " + vendorPath + + version + "."); + }); + } + }); + +} + +// Called on the command line +if (require.main === module) { + module.exports(); +} diff --git a/package.json b/package.json index 66dec164d..204f21325 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "description": "Node.js libgit2 asynchronous native bindings", "version": "0.2.4", "libgit2": { + "url": "https://github.com/libgit2/libgit2/tarball/4af08d9f69f151f6362df51d7d7f41527e2af05c", "sha": "4af08d9f69f151f6362df51d7d7f41527e2af05c", "version": "0.21.2" }, @@ -60,10 +61,11 @@ "node-pre-gyp" ], "dependencies": { - "find-parent-dir": "^0.3.0", + "for-node-webkit": "0.0.2", "fs-extra": "~0.14.0", "node-pre-gyp": "~0.6.1", "nodegit-promise": "~1.0.0", + "npm": "^2.1.18", "promisify-node": "~0.1.2" }, "devDependencies": { @@ -85,7 +87,7 @@ "host": "https://s3.amazonaws.com/nodegit/nodegit/" }, "scripts": { - "lint": "jshint lib test/tests examples", + "lint": "jshint lib test/tests examples lifecycleScripts", "cov": "node test", "mocha": "mocha test/runner test/tests", "mochaDebug": "mocha --debug-brk test/runner test/tests", @@ -93,10 +95,12 @@ "generateJson": "node generate/scripts/generateJson", "generateNativeCode": "node generate/scripts/generateNativeCode", "generateMissingTests": "node generate/scripts/generateMissingTests", - "prepublish": "node prepublish", "publish": "node-pre-gyp package && node-pre-gyp publish", - "install": "node install", + "install": "node lifecycleScripts/install", + "postinstall": "node lifecycleScripts/clean", "recompile": "BUILD_ONLY=true npm install", - "rebuild": "BUILD_ONLY=true node generate && node-gyp configure build" + "rebuild": "BUILD_ONLY=true node generate && node-gyp configure build", + "buildDebug": "node generate && BUILD_DEBUG=true npm install", + "prepublish": "node lifecycleScripts/prepareForBuild.js" } } diff --git a/prepublish.js b/prepublish.js deleted file mode 100644 index 7fddbecdd..000000000 --- a/prepublish.js +++ /dev/null @@ -1,8 +0,0 @@ -var exec = require('child_process').exec; -try { - require("./build/Release/nodegit"); - console.info("[nodegit] Nothing to do.") -} -catch (e) { - exec("node generate"); -}