From cf7da039bedcad5163ce9deedccc94206d4c485a Mon Sep 17 00:00:00 2001
From: Kamil Trzcinski <ayufan@ayufan.eu>
Date: Fri, 29 Apr 2016 15:14:38 +0200
Subject: [PATCH] commit status

---
 .../projects/environments_controller.rb       | 17 ++++++
 app/helpers/gitlab_routing_helper.rb          |  4 ++
 app/models/ci/pipeline.rb                     |  4 ++
 .../environments/_environment.html.haml       | 58 +++++++++++++++++++
 .../environments/_header_title.html.haml      |  1 +
 .../projects/environments/index.html.haml     | 22 +++++++
 .../projects/environments/show.html.haml      | 30 ++++++++++
 config/routes.rb                              |  2 +
 8 files changed, 138 insertions(+)
 create mode 100644 app/controllers/projects/environments_controller.rb
 create mode 100644 app/views/projects/environments/_environment.html.haml
 create mode 100644 app/views/projects/environments/_header_title.html.haml
 create mode 100644 app/views/projects/environments/index.html.haml
 create mode 100644 app/views/projects/environments/show.html.haml

diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb
new file mode 100644
index 00000000000..f5af24ed217
--- /dev/null
+++ b/app/controllers/projects/environments_controller.rb
@@ -0,0 +1,17 @@
+class Projects::EnvironmentsController < Projects::ApplicationController
+  layout 'project'
+
+  def index
+    @environments = project.builds.where.not(environment: nil).pluck(:environment).uniq
+    @environments = @environments.map { |env| build_for_env(env) }.compact
+  end
+
+  def show
+    @environment = params[:id].to_s
+    @builds = project.builds.where.not(status: ["manual"]).where(environment: params[:id].to_s).order(id: :desc).page(params[:page]).per(30)
+  end
+
+  def build_for_env(environment)
+    project.builds.success.order(id: :desc).find_by(environment: environment)
+  end
+end
diff --git a/app/helpers/gitlab_routing_helper.rb b/app/helpers/gitlab_routing_helper.rb
index 2ce2d4e694f..aae6b5d0d38 100644
--- a/app/helpers/gitlab_routing_helper.rb
+++ b/app/helpers/gitlab_routing_helper.rb
@@ -29,6 +29,10 @@ module GitlabRoutingHelper
     namespace_project_pipelines_path(project.namespace, project, *args)
   end
 
+  def project_environments_path(project, *args)
+    namespace_project_environments_path(project.namespace, project, *args)
+  end
+
   def project_builds_path(project, *args)
     namespace_project_builds_path(project.namespace, project, *args)
   end
diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb
index 9b5b46f4928..85d9e0856d1 100644
--- a/app/models/ci/pipeline.rb
+++ b/app/models/ci/pipeline.rb
@@ -161,6 +161,10 @@ module Ci
       git_commit_message =~ /(\[ci skip\])/ if git_commit_message
     end
 
+    def environments
+      builds.where.not(environment: nil).success.pluck(:environment).uniq
+    end
+
     private
 
     def update_state
diff --git a/app/views/projects/environments/_environment.html.haml b/app/views/projects/environments/_environment.html.haml
new file mode 100644
index 00000000000..e3216aea6cd
--- /dev/null
+++ b/app/views/projects/environments/_environment.html.haml
@@ -0,0 +1,58 @@
+%tr.commit
+  - commit = build.commit
+  - status = build.status
+
+  %td
+    %strong
+      = link_to build.environment, namespace_project_environment_path(@project.namespace, @project, build.environment), class: "monospace"
+
+  %td.commit-link
+    = link_to namespace_project_pipeline_path(@project.namespace, @project, commit.id), class: "ci-status ci-#{commit.status}" do
+      = ci_icon_for_status(commit.status)
+      %strong ##{commit.id}
+
+  %td.commit-link
+    = link_to namespace_project_build_path(@project.namespace, @project, build.id), class: "ci-status ci-#{build.status}" do
+      = ci_icon_for_status(build.status)
+      %strong ##{build.id}
+
+  %td
+    %div.branch-commit
+      - if commit.ref
+        = link_to commit.ref, namespace_project_commits_path(@project.namespace, @project, commit.ref), class: "monospace"
+        &middot;
+      = link_to commit.short_sha, namespace_project_commit_path(@project.namespace, @project, commit.sha), class: "commit-id monospace"
+
+      %p
+        %span
+          - if commit_data = commit.commit_data
+            = link_to_gfm commit_data.title, namespace_project_commit_path(@project.namespace, @project, commit_data.id), class: "commit-row-message"
+          - else
+            Cant find HEAD commit for this branch
+
+  %td
+    - if build.started_at && build.finished_at
+      %p
+        %i.fa.fa-clock-o
+        &nbsp;
+        #{duration_in_words(build.finished_at, build.started_at)}
+    - if build.finished_at
+      %p
+        %i.fa.fa-calendar
+        &nbsp;
+        #{time_ago_with_tooltip(build.finished_at)}
+
+  %td
+    .controls.hidden-xs.pull-right
+      - manual = commit.builds.latest.manual_actions.to_a
+      - if manual.any?
+        .dropdown.inline
+          %button.dropdown-toggle.btn{type: 'button', 'data-toggle' => 'dropdown'}
+            = icon('play')
+            %b.caret
+          %ul.dropdown-menu.dropdown-menu-align-right
+            - manual.each do |manual_build|
+              %li
+                = link_to '#', rel: 'nofollow' do
+                  %i.fa.fa-play
+                  %span #{manual_build.name}
diff --git a/app/views/projects/environments/_header_title.html.haml b/app/views/projects/environments/_header_title.html.haml
new file mode 100644
index 00000000000..e056fccad5d
--- /dev/null
+++ b/app/views/projects/environments/_header_title.html.haml
@@ -0,0 +1 @@
+- header_title project_title(@project, "Environments", project_environments_path(@project))
diff --git a/app/views/projects/environments/index.html.haml b/app/views/projects/environments/index.html.haml
new file mode 100644
index 00000000000..e94bc97be9d
--- /dev/null
+++ b/app/views/projects/environments/index.html.haml
@@ -0,0 +1,22 @@
+- page_title "Environments"
+= render "header_title"
+
+.gray-content-block
+  Environments for this project
+
+%ul.content-list
+  - if @environments.blank?
+    %li
+      .nothing-here-block No environments to show
+  - else
+    .table-holder
+      %table.table.builds
+        %tbody
+          %th Environment
+          %th Pipeline ID
+          %th Build ID
+          %th Changes
+          %th
+          %th
+        - @environments.each do |build|
+          = render "environment", build: build
diff --git a/app/views/projects/environments/show.html.haml b/app/views/projects/environments/show.html.haml
new file mode 100644
index 00000000000..ce2d9cf7d71
--- /dev/null
+++ b/app/views/projects/environments/show.html.haml
@@ -0,0 +1,30 @@
+- page_title "Environments"
+
+= render "header_title"
+
+.gray-content-block
+  Latest deployments for
+  %strong
+    = @environment
+
+%ul.content-list
+  - if @builds.blank?
+    %li
+      .nothing-here-block No builds to show for specific environment
+  - else
+    .table-holder
+      %table.table.builds
+        %thead
+          %tr
+            %th Status
+            %th Build ID
+            %th Commit
+            %th Ref
+            %th Name
+            %th Duration
+            %th Finished at
+            %th
+
+        = render @builds, commit_sha: true, ref: true, allow_retry: true
+
+    = paginate @builds, theme: 'gitlab'
diff --git a/config/routes.rb b/config/routes.rb
index 95fbe7dd9df..6b8402c40dd 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -704,6 +704,8 @@ Rails.application.routes.draw do
           end
         end
 
+        resources :environments, only: [:index, :show]
+
         resources :builds, only: [:index, :show], constraints: { id: /\d+/ } do
           collection do
             post :cancel_all
-- 
GitLab