diff --git a/services/web/app/src/Features/ThirdPartyDataStore/UpdateMerger.js b/services/web/app/src/Features/ThirdPartyDataStore/UpdateMerger.js index 5aa2589870..65daa5cbef 100644 --- a/services/web/app/src/Features/ThirdPartyDataStore/UpdateMerger.js +++ b/services/web/app/src/Features/ThirdPartyDataStore/UpdateMerger.js @@ -88,6 +88,7 @@ module.exports = UpdateMerger = { FileTypeManager.getType( path, fsPath, + existingFileType, function (err, { binary, encoding }) { if (err != null) { return callback(err) diff --git a/services/web/app/src/Features/Uploads/FileSystemImportManager.js b/services/web/app/src/Features/Uploads/FileSystemImportManager.js index f4c656a102..41cac0ce4c 100644 --- a/services/web/app/src/Features/Uploads/FileSystemImportManager.js +++ b/services/web/app/src/Features/Uploads/FileSystemImportManager.js @@ -188,7 +188,8 @@ async function importFile(fsPath, projectPath) { const { binary, encoding } = await FileTypeManager.promises.getType( filename, - fsPath + fsPath, + null ) if (binary) { return new FileImport(projectPath, fsPath) diff --git a/services/web/app/src/Features/Uploads/FileTypeManager.js b/services/web/app/src/Features/Uploads/FileTypeManager.js index 971d3d2ed2..3a64a17b2e 100644 --- a/services/web/app/src/Features/Uploads/FileTypeManager.js +++ b/services/web/app/src/Features/Uploads/FileTypeManager.js @@ -43,7 +43,7 @@ const FileTypeManager = { }, // returns charset as understood by fs.readFile, - getType(name, fsPath, callback) { + getType(name, fsPath, existingFileType, callback) { if (!name) { return callback( new Error( @@ -59,7 +59,7 @@ const FileTypeManager = { ) } const basename = Path.basename(name) - if (!_isTextFilename(basename)) { + if (existingFileType !== 'doc' && !_isTextFilename(basename)) { return callback(null, { binary: true }) } diff --git a/services/web/test/unit/src/Uploads/FileTypeManagerTests.js b/services/web/test/unit/src/Uploads/FileTypeManagerTests.js index 268d44403f..5470330bc0 100644 --- a/services/web/test/unit/src/Uploads/FileTypeManagerTests.js +++ b/services/web/test/unit/src/Uploads/FileTypeManagerTests.js @@ -96,6 +96,7 @@ describe('FileTypeManager', function () { this.FileTypeManager.getType( filename, 'utf8.tex', + null, (err, { binary }) => { if (err) { return done(err) @@ -112,6 +113,7 @@ describe('FileTypeManager', function () { this.FileTypeManager.getType( '/file.tex', 'utf8.tex', + null, (err, { binary }) => { if (err) { return done(err) @@ -124,7 +126,7 @@ describe('FileTypeManager', function () { it('should not try to determine the encoding of large files', function (done) { this.stats.size = 2 * 1024 * 1024 // 2Mb - this.FileTypeManager.getType('/file.tex', 'utf8.tex', err => { + this.FileTypeManager.getType('/file.tex', 'utf8.tex', null, err => { if (err) { return done(err) } @@ -137,6 +139,7 @@ describe('FileTypeManager', function () { this.FileTypeManager.getType( '/file.tex', 'utf8.tex', + null, (err, { binary, encoding }) => { if (err) { return done(err) @@ -153,6 +156,7 @@ describe('FileTypeManager', function () { this.FileTypeManager.getType( '/file.tex', 'latin1.tex', + null, (err, { binary, encoding }) => { if (err) { return done(err) @@ -169,6 +173,7 @@ describe('FileTypeManager', function () { this.FileTypeManager.getType( '/file.tex', 'utf16.tex', + null, (err, { binary, encoding }) => { if (err) { return done(err) @@ -185,6 +190,7 @@ describe('FileTypeManager', function () { this.FileTypeManager.getType( '/file.tex', 'latin1-null.tex', + null, (err, { binary }) => { if (err) { return done(err) @@ -199,6 +205,7 @@ describe('FileTypeManager', function () { this.FileTypeManager.getType( '/file.tex', 'utf8-null.tex', + null, (err, { binary }) => { if (err) { return done(err) @@ -213,6 +220,7 @@ describe('FileTypeManager', function () { this.FileTypeManager.getType( '/file.tex', 'utf8-non-bmp.tex', + null, (err, { binary }) => { if (err) { return done(err) @@ -227,6 +235,7 @@ describe('FileTypeManager', function () { this.FileTypeManager.getType( '/file.tex', 'utf8-control-chars.tex', + null, (err, { binary, encoding }) => { if (err) { return done(err) @@ -250,13 +259,14 @@ describe('FileTypeManager', function () { BINARY_FILENAMES.forEach(filename => { it(`should classify ${filename} as binary`, function (done) { this.FileTypeManager.getType( - '/file.tex', - 'utf8.tex', + filename, + 'latin1.tex', // even if the content is not binary + null, (err, { binary }) => { if (err) { return done(err) } - binary.should.equal(false) + binary.should.equal(true) done() } ) @@ -264,7 +274,7 @@ describe('FileTypeManager', function () { }) it('should not try to get the character encoding', function (done) { - this.FileTypeManager.getType('/file.png', 'utf8.tex', err => { + this.FileTypeManager.getType('/file.png', 'utf8.tex', null, err => { if (err) { return done(err) } @@ -272,6 +282,51 @@ describe('FileTypeManager', function () { done() }) }) + + it('should recognise new binary files as binary', function (done) { + this.FileTypeManager.getType( + '/file.py', + 'latin1.tex', + null, + (err, { binary }) => { + if (err) { + return done(err) + } + binary.should.equal(true) + done() + } + ) + }) + + it('should recognise existing binary files as binary', function (done) { + this.FileTypeManager.getType( + '/file.py', + 'latin1.tex', + 'file', + (err, { binary }) => { + if (err) { + return done(err) + } + binary.should.equal(true) + done() + } + ) + }) + + it('should preserve existing non-binary files as non-binary', function (done) { + this.FileTypeManager.getType( + '/file.py', + 'latin1.tex', + 'doc', + (err, { binary }) => { + if (err) { + return done(err) + } + binary.should.equal(false) + done() + } + ) + }) }) })