From 108fcd5691bd772c4b7aacb97118832dbeeb24a6 Mon Sep 17 00:00:00 2001 From: Andre Cruz Date: Mon, 22 Apr 2013 18:34:01 +0100 Subject: [PATCH] Fix issues in windows. --- lib/resolve/Resolver.js | 2 +- lib/resolve/resolvers/GitFsResolver.js | 3 ++- lib/resolve/resolvers/GitResolver.js | 25 +++++++++++++++++++++++-- package.json | 3 ++- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/lib/resolve/Resolver.js b/lib/resolve/Resolver.js index 9ef3b40d..e25dc17a 100644 --- a/lib/resolve/Resolver.js +++ b/lib/resolve/Resolver.js @@ -97,7 +97,7 @@ Resolver.prototype._createTempDir = function () { .then(function () { return Q.nfcall(tmp.dir, { template: path.join(baseDir, this._name + '-XXXXXX'), - mode: parseInt('0777', 8) & ~process.umask(), + mode: 0777 & ~process.umask(), unsafeCleanup: true }); }.bind(this)) diff --git a/lib/resolve/resolvers/GitFsResolver.js b/lib/resolve/resolvers/GitFsResolver.js index 372ee69a..fa2178b7 100644 --- a/lib/resolve/resolvers/GitFsResolver.js +++ b/lib/resolve/resolvers/GitFsResolver.js @@ -25,7 +25,8 @@ GitFsResolver.prototype._resolveSelf = function () { return this._findResolution() .then(this._readJson.bind(this, this._source)) .then(this._copy.bind(this)) - .then(this._checkout.bind(this)); + .then(this._checkout.bind(this)) + .then(this._cleanup.bind(this)); }; // ----------------- diff --git a/lib/resolve/resolvers/GitResolver.js b/lib/resolve/resolvers/GitResolver.js index f7d3c0f0..b2bd0706 100644 --- a/lib/resolve/resolvers/GitResolver.js +++ b/lib/resolve/resolvers/GitResolver.js @@ -1,6 +1,9 @@ var util = require('util'); +var path = require('path'); var Q = require('q'); var semver = require('semver'); +var chmodr = require('chmodr'); +var rimraf = require('rimraf'); var mout = require('mout'); var Resolver = require('../Resolver'); var createError = require('../../util/createError'); @@ -15,7 +18,8 @@ util.inherits(GitResolver, Resolver); GitResolver.prototype._resolveSelf = function () { return this._findResolution() - .then(this._checkout.bind(this)); + .then(this._checkout.bind(this)) + .then(this._cleanup.bind(this)); }; GitResolver.prototype.hasNew = function (canonicalPkg) { @@ -95,7 +99,8 @@ GitResolver.prototype._findResolution = function (target) { // Otherwise, assume target is a branch return self.fetchHeads(this._source) .then(function (heads) { - if (!heads[target]) { + // Use hasOwn because a branch could have a name like "hasOwnProperty" + if (mout.object.hasOwn(heads, target)) { branches = Object.keys(heads); throw createError('Branch "' + target + '" does not exist', 'ENORESTARGET', { details: !branches.length ? @@ -108,6 +113,22 @@ GitResolver.prototype._findResolution = function (target) { }.bind(this)); }; +GitResolver.prototype._cleanup = function () { + var gitFolder = path.join(this._tempDir, '.git'); + + // Remove the .git folder + // Note that on windows, we need to chmod to 0777 before due to a bug in git + // See: https://github.com/isaacs/rimraf/issues/19 + if (process.platform === 'win32') { + return Q.nfcall(chmodr, gitFolder, 0777) + .then(function () { + return Q.nfcall(rimraf, gitFolder); + }); + } else { + return Q.nfcall(rimraf, gitFolder); + } +}; + GitResolver.prototype._savePkgMeta = function (meta) { // Save resolution to be used in hasNew later meta._resolution = this._resolution; diff --git a/package.json b/package.json index 1414f6f2..a05b09dd 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,8 @@ "ncp": "~0.4.2", "pathspec": "~0.9.2", "glob": "~3.1.21", - "rimraf": "~2.1.4" + "rimraf": "~2.1.4", + "chmodr": "~0.1.0" }, "devDependencies": { "mocha": "~1.8.2",