diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-09-19 01:45:44 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-09-19 01:45:44 +0000 |
commit | 85dc423f7090da0a52c73eb66faf22ddb20efff9 (patch) | |
tree | 9160f299afd8c80c038f08e1545be119f5e3f1e1 /app/controllers/projects | |
parent | 15c2c8c66dbe422588e5411eee7e68f1fa440bb8 (diff) | |
download | gitlab-ce-85dc423f7090da0a52c73eb66faf22ddb20efff9.tar.gz |
Add latest changes from gitlab-org/gitlab@13-4-stable-ee
Diffstat (limited to 'app/controllers/projects')
23 files changed, 252 insertions, 89 deletions
diff --git a/app/controllers/projects/application_controller.rb b/app/controllers/projects/application_controller.rb index 518d414be1b..ca2692438e8 100644 --- a/app/controllers/projects/application_controller.rb +++ b/app/controllers/projects/application_controller.rb @@ -58,9 +58,9 @@ class Projects::ApplicationController < ApplicationController def method_missing(method_sym, *arguments, &block) case method_sym.to_s when /\Aauthorize_(.*)!\z/ - authorize_action!($1.to_sym) + authorize_action!(Regexp.last_match(1).to_sym) when /\Acheck_(.*)_available!\z/ - check_project_feature_available!($1.to_sym) + check_project_feature_available!(Regexp.last_match(1).to_sym) else super end diff --git a/app/controllers/projects/badges_controller.rb b/app/controllers/projects/badges_controller.rb index 59a7dff680c..eb47fec2b7e 100644 --- a/app/controllers/projects/badges_controller.rb +++ b/app/controllers/projects/badges_controller.rb @@ -9,6 +9,7 @@ class Projects::BadgesController < Projects::ApplicationController def pipeline pipeline_status = Gitlab::Badge::Pipeline::Status .new(project, params[:ref], opts: { + ignore_skipped: params[:ignore_skipped], key_text: params[:key_text], key_width: params[:key_width] }) diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb index d969e7bf771..1568d9966dd 100644 --- a/app/controllers/projects/blob_controller.rb +++ b/app/controllers/projects/blob_controller.rb @@ -10,6 +10,8 @@ class Projects::BlobController < Projects::ApplicationController include RedirectsForMissingPathOnTree include SourcegraphDecorator include DiffHelper + include RedisTracking + extend ::Gitlab::Utils::Override prepend_before_action :authenticate_user!, only: [:edit] @@ -33,8 +35,11 @@ class Projects::BlobController < Projects::ApplicationController before_action only: :show do push_frontend_feature_flag(:code_navigation, @project, default_enabled: true) push_frontend_feature_flag(:suggest_pipeline) if experiment_enabled?(:suggest_pipeline) + push_frontend_feature_flag(:gitlab_ci_yml_preview, @project, default_enabled: false) end + track_redis_hll_event :create, :update, name: 'g_edit_by_sfe', feature: :track_editor_edit_actions, feature_default_enabled: true + def new commit unless @repository.empty? end @@ -99,8 +104,6 @@ class Projects::BlobController < Projects::ApplicationController end def diff - apply_diff_view_cookie! - @form = Blobs::UnfoldPresenter.new(blob, diff_params) # keep only json rendering when @@ -256,4 +259,9 @@ class Projects::BlobController < Projects::ApplicationController def diff_params params.permit(:full, :since, :to, :bottom, :unfold, :offset, :indent) end + + override :visitor_id + def visitor_id + current_user&.id + end end diff --git a/app/controllers/projects/boards_controller.rb b/app/controllers/projects/boards_controller.rb index db05da0bb7f..5ed35094476 100644 --- a/app/controllers/projects/boards_controller.rb +++ b/app/controllers/projects/boards_controller.rb @@ -9,6 +9,7 @@ class Projects::BoardsController < Projects::ApplicationController before_action :assign_endpoint_vars before_action do push_frontend_feature_flag(:multi_select_board, default_enabled: true) + push_frontend_feature_flag(:boards_with_swimlanes, project, default_enabled: false) end private diff --git a/app/controllers/projects/ci/lints_controller.rb b/app/controllers/projects/ci/lints_controller.rb index c13baaea8c6..813a0a9ddd5 100644 --- a/app/controllers/projects/ci/lints_controller.rb +++ b/app/controllers/projects/ci/lints_controller.rb @@ -2,6 +2,9 @@ class Projects::Ci::LintsController < Projects::ApplicationController before_action :authorize_create_pipeline! + before_action do + push_frontend_feature_flag(:ci_lint_vue, project) + end def show end @@ -10,40 +13,15 @@ class Projects::Ci::LintsController < Projects::ApplicationController @content = params[:content] @dry_run = params[:dry_run] - if @dry_run && Gitlab::Ci::Features.lint_creates_pipeline_with_dry_run?(@project) - pipeline = Ci::CreatePipelineService - .new(@project, current_user, ref: @project.default_branch) - .execute(:push, dry_run: true, content: @content) - - @status = pipeline.error_messages.empty? - @stages = pipeline.stages - @errors = pipeline.error_messages.map(&:content) - @warnings = pipeline.warning_messages.map(&:content) - else - result = Gitlab::Ci::YamlProcessor.new_with_validation_errors(@content, yaml_processor_options) + @result = Gitlab::Ci::Lint + .new(project: @project, current_user: current_user) + .validate(@content, dry_run: @dry_run) - @status = result.valid? - @errors = result.errors - @warnings = result.warnings - - if result.valid? - @config_processor = result.config - @stages = @config_processor.stages - @builds = @config_processor.builds - @jobs = @config_processor.jobs + respond_to do |format| + format.html { render :show } + format.json do + render json: ::Ci::Lint::ResultSerializer.new.represent(@result) end end - - render :show - end - - private - - def yaml_processor_options - { - project: @project, - user: current_user, - sha: project.repository.commit.sha - } end end diff --git a/app/controllers/projects/forks_controller.rb b/app/controllers/projects/forks_controller.rb index 41631aea620..c6b6b825bb7 100644 --- a/app/controllers/projects/forks_controller.rb +++ b/app/controllers/projects/forks_controller.rb @@ -43,9 +43,10 @@ class Projects::ForksController < Projects::ApplicationController end format.json do - namespaces = fork_service.valid_fork_targets - [current_user.namespace, project.namespace] + namespaces = load_namespaces_with_associations - [project.namespace] + render json: { - namespaces: ForkNamespaceSerializer.new.represent(namespaces, project: project, current_user: current_user) + namespaces: ForkNamespaceSerializer.new.represent(namespaces, project: project, current_user: current_user, memberships: memberships_hash) } end end @@ -100,6 +101,14 @@ class Projects::ForksController < Projects::ApplicationController def whitelist_query_limiting Gitlab::QueryLimiting.whitelist('https://gitlab.com/gitlab-org/gitlab-foss/issues/42335') end + + def load_namespaces_with_associations + @load_namespaces_with_associations ||= fork_service.valid_fork_targets(only_groups: true).preload(:route) + end + + def memberships_hash + current_user.members.where(source: load_namespaces_with_associations).index_by(&:source_id) + end end Projects::ForksController.prepend_if_ee('EE::Projects::ForksController') diff --git a/app/controllers/projects/imports_controller.rb b/app/controllers/projects/imports_controller.rb index deba71c9dd3..9bed12fd151 100644 --- a/app/controllers/projects/imports_controller.rb +++ b/app/controllers/projects/imports_controller.rb @@ -5,10 +5,10 @@ class Projects::ImportsController < Projects::ApplicationController include ImportUrlParams # Authorize - before_action :authorize_admin_project!, only: [:new, :create] + before_action :authorize_admin_project!, except: :show before_action :require_namespace_project_creation_permission, only: :show - before_action :require_no_repo, only: [:new, :create] - before_action :redirect_if_progress, only: [:new, :create] + before_action :require_no_repo, except: :show + before_action :redirect_if_progress, except: :show before_action :redirect_if_no_import, only: :show def new diff --git a/app/controllers/projects/issue_links_controller.rb b/app/controllers/projects/issue_links_controller.rb new file mode 100644 index 00000000000..2f7489373ed --- /dev/null +++ b/app/controllers/projects/issue_links_controller.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +module Projects + class IssueLinksController < Projects::ApplicationController + include IssuableLinks + + before_action :authorize_admin_issue_link!, only: [:create, :destroy] + before_action :authorize_issue_link_association!, only: :destroy + + private + + def authorize_admin_issue_link! + render_403 unless can?(current_user, :admin_issue_link, @project) + end + + def authorize_issue_link_association! + render_404 if link.target != issue && link.source != issue + end + + # rubocop: disable CodeReuse/ActiveRecord + def issue + @issue ||= + IssuesFinder.new(current_user, project_id: @project.id) + .find_by!(iid: params[:issue_id]) + end + # rubocop: enable CodeReuse/ActiveRecord + + def list_service + IssueLinks::ListService.new(issue, current_user) + end + + def create_service + IssueLinks::CreateService.new(issue, current_user, create_params) + end + + def destroy_service + IssueLinks::DestroyService.new(link, current_user) + end + + def link + @link ||= IssueLink.find(params[:id]) + end + + def create_params + params.permit(:link_type, issuable_references: []) + end + end +end diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb index 2200860a184..7f0d23b79ce 100644 --- a/app/controllers/projects/issues_controller.rb +++ b/app/controllers/projects/issues_controller.rb @@ -10,13 +10,8 @@ class Projects::IssuesController < Projects::ApplicationController include SpammableActions include RecordUserLastActivity - def issue_except_actions - %i[index calendar new create bulk_update import_csv export_csv service_desk] - end - - def set_issuables_index_only_actions - %i[index calendar service_desk] - end + ISSUES_EXCEPT_ACTIONS = %i[index calendar new create bulk_update import_csv export_csv service_desk].freeze + SET_ISSUEABLES_INDEX_ONLY_ACTIONS = %i[index calendar service_desk].freeze prepend_before_action(only: [:index]) { authenticate_sessionless_user!(:rss) } prepend_before_action(only: [:calendar]) { authenticate_sessionless_user!(:ics) } @@ -25,9 +20,10 @@ class Projects::IssuesController < Projects::ApplicationController before_action :whitelist_query_limiting, only: [:create, :create_merge_request, :move, :bulk_update] before_action :check_issues_available! - before_action :issue, unless: ->(c) { c.issue_except_actions.include?(c.action_name.to_sym) } + before_action :issue, unless: ->(c) { ISSUES_EXCEPT_ACTIONS.include?(c.action_name.to_sym) } + after_action :log_issue_show, unless: ->(c) { ISSUES_EXCEPT_ACTIONS.include?(c.action_name.to_sym) } - before_action :set_issuables_index, if: ->(c) { c.set_issuables_index_only_actions.include?(c.action_name.to_sym) } + before_action :set_issuables_index, if: ->(c) { SET_ISSUEABLES_INDEX_ONLY_ACTIONS.include?(c.action_name.to_sym) } # Allow write(create) issue before_action :authorize_create_issue!, only: [:new, :create] @@ -48,6 +44,8 @@ class Projects::IssuesController < Projects::ApplicationController push_frontend_feature_flag(:vue_issuable_sidebar, project.group) push_frontend_feature_flag(:tribute_autocomplete, @project) push_frontend_feature_flag(:vue_issuables_list, project) + push_frontend_feature_flag(:design_management_todo_button, project, default_enabled: true) + push_frontend_feature_flag(:vue_sidebar_labels, @project) end before_action only: :show do @@ -95,7 +93,7 @@ class Projects::IssuesController < Projects::ApplicationController discussion_to_resolve: params[:discussion_to_resolve], confidential: !!Gitlab::Utils.to_boolean(params[:issue][:confidential]) ) - service = Issues::BuildService.new(project, current_user, build_params) + service = ::Issues::BuildService.new(project, current_user, build_params) @issue = @noteable = service.execute @@ -115,7 +113,7 @@ class Projects::IssuesController < Projects::ApplicationController discussion_to_resolve: params[:discussion_to_resolve] ) - service = Issues::CreateService.new(project, current_user, create_params) + service = ::Issues::CreateService.new(project, current_user, create_params) @issue = service.execute if service.discussions_to_resolve.count(&:resolved?) > 0 @@ -143,7 +141,7 @@ class Projects::IssuesController < Projects::ApplicationController new_project = Project.find(params[:move_to_project_id]) return render_404 unless issue.can_move?(current_user, new_project) - @issue = Issues::UpdateService.new(project, current_user, target_project: new_project).execute(issue) + @issue = ::Issues::UpdateService.new(project, current_user, target_project: new_project).execute(issue) end respond_to do |format| @@ -157,7 +155,7 @@ class Projects::IssuesController < Projects::ApplicationController end def reorder - service = Issues::ReorderService.new(project, current_user, reorder_params) + service = ::Issues::ReorderService.new(project, current_user, reorder_params) if service.execute(issue) head :ok @@ -167,7 +165,7 @@ class Projects::IssuesController < Projects::ApplicationController end def related_branches - @related_branches = Issues::RelatedBranchesService + @related_branches = ::Issues::RelatedBranchesService .new(project, current_user) .execute(issue) .map { |branch| branch.merge(link: branch_link(branch)) } @@ -249,6 +247,13 @@ class Projects::IssuesController < Projects::ApplicationController @issue end # rubocop: enable CodeReuse/ActiveRecord + + def log_issue_show + return unless current_user && @issue + + ::Gitlab::Search::RecentIssues.new(user: current_user).log_view(@issue) + end + alias_method :subscribable_resource, :issue alias_method :issuable, :issue alias_method :awardable, :issue @@ -319,7 +324,7 @@ class Projects::IssuesController < Projects::ApplicationController def update_service update_params = issue_params.merge(spammable_params) - Issues::UpdateService.new(project, current_user, update_params) + ::Issues::UpdateService.new(project, current_user, update_params) end def finder_type @@ -340,10 +345,12 @@ class Projects::IssuesController < Projects::ApplicationController def finder_options options = super - return options unless service_desk? + options[:issue_types] = Issue::TYPES_FOR_LIST - options.reject! { |key| key == 'author_username' || key == 'author_id' } - options[:author_id] = User.support_bot + if service_desk? + options.reject! { |key| key == 'author_username' || key == 'author_id' } + options[:author_id] = User.support_bot + end options end diff --git a/app/controllers/projects/merge_requests/application_controller.rb b/app/controllers/projects/merge_requests/application_controller.rb index 0bb4e0fb5ee..921da788ad2 100644 --- a/app/controllers/projects/merge_requests/application_controller.rb +++ b/app/controllers/projects/merge_requests/application_controller.rb @@ -43,6 +43,7 @@ class Projects::MergeRequests::ApplicationController < Projects::ApplicationCont :discussion_locked, label_ids: [], assignee_ids: [], + reviewer_ids: [], update_task: [:index, :checked, :line_number, :line_source] ] end diff --git a/app/controllers/projects/merge_requests/content_controller.rb b/app/controllers/projects/merge_requests/content_controller.rb index eec5c1a4355..399745151b1 100644 --- a/app/controllers/projects/merge_requests/content_controller.rb +++ b/app/controllers/projects/merge_requests/content_controller.rb @@ -10,6 +10,9 @@ class Projects::MergeRequests::ContentController < Projects::MergeRequests::Appl before_action :set_polling_header around_action :allow_gitaly_ref_name_caching + FAST_POLLING_INTERVAL = 10.seconds.in_milliseconds + SLOW_POLLING_INTERVAL = 5.minutes.in_milliseconds + def widget respond_to do |format| format.json do @@ -29,7 +32,8 @@ class Projects::MergeRequests::ContentController < Projects::MergeRequests::Appl private def set_polling_header - Gitlab::PollingInterval.set_header(response, interval: 10_000) + interval = merge_request.open? ? FAST_POLLING_INTERVAL : SLOW_POLLING_INTERVAL + Gitlab::PollingInterval.set_header(response, interval: interval) end def serializer(entity) diff --git a/app/controllers/projects/merge_requests/diffs_controller.rb b/app/controllers/projects/merge_requests/diffs_controller.rb index bceccc7063b..8aacfdce094 100644 --- a/app/controllers/projects/merge_requests/diffs_controller.rb +++ b/app/controllers/projects/merge_requests/diffs_controller.rb @@ -4,7 +4,6 @@ class Projects::MergeRequests::DiffsController < Projects::MergeRequests::Applic include DiffHelper include RendersNotes - before_action :apply_diff_view_cookie! before_action :commit before_action :define_diff_vars before_action :define_diff_comment_vars, except: [:diffs_batch, :diffs_metadata] @@ -21,15 +20,15 @@ class Projects::MergeRequests::DiffsController < Projects::MergeRequests::Applic end def diffs_batch - return render_404 unless Feature.enabled?(:diffs_batch_load, @merge_request.project, default_enabled: true) - diffs = @compare.diffs_in_batch(params[:page], params[:per_page], diff_options: diff_options) positions = @merge_request.note_positions_for_paths(diffs.diff_file_paths, current_user) + environment = @merge_request.environments_for(current_user, latest: true).last diffs.unfold_diff_files(positions.unfoldable) diffs.write_cache options = { + environment: environment, merge_request: @merge_request, diff_view: diff_view, pagination_data: diffs.pagination_data @@ -65,7 +64,7 @@ class Projects::MergeRequests::DiffsController < Projects::MergeRequests::Applic render: ->(partial, locals) { view_to_html_string(partial, locals) } } - options = additional_attributes.merge(diff_view: diff_view) + options = additional_attributes.merge(diff_view: Feature.enabled?(:unified_diff_lines, @merge_request.project) ? "inline" : diff_view) if @merge_request.project.context_commits_enabled? options[:context_commits] = @merge_request.recent_context_commits diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index e77d2f0f5ee..92785540172 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -10,8 +10,10 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo include IssuableCollections include RecordUserLastActivity include SourcegraphDecorator + include DiffHelper skip_before_action :merge_request, only: [:index, :bulk_update] + before_action :apply_diff_view_cookie!, only: [:show] before_action :whitelist_query_limiting, only: [:assign_related_issues, :update] before_action :authorize_update_issuable!, only: [:close, :edit, :update, :remove_wip, :sort] before_action :authorize_read_actual_head_pipeline!, only: [ @@ -25,9 +27,7 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo 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, default_enabled: true) push_frontend_feature_flag(:deploy_from_footer, @project, default_enabled: true) - push_frontend_feature_flag(:single_mr_diff_view, @project, default_enabled: true) push_frontend_feature_flag(:suggest_pipeline) if experiment_enabled?(:suggest_pipeline) push_frontend_feature_flag(:code_navigation, @project, default_enabled: true) push_frontend_feature_flag(:widget_visibility_polling, @project, default_enabled: true) @@ -36,10 +36,12 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo push_frontend_feature_flag(:multiline_comments, @project, default_enabled: true) push_frontend_feature_flag(:file_identifier_hash) push_frontend_feature_flag(:batch_suggestions, @project, default_enabled: true) - push_frontend_feature_flag(:auto_expand_collapsed_diffs, @project, default_enabled: true) push_frontend_feature_flag(:approvals_commented_by, @project, default_enabled: true) push_frontend_feature_flag(:hide_jump_to_next_unresolved_in_threads, default_enabled: true) push_frontend_feature_flag(:merge_request_widget_graphql, @project) + push_frontend_feature_flag(:unified_diff_lines, @project) + push_frontend_feature_flag(:highlight_current_diff_row, @project) + push_frontend_feature_flag(:default_merge_ref_for_diffs, @project) end before_action do @@ -48,6 +50,8 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo around_action :allow_gitaly_ref_name_caching, only: [:index, :show, :discussions] + after_action :log_merge_request_show, only: [:show] + feature_category :source_code_management, unless: -> (action) { action.ends_with?("_reports") } feature_category :code_testing, @@ -427,7 +431,13 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo Gitlab::QueryLimiting.whitelist('https://gitlab.com/gitlab-org/gitlab-foss/issues/42438') end - def reports_response(report_comparison) + def reports_response(report_comparison, pipeline = nil) + if pipeline&.active? + ::Gitlab::PollingInterval.set_header(response, interval: 3000) + + render json: '', status: :no_content && return + end + case report_comparison[:status] when :parsing ::Gitlab::PollingInterval.set_header(response, interval: 3000) @@ -442,6 +452,12 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo end end + def log_merge_request_show + return unless current_user && @merge_request + + ::Gitlab::Search::RecentMergeRequests.new(user: current_user).log_view(@merge_request) + end + def authorize_read_actual_head_pipeline! return render_404 unless can?(current_user, :read_build, merge_request.actual_head_pipeline) end @@ -450,6 +466,10 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo params = request.query_parameters params[:view] = cookies[:diff_view] if params[:view].blank? && cookies[:diff_view].present? + if Feature.enabled?(:default_merge_ref_for_diffs, project) + params = params.merge(diff_head: true) + end + diffs_metadata_project_json_merge_request_path(project, merge_request, 'json', params) end end diff --git a/app/controllers/projects/metrics_dashboard_controller.rb b/app/controllers/projects/metrics_dashboard_controller.rb index 51307c3665c..bc0a701b9fd 100644 --- a/app/controllers/projects/metrics_dashboard_controller.rb +++ b/app/controllers/projects/metrics_dashboard_controller.rb @@ -6,6 +6,8 @@ module Projects # app/controllers/projects/environments_controller.rb # See https://gitlab.com/gitlab-org/gitlab/-/issues/226002 for more details. + include Gitlab::Utils::StrongMemoize + before_action :authorize_metrics_dashboard! before_action do push_frontend_feature_flag(:prometheus_computed_alerts) @@ -15,6 +17,15 @@ module Projects def show if environment render 'projects/environments/metrics' + elsif default_environment + redirect_to project_metrics_dashboard_path( + project, + # Reverse merge the query parameters so that a query parameter named dashboard_path doesn't + # override the dashboard_path path parameter. + **permitted_params.to_h.symbolize_keys + .merge(environment: default_environment.id) + .reverse_merge(request.query_parameters.symbolize_keys) + ) else render 'projects/environments/empty_metrics' end @@ -22,13 +33,21 @@ module Projects private + def permitted_params + @permitted_params ||= params.permit(:dashboard_path, :environment, :page) + end + def environment - @environment ||= - if params[:environment] - project.environments.find(params[:environment]) - else - project.default_environment - end + strong_memoize(:environment) do + env = permitted_params[:environment] + project.environments.find(env) if env + end + end + + def default_environment + strong_memoize(:default_environment) do + project.default_environment + end end end end diff --git a/app/controllers/projects/pages_controller.rb b/app/controllers/projects/pages_controller.rb index 2a8bc823931..9ad6bf4095a 100644 --- a/app/controllers/projects/pages_controller.rb +++ b/app/controllers/projects/pages_controller.rb @@ -21,7 +21,7 @@ class Projects::PagesController < Projects::ApplicationController format.html do redirect_to project_pages_path(@project), status: :found, - notice: 'Pages were removed' + notice: 'Pages were scheduled for removal' end end end diff --git a/app/controllers/projects/pipelines_controller.rb b/app/controllers/projects/pipelines_controller.rb index bfe23eb1035..c1734d2cd8a 100644 --- a/app/controllers/projects/pipelines_controller.rb +++ b/app/controllers/projects/pipelines_controller.rb @@ -63,10 +63,27 @@ class Projects::PipelinesController < Projects::ApplicationController .new(project, current_user, create_params) .execute(:web, ignore_skip_ci: true, save_on_errors: false) - if @pipeline.created_successfully? - redirect_to project_pipeline_path(project, @pipeline) - else - render 'new', status: :bad_request + respond_to do |format| + format.html do + if @pipeline.created_successfully? + redirect_to project_pipeline_path(project, @pipeline) + else + render 'new', status: :bad_request + end + end + format.json do + if @pipeline.created_successfully? + render json: PipelineSerializer + .new(project: project, current_user: current_user) + .represent(@pipeline), + status: :created + else + render json: { errors: @pipeline.error_messages.map(&:content), + warnings: @pipeline.warning_messages(limit: ::Gitlab::Ci::Warnings::MAX_LIMIT).map(&:content), + total_warnings: @pipeline.warning_messages.length }, + status: :bad_request + end + end end end @@ -247,7 +264,7 @@ class Projects::PipelinesController < Projects::ApplicationController end def latest_pipeline - @project.latest_pipeline_for_ref(params['ref']) + @project.latest_pipeline(params['ref']) &.present(current_user: current_user) end diff --git a/app/controllers/projects/product_analytics_controller.rb b/app/controllers/projects/product_analytics_controller.rb index badd7671dcf..c019dc191d6 100644 --- a/app/controllers/projects/product_analytics_controller.rb +++ b/app/controllers/projects/product_analytics_controller.rb @@ -27,6 +27,10 @@ class Projects::ProductAnalyticsController < Projects::ApplicationController .new(project, { graph: graph, timerange: @timerange }) .execute end + + @activity_graph = ProductAnalytics::BuildActivityGraphService + .new(project, { timerange: @timerange }) + .execute end private diff --git a/app/controllers/projects/releases_controller.rb b/app/controllers/projects/releases_controller.rb index c48d573edbf..bd24aae980c 100644 --- a/app/controllers/projects/releases_controller.rb +++ b/app/controllers/projects/releases_controller.rb @@ -11,6 +11,9 @@ class Projects::ReleasesController < Projects::ApplicationController push_frontend_feature_flag(:release_show_page, project, default_enabled: true) push_frontend_feature_flag(:release_asset_link_editing, project, default_enabled: true) push_frontend_feature_flag(:release_asset_link_type, project, default_enabled: true) + push_frontend_feature_flag(:graphql_release_data, project, default_enabled: true) + push_frontend_feature_flag(:graphql_milestone_stats, project, default_enabled: true) + push_frontend_feature_flag(:graphql_releases_page, project, default_enabled: false) end before_action :authorize_update_release!, only: %i[edit update] before_action :authorize_create_release!, only: :new diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb index ca2a19e67b0..9a69ef991dd 100644 --- a/app/controllers/projects/services_controller.rb +++ b/app/controllers/projects/services_controller.rb @@ -20,7 +20,7 @@ class Projects::ServicesController < Projects::ApplicationController layout "project_settings" def edit - @admin_integration = Service.instance_for(service.type) + @default_integration = Service.default_integration(service.type, project) end def update @@ -65,18 +65,20 @@ class Projects::ServicesController < Projects::ApplicationController result = ::Integrations::Test::ProjectService.new(@service, current_user, params[:event]).execute unless result[:success] - return { error: true, message: _('Test failed.'), service_response: result[:message].to_s, test_failed: true } + return { error: true, message: s_('Integrations|Connection failed. Please check your settings.'), service_response: result[:message].to_s, test_failed: true } end {} rescue Gitlab::HTTP::BlockedUrlError => e - { error: true, message: _('Test failed.'), service_response: e.message, test_failed: true } + { error: true, message: s_('Integrations|Connection failed. Please check your settings.'), service_response: e.message, test_failed: true } end def success_message - message = @service.active? ? _('activated') : _('settings saved, but not activated') - - _('%{service_title} %{message}.') % { service_title: @service.title, message: message } + if @service.active? + s_('Integrations|%{integration} settings saved and active.') % { integration: @service.title } + else + s_('Integrations|%{integration} settings saved, but not active.') % { integration: @service.title } + end end def service diff --git a/app/controllers/projects/static_site_editor_controller.rb b/app/controllers/projects/static_site_editor_controller.rb index 9ec50ff8196..e97a8db0b79 100644 --- a/app/controllers/projects/static_site_editor_controller.rb +++ b/app/controllers/projects/static_site_editor_controller.rb @@ -14,13 +14,27 @@ class Projects::StaticSiteEditorController < Projects::ApplicationController end def show - @config = Gitlab::StaticSiteEditor::Config.new(@repository, @ref, @path, params[:return_url]) + service_response = ::StaticSiteEditor::ConfigService.new( + container: project, + current_user: current_user, + params: { + ref: @ref, + path: @path, + return_url: params[:return_url] + } + ).execute + + if service_response.success? + @data = service_response.payload + else + respond_422 + end end private def assign_ref_and_path - @ref, @path = extract_ref(params[:id]) + @ref, @path = extract_ref(params.fetch(:id)) render_404 if @ref.blank? || @path.blank? end diff --git a/app/controllers/projects/todos_controller.rb b/app/controllers/projects/todos_controller.rb index 0b11ee9edc0..33205b93317 100644 --- a/app/controllers/projects/todos_controller.rb +++ b/app/controllers/projects/todos_controller.rb @@ -15,6 +15,9 @@ class Projects::TodosController < Projects::ApplicationController IssuesFinder.new(current_user, project_id: @project.id).find(params[:issuable_id]) when "merge_request" MergeRequestsFinder.new(current_user, project_id: @project.id).find(params[:issuable_id]) + when "design" + issue = IssuesFinder.new(current_user, project_id: @project.id).find(params[:issue_id]) + DesignManagement::DesignsFinder.new(issue, current_user).find(params[:issuable_id]) end end end diff --git a/app/controllers/projects/web_ide_schemas_controller.rb b/app/controllers/projects/web_ide_schemas_controller.rb new file mode 100644 index 00000000000..3d16a6fafd4 --- /dev/null +++ b/app/controllers/projects/web_ide_schemas_controller.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +class Projects::WebIdeSchemasController < Projects::ApplicationController + before_action :authenticate_user! + + def show + return respond_422 unless branch_sha + + result = ::Ide::SchemasConfigService.new(project, current_user, sha: branch_sha, filename: params[:filename]).execute + + if result[:status] == :success + render json: result[:schema] + else + render json: result, status: :unprocessable_entity + end + end + + private + + def branch_sha + return unless params[:branch].present? + + project.commit(params[:branch])&.id + end +end diff --git a/app/controllers/projects/web_ide_terminals_controller.rb b/app/controllers/projects/web_ide_terminals_controller.rb index 08ea5c4bca8..76bcaa9e80c 100644 --- a/app/controllers/projects/web_ide_terminals_controller.rb +++ b/app/controllers/projects/web_ide_terminals_controller.rb @@ -11,7 +11,7 @@ class Projects::WebIdeTerminalsController < Projects::ApplicationController def check_config return respond_422 unless branch_sha - result = ::Ci::WebIdeConfigService.new(project, current_user, sha: branch_sha).execute + result = ::Ide::TerminalConfigService.new(project, current_user, sha: branch_sha).execute if result[:status] == :success head :ok |