Socket
Socket
Sign inDemoInstall

tar-fs

Package Overview
Dependencies
Maintainers
1
Versions
62
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

tar-fs - npm Package Compare versions

Comparing version 0.5.0 to 0.5.1

358

index.js

@@ -1,237 +0,237 @@

var tar = require('tar-stream');
var pump = require('pump');
var mkdirp = require('mkdirp');
var fs = require('fs');
var path = require('path');
var os = require('os');
var tar = require('tar-stream')
var pump = require('pump')
var mkdirp = require('mkdirp')
var fs = require('fs')
var path = require('path')
var os = require('os')
var win32 = os.platform() === 'win32';
var win32 = os.platform() === 'win32'
var noop = function() {};
var noop = function() {}
var echo = function(name) {
return name;
};
return name
}
var normalize = !win32 ? echo : function(name) {
return name.replace(/\\/g, '/');
};
return name.replace(/\\/g, '/')
}
var statAll = function(cwd, ignore) {
var queue = ['.'];
var queue = ['.']
return function loop(callback) {
if (!queue.length) return callback();
var next = queue.shift();
var nextAbs = path.join(cwd, next);
return function loop(callback) {
if (!queue.length) return callback()
var next = queue.shift()
var nextAbs = path.join(cwd, next)
fs.lstat(nextAbs, function(err, stat) {
if (err) return callback(err);
fs.lstat(nextAbs, function(err, stat) {
if (err) return callback(err)
if (!stat.isDirectory()) return callback(null, next, stat);
if (!stat.isDirectory()) return callback(null, next, stat)
fs.readdir(nextAbs, function(err, files) {
if (err) return callback(err);
fs.readdir(nextAbs, function(err, files) {
if (err) return callback(err)
for (var i = 0; i < files.length; i++) {
if (!ignore(path.join(cwd, next, files[i]))) queue.push(path.join(next, files[i]));
}
for (var i = 0; i < files.length; i++) {
if (!ignore(path.join(cwd, next, files[i]))) queue.push(path.join(next, files[i]))
}
callback(null, next, stat);
});
});
};
};
callback(null, next, stat)
})
})
}
}
var strip = function(map, level) {
return function(header) {
header.name = header.name.split('/').slice(level).join('/')
if (header.linkname) header.linkname = header.linkname.split('/').slice(level).join('/')
return map(header)
}
return function(header) {
header.name = header.name.split('/').slice(level).join('/')
if (header.linkname) header.linkname = header.linkname.split('/').slice(level).join('/')
return map(header)
}
}
exports.pack = function(cwd, opts) {
if (!cwd) cwd = '.';
if (!opts) opts = {};
if (!cwd) cwd = '.'
if (!opts) opts = {}
var ignore = opts.ignore || noop;
var map = opts.map || noop;
var mapStream = opts.mapStream || echo;
var statNext = statAll(cwd, ignore);
var pack = tar.pack();
var ignore = opts.ignore || noop
var map = opts.map || noop
var mapStream = opts.mapStream || echo
var statNext = statAll(cwd, ignore)
var pack = tar.pack()
if (opts.strip) map = strip(map, opts.strip)
if (opts.strip) map = strip(map, opts.strip)
var onlink = function(filename, header) {
fs.readlink(path.join(cwd, filename), function(err, linkname) {
if (err) return pack.destroy(err);
header.linkname = normalize(linkname);
pack.entry(header, onnextentry);
});
};
var onlink = function(filename, header) {
fs.readlink(path.join(cwd, filename), function(err, linkname) {
if (err) return pack.destroy(err)
header.linkname = normalize(linkname)
pack.entry(header, onnextentry)
})
}
var onstat = function(err, filename, stat) {
if (err) return pack.destroy(err);
if (!filename) return pack.finalize();
var onstat = function(err, filename, stat) {
if (err) return pack.destroy(err)
if (!filename) return pack.finalize()
if (stat.isSocket()) return onnextentry() // tar does not support sockets...
if (stat.isSocket()) return onnextentry() // tar does not support sockets...
var header = {
name: normalize(filename),
mode: stat.mode,
mtime: stat.mtime,
size: stat.size,
type: 'file',
uid: stat.uid,
gid: stat.gid
};
var header = {
name: normalize(filename),
mode: stat.mode,
mtime: stat.mtime,
size: stat.size,
type: 'file',
uid: stat.uid,
gid: stat.gid
}
if (stat.isDirectory()) {
header.size = 0;
header.type = 'directory';
return pack.entry(header, onnextentry);
}
if (stat.isDirectory()) {
header.size = 0
header.type = 'directory'
return pack.entry(header, onnextentry)
}
if (stat.isSymbolicLink()) {
header.size = 0;
header.type = 'symlink';
return onlink(filename, header);
}
if (stat.isSymbolicLink()) {
header.size = 0
header.type = 'symlink'
return onlink(filename, header)
}
// TODO: add fifo etc...
// TODO: add fifo etc...
if (!stat.isFile()) return pack.destroy(new Error('unsupported type for '+filename));
if (!stat.isFile()) return pack.destroy(new Error('unsupported type for '+filename))
header = map(header) || header
header = map(header) || header
var entry = pack.entry(header, onnextentry);
if (!entry) return;
var rs = fs.createReadStream(path.join(cwd, filename));
var entry = pack.entry(header, onnextentry)
if (!entry) return
var rs = fs.createReadStream(path.join(cwd, filename))
pump(mapStream(rs), entry);
};
pump(mapStream(rs), entry)
}
var onnextentry = function(err) {
if (err) return pack.destroy(err);
statNext(onstat);
};
var onnextentry = function(err) {
if (err) return pack.destroy(err)
statNext(onstat)
}
onnextentry();
onnextentry()
return pack;
};
return pack
}
var head = function(list) {
return list.length ? list[list.length-1] : null
};
return list.length ? list[list.length-1] : null
}
exports.extract = function(cwd, opts) {
if (!cwd) cwd = '.';
if (!opts) opts = {};
if (!cwd) cwd = '.'
if (!opts) opts = {}
var ignore = opts.ignore || noop;
var map = opts.map || noop;
var mapStream = opts.mapStream || echo;
var own = opts.chown !== false && !win32 && process.getuid() === 0;
var extract = tar.extract();
var stack = [];
var now = new Date();
var umask = typeof opts.umask === 'number' ? ~opts.umask : ~process.umask();
var dmode = typeof opts.dmode === 'number' ? opts.dmode : 0;
var fmode = typeof opts.fmode === 'number' ? opts.fmode : 0;
var ignore = opts.ignore || noop
var map = opts.map || noop
var mapStream = opts.mapStream || echo
var own = opts.chown !== false && !win32 && process.getuid() === 0
var extract = tar.extract()
var stack = []
var now = new Date()
var umask = typeof opts.umask === 'number' ? ~opts.umask : ~process.umask()
var dmode = typeof opts.dmode === 'number' ? opts.dmode : 0
var fmode = typeof opts.fmode === 'number' ? opts.fmode : 0
if (opts.strip) map = strip(map, opts.strip)
if (opts.strip) map = strip(map, opts.strip)
if (opts.readable) {
dmode |= 0555;
fmode |= 0444;
}
if (opts.writable) {
dmode |= 0333;
fmode |= 0222;
}
if (opts.readable) {
dmode |= 0555
fmode |= 0444
}
if (opts.writable) {
dmode |= 0333
fmode |= 0222
}
var utimesParent = function(name, cb) { // we just set the mtime on the parent dir again everytime we write an entry
var top;
while ((top = head(stack)) && name.slice(0, top[0].length) !== top[0]) stack.pop();
if (!top) return cb();
fs.utimes(top[0], now, top[1], cb);
};
var utimesParent = function(name, cb) { // we just set the mtime on the parent dir again everytime we write an entry
var top
while ((top = head(stack)) && name.slice(0, top[0].length) !== top[0]) stack.pop()
if (!top) return cb()
fs.utimes(top[0], now, top[1], cb)
}
var utimes = function(name, header, cb) {
if (opts.utimes === false) return cb();
var utimes = function(name, header, cb) {
if (opts.utimes === false) return cb()
if (header.type === 'directory') return fs.utimes(name, now, header.mtime, cb);
if (header.type === 'symlink') return utimesParent(name, cb); // TODO: how to set mtime on link?
if (header.type === 'directory') return fs.utimes(name, now, header.mtime, cb)
if (header.type === 'symlink') return utimesParent(name, cb) // TODO: how to set mtime on link?
fs.utimes(name, now, header.mtime, function(err) {
if (err) return cb(err);
utimesParent(name, cb);
});
};
fs.utimes(name, now, header.mtime, function(err) {
if (err) return cb(err)
utimesParent(name, cb)
})
}
var chperm = function(name, header, cb) {
var link = header.type === 'symlink';
var chmod = link ? fs.lchmod : fs.chmod;
var chown = link ? fs.lchown : fs.chown;
var chperm = function(name, header, cb) {
var link = header.type === 'symlink'
var chmod = link ? fs.lchmod : fs.chmod
var chown = link ? fs.lchown : fs.chown
if (!chmod) return cb();
chmod(name, (header.mode | (header.type === 'directory' ? dmode : fmode)) & umask, function(err) {
if (err) return cb(err);
if (!own) return cb();
if (!chown) return cb();
chown(name, header.uid, header.gid, cb);
});
};
if (!chmod) return cb()
chmod(name, (header.mode | (header.type === 'directory' ? dmode : fmode)) & umask, function(err) {
if (err) return cb(err)
if (!own) return cb()
if (!chown) return cb()
chown(name, header.uid, header.gid, cb)
})
}
extract.on('entry', function(header, stream, next) {
header = map(header) || header
var name = path.join(cwd, path.join('/', header.name));
extract.on('entry', function(header, stream, next) {
header = map(header) || header
var name = path.join(cwd, path.join('/', header.name))
if (ignore(name)) {
stream.resume();
return next();
}
if (ignore(name)) {
stream.resume()
return next()
}
var stat = function(err) {
if (err) return next(err);
if (win32) return next();
utimes(name, header, function(err) {
if (err) return next(err);
chperm(name, header, next);
});
};
var stat = function(err) {
if (err) return next(err)
if (win32) return next()
utimes(name, header, function(err) {
if (err) return next(err)
chperm(name, header, next)
})
}
var onlink = function() {
if (win32) return next(); // skip symlinks on win for now before it can be tested
fs.unlink(name, function() {
fs.symlink(header.linkname, name, stat);
});
};
var onlink = function() {
if (win32) return next() // skip symlinks on win for now before it can be tested
fs.unlink(name, function() {
fs.symlink(header.linkname, name, stat)
})
}
var onfile = function() {
var ws = fs.createWriteStream(name);
var onfile = function() {
var ws = fs.createWriteStream(name)
pump(mapStream(stream), ws, function(err) {
if (err) return next(err);
ws.on('close', stat);
});
};
pump(mapStream(stream), ws, function(err) {
if (err) return next(err)
ws.on('close', stat)
})
}
if (header.type === 'directory') {
stack.push([name, header.mtime]);
return mkdirp(name, stat);
}
if (header.type === 'directory') {
stack.push([name, header.mtime])
return mkdirp(name, stat)
}
mkdirp(path.dirname(name), function(err) {
if (err) return next(err);
if (header.type === 'symlink') return onlink();
if (header.type !== 'file') return next(new Error('unsupported type for '+name+' ('+header.type+')'));
mkdirp(path.dirname(name), function(err) {
if (err) return next(err)
if (header.type === 'symlink') return onlink()
if (header.type !== 'file') return next(new Error('unsupported type for '+name+' ('+header.type+')'))
onfile();
});
});
onfile()
})
})
return extract;
};
return extract
}
{
"name": "tar-fs",
"version": "0.5.0",
"version": "0.5.1",
"description": "filesystem bindings for tar-stream",
"repository": "git://github.com:mafintosh/tar-fs.git",
"repository": {
"type": "git",
"url": "git://github.com:mafintosh/tar-fs.git"
},
"dependencies": {
"tar-stream": "~0.4.1",
"pump": "~0.3.0",
"mkdirp": "~0.3.5"
"mkdirp": "^0.5.0",
"pump": "^0.3.5",
"tar-stream": "^0.4.6"
},

@@ -20,8 +23,18 @@ "keywords": [

"devDependencies": {
"tap": "~0.4.6",
"rimraf": "~2.2.5"
"rimraf": "^2.2.8",
"tape": "^3.0.0"
},
"scripts": {
"test": "tap test/index.js"
}
"test": "tape test/index.js"
},
"bugs": {
"url": "https://github.com/mafintosh/tar-fs/issues"
},
"homepage": "https://github.com/mafintosh/tar-fs",
"main": "index.js",
"directories": {
"test": "test"
},
"author": "Mathias Buus",
"license": "MIT"
}

@@ -1,127 +0,127 @@

var test = require('tap').test;
var rimraf = require('rimraf');
var tar = require('../index');
var path = require('path');
var fs = require('fs');
var os = require('os');
var test = require('tape')
var rimraf = require('rimraf')
var tar = require('../index')
var path = require('path')
var fs = require('fs')
var os = require('os')
var win32 = os.platform() === 'win32';
var win32 = os.platform() === 'win32'
test('copy a -> copy/a', function(t) {
t.plan(5);
t.plan(5)
var a = path.join(__dirname, 'fixtures', 'a');
var b = path.join(__dirname, 'fixtures', 'copy', 'a');
var a = path.join(__dirname, 'fixtures', 'a')
var b = path.join(__dirname, 'fixtures', 'copy', 'a')
rimraf.sync(b);
tar.pack(a)
.pipe(tar.extract(b))
.on('finish', function() {
var files = fs.readdirSync(b);
t.same(files.length, 1);
t.same(files[0], 'hello.txt');
var fileB = path.join(b, files[0]);
var fileA = path.join(a, files[0]);
t.same(fs.readFileSync(fileB, 'utf-8'), fs.readFileSync(fileA, 'utf-8'));
t.same(fs.statSync(fileB).mode, fs.statSync(fileA).mode);
t.same(fs.statSync(fileB).mtime.getTime(), fs.statSync(fileA).mtime.getTime());
});
});
rimraf.sync(b)
tar.pack(a)
.pipe(tar.extract(b))
.on('finish', function() {
var files = fs.readdirSync(b)
t.same(files.length, 1)
t.same(files[0], 'hello.txt')
var fileB = path.join(b, files[0])
var fileA = path.join(a, files[0])
t.same(fs.readFileSync(fileB, 'utf-8'), fs.readFileSync(fileA, 'utf-8'))
t.same(fs.statSync(fileB).mode, fs.statSync(fileA).mode)
t.same(fs.statSync(fileB).mtime.getTime(), fs.statSync(fileA).mtime.getTime())
})
})
test('copy b -> copy/b', function(t) {
t.plan(8);
t.plan(8)
var a = path.join(__dirname, 'fixtures', 'b');
var b = path.join(__dirname, 'fixtures', 'copy', 'b');
var a = path.join(__dirname, 'fixtures', 'b')
var b = path.join(__dirname, 'fixtures', 'copy', 'b')
rimraf.sync(b);
tar.pack(a)
.pipe(tar.extract(b))
.on('finish', function() {
var files = fs.readdirSync(b);
t.same(files.length, 1);
t.same(files[0], 'a');
var dirB = path.join(b, files[0]);
var dirA = path.join(a, files[0]);
t.same(fs.statSync(dirB).mode, fs.statSync(dirA).mode);
t.same(fs.statSync(dirB).mtime.getTime(), fs.statSync(dirA).mtime.getTime());
t.ok(fs.statSync(dirB).isDirectory());
var fileB = path.join(dirB, 'test.js');
var fileA = path.join(dirA, 'test.js');
t.same(fs.readFileSync(fileB, 'utf-8'), fs.readFileSync(fileA, 'utf-8'));
t.same(fs.statSync(fileB).mode, fs.statSync(fileA).mode);
t.same(fs.statSync(fileB).mtime.getTime(), fs.statSync(fileA).mtime.getTime());
});
});
rimraf.sync(b)
tar.pack(a)
.pipe(tar.extract(b))
.on('finish', function() {
var files = fs.readdirSync(b)
t.same(files.length, 1)
t.same(files[0], 'a')
var dirB = path.join(b, files[0])
var dirA = path.join(a, files[0])
t.same(fs.statSync(dirB).mode, fs.statSync(dirA).mode)
t.same(fs.statSync(dirB).mtime.getTime(), fs.statSync(dirA).mtime.getTime())
t.ok(fs.statSync(dirB).isDirectory())
var fileB = path.join(dirB, 'test.js')
var fileA = path.join(dirA, 'test.js')
t.same(fs.readFileSync(fileB, 'utf-8'), fs.readFileSync(fileA, 'utf-8'))
t.same(fs.statSync(fileB).mode, fs.statSync(fileA).mode)
t.same(fs.statSync(fileB).mtime.getTime(), fs.statSync(fileA).mtime.getTime())
})
})
test('symlink', function(t) {
if (win32) { // no symlink support on win32 currently. TODO: test if this can be enabled somehow
t.plan(1);
t.ok(true);
return;
}
if (win32) { // no symlink support on win32 currently. TODO: test if this can be enabled somehow
t.plan(1)
t.ok(true)
return
}
t.plan(5);
t.plan(5)
var a = path.join(__dirname, 'fixtures', 'c');
var a = path.join(__dirname, 'fixtures', 'c')
rimraf.sync(path.join(a, 'link'));
fs.symlinkSync('.gitignore', path.join(a, 'link'));
rimraf.sync(path.join(a, 'link'))
fs.symlinkSync('.gitignore', path.join(a, 'link'))
var b = path.join(__dirname, 'fixtures', 'copy', 'c');
var b = path.join(__dirname, 'fixtures', 'copy', 'c')
rimraf.sync(b);
tar.pack(a)
.pipe(tar.extract(b))
.on('finish', function() {
var files = fs.readdirSync(b).sort();
t.same(files.length, 2);
t.same(files[0], '.gitignore');
t.same(files[1], 'link');
rimraf.sync(b)
tar.pack(a)
.pipe(tar.extract(b))
.on('finish', function() {
var files = fs.readdirSync(b).sort()
t.same(files.length, 2)
t.same(files[0], '.gitignore')
t.same(files[1], 'link')
var linkA = path.join(a, 'link');
var linkB = path.join(b, 'link');
var linkA = path.join(a, 'link')
var linkB = path.join(b, 'link')
t.same(fs.lstatSync(linkB).mtime.getTime(), fs.lstatSync(linkA).mtime.getTime());
t.same(fs.readlinkSync(linkB), fs.readlinkSync(linkA));
});
});
t.same(fs.lstatSync(linkB).mtime.getTime(), fs.lstatSync(linkA).mtime.getTime())
t.same(fs.readlinkSync(linkB), fs.readlinkSync(linkA))
})
})
test('strip', function(t) {
t.plan(2)
t.plan(2)
var a = path.join(__dirname, 'fixtures', 'b');
var b = path.join(__dirname, 'fixtures', 'copy', 'b-strip');
var a = path.join(__dirname, 'fixtures', 'b')
var b = path.join(__dirname, 'fixtures', 'copy', 'b-strip')
rimraf.sync(b)
rimraf.sync(b)
tar.pack(a)
.pipe(tar.extract(b, {strip:1}))
.on('finish', function() {
var files = fs.readdirSync(b).sort();
t.same(files.length, 1)
t.same(files[0], 'test.js')
})
tar.pack(a)
.pipe(tar.extract(b, {strip:1}))
.on('finish', function() {
var files = fs.readdirSync(b).sort()
t.same(files.length, 1)
t.same(files[0], 'test.js')
})
})
test('strip + map', function(t) {
t.plan(2)
t.plan(2)
var a = path.join(__dirname, 'fixtures', 'b');
var b = path.join(__dirname, 'fixtures', 'copy', 'b-strip');
var a = path.join(__dirname, 'fixtures', 'b')
var b = path.join(__dirname, 'fixtures', 'copy', 'b-strip')
rimraf.sync(b)
rimraf.sync(b)
var uppercase = function(header) {
header.name = header.name.toUpperCase()
return header
}
var uppercase = function(header) {
header.name = header.name.toUpperCase()
return header
}
tar.pack(a)
.pipe(tar.extract(b, {strip:1, map:uppercase}))
.on('finish', function() {
var files = fs.readdirSync(b).sort();
t.same(files.length, 1)
t.same(files[0], 'TEST.JS')
})
tar.pack(a)
.pipe(tar.extract(b, {strip:1, map:uppercase}))
.on('finish', function() {
var files = fs.readdirSync(b).sort()
t.same(files.length, 1)
t.same(files[0], 'TEST.JS')
})
})
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc