diff --git a/lib/utils.js b/lib/utils.js index b31e37a..f5645b9 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -88,6 +88,10 @@ exports.makeUncompressFn = StreamClass => { throw error; } + const strip = opts.strip ? Number(opts.strip) : 0; + // Strip is handled here in makeUncompressFn, so remove it from opts to avoid passing to UncompressStream + delete opts.strip; + return new Promise((resolve, reject) => { fs.mkdir(destDir, { recursive: true }, err => { if (err) return reject(err); @@ -108,8 +112,7 @@ exports.makeUncompressFn = StreamClass => { .on('error', reject) .on('entry', (header, stream, next) => { stream.on('end', next); - const destFilePath = path.join(destDir, header.name); - + const destFilePath = path.join(destDir, stripFileName(strip, header.name, header.type)); if (header.type === 'file') { const dir = path.dirname(destFilePath); fs.mkdir(dir, { recursive: true }, err => { diff --git a/test/tar/index.test.js b/test/tar/index.test.js index 990b611..1bd2249 100644 --- a/test/tar/index.test.js +++ b/test/tar/index.test.js @@ -226,5 +226,28 @@ describe('test/tar/index.test.js', () => { assert(originStat.mode); assert(destStat.mode); }); + + it('tar.uncompress(sourceFile, destDir) with strip 1', async () => { + const sourceFile = path.join(__dirname, '..', 'fixtures', 'xxx.tar'); + const destDir = path.join(os.tmpdir(), uuid.v4()); + const originalDir = path.join(__dirname, '..', 'fixtures', 'xxx'); + await compressing.tar.uncompress(sourceFile, destDir, { strip: 1 }); + const res = dircompare.compareSync(originalDir, destDir); + assert.equal(res.distinct, 0, 'distinct files count mismatch'); + assert.equal(res.equal, 5, 'equal files count mismatch'); + assert(res.totalFiles === 4); + assert(res.totalDirs === 1); + }); + + it('tar.uncompress(sourceFile, destDir) with strip 2', async () => { + const sourceFile = path.join(__dirname, '..', 'fixtures', 'xxx.tar'); + const destDir = path.join(os.tmpdir(), uuid.v4()); + await compressing.tar.uncompress(sourceFile, destDir, { strip: 2 }); + const res = dircompare.compareSync(path.join(__dirname, '..', 'fixtures', 'xxx-strip2'), destDir); + assert.equal(res.distinct, 0); + assert.equal(res.equal, 4); + assert(res.totalFiles === 4); + assert(res.totalDirs === 0); + }); }); }); diff --git a/test/tgz/index.test.js b/test/tgz/index.test.js index 74d01a2..f150c79 100644 --- a/test/tgz/index.test.js +++ b/test/tgz/index.test.js @@ -221,5 +221,28 @@ describe('test/tgz/index.test.js', () => { assert(res.totalFiles === 4); assert(res.totalDirs === 1); }); + + it('tgz.uncompress(sourceFile, destDir) with strip 1', async () => { + const sourceFile = path.join(__dirname, '..', 'fixtures', 'xxx.tgz'); + const destDir = path.join(os.tmpdir(), uuid.v4()); + const originalDir = path.join(__dirname, '..', 'fixtures', 'xxx'); + await compressing.tgz.uncompress(sourceFile, destDir, { strip: 1 }); + const res = dircompare.compareSync(originalDir, destDir); + assert.equal(res.distinct, 0, 'distinct files count mismatch'); + assert.equal(res.equal, 5, 'equal files count mismatch'); + assert(res.totalFiles === 4); + assert(res.totalDirs === 1); + }); + + it('tgz.uncompress(sourceFile, destDir) with strip 2', async () => { + const sourceFile = path.join(__dirname, '..', 'fixtures', 'xxx.tgz'); + const destDir = path.join(os.tmpdir(), uuid.v4()); + await compressing.tgz.uncompress(sourceFile, destDir, { strip: 2 }); + const res = dircompare.compareSync(path.join(__dirname, '..', 'fixtures', 'xxx-strip2'), destDir); + assert.equal(res.distinct, 0); + assert.equal(res.equal, 4); + assert(res.totalFiles === 4); + assert(res.totalDirs === 0); + }); }); }); diff --git a/test/zip/index.test.js b/test/zip/index.test.js index f969b39..7145cc3 100644 --- a/test/zip/index.test.js +++ b/test/zip/index.test.js @@ -288,7 +288,7 @@ describe('test/zip/index.test.js', () => { fs.mkdirSync(destDir, { recursive: true }); await compressing.zip.uncompress(destFile, destDir); const stat = fs.statSync(path.join(destDir, 'bin')); - assert(stat.mode === originStat.mode); + assert.equal(stat.mode, originStat.mode, 'file mode should be same after uncompress'); // console.log(destDir); }); });