From ef04a21dfd33b282c917e7548cc4d0d99171942e Mon Sep 17 00:00:00 2001 From: David Glasser Date: Tue, 30 Jun 2015 01:38:37 -0700 Subject: [PATCH] better error if published source has no handler --- tools/compiler-plugin.js | 18 ++++++++++---- .../.meteor/.gitignore | 1 + .../.meteor/.id | 7 ++++++ .../.meteor/packages | 8 +++++++ .../.meteor/release | 1 + .../packages/local-plugin/package.js | 3 +++ tools/tests/batch-plugins.js | 24 +++++++++++++++++++ 7 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 tools/tests/apps/uses-published-package-with-inactive-source/.meteor/.gitignore create mode 100644 tools/tests/apps/uses-published-package-with-inactive-source/.meteor/.id create mode 100644 tools/tests/apps/uses-published-package-with-inactive-source/.meteor/packages create mode 100644 tools/tests/apps/uses-published-package-with-inactive-source/.meteor/release create mode 100644 tools/tests/apps/uses-published-package-with-inactive-source/packages/local-plugin/package.js diff --git a/tools/compiler-plugin.js b/tools/compiler-plugin.js index 5d1807535e..198d15b19a 100644 --- a/tools/compiler-plugin.js +++ b/tools/compiler-plugin.js @@ -47,6 +47,11 @@ _.extend(exports.CompilerPluginProcessor.prototype, { return new PackageSourceBatch(unibuild, self); }); + // If we failed to match sources with processors, we're done. + if (buildmessage.jobHasMessages()) { + return []; + } + // Find out which files go with which CompilerPlugins. _.each(sourceBatches, function (sourceBatch) { _.each(sourceBatch.resourceSlots, function (resourceSlot) { @@ -384,7 +389,8 @@ var PackageSourceBatch = function (unibuild, processor) { self.processor = processor; var sourceProcessorsByExtension = self._getSourceProcessorsByExtension(); - self.resourceSlots = _.map(unibuild.resources, function (resource) { + self.resourceSlots = []; + unibuild.resources.forEach(function (resource) { var sourceProcessor = null; if (resource.type === "source") { var extension = resource.extension; @@ -394,11 +400,15 @@ var PackageSourceBatch = function (unibuild, processor) { } else if (_.has(sourceProcessorsByExtension, extension)) { sourceProcessor = sourceProcessorsByExtension[extension]; } else { - // XXX BBP better error handling - throw Error("no plugin found for " + JSON.stringify(resource)); + buildmessage.error( + `no plugin found for ${ resource.path } in ` + + `${ unibuild.pkg.displayName() }; a plugin for *.${ extension } ` + + `was active when it was published but none is now`); + return; + // recover by ignoring } } - return new ResourceSlot(resource, sourceProcessor, self); + self.resourceSlots.push(new ResourceSlot(resource, sourceProcessor, self)); }); }; _.extend(PackageSourceBatch.prototype, { diff --git a/tools/tests/apps/uses-published-package-with-inactive-source/.meteor/.gitignore b/tools/tests/apps/uses-published-package-with-inactive-source/.meteor/.gitignore new file mode 100644 index 0000000000..4083037423 --- /dev/null +++ b/tools/tests/apps/uses-published-package-with-inactive-source/.meteor/.gitignore @@ -0,0 +1 @@ +local diff --git a/tools/tests/apps/uses-published-package-with-inactive-source/.meteor/.id b/tools/tests/apps/uses-published-package-with-inactive-source/.meteor/.id new file mode 100644 index 0000000000..b5057e7358 --- /dev/null +++ b/tools/tests/apps/uses-published-package-with-inactive-source/.meteor/.id @@ -0,0 +1,7 @@ +# This file contains a token that is unique to your project. +# Check it into your repository along with the rest of this directory. +# It can be used for purposes such as: +# - ensuring you don't accidentally deploy one app on top of another +# - providing package authors with aggregated statistics + +140b34e2hn59de0acc2 diff --git a/tools/tests/apps/uses-published-package-with-inactive-source/.meteor/packages b/tools/tests/apps/uses-published-package-with-inactive-source/.meteor/packages new file mode 100644 index 0000000000..8636b02649 --- /dev/null +++ b/tools/tests/apps/uses-published-package-with-inactive-source/.meteor/packages @@ -0,0 +1,8 @@ +# Meteor packages used by this project, one per line. +# +# 'meteor add' and 'meteor remove' will edit this file for you, +# but you can also edit it by hand. + +meteor-platform +local-plugin +glasser:use-sourcish@=0.0.1 diff --git a/tools/tests/apps/uses-published-package-with-inactive-source/.meteor/release b/tools/tests/apps/uses-published-package-with-inactive-source/.meteor/release new file mode 100644 index 0000000000..621e94f0ec --- /dev/null +++ b/tools/tests/apps/uses-published-package-with-inactive-source/.meteor/release @@ -0,0 +1 @@ +none diff --git a/tools/tests/apps/uses-published-package-with-inactive-source/packages/local-plugin/package.js b/tools/tests/apps/uses-published-package-with-inactive-source/packages/local-plugin/package.js new file mode 100644 index 0000000000..f7d1455a75 --- /dev/null +++ b/tools/tests/apps/uses-published-package-with-inactive-source/packages/local-plugin/package.js @@ -0,0 +1,3 @@ +Package.describe({ + version: '1.0.0' +}); diff --git a/tools/tests/batch-plugins.js b/tools/tests/batch-plugins.js index a6293fc27a..2ed11b088c 100644 --- a/tools/tests/batch-plugins.js +++ b/tools/tests/batch-plugins.js @@ -216,3 +216,27 @@ selftest.define("compiler plugins - duplicate extension", () => { run.stop(); }); + +// Test error when a source file no longer has an active plugin. +selftest.define("compiler plugins - inactive source", () => { + const s = new Sandbox({ fakeMongo: true }); + + // This app depends on the published package 'glasser:uses-sourcish', and + // contains a local package 'local-plugin'. + // + // glasser:uses-sourcish depends on local-plugin and contains a file + // 'foo.sourcish'. When glasser:uses-sourcish@0.0.1 was published, a local + // copy of 'local-plugin' had a plugin which called registerCompiler for the + // extension '*.sourcish', and so 'foo.sourcish' is in the published isopack + // as a source file. However, the copy of 'local-plugin' currently in the test + // app contains no plugins. So we hit this weird error. + s.createApp('myapp', 'uses-published-package-with-inactive-source'); + s.cd('myapp'); + + let run = startRun(s); + run.match('Errors prevented startup'); + run.match('no plugin found for foo.sourcish in glasser:use-sourcish'); + run.match('none is now'); + + run.stop(); +});