Allow reading empty file from asar archive

This commit is contained in:
deepak1556 2015-03-18 22:16:37 +05:30 committed by Robo
parent 2c0b50a7e9
commit fdc10e4e5f
3 changed files with 40 additions and 15 deletions

View file

@ -3,6 +3,8 @@ child_process = require 'child_process'
path = require 'path'
util = require 'util'
kEmptyBufferLength = 0
# Cache asar archive objects.
cachedArchives = {}
getOrCreateArchive = (p) ->
@ -228,12 +230,17 @@ exports.wrapFsWithAsar = (fs) ->
flag = options.flag || 'r'
encoding = options.encoding
buffer = new Buffer(info.size)
open archive.path, flag, (error, fd) ->
return callback error if error
fs.read fd, buffer, 0, info.size, info.offset, (error) ->
fs.close fd, ->
callback error, if encoding then buffer.toString encoding else buffer
bufferLength = info.size || kEmptyBufferLength
buffer = new Buffer(bufferLength)
if info.size
open archive.path, flag, (error, fd) ->
return callback error if error
fs.read fd, buffer, 0, info.size, info.offset, (error, bytesRead, buf) ->
fs.close fd, ->
callback error, if encoding then buf.toString encoding, 0 ,bytesRead else buf
else
callback null, buffer
openSync = fs.openSync
readFileSync = fs.readFileSync
@ -257,15 +264,20 @@ exports.wrapFsWithAsar = (fs) ->
flag = options.flag || 'r'
encoding = options.encoding
buffer = new Buffer(info.size)
fd = openSync archive.path, flag
try
fs.readSync fd, buffer, 0, info.size, info.offset
catch e
throw e
finally
fs.closeSync fd
if encoding then buffer.toString encoding else buffer
bufferLength = info.size || kEmptyBufferLength
buffer = new Buffer(bufferLength)
if info.size
fd = openSync archive.path, flag
try
bytesRead = fs.readSync fd, buffer, 0, info.size, info.offset
catch e
throw e
finally
fs.closeSync fd
if encoding then buffer.toString encoding, 0, bytesRead else buffer
else
buffer
readdir = fs.readdir
fs.readdir = (p, callback) ->

View file

@ -15,6 +15,12 @@ describe 'asar package', ->
file3 = path.join fixtures, 'asar', 'a.asar', 'file3'
assert.equal fs.readFileSync(file3).toString(), 'file3\n'
it 'reads from a empty file', ->
file = path.join fixtures, 'asar', 'empty.asar', 'file1'
buffer = fs.readFileSync(file)
assert.equal buffer.length, 0
assert.equal buffer.toString(), ''
it 'reads a linked file', ->
p = path.join fixtures, 'asar', 'a.asar', 'link1'
assert.equal fs.readFileSync(p).toString(), 'file1\n'
@ -38,6 +44,13 @@ describe 'asar package', ->
assert.equal String(content), 'file1\n'
done()
it 'reads from a empty file', (done) ->
p = path.join fixtures, 'asar', 'empty.asar', 'file1'
fs.readFile p, (err, content) ->
assert.equal err, null
assert.equal String(content), ''
done()
it 'reads a linked file', (done) ->
p = path.join fixtures, 'asar', 'a.asar', 'link1'
fs.readFile p, (err, content) ->

BIN
spec/fixtures/asar/empty.asar vendored Normal file

Binary file not shown.