Use find -type f to get a list of output files

This commit is contained in:
James Allen
2014-12-09 11:07:58 +00:00
parent 92338ab419
commit ff94a76eb9
3 changed files with 51 additions and 42 deletions

View File

@@ -50,6 +50,7 @@ module.exports = (grunt) ->
unit: unit:
options: options:
reporter: "spec" reporter: "spec"
grep: grunt.option("grep")
src: ["test/unit/js/**/*.js"] src: ["test/unit/js/**/*.js"]
acceptance: acceptance:
options: options:

View File

@@ -1,7 +1,7 @@
async = require "async" async = require "async"
fs = require "fs" fs = require "fs"
Path = require "path" Path = require "path"
wrench = require "wrench" spawn = require("child_process").spawn
module.exports = OutputFileFinder = module.exports = OutputFileFinder =
findOutputFiles: (resources, directory, callback = (error, outputFiles) ->) -> findOutputFiles: (resources, directory, callback = (error, outputFiles) ->) ->
@@ -16,44 +16,37 @@ module.exports = OutputFileFinder =
for file in allFiles for file in allFiles
do (file) -> do (file) ->
jobs.push (callback) -> jobs.push (callback) ->
if incomingResources[file.path] if incomingResources[file]
return callback() return callback()
else else
OutputFileFinder._isDirectory Path.join(directory, file.path), (error, directory) -> outputFiles.push {
return callback(error) if error? path: file
if !directory type: file.match(/\.([^\.]+)$/)?[1]
outputFiles.push file }
callback() callback()
async.series jobs, (error) -> async.series jobs, (error) ->
return callback(error) if error? return callback(error) if error?
callback null, outputFiles callback null, outputFiles
_isDirectory: (path, callback = (error, directory) ->) -> _getAllFiles: (directory, _callback = (error, fileList) ->) ->
fs.stat path, (error, stat) -> callback = (error, fileList) ->
callback error, stat?.isDirectory() _callback(error, fileList)
_getAllFiles: (directory, _callback = (error, outputFiles) ->) ->
callback = (error, outputFiles) ->
_callback(error, outputFiles)
_callback = () -> _callback = () ->
outputFiles = [] proc = spawn("find", [directory, "-type", "f"])
stdout = ""
wrench.readdirRecursive directory, (error, files) => proc.stdout.on "data", (chunk) ->
if error? stdout += chunk.toString()
if error.code == "ENOENT" proc.on "error", callback
# Directory doesn't exist, which is not a problem proc.on "close", (code) ->
return callback(null, []) if code != 0
else error = new Error("find returned non-zero exit code: #{code}")
return callback(error) return callback(error)
# readdirRecursive returns multiple times and finishes with a null response fileList = stdout.trim().split("\n")
if !files? fileList = fileList.map (file) ->
return callback(null, outputFiles) # Strip leading directory
path = Path.relative(directory, file)
for file in files return callback null, fileList
outputFiles.push
path: file
type: file.match(/\.([^\.]+)$/)?[1]

View File

@@ -4,29 +4,25 @@ require('chai').should()
modulePath = require('path').join __dirname, '../../../app/js/OutputFileFinder' modulePath = require('path').join __dirname, '../../../app/js/OutputFileFinder'
path = require "path" path = require "path"
expect = require("chai").expect expect = require("chai").expect
EventEmitter = require("events").EventEmitter
describe "OutputFileFinder", -> describe "OutputFileFinder", ->
beforeEach -> beforeEach ->
@OutputFileFinder = SandboxedModule.require modulePath, requires: @OutputFileFinder = SandboxedModule.require modulePath, requires:
"fs": @fs = {} "fs": @fs = {}
"wrench": @wrench = {} "child_process": spawn: @spawn = sinon.stub()
@directory = "/test/dir" @directory = "/test/dir"
@callback = sinon.stub() @callback = sinon.stub()
describe "findOutputFiles", -> describe "findOutputFiles", ->
beforeEach -> beforeEach ->
@resource_path = "resource/path.tex" @resource_path = "resource/path.tex"
@output_paths = ["output.pdf", "extra", "extra/file.tex"] @output_paths = ["output.pdf", "extra/file.tex"]
@all_paths = @output_paths.concat [@resource_path]
@resources = [ @resources = [
path: @resource_path = "resource/path.tex" path: @resource_path = "resource/path.tex"
] ]
@OutputFileFinder._isDirectory = (dirPath, callback = (error, directory) ->) => @OutputFileFinder._getAllFiles = sinon.stub().callsArgWith(1, null, @all_paths)
callback null, dirPath == path.join(@directory, "extra")
@wrench.readdirRecursive = (dir, callback) =>
callback(null, [@resource_path].concat(@output_paths))
callback(null, null)
sinon.spy @wrench, "readdirRecursive"
@OutputFileFinder.findOutputFiles @resources, @directory, (error, @outputFiles) => @OutputFileFinder.findOutputFiles @resources, @directory, (error, @outputFiles) =>
it "should only return the output files, not directories or resource paths", -> it "should only return the output files, not directories or resource paths", ->
@@ -38,4 +34,23 @@ describe "OutputFileFinder", ->
type: "tex" type: "tex"
}] }]
describe "_getAllFiles", ->
beforeEach ->
@proc = new EventEmitter()
@proc.stdout = new EventEmitter()
@spawn.returns @proc
@directory = "/base/dir"
@OutputFileFinder._getAllFiles @directory, @callback
@proc.stdout.emit(
"data",
["/base/dir/main.tex", "/base/dir/chapters/chapter1.tex"].join("\n") + "\n"
)
@proc.emit "close", 0
it "should call the callback with the relative file paths", ->
@callback.calledWith(
null,
["main.tex", "chapters/chapter1.tex"]
).should.equal true