Просмотр исходного кода

fallback check for missing files

dot files are not examined by OutputFileFinder, so do an extra check to
make sure those exist

also check for any relative paths in the resources
Brian Gough 9 лет назад
Родитель
Сommit
81e8243827
1 измененных файлов с 24 добавлено и 6 удалено
  1. 24 6
      services/clsi/app/coffee/ResourceStateManager.coffee

+ 24 - 6
services/clsi/app/coffee/ResourceStateManager.coffee

@@ -4,6 +4,7 @@ logger = require "logger-sharelatex"
 settings = require("settings-sharelatex")
 Errors = require "./Errors"
 SafeReader = require "./SafeReader"
+async = require "async"
 
 module.exports = ResourceStateManager =
 
@@ -50,14 +51,31 @@ module.exports = ResourceStateManager =
 				resources = ({path: path} for path in resourceList)
 				callback(null, resources)
 
-	checkResourceFiles: (resources, allFiles, directory, callback = (error) ->) ->
+	checkResourceFiles: (resources, allFiles, basePath, callback = (error) ->) ->
+		# check the paths are all relative to current directory
+		for file in resources or []
+			for dir in file?.path?.split('/')
+				if dir == '..'
+					return callback new Error("relative path in resource file list")
 		# check if any of the input files are not present in list of files
 		seenFile = {}
 		for file in allFiles
 			seenFile[file] = true
-		missingFiles = (resource.path for resource in resources when not seenFile[resource.path])
-		if missingFiles.length > 0
-			logger.err missingFiles:missingFiles, dir:directory, allFiles:allFiles, resources:resources, "missing input files for project"
-			return callback new Errors.FilesOutOfSyncError("resource files missing in incremental update")
+		missingFileCandidates = (resource.path for resource in resources when not seenFile[resource.path])
+		# now check if they are really missing
+		ResourceStateManager._checkMissingFiles missingFileCandidates, basePath, (missingFiles) ->
+			if missingFiles?.length > 0
+				logger.err missingFiles:missingFiles, basePath:basePath, allFiles:allFiles, resources:resources, "missing input files for project"
+				return callback new Errors.FilesOutOfSyncError("resource files missing in incremental update")
+			else
+				callback()
+
+	_checkMissingFiles: (missingFileCandidates, basePath, callback = (missingFiles) ->) ->
+		if missingFileCandidates.length > 0
+			fileDoesNotExist = (file, cb) ->
+				fs.stat Path.join(basePath, file), (err) ->
+					logger.log file:file, err:err, result: err?, "stating potential missing file"
+					cb(err?)
+			async.filterSeries missingFileCandidates, fileDoesNotExist, callback
 		else
-			callback()
+			callback([])