Use find -type f to get a list of output files
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
@@ -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]
|
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user