OutputFileFinder.js 2.1 KB

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