OutputFileFinder.js 2.0 KB

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