Browse Source

script updates

Steven Silvester 7 years ago
parent
commit
845ddfbc09
5 changed files with 115 additions and 60 deletions
  1. 2 1
      package.json
  2. 58 26
      scripts/ensure-integrity.js
  3. 50 28
      scripts/get-dependency.js
  4. 4 4
      scripts/remove-sibling.js
  5. 1 1
      scripts/update-dependency.js

+ 2 - 1
package.json

@@ -37,6 +37,7 @@
   "dependencies": {},
   "devDependencies": {
     "lerna": "^2.4.0",
-    "npm-run-all": "~4.1.1"
+    "npm-run-all": "~4.1.1",
+    "read-package-json": "~2.0.12"
   }
 }

+ 58 - 26
scripts/ensure-integrity.js

@@ -11,6 +11,8 @@ var glob = require('glob');
 var sortPackageJson = require('sort-package-json');
 var ts = require("typescript");
 var fs = require('fs-extra');
+var getDependency = require('./get-dependency');
+
 
 // Data to ignore.
 var MISSING = {
@@ -37,21 +39,21 @@ function ensurePackage(pkgName) {
   var dname = pkgPaths[pkgName];
   var data = pkgData[pkgName];
   var deps = data.dependencies;
-  var problems = [];
+  var messages = [];
 
   // Verify local dependencies are correct.
   Object.keys(deps).forEach(function(name) {
     if (pkgData[name]) {
       var desired = '^' + pkgData[name].version;
       if (deps[name] !== desired) {
-        problems.push('Invalid core version: ' + name);
+        messages.push('Invalid core version: ' + name);
       }
       data.dependencies[name] = '^' + pkgData[name].version;
     }
   });
 
   if (pkgName == '@jupyterlab/all-packages') {
-    problems = problems.concat(ensureAllPackages());
+    messages = messages.concat(ensureAllPackages());
   }
 
   // For TypeScript files, verify imports match dependencies.
@@ -60,9 +62,9 @@ function ensurePackage(pkgName) {
 
   if (filenames.length == 0) {
     if (ensurePackageData(data, path.join(dname, 'package.json'))) {
-      problems.push('Package data changed');
+      messages.push('Package data changed');
     }
-    return problems;
+    return messages;
   }
 
   var imports = [];
@@ -92,7 +94,8 @@ function ensurePackage(pkgName) {
       return;
     }
     if (!deps[name]) {
-      problems.push('Missing dependency: ' + name);
+      messages.push('Missing dependency: ' + name);
+      deps[name] = getDependency(name);
     }
   });
 
@@ -102,15 +105,15 @@ function ensurePackage(pkgName) {
       return;
     }
     if (names.indexOf(name) === -1) {
-      problems.push('Unused dependency: ' + name);
+      messages.push('Unused dependency: ' + name);
       delete data.dependencies[name]
     }
   });
 
   if (ensurePackageData(data, path.join(dname, 'package.json'))) {
-    problems.push('Package data changed');
+    messages.push('Package data changed');
   }
-  return problems;
+  return messages;
 }
 
 
@@ -129,7 +132,7 @@ function ensureAllPackages() {
   var indexPath = path.join(basePath, 'packages', 'all-packages', 'src', 'index.ts');
   var index = fs.readFileSync(indexPath, 'utf8');
   var lines = index.split('\n').slice(0, 3);
-  var problems = [];
+  var messages = [];
 
   localPackages.forEach(function (pkgPath) {
     if (pkgPath === allPackagesPath) {
@@ -152,21 +155,21 @@ function ensureAllPackages() {
     lines.push('import "' + name + '";\n');
 
     if (!valid) {
-      problems.push('Updated: ' + name);
+      messages.push('Updated: ' + name);
     }
   });
 
   // Write the files.
   if (ensurePackageData(allPackageData, allPackageJson)) {
-    problems.push('Package data changed');
+    messages.push('Package data changed');
   }
   var newIndex = lines.join('\n');
   if (newIndex != index) {
-    problems.push('Index changed');
+    messages.push('Index changed');
     fs.writeFileSync(indexPath, lines.join('\n'));
   }
 
-  return problems;
+  return messages;
 }
 
 
@@ -206,11 +209,39 @@ function ensurePackageData(data, pkgJsonPath) {
 }
 
 
+/**
+ * Ensure the top level package.
+ */
+function ensureTop() {
+  // Hoist dependencies and devDependencies to top level.
+  var localPath = path.join(basePath, 'package.json');
+  var localData = require(localPath);
+  var localPackages = glob.sync(path.join(basePath, 'packages', '*'));
+  localPackages.forEach(function (pkgPath) {
+    var name = pkgNames[pkgPath];
+    var data = pkgData[name];
+    var devDeps = data.dependencies || {};
+    Object.keys(devDeps).forEach(function (name) {
+      localData.devDependencies[name] = deps[name];
+    });
+    if (ensurePackageData(localData, localPath)) {
+      return 'updated';
+    }
+  }
+}
+
+
 /**
  * Ensure the repo integrity.
  */
 function ensureIntegrity() {
-  var errors = {};
+  var messages = {};
+
+  // Handle the top level package.
+  var topMessage = ensureTop();
+  if (topMessage) {
+    messages['top'] = topMessage;
+  }
 
   // Look in all of the packages.
   var lernaConfig = require(path.join(basePath, 'lerna.json'));
@@ -236,24 +267,25 @@ function ensureIntegrity() {
 
   // Validate each package.
   for (let name in pkgData) {
-    var problems = ensurePackage(name);
-    if (problems.length > 0) {
-      errors[name] = problems;
+    var pkgMessages = ensurePackage(name);
+    if (pkgMessages.length > 0) {
+      messages[name] = pkgMessages;
     }
   };
 
-  // Handle any errors.
-  if (Object.keys(errors).length > 0) {
-    console.log('Repo integrity report:')
-    console.log(JSON.stringify(errors, null, 2));
+  // Handle any messages.
+  if (Object.keys(messages).length > 0) {
+    console.log(JSON.stringify(messages, null, 2));
+    if (process.env.TRAVIS_BRANCH) {
+      console.log('\n\nPlease run `npm run integrity` locally and commit the changes');
+    } else {
+      console.log('\n\nPlease commit the changes by running:');
+      console.log('git commit -a -m "Package integrity updates"')
+    }
     process.exit(1);
   } else {
     console.log('Repo integrity verified!');
   }
 }
 
-
-// TODO: hoist dependencies and devDependencies to top level.
-// make sure there are no deps in devDependencies
-
 ensureIntegrity();

+ 50 - 28
scripts/get-dependency.js

@@ -3,42 +3,64 @@ var childProcess = require('child_process');
 var path = require('path');
 var glob = require('glob');
 
-var name = process.argv[2];
+var allDeps = [];
+var allDevDeps = [];
 
 
-// Look in all of the packages.
-var basePath = path.resolve('.');
-var files = glob.sync(path.join(basePath, 'packages/*'));
+/**
+ * Get the appropriate dependency for a given package name.
+ */
+function getDependency(name) {
+  // Look in all of the packages.
+  var basePath = path.resolve('.');
+  var files = glob.sync(path.join(basePath, 'packages/*'));
+  var version = null;
 
-for (var j = 0; j < files.length; j++) {
-// Read in the package.json.
-  var packagePath = path.join(files[j], 'package.json');
-  try {
-    var package = require(packagePath);
-  } catch (e) {
-    console.log('Skipping package ' + packagePath);
-    continue;
-  }
+  for (var j = 0; j < files.length; j++) {
+  // Read in the package.json.
+    var packagePath = path.join(files[j], 'package.json');
+    try {
+      var package = require(packagePath);
+    } catch (e) {
+      console.log('Skipping package ' + packagePath);
+      continue;
+    }
 
-  if (package.name === name) {
-    console.log(package.version);
-    process.exit(0);
-  }
+    if (package.name === name) {
+      version = package.version;
+    }
 
-  var deps = package.dependencies || {};
-  if (package.devDependencies) {
-    for (var key of Object.keys(package.devDependencies)) {
-      deps[key] = package.devDependencies[key];
+    var deps = package.dependencies || {};
+    var devDeps = package.devDependencies || {};
+    if (deps[name]) {
+      allDeps.push(package.name);
+      version = deps[name];
+    }
+    if (devDeps[name]) {
+      allDevDeps.push(package.name);
+      version = devDeps[name];
     }
   }
-  if (deps[name]) {
-    console.log('    ' + '"' + name + '": "' + deps[name] + '"');
-    process.exit(0);
+
+  if (!version) {
+    var cmd = 'npm view ' + name + ' version';
+    version = '~' + String(childProcess.execSync(cmd)).trim();
   }
+
+  return version;
 }
 
-console.log('** Package not yet included!');
+exports = getDependency;
 
-var cmd = 'npm view ' + name + ' version';
-var specifier = childProcess.execSync(cmd);
-console.log('    ' + '"' + name + '": "' + '~' + String(specifier).trim() + '"');
+if (require.main === module) {
+  // Make sure we have required command line arguments.
+  if (process.argv.length < 3) {
+      var msg = '** Must supply a target library name\n';
+      process.stderr.write(msg);
+      process.exit(1);
+  }
+  var version = getDependency(process.argv[2]);
+  console.log('deps: ', allDeps);
+  console.log('devDeps:', allDevDeps);
+  console.log('\n    ' + '"' + name + '": "' + version + '"');
+}

+ 4 - 4
scripts/remove-sibling.js

@@ -24,11 +24,11 @@ var target = process.argv[2];
 var basePath = path.resolve('.');
 
 // Get the package.json of the extension.
-var packagePath = path.join(basePath, 'packages', target);
+var packagePath = path.join(basePath, 'packages', target, 'package.json');
 if (!fs.existsSync(packagePath)) {
-    packagePath = require.resolve(target);
+    packagePath = require.resolve(path.join(target, 'package.json'));
 }
-var package = require(path.join(packagePath, 'package.json'));
+var package = require(packagePath);
 
 // Remove the extension path from packages/all-packages/tsconfig.json
 var tsconfigPath = path.join(basePath, 'packages', 'all-packages', 'tsconfig.json');
@@ -37,7 +37,7 @@ tsconfig.compilerOptions.paths[package.name] = undefined;
 fs.writeFileSync(tsconfigPath, JSON.stringify(tsconfig, null, 2) + '\n');
 
 // Remove the package from the local tree.
-fs.removeSync(packagePath);
+fs.removeSync(path.dirname(packagePath));
 
 // Update the core jupyterlab build dependencies.
 childProcess.execSync('npm run update:core', {stdio:[0,1,2]});

+ 1 - 1
scripts/update-dependency.js

@@ -6,7 +6,7 @@ var childProcess = require('child_process');
 
 // Make sure we have required command line arguments.
 if (process.argv.length < 4) {
-    var msg = '** Must supply a target library and separate version specifier';
+    var msg = '** Must supply a target library and separate version specifier\n';
     process.stderr.write(msg);
     process.exit(1);
 }