gitrob 0.0.6 → 1.0.0

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 (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>