/*jshint boss: true, rhino: true, unused: true, undef: true, quotmark: double */
|
/*global JSHINT, readFully */
|
|
(function(args) {
|
"use strict";
|
|
var filenames = [];
|
var flags = {};
|
var opts = {};
|
var globals = {};
|
var retval = 0;
|
var readf = (typeof readFully === "function" ? readFully : readFile);
|
|
var optstr; // arg1=val1,arg2=val2,...
|
var predef; // global1=true,global2,global3,...
|
|
args.forEach(function(arg) {
|
if (arg.indexOf("--") === 0) {
|
// Configuration Flags might be boolean or will be split into name and value
|
if (arg.indexOf("=") > -1) {
|
var o = arg.split("=");
|
flags[o[0].slice(2)] = o[1];
|
} else {
|
flags[arg.slice(2)] = true;
|
}
|
|
return;
|
} else if (arg.indexOf("=") > -1) {
|
// usual rhino configuration, like "boss=true,browser=true"
|
if (!optstr) {
|
// First time it's the options.
|
optstr = arg;
|
} else {
|
predef = arg;
|
}
|
|
return;
|
}
|
|
if (optstr) {
|
predef = arg;
|
return;
|
}
|
|
filenames.push(arg);
|
});
|
|
if (filenames.length === 0) {
|
print("Usage: jshint.js file.js");
|
quit(1);
|
}
|
|
// If a config flag has been provided, try and load that
|
if ("config" in flags) {
|
var cfgFileContent;
|
try {
|
cfgFileContent = readf(flags.config);
|
} catch (e) {
|
print("Could not read config file " + flags.config);
|
quit(1);
|
}
|
|
opts = JSON.parse(cfgFileContent);
|
}
|
|
if (optstr) {
|
optstr.split(",").forEach(function(arg) {
|
var o = arg.split("=");
|
if (o[0] === "indent") {
|
opts[o[0]] = parseInt(o[1], 10);
|
} else {
|
opts[o[0]] = (function(ov) {
|
switch (ov) {
|
case "true":
|
return true;
|
case "false":
|
return false;
|
default:
|
return ov;
|
}
|
}(o[1]));
|
}
|
});
|
}
|
|
globals = opts.globals || {};
|
delete(opts.globals);
|
|
if (predef) {
|
predef.split(",").forEach(function(arg) {
|
var global = arg.split("=");
|
globals[global[0]] = global[1] === "true" ? true : false;
|
});
|
}
|
|
filenames.forEach(function(name) {
|
var input = readf(name);
|
|
if (!input) {
|
print("jshint: Couldn't open file " + name);
|
quit(1);
|
}
|
|
if (!JSHINT(input, opts, globals)) {
|
for (var i = 0, err; err = JSHINT.errors[i]; i += 1) {
|
print(err.reason + " (" + name + ":" + err.line + ":" + err.character + ")");
|
print("> " + (err.evidence || "").replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1"));
|
print("");
|
}
|
retval = 2;
|
}
|
});
|
|
quit(retval);
|
}(arguments));
|