OutputFileFinder.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. let OutputFileFinder
  2. const async = require('async')
  3. const fs = require('fs')
  4. const Path = require('path')
  5. const { spawn } = require('child_process')
  6. const logger = require('logger-sharelatex')
  7. module.exports = OutputFileFinder = {
  8. findOutputFiles(resources, directory, callback) {
  9. const incomingResources = new Set(
  10. resources.map((resource) => resource.path)
  11. )
  12. return OutputFileFinder._getAllFiles(directory, function (error, allFiles) {
  13. if (allFiles == null) {
  14. allFiles = []
  15. }
  16. if (error) {
  17. logger.err({ err: error }, 'error finding all output files')
  18. return callback(error)
  19. }
  20. const outputFiles = []
  21. for (const file of allFiles) {
  22. if (!incomingResources.has(file)) {
  23. outputFiles.push({
  24. path: file,
  25. type: Path.extname(file).replace(/^\./, '') || undefined
  26. })
  27. }
  28. }
  29. callback(null, outputFiles, allFiles)
  30. })
  31. },
  32. _getAllFiles(directory, _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. return 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. let path
  72. return (path = Path.relative(directory, file))
  73. })
  74. callback(null, fileList)
  75. })
  76. }
  77. }