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

compute project state hash from sorted docs/files

Brian Gough 9 лет назад
Родитель
Сommit
90ff58b820

+ 9 - 5
services/web/app/coffee/Features/Compile/ClsiStateManager.coffee

@@ -1,6 +1,7 @@
 Settings = require "settings-sharelatex"
 logger = require "logger-sharelatex"
 crypto = require "crypto"
+ProjectEntityHandler = require "../Project/ProjectEntityHandler"
 
 # The "state" of a project is a hash of the relevant attributes in the
 # project object in this case we only need the rootFolder.
@@ -16,12 +17,15 @@ crypto = require "crypto"
 # The docupdater is responsible for setting the key in redis, and
 # unsetting it if it removes any documents from the doc updater.
 
-buildState = (project) ->
-	json = JSON.stringify(project.rootFolder)
-	return crypto.createHash('sha1').update(json, 'utf8').digest('hex')
+buildState = (s) ->
+	return crypto.createHash('sha1').update(s, 'utf8').digest('hex')
 
 module.exports = ClsiStateManager =
 
 	computeHash: (project, callback = (err, hash) ->) ->
-		hash = buildState(project)
-		callback(null, hash)
+		ProjectEntityHandler.getAllEntitiesFromProject project, (err, docs, files) ->
+			fileList = ("#{f.file._id}:#{f.file.rev}:#{f.file.created}:#{f.path}" for f in files or [])
+			docList = ("#{d.doc._id}:#{d.path}" for d in docs or [])
+			sortedEntityList = [docList..., fileList...].sort()
+			hash = buildState(sortedEntityList.join("\n"))
+			callback(null, hash)

+ 15 - 0
services/web/app/coffee/Features/Project/ProjectEntityHandler.coffee

@@ -77,6 +77,21 @@ module.exports = ProjectEntityHandler =
 		processFolder "/", project.rootFolder[0]
 		callback null, folders
 
+	getAllEntitiesFromProject: (project, callback) ->
+		logger.log project:project, "getting all files for project"
+		@getAllFoldersFromProject project, (err, folders = {}) ->
+			return callback(err) if err?
+			docs = []
+			files = []
+			for folderPath, folder of folders
+				for doc in (folder.docs or [])
+					if doc?
+						docs.push({path: path.join(folderPath, doc.name), doc:doc})
+				for file in (folder.fileRefs or [])
+					if file?
+						files.push({path: path.join(folderPath, file.name), file:file})
+			callback null, docs, files
+
 	getAllDocPathsFromProject: (project, callback) ->
 		logger.log project:project, "getting all docs for project"
 		@getAllFoldersFromProject project, (err, folders = {}) ->