Skip to content

Commit cb9f0c8

Browse files
erikkempermanphated
authored andcommitted
Update: De-duplicate error handling into file-operations
1 parent 08d33fb commit cb9f0c8

File tree

5 files changed

+99
-36
lines changed

5 files changed

+99
-36
lines changed

lib/dest/write-contents/index.js

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ var writeStream = require('./write-stream');
77
var writeBuffer = require('./write-buffer');
88
var writeSymbolicLink = require('./write-symbolic-link');
99

10+
var fo = require('../../file-operations');
11+
1012
function writeContents(opt) {
1113

1214
function writeFile(file, enc, callback) {
@@ -38,26 +40,13 @@ function writeContents(opt) {
3840
// This is invoked by the various writeXxx modules when they've finished
3941
// writing the contents.
4042
function onWritten(writeErr) {
41-
if (isErrorFatal(writeErr)) {
43+
if (fo.isFatalOverwriteError(writeErr, file.flag)) {
4244
return callback(writeErr);
4345
}
4446

4547
callback(null, file);
4648
}
4749

48-
function isErrorFatal(err) {
49-
if (!err) {
50-
return false;
51-
}
52-
53-
if (err.code === 'EEXIST' && file.flag === 'wx') {
54-
// Handle scenario for file overwrite failures.
55-
return false;
56-
}
57-
58-
// Otherwise, this is a fatal error
59-
return true;
60-
}
6150
}
6251

6352
return through.obj(writeFile);

lib/dest/write-contents/write-symbolic-link.js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,17 @@
22

33
var fs = require('graceful-fs');
44

5+
var fo = require('../../file-operations');
6+
57
function writeSymbolicLink(file, onWritten) {
68
// TODO handle symlinks properly
79
fs.symlink(file.symlink, file.path, function(symlinkErr) {
8-
if (isFatalError(symlinkErr)) {
10+
if (fo.isFatalOverwriteError(symlinkErr)) {
911
return onWritten(symlinkErr);
1012
}
1113

1214
onWritten();
1315
});
1416
}
1517

16-
function isFatalError(err) {
17-
return (err && err.code !== 'EEXIST');
18-
}
19-
2018
module.exports = writeSymbolicLink;

lib/file-operations.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,28 @@ function isValidUnixId(id) {
4242
return true;
4343
}
4444

45+
function isFatalOverwriteError(err, flag) {
46+
if (!err) {
47+
return false;
48+
}
49+
50+
if (err.code === 'EEXIST' && flag === 'wx') {
51+
// Handle scenario for file overwrite failures.
52+
return false;
53+
}
54+
55+
// Otherwise, this is a fatal error
56+
return true;
57+
}
58+
59+
function isFatalUnlinkError(err) {
60+
if (!err || err.code === 'ENOENT') {
61+
return false;
62+
}
63+
64+
return true;
65+
}
66+
4567
function getModeDiff(fsMode, vinylMode) {
4668
var modeDiff = 0;
4769

@@ -441,6 +463,8 @@ function cleanup(callback) {
441463
module.exports = {
442464
closeFd: closeFd,
443465
isValidUnixId: isValidUnixId,
466+
isFatalOverwriteError: isFatalOverwriteError,
467+
isFatalUnlinkError: isFatalUnlinkError,
444468
getModeDiff: getModeDiff,
445469
getTimesDiff: getTimesDiff,
446470
getOwnerDiff: getOwnerDiff,

lib/symlink/index.js

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -60,32 +60,18 @@ function symlink(outFolder, opt) {
6060
}
6161

6262
function onUnlink(unlinkErr) {
63-
if (unlinkErr && unlinkErr.code !== 'ENOENT') {
64-
return callback(unlinkErr);;
63+
if (fo.isFatalUnlinkError(unlinkErr)) {
64+
return callback(unlinkErr);
6565
}
6666
fs.symlink(srcPath, file.path, symType, onSymlink);
6767
}
6868

6969
function onSymlink(symlinkErr) {
70-
if (isErrorFatal(symlinkErr)) {
70+
if (fo.isFatalOverwriteError(symlinkErr, file.flag)) {
7171
return callback(symlinkErr);
7272
}
7373
callback(null, file);
7474
}
75-
76-
function isErrorFatal(err) {
77-
if (!err) {
78-
return false;
79-
}
80-
81-
if (err.code === 'EEXIST' && file.flag === 'wx') {
82-
// Handle scenario for file overwrite failures.
83-
return false;
84-
}
85-
86-
// Otherwise, this is a fatal error
87-
return true;
88-
}
8975
}
9076

9177
var stream = pumpify.obj(

test/file-operations.js

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ var getModeDiff = fo.getModeDiff;
3030
var getTimesDiff = fo.getTimesDiff;
3131
var getOwnerDiff = fo.getOwnerDiff;
3232
var isValidUnixId = fo.isValidUnixId;
33+
var isFatalOverwriteError = fo.isFatalOverwriteError;
34+
var isFatalUnlinkError = fo.isFatalUnlinkError;
3335
var updateMetadata = fo.updateMetadata;
3436
var createWriteStream = fo.createWriteStream;
3537

@@ -170,6 +172,70 @@ describe('isValidUnixId', function() {
170172
});
171173
});
172174

175+
describe('isFatalOverwriteError', function() {
176+
177+
it('returns false if not given any error', function(done) {
178+
var result = isFatalOverwriteError(null);
179+
180+
expect(result).toEqual(false);
181+
182+
done();
183+
});
184+
185+
it('returns true if code != EEXIST', function(done) {
186+
var result = isFatalOverwriteError({ code: 'EOTHER' });
187+
188+
expect(result).toEqual(true);
189+
190+
done();
191+
});
192+
193+
it('returns false if code == EEXIST and flag == wx', function(done) {
194+
var result = isFatalOverwriteError({ code: 'EEXIST' }, 'wx');
195+
196+
expect(result).toEqual(false);
197+
198+
done();
199+
});
200+
201+
it('returns true if error.code == EEXIST and file.flag != wx', function(done) {
202+
var result = isFatalOverwriteError({ code: 'EEXIST' }, 'w');
203+
204+
expect(result).toEqual(true);
205+
206+
done();
207+
});
208+
209+
});
210+
211+
describe('isFatalUnlinkError', function() {
212+
213+
it('returns false if not given any error', function(done) {
214+
var result = isFatalUnlinkError(null);
215+
216+
expect(result).toEqual(false);
217+
218+
done();
219+
});
220+
221+
it('returns false if code == ENOENT', function(done) {
222+
var result = isFatalUnlinkError({ code: 'ENOENT' }, 'wx');
223+
224+
expect(result).toEqual(false);
225+
226+
done();
227+
});
228+
229+
it('returns true if code != ENOENT', function(done) {
230+
var result = isFatalUnlinkError({ code: 'EOTHER' });
231+
232+
expect(result).toEqual(true);
233+
234+
done();
235+
});
236+
237+
});
238+
173239
describe('getModeDiff', function() {
174240

175241
it('returns 0 if both modes are the same', function(done) {

0 commit comments

Comments
 (0)