summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/controllers/projects/blob_controller.rb5
-rw-r--r--app/controllers/projects/commit_controller.rb5
-rw-r--r--app/controllers/projects/compare_controller.rb5
-rw-r--r--app/controllers/projects/merge_requests_controller.rb10
-rw-r--r--app/finders/environments_finder.rb57
-rw-r--r--app/helpers/commits_helper.rb4
-rw-r--r--app/models/environment.rb8
-rw-r--r--app/models/merge_request.rb18
-rw-r--r--app/models/project.rb31
-rw-r--r--app/models/repository.rb25
-rw-r--r--app/services/ci/stop_environments_service.rb4
-rw-r--r--app/views/projects/blob/_actions.html.haml2
-rw-r--r--app/views/projects/diffs/_file.html.haml4
13 files changed, 102 insertions, 76 deletions
diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb
index e7d61510624..4c39fe98028 100644
--- a/app/controllers/projects/blob_controller.rb
+++ b/app/controllers/projects/blob_controller.rb
@@ -30,9 +30,8 @@ class Projects::BlobController < Projects::ApplicationController
end
def show
- environment_args = @repository.branch_exists?(@ref) ? { ref: @ref } : { commit: @commit }
- @environment = @project.environments_for(**environment_args).last
- @environment = nil unless can?(current_user, :read_environment, @environment)
+ environment_params = @repository.branch_exists?(@ref) ? { ref: @ref } : { commit: @commit }
+ @environment = EnvironmentsFinder.new(@project, current_user, environment_params).execute.last
end
def edit
diff --git a/app/controllers/projects/commit_controller.rb b/app/controllers/projects/commit_controller.rb
index 5bcc545462f..aade1b6c256 100644
--- a/app/controllers/projects/commit_controller.rb
+++ b/app/controllers/projects/commit_controller.rb
@@ -95,9 +95,8 @@ class Projects::CommitController < Projects::ApplicationController
@diffs = commit.diffs(opts)
@notes_count = commit.notes.count
-
- @environment = @project.environments_for(commit: @commit).last
- @environment = nil unless can?(current_user, :read_environment, @environment)
+
+ @environment = EnvironmentsFinder.new(@project, current_user, commit: @commit).execute.last
end
def define_note_vars
diff --git a/app/controllers/projects/compare_controller.rb b/app/controllers/projects/compare_controller.rb
index d5cca827e9f..c6651254d70 100644
--- a/app/controllers/projects/compare_controller.rb
+++ b/app/controllers/projects/compare_controller.rb
@@ -57,9 +57,8 @@ class Projects::CompareController < Projects::ApplicationController
@diffs = @compare.diffs(diff_options)
- environment_args = @repository.branch_exists?(@head_ref) ? { ref: @head_ref } : { commit: @commit }
- @environment = @project.environments_for(**environment_args).last
- @environment = nil unless can?(current_user, :read_environment, @environment)
+ environment_params = @repository.branch_exists?(@head_ref) ? { ref: @head_ref } : { commit: @commit }
+ @environment = EnvironmentsFinder.new(@project, current_user, environment_params).execute.last
@diff_notes_disabled = true
@grouped_diff_discussions = {}
diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index a84e15de99a..4f12648e7b1 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -103,8 +103,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
end
end
- @environment = @merge_request.environments.last
- @environment = nil unless can?(current_user, :read_environment, @environment)
+ @environment = @merge_request.environments_for(current_user).last
respond_to do |format|
format.html { define_discussion_vars }
@@ -248,8 +247,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
end
@diff_notes_disabled = true
- @environment = @merge_request.environments.last
- @environment = nil unless can?(current_user, :read_environment, @environment)
+ @environment = @merge_request.environments_for(current_user).last
render json: { html: view_to_html_string('projects/merge_requests/_new_diffs', diffs: @diffs, environment: @environment) }
end
@@ -450,9 +448,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
def ci_environments_status
environments =
begin
- @merge_request.environments.map do |environment|
- next unless can?(current_user, :read_environment, environment)
-
+ @merge_request.environments_for(current_user).map do |environment|
project = environment.project
deployment = environment.first_deployment_for(@merge_request.diff_head_commit)
diff --git a/app/finders/environments_finder.rb b/app/finders/environments_finder.rb
new file mode 100644
index 00000000000..5c798a75945
--- /dev/null
+++ b/app/finders/environments_finder.rb
@@ -0,0 +1,57 @@
+class EnvironmentsFinder
+ attr_reader :project, :current_user, :params
+
+ def initialize(project, current_user, params = {})
+ @project, @current_user, @params = project, current_user, params
+ end
+
+ def execute(skip_authorization: false)
+ deployments = project.deployments
+ deployments =
+ if ref
+ deployments_query = params[:with_tags] ? 'ref = :ref OR tag IS TRUE' : 'ref = :ref'
+ deployments.where(deployments_query, ref: ref.to_s)
+ elsif commit
+ deployments.where(sha: commit.sha)
+ else
+ deployments.none
+ end
+
+ environment_ids = deployments
+ .group(:environment_id)
+ .select(:environment_id)
+
+ environments = project.environments.available
+ .where(id: environment_ids).order_by_last_deployed_at.to_a
+
+ if ref && commit
+ environments.select! do |environment|
+ environment.includes_commit?(commit)
+ end
+ end
+
+ if ref && params[:recently_updated]
+ environments.select! do |environment|
+ environment.recently_updated_on_branch?(ref)
+ end
+ end
+
+ unless skip_authorization
+ environments.select! do |environment|
+ Ability.allowed?(current_user, :read_environment, environment)
+ end
+ end
+
+ environments
+ end
+
+ private
+
+ def ref
+ params[:ref].try(:to_s)
+ end
+
+ def commit
+ params[:commit]
+ end
+end
diff --git a/app/helpers/commits_helper.rb b/app/helpers/commits_helper.rb
index a5cf4ddb6a3..8aad39e148b 100644
--- a/app/helpers/commits_helper.rb
+++ b/app/helpers/commits_helper.rb
@@ -194,7 +194,7 @@ module CommitsHelper
end
end
- def view_file_btn(commit_sha, diff_new_path, project)
+ def view_file_button(commit_sha, diff_new_path, project)
link_to(
namespace_project_blob_path(project.namespace, project,
tree_join(commit_sha, diff_new_path)),
@@ -205,7 +205,7 @@ module CommitsHelper
end
end
- def view_on_environment_btn(commit_sha, diff_new_path, environment)
+ def view_on_environment_button(commit_sha, diff_new_path, environment)
return unless environment && commit_sha
external_url = environment.external_url_for(diff_new_path, commit_sha)
diff --git a/app/models/environment.rb b/app/models/environment.rb
index 14787f79a36..1e4c420cec7 100644
--- a/app/models/environment.rb
+++ b/app/models/environment.rb
@@ -38,7 +38,13 @@ class Environment < ActiveRecord::Base
scope :available, -> { with_state(:available) }
scope :stopped, -> { with_state(:stopped) }
- scope :order_by_last_deployed_at, -> { order(Gitlab::Database.nulls_first_order('(SELECT MAX(id) FROM deployments WHERE deployments.environment_id = environments.id)', 'ASC')) }
+ scope :order_by_last_deployed_at, -> do
+ max_deployment_id_sql =
+ Deployment.select(Deployment.arel_table[:id].maximum).
+ where(Deployment.arel_table[:environment_id].eq(arel_table[:id])).
+ to_sql
+ order(Gitlab::Database.nulls_first_order("(#{max_deployment_id_sql})", 'ASC'))
+ end
state_machine :state, initial: :available do
event :start do
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 965315c42a8..43085f69105 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -715,18 +715,22 @@ class MergeRequest < ActiveRecord::Base
!head_pipeline || head_pipeline.success? || head_pipeline.skipped?
end
- def environments
+ def environments_for(current_user)
return [] unless diff_head_commit
- @environments ||= begin
- target_envs = target_project.environments_for(
- ref: target_branch, commit: diff_head_commit, with_tags: true)
+ @environments ||= Hash.new do |h, current_user|
+ envs = EnvironmentsFinder.new(target_project, current_user,
+ ref: target_branch, commit: diff_head_commit, with_tags: true).execute
- source_envs = source_project.environments_for(
- ref: source_branch, commit: diff_head_commit) if source_project
+ if source_project
+ envs.concat EnvironmentsFinder.new(source_project, current_user,
+ ref: source_branch, commit: diff_head_commit).execute
+ end
- (target_envs.to_a + source_envs.to_a).uniq
+ h[current_user] = envs.uniq
end
+
+ @environments[current_user]
end
def state_human_name
diff --git a/app/models/project.rb b/app/models/project.rb
index ff4487b6c8c..b45f22d94d9 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -1306,37 +1306,6 @@ class Project < ActiveRecord::Base
Gitlab::Redis.with { |redis| redis.del(pushes_since_gc_redis_key) }
end
- def environments_for(ref: nil, commit: nil, with_tags: false)
- deps =
- if ref
- deployments_query = with_tags ? 'ref = ? OR tag IS TRUE' : 'ref = ?'
- deployments.where(deployments_query, ref.to_s)
- elsif commit
- deployments.where(sha: commit.sha)
- else
- Deployment.none
- end
-
- environment_ids = deps
- .group(:environment_id)
- .select(:environment_id)
-
- environments_found = environments.available
- .where(id: environment_ids).order_by_last_deployed_at.to_a
-
- return environments_found unless ref && commit
-
- environments_found.select do |environment|
- environment.includes_commit?(commit)
- end
- end
-
- def environments_recently_updated_on_branch(branch)
- environments_for(ref: branch).select do |environment|
- environment.recently_updated_on_branch?(branch)
- end
- end
-
def route_map_for(commit_sha)
@route_maps_by_commit ||= Hash.new do |h, sha|
h[sha] = begin
diff --git a/app/models/repository.rb b/app/models/repository.rb
index 3e52841e802..d2d92a064a4 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -35,9 +35,6 @@ class Repository
avatar: :avatar
}
- ROUTE_MAP_PATH = '.gitlab/route-map.yml'
- GITLAB_CI_YML_PATH = '.gitlab-ci.yml'
-
# Wraps around the given method and caches its output in Redis and an instance
# variable.
#
@@ -1165,6 +1162,14 @@ class Repository
end
end
+ def route_map_for(sha)
+ blob_data_at(sha, '.gitlab/route-map.yml')
+ end
+
+ def gitlab_ci_yml_for(sha)
+ blob_data_at(sha, '.gitlab-ci.yml')
+ end
+
protected
def tree_entry_at(branch_name, path)
@@ -1189,24 +1194,16 @@ class Repository
end
end
- def route_map_for(sha)
- blob = blob_at(sha, ROUTE_MAP_PATH)
- return unless blob
-
- blob.load_all_data!(self)
- blob.data
- end
+ private
- def gitlab_ci_yml_for(sha)
- blob = blob_at(sha, GITLAB_CI_YML_PATH)
+ def blob_data_at(sha, path)
+ blob = blob_at(sha, path)
return unless blob
blob.load_all_data!(self)
blob.data
end
- private
-
def git_action(index, action)
path = normalize_path(action[:file_path])
diff --git a/app/services/ci/stop_environments_service.rb b/app/services/ci/stop_environments_service.rb
index cf590459cb2..8333f4c6d85 100644
--- a/app/services/ci/stop_environments_service.rb
+++ b/app/services/ci/stop_environments_service.rb
@@ -22,8 +22,8 @@ module Ci
end
def environments
- @environments ||= project
- .environments_recently_updated_on_branch(@ref)
+ @environments ||=
+ EnvironmentsFinder.new(project, nil, ref: @ref, recently_updated: true).execute(skip_authorization: true)
end
end
end
diff --git a/app/views/projects/blob/_actions.html.haml b/app/views/projects/blob/_actions.html.haml
index 6da2e4770bc..63f15f312b9 100644
--- a/app/views/projects/blob/_actions.html.haml
+++ b/app/views/projects/blob/_actions.html.haml
@@ -1,5 +1,5 @@
.btn-group
- = view_on_environment_btn(@commit.sha, @path, @environment) if @environment
+ = view_on_environment_button(@commit.sha, @path, @environment) if @environment
.btn-group.tree-btn-group
= link_to 'Raw', namespace_project_raw_path(@project.namespace, @project, @id),
diff --git a/app/views/projects/diffs/_file.html.haml b/app/views/projects/diffs/_file.html.haml
index f7aa4fb90f1..75885badac9 100644
--- a/app/views/projects/diffs/_file.html.haml
+++ b/app/views/projects/diffs/_file.html.haml
@@ -14,7 +14,7 @@
= edit_blob_link(@merge_request.source_project, @merge_request.source_branch, diff_file.new_path,
blob: blob, link_opts: link_opts)
- = view_file_btn(diff_commit.id, diff_file.new_path, project)
- = view_on_environment_btn(diff_commit.id, diff_file.new_path, environment) if environment
+ = view_file_button(diff_commit.id, diff_file.new_path, project)
+ = view_on_environment_button(diff_commit.id, diff_file.new_path, environment) if environment
= render 'projects/diffs/content', diff_file: diff_file, diff_commit: diff_commit, blob: blob, project: project