--- /dev/null
+
+// handle some git configuration for windows
+
+exports.spawn = spawnGit
+exports.chainableExec = chainableExec
+exports.whichAndExec = whichAndExec
+
+var exec = require("child_process").execFile
+ , spawn = require("./spawn")
+ , npm = require("../npm.js")
+ , which = require("which")
+ , git = npm.config.get("git")
+ , assert = require("assert")
+ , log = require("npmlog")
+
+function prefixGitArgs () {
+ return process.platform === "win32" ? ["-c", "core.longpaths=true"] : []
+}
+
+function execGit (args, options, cb) {
+ log.info('git', args)
+ var fullArgs = prefixGitArgs().concat(args || [])
+ return exec(git, fullArgs, options, cb)
+}
+
+function spawnGit (args, options) {
+ log.info("git", args)
+ return spawn(git, prefixGitArgs().concat(args || []), options)
+}
+
+function chainableExec () {
+ var args = Array.prototype.slice.call(arguments)
+ return [execGit].concat(args)
+}
+
+function whichGit (cb) {
+ return which(git, cb)
+}
+
+function whichAndExec (args, options, cb) {
+ assert.equal(typeof cb, "function", "no callback provided")
+ // check for git
+ whichGit(function (err) {
+ if (err) {
+ err.code = "ENOGIT"
+ return cb(err)
+ }
+
+ execGit(args, options, cb)
+ })
+}