mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-21 20:47:08 -05:00
compute project state hash from sorted docs/files
This commit is contained in:
parent
c91599bfeb
commit
90ff58b820
2 changed files with 24 additions and 5 deletions
|
@ -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)
|
||||
|
|
|
@ -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 = {}) ->
|
||||
|
|
Loading…
Reference in a new issue