Skip to content

Commit d596d88

Browse files
atian25fengmk2
andauthored
feat: support uncompressing symlink (#31)
closes #58 closes #93 --------- Co-authored-by: fengmk2 <[email protected]>
1 parent d17b1ed commit d596d88

19 files changed

+467
-204
lines changed

.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ coverage
44
.vscode
55
test/fixtures/types/*.js
66
test/fixtures/chinese-path-test.zip
7-
yarn.lock
87
.DS_Store
8+
yarn.lock
9+
!test/fixtures/symlink/node_modules

lib/utils.js

+10-1
Original file line numberDiff line numberDiff line change
@@ -118,11 +118,20 @@ exports.makeUncompressFn = StreamClass => {
118118
entryCount++;
119119
pump(stream, fs.createWriteStream(fullpath, { mode: opts.mode || header.mode }), err => {
120120
if (err) return reject(err);
121-
122121
successCount++;
123122
done();
124123
});
125124
});
125+
} else if (header.type === 'symlink') {
126+
// symlink
127+
const src = path.join(destDir, header.name);
128+
const target = path.resolve(path.dirname(src), header.linkname);
129+
entryCount++;
130+
fs.symlink(target, src, err => {
131+
if (err) return reject(err);
132+
successCount++;
133+
stream.resume();
134+
});
126135
} else { // directory
127136
mkdirp(path.join(destDir, header.name), err => {
128137
if (err) return reject(err);

test/fixtures/symlink.tgz

1.7 KB
Binary file not shown.

test/fixtures/symlink/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
./node_modules/_[email protected]@enums/README.md

test/fixtures/symlink/cli

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
node_modules/cli

test/fixtures/symlink/node_modules/[email protected]@enums/History.md

+30
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/fixtures/symlink/node_modules/[email protected]@enums/README.md

+21
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/fixtures/symlink/node_modules/[email protected]@enums/index.js

+59
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/fixtures/symlink/node_modules/[email protected]@enums/package.json

+44
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/fixtures/symlink/node_modules/cli

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/fixtures/symlink/node_modules/enums

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/gzip/index.test.js

+39-23
Original file line numberDiff line numberDiff line change
@@ -6,100 +6,116 @@ const path = require('path');
66
const uuid = require('uuid');
77
const compressing = require('../..');
88
const assert = require('assert');
9+
const isWindows = os.platform() === 'win32';
910

1011
describe('test/gzip/index.test.js', () => {
1112
describe('gzip.compressFile()', () => {
12-
it('gzip.compressFile(file, stream)', function* () {
13+
it('gzip.compressFile(file, stream)', async () => {
1314
const sourceFile = path.join(__dirname, '..', 'fixtures', 'xx.log');
1415
const destFile = path.join(os.tmpdir(), uuid.v4() + '.log.gz');
1516
console.log('destFile', destFile);
1617
const fileStream = fs.createWriteStream(destFile);
17-
yield compressing.gzip.compressFile(sourceFile, fileStream);
18+
await compressing.gzip.compressFile(sourceFile, fileStream);
1819
assert(fs.existsSync(destFile));
1920
});
2021

21-
it('gzip.compressFile(file, destStream) should error if destStream emit error', function* () {
22+
it('gzip.compressFile(file, destStream) should error if destStream emit error', async () => {
2223
const sourceFile = path.join(__dirname, '..', 'fixtures', 'xx.log');
2324
const destFile = path.join(os.tmpdir(), uuid.v4() + '.gz');
2425
const fileStream = fs.createWriteStream(destFile);
2526
setImmediate(() => fileStream.emit('error', new Error('xx')));
2627

2728
let err;
2829
try {
29-
yield compressing.gzip.compressFile(sourceFile, fileStream);
30+
await compressing.gzip.compressFile(sourceFile, fileStream);
3031
} catch (e) {
3132
err = e;
3233
}
3334
assert(err && err.message === 'xx');
3435
});
3536

36-
it('gzip.compressFile(buffer, stream)', function* () {
37+
it('gzip.compressFile(buffer, stream)', async () => {
3738
const sourceFile = path.join(__dirname, '..', 'fixtures', 'xx.log');
3839
const sourceBuffer = fs.readFileSync(sourceFile);
3940
const destFile = path.join(os.tmpdir(), uuid.v4() + '.log.gz');
4041
console.log('destFile', destFile);
4142
const fileStream = fs.createWriteStream(destFile);
42-
yield compressing.gzip.compressFile(sourceBuffer, fileStream);
43+
await compressing.gzip.compressFile(sourceBuffer, fileStream);
4344
assert(fs.existsSync(destFile));
4445
});
4546

46-
it('gzip.compressFile(sourceStream, destStream)', function* () {
47+
it('gzip.compressFile(sourceStream, destStream)', async () => {
4748
const sourceFile = path.join(__dirname, '..', 'fixtures', 'xx.log');
4849
const sourceStream = fs.createReadStream(sourceFile);
4950
const destFile = path.join(os.tmpdir(), uuid.v4() + '.log.gz');
5051
console.log('destFile', destFile);
5152
const fileStream = fs.createWriteStream(destFile);
52-
yield compressing.gzip.compressFile(sourceStream, fileStream);
53+
await compressing.gzip.compressFile(sourceStream, fileStream);
5354
assert(fs.existsSync(destFile));
5455
});
5556
});
5657

5758
describe('gzip.uncompress()', () => {
58-
it('gzip.uncompress(sourceFile, destStream)', function* () {
59+
it('gzip.uncompress(sourceFile, destStream)', async () => {
5960
const sourceFile = path.join(__dirname, '..', 'fixtures', 'xx.log.gz');
6061
const originalFile = path.join(__dirname, '..', 'fixtures', 'xx.log');
6162
const destFile = path.join(os.tmpdir(), uuid.v4() + '.log');
6263
const fileStream = fs.createWriteStream(destFile);
63-
yield compressing.gzip.uncompress(sourceFile, fileStream);
64+
await compressing.gzip.uncompress(sourceFile, fileStream);
6465
assert(fs.existsSync(destFile));
65-
assert(fs.readFileSync(destFile, 'utf8') === fs.readFileSync(originalFile, 'utf8'));
66+
if (!isWindows) {
67+
// EOL not equal to linux
68+
assert(fs.readFileSync(destFile, 'utf8') === fs.readFileSync(originalFile, 'utf8'));
69+
}
6670
});
6771

68-
it('gzip.uncompress(sourceStream, destStream)', function* () {
72+
it('gzip.uncompress(sourceStream, destStream)', async () => {
6973
const sourceStream = fs.createReadStream(path.join(__dirname, '..', 'fixtures', 'xx.log.gz'));
7074
const originalFile = path.join(__dirname, '..', 'fixtures', 'xx.log');
7175
const destFile = path.join(os.tmpdir(), uuid.v4() + '.log');
7276
const fileStream = fs.createWriteStream(destFile);
73-
yield compressing.gzip.uncompress(sourceStream, fileStream);
77+
await compressing.gzip.uncompress(sourceStream, fileStream);
7478
assert(fs.existsSync(destFile));
75-
assert(fs.readFileSync(destFile, 'utf8') === fs.readFileSync(originalFile, 'utf8'));
79+
if (!isWindows) {
80+
// EOL not equal to linux
81+
assert(fs.readFileSync(destFile, 'utf8') === fs.readFileSync(originalFile, 'utf8'));
82+
}
7683
});
7784

78-
it('gzip.uncompress(sourceStream, destFile)', function* () {
85+
it('gzip.uncompress(sourceStream, destFile)', async () => {
7986
const sourceStream = fs.createReadStream(path.join(__dirname, '..', 'fixtures', 'xx.log.gz'));
8087
const originalFile = path.join(__dirname, '..', 'fixtures', 'xx.log');
8188
const destFile = path.join(os.tmpdir(), uuid.v4() + '.log');
82-
yield compressing.gzip.uncompress(sourceStream, destFile);
89+
await compressing.gzip.uncompress(sourceStream, destFile);
8390
assert(fs.existsSync(destFile));
84-
assert(fs.readFileSync(destFile, 'utf8') === fs.readFileSync(originalFile, 'utf8'));
91+
if (!isWindows) {
92+
// EOL not equal to linux
93+
assert(fs.readFileSync(destFile, 'utf8') === fs.readFileSync(originalFile, 'utf8'));
94+
}
8595
});
8696

87-
it('gzip.uncompress(sourceFile, destFile)', function* () {
97+
it('gzip.uncompress(sourceFile, destFile)', async () => {
8898
const sourceFile = path.join(__dirname, '..', 'fixtures', 'xx.log.gz');
8999
const originalFile = path.join(__dirname, '..', 'fixtures', 'xx.log');
90100
const destFile = path.join(os.tmpdir(), uuid.v4() + '.log');
91-
yield compressing.gzip.uncompress(sourceFile, destFile);
101+
await compressing.gzip.uncompress(sourceFile, destFile);
92102
assert(fs.existsSync(destFile));
93-
assert(fs.readFileSync(destFile, 'utf8') === fs.readFileSync(originalFile, 'utf8'));
103+
if (!isWindows) {
104+
// EOL not equal to linux
105+
assert(fs.readFileSync(destFile, 'utf8') === fs.readFileSync(originalFile, 'utf8'));
106+
}
94107
});
95108

96-
it('gzip.uncompress(buffer, destFile)', function* () {
109+
it('gzip.uncompress(buffer, destFile)', async () => {
97110
const sourceBuffer = fs.readFileSync(path.join(__dirname, '..', 'fixtures', 'xx.log.gz'));
98111
const originalFile = path.join(__dirname, '..', 'fixtures', 'xx.log');
99112
const destFile = path.join(os.tmpdir(), uuid.v4() + '.log');
100-
yield compressing.gzip.uncompress(sourceBuffer, destFile);
113+
await compressing.gzip.uncompress(sourceBuffer, destFile);
101114
assert(fs.existsSync(destFile));
102-
assert(fs.readFileSync(destFile, 'utf8') === fs.readFileSync(originalFile, 'utf8'));
115+
if (!isWindows) {
116+
// EOL not equal to linux
117+
assert(fs.readFileSync(destFile, 'utf8') === fs.readFileSync(originalFile, 'utf8'));
118+
}
103119
});
104120
});
105121
});

0 commit comments

Comments
 (0)