Skip to content

Commit

Permalink
Upgrade to tar v3
Browse files Browse the repository at this point in the history
Tar version 3 performs better and is more well tested than its
predecessor.  npm will be using this in the near future, so there is no
benefit in shipping a node-gyp that uses the slower and less reliable
fstream-based tar.
  • Loading branch information
isaacs committed May 31, 2017
1 parent 72afdd6 commit 0d0aad3
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 24 deletions.
38 changes: 16 additions & 22 deletions lib/install.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,8 @@ var fs = require('graceful-fs')
, rm = require('rimraf')
, path = require('path')
, crypto = require('crypto')
, zlib = require('zlib')
, log = require('npmlog')
, semver = require('semver')
, fstream = require('fstream')
, request = require('request')
, minimatch = require('minimatch')
, mkdir = require('mkdirp')
Expand Down Expand Up @@ -144,41 +142,33 @@ function install (gyp, argv, callback) {
var tarPath = gyp.opts.tarball
var badDownload = false
, extractCount = 0
, gunzip = zlib.createGunzip()
, extracter = tar.Extract({ path: devDir, strip: 1, filter: isValid })

var contentShasums = {}
var expectShasums = {}

// checks if a file to be extracted from the tarball is valid.
// only .h header files and the gyp files get extracted
function isValid () {
var name = this.path.substring(devDir.length + 1)
var isValid = valid(name)
if (name === '' && this.type === 'Directory') {
// the first directory entry is ok
return true
}
function isValid (path, entry) {
var isValid = valid(path)
if (isValid) {
log.verbose('extracted file from tarball', name)
log.verbose('extracted file from tarball', path)
extractCount++
} else {
// invalid
log.silly('ignoring from tarball', name)
log.silly('ignoring from tarball', path)
}
return isValid
}

gunzip.on('error', cb)
extracter.on('error', cb)
extracter.on('end', afterTarball)

// download the tarball, gunzip and extract!
// download the tarball and extract!

if (tarPath) {
var input = fs.createReadStream(tarPath)
input.pipe(gunzip).pipe(extracter)
return
return tar.extract({
file: tarPath,
strip: 1,
filter: isValid,
cwd: devDir
}).then(afterTarball, cb)
}

try {
Expand Down Expand Up @@ -218,7 +208,11 @@ function install (gyp, argv, callback) {
})

// start unzipping and untaring
req.pipe(gunzip).pipe(extracter)
res.pipe(tar.extract({
strip: 1,
cwd: devDir,
filter: isValid
}).on('close', _ => setTimeout(afterTarball, 1000)).on('error', cb))
})

// invoked after the tarball has finished being extracted
Expand Down
3 changes: 1 addition & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
"bin": "./bin/node-gyp.js",
"main": "./lib/node-gyp.js",
"dependencies": {
"fstream": "^1.0.0",
"glob": "^7.0.3",
"graceful-fs": "^4.1.2",
"minimatch": "^3.0.2",
Expand All @@ -33,7 +32,7 @@
"request": "2",
"rimraf": "2",
"semver": "~5.3.0",
"tar": "^2.0.0",
"tar": "^3.1.3",
"which": "1"
},
"engines": {
Expand Down

0 comments on commit 0d0aad3

Please sign in to comment.