diff --git a/services/web/app/coffee/Features/Compile/ClsiManager.coffee b/services/web/app/coffee/Features/Compile/ClsiManager.coffee index cff2b931b6..c27bc2fe90 100755 --- a/services/web/app/coffee/Features/Compile/ClsiManager.coffee +++ b/services/web/app/coffee/Features/Compile/ClsiManager.coffee @@ -29,7 +29,11 @@ module.exports = ClsiManager = sendRequestOnce: (project_id, user_id, options = {}, callback = (error, status, outputFiles, clsiServerId, validationProblems) ->) -> ClsiManager._buildRequest project_id, options, (error, req) -> - return callback(error) if error? + if error? + if error.message is "no main file specified" + return callback(null, "validation-problems", null, null, {mainFile:error.message}) + else + return callback(error) logger.log project_id: project_id, "sending compile to CLSI" ClsiFormatChecker.checkRecoursesForProblems req.compile?.resources, (err, validationProblems)-> if err? @@ -180,7 +184,7 @@ module.exports = ClsiManager = # present in the docupdater. This allows finaliseRequest to # identify the root doc. possibleRootDocIds = [options.rootDoc_id, project.rootDoc_id] - for rootDoc_id in possibleRootDocIds when rootDoc_id? + for rootDoc_id in possibleRootDocIds when rootDoc_id? and rootDoc_id of docPath path = docPath[rootDoc_id] docs[path] ?= {_id: rootDoc_id, path: path} ClsiManager._finaliseRequest project_id, options, project, docs, [], callback @@ -206,9 +210,12 @@ module.exports = ClsiManager = resources = [] rootResourcePath = null rootResourcePathOverride = null + hasMainFile = false + numberOfDocsInProject = 0 for path, doc of docs path = path.replace(/^\//, "") # Remove leading / + numberOfDocsInProject++ if doc.lines? # add doc to resources unless it is just a stub entry resources.push path: path @@ -217,11 +224,20 @@ module.exports = ClsiManager = rootResourcePath = path if options.rootDoc_id? and doc._id.toString() == options.rootDoc_id.toString() rootResourcePathOverride = path + if path is "main.tex" + hasMainFile = true rootResourcePath = rootResourcePathOverride if rootResourcePathOverride? if !rootResourcePath? - logger.warn {project_id}, "no root document found, setting to main.tex" - rootResourcePath = "main.tex" + if hasMainFile + logger.warn {project_id}, "no root document found, setting to main.tex" + rootResourcePath = "main.tex" + else if numberOfDocsInProject is 1 # only one file, must be the main document + for path, doc of docs + rootResourcePath = path.replace(/^\//, "") # Remove leading / + logger.warn {project_id, rootResourcePath: rootResourcePath}, "no root document found, single document in project" + else + return callback new Error("no main file specified") for path, file of files path = path.replace(/^\//, "") # Remove leading / diff --git a/services/web/app/views/project/editor/pdf.pug b/services/web/app/views/project/editor/pdf.pug index 58b0aa6521..429fa41c6f 100644 --- a/services/web/app/views/project/editor/pdf.pug +++ b/services/web/app/views/project/editor/pdf.pug @@ -317,6 +317,9 @@ div.full-size.pdf(ng-controller="PdfController") div li(ng-repeat="entry in pdf.validation.conflictedPaths") {{ '/'+entry['path'] }} + .alert.alert-danger(ng-show="pdf.validation.mainFile") + strong #{translate("main_file_not_found")} + span #{translate("please_set_main_file")} .pdf-errors(ng-switch-when="errors") diff --git a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee index 640c224e7b..4846837856 100644 --- a/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee +++ b/services/web/public/coffee/ide/pdf/controllers/PdfController.coffee @@ -231,6 +231,7 @@ define [ else if response.status == "validation-problems" $scope.pdf.view = "validation-problems" $scope.pdf.validation = response.validationProblems + $scope.shouldShowLogs = false else if response.status == "compile-in-progress" $scope.pdf.view = 'errors' $scope.pdf.compileInProgress = true diff --git a/services/web/test/UnitTests/coffee/Compile/ClsiManagerTests.coffee b/services/web/test/UnitTests/coffee/Compile/ClsiManagerTests.coffee index 6786c3a1a8..bd02af2f28 100644 --- a/services/web/test/UnitTests/coffee/Compile/ClsiManagerTests.coffee +++ b/services/web/test/UnitTests/coffee/Compile/ClsiManagerTests.coffee @@ -346,7 +346,49 @@ describe "ClsiManager", -> it "should set to main.tex", -> @request.compile.rootResourcePath.should.equal "main.tex" - + + describe "when there is no valid root document and no main.tex document", -> + beforeEach () -> + @project.rootDoc_id = "not-valid" + @docs = { + "/other.tex": @doc_1 = { + name: "other.tex" + _id: "mock-doc-id-1" + lines: ["Hello", "world"] + }, + "/chapters/chapter1.tex": @doc_2 = { + name: "chapter1.tex" + _id: "mock-doc-id-2" + lines: [ + "Chapter 1" + ] + } + } + @ProjectEntityHandler.getAllDocs = sinon.stub().callsArgWith(1, null, @docs) + @ClsiManager._buildRequest @project, null, @callback + + it "should report an error", -> + @callback.calledWith(new Error("no main file specified")).should.equal true + + + describe "when there is no valid root document and a single document which is not main.tex", -> + beforeEach (done) -> + @project.rootDoc_id = "not-valid" + @docs = { + "/other.tex": @doc_1 = { + name: "other.tex" + _id: "mock-doc-id-1" + lines: ["Hello", "world"] + } + } + @ProjectEntityHandler.getAllDocs = sinon.stub().callsArgWith(1, null, @docs) + @ClsiManager._buildRequest @project, null, (@error, @request) => + done() + + it "should set io to the only file", -> + @request.compile.rootResourcePath.should.equal "other.tex" + + describe "with the draft option", -> it "should add the draft option into the request", (done) -> @ClsiManager._buildRequest @project_id, {timeout:100, draft: true}, (error, request) =>