diff --git a/index.js b/index.js index 053041b6..90f4a0c7 100644 --- a/index.js +++ b/index.js @@ -127,6 +127,13 @@ ZipStream.prototype.entry = function(source, data, callback) { return; } + var isDirectorySymlink = data.type === 'symlink' && data.name.slice(-1) === "/" && data.linkname.slice(-1) === "/"; + + if (isDirectorySymlink) { + data.name = data.name.slice(0, -1); + data.linkname = data.linkname.slice(0, -1); + } + var entry = new ZipArchiveEntry(data.name); entry.setTime(data.date, this.options.forceLocalTime); @@ -139,7 +146,7 @@ ZipStream.prototype.entry = function(source, data, callback) { } if (data.type === 'symlink' && typeof data.mode !== 'number') { - data.mode = 40960; // 0120000 + data.mode = isDirectorySymlink ? 755 : 40960; // 0120000 } if (typeof data.mode === 'number') { diff --git a/test/pack.js b/test/pack.js index 9f41b341..87aae9f6 100644 --- a/test/pack.js +++ b/test/pack.js @@ -309,9 +309,9 @@ describe('pack', function() { archive.finalize(); }); - it('should support symlink entries', function(done) { + it('should support file symlink entries', function(done) { var archive = new Packer(); - var testStream = fs.createWriteStream('tmp/type-symlink.zip'); + var testStream = fs.createWriteStream('tmp/type-file-symlink.zip'); testStream.on('close', function() { done(); @@ -331,6 +331,26 @@ describe('pack', function() { }); }); + it('should support directory symlink entries', function(done) { + var archive = new Packer(); + var testStream = fs.createWriteStream('tmp/type-dir-symlink.zip'); + + testStream.on('close', function() { + done(); + }); + + archive.pipe(testStream); + + archive.entry(null, { name: 'directory-a/', date: testDate }); + archive.entry('file-a text', { name: 'directory-a/file-a', date: testDate }, function(err) { + if (err) throw err; + archive.entry(null, { type: 'symlink', name: 'directory-b/directory-c/', linkname: '../directory-a/', date: testDate }, function(err) { + if (err) throw err; + archive.finalize(); + }); + }); + }); + }); });