Merge pull request #208 from overleaf/bg-fix-use-output-dir

fix for exception in "decaff cleanup ResourceStateManager"
This commit is contained in:
Brian Gough 2021-02-01 11:24:19 +00:00 committed by GitHub
commit bad5fd20a8

View file

@ -1,27 +1,10 @@
/* eslint-disable
handle-callback-err,
no-unused-vars,
*/
// TODO: This file was created by bulk-decaffeinate.
// Fix any style issues and re-enable lint.
/*
* decaffeinate suggestions:
* DS101: Remove unnecessary use of Array.from
* DS102: Remove unnecessary code created because of implicit returns
* DS103: Rewrite code to no longer use __guard__
* DS201: Simplify complex destructure assignments
* DS207: Consider shorter variations of null checks
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
let ResourceStateManager
const Path = require('path') const Path = require('path')
const fs = require('fs') const fs = require('fs')
const logger = require('logger-sharelatex') const logger = require('logger-sharelatex')
const settings = require('settings-sharelatex')
const Errors = require('./Errors') const Errors = require('./Errors')
const SafeReader = require('./SafeReader') const SafeReader = require('./SafeReader')
module.exports = ResourceStateManager = { module.exports = {
// The sync state is an identifier which must match for an // The sync state is an identifier which must match for an
// incremental update to be allowed. // incremental update to be allowed.
// //
@ -40,15 +23,12 @@ module.exports = ResourceStateManager = {
SYNC_STATE_MAX_SIZE: 128 * 1024, SYNC_STATE_MAX_SIZE: 128 * 1024,
saveProjectState(state, resources, basePath, callback) { saveProjectState(state, resources, basePath, callback) {
if (callback == null) {
callback = function (error) {}
}
const stateFile = Path.join(basePath, this.SYNC_STATE_FILE) const stateFile = Path.join(basePath, this.SYNC_STATE_FILE)
if (state == null) { if (state == null) {
// remove the file if no state passed in // remove the file if no state passed in
logger.log({ state, basePath }, 'clearing sync state') logger.log({ state, basePath }, 'clearing sync state')
return fs.unlink(stateFile, function (err) { fs.unlink(stateFile, function (err) {
if (err != null && err.code !== 'ENOENT') { if (err && err.code !== 'ENOENT') {
return callback(err) return callback(err)
} else { } else {
return callback() return callback()
@ -56,29 +36,24 @@ module.exports = ResourceStateManager = {
}) })
} else { } else {
logger.log({ state, basePath }, 'writing sync state') logger.log({ state, basePath }, 'writing sync state')
const resourceList = Array.from(resources).map( const resourceList = resources.map((resource) => resource.path)
(resource) => resource.path fs.writeFile(
)
return fs.writeFile(
stateFile, stateFile,
[...Array.from(resourceList), `stateHash:${state}`].join('\n'), [...resourceList, `stateHash:${state}`].join('\n'),
callback callback
) )
} }
}, },
checkProjectStateMatches(state, basePath, callback) { checkProjectStateMatches(state, basePath, callback) {
if (callback == null) {
callback = function (error, resources) {}
}
const stateFile = Path.join(basePath, this.SYNC_STATE_FILE) const stateFile = Path.join(basePath, this.SYNC_STATE_FILE)
const size = this.SYNC_STATE_MAX_SIZE const size = this.SYNC_STATE_MAX_SIZE
return SafeReader.readFile(stateFile, size, 'utf8', function ( SafeReader.readFile(stateFile, size, 'utf8', function (
err, err,
result, result,
bytesRead bytesRead
) { ) {
if (err != null) { if (err) {
return callback(err) return callback(err)
} }
if (bytesRead === size) { if (bytesRead === size) {
@ -87,10 +62,7 @@ module.exports = ResourceStateManager = {
'project state file truncated' 'project state file truncated'
) )
} }
const array = const array = result ? result.toString().split('\n') : []
__guard__(result != null ? result.toString() : undefined, (x) =>
x.split('\n')
) || []
const adjustedLength = Math.max(array.length, 1) const adjustedLength = Math.max(array.length, 1)
const resourceList = array.slice(0, adjustedLength - 1) const resourceList = array.slice(0, adjustedLength - 1)
const oldState = array[adjustedLength - 1] const oldState = array[adjustedLength - 1]
@ -104,36 +76,27 @@ module.exports = ResourceStateManager = {
new Errors.FilesOutOfSyncError('invalid state for incremental update') new Errors.FilesOutOfSyncError('invalid state for incremental update')
) )
} else { } else {
const resources = Array.from(resourceList).map((path) => ({ path })) const resources = resourceList.map((path) => ({ path }))
return callback(null, resources) callback(null, resources)
} }
}) })
}, },
checkResourceFiles(resources, allFiles, basePath, callback) { checkResourceFiles(resources, allFiles, basePath, callback) {
// check the paths are all relative to current directory // check the paths are all relative to current directory
let file const containsRelativePath = (resource) => {
if (callback == null) { const dirs = resource.path.split('/')
callback = function (error) {} return dirs.indexOf('..') !== -1
} }
for (file of Array.from(resources || [])) { if (resources.some(containsRelativePath)) {
for (const dir of Array.from(
__guard__(file != null ? file.path : undefined, (x) => x.split('/'))
)) {
if (dir === '..') {
return callback(new Error('relative path in resource file list')) return callback(new Error('relative path in resource file list'))
} }
}
}
// check if any of the input files are not present in list of files // check if any of the input files are not present in list of files
const seenFile = {} const seenFiles = new Set(allFiles)
for (file of Array.from(allFiles)) { const missingFiles = resources
seenFile[file] = true
}
const missingFiles = Array.from(resources)
.filter((resource) => !seenFile[resource.path])
.map((resource) => resource.path) .map((resource) => resource.path)
if ((missingFiles != null ? missingFiles.length : undefined) > 0) { .filter((path) => !seenFiles.has(path))
if (missingFiles.length > 0) {
logger.err( logger.err(
{ missingFiles, basePath, allFiles, resources }, { missingFiles, basePath, allFiles, resources },
'missing input files for project' 'missing input files for project'
@ -144,13 +107,7 @@ module.exports = ResourceStateManager = {
) )
) )
} else { } else {
return callback() callback()
} }
} }
} }
function __guard__(value, transform) {
return typeof value !== 'undefined' && value !== null
? transform(value)
: undefined
}