jruby-lint 0.1

Sign up to get free protection for your applications and to get access to all the features.
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
+