jruby-lint 0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. data/.gitignore +5 -0
  2. data/Gemfile +12 -0
  3. data/Guardfile +12 -0
  4. data/History.txt +4 -0
  5. data/README.md +62 -0
  6. data/Rakefile +24 -0
  7. data/bin/jrlint +5 -0
  8. data/jruby-lint.gemspec +38 -0
  9. data/lib/jruby/lint.rb +19 -0
  10. data/lib/jruby/lint/ast.rb +56 -0
  11. data/lib/jruby/lint/checkers.rb +24 -0
  12. data/lib/jruby/lint/checkers/fork_exec.rb +47 -0
  13. data/lib/jruby/lint/checkers/gem.rb +45 -0
  14. data/lib/jruby/lint/checkers/gemspec.rb +41 -0
  15. data/lib/jruby/lint/checkers/object_space.rb +25 -0
  16. data/lib/jruby/lint/checkers/thread_critical.rb +26 -0
  17. data/lib/jruby/lint/cli.rb +61 -0
  18. data/lib/jruby/lint/collectors.rb +75 -0
  19. data/lib/jruby/lint/collectors/bundler.rb +9 -0
  20. data/lib/jruby/lint/collectors/gemspec.rb +9 -0
  21. data/lib/jruby/lint/collectors/rake.rb +9 -0
  22. data/lib/jruby/lint/collectors/ruby.rb +14 -0
  23. data/lib/jruby/lint/finding.rb +15 -0
  24. data/lib/jruby/lint/github.crt +76 -0
  25. data/lib/jruby/lint/libraries.rb +107 -0
  26. data/lib/jruby/lint/project.rb +56 -0
  27. data/lib/jruby/lint/reporters.rb +35 -0
  28. data/lib/jruby/lint/version.rb +5 -0
  29. data/spec/fixtures/C-Extension-Alternatives.html +557 -0
  30. data/spec/jruby/lint/ast_spec.rb +23 -0
  31. data/spec/jruby/lint/checkers_spec.rb +135 -0
  32. data/spec/jruby/lint/cli_spec.rb +66 -0
  33. data/spec/jruby/lint/collectors_spec.rb +34 -0
  34. data/spec/jruby/lint/finding_spec.rb +31 -0
  35. data/spec/jruby/lint/libraries_spec.rb +56 -0
  36. data/spec/jruby/lint/project_spec.rb +77 -0
  37. data/spec/jruby/lint/reporters_spec.rb +42 -0
  38. data/spec/jruby/lint/version_spec.rb +6 -0
  39. data/spec/spec_helper.rb +30 -0
  40. metadata +194 -0
@@ -0,0 +1,35 @@
1
+ require 'term/ansicolor'
2
+
3
+ module JRuby::Lint
4
+ module Reporters
5
+ class Text
6
+ def initialize(project, output)
7
+ @tags, @output = project.tags, output
8
+ end
9
+
10
+ def report(findings)
11
+ findings.each do |finding|
12
+ puts finding unless (@tags & finding.tags).empty?
13
+ end
14
+ end
15
+
16
+ def puts(finding)
17
+ @output.puts finding.to_s
18
+ end
19
+ end
20
+
21
+ class ANSIColor < Text
22
+ include Term::ANSIColor
23
+ def puts(finding)
24
+ msg = if finding.tags.include?("error")
25
+ red(finding.to_s)
26
+ elsif finding.tags.include?("warning")
27
+ yellow(finding.to_s)
28
+ else
29
+ finding.to_s
30
+ end
31
+ @output.puts msg
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,5 @@
1
+ module JRuby
2
+ module Lint
3
+ VERSION = "0.1"
4
+ end
5
+ end
@@ -0,0 +1,557 @@
1
+
2
+
3
+
4
+
5
+
6
+ <!DOCTYPE html>
7
+ <html>
8
+ <head>
9
+ <meta charset='utf-8'>
10
+ <meta http-equiv="X-UA-Compatible" content="chrome=1">
11
+ <title>C Extension Alternatives - GitHub</title>
12
+ <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub" />
13
+ <link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub" />
14
+
15
+ <link href="https://d3nwyuy0nl342s.cloudfront.net/ba26f6a198e5e881573c321692d2255635b24eb8/stylesheets/bundle_github.css" media="screen" rel="stylesheet" type="text/css" />
16
+
17
+
18
+ <script type="text/javascript">
19
+ if (typeof console == "undefined" || typeof console.log == "undefined")
20
+ console = { log: function() {} }
21
+ </script>
22
+ <script type="text/javascript" charset="utf-8">
23
+ var GitHub = {
24
+ assetHost: 'https://d3nwyuy0nl342s.cloudfront.net'
25
+ }
26
+ var github_user = null
27
+
28
+ </script>
29
+ <script src="https://d3nwyuy0nl342s.cloudfront.net/ba26f6a198e5e881573c321692d2255635b24eb8/javascripts/jquery/jquery-1.4.2.min.js" type="text/javascript"></script>
30
+ <script src="https://d3nwyuy0nl342s.cloudfront.net/ba26f6a198e5e881573c321692d2255635b24eb8/javascripts/bundle_common.js" type="text/javascript"></script>
31
+ <script src="https://d3nwyuy0nl342s.cloudfront.net/ba26f6a198e5e881573c321692d2255635b24eb8/javascripts/bundle_github.js" type="text/javascript"></script>
32
+
33
+
34
+
35
+ <script type="text/javascript" charset="utf-8">
36
+ GitHub.spy({
37
+ repo: "jruby/jruby"
38
+ })
39
+ </script>
40
+
41
+
42
+ <link href="https://github.com/jruby/jruby/commits/master.atom" rel="alternate" title="Recent Commits to jruby:master" type="application/atom+xml" />
43
+ <script src="https://d3nwyuy0nl342s.cloudfront.net/ba26f6a198e5e881573c321692d2255635b24eb8/javascripts/bundle_wiki.js" type="text/javascript"></script>
44
+
45
+ <script src="/javascripts/other/MathJax/MathJax.js" type="text/javascript">
46
+ if (window.location.protocol == "https:") {
47
+ MathJax.OutputJax.fontDir = "https://" + document.location.host + "/assets/MathJax/fonts"
48
+ } else {
49
+ MathJax.OutputJax.fontDir = "http://" + document.location.host + "/assets/MathJax/fonts"
50
+ }
51
+ MathJax.Hub.Config({
52
+ jax: ["input/TeX", "output/HTML-CSS"]
53
+ })
54
+ </script>
55
+
56
+ <meta name="description" content="jruby - JRuby, an implementation of Ruby on the JVM" />
57
+ <script type="text/javascript">
58
+ GitHub.nameWithOwner = GitHub.nameWithOwner || "jruby/jruby";
59
+ GitHub.currentRef = 'master';
60
+ GitHub.commitSHA = "21565774f8800b3df6f839505365d340b573f253";
61
+ GitHub.currentPath = '';
62
+ GitHub.masterBranch = "master";
63
+
64
+
65
+ </script>
66
+
67
+
68
+ <script type="text/javascript">
69
+ var _gaq = _gaq || [];
70
+ _gaq.push(['_setAccount', 'UA-3769691-2']);
71
+ _gaq.push(['_setDomainName', 'none']);
72
+ _gaq.push(['_trackPageview']);
73
+ _gaq.push(['_trackPageLoadTime']);
74
+ (function() {
75
+ var ga = document.createElement('script');
76
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
77
+ ga.setAttribute('async', 'true');
78
+ document.documentElement.firstChild.appendChild(ga);
79
+ })();
80
+ </script>
81
+
82
+
83
+ </head>
84
+
85
+
86
+
87
+ <body class="logged_out env-production">
88
+
89
+
90
+
91
+
92
+
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+ <div class="subnavd" id="main">
101
+ <div id="header" class="true">
102
+
103
+ <a class="logo boring" href="https://github.com">
104
+ <img alt="github" class="default" src="https://d3nwyuy0nl342s.cloudfront.net/images/modules/header/logov3.png" />
105
+ <!--[if (gt IE 8)|!(IE)]><!-->
106
+ <img alt="github" class="hover" src="https://d3nwyuy0nl342s.cloudfront.net/images/modules/header/logov3-hover.png" />
107
+ <!--<![endif]-->
108
+ </a>
109
+
110
+
111
+ <div class="topsearch">
112
+
113
+ <ul class="nav logged_out">
114
+ <li class="pricing"><a href="/plans">Pricing and Signup</a></li>
115
+ <li class="explore"><a href="/explore">Explore GitHub</a></li>
116
+ <li class="features"><a href="/features">Features</a></li>
117
+ <li class="blog"><a href="/blog">Blog</a></li>
118
+ <li class="login"><a href="/login?return_to=%2Fjruby%2Fjruby%2Fwiki%2FC-Extension-Alternatives">Login</a></li>
119
+ </ul>
120
+
121
+ </div>
122
+
123
+ </div>
124
+
125
+
126
+
127
+
128
+ <div class="site">
129
+ <div class="pagehead repohead vis-public emptyrepohead shortdetails instapaper_ignore readability-menu">
130
+
131
+
132
+
133
+ <div class="title-actions-bar">
134
+ <h1>
135
+ <a href="/jruby">jruby</a> / <strong><a href="/jruby/jruby">jruby</a></strong>
136
+
137
+
138
+ </h1>
139
+
140
+
141
+ <ul class="actions">
142
+
143
+
144
+
145
+ <li class="for-owner" style="display:none"><a href="/jruby/jruby/admin" class="minibutton btn-admin "><span><span class="icon"></span>Admin</span></a></li>
146
+ <li>
147
+ <a href="/jruby/jruby/toggle_watch" class="minibutton btn-watch " id="watch_button" onclick="var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href;var s = document.createElement('input'); s.setAttribute('type', 'hidden'); s.setAttribute('name', 'authenticity_token'); s.setAttribute('value', 'f0cc17b027c2396c32ee54c98c3537e3299e335c'); f.appendChild(s);f.submit();return false;" style="display:none"><span><span class="icon"></span>Watch</span></a>
148
+ <a href="/jruby/jruby/toggle_watch" class="minibutton btn-watch " id="unwatch_button" onclick="var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href;var s = document.createElement('input'); s.setAttribute('type', 'hidden'); s.setAttribute('name', 'authenticity_token'); s.setAttribute('value', 'f0cc17b027c2396c32ee54c98c3537e3299e335c'); f.appendChild(s);f.submit();return false;" style="display:none"><span><span class="icon"></span>Unwatch</span></a>
149
+ </li>
150
+
151
+
152
+ <li class="for-notforked" style="display:none"><a href="/jruby/jruby/fork" class="minibutton btn-fork " id="fork_button" onclick="var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href;var s = document.createElement('input'); s.setAttribute('type', 'hidden'); s.setAttribute('name', 'authenticity_token'); s.setAttribute('value', 'f0cc17b027c2396c32ee54c98c3537e3299e335c'); f.appendChild(s);f.submit();return false;"><span><span class="icon"></span>Fork</span></a></li>
153
+ <li class="for-hasfork" style="display:none"><a href="#" class="minibutton btn-fork " id="your_fork_button"><span><span class="icon"></span>Your Fork</span></a></li>
154
+
155
+
156
+
157
+
158
+
159
+
160
+
161
+ <li class="repostats">
162
+ <ul class="repo-stats">
163
+ <li class="watchers"><a href="/jruby/jruby/watchers" title="Watchers" class="tooltipped downwards">497</a></li>
164
+ <li class="forks"><a href="/jruby/jruby/network" title="Forks" class="tooltipped downwards">109</a></li>
165
+ </ul>
166
+ </li>
167
+ </ul>
168
+
169
+ </div>
170
+
171
+
172
+ <ul class="tabs">
173
+ <li><a href="/jruby/jruby" highlight="repo_source">Source</a></li>
174
+ <li><a href="/jruby/jruby/commits/master" highlight="repo_commits">Commits</a></li>
175
+ <li><a href="/jruby/jruby/network" highlight="repo_network">Network</a></li>
176
+ <li><a href="/jruby/jruby/pulls" highlight="repo_pulls">Pull Requests (5)</a></li>
177
+
178
+
179
+
180
+
181
+
182
+ <li><a href="/jruby/jruby/wiki" class="selected" highlight="repo_wiki">Wiki (117)</a></li>
183
+
184
+ <li><a href="/jruby/jruby/graphs" highlight="repo_graphs">Graphs</a></li>
185
+
186
+ <li class="contextswitch nochoices">
187
+ <span class="toggle leftwards" >
188
+ <em>Branch:</em>
189
+ <code>master</code>
190
+ </span>
191
+ </li>
192
+ </ul>
193
+
194
+ <div style="display:none" id="pl-description"><p><em class="placeholder">click here to add a description</em></p></div>
195
+ <div style="display:none" id="pl-homepage"><p><em class="placeholder">click here to add a homepage</em></p></div>
196
+
197
+
198
+
199
+
200
+
201
+
202
+
203
+ <div class="subnav-bar">
204
+ <ul>
205
+ <li><a href="/jruby/jruby/wiki">Home</a></li>
206
+ <li><a href="/jruby/jruby/wiki/_pages">Pages</a></li>
207
+ <li><a href="/jruby/jruby/wiki/_history">Wiki History</a></li>
208
+ <li><a href="/jruby/jruby/wiki/_access">Git Access</a></li>
209
+ </ul>
210
+ </div>
211
+
212
+
213
+
214
+
215
+
216
+
217
+
218
+ </div><!-- /.pagehead -->
219
+
220
+
221
+
222
+ <div id="repos">
223
+
224
+
225
+
226
+ <script type="text/javascript">
227
+ GitHub.downloadRepo = '/jruby/jruby/archives/master'
228
+ GitHub.revType = "master"
229
+
230
+ GitHub.repoName = "jruby"
231
+ GitHub.controllerName = "wiki"
232
+ GitHub.actionName = "show"
233
+ GitHub.currentAction = "wiki#show"
234
+
235
+
236
+ GitHub.loggedIn = false
237
+
238
+
239
+
240
+ </script>
241
+
242
+
243
+
244
+
245
+
246
+
247
+ </div>
248
+ <div class="flash-messages"></div>
249
+
250
+
251
+ <div id="wiki-wrapper" class="page">
252
+ <div id="head">
253
+ <h1 class="instapaper_title">C Extension Alternatives</h1>
254
+ <ul class="actions readability-extra">
255
+ <li class="gollum-minibutton"><a href="/jruby/jruby/wiki/C-Extension-Alternatives/_history"
256
+ class="action-page-history">
257
+ Page History
258
+ </a></li>
259
+ </ul>
260
+ </div>
261
+ <div id="wiki-content">
262
+ <div class="wrap">
263
+ <div id="wiki-body" class="gollum-markdown-content instapaper_body">
264
+ <div id="template">
265
+ <p>JRuby versions prior to 1.6 did not support Ruby C extensions, and even in 1.6 the support is still "in development" and considered experimental. This page lists common C extensions and non-C alternatives you can use to replace them.</p>
266
+
267
+ <ul>
268
+ <li><p><strong><a href="https://github.com/rtomayko/rdiscount">RDiscount</a></strong> - Use <a href="https://github.com/nex3/maruku">Maruku</a> (pure Ruby) or <a href="https://github.com/nate/markdown_j">markdown_j</a> (wrapper around a Java library)</p></li>
269
+ <li><p><strong><a href="https://github.com/rmagick/rmagick">RMagick</a></strong> - Try <a href="https://github.com/Serabe/RMagick4J">RMagick4J</a> (implements ImageMagick functionality in Java) or preferably use alternatives <a href="https://github.com/probablycorey/mini_magick">mini_magick</a> &amp; <a href="https://github.com/aseldawy/quick_magick">quick_magick</a>. For simple resizing, cropping, greyscaling, etc look at <a href="https://github.com/jruby/image_voodoo">image_voodoo</a>.</p></li>
270
+ <li><p><strong><a href="http://unicorn.bogomips.org/">Unicorn</a></strong> - Try any one of the following <a class="internal present" href="/jruby/jruby/wiki/Servers">JRuby-based servers</a>: <a href="https://github.com/trinidad/trinidad">Trinidad</a>, <a href="https://github.com/matadon/mizuno">Mizuno</a>, <a href="https://github.com/strobecorp/kirk">Kirk</a> or <a href="http://torquebox.org/">TorqueBox</a>.</p></li>
271
+ <li><p><strong><a href="http://code.macournoyer.com/thin/">Thin</a></strong> - Thin might compile and run but is not recommended. Try any one of the following <a class="internal present" href="/jruby/jruby/wiki/Servers">JRuby-based servers</a>: <a href="https://github.com/trinidad/trinidad">Trinidad</a>, <a href="https://github.com/matadon/mizuno">Mizuno</a>, <a href="https://github.com/strobecorp/kirk">Kirk</a> or <a href="http://torquebox.org/">TorqueBox</a>.</p></li>
272
+ <li><p><strong><a href="https://github.com/dbalatero/typhoeus">Typhoeus</a></strong> - The C extension <a href="https://github.com/dbalatero/typhoeus/issues/65">doesn't currently compile</a>. There's no equivalent library for JRuby, but you might try any of the pure-Ruby HTTP clients (<code>net/http</code>, httpclient, etc.). There are also several Java HTTP client libraries that will work (<a href="http://hc.apache.org/httpcomponents-client-ga/">Apache HttpClient</a>, <a href="http://download.oracle.com/javase/1,5.0/docs/api/java/net/HttpURLConnection.html">HttpURLConnection</a>, etc).</p></li>
273
+ <li><p><strong>mysql</strong> - Use <a href="https://github.com/nicksieger/activerecord-jdbc-adapter">activerecord-jdbc-adapter</a> instead along with <code>jdbc-mysql</code>.</p></li>
274
+ <li><p><strong>mysql2</strong> - Use <a href="https://github.com/nicksieger/activerecord-jdbc-adapter">activerecord-jdbc-adapter</a> instead along with <code>jdbc-mysql</code>.</p></li>
275
+ <li><p><strong>sqlite3</strong> - Use <a href="https://github.com/nicksieger/activerecord-jdbc-adapter">activerecord-jdbc-adapter</a> instead along with <code>jdbc-sqlite3</code>.</p></li>
276
+ <li><p><strong><a href="http://nokogiri.org/">Nokogiri</a></strong> - For best results, use the pure-Java version of Nokogiri (1.5 or greater).</p></li>
277
+ <li><p><strong><a href="https://github.com/brianmario/yajl-ruby">yajl-ruby</a></strong> - Try <code>json</code> or <code>json_pure</code> instead. Unfortunately there is no known equivalent JSON stream parser.</p></li>
278
+ <li><p><strong><a href="https://github.com/mongodb/mongo-ruby-driver">bson_ext</a></strong> - <code>bson_ext</code> isn't used with JRuby. Instead, some native Java extensions are bundled with the <code>bson</code> gem.</p></li>
279
+ <li><p><strong><a href="http://www.ruby-doc.org/stdlib/libdoc/win32ole/rdoc/index.html">win32ole</a></strong> - Use the <code>jruby-win32ole</code> gem (preinstalled in JRuby's Windows installer).</p></li>
280
+ </ul><p>Please add to this list with your findings.</p>
281
+
282
+ <p><em>Note that the <a href="https://github.com/jruby/jruby-lint">JRuby-Lint</a> gem parses the contents of the list above to use for its Ruby gem checker. In order for JRuby-Lint to use the information, please adhere to the <code>gem_name - instructions</code> format.</em></p>
283
+ </div>
284
+ </div>
285
+
286
+
287
+ </div>
288
+
289
+ </div>
290
+ <div id="gollum-footer">
291
+ <p id="last-edit">
292
+ Last edited by headius, <abbr class="relatize" title="2011-05-15 17:25:54">Sun May 15 17:25:54 -0700 2011</abbr>
293
+ </p>
294
+ <p id="delete-link">
295
+ <a href="/jruby/jruby/wiki/C-Extension-Alternatives" onclick="if (confirm('Are you sure you want to delete this page?')) { var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href;var m = document.createElement('input'); m.setAttribute('type', 'hidden'); m.setAttribute('name', '_method'); m.setAttribute('value', 'delete'); f.appendChild(m);var s = document.createElement('input'); s.setAttribute('type', 'hidden'); s.setAttribute('name', 'authenticity_token'); s.setAttribute('value', 'f0cc17b027c2396c32ee54c98c3537e3299e335c'); f.appendChild(s);f.submit(); };return false;"><span>Delete this Page</span></a>
296
+ </p>
297
+ </div>
298
+ </div>
299
+
300
+
301
+ </div>
302
+
303
+
304
+ </div>
305
+
306
+ <div id="footer" class="clearfix">
307
+ <div class="site">
308
+ <div class="sponsor">
309
+ <a href="http://www.rackspace.com" class="logo">
310
+ <img alt="Dedicated Server" height="36" src="https://d3nwyuy0nl342s.cloudfront.net/images/modules/footer/rackspace_logo.png?v2" width="38" />
311
+ </a>
312
+ Powered by the <a href="http://www.rackspace.com ">Dedicated
313
+ Servers</a> and<br/> <a href="http://www.rackspacecloud.com">Cloud
314
+ Computing</a> of Rackspace Hosting<span>&reg;</span>
315
+ </div>
316
+
317
+ <ul class="links">
318
+ <li class="blog"><a href="https://github.com/blog">Blog</a></li>
319
+ <li><a href="https://github.com/contact">Support</a></li>
320
+ <li><a href="https://github.com/training">Training</a></li>
321
+ <li><a href="http://jobs.github.com">Job Board</a></li>
322
+ <li><a href="http://shop.github.com">Shop</a></li>
323
+ <li><a href="https://github.com/contact">Contact</a></li>
324
+ <li><a href="http://developer.github.com">API</a></li>
325
+ <li><a href="http://status.github.com">Status</a></li>
326
+ </ul>
327
+ <ul class="sosueme">
328
+ <li class="main">&copy; 2011 <span id="_rrt" title="0.40823s from fe4.rs.github.com">GitHub</span> Inc. All rights reserved.</li>
329
+ <li><a href="/site/terms">Terms of Service</a></li>
330
+ <li><a href="/site/privacy">Privacy</a></li>
331
+ <li><a href="https://github.com/security">Security</a></li>
332
+ </ul>
333
+ </div>
334
+ </div><!-- /#footer -->
335
+
336
+ <script>window._auth_token = "f0cc17b027c2396c32ee54c98c3537e3299e335c"</script>
337
+
338
+
339
+ <div id="keyboard_shortcuts_pane" class="instapaper_ignore readability-extra" style="display:none">
340
+ <h2>Keyboard Shortcuts <small><a href="#" class="js-see-all-keyboard-shortcuts">(see all)</a></small></h2>
341
+
342
+ <div class="columns threecols">
343
+ <div class="column first">
344
+ <h3>Site wide shortcuts</h3>
345
+ <dl class="keyboard-mappings">
346
+ <dt>s</dt>
347
+ <dd>Focus site search</dd>
348
+ </dl>
349
+ <dl class="keyboard-mappings">
350
+ <dt>?</dt>
351
+ <dd>Bring up this help dialog</dd>
352
+ </dl>
353
+ </div><!-- /.column.first -->
354
+
355
+ <div class="column middle" style='display:none'>
356
+ <h3>Commit list</h3>
357
+ <dl class="keyboard-mappings">
358
+ <dt>j</dt>
359
+ <dd>Move selected down</dd>
360
+ </dl>
361
+ <dl class="keyboard-mappings">
362
+ <dt>k</dt>
363
+ <dd>Move selected up</dd>
364
+ </dl>
365
+ <dl class="keyboard-mappings">
366
+ <dt>t</dt>
367
+ <dd>Open tree</dd>
368
+ </dl>
369
+ <dl class="keyboard-mappings">
370
+ <dt>p</dt>
371
+ <dd>Open parent</dd>
372
+ </dl>
373
+ <dl class="keyboard-mappings">
374
+ <dt>c <em>or</em> o <em>or</em> enter</dt>
375
+ <dd>Open commit</dd>
376
+ </dl>
377
+ <dl class="keyboard-mappings">
378
+ <dt>y</dt>
379
+ <dd>Expand URL to its canonical form</dd>
380
+ </dl>
381
+ </div><!-- /.column.first -->
382
+
383
+ <div class="column last" style='display:none'>
384
+ <h3>Pull request list</h3>
385
+ <dl class="keyboard-mappings">
386
+ <dt>j</dt>
387
+ <dd>Move selected down</dd>
388
+ </dl>
389
+ <dl class="keyboard-mappings">
390
+ <dt>k</dt>
391
+ <dd>Move selected up</dd>
392
+ </dl>
393
+ <dl class="keyboard-mappings">
394
+ <dt>o <em>or</em> enter</dt>
395
+ <dd>Open issue</dd>
396
+ </dl>
397
+ </div><!-- /.columns.last -->
398
+
399
+ </div><!-- /.columns.equacols -->
400
+
401
+ <div style='display:none'>
402
+ <div class="rule"></div>
403
+
404
+ <h3>Issues</h3>
405
+
406
+ <div class="columns threecols">
407
+ <div class="column first">
408
+ <dl class="keyboard-mappings">
409
+ <dt>j</dt>
410
+ <dd>Move selected down</dd>
411
+ </dl>
412
+ <dl class="keyboard-mappings">
413
+ <dt>k</dt>
414
+ <dd>Move selected up</dd>
415
+ </dl>
416
+ <dl class="keyboard-mappings">
417
+ <dt>x</dt>
418
+ <dd>Toggle select target</dd>
419
+ </dl>
420
+ <dl class="keyboard-mappings">
421
+ <dt>o <em>or</em> enter</dt>
422
+ <dd>Open issue</dd>
423
+ </dl>
424
+ </div><!-- /.column.first -->
425
+ <div class="column middle">
426
+ <dl class="keyboard-mappings">
427
+ <dt>I</dt>
428
+ <dd>Mark selected as read</dd>
429
+ </dl>
430
+ <dl class="keyboard-mappings">
431
+ <dt>U</dt>
432
+ <dd>Mark selected as unread</dd>
433
+ </dl>
434
+ <dl class="keyboard-mappings">
435
+ <dt>e</dt>
436
+ <dd>Close selected</dd>
437
+ </dl>
438
+ <dl class="keyboard-mappings">
439
+ <dt>y</dt>
440
+ <dd>Remove selected from view</dd>
441
+ </dl>
442
+ </div><!-- /.column.middle -->
443
+ <div class="column last">
444
+ <dl class="keyboard-mappings">
445
+ <dt>c</dt>
446
+ <dd>Create issue</dd>
447
+ </dl>
448
+ <dl class="keyboard-mappings">
449
+ <dt>l</dt>
450
+ <dd>Create label</dd>
451
+ </dl>
452
+ <dl class="keyboard-mappings">
453
+ <dt>i</dt>
454
+ <dd>Back to inbox</dd>
455
+ </dl>
456
+ <dl class="keyboard-mappings">
457
+ <dt>u</dt>
458
+ <dd>Back to issues</dd>
459
+ </dl>
460
+ <dl class="keyboard-mappings">
461
+ <dt>/</dt>
462
+ <dd>Focus issues search</dd>
463
+ </dl>
464
+ </div>
465
+ </div>
466
+ </div>
467
+
468
+ <div style='display:none'>
469
+ <div class="rule"></div>
470
+
471
+ <h3>Network Graph</h3>
472
+ <div class="columns equacols">
473
+ <div class="column first">
474
+ <dl class="keyboard-mappings">
475
+ <dt><span class="badmono">←</span> <em>or</em> h</dt>
476
+ <dd>Scroll left</dd>
477
+ </dl>
478
+ <dl class="keyboard-mappings">
479
+ <dt><span class="badmono">→</span> <em>or</em> l</dt>
480
+ <dd>Scroll right</dd>
481
+ </dl>
482
+ <dl class="keyboard-mappings">
483
+ <dt><span class="badmono">↑</span> <em>or</em> k</dt>
484
+ <dd>Scroll up</dd>
485
+ </dl>
486
+ <dl class="keyboard-mappings">
487
+ <dt><span class="badmono">↓</span> <em>or</em> j</dt>
488
+ <dd>Scroll down</dd>
489
+ </dl>
490
+ <dl class="keyboard-mappings">
491
+ <dt>t</dt>
492
+ <dd>Toggle visibility of head labels</dd>
493
+ </dl>
494
+ </div><!-- /.column.first -->
495
+ <div class="column last">
496
+ <dl class="keyboard-mappings">
497
+ <dt>shift <span class="badmono">←</span> <em>or</em> shift h</dt>
498
+ <dd>Scroll all the way left</dd>
499
+ </dl>
500
+ <dl class="keyboard-mappings">
501
+ <dt>shift <span class="badmono">→</span> <em>or</em> shift l</dt>
502
+ <dd>Scroll all the way right</dd>
503
+ </dl>
504
+ <dl class="keyboard-mappings">
505
+ <dt>shift <span class="badmono">↑</span> <em>or</em> shift k</dt>
506
+ <dd>Scroll all the way up</dd>
507
+ </dl>
508
+ <dl class="keyboard-mappings">
509
+ <dt>shift <span class="badmono">↓</span> <em>or</em> shift j</dt>
510
+ <dd>Scroll all the way down</dd>
511
+ </dl>
512
+ </div><!-- /.column.last -->
513
+ </div>
514
+ </div>
515
+
516
+ <div style='display:none'>
517
+ <div class="rule"></div>
518
+ <div class="columns threecols">
519
+ <div class="column first" style='display:none'>
520
+ <h3>Source Code Browsing</h3>
521
+ <dl class="keyboard-mappings">
522
+ <dt>t</dt>
523
+ <dd>Activates the file finder</dd>
524
+ </dl>
525
+ <dl class="keyboard-mappings">
526
+ <dt>l</dt>
527
+ <dd>Jump to line</dd>
528
+ </dl>
529
+ <dl class="keyboard-mappings">
530
+ <dt>y</dt>
531
+ <dd>Expand URL to its canonical form</dd>
532
+ </dl>
533
+ </div>
534
+ </div>
535
+ </div>
536
+ </div>
537
+
538
+
539
+
540
+ <!--[if IE 8]>
541
+ <script type="text/javascript" charset="utf-8">
542
+ $(document.body).addClass("ie8")
543
+ </script>
544
+ <![endif]-->
545
+
546
+ <!--[if IE 7]>
547
+ <script type="text/javascript" charset="utf-8">
548
+ $(document.body).addClass("ie7")
549
+ </script>
550
+ <![endif]-->
551
+
552
+
553
+ <script type='text/javascript'></script>
554
+
555
+ </body>
556
+ </html>
557
+