Skip to content

Commit 4b60513

Browse files
committed
fix(preprocessor): retry if fs.readFile fails
1 parent 2a847c2 commit 4b60513

2 files changed

Lines changed: 62 additions & 4 deletions

File tree

lib/preprocessor.js

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,19 @@ var createPreprocessor = function (config, basePath, injector) {
7575

7676
return function preprocess (file, done) {
7777
patterns = Object.keys(config)
78-
79-
return fs.readFile(file.originalPath, function (err, buffer) {
78+
var retryCount = 0
79+
var maxRetries = 3
80+
function handleFile (err, buffer) {
8081
if (err) {
81-
throw err
82+
log.warn(err)
83+
if (retryCount < maxRetries) {
84+
retryCount++
85+
log.warn('retrying ' + retryCount)
86+
fs.readFile(file.originalPath, handleFile)
87+
return
88+
} else {
89+
done()
90+
}
8291
}
8392

8493
isBinaryFile(buffer, buffer.length, function (err, thisFileIsBinary) {
@@ -121,7 +130,8 @@ var createPreprocessor = function (config, basePath, injector) {
121130

122131
nextPreprocessor(null, thisFileIsBinary ? buffer : buffer.toString())
123132
})
124-
})
133+
}
134+
return fs.readFile(file.originalPath, handleFile)
125135
}
126136
}
127137
createPreprocessor.$inject = ['config.preprocessors', 'config.basePath', 'injector']

test/unit/preprocessor.spec.js

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,54 @@ describe('preprocessor', () => {
229229
})
230230
})
231231

232+
describe('when fs.readFile fails', () => {
233+
var file = {originalPath: '/some/a.js', path: 'path'}
234+
var getReadFileCallback = (nthCall) => {
235+
return mockFs.readFile.args[nthCall][1]
236+
}
237+
238+
beforeEach(() => {
239+
sinon.stub(mockFs, 'readFile')
240+
})
241+
242+
it('should retry up to 3 times', (done) => {
243+
var fakePreprocessor = sinon.spy((content, file, done) => {
244+
done(null, content)
245+
})
246+
247+
var injector = new di.Injector([{
248+
'preprocessor:fake': ['factory', () => fakePreprocessor]
249+
}, emitterSetting])
250+
251+
var pp = m.createPreprocessor({'**/*.js': ['fake']}, null, injector)
252+
253+
pp(file, () => {
254+
expect(fakePreprocessor).to.have.been.called
255+
done()
256+
})
257+
getReadFileCallback(0)('error')
258+
getReadFileCallback(1)('error')
259+
var thirdCallback = getReadFileCallback(2)
260+
mockFs.readFile.restore()
261+
thirdCallback('error')
262+
})
263+
264+
it('should abort after 3 retries', (done) => {
265+
var injector = new di.Injector([{}, emitterSetting])
266+
267+
var pp = m.createPreprocessor({'**/*.js': []}, null, injector)
268+
269+
pp(file, () => {
270+
done()
271+
})
272+
273+
getReadFileCallback(0)('error')
274+
getReadFileCallback(1)('error')
275+
getReadFileCallback(2)('error')
276+
getReadFileCallback(3)('error')
277+
})
278+
})
279+
232280
it('should not preprocess binary files', (done) => {
233281
var fakePreprocessor = sinon.spy((content, file, done) => {
234282
done(null, content)

0 commit comments

Comments
 (0)