FileSystemImportManager.coffee 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. async = require "async"
  2. fs = require "fs"
  3. _ = require "underscore"
  4. FileTypeManager = require "./FileTypeManager"
  5. EditorController = require "../Editor/EditorController"
  6. ProjectLocator = require "../Project/ProjectLocator"
  7. logger = require "logger-sharelatex"
  8. module.exports = FileSystemImportManager =
  9. addDoc: (project_id, folder_id, name, path, replace, callback = (error, doc)-> )->
  10. fs.readFile path, "utf8", (error, content = "") ->
  11. return callback(error) if error?
  12. content = content.replace(/\r/g, "")
  13. lines = content.split("\n")
  14. EditorController.addDocWithoutLock project_id, folder_id, name, lines, "upload", callback
  15. addFile: (project_id, folder_id, name, path, replace, callback = (error, file)-> )->
  16. logger.log project_id:project_id, folder_id:folder_id, name:name, path:path, replace:replace, "adding file from filesystem"
  17. if replace
  18. ProjectLocator.findElement project_id: project_id, element_id: folder_id, type: "folder", (error, folder) ->
  19. return callback(error) if error?
  20. return callback(new Error("Couldn't find folder")) if !folder?
  21. existingFile = null
  22. for fileRef in folder.fileRefs
  23. if fileRef.name == name
  24. existingFile = fileRef
  25. break
  26. if existingFile?
  27. EditorController.replaceFile project_id, existingFile._id, path, "upload", callback
  28. else
  29. EditorController.addFileWithoutLock project_id, folder_id, name, path, "upload", callback
  30. else
  31. EditorController.addFileWithoutLock project_id, folder_id, name, path, "upload", callback
  32. addFolder: (project_id, folder_id, name, path, replace, callback = (error)-> ) ->
  33. EditorController.addFolderWithoutLock project_id, folder_id, name, "upload", (error, new_folder) =>
  34. return callback(error) if error?
  35. @addFolderContents project_id, new_folder._id, path, replace, (error) ->
  36. return callback(error) if error?
  37. callback null, new_folder
  38. addFolderContents: (project_id, parent_folder_id, folderPath, replace, callback = (error)-> ) ->
  39. fs.readdir folderPath, (error, entries = []) =>
  40. return callback(error) if error?
  41. jobs = _.map entries, (entry) =>
  42. (callback) =>
  43. FileTypeManager.shouldIgnore entry, (error, ignore) =>
  44. return callback(error) if error?
  45. if !ignore
  46. @addEntity project_id, parent_folder_id, entry, "#{folderPath}/#{entry}", replace, callback
  47. else
  48. callback()
  49. async.parallelLimit jobs, 5, callback
  50. addEntity: (project_id, folder_id, name, path, replace, callback = (error, entity)-> ) ->
  51. FileTypeManager.isDirectory path, (error, isDirectory) =>
  52. return callback(error) if error?
  53. if isDirectory
  54. @addFolder project_id, folder_id, name, path, replace, callback
  55. else
  56. FileTypeManager.isBinary name, path, (error, isBinary) =>
  57. return callback(error) if error?
  58. if isBinary
  59. @addFile project_id, folder_id, name, path, replace, callback
  60. else
  61. @addDoc project_id, folder_id, name, path, replace, callback