Просмотр исходного кода

Merge pull request #58 from sharelatex/bg-check-dir-before-synctex

check file exists before running synctex
Brian Gough 9 лет назад
Родитель
Сommit
8d8f441ff8

+ 24 - 7
services/clsi/app/coffee/CompileManager.coffee

@@ -201,16 +201,33 @@ module.exports = CompileManager =
 			logger.log project_id: project_id, user_id:user_id, page: page, h: h, v:v, stdout: stdout, "synctex pdf output"
 			callback null, CompileManager._parseSynctexFromPdfOutput(stdout, base_dir)
 
+	_checkFileExists: (path, callback = (error) ->) ->
+		synctexDir = Path.dirname(path)
+		synctexFile = Path.join(synctexDir, "output.synctex.gz")
+		fs.stat synctexDir, (error, stats) ->
+			if error?.code is 'ENOENT'
+				return callback(new Error("called synctex with no output directory"))
+			return callback(error) if error?
+			fs.stat synctexFile, (error, stats) ->
+				if error?.code is 'ENOENT'
+					return callback(new Error("called synctex with no output file"))
+				return callback(error) if error?
+				return callback(new Error("not a file")) if not stats?.isFile()
+				callback()
+
 	_runSynctex: (args, callback = (error, stdout) ->) ->
 		bin_path = Path.resolve(__dirname + "/../../bin/synctex")
 		seconds = 1000
-		if Settings.clsi?.synctexCommandWrapper?
-			[bin_path, args] = Settings.clsi?.synctexCommandWrapper bin_path, args
-		child_process.execFile bin_path, args, timeout: 10 * seconds, (error, stdout, stderr) ->
-			if error?
-				logger.err err:error, args:args, "error running synctex"
-				return callback(error)
-			callback(null, stdout)
+		outputFilePath = args[1]
+		CompileManager._checkFileExists outputFilePath, (error) ->
+			return callback(error) if error?
+			if Settings.clsi?.synctexCommandWrapper?
+				[bin_path, args] = Settings.clsi?.synctexCommandWrapper bin_path, args
+			child_process.execFile bin_path, args, timeout: 10 * seconds, (error, stdout, stderr) ->
+				if error?
+					logger.err err:error, args:args, "error running synctex"
+					return callback(error)
+				callback(null, stdout)
 
 	_parseSynctexFromCodeOutput: (output) ->
 		results = []

+ 2 - 0
services/clsi/test/unit/coffee/CompileManagerTests.coffee

@@ -192,6 +192,7 @@ describe "CompileManager", ->
 
 		describe "syncFromCode", ->
 			beforeEach ->
+				@fs.stat = sinon.stub().callsArgWith(1, null,{isFile: ()->true})
 				@child_process.execFile.callsArgWith(3, null, @stdout = "NODE\t#{@page}\t#{@h}\t#{@v}\t#{@width}\t#{@height}\n", "")
 				@CompileManager.syncFromCode @project_id, @user_id, @file_name, @line, @column, @callback
 
@@ -216,6 +217,7 @@ describe "CompileManager", ->
 
 		describe "syncFromPdf", ->
 			beforeEach ->
+				@fs.stat = sinon.stub().callsArgWith(1, null,{isFile: ()->true})
 				@child_process.execFile.callsArgWith(3, null, @stdout = "NODE\t#{@Settings.path.compilesDir}/#{@project_id}-#{@user_id}/#{@file_name}\t#{@line}\t#{@column}\n", "")
 				@CompileManager.syncFromPdf @project_id, @user_id, @page, @h, @v, @callback