diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2019-10-10 00:06:24 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2019-10-10 00:06:24 +0300 |
commit | 4b28d5ae770c6bd332283a3f13ceae06329c409b (patch) | |
tree | ae4d46e1d017002935fe75dc14cb3c108be12fae /app | |
parent | 41efffa17c67405ca5f5dac49d72be7872cee339 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
9 files changed, 101 insertions, 6 deletions
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select/base.vue b/app/assets/javascripts/vue_shared/components/sidebar/labels_select/base.vue index 9c258c4651f..13795eff714 100644 --- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select/base.vue +++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select/base.vue @@ -167,7 +167,7 @@ dropdown-menu-labels dropdown-menu-selectable" <div class="dropdown-page-one"> <dropdown-header v-if="showCreate" /> <dropdown-search-input /> - <div class="dropdown-content"></div> + <div class="dropdown-content" data-qa-selector="labels_dropdown_content"></div> <div class="dropdown-loading"><gl-loading-icon /></div> <dropdown-footer v-if="showCreate" diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select/dropdown_title.vue b/app/assets/javascripts/vue_shared/components/sidebar/labels_select/dropdown_title.vue index cb53273c786..574b63cf8a6 100644 --- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select/dropdown_title.vue +++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select/dropdown_title.vue @@ -14,7 +14,11 @@ export default { {{ __('Labels') }} <template v-if="canEdit"> <i aria-hidden="true" class="fa fa-spinner fa-spin block-loading" data-hidden="true"> </i> - <button type="button" class="edit-link btn btn-blank float-right js-sidebar-dropdown-toggle"> + <button + type="button" + class="edit-link btn btn-blank float-right js-sidebar-dropdown-toggle" + data-qa-selector="labels_edit_button" + > {{ __('Edit') }} </button> </template> diff --git a/app/controllers/projects/merge_requests/application_controller.rb b/app/controllers/projects/merge_requests/application_controller.rb index edffeb32203..b7e99cb7ed0 100644 --- a/app/controllers/projects/merge_requests/application_controller.rb +++ b/app/controllers/projects/merge_requests/application_controller.rb @@ -14,7 +14,11 @@ class Projects::MergeRequests::ApplicationController < Projects::ApplicationCont end def merge_request_includes(association) - association.includes(:metrics, :assignees, author: :status) # rubocop:disable CodeReuse/ActiveRecord + association.includes(preloadable_mr_relations) # rubocop:disable CodeReuse/ActiveRecord + end + + def preloadable_mr_relations + [:metrics, :assignees, { author: :status }] end def merge_request_params diff --git a/app/controllers/projects/merge_requests/diffs_controller.rb b/app/controllers/projects/merge_requests/diffs_controller.rb index 9c5caf7719e..23ef9157363 100644 --- a/app/controllers/projects/merge_requests/diffs_controller.rb +++ b/app/controllers/projects/merge_requests/diffs_controller.rb @@ -5,9 +5,9 @@ class Projects::MergeRequests::DiffsController < Projects::MergeRequests::Applic include RendersNotes before_action :apply_diff_view_cookie! - before_action :commit - before_action :define_diff_vars - before_action :define_diff_comment_vars + before_action :commit, except: :diffs_batch + before_action :define_diff_vars, except: :diffs_batch + before_action :define_diff_comment_vars, except: :diffs_batch def show render_diffs @@ -17,8 +17,29 @@ class Projects::MergeRequests::DiffsController < Projects::MergeRequests::Applic render_diffs end + def diffs_batch + return render_404 unless Feature.enabled?(:diffs_batch_load, @merge_request.project) + + diffable = @merge_request.merge_request_diff + + return render_404 unless diffable + + diffs = diffable.diffs_in_batch(params[:page], params[:per_page], diff_options: diff_options) + + options = { + merge_request: @merge_request, + pagination_data: diffs.pagination_data + } + + render json: PaginatedDiffSerializer.new(current_user: current_user).represent(diffs, options) + end + private + def preloadable_mr_relations + [{ source_project: :namespace }, { target_project: :namespace }] + end + def render_diffs @environment = @merge_request.environments_for(current_user).last diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 7ddff9c1893..bd22226da5c 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -17,6 +17,9 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo before_action :set_issuables_index, only: [:index] before_action :authenticate_user!, only: [:assign_related_issues] before_action :check_user_can_push_to_source_branch!, only: [:rebase] + before_action only: [:show] do + push_frontend_feature_flag(:diffs_batch_load, @project) + end around_action :allow_gitaly_ref_name_caching, only: [:index, :show, :discussions] diff --git a/app/models/merge_request_diff.rb b/app/models/merge_request_diff.rb index 8b5f10ce159..7706119681d 100644 --- a/app/models/merge_request_diff.rb +++ b/app/models/merge_request_diff.rb @@ -297,6 +297,13 @@ class MergeRequestDiff < ApplicationRecord base_commit_sha? && head_commit_sha? && start_commit_sha? end + def diffs_in_batch(batch_page, batch_size, diff_options:) + Gitlab::Diff::FileCollection::MergeRequestDiffBatch.new(self, + batch_page, + batch_size, + diff_options: diff_options) + end + def diffs(diff_options = nil) if without_files? && comparison = diff_refs&.compare_in(project) # It should fetch the repository when diffs are cleaned by the system. diff --git a/app/models/merge_request_diff_file.rb b/app/models/merge_request_diff_file.rb index a532c1e6356..14c86ec69da 100644 --- a/app/models/merge_request_diff_file.rb +++ b/app/models/merge_request_diff_file.rb @@ -5,6 +5,7 @@ class MergeRequestDiffFile < ApplicationRecord include DiffFile belongs_to :merge_request_diff, inverse_of: :merge_request_diff_files + alias_attribute :index, :relative_order def utf8_diff return '' if diff.blank? diff --git a/app/serializers/paginated_diff_entity.rb b/app/serializers/paginated_diff_entity.rb new file mode 100644 index 00000000000..622da926c69 --- /dev/null +++ b/app/serializers/paginated_diff_entity.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +# Serializes diffs with pagination data. +# +# Avoid adding more keys to this serializer as processing the +# diff file serialization is not cheap. +# +class PaginatedDiffEntity < Grape::Entity + include RequestAwareEntity + + expose :diff_files do |diffs, options| + submodule_links = Gitlab::SubmoduleLinks.new(merge_request.project.repository) + DiffFileEntity.represent(diffs.diff_files, options.merge(submodule_links: submodule_links)) + end + + expose :pagination do + expose :current_page + expose :next_page + expose :total_pages + expose :next_page_href do |diffs| + next unless next_page + + project = merge_request.target_project + + diffs_batch_namespace_project_json_merge_request_path( + namespace_id: project.namespace.to_param, + project_id: project.to_param, + id: merge_request.iid, + page: next_page, + format: :json + ) + end + end + + private + + %i[current_page next_page total_pages].each do |method| + define_method method do + pagination_data[method] + end + end + + def pagination_data + options.fetch(:pagination_data, {}) + end + + def merge_request + options[:merge_request] + end +end diff --git a/app/serializers/paginated_diff_serializer.rb b/app/serializers/paginated_diff_serializer.rb new file mode 100644 index 00000000000..9b40fbf7843 --- /dev/null +++ b/app/serializers/paginated_diff_serializer.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +class PaginatedDiffSerializer < BaseSerializer + entity PaginatedDiffEntity +end |