MDL-67953 grunt: Work around spawn length limits
authorAndrew Nicols <andrew@nicols.co.uk>
Thu, 13 Feb 2020 05:14:49 +0000 (13:14 +0800)
committerAndrew Nicols <andrew@nicols.co.uk>
Thu, 13 Feb 2020 05:29:28 +0000 (13:29 +0800)
Gruntfile.js

index f45c261..5bc57fb 100644 (file)
@@ -251,6 +251,24 @@ module.exports = function(grunt) {
         return libs;
     };
 
+    /**
+     * Get the list of feature files to pass to the gherkin linter.
+     *
+     * @returns {Array}
+     */
+    const getGherkinLintTargets = () => {
+        if (files) {
+            // Specific files were requested. Only check these.
+            return files;
+        }
+
+        if (inComponent) {
+            return [`${runDir}/tests/behat/*.feature`];
+        }
+
+        return ['**/tests/behat/*.feature'];
+    };
+
     // Project configuration.
     grunt.initConfig({
         eslint: {
@@ -366,7 +384,7 @@ module.exports = function(grunt) {
         },
         gherkinlint: {
             options: {
-                files: files ? files : ['**/tests/behat/*.feature'],
+                files: getGherkinLintTargets(),
             }
         },
     });
@@ -484,19 +502,31 @@ module.exports = function(grunt) {
     };
 
     tasks.gherkinlint = function() {
-        var done = this.async(),
-            options = grunt.config('gherkinlint.options');
-
-        var args = grunt.file.expand(options.files);
-        args.unshift(path.normalize(__dirname + '/node_modules/.bin/gherkin-lint'));
-        grunt.util.spawn({
-            cmd: 'node',
-            args: args,
-            opts: {stdio: 'inherit', env: process.env}
-        }, function(error, result, code) {
-            // Propagate the exit code.
-            done(code === 0);
-        });
+        const done = this.async();
+        const options = grunt.config('gherkinlint.options');
+
+        // Grab the gherkin-lint linter and required scaffolding.
+        const linter = require('gherkin-lint/src/linter.js');
+        const featureFinder = require('gherkin-lint/src/feature-finder.js');
+        const configParser = require('gherkin-lint/src/config-parser.js');
+        const formatter = require('gherkin-lint/src/formatters/stylish.js');
+
+        // Run the linter.
+        const results = linter.lint(
+            featureFinder.getFeatureFiles(grunt.file.expand(options.files)),
+            configParser.getConfiguration(configParser.defaultConfigFileName)
+        );
+
+        // Print the results out uncondtionally.
+        formatter.printResults(results);
+
+        // Report on the results.
+        // We exit 1 if there is at least one error, otherwise we exit cleanly.
+        if (results.some(result => result.errors.length > 0)) {
+            done(1);
+        } else {
+            done(0);
+        }
     };
 
     tasks.startup = function() {