~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to lib/lp/scripts/utilities/js/jslint-wrapper.js

  • Committer: Launchpad Patch Queue Manager
  • Date: 2011-07-15 20:25:35 UTC
  • mfrom: (13447.1.3 rm-old-tools)
  • Revision ID: launchpad@pqm.canonical.com-20110715202535-mpzonuqa8mdwir8u
[rs=sinzui][no-qa] Removed spidermonkey-bin,
 pocketlint does js linting. Removed windmill utilities that do not
 run since the test layer was removed.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
// Copyright (c) 2008
2
 
// JSLint wrapper.
3
 
//
4
 
// Can be run using Rhino using:
5
 
// rhino -f ../lib/fulljslint.js jslint-wrapper.js ...
6
 
// or Spidermonkey:
7
 
// js -f ../lib/fulljslint.js jslint-wrapper.js ...
8
 
//
9
 
// But Spidermonkey needs special support to emulate readFile.
10
 
 
11
 
// This file assumes the fulljslint.js was loaded.
12
 
if (typeof(JSLINT) == 'undefined') {
13
 
    print('jslint.js: fulljslint.js should be loaded.');
14
 
    quit(1);
15
 
}
16
 
 
17
 
function print_help_and_quit(status) {
18
 
    print('jslint [-o options_file] file.js ...');
19
 
    print('       -h');
20
 
    print('Run linter on all input Javascript files.');
21
 
    print('Options:');
22
 
    print('    -h               Print this help message and exits');
23
 
    print('    --help');
24
 
    print();
25
 
    print('    -o file          Read file as a JSON object specifing options');
26
 
    print('    --options file   to the parser.');
27
 
    quit(status);
28
 
}
29
 
 
30
 
//SpiderMonkey doesn't have a readFile by default.
31
 
//We emulate one by PIPING in the content on STDIN with EOF markers.
32
 
if (typeof(readFile) == 'undefined') {
33
 
    var readFile = function readFile(filename) {
34
 
        var content = '', line = '';
35
 
        while (line != 'EOF') {
36
 
           content += line + '\n';
37
 
           line = readline();
38
 
        }
39
 
        return content;
40
 
    };
41
 
}
42
 
 
43
 
function get_options_file(filename) {
44
 
    try {
45
 
        var input = readFile(filename);
46
 
        if (!input) {
47
 
            print("jslint: Couldn't open options file '" + filename + "'.");
48
 
            quit(1);
49
 
        }
50
 
        return eval("x = " + input);
51
 
    } catch (e) {
52
 
        print("jslint: Error reading options file:");
53
 
        print(e);
54
 
        quit(1);
55
 
    }
56
 
}
57
 
 
58
 
function get_opt(args) {
59
 
    var config = {options: {}, files: []};
60
 
    while (args.length > 0) {
61
 
        var arg = args.shift();
62
 
        switch (arg) {
63
 
        case '-o':
64
 
        case '--options':
65
 
            if (!args.length) {
66
 
                print("jslint: Missing options argument");
67
 
                print_help_and_quit(1);
68
 
            }
69
 
            config.options = get_options_file(args.shift());
70
 
            break;
71
 
        case '-h':
72
 
        case '--help':
73
 
            print_help_and_quit(0);
74
 
            break;
75
 
        default:
76
 
            if (arg[0] == '-') {
77
 
                print('jslint: Unknown option: ' + arg);
78
 
                print_help_and_quit(1);
79
 
            } else {
80
 
                config.files.push(arg);
81
 
            }
82
 
            break;
83
 
        }
84
 
    }
85
 
    config.files.concat(args);
86
 
    return config;
87
 
}
88
 
 
89
 
/* We use our custom reporting instead of JSLint.report() which
90
 
   outputs HTML. */
91
 
function print_implied_names() {
92
 
    /* Report about implied global names. */
93
 
    var implied_names = [], name;
94
 
    for (name in JSLINT.implied) {
95
 
        if (JSLINT.implied.hasOwnPropery(name)) {
96
 
            implied_names.push(name);
97
 
        }
98
 
    }
99
 
 
100
 
    if (implied_names.length > 0 ) {
101
 
        print('Implied globals:');
102
 
        implied_names.sort();
103
 
        print(implied_names.join(', '));
104
 
        print('\n');
105
 
    }
106
 
}
107
 
 
108
 
function print_lint_errors() {
109
 
    /* Report about lint errors. */
110
 
    for (var i=0; i < JSLINT.errors.length; i++) {
111
 
        var error = JSLINT.errors[i];
112
 
        if (!error) {
113
 
            //It seems that this is possible :-(
114
 
            continue;
115
 
        }
116
 
        var line_no = error.line + 1;
117
 
        var char_no = error.character + 1;
118
 
        print(
119
 
            'Line ' + line_no + ' character ' + char_no + ': ' +
120
 
            error.reason);
121
 
        if (error.evidence) {
122
 
            print(error.evidence);
123
 
        }
124
 
        print('\n');
125
 
    }
126
 
}
127
 
 
128
 
function main(args) {
129
 
    config = get_opt(args);
130
 
    if (!config.files.length) {
131
 
        print('jslint: Missing files to lint.');
132
 
        print_help_and_quit();
133
 
    }
134
 
 
135
 
    for (var i=0; i < config.files.length; i++) {
136
 
        var filename = config.files[i];
137
 
        var input = readFile(filename);
138
 
        if (!input) {
139
 
            print("jslint: Couldn't open file '" + filename + "'.");
140
 
            quit(1);
141
 
        }
142
 
        var is_clean = JSLINT(input, config.options);
143
 
        if (!is_clean) {
144
 
            print("jslint: Lint found in '" + filename + "':");
145
 
            print_implied_names();
146
 
            print_lint_errors();
147
 
        } else {
148
 
            print("jslint: No problem found in '" + filename + "'.\n");
149
 
        }
150
 
    }
151
 
}
152
 
 
153
 
main([].slice.apply(arguments));