MDL-67949 grunt: normalise component paths
authorAndrew Nicols <andrew@nicols.co.uk>
Thu, 13 Feb 2020 05:12:20 +0000 (13:12 +0800)
committerAndrew Nicols <andrew@nicols.co.uk>
Tue, 18 Feb 2020 00:10:24 +0000 (08:10 +0800)
Gruntfile.js
GruntfileComponents.js

index 319fc47..3f7185a 100644 (file)
@@ -197,7 +197,9 @@ module.exports = function(grunt) {
         files = grunt.option('files').split(',');
     }
 
-    const inAMD = path.basename(cwd) == 'amd';
+    // If the cwd is the amd directory in the current component then it will be empty.
+    // If the cwd is a child of the component's AMD directory, the relative directory will not start with ..
+    const inAMD = !path.relative(`${componentDirectory}/amd`, cwd).startsWith('..');
 
     // Globbing pattern for matching all AMD JS source files.
     let amdSrc = [];
@@ -248,7 +250,7 @@ module.exports = function(grunt) {
             const nodes = xpath.select("/libraries/library/location/text()", doc);
 
             nodes.forEach(function(node) {
-                let lib = path.join(dirname, node.toString());
+                let lib = path.posix.join(dirname, node.toString());
                 if (grunt.file.isDir(lib)) {
                     // Ensure trailing slash on dirs.
                     lib = lib.replace(/\/?$/, '/');
index 54a431c..74bd9de 100644 (file)
@@ -131,9 +131,11 @@ const getYuiSrcGlobList = relativeTo => {
  */
 const getThirdPartyLibsList = relativeTo => {
     const fs = require('fs');
+    const path = require('path');
 
     return fetchComponentData().pathList
-        .map(componentPath => componentPath.replace(relativeTo, '') + '/thirdpartylibs.xml')
+        .map(componentPath => path.relative(relativeTo, componentPath) + '/thirdpartylibs.xml')
+        .map(componentPath => componentPath.replace(/\\/g, '/'))
         .filter(path => fs.existsSync(path))
         .sort();
 };
@@ -157,7 +159,7 @@ const getComponentFromPath = path => {
 /**
  * Check whether the supplied path, relative to the Gruntfile.js, is in a known component.
  *
- * @param {String} checkPath The path to check
+ * @param {String} checkPath The path to check. This can be with either Windows, or Linux directory separators.
  * @returns {String|null}
  */
 const getOwningComponentDirectory = checkPath => {
@@ -167,10 +169,9 @@ const getOwningComponentDirectory = checkPath => {
     // This ensures that components which are within the directory of another component match first.
     const pathList = Object.keys(fetchComponentData().components).sort().reverse();
     for (const componentPath of pathList) {
-        if (checkPath === componentPath) {
-            return componentPath;
-        }
-        if (checkPath.startsWith(componentPath + path.sep)) {
+        // If the componentPath is the directory being checked, it will be empty.
+        // If the componentPath is a parent of the directory being checked, the relative directory will not start with ..
+        if (!path.relative(componentPath, checkPath).startsWith('..')) {
             return componentPath;
         }
     }