OutputFileFinder.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. let OutputFileFinder
  2. const Path = require('path')
  3. const _ = require('lodash')
  4. const { spawn } = require('child_process')
  5. const logger = require('logger-sharelatex')
  6. module.exports = OutputFileFinder = {
  7. findOutputFiles(resources, directory, callback) {
  8. const incomingResources = new Set(resources.map(resource => resource.path))
  9. OutputFileFinder._getAllFiles(directory, function (error, allFiles) {
  10. if (allFiles == null) {
  11. allFiles = []
  12. }
  13. if (error) {
  14. logger.err({ err: error }, 'error finding all output files')
  15. return callback(error)
  16. }
  17. const outputFiles = []
  18. for (const file of allFiles) {
  19. if (!incomingResources.has(file)) {
  20. outputFiles.push({
  21. path: file,
  22. type: Path.extname(file).replace(/^\./, '') || undefined,
  23. })
  24. }
  25. }
  26. callback(null, outputFiles, allFiles)
  27. })
  28. },
  29. _getAllFiles(directory, callback) {
  30. callback = _.once(callback)
  31. // don't include clsi-specific files/directories in the output list
  32. const EXCLUDE_DIRS = [
  33. '-name',
  34. '.cache',
  35. '-o',
  36. '-name',
  37. '.archive',
  38. '-o',
  39. '-name',
  40. '.project-*',
  41. ]
  42. const args = [
  43. directory,
  44. '(',
  45. ...EXCLUDE_DIRS,
  46. ')',
  47. '-prune',
  48. '-o',
  49. '-type',
  50. 'f',
  51. '-print',
  52. ]
  53. logger.log({ args }, 'running find command')
  54. const proc = spawn('find', args)
  55. let stdout = ''
  56. proc.stdout.setEncoding('utf8').on('data', chunk => (stdout += chunk))
  57. proc.on('error', callback)
  58. proc.on('close', function (code) {
  59. if (code !== 0) {
  60. logger.warn(
  61. { directory, code },
  62. "find returned error, directory likely doesn't exist"
  63. )
  64. return callback(null, [])
  65. }
  66. let fileList = stdout.trim().split('\n')
  67. fileList = fileList.map(function (file) {
  68. // Strip leading directory
  69. return Path.relative(directory, file)
  70. })
  71. callback(null, fileList)
  72. })
  73. },
  74. }