Remove run-command (and "raw" commands)

We never really used the one tool that was built on top of
run-command. And the implementation of "raw" commands was probably
broken by some part of the "remove optimist" refactoring.
This commit is contained in:
David Glasser
2014-02-04 18:13:16 -08:00
parent 42b5b76000
commit 47cf0f476d
3 changed files with 10 additions and 110 deletions

View File

@@ -6,7 +6,6 @@ var files = require('./files.js');
var deploy = require('./deploy.js');
var library = require('./library.js');
var buildmessage = require('./buildmessage.js');
var unipackage = require('./unipackage.js');
var project = require('./project.js');
var warehouse = require('./warehouse.js');
var auth = require('./auth.js');
@@ -1100,72 +1099,6 @@ main.registerCommand({
});
///////////////////////////////////////////////////////////////////////////////
// run-command
///////////////////////////////////////////////////////////////////////////////
main.registerCommand({
name: 'run-command',
hidden: true,
raw: true
}, function (options) {
// This is marked as raw, so we have to do all of our argument
// parsing ourselves. This lets us make sure that the arguments to
// the command being run don't get accidentally intrepreted.
var library = release.current.library;
var argv = process.argv.slice(3);
if (! argv.length || argv[0] === "--help")
throw new main.ShowUsage;
if (! fs.existsSync(argv[0]) ||
! fs.statSync(argv[0]).isDirectory()) {
process.stderr.write(argv[0] + ": not a directory\n");
return 1;
}
// Build and load the package
var world, packageName;
var messages = buildmessage.capture(
{ title: "building the program" }, function () {
// Make the directory visible as a package. Derive the last
// package name from the last component of the directory, and
// bail out if that creates a conflict.
var packageDir = path.resolve(argv[0]);
packageName = path.basename(packageDir) + "-tool";
if (library.get(packageName, false)) {
buildmessage.error("'" + packageName +
"' conflicts with the name " +
"of a package in the library");
}
library.override(packageName, packageDir);
world = unipackage.load({
library: library,
packages: [ packageName ],
release: release.current.name
});
});
if (messages.hasMessages()) {
process.stderr.write(messages.formatMessages());
return 1;
}
if (! ('main' in world[packageName])) {
process.stderr.write("Package does not define a main() function.\n");
return 1;
}
var ret = world[packageName].main(argv.slice(1));
// let exceptions propagate and get printed by node
if (ret === undefined)
ret = 0;
if (typeof ret !== "number")
ret = 1;
ret = +ret; // cast to integer
return ret;
});
///////////////////////////////////////////////////////////////////////////////
// login
///////////////////////////////////////////////////////////////////////////////

View File

@@ -264,19 +264,6 @@ You should never need to use this command. It is intended for use while
debugging the Meteor packaging tools themselves.
>>> run-command
Build and run a command-line tool
Usage: meteor run-command <package directory> [arguments..]
Builds the provided directory as a package, then loads the package and
calls the main() function inside the package. The function will receive
any remaining arguments. The exit status will be the return value of
main() (which is called inside a fiber).
This command is for temporary, internal use, until we have a more mature
system for building standalone command-line programs with Meteor.
>>> login
Log in to your Meteor account
Usage: meteor login [--email] [--galaxy <galaxy.example.com>]

View File

@@ -32,7 +32,6 @@ var Command = function (options) {
options: {},
requiresApp: false,
requiresRelease: true,
raw: false,
hidden: false
}, options);
@@ -135,10 +134,6 @@ main.SpringboardToLatestRelease = function () {};
// just like we always do; it's just that in that one case, instead
// of bailing out with an error we will run your command with
// release.current === null.
// - raw: if true, option parsing is completely skipped (including
// --release and --help). To be activated the command will need to be
// literally the first argument, and it will need to do its own option
// parsing from process.argv.
// - hidden: do not show in command list in help
//
// An error will be printed if an unrecognized option is passed on the
@@ -185,9 +180,6 @@ main.registerCommand = function (options, func) {
nameParts.unshift('--');
}
if (nameParts.length !== 1 && options.raw)
throw new Error("raw mode can't be used with subcommands or --commands");
var target = commands;
while (nameParts.length > 1) {
var part = nameParts.shift();
@@ -304,11 +296,10 @@ var springboard = function (toolsVersion, releaseOverride) {
var cmd = path.join(warehouse.getToolsDir(toolsVersion), 'bin', 'meteor');
if (releaseOverride !== undefined)
// We used to just append --release=<releaseOverride> to the
// arguments, and though that's probably safe in practice, there's
// a lot to worry about: conflicts with other --release options,
// or 'raw' commands that do their own argument parsing. So now we
// use environment variable. #SpringboardEnvironmentVar
// We used to just append --release=<releaseOverride> to the arguments, and
// though that's probably safe in practice, it makes us worry about things
// like other --release options. So now we use an environment
// variable. #SpringboardEnvironmentVar
process.env['METEOR_SPRINGBOARD_RELEASE'] = releaseOverride;
// Now exec; we're not coming back.
@@ -346,21 +337,6 @@ Fiber(function () {
process.exit(1);
}
var commandName = '';
var command = null;
var isRawCommand = false;
var showHelp = false;
// Check to see if it is a "raw" command that handles its own
// argument parsing.
if (process.argv.length > 2 &&
_.has(commands, process.argv[2]) &&
commands[process.argv[2]].raw) {
command = commands[process.argv[2]];
commandName = command.name;
isRawCommand = true;
}
// Parse the arguments.
//
// We must first identify which options are boolean and which take
@@ -644,18 +620,22 @@ Fiber(function () {
}
// Check for the '--help' option.
var showHelp = false;
if (_.has(rawOptions, '--help')) {
showHelp = true;
delete rawOptions['--help'];
}
var commandName = '';
var command = null;
// Check for a command like '--arch' or '--version'. Make sure
// it stands alone. (And this is ignored if you've passed --help.)
if (! command) {
if (! showHelp) {
_.each(commands['--'] || {}, function (value, key) {
var fullName = "--" + key;
if (rawOptions[fullName] && ! showHelp) {
if (rawOptions[fullName]) {
if (rawOptions[fullName].length > 1) {
process.stderr.write("It doesn't make sense to pass " +
fullName + " more than once.\n");