gitrob 0.0.6 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +30 -7
  3. data/.rspec +0 -1
  4. data/.rubocop.yml +55 -0
  5. data/.travis.yml +4 -0
  6. data/CHANGELOG.md +42 -0
  7. data/CONTRIBUTING.md +137 -9
  8. data/Gemfile +11 -1
  9. data/Guardfile +42 -0
  10. data/LICENSE.txt +17 -18
  11. data/README.md +79 -29
  12. data/Rakefile +6 -0
  13. data/bin/console +34 -0
  14. data/bin/setup +7 -0
  15. data/db/migrations/001_create_assessments.rb +19 -0
  16. data/db/migrations/002_create_github_access_tokens.rb +11 -0
  17. data/db/migrations/003_create_owners.rb +24 -0
  18. data/db/migrations/004_create_repositories.rb +23 -0
  19. data/db/migrations/005_create_blobs.rb +16 -0
  20. data/db/migrations/006_create_flags.rb +13 -0
  21. data/db/migrations/007_create_comparisons.rb +17 -0
  22. data/db/migrations/008_create_blobs_comparisons.rb +8 -0
  23. data/db/migrations/009_create_comparisons_repositories.rb +8 -0
  24. data/db/migrations/010_create_comparisons_owners.rb +8 -0
  25. data/exe/gitrob +6 -0
  26. data/gitrob.gemspec +25 -18
  27. data/lib/gitrob/blob_observer.rb +103 -0
  28. data/lib/gitrob/cli/command.rb +58 -0
  29. data/lib/gitrob/cli/commands/accept_terms_of_use.rb +61 -0
  30. data/lib/gitrob/cli/commands/analyze/analysis.rb +75 -0
  31. data/lib/gitrob/cli/commands/analyze/gathering.rb +101 -0
  32. data/lib/gitrob/cli/commands/analyze.rb +63 -0
  33. data/lib/gitrob/cli/commands/banner.rb +25 -0
  34. data/lib/gitrob/cli/commands/configure.rb +123 -0
  35. data/lib/gitrob/cli/commands/server.rb +21 -0
  36. data/lib/gitrob/cli/progress_bar.rb +47 -0
  37. data/lib/gitrob/cli.rb +213 -0
  38. data/lib/gitrob/github/client_manager.rb +46 -0
  39. data/lib/gitrob/github/data_manager.rb +121 -0
  40. data/lib/gitrob/jobs/assessment.rb +12 -0
  41. data/lib/gitrob/jobs/comparison.rb +55 -0
  42. data/lib/gitrob/models/assessment.rb +96 -0
  43. data/lib/gitrob/models/blob.rb +50 -0
  44. data/lib/gitrob/models/comparison.rb +15 -0
  45. data/lib/gitrob/models/flag.rb +15 -0
  46. data/lib/gitrob/models/github_access_token.rb +17 -0
  47. data/lib/gitrob/models/owner.rb +23 -0
  48. data/lib/gitrob/models/repository.rb +20 -0
  49. data/lib/gitrob/utils.rb +19 -0
  50. data/lib/gitrob/version.rb +1 -1
  51. data/lib/gitrob/web_app.rb +292 -0
  52. data/lib/gitrob.rb +30 -113
  53. data/public/css/bootstrap.min.css +11 -0
  54. data/public/css/main.css +130 -0
  55. data/public/css/tomorrow-night.css +75 -0
  56. data/public/fonts/glyphicons-halflings-regular.eot +0 -0
  57. data/public/fonts/glyphicons-halflings-regular.svg +273 -214
  58. data/public/fonts/glyphicons-halflings-regular.ttf +0 -0
  59. data/public/fonts/glyphicons-halflings-regular.woff +0 -0
  60. data/public/fonts/glyphicons-halflings-regular.woff2 +0 -0
  61. data/public/images/blob_spinner.gif +0 -0
  62. data/public/images/gear_spinner.gif +0 -0
  63. data/public/js/bootstrap.min.js +7 -0
  64. data/public/js/highlight.pack.js +2 -0
  65. data/public/js/highlight.worker.js +13 -0
  66. data/public/js/jquery-2.1.4.min.js +4 -0
  67. data/public/js/main.js +239 -0
  68. data/public/robots.txt +2 -0
  69. data/signatures.json +541 -0
  70. data/views/assessments/_assessments.erb +57 -0
  71. data/views/assessments/_comparable_assessments.erb +38 -0
  72. data/views/assessments/_comparisons.erb +111 -0
  73. data/views/assessments/compare.erb +22 -0
  74. data/views/assessments/findings.erb +55 -0
  75. data/views/assessments/repositories.erb +35 -0
  76. data/views/assessments/show.erb +1 -0
  77. data/views/assessments/users.erb +46 -0
  78. data/views/blobs/show.erb +37 -0
  79. data/views/comparisons/show.erb +125 -0
  80. data/views/errors/internal_server_error.erb +9 -0
  81. data/views/errors/not_found.erb +5 -0
  82. data/views/index.erb +43 -28
  83. data/views/layout.erb +38 -12
  84. data/views/repositories/show.erb +49 -0
  85. data/views/users/show.erb +54 -0
  86. metadata +217 -106
  87. data/bin/gitrob +0 -260
  88. data/lib/gitrob/github/blob.rb +0 -41
  89. data/lib/gitrob/github/http_client.rb +0 -127
  90. data/lib/gitrob/github/organization.rb +0 -99
  91. data/lib/gitrob/github/repository.rb +0 -72
  92. data/lib/gitrob/github/user.rb +0 -84
  93. data/lib/gitrob/observers/sensitive_files.rb +0 -83
  94. data/lib/gitrob/progressbar.rb +0 -52
  95. data/lib/gitrob/util.rb +0 -11
  96. data/lib/gitrob/webapp.rb +0 -76
  97. data/models/blob.rb +0 -35
  98. data/models/finding.rb +0 -14
  99. data/models/organization.rb +0 -32
  100. data/models/repo.rb +0 -22
  101. data/models/user.rb +0 -28
  102. data/patterns.json +0 -394
  103. data/public/javascripts/bootstrap.min.js +0 -7
  104. data/public/javascripts/gitrob.js +0 -75
  105. data/public/javascripts/jquery-2.1.1.min.js +0 -4
  106. data/public/javascripts/lang-apollo.js +0 -2
  107. data/public/javascripts/lang-basic.js +0 -3
  108. data/public/javascripts/lang-clj.js +0 -18
  109. data/public/javascripts/lang-css.js +0 -2
  110. data/public/javascripts/lang-dart.js +0 -3
  111. data/public/javascripts/lang-erlang.js +0 -2
  112. data/public/javascripts/lang-go.js +0 -1
  113. data/public/javascripts/lang-hs.js +0 -2
  114. data/public/javascripts/lang-lisp.js +0 -3
  115. data/public/javascripts/lang-llvm.js +0 -1
  116. data/public/javascripts/lang-lua.js +0 -2
  117. data/public/javascripts/lang-matlab.js +0 -6
  118. data/public/javascripts/lang-ml.js +0 -2
  119. data/public/javascripts/lang-mumps.js +0 -2
  120. data/public/javascripts/lang-n.js +0 -4
  121. data/public/javascripts/lang-pascal.js +0 -3
  122. data/public/javascripts/lang-proto.js +0 -1
  123. data/public/javascripts/lang-r.js +0 -2
  124. data/public/javascripts/lang-rd.js +0 -1
  125. data/public/javascripts/lang-scala.js +0 -2
  126. data/public/javascripts/lang-sql.js +0 -2
  127. data/public/javascripts/lang-tcl.js +0 -3
  128. data/public/javascripts/lang-tex.js +0 -1
  129. data/public/javascripts/lang-vb.js +0 -2
  130. data/public/javascripts/lang-vhdl.js +0 -3
  131. data/public/javascripts/lang-wiki.js +0 -2
  132. data/public/javascripts/lang-xq.js +0 -3
  133. data/public/javascripts/lang-yaml.js +0 -2
  134. data/public/javascripts/prettify.js +0 -30
  135. data/public/javascripts/run_prettify.js +0 -34
  136. data/public/stylesheets/bootstrap.min.css +0 -7
  137. data/public/stylesheets/bootstrap.min.css.vanilla +0 -5
  138. data/public/stylesheets/gitrob.css +0 -88
  139. data/public/stylesheets/prettify.css +0 -51
  140. data/spec/lib/gitrob/observers/sensitive_files_spec.rb +0 -691
  141. data/spec/spec_helper.rb +0 -127
  142. data/views/blob.erb +0 -22
  143. data/views/organization.erb +0 -126
  144. data/views/repository.erb +0 -51
  145. data/views/user.erb +0 -51
@@ -0,0 +1,111 @@
1
+ <% if @primary_comparisons.count.zero? && @secondary_comparisons.count.zero? %>
2
+ <div class="alert alert-info" role="alert"><strong>No comparisons found.</strong></div>
3
+ <% else %>
4
+ <table class="table comparisons" id="comparisons_table" data-refresh-endpoint="/assessments/<%=h @assessment.id %>/compare/_comparisons">
5
+ <thead>
6
+ <tr>
7
+ <th></th>
8
+ <th>Date</th>
9
+ <th>Users</th>
10
+ <th>Repositories</th>
11
+ <th>Files</th>
12
+ <th>Findings</th>
13
+ <th></th>
14
+ </tr>
15
+ </thead>
16
+ <tbody>
17
+ <% @primary_comparisons.each do |comparison| %>
18
+ <% if !comparison.finished %>
19
+ <tr class="comparison-row unfinished primary-comparison">
20
+ <% else %>
21
+ <tr class="comparison-row primary-comparison">
22
+ <% end %>
23
+ <td class="owners" data-href="/comparisons/<%=h comparison.id %>">
24
+ <% comparison.secondary_assessment.owners_dataset.limit(10).order(:type).each do |owner| %>
25
+ <img src="<%=h owner.avatar_url %>" width="30" height="30" alt="<%=h owner.login %>" title="<%=h owner.login %>" class="img-rounded" data-toggle="tooltip" data-placement="bottom" />
26
+ <% end %>
27
+ <% if comparison.secondary_assessment.owners_count > 10 %>
28
+ <small>and <%= comparison.secondary_assessment.owners_count - 10 %> more</small>
29
+ <% end %>
30
+ </td>
31
+ <td><%=h comparison.created_at.strftime("%Y-%m-%d %H:%M") %></td>
32
+ <td>
33
+ <% if !comparison.finished %>
34
+ <img src="/images/gear_spinner.gif" alt="In progress..." title="In progress..." data-toggle="tooltip" data-placement="bottom" />
35
+ <% else %>
36
+ <%=h comparison.owners_count %>
37
+ <% end %>
38
+ </td>
39
+ <td>
40
+ <% if !comparison.finished %>
41
+ <img src="/images/gear_spinner.gif" alt="In progress..." title="In progress..." data-toggle="tooltip" data-placement="bottom" />
42
+ <% else %>
43
+ <%=h comparison.repositories_count %>
44
+ <% end %>
45
+ </td>
46
+ <td>
47
+ <% if !comparison.finished %>
48
+ <img src="/images/gear_spinner.gif" alt="In progress..." title="In progress..." data-toggle="tooltip" data-placement="bottom" />
49
+ <% else %>
50
+ <%=h comparison.blobs_count %>
51
+ <% end %>
52
+ </td>
53
+ <td>
54
+ <% if !comparison.finished %>
55
+ <img src="/images/gear_spinner.gif" alt="In progress..." title="In progress..." data-toggle="tooltip" data-placement="bottom" />
56
+ <% else %>
57
+ <%=h comparison.findings_count %>
58
+ <% end %>
59
+ </td>
60
+ <td><a class="btn btn-default btn-xs glyphicon glyphicon-trash delete-comparison" title="Delete comparison" data-toggle="tooltip" data-placement="bottom" href="#" data-comparison-id="<%=h comparison.id %>"></a></td>
61
+ </tr>
62
+ <% end %>
63
+ <% @secondary_comparisons.each do |comparison| %>
64
+ <% if !comparison.finished %>
65
+ <tr class="comparison-row unfinished secondary-comparison">
66
+ <% else %>
67
+ <tr class="comparison-row primary-comparison">
68
+ <% end %>
69
+ <td class="owners" data-href="/comparisons/<%=h comparison.id %>">
70
+ <% comparison.primary_assessment.owners_dataset.limit(10).order(:type).each do |owner| %>
71
+ <img src="<%=h owner.avatar_url %>" width="30" height="30" alt="<%=h owner.login %>" title="<%=h owner.login %>" class="img-rounded" data-toggle="tooltip" data-placement="bottom" />
72
+ <% end %>
73
+ <% if comparison.primary_assessment.owners_count > 10 %>
74
+ <small>and <%= comparison.primary_assessment.owners_count - 10 %> more</small>
75
+ <% end %>
76
+ </td>
77
+ <td><%=h comparison.created_at.strftime("%Y-%m-%d %H:%M") %></td>
78
+ <td>
79
+ <% if !comparison.finished %>
80
+ <img src="/images/gear_spinner.gif" alt="In progress..." title="In progress..." data-toggle="tooltip" data-placement="bottom" />
81
+ <% else %>
82
+ <%=h comparison.owners_count %>
83
+ <% end %>
84
+ </td>
85
+ <td>
86
+ <% if !comparison.finished %>
87
+ <img src="/images/gear_spinner.gif" alt="In progress..." title="In progress..." data-toggle="tooltip" data-placement="bottom" />
88
+ <% else %>
89
+ <%=h comparison.repositories_count %>
90
+ <% end %>
91
+ </td>
92
+ <td>
93
+ <% if !comparison.finished %>
94
+ <img src="/images/gear_spinner.gif" alt="In progress..." title="In progress..." data-toggle="tooltip" data-placement="bottom" />
95
+ <% else %>
96
+ <%=h comparison.blobs_count %>
97
+ <% end %>
98
+ </td>
99
+ <td>
100
+ <% if !comparison.finished %>
101
+ <img src="/images/gear_spinner.gif" alt="In progress..." title="In progress..." data-toggle="tooltip" data-placement="bottom" />
102
+ <% else %>
103
+ <%=h comparison.findings_count %>
104
+ <% end %>
105
+ </td>
106
+ <td><a class="btn btn-default btn-xs glyphicon glyphicon-trash delete-comparison" title="Delete comparison" data-toggle="tooltip" data-placement="bottom" href="#" data-comparison-id="<%=h comparison.id %>"></a></td>
107
+ </tr>
108
+ <% end %>
109
+ </tbody>
110
+ </table>
111
+ <% end %>
@@ -0,0 +1,22 @@
1
+ <div class="page-header">
2
+ <div class="pull-right">
3
+ <ul class="nav nav-pills">
4
+ <li><a href="/assessments/<%=h @assessment.id %>/findings"><span class="glyphicon glyphicon-flag"></span> Findings</a></li>
5
+ <li><a href="/assessments/<%=h @assessment.id %>/users"><span class="glyphicon glyphicon-user"></span> Users</a></li>
6
+ <li><a href="/assessments/<%=h @assessment.id %>/repositories"><span class="glyphicon glyphicon-book"></span> Repositories</a></li>
7
+ <li class="active"><a href="/assessments/<%=h @assessment.id %>/compare"><span class="glyphicon glyphicon-eye-open"></span> Compare</a></li>
8
+ </ul>
9
+ </div>
10
+ <h1>Assessment comparison</h1>
11
+ </div>
12
+
13
+ <h2>Comparisons</h2>
14
+ <div id="comparisons_table_container" data-refresh-endpoint="/assessments/<%=h @assessment.id %>/compare/_comparisons">
15
+ <%= erb :"assessments/_comparisons" %>
16
+ </div>
17
+
18
+ <h2>Comparable assessments</h2>
19
+ <div id="assessments_table_container" data-refresh-endpoint="/assessments/<%=h @assessment.id %>/compare/_comparables">
20
+ <%= erb :"assessments/_comparable_assessments" %>
21
+ </div>
22
+
@@ -0,0 +1,55 @@
1
+ <div class="page-header">
2
+ <div class="pull-right">
3
+ <ul class="nav nav-pills">
4
+ <li class="active"><a href="/assessments/<%=h @assessment.id %>/findings"><span class="glyphicon glyphicon-flag"></span> Findings</a></li>
5
+ <li><a href="/assessments/<%=h @assessment.id %>/users"><span class="glyphicon glyphicon-user"></span> Users</a></li>
6
+ <li><a href="/assessments/<%=h @assessment.id %>/repositories"><span class="glyphicon glyphicon-book"></span> Repositories</a></li>
7
+ <li><a href="/assessments/<%=h @assessment.id %>/compare"><span class="glyphicon glyphicon-eye-open"></span> Compare</a></li>
8
+ </ul>
9
+ </div>
10
+ <h1>Findings</h1>
11
+ </div>
12
+
13
+ <table class="table table-striped table-hover table-condensed" id="blobs_table">
14
+ <thead>
15
+ <tr>
16
+ <th colspan="3">
17
+ <div class="pull-right">
18
+ <input type="text" id="quick_filter" class="form-control input-sm quick-filter" placeholder="Quick filter...">
19
+ </div>
20
+ </th>
21
+ </tr>
22
+ <tr>
23
+ <th class="blob-path">Path</th>
24
+ <th class="blob-repo">Repository</th>
25
+ <th class="blob-size">Size</th>
26
+ </tr>
27
+ </thead>
28
+ <tbody>
29
+ <% @findings.each do |finding| %>
30
+ <% if finding.test_blob? %>
31
+ <tr class="blob-row test-blob">
32
+ <% else %>
33
+ <tr class="blob-row">
34
+ <% end %>
35
+ <td class="blob-path"><a href="/blobs/<%=h finding.id %>" class="blob-link" title="<%=h finding.flags.map(&:caption).join(' - ') %>" data-toggle="tooltip" data-placement="bottom"><%= format_path(finding.path) %></a></td>
36
+ <td class="blob-repo"><a href="/repositories/<%=h finding.repository.id %>"><%=h finding.repository.full_name %></a></td>
37
+ <td class="blob-size"><%= number_to_human_size(finding.size) %></td>
38
+ </tr>
39
+ <% end %>
40
+ </table>
41
+
42
+ <div class="modal fade" tabindex="-1" role="dialog" id="blob_modal">
43
+ <div class="modal-dialog modal-lg">
44
+ <div class="modal-content" id="blob_modal_content">
45
+ <div class="modal-body">
46
+ <div class="center-text">
47
+ <img src="/images/blob_spinner.gif" alt="Loading file..." title="Loading file..." />
48
+ </div>
49
+ </div>
50
+ <div class="modal-footer">
51
+ <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
52
+ </div>
53
+ </div>
54
+ </div>
55
+ </div>
@@ -0,0 +1,35 @@
1
+ <div class="page-header">
2
+ <div class="pull-right">
3
+ <ul class="nav nav-pills">
4
+ <li><a href="/assessments/<%=h @assessment.id %>/findings"><span class="glyphicon glyphicon-flag"></span> Findings</a></li>
5
+ <li><a href="/assessments/<%=h @assessment.id %>/users"><span class="glyphicon glyphicon-user"></span> Users</a></li>
6
+ <li class="active"><a href="/assessments/<%=h @assessment.id %>/repositories"><span class="glyphicon glyphicon-book"></span> Repositories</a></li>
7
+ <li><a href="/assessments/<%=h @assessment.id %>/compare"><span class="glyphicon glyphicon-eye-open"></span> Compare</a></li>
8
+ </ul>
9
+ </div>
10
+ <h1>Repositories</h1>
11
+ </div>
12
+
13
+ <table class="table table-striped table-hover table-condensed" id="repositories_table">
14
+ <thead>
15
+ <tr>
16
+ <th class="repository-name">Name</th>
17
+ <th class="repository-description">Description</th>
18
+ <th class="repository-files">Files</th>
19
+ <th class="repository-findings">Findings</th>
20
+ </tr>
21
+ </thead>
22
+ <tbody>
23
+ <% @repositories.each do |repo| %>
24
+ <% if repo.findings_count > 0 %>
25
+ <tr class="repository-row danger">
26
+ <% else %>
27
+ <tr class="repository-row">
28
+ <% end %>
29
+ <td class="repository-name"><a href="/repositories/<%=h repo.id %>"><%=h repo.full_name %></a></td>
30
+ <td class="repository-description"><%=h repo.description %></td>
31
+ <td class="repository-files center-text"><%=h repo.blobs_count %></td>
32
+ <td class="repository-findings center-text"><%=h repo.findings_count %></td>
33
+ <% end %>
34
+ </tbody>
35
+ </table>
@@ -0,0 +1 @@
1
+ <h1><%= @assessment.name %></h1>
@@ -0,0 +1,46 @@
1
+ <div class="page-header">
2
+ <div class="pull-right">
3
+ <ul class="nav nav-pills">
4
+ <li><a href="/assessments/<%=h @assessment.id %>/findings"><span class="glyphicon glyphicon-flag"></span> Findings</a></li>
5
+ <li class="active"><a href="/assessments/<%=h @assessment.id %>/users"><span class="glyphicon glyphicon-user"></span> Users</a></li>
6
+ <li><a href="/assessments/<%=h @assessment.id %>/repositories"><span class="glyphicon glyphicon-book"></span> Repositories</a></li>
7
+ <li><a href="/assessments/<%=h @assessment.id %>/compare"><span class="glyphicon glyphicon-eye-open"></span> Compare</a></li>
8
+ </ul>
9
+ </div>
10
+ <h1>Users</h1>
11
+ </div>
12
+
13
+ <% @owners.each_slice(4) do |owners| %>
14
+ <div class="row">
15
+ <% owners.each do |owner| %>
16
+ <div class="col-md-3 center-text">
17
+ <div class="owner" data-href="/users/<%=h owner.id %>">
18
+ <img src="<%=h owner.avatar_url %>" class="img-rounded owner-avatar" alt="<%=h owner.name %>" />
19
+ <span class="owner-name"><%=h owner.name || owner.login %></span>
20
+ <div class="owner-counts">
21
+ <span class="label label-default" title="Repositories" data-toggle="tooltip" data-placement="bottom"><span class="glyphicon glyphicon-book"></span> <%=h owner.repositories_count %></span>
22
+ <span class="label label-default" title="Files" data-toggle="tooltip" data-placement="bottom"><span class="glyphicon glyphicon-file"></span> <%=h owner.blobs_count %></span>
23
+ <% if owner.findings_count > 0 %>
24
+ <span class="label label-danger" title="Flagged files" data-toggle="tooltip" data-placement="bottom"><span class="glyphicon glyphicon-flag"></span> <%=h owner.findings_count %></span>
25
+ <% else %>
26
+ <span class="label label-default" title="Flagged files" data-toggle="tooltip" data-placement="bottom"><span class="glyphicon glyphicon-flag"></span> <%=h owner.findings_count %></span>
27
+ <% end %>
28
+ </div>
29
+ </div>
30
+ </div>
31
+ <% end %>
32
+ </div>
33
+ <% end %>
34
+
35
+ <div class="modal fade" tabindex="-1" role="dialog" id="user_modal">
36
+ <div class="modal-dialog modal-lg">
37
+ <div class="modal-content">
38
+ <div class="modal-body">
39
+ <div id="user_modal_content"></div>
40
+ </div>
41
+ <div class="modal-footer">
42
+ <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
43
+ </div>
44
+ </div>
45
+ </div>
46
+ </div>
@@ -0,0 +1,37 @@
1
+ <div class="modal-body" id="blob_modal_body">
2
+ <% if !@blob.flags.count.zero? %>
3
+ <% @blob.flags.each do |flag| %>
4
+ <div class="alert alert-warning" role="alert">
5
+ <% if flag.caption %>
6
+ <p><strong><%=h flag.caption %></strong></p>
7
+ <% end %>
8
+ <% if flag.description %>
9
+ <p><%=h flag.description %></p>
10
+ <% end %>
11
+ </div>
12
+ <% end %>
13
+ <% end %>
14
+ <% if @blob.test_blob? %>
15
+ <div class="alert alert-warning" role="alert">
16
+ <strong>Notice:</strong> This file looks like a test related file.
17
+ </div>
18
+ <% end %>
19
+
20
+ <% if @content %>
21
+ <pre><code id="blob_content" class="blob-content hljs"><%=h @content %></code></pre>
22
+ <% else %>
23
+ <div class="well center-text">
24
+ <h2>File is too large</h2>
25
+ <p>The file is too large to be rendered here. Please view it on GitHub.</p>
26
+ <br />
27
+ <br />
28
+ <p><a href="<%=h @blob.html_url %>" class="btn btn-primary btn-lg" target="_blank">View file on GitHub</a></p>
29
+ <br />
30
+ </div>
31
+ <% end %>
32
+ </div>
33
+ <div class="modal-footer">
34
+ <a href="<%=h @blob.html_url %>" class="btn btn-primary" target="_blank">View file on GitHub</a>
35
+ <a href="<%=h @blob.history_html_url %>" class="btn btn-primary" target="_blank">View commit history</a>
36
+ <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
37
+ </div>
@@ -0,0 +1,125 @@
1
+ <div class="page-header">
2
+ <h1>Comparison <%=h @comparison.created_at.strftime("%Y-%m-%d %H:%M") %></h1>
3
+ </div>
4
+
5
+ <h2>New or modified files</h2>
6
+ <% if @blobs.count.zero? %>
7
+ <div class="alert alert-info" role="alert"><strong>No new or modified files found.</strong></div>
8
+ <% else %>
9
+ <table class="table table-striped table-hover table-condensed" id="blobs_table">
10
+ <thead>
11
+ <tr>
12
+ <th colspan="2">
13
+ <div class="pull-right">
14
+ <input type="text" id="quick_filter" class="form-control input-sm quick-filter" placeholder="Quick filter...">
15
+ </div>
16
+ <label>
17
+ <input type="checkbox" id="show_only_flagged_files"> Only show flagged files
18
+ </label>
19
+ </th>
20
+ </tr>
21
+ <tr>
22
+ <th class="blob-path">Path</th>
23
+ <th class="blob-repo">Repository</th>
24
+ <th class="blob-size">Size</th>
25
+ </tr>
26
+ </thead>
27
+ <tbody>
28
+ <% @blobs.each do |blob| %>
29
+ <% if blob.flags_count > 0 %>
30
+ <tr class="danger blob-row">
31
+ <% else %>
32
+ <tr class="blob-row">
33
+ <% end %>
34
+ <td class="blob-path"><a href="/blobs/<%=h blob.id %>" class="blob-link" title="<%=h blob.flags.map(&:caption).join(' - ') %>" data-toggle="tooltip" data-placement="bottom"><%= format_path(blob.path) %></a></td>
35
+ <td class="blob-repo"><a href="/repositories/<%=h blob.repository.id %>"><%=h blob.repository.full_name %></a></td>
36
+ <td class="blob-size"><%= number_to_human_size(blob.size) %></td>
37
+ </tr>
38
+ <% end %>
39
+ </tbody>
40
+ </table>
41
+
42
+ <div class="modal fade" tabindex="-1" role="dialog" id="blob_modal">
43
+ <div class="modal-dialog modal-lg">
44
+ <div class="modal-content" id="blob_modal_content">
45
+ <div class="modal-body">
46
+ <div class="center-text">
47
+ <img src="/images/blob_spinner.gif" alt="Loading file..." title="Loading file..." />
48
+ </div>
49
+ </div>
50
+ <div class="modal-footer">
51
+ <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
52
+ </div>
53
+ </div>
54
+ </div>
55
+ </div>
56
+ <% end %>
57
+
58
+ <h2>New repositories</h2>
59
+ <% if @repositories.count.zero? %>
60
+ <div class="alert alert-info" role="alert"><strong>No new repositories found.</strong></div>
61
+ <% else %>
62
+ <table class="table table-striped table-hover table-condensed" id="repositories_table">
63
+ <thead>
64
+ <tr>
65
+ <th class="repository-name">Name</th>
66
+ <th class="repository-description">Description</th>
67
+ <th class="repository-files">Files</th>
68
+ <th class="repository-findings">Findings</th>
69
+ </tr>
70
+ </thead>
71
+ <tbody>
72
+ <% @repositories.each do |repo| %>
73
+ <% if repo.findings_count > 0 %>
74
+ <tr class="repository-row danger">
75
+ <% else %>
76
+ <tr class="repository-row">
77
+ <% end %>
78
+ <td class="repository-name"><a href="/repositories/<%=h repo.id %>"><%=h repo.full_name %></a></td>
79
+ <td class="repository-description"><%=h repo.description %></td>
80
+ <td class="repository-files center-text"><%=h repo.blobs_count %></td>
81
+ <td class="repository-findings center-text"><%=h repo.findings_count %></td>
82
+ <% end %>
83
+ </tbody>
84
+ </table>
85
+ <% end %>
86
+
87
+ <h2>New users</h2>
88
+ <% if @owners.count.zero? %>
89
+ <div class="alert alert-info" role="alert"><strong>No new users found.</strong></div>
90
+ <% else %>
91
+ <% @owners.each_slice(4) do |owners| %>
92
+ <div class="row">
93
+ <% owners.each do |owner| %>
94
+ <div class="col-md-3 center-text">
95
+ <div class="owner" data-href="/users/<%=h owner.id %>">
96
+ <img src="<%=h owner.avatar_url %>" class="img-rounded owner-avatar" alt="<%=h owner.name %>" />
97
+ <span class="owner-name"><%=h owner.name || owner.login %></span>
98
+ <div class="owner-counts">
99
+ <span class="label label-default" title="Repositories" data-toggle="tooltip" data-placement="bottom"><span class="glyphicon glyphicon-book"></span> <%=h owner.repositories_count %></span>
100
+ <span class="label label-default" title="Files" data-toggle="tooltip" data-placement="bottom"><span class="glyphicon glyphicon-file"></span> <%=h owner.blobs_count %></span>
101
+ <% if owner.findings_count > 0 %>
102
+ <span class="label label-danger" title="Flagged files" data-toggle="tooltip" data-placement="bottom"><span class="glyphicon glyphicon-flag"></span> <%=h owner.findings_count %></span>
103
+ <% else %>
104
+ <span class="label label-default" title="Flagged files" data-toggle="tooltip" data-placement="bottom"><span class="glyphicon glyphicon-flag"></span> <%=h owner.findings_count %></span>
105
+ <% end %>
106
+ </div>
107
+ </div>
108
+ </div>
109
+ <% end %>
110
+ </div>
111
+ <% end %>
112
+
113
+ <div class="modal fade" tabindex="-1" role="dialog" id="user_modal">
114
+ <div class="modal-dialog modal-lg">
115
+ <div class="modal-content">
116
+ <div class="modal-body">
117
+ <div id="user_modal_content"></div>
118
+ </div>
119
+ <div class="modal-footer">
120
+ <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
121
+ </div>
122
+ </div>
123
+ </div>
124
+ </div>
125
+ <% end %>
@@ -0,0 +1,9 @@
1
+ <div class="page-header">
2
+ <h1>Internal Server Error <small>500</small></h1>
3
+ </div>
4
+
5
+ <p class="lead">Oops, something went wrong. Here's some debugging information:</p>
6
+
7
+ <textarea id="error_details" class="error-details form-control" rows="10" readonly="readonly"><%=h @error_details %></textarea>
8
+
9
+ <p>Please create a <a href="https://github.com/michenriksen/gitrob/issues/new" target="_blank">new issue</a> on GitHub and paste the above details into the description. Thanks!</p>
@@ -0,0 +1,5 @@
1
+ <div class="page-header">
2
+ <h1>Not Found <small>404</small></h1>
3
+ </div>
4
+
5
+ <p class="lead">The page you were looking does not exist.</p>
data/views/index.erb CHANGED
@@ -1,32 +1,47 @@
1
1
  <div class="page-header">
2
- <h1>Organizations</h1>
2
+ <h1>
3
+ <button type="button" class="pull-right btn btn-success" id="new_assessment_button"><span class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span> New assessment</button>
4
+ Assessments
5
+ </h1>
3
6
  </div>
4
7
 
5
- <% if @orgs.count.zero? %>
8
+ <div id="assessments_table_container" data-refresh-endpoint="/assessments/_table">
9
+ <%= erb :"assessments/_assessments" %>
10
+ </div>
6
11
 
7
- <% else %>
8
- <table class="table table-striped table-hover">
9
- <thead>
10
- <tr>
11
- <th>Name</th>
12
- <th>Repositories</th>
13
- <th>Members</th>
14
- <th>Findings</th>
15
- <th style="text-align:right">Creation date</th>
16
- </tr>
17
- </thead>
18
- <tbody>
19
- <% @orgs.each do |org| %>
20
- <tr>
21
- <td>
22
- <img src="<%=h org.avatar_url %>" alt="<%=h org.name %>" class="avatar" width="24" height="24" />
23
- <strong><a href="/orgs/<%=h org.id%>"><%=h org.name %></a></strong></td>
24
- <td><%=h org.repos.count %></td>
25
- <td><%=h org.users.count %></td>
26
- <td><%=h org.findings.count %></td>
27
- <td style="text-align:right"><%= org.created_at.strftime("%e %b %Y %H:%M") %></td>
28
- </tr>
29
- <% end %>
30
- </tbody>
31
- </table>
32
- <% end %>
12
+ <div class="modal fade" tabindex="-1" role="dialog" id="new_assessment_modal">
13
+ <div class="modal-dialog modal-lg">
14
+ <form id="new_assessment_form">
15
+ <div class="modal-content">
16
+ <div class="modal-body">
17
+ <div class="form-group">
18
+ <label for="assessment_targets">Targets <small>(comma-separated)</small></label>
19
+ <input type="text" class="form-control" id="assessment_targets" name="assessment[targets]" placeholder="acme">
20
+ </div>
21
+ <div class="form-group">
22
+ <label for="assessment_endpoint">API endpoint</label>
23
+ <input type="text" class="form-control" id="assessment_endpoint" name="assessment[endpoint]" placeholder="https://api.github.com" value="https://api.github.com">
24
+ </div>
25
+ <div class="form-group">
26
+ <label for="assessment_site">Site</label>
27
+ <input type="text" class="form-control" id="assessment_site" name="assessment[site]" placeholder="https://github.com" value="https://github.com">
28
+ </div>
29
+ <div class="checkbox">
30
+ <label>
31
+ <input type="checkbox" id="assessment_verify_ssl" name="assessment[verify_ssl]" value="1" checked="checked"> Verify secure connection
32
+ </label>
33
+ </div>
34
+ <div class="form-group">
35
+ <label for="assessment_github_access_tokens">GitHub API access tokens <small>(one per line)</small></label>
36
+ <textarea class="form-control" id="assessment_github_access_tokens" name="assessment[github_access_tokens]" rows="3"><%=h Gitrob::CLI.configuration["github_access_tokens"].join("\n") %></textarea>
37
+ </div>
38
+ </form>
39
+ </div>
40
+ <div class="modal-footer">
41
+ <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
42
+ <button type="submit" id="update_assessment" class="btn btn-primary">Save</button>
43
+ </div>
44
+ </div>
45
+ </form>
46
+ </div>
47
+ </div>
data/views/layout.erb CHANGED
@@ -4,27 +4,53 @@
4
4
  <meta charset="utf-8">
5
5
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1">
7
+ <meta name="csrf-token" content="<%=h session[:csrf] %>">
7
8
  <title>Gitrob</title>
8
-
9
- <link href="/stylesheets/bootstrap.min.css" rel="stylesheet">
10
- <link href="/stylesheets/prettify.css" rel="stylesheet">
11
- <link href="/stylesheets/gitrob.css" rel="stylesheet">
12
-
13
- <script type="text/javascript" src="/javascripts/jquery-2.1.1.min.js"></script>
14
- <script type="text/javascript" src="/javascripts/bootstrap.min.js"></script>
15
-
16
- <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
17
- <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
9
+ <link href="/css/bootstrap.min.css" rel="stylesheet">
10
+ <link href="/css/tomorrow-night.css" rel="stylesheet">
11
+ <link href="/css/main.css" rel="stylesheet">
18
12
  <!--[if lt IE 9]>
19
13
  <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
20
14
  <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
21
15
  <![endif]-->
22
16
  </head>
23
17
  <body>
18
+ <nav class="navbar navbar-default">
19
+ <div class="container-fluid">
20
+ <div class="navbar-header">
21
+ <button type="button" class="navbar-toggle collapsed" data-toggle="collapse">
22
+ <span class="sr-only">Toggle navigation</span>
23
+ <span class="icon-bar"></span>
24
+ <span class="icon-bar"></span>
25
+ <span class="icon-bar"></span>
26
+ </button>
27
+ <a class="navbar-brand" href="/">Gitrob</a>
28
+ </div>
29
+
30
+ <div class="collapse navbar-collapse">
31
+ <ul class="nav navbar-nav">
32
+ <li><a href="/">Assessments</a></li>
33
+ </ul>
34
+ </div>
35
+ </div>
36
+ </nav>
24
37
  <div class="container">
25
38
  <%= yield %>
26
39
  </div>
27
- <script type="text/javascript" src="/javascripts/prettify.js"></script>
28
- <script type="text/javascript" src="/javascripts/gitrob.js"></script>
40
+ <footer>
41
+ <div class="container">
42
+ <p class="center-text">
43
+ <a href="https://github.com/michenriksen/gitrob">Gitrob</a> v<%=h Gitrob::VERSION %> by <a href="http://michenriksen.com">Michael Henriksen</a> &middot; <a href="https://github.com/michenriksen/gitrob/issues/new">Report an issue</a>
44
+ </p>
45
+ </div>
46
+ </footer>
47
+ <noscript>
48
+ <div class="noscript">
49
+ <h1>Being paranoid is good, but Gitrob requires JavaScript.</h1>
50
+ </div>
51
+ </noscript>
52
+ <script src="/js/jquery-2.1.4.min.js"></script>
53
+ <script src="/js/bootstrap.min.js"></script>
54
+ <script src="/js/main.js"></script>
29
55
  </body>
30
56
  </html>