summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/models/environment_status.rb29
-rw-r--r--app/serializers/environment_status_entity.rb2
-rw-r--r--spec/models/environment_status_spec.rb28
-rw-r--r--spec/serializers/environment_status_entity_spec.rb9
4 files changed, 68 insertions, 0 deletions
diff --git a/app/models/environment_status.rb b/app/models/environment_status.rb
index cae0d396089..5ff3acc0e58 100644
--- a/app/models/environment_status.rb
+++ b/app/models/environment_status.rb
@@ -24,4 +24,33 @@ class EnvironmentStatus
def deployed_at
deployment&.created_at
end
+
+ def changes
+ sha = merge_request.diff_head_sha
+ return [] if project.route_map_for(sha).nil?
+
+ changed_files.map { |file| build_change(file, sha) }.compact
+ end
+
+ def changed_files
+ merge_request.merge_request_diff
+ .merge_request_diff_files.where(deleted_file: false)
+ end
+
+ private
+
+ PAGE_EXTENSIONS = /\A\.(s?html?|php|asp|cgi|pl)\z/i.freeze
+
+ def build_change(file, sha)
+ public_path = project.public_path_for_source_path(file.new_path, sha)
+ return if public_path.nil?
+
+ ext = File.extname(public_path)
+ return if ext.present? && ext !~ PAGE_EXTENSIONS
+
+ {
+ path: public_path,
+ external_url: environment.external_url_for(file.new_path, sha)
+ }
+ end
end
diff --git a/app/serializers/environment_status_entity.rb b/app/serializers/environment_status_entity.rb
index 62152dd1d40..3dfa4f204c9 100644
--- a/app/serializers/environment_status_entity.rb
+++ b/app/serializers/environment_status_entity.rb
@@ -36,6 +36,8 @@ class EnvironmentStatusEntity < Grape::Entity
es.deployment.try(:formatted_deployment_time)
end
+ expose :changes, if: ->(*) { Feature.enabled?(:ci_environments_status_changes, project) }
+
private
def environment
diff --git a/spec/models/environment_status_spec.rb b/spec/models/environment_status_spec.rb
index 0fbf949d38e..f2eb263c98c 100644
--- a/spec/models/environment_status_spec.rb
+++ b/spec/models/environment_status_spec.rb
@@ -30,4 +30,32 @@ describe EnvironmentStatus do
it { is_expected.to eq(deployment) }
end
+
+ # $ git diff --stat pages-deploy-target...pages-deploy
+ # .gitlab/route-map.yml | 5 +++++
+ # files/html/500.html | 13 -------------
+ # files/html/page.html | 3 +++
+ # files/js/application.js | 3 +++
+ # files/markdown/ruby-style-guide.md | 4 ++++
+ # pages-deploy.txt | 1 +
+ #
+ # $ cat .gitlab/route-map.yml
+ # - source: /files\/markdown\/(.+)\.md$/
+ # public: '\1.html'
+ #
+ # - source: /files\/(.+)/
+ # public: '\1'
+ describe '#changes' do
+ it 'contains only added and modified public pages' do
+ expect(environment_status.changes).to contain_exactly(
+ {
+ path: 'ruby-style-guide.html',
+ external_url: "#{environment.external_url}/ruby-style-guide.html"
+ }, {
+ path: 'html/page.html',
+ external_url: "#{environment.external_url}/html/page.html"
+ }
+ )
+ end
+ end
end
diff --git a/spec/serializers/environment_status_entity_spec.rb b/spec/serializers/environment_status_entity_spec.rb
index 867ebecc77d..6894c65d639 100644
--- a/spec/serializers/environment_status_entity_spec.rb
+++ b/spec/serializers/environment_status_entity_spec.rb
@@ -25,11 +25,20 @@ describe EnvironmentStatusEntity do
it { is_expected.to include(:external_url_formatted) }
it { is_expected.to include(:deployed_at) }
it { is_expected.to include(:deployed_at_formatted) }
+ it { is_expected.to include(:changes) }
it { is_expected.not_to include(:stop_url) }
it { is_expected.not_to include(:metrics_url) }
it { is_expected.not_to include(:metrics_monitoring_url) }
+ context 'when :ci_environments_status_changes feature flag is disabled' do
+ before do
+ stub_feature_flags(ci_environments_status_changes: false)
+ end
+
+ it { is_expected.not_to include(:changes) }
+ end
+
context 'when the user is project maintainer' do
before do
project.add_maintainer(user)