From 3135ff2842643cf631cfc1b27fc8304e9641baa7 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Tue, 26 Jul 2016 12:30:29 +0100 Subject: [PATCH] add support for passing additional environment parameters to command runner includes an example of passing environment variables to chktex --- services/clsi/app/coffee/CommandRunner.coffee | 9 +++++++-- services/clsi/app/coffee/CompileManager.coffee | 10 +++++++++- services/clsi/app/coffee/LatexRunner.coffee | 6 +++--- .../clsi/test/unit/coffee/CompileManagerTests.coffee | 2 ++ services/clsi/test/unit/coffee/LatexRunnerTests.coffee | 6 ++++-- 5 files changed, 25 insertions(+), 8 deletions(-) diff --git a/services/clsi/app/coffee/CommandRunner.coffee b/services/clsi/app/coffee/CommandRunner.coffee index 1d0b9e418b..298a495051 100644 --- a/services/clsi/app/coffee/CommandRunner.coffee +++ b/services/clsi/app/coffee/CommandRunner.coffee @@ -4,13 +4,18 @@ logger = require "logger-sharelatex" logger.info "using standard command runner" module.exports = CommandRunner = - run: (project_id, command, directory, image, timeout, callback = (error) ->) -> + run: (project_id, command, directory, image, timeout, environment, callback = (error) ->) -> command = (arg.replace('$COMPILE_DIR', directory) for arg in command) logger.log project_id: project_id, command: command, directory: directory, "running command" logger.warn "timeouts and sandboxing are not enabled with CommandRunner" + # merge environment settings + env = {} + env[key] = value for key, value of process.env + env[key] = value for key, value of environment + # run command as detached process so it has its own process group (which can be killed if needed) - proc = spawn command[0], command.slice(1), stdio: "inherit", cwd: directory, detached: true + proc = spawn command[0], command.slice(1), stdio: "inherit", cwd: directory, detached: true, env: env proc.on "error", (err)-> logger.err err:err, project_id:project_id, command: command, directory: directory, "error running command" diff --git a/services/clsi/app/coffee/CompileManager.coffee b/services/clsi/app/coffee/CompileManager.coffee index 87e8734549..81c2c03975 100644 --- a/services/clsi/app/coffee/CompileManager.coffee +++ b/services/clsi/app/coffee/CompileManager.coffee @@ -41,7 +41,14 @@ module.exports = CompileManager = DraftModeManager.injectDraftMode Path.join(compileDir, request.rootResourcePath), callback else callback() - + + # set up environment variables for chktex + env = {} + if request.chktex? + env['CHKTEX_OPTIONS'] = '-nall -e9 -e10 -e15 -e16 -e27' + if request.chktex is 'error' + env['CHKTEX_EXIT_ON_ERROR'] = 1 + injectDraftModeIfRequired (error) -> return callback(error) if error? timer = new Metrics.Timer("run-compile") @@ -57,6 +64,7 @@ module.exports = CompileManager = compiler: request.compiler timeout: request.timeout image: request.imageName + environment: env }, (error, output, stats, timings) -> # compile was killed by user if error?.terminated diff --git a/services/clsi/app/coffee/LatexRunner.coffee b/services/clsi/app/coffee/LatexRunner.coffee index 8619e9baca..e743cf0174 100644 --- a/services/clsi/app/coffee/LatexRunner.coffee +++ b/services/clsi/app/coffee/LatexRunner.coffee @@ -8,11 +8,11 @@ ProcessTable = {} # table of currently running jobs (pids or docker container n module.exports = LatexRunner = runLatex: (project_id, options, callback = (error) ->) -> - {directory, mainFile, compiler, timeout, image} = options + {directory, mainFile, compiler, timeout, image, environment} = options compiler ||= "pdflatex" timeout ||= 60000 # milliseconds - logger.log directory: directory, compiler: compiler, timeout: timeout, mainFile: mainFile, "starting compile" + logger.log directory: directory, compiler: compiler, timeout: timeout, mainFile: mainFile, environment: environment, "starting compile" # We want to run latexmk on the tex file which we will automatically # generate from the Rtex/Rmd/md file. @@ -34,7 +34,7 @@ module.exports = LatexRunner = id = "#{project_id}" # record running project under this id - ProcessTable[id] = CommandRunner.run project_id, command, directory, image, timeout, (error, output) -> + ProcessTable[id] = CommandRunner.run project_id, command, directory, image, timeout, environment, (error, output) -> delete ProcessTable[id] return callback(error) if error? runs = output?.stderr?.match(/^Run number \d+ of .*latex/mg)?.length or 0 diff --git a/services/clsi/test/unit/coffee/CompileManagerTests.coffee b/services/clsi/test/unit/coffee/CompileManagerTests.coffee index 611ed11b01..62132f89e4 100644 --- a/services/clsi/test/unit/coffee/CompileManagerTests.coffee +++ b/services/clsi/test/unit/coffee/CompileManagerTests.coffee @@ -47,6 +47,7 @@ describe "CompileManager", -> compiler: @compiler = "pdflatex" timeout: @timeout = 42000 imageName: @image = "example.com/image" + @env = {} @Settings.compileDir = "compiles" @compileDir = "#{@Settings.path.compilesDir}/#{@project_id}-#{@user_id}" @ResourceWriter.syncResourcesToDisk = sinon.stub().callsArg(3) @@ -72,6 +73,7 @@ describe "CompileManager", -> compiler: @compiler timeout: @timeout image: @image + environment: @env }) .should.equal true diff --git a/services/clsi/test/unit/coffee/LatexRunnerTests.coffee b/services/clsi/test/unit/coffee/LatexRunnerTests.coffee index ace3d18ab7..c26fa642b2 100644 --- a/services/clsi/test/unit/coffee/LatexRunnerTests.coffee +++ b/services/clsi/test/unit/coffee/LatexRunnerTests.coffee @@ -22,10 +22,11 @@ describe "LatexRunner", -> @image = "example.com/image" @callback = sinon.stub() @project_id = "project-id-123" + @env = {'foo': '123'} describe "runLatex", -> beforeEach -> - @CommandRunner.run = sinon.stub().callsArg(5) + @CommandRunner.run = sinon.stub().callsArg(6) describe "normally", -> beforeEach -> @@ -35,11 +36,12 @@ describe "LatexRunner", -> compiler: @compiler timeout: @timeout = 42000 image: @image + environment: @env @callback it "should run the latex command", -> @CommandRunner.run - .calledWith(@project_id, sinon.match.any, @directory, @image, @timeout) + .calledWith(@project_id, sinon.match.any, @directory, @image, @timeout, @env) .should.equal true describe "with an .Rtex main file", ->