gitrob 0.0.6 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +30 -7
- data/.rspec +0 -1
- data/.rubocop.yml +55 -0
- data/.travis.yml +4 -0
- data/CHANGELOG.md +42 -0
- data/CONTRIBUTING.md +137 -9
- data/Gemfile +11 -1
- data/Guardfile +42 -0
- data/LICENSE.txt +17 -18
- data/README.md +79 -29
- data/Rakefile +6 -0
- data/bin/console +34 -0
- data/bin/setup +7 -0
- data/db/migrations/001_create_assessments.rb +19 -0
- data/db/migrations/002_create_github_access_tokens.rb +11 -0
- data/db/migrations/003_create_owners.rb +24 -0
- data/db/migrations/004_create_repositories.rb +23 -0
- data/db/migrations/005_create_blobs.rb +16 -0
- data/db/migrations/006_create_flags.rb +13 -0
- data/db/migrations/007_create_comparisons.rb +17 -0
- data/db/migrations/008_create_blobs_comparisons.rb +8 -0
- data/db/migrations/009_create_comparisons_repositories.rb +8 -0
- data/db/migrations/010_create_comparisons_owners.rb +8 -0
- data/exe/gitrob +6 -0
- data/gitrob.gemspec +25 -18
- data/lib/gitrob/blob_observer.rb +103 -0
- data/lib/gitrob/cli/command.rb +58 -0
- data/lib/gitrob/cli/commands/accept_terms_of_use.rb +61 -0
- data/lib/gitrob/cli/commands/analyze/analysis.rb +75 -0
- data/lib/gitrob/cli/commands/analyze/gathering.rb +101 -0
- data/lib/gitrob/cli/commands/analyze.rb +63 -0
- data/lib/gitrob/cli/commands/banner.rb +25 -0
- data/lib/gitrob/cli/commands/configure.rb +123 -0
- data/lib/gitrob/cli/commands/server.rb +21 -0
- data/lib/gitrob/cli/progress_bar.rb +47 -0
- data/lib/gitrob/cli.rb +213 -0
- data/lib/gitrob/github/client_manager.rb +46 -0
- data/lib/gitrob/github/data_manager.rb +121 -0
- data/lib/gitrob/jobs/assessment.rb +12 -0
- data/lib/gitrob/jobs/comparison.rb +55 -0
- data/lib/gitrob/models/assessment.rb +96 -0
- data/lib/gitrob/models/blob.rb +50 -0
- data/lib/gitrob/models/comparison.rb +15 -0
- data/lib/gitrob/models/flag.rb +15 -0
- data/lib/gitrob/models/github_access_token.rb +17 -0
- data/lib/gitrob/models/owner.rb +23 -0
- data/lib/gitrob/models/repository.rb +20 -0
- data/lib/gitrob/utils.rb +19 -0
- data/lib/gitrob/version.rb +1 -1
- data/lib/gitrob/web_app.rb +292 -0
- data/lib/gitrob.rb +30 -113
- data/public/css/bootstrap.min.css +11 -0
- data/public/css/main.css +130 -0
- data/public/css/tomorrow-night.css +75 -0
- data/public/fonts/glyphicons-halflings-regular.eot +0 -0
- data/public/fonts/glyphicons-halflings-regular.svg +273 -214
- data/public/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/public/fonts/glyphicons-halflings-regular.woff +0 -0
- data/public/fonts/glyphicons-halflings-regular.woff2 +0 -0
- data/public/images/blob_spinner.gif +0 -0
- data/public/images/gear_spinner.gif +0 -0
- data/public/js/bootstrap.min.js +7 -0
- data/public/js/highlight.pack.js +2 -0
- data/public/js/highlight.worker.js +13 -0
- data/public/js/jquery-2.1.4.min.js +4 -0
- data/public/js/main.js +239 -0
- data/public/robots.txt +2 -0
- data/signatures.json +541 -0
- data/views/assessments/_assessments.erb +57 -0
- data/views/assessments/_comparable_assessments.erb +38 -0
- data/views/assessments/_comparisons.erb +111 -0
- data/views/assessments/compare.erb +22 -0
- data/views/assessments/findings.erb +55 -0
- data/views/assessments/repositories.erb +35 -0
- data/views/assessments/show.erb +1 -0
- data/views/assessments/users.erb +46 -0
- data/views/blobs/show.erb +37 -0
- data/views/comparisons/show.erb +125 -0
- data/views/errors/internal_server_error.erb +9 -0
- data/views/errors/not_found.erb +5 -0
- data/views/index.erb +43 -28
- data/views/layout.erb +38 -12
- data/views/repositories/show.erb +49 -0
- data/views/users/show.erb +54 -0
- metadata +217 -106
- data/bin/gitrob +0 -260
- data/lib/gitrob/github/blob.rb +0 -41
- data/lib/gitrob/github/http_client.rb +0 -127
- data/lib/gitrob/github/organization.rb +0 -99
- data/lib/gitrob/github/repository.rb +0 -72
- data/lib/gitrob/github/user.rb +0 -84
- data/lib/gitrob/observers/sensitive_files.rb +0 -83
- data/lib/gitrob/progressbar.rb +0 -52
- data/lib/gitrob/util.rb +0 -11
- data/lib/gitrob/webapp.rb +0 -76
- data/models/blob.rb +0 -35
- data/models/finding.rb +0 -14
- data/models/organization.rb +0 -32
- data/models/repo.rb +0 -22
- data/models/user.rb +0 -28
- data/patterns.json +0 -394
- data/public/javascripts/bootstrap.min.js +0 -7
- data/public/javascripts/gitrob.js +0 -75
- data/public/javascripts/jquery-2.1.1.min.js +0 -4
- data/public/javascripts/lang-apollo.js +0 -2
- data/public/javascripts/lang-basic.js +0 -3
- data/public/javascripts/lang-clj.js +0 -18
- data/public/javascripts/lang-css.js +0 -2
- data/public/javascripts/lang-dart.js +0 -3
- data/public/javascripts/lang-erlang.js +0 -2
- data/public/javascripts/lang-go.js +0 -1
- data/public/javascripts/lang-hs.js +0 -2
- data/public/javascripts/lang-lisp.js +0 -3
- data/public/javascripts/lang-llvm.js +0 -1
- data/public/javascripts/lang-lua.js +0 -2
- data/public/javascripts/lang-matlab.js +0 -6
- data/public/javascripts/lang-ml.js +0 -2
- data/public/javascripts/lang-mumps.js +0 -2
- data/public/javascripts/lang-n.js +0 -4
- data/public/javascripts/lang-pascal.js +0 -3
- data/public/javascripts/lang-proto.js +0 -1
- data/public/javascripts/lang-r.js +0 -2
- data/public/javascripts/lang-rd.js +0 -1
- data/public/javascripts/lang-scala.js +0 -2
- data/public/javascripts/lang-sql.js +0 -2
- data/public/javascripts/lang-tcl.js +0 -3
- data/public/javascripts/lang-tex.js +0 -1
- data/public/javascripts/lang-vb.js +0 -2
- data/public/javascripts/lang-vhdl.js +0 -3
- data/public/javascripts/lang-wiki.js +0 -2
- data/public/javascripts/lang-xq.js +0 -3
- data/public/javascripts/lang-yaml.js +0 -2
- data/public/javascripts/prettify.js +0 -30
- data/public/javascripts/run_prettify.js +0 -34
- data/public/stylesheets/bootstrap.min.css +0 -7
- data/public/stylesheets/bootstrap.min.css.vanilla +0 -5
- data/public/stylesheets/gitrob.css +0 -88
- data/public/stylesheets/prettify.css +0 -51
- data/spec/lib/gitrob/observers/sensitive_files_spec.rb +0 -691
- data/spec/spec_helper.rb +0 -127
- data/views/blob.erb +0 -22
- data/views/organization.erb +0 -126
- data/views/repository.erb +0 -51
- 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>
|
data/views/index.erb
CHANGED
@@ -1,32 +1,47 @@
|
|
1
1
|
<div class="page-header">
|
2
|
-
<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
|
-
|
8
|
+
<div id="assessments_table_container" data-refresh-endpoint="/assessments/_table">
|
9
|
+
<%= erb :"assessments/_assessments" %>
|
10
|
+
</div>
|
6
11
|
|
7
|
-
|
8
|
-
<
|
9
|
-
<
|
10
|
-
<
|
11
|
-
<
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
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="/
|
10
|
-
<link href="/
|
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
|
-
<
|
28
|
-
|
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> · <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>
|