houston-core 0.6.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +69 -68
- data/app/adapters/houston/adapters/deployment/engineyard.rb +1 -1
- data/app/adapters/houston/adapters/version_control/git_adapter/github_repo.rb +19 -0
- data/app/adapters/houston/adapters/version_control/git_adapter/remote_repo.rb +27 -0
- data/app/assets/images/drag-grip.png +0 -0
- data/app/assets/javascripts/app/infinite_scroll.coffee +1 -1
- data/app/assets/javascripts/app/views/_show_sprint_view.coffee +9 -9
- data/app/assets/javascripts/application.js +1 -0
- data/app/assets/javascripts/core/app.coffee +5 -0
- data/app/assets/javascripts/{app → core}/stacked_area_graph.coffee +0 -0
- data/app/assets/javascripts/{app → core}/stacked_bar_graph.coffee +0 -0
- data/app/assets/javascripts/dashboard.js +1 -0
- data/app/assets/javascripts/vendor.js +0 -1
- data/app/assets/stylesheets/application/exceptions.scss +3 -1
- data/app/assets/stylesheets/application/navigation.scss +84 -21
- data/app/assets/stylesheets/application/releases.scss +32 -2
- data/app/assets/stylesheets/application/test.scss +34 -0
- data/app/assets/stylesheets/core/colors.scss.erb +33 -3
- data/app/assets/stylesheets/dashboard/dashboard.scss +11 -7
- data/app/assets/stylesheets/variables.scss +3 -0
- data/app/concerns/belongs_to_commit.rb +14 -0
- data/app/concerns/project_adapter.rb +24 -6
- data/app/controllers/api/v1/projects_controller.rb +18 -0
- data/app/controllers/api/v1/sprint_tasks_controller.rb +1 -1
- data/app/controllers/deploys_controller.rb +1 -0
- data/app/controllers/project_tests_controller.rb +49 -19
- data/app/controllers/releases_controller.rb +5 -0
- data/app/controllers/test_runs_controller.rb +16 -1
- data/app/helpers/test_run_helper.rb +24 -0
- data/app/models/deploy.rb +13 -0
- data/app/models/github/pull_request.rb +39 -4
- data/app/models/release.rb +42 -0
- data/app/models/task.rb +3 -2
- data/app/models/test_run.rb +4 -0
- data/app/presenters/project_presenter.rb +28 -0
- data/app/views/deploys/show.html.erb +4 -0
- data/app/views/github/pulls/index.html.erb +4 -1
- data/app/views/layouts/_mobile_navigation.html.erb +14 -17
- data/app/views/layouts/_navigation.html.erb +87 -87
- data/app/views/layouts/dashboard.html.erb +2 -2
- data/app/views/project_tests/index.html.erb +22 -7
- data/app/views/releases/_index.html.erb +65 -0
- data/app/views/releases/_results.html.erb +47 -0
- data/app/views/releases/index.html.erb +29 -65
- data/app/views/sprints/dashboard.html.erb +4 -2
- data/config/environments/production.rb +1 -1
- data/config/environments/test.rb +4 -1
- data/config/initializers/add_navigation_renderers.rb +6 -0
- data/config/initializers/requirements.rb +1 -0
- data/config/routes.rb +3 -0
- data/db/migrate/20151226154901_add_search_vector_to_releases.rb +6 -0
- data/db/migrate/20151226155305_generate_index_on_releases.rb +5 -0
- data/db/migrate/20151228183704_drop_unused_tables.rb +35 -0
- data/db/migrate/20160120145757_add_successful_to_deploys.rb +10 -0
- data/db/structure.sql +19 -67
- data/houston.gemspec +3 -3
- data/lib/configuration.rb +4 -2
- data/lib/core_ext/array.rb +37 -0
- data/lib/houston/version.rb +1 -1
- data/test/integration/ci_integration_test.rb +14 -13
- data/test/unit/models/project_test.rb +33 -0
- data/test/unit/models/pull_request_test.rb +71 -1
- metadata +24 -14
- data/app/models/historical_head.rb +0 -5
data/app/models/task.rb
CHANGED
@@ -66,8 +66,9 @@ class Task < ActiveRecord::Base
|
|
66
66
|
joins(:sprint).where("sprints.end_date >= current_date")
|
67
67
|
end
|
68
68
|
|
69
|
-
def checked_out_by(user)
|
70
|
-
|
69
|
+
def checked_out_by(user, during: nil)
|
70
|
+
raise ArgumentError, "Please specify :during which Sprint" unless during
|
71
|
+
all.merge(SprintTask.where(sprint_id: during.id))
|
71
72
|
end
|
72
73
|
|
73
74
|
def find_by_project_and_shorthand(project_slug, shorthand)
|
data/app/models/test_run.rb
CHANGED
@@ -0,0 +1,28 @@
|
|
1
|
+
class ProjectPresenter
|
2
|
+
include UrlHelper
|
3
|
+
|
4
|
+
def initialize(projects)
|
5
|
+
@projects = OneOrMany.new(projects)
|
6
|
+
end
|
7
|
+
|
8
|
+
def as_json(*args)
|
9
|
+
projects = @projects
|
10
|
+
projects = Houston.benchmark "[#{self.class.name.underscore}] Load objects" do
|
11
|
+
projects.load
|
12
|
+
end if projects.is_a?(ActiveRecord::Relation)
|
13
|
+
Houston.benchmark "[#{self.class.name.underscore}] Prepare JSON" do
|
14
|
+
projects.map(&method(:project_to_json))
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def project_to_json(project)
|
19
|
+
{ id: project.id,
|
20
|
+
name: project.name,
|
21
|
+
slug: project.slug,
|
22
|
+
color: {
|
23
|
+
name: project.color,
|
24
|
+
hex: project.color_value.hex },
|
25
|
+
props: project.extended_attributes }
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -37,7 +37,9 @@
|
|
37
37
|
<%= image_tag pull.avatar_url, size: "32", alt: pull.username, class: "avatar avatar-not-our-user" %>
|
38
38
|
<% end %>
|
39
39
|
</td>
|
40
|
-
<td class="pull-request-project"
|
40
|
+
<td class="pull-request-project">
|
41
|
+
<%= link_to pull.project.slug, pull.project.repo.pulls_url, class: "label #{pull.project.color}", target: "_blank" %>
|
42
|
+
</td>
|
41
43
|
<td class="pull-request-title">
|
42
44
|
<%= link_to emojify(pull.title), pull.url, target: "_blank" %>
|
43
45
|
</td>
|
@@ -85,6 +87,7 @@
|
|
85
87
|
$('.pull-request').each(function() {
|
86
88
|
var $pull = $(this),
|
87
89
|
classes = $pull.attr('class').split(' '); classes.shift();
|
90
|
+
classes = _.filter(classes, function(str) { return str; });
|
88
91
|
$pull.toggle(_.all(classes, function(cssClass) {
|
89
92
|
return _.contains(visibleClasses, cssClass);
|
90
93
|
}));
|
@@ -1,23 +1,20 @@
|
|
1
1
|
<div class="navbar navbar-fixed-top navbar-inverse">
|
2
2
|
<div class="navbar-inner">
|
3
|
-
|
4
|
-
<%= link_to Houston.config.title, main_app.root_url, class: "brand" %>
|
3
|
+
<%= link_to Houston.config.title, main_app.root_url, class: "brand" %>
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
</div>
|
5
|
+
<ul class="nav pull-right nav-inline">
|
6
|
+
<% if current_user -%>
|
7
|
+
<li class="current-user dropdown">
|
8
|
+
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><%= avatar_for(current_user, size: 30) %> <b class="caret"></b></a>
|
9
|
+
<ul class="dropdown-menu">
|
10
|
+
<li><%= link_to "Settings", main_app.edit_user_path(current_user) %></li>
|
11
|
+
<li><%= link_to "Sign out", main_app.destroy_user_session_path %></li>
|
12
|
+
</ul>
|
13
|
+
</li>
|
14
|
+
<% else -%>
|
15
|
+
<li><%= link_to "Sign in", main_app.new_user_session_path %></li>
|
16
|
+
<% end -%>
|
17
|
+
</ul>
|
21
18
|
</div>
|
22
19
|
</div>
|
23
20
|
|
@@ -1,96 +1,96 @@
|
|
1
1
|
<div class="navbar navbar-fixed-top navbar-inverse">
|
2
2
|
<div class="navbar-inner">
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
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
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
3
|
+
<%= link_to Houston.config.title, main_app.root_url, class: "brand" %>
|
4
|
+
|
5
|
+
<ul class="nav pull-right">
|
6
|
+
<% if current_user -%>
|
7
|
+
<li class="current-user dropdown">
|
8
|
+
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><%= avatar_for(current_user, size: 30) %> <b class="caret"></b></a>
|
9
|
+
<ul class="dropdown-menu">
|
10
|
+
<li><%= link_to "Settings", main_app.edit_user_path(current_user) %></li>
|
11
|
+
<li><%= link_to "Sign out", main_app.destroy_user_session_path %></li>
|
12
|
+
</ul>
|
13
|
+
</li>
|
14
|
+
<% else -%>
|
15
|
+
<li><%= link_to "Sign in", main_app.new_user_session_path %></li>
|
16
|
+
<% end -%>
|
17
|
+
</ul>
|
18
|
+
<ul class="nav">
|
19
|
+
|
20
|
+
<% Houston.config.navigation.each do |navigation| %><%= render_navigation navigation %><% end %>
|
21
|
+
|
22
|
+
<li class="divider-vertical"></li>
|
23
|
+
|
24
|
+
<% if can?(:read, Project) -%>
|
25
|
+
<%= render_nav_link "Projects", main_app.projects_path, icon: "fa-database" %>
|
26
|
+
<% end -%>
|
27
|
+
|
28
|
+
<% if can?(:read, User) -%>
|
29
|
+
<%= render_nav_link "Team", main_app.users_path, icon: "fa-user" %>
|
30
|
+
<% end -%>
|
31
|
+
|
32
|
+
<% if can?(:read, :job) -%>
|
33
|
+
<%= render_nav_link "Jobs", main_app.jobs_path, icon: "fa-user" %>
|
34
|
+
<% end -%>
|
35
|
+
|
36
|
+
</ul>
|
37
|
+
</div>
|
38
|
+
</div>
|
39
|
+
|
40
|
+
<% if current_user -%>
|
41
|
+
<div class="navbar project-navbar <%= current_project.color %>">
|
42
|
+
<ul class="nav">
|
43
|
+
|
44
|
+
<li class="dropdown current-project <%= current_project && current_project.color %>">
|
45
|
+
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
|
46
|
+
<%= current_project ? current_project.name : "Select Project" %>
|
47
|
+
</a>
|
48
|
+
<ul class="dropdown-menu">
|
49
|
+
<% followed_projects.each do |project| %>
|
50
|
+
<% if project == current_project %>
|
51
|
+
<li class="current">
|
52
|
+
<b class="bubble <%= project.color %>"></b> <%= project.name %></a>
|
53
|
+
</li>
|
54
|
+
<% else %>
|
55
|
+
<li>
|
56
|
+
<% path = if !current_feature
|
57
|
+
# we're not on a project page,
|
58
|
+
# just refresh the page and set the project
|
59
|
+
"?project=#{project.slug}"
|
60
|
+
elsif !project.features.include?(current_feature)
|
61
|
+
# we're using a feature that this project
|
62
|
+
# doesn't support. Navigate to the root URL
|
63
|
+
# and set the project
|
64
|
+
main_app.root_path(project: project.slug)
|
65
|
+
else
|
66
|
+
feature_path(project, current_feature)
|
67
|
+
end %>
|
68
|
+
<%= link_to path do %>
|
69
|
+
<b class="bubble <%= project.color %>"></b> <%= project.name %></a>
|
51
70
|
<% end %>
|
52
|
-
</
|
53
|
-
|
71
|
+
</li>
|
72
|
+
<% end %>
|
54
73
|
<% end %>
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
<% Houston.config.navigation.each do |navigation| %><%= render_navigation navigation %><% end %>
|
59
|
-
|
60
|
-
<li class="divider-vertical"></li>
|
61
|
-
|
62
|
-
<% if can?(:read, Project) -%>
|
63
|
-
<%= render_nav_link "Projects", main_app.projects_path, icon: "fa-database" %>
|
64
|
-
<% end -%>
|
65
|
-
|
66
|
-
<% if can?(:read, User) -%>
|
67
|
-
<%= render_nav_link "Team", main_app.users_path, icon: "fa-user" %>
|
68
|
-
<% end -%>
|
69
|
-
|
70
|
-
<% if can?(:read, :job) -%>
|
71
|
-
<%= render_nav_link "Jobs", main_app.jobs_path, icon: "fa-user" %>
|
72
|
-
<% end -%>
|
73
|
-
|
74
74
|
</ul>
|
75
|
-
</
|
76
|
-
</div>
|
77
|
-
</div>
|
75
|
+
</li>
|
78
76
|
|
79
|
-
<% if current_project && current_project.persisted? %>
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
77
|
+
<% if current_project && current_project.persisted? %>
|
78
|
+
<% if current_project.features.any? %>
|
79
|
+
<% current_project.features.each do |feature| %>
|
80
|
+
<% if feature == :settings %>
|
81
|
+
<li class="divider-vertical"></li>
|
82
|
+
<% end %>
|
83
|
+
<%= render_nav_for_feature(feature) %>
|
84
|
+
<% end %>
|
85
|
+
<% else %>
|
86
|
+
<li class="project-no-features">
|
87
|
+
No features are enabled for <%= current_project.name %>.
|
88
|
+
<% if can?(:update, current_project) %>
|
89
|
+
You can enable features in <%= link_to "Project Settings", main_app.edit_project_path(current_project) %>.
|
90
|
+
<% end %>
|
91
|
+
</li>
|
92
92
|
<% end %>
|
93
|
-
|
94
|
-
|
93
|
+
<% end %>
|
94
|
+
</ul>
|
95
95
|
</div>
|
96
96
|
<% end %>
|
@@ -27,10 +27,10 @@
|
|
27
27
|
<link href="images/apple-touch-icon-114x114.png" rel="apple-touch-icon" sizes="114x114">
|
28
28
|
</head>
|
29
29
|
<body class="dashboard">
|
30
|
-
<div id="container" <% if params[:zoom].to_f > 0 %> style="transform: scale(<%= params[:zoom].to_f %>); transform-origin: 50% 0; -webkit-transform: scale(<%= params[:zoom].to_f %>); -webkit-transform-origin: 50% 0; -moz-transform: scale(<%= params[:zoom].to_f %>); -moz-transform-origin: 50% 0;" <% end %>>
|
30
|
+
<div id="container" <% if params[:zoom].to_f > 0 %> style="transform: scale(<%= params[:zoom].to_f %>); transform-origin: 50% 0; -webkit-transform: scale(<%= params[:zoom].to_f %>); -webkit-transform-origin: 50% 0; -moz-transform: scale(<%= params[:zoom].to_f %>); -moz-transform-origin: 50% 0; width: <%= (1 / params[:zoom].to_f) * 100 %>%; height: <%= (1 / params[:zoom].to_f) * 100 %>%;" <% end %>>
|
31
31
|
<%= yield -%>
|
32
32
|
</div>
|
33
|
-
|
33
|
+
|
34
34
|
<!-- Le javascript
|
35
35
|
================================================== -->
|
36
36
|
<!-- Placed at the end of the document so the pages load faster -->
|
@@ -10,21 +10,31 @@
|
|
10
10
|
<th class="test-name sort-asc">Name</th>
|
11
11
|
<th class="test-passes">Passes</th>
|
12
12
|
<th class="test-fails">Fails</th>
|
13
|
+
<th class="test-graph">Graph</th>
|
14
|
+
<th class="test-duration">Duration</th>
|
13
15
|
<td class="table-margin"></td>
|
14
16
|
</tr>
|
15
17
|
</thead>
|
16
18
|
<tbody>
|
17
|
-
<% @tests.each do |
|
19
|
+
<% @tests.each do |test| %>
|
18
20
|
<tr class="test">
|
19
21
|
<td class="table-margin"></td>
|
20
22
|
<td class="test-name">
|
21
|
-
<%= link_to project_test_url(slug: @project.slug, id: id) do %>
|
22
|
-
<span class="test-suite-name"><%= suite.gsub("__", "::") %></span>
|
23
|
-
<span class="test-name"><%= name.to_s.gsub(/^(test :|: )/, "") %></span>
|
23
|
+
<%= link_to project_test_url(slug: @project.slug, id: test[:id]) do %>
|
24
|
+
<span class="test-suite-name"><%= test[:suite].gsub("__", "::") %></span>
|
25
|
+
<span class="test-name"><%= test[:name].to_s.gsub(/^(test :|: )/, "") %></span>
|
24
26
|
<% end %>
|
25
27
|
</td>
|
26
|
-
<td class="test-passes
|
27
|
-
<td class="test-fails
|
28
|
+
<td class="test-passes"><%= test_results_pass_count(test)%></td>
|
29
|
+
<td class="test-fails"><%= test_results_fail_count(test)%></td>
|
30
|
+
<td class="test-graph" data-position="<%= test_results_count(test) %>"><%= test_results_graph(test) %></td>
|
31
|
+
<td class="test-duration">
|
32
|
+
<span class="test-duration-average"><%= test[:duration_avg].to_i %>ms</span>
|
33
|
+
<span class="test-duration-range">
|
34
|
+
<%= test[:duration5].to_i %>ms – <%= test[:duration95].to_i %>ms
|
35
|
+
</span>
|
36
|
+
</td>
|
37
|
+
<td class="table-margin"></td>
|
28
38
|
</tr>
|
29
39
|
<% end %>
|
30
40
|
</tbody>
|
@@ -34,7 +44,12 @@
|
|
34
44
|
<% content_for :javascripts do %>
|
35
45
|
<script type="text/javascript">
|
36
46
|
$(function() {
|
37
|
-
$('#project_tests').tablesorter(
|
47
|
+
$('#project_tests').tablesorter({
|
48
|
+
headers: {
|
49
|
+
4: {sorter: 'property'},
|
50
|
+
5: {sorter: 'digit'}
|
51
|
+
}
|
52
|
+
});
|
38
53
|
});
|
39
54
|
</script>
|
40
55
|
<% end %>
|
@@ -0,0 +1,65 @@
|
|
1
|
+
<% if @deploys.none? %>
|
2
|
+
|
3
|
+
<div class="alert alert-info">
|
4
|
+
There have been no deploys of <b><%= @project.name %></b> to <b><%= @environment %></b> recorded.
|
5
|
+
</div>
|
6
|
+
|
7
|
+
<% else %>
|
8
|
+
|
9
|
+
<% date = nil %>
|
10
|
+
<div id="<%= @project.slug %>_changelog" class="-houston-changelog">
|
11
|
+
<% @deploys.each do |deploy| %>
|
12
|
+
<% deploy.project = @project; release = deploy.release %>
|
13
|
+
<% next if release.nil? && deploy.commit.nil? %>
|
14
|
+
|
15
|
+
<% if date.nil? || date != deploy.date %>
|
16
|
+
<% if date %></div><% end %><%# end .-houston-changelog-day %>
|
17
|
+
<div class="-houston-changelog-day">
|
18
|
+
<h4><%= format_release_date(date = deploy.date) %></h4>
|
19
|
+
<% end %>
|
20
|
+
|
21
|
+
<% unless release %>
|
22
|
+
<div class="release release-deploy">
|
23
|
+
<p class="release-header">
|
24
|
+
<%= deploy.completed_at.strftime("%l:%M %p") %>
|
25
|
+
<% deploy.commit.project = @project %>
|
26
|
+
Deploy to <%= link_to_commit deploy.commit, style: "float: none;" %>
|
27
|
+
|
28
|
+
<span style="float: right;">
|
29
|
+
<%= link_to "New Release", new_release_path(slug: @project.slug, environment: @environment, deploy_id: deploy.id), class: "btn btn-mini btn-default" %>
|
30
|
+
</span>
|
31
|
+
</div>
|
32
|
+
<% else %>
|
33
|
+
<%= div_for(release) do %>
|
34
|
+
<% release.project = @project %>
|
35
|
+
<p class="release-header">
|
36
|
+
<%= release.released_at.strftime("%l:%M %p") %>
|
37
|
+
<%= link_to "details →".html_safe, release_url(release) %>
|
38
|
+
|
39
|
+
<% if can?(:read, @project.commits.build) %>
|
40
|
+
<span class="commit-range"><%= link_to_release_commit_range(release) %></span>
|
41
|
+
<% end %>
|
42
|
+
</p>
|
43
|
+
|
44
|
+
<% if release.release_changes.any? %>
|
45
|
+
<div class="release-changes">
|
46
|
+
<% ordered_by_tag(release.release_changes).each do |change| %>
|
47
|
+
<% if can?(:read, change) %>
|
48
|
+
<div class="change">
|
49
|
+
<%= format_change_tag change.tag %>
|
50
|
+
<div class="change-summary"><%= format_change(change) %></div>
|
51
|
+
</div>
|
52
|
+
<% end %>
|
53
|
+
<% end %>
|
54
|
+
</div>
|
55
|
+
<% else %>
|
56
|
+
<div class="release-no-changes">No changes</div>
|
57
|
+
<% end %>
|
58
|
+
<% end %>
|
59
|
+
<% end %>
|
60
|
+
|
61
|
+
<% end %>
|
62
|
+
<% if date %></div><% end %><%# end .-houston-changelog-day %>
|
63
|
+
</div>
|
64
|
+
|
65
|
+
<% end %>
|
@@ -0,0 +1,47 @@
|
|
1
|
+
<% if @releases.none? %>
|
2
|
+
|
3
|
+
<div class="alert alert-info">
|
4
|
+
No results found.
|
5
|
+
</div>
|
6
|
+
|
7
|
+
<% else %>
|
8
|
+
|
9
|
+
<% date = nil %>
|
10
|
+
<div id="<%= @project.slug %>_changelog" class="-houston-changelog release-search-result">
|
11
|
+
<% @releases.each do |release| %>
|
12
|
+
<% release.project = @project %>
|
13
|
+
|
14
|
+
<% if date.nil? || date != release.date %>
|
15
|
+
<% if date %></div><% end %><%# end .-houston-changelog-day %>
|
16
|
+
<div class="-houston-changelog-day">
|
17
|
+
<h4><%= format_release_date(date = release.date) %></h4>
|
18
|
+
<% end %>
|
19
|
+
|
20
|
+
<%= div_for(release) do %>
|
21
|
+
<% release.project = @project %>
|
22
|
+
<p class="release-header">
|
23
|
+
<%= release.released_at.strftime("%l:%M %p") %>
|
24
|
+
<%= link_to "details →".html_safe, release_url(release) %>
|
25
|
+
|
26
|
+
<% if can?(:read, @project.commits.build) %>
|
27
|
+
<span class="commit-range"><%= link_to_release_commit_range(release) %></span>
|
28
|
+
<% end %>
|
29
|
+
</p>
|
30
|
+
|
31
|
+
<div class="release-changes">
|
32
|
+
<% ordered_by_tag(release.release_changes).each do |change| %>
|
33
|
+
<% if can?(:read, change) %>
|
34
|
+
<div class="change">
|
35
|
+
<%= format_change_tag change.tag %>
|
36
|
+
<div class="change-summary"><%= format_change(change) %></div>
|
37
|
+
</div>
|
38
|
+
<% end %>
|
39
|
+
<% end %>
|
40
|
+
</div>
|
41
|
+
<% end %>
|
42
|
+
|
43
|
+
<% end %>
|
44
|
+
<% if date %></div><% end %><%# end .-houston-changelog-day %>
|
45
|
+
</div>
|
46
|
+
|
47
|
+
<% end %>
|