diff --git a/.gitlab/ci/qa-common/variables.gitlab-ci.yml b/.gitlab/ci/qa-common/variables.gitlab-ci.yml index abad7d12819..44b8186f433 100644 --- a/.gitlab/ci/qa-common/variables.gitlab-ci.yml +++ b/.gitlab/ci/qa-common/variables.gitlab-ci.yml @@ -16,7 +16,7 @@ variables: # Retry failed specs in separate process QA_RETRY_FAILED_SPECS: "true" # Helm chart ref used by test-on-cng pipeline - GITLAB_HELM_CHART_REF: "6a57444ebbb2654d8f65e3abc581db204e3331c9" + GITLAB_HELM_CHART_REF: "4073ca4932209fc3d64d20ef48dd6f1e6c58cb15" # Specific ref for cng-mirror project to trigger builds for GITLAB_CNG_MIRROR_REF: "df7aafcccafdbab732a7cf757efb3b7b74c851dd" # Makes sure some of the common scripts from pipeline-common use bundler to execute commands diff --git a/.rubocop.yml b/.rubocop.yml index 80ea34d26e9..c2fe63e6494 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1314,6 +1314,12 @@ Database/AvoidUsingPluckWithoutLimit: - 'ee/spec/**/*.rb' - 'qa/qa/specs/**/*.rb' +Database/AvoidUsingConnectionExecute: + Enabled: true + Include: + - '{,ee/}app/models/**/*' + - '{,ee/}lib/**/*' + Style/SymbolProc: AllowedMethods: - define_method diff --git a/.rubocop_todo/database/avoid_using_connection_execute.yml b/.rubocop_todo/database/avoid_using_connection_execute.yml new file mode 100644 index 00000000000..634428940cd --- /dev/null +++ b/.rubocop_todo/database/avoid_using_connection_execute.yml @@ -0,0 +1,42 @@ +--- +Database/AvoidUsingConnectionExecute: + Details: grace period + Exclude: + - 'app/models/analytics/cycle_analytics/stage_event_hash.rb' + - 'app/models/concerns/analytics/cycle_analytics/stage_event_model.rb' + - 'app/models/concerns/legacy_bulk_insert.rb' + - 'app/models/issue/metrics.rb' + - 'app/models/lfs_objects_project.rb' + - 'app/models/merge_request/metrics.rb' + - 'app/models/namespaces/descendants.rb' + - 'app/models/packages/maven/package.rb' + - 'app/models/postgresql/replication_slot.rb' + - 'app/models/project_group_link.rb' + - 'app/models/trending_project.rb' + - 'ee/app/models/concerns/geo/verification_state.rb' + - 'ee/app/models/dora/daily_metrics.rb' + - 'ee/app/models/iterations/cadence.rb' + - 'ee/app/models/vulnerabilities/statistic.rb' + - 'ee/app/models/work_items/weights_source.rb' + - 'ee/lib/gitlab/ingestion/bulk_updatable_task.rb' + - 'lib/click_house/migration.rb' + - 'lib/click_house/migration_support/schema_migration.rb' + - 'lib/gitlab/database/alter_cell_sequences_range.rb' + - 'lib/gitlab/database/async_constraints/validators/base.rb' + - 'lib/gitlab/database/async_indexes/index_base.rb' + - 'lib/gitlab/database/async_indexes/index_creator.rb' + - 'lib/gitlab/database/health_status/indicators/write_ahead_log.rb' + - 'lib/gitlab/database/lock_writes_manager.rb' + - 'lib/gitlab/database/migrations/observers/query_statistics.rb' + - 'lib/gitlab/database/migrations/observers/total_database_size_change.rb' + - 'lib/gitlab/database/partitioning/detached_partition_dropper.rb' + - 'lib/gitlab/database/partitioning/partition_manager.rb' + - 'lib/gitlab/database/partitioning_migration_helpers/bulk_copy.rb' + - 'lib/gitlab/database/partitioning_migration_helpers/index_helpers.rb' + - 'lib/gitlab/database/reflection.rb' + - 'lib/gitlab/database/reindexing/coordinator.rb' + - 'lib/gitlab/database/sos/base_db_stats_handler.rb' + - 'lib/gitlab/database/stat_activity_sampler.rb' + - 'lib/gitlab/database/tables_truncate.rb' + - 'lib/gitlab/database/unidirectional_copy_trigger.rb' + - 'lib/gitlab/database/with_lock_retries.rb' diff --git a/app/assets/javascripts/merge_request_dashboard/index.js b/app/assets/javascripts/merge_request_dashboard/index.js index 47dc19f8a4a..c0c49ff8646 100644 --- a/app/assets/javascripts/merge_request_dashboard/index.js +++ b/app/assets/javascripts/merge_request_dashboard/index.js @@ -69,6 +69,10 @@ export function initMergeRequestDashboard(el) { keyArgs, merge: true, }, + authoredMergeRequests: { + keyArgs, + merge: true, + }, }, }, MergeRequestConnection: { diff --git a/app/assets/javascripts/merge_request_tabs.js b/app/assets/javascripts/merge_request_tabs.js index 459ecf79a4a..30d3c3e2bfd 100644 --- a/app/assets/javascripts/merge_request_tabs.js +++ b/app/assets/javascripts/merge_request_tabs.js @@ -173,7 +173,7 @@ export function toggleLoader(state) { } export function getActionFromHref(pathName) { - let action = pathName.match(/\/(\d+)\/(commits|diffs|pipelines|reports).*$/); + let action = pathName.match(/\/(\d+|new)\/(commits|diffs|pipelines|reports).*$/); if (action) { action = action.at(-1).replace(/(^\/|\.html)/g, ''); diff --git a/app/assets/javascripts/pages/shared/wikis/components/wiki_sidebar_entry.vue b/app/assets/javascripts/pages/shared/wikis/components/wiki_sidebar_entry.vue index b103546c5e1..7c7a8683fc5 100644 --- a/app/assets/javascripts/pages/shared/wikis/components/wiki_sidebar_entry.vue +++ b/app/assets/javascripts/pages/shared/wikis/components/wiki_sidebar_entry.vue @@ -91,7 +91,7 @@ export default { size="small" category="tertiary" data-testid="wiki-list-create-child-button" - :href="`${page.path}/{new_page_title}`" + :href="`${page.path}/{new_page_title}?view=create`" class="wiki-list-create-child-button has-tooltip gl-ml-3" :title="plusButtonTooltip" :aria-label="plusButtonTooltip" diff --git a/app/assets/javascripts/token_access/components/inbound_token_access.vue b/app/assets/javascripts/token_access/components/inbound_token_access.vue index 12426c063d7..65dd12f0ddb 100644 --- a/app/assets/javascripts/token_access/components/inbound_token_access.vue +++ b/app/assets/javascripts/token_access/components/inbound_token_access.vue @@ -212,8 +212,14 @@ export default { return actions; }, allowlist() { + // Show the current project at the top of the allowlist for better UX const { groups, projects } = this.groupsAndProjectsWithAccess; - return [...groups, ...projects].sort((a, b) => a.fullPath.localeCompare(b.fullPath)); + const allItems = [...groups, ...projects]; + const currentProject = allItems.find((item) => item.fullPath === this.fullPath); + const otherItems = allItems + .filter((item) => item !== currentProject) + .sort((a, b) => a.fullPath.localeCompare(b.fullPath)); + return currentProject ? [currentProject, ...otherItems] : otherItems; }, disclosureDropdownOptions() { return [ diff --git a/app/services/draft_notes/publish_service.rb b/app/services/draft_notes/publish_service.rb index 430249182f3..f495911e118 100644 --- a/app/services/draft_notes/publish_service.rb +++ b/app/services/draft_notes/publish_service.rb @@ -119,18 +119,11 @@ module DraftNotes end def handle_notifications(current_user, merge_request, review) - pub_sub_flag = Feature.enabled?(:notification_event_store_migration_draft_published, current_user) - - if pub_sub_flag - create_draft_published_event(merge_request, current_user, review) - else - todo_service.new_review(merge_request, current_user) - notification_service.async.new_review(review) if review - end + create_draft_published_event(merge_request, current_user, review) MergeRequests::ResolvedDiscussionNotificationService .new(project: project, current_user: current_user) - .execute(merge_request, send_notifications: !pub_sub_flag) + .execute(merge_request, send_notifications: false) end def create_draft_published_event(merge_request, current_user, review) diff --git a/app/validators/json_schemas/user_detail_onboarding_status.json b/app/validators/json_schemas/user_detail_onboarding_status.json index 7fac1442c4d..b34c9fb0ba5 100644 --- a/app/validators/json_schemas/user_detail_onboarding_status.json +++ b/app/validators/json_schemas/user_detail_onboarding_status.json @@ -64,6 +64,10 @@ 8, 99 ] + }, + "version": { + "description": "Version of registration flow", + "type": "integer" } }, "additionalProperties": false diff --git a/config/feature_flags/gitlab_com_derisk/notification_event_store_migration_draft_published.yml b/config/feature_flags/gitlab_com_derisk/notification_event_store_migration_draft_published.yml deleted file mode 100644 index 205fadd9a3c..00000000000 --- a/config/feature_flags/gitlab_com_derisk/notification_event_store_migration_draft_published.yml +++ /dev/null @@ -1,10 +0,0 @@ ---- -name: notification_event_store_migration_draft_published -description: -feature_issue_url: -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/190667 -rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/541124 -milestone: '18.0' -group: group::personal productivity -type: gitlab_com_derisk -default_enabled: false diff --git a/config/metrics/counts_28d/20210720144005_i_code_review_user_searches_diff_monthly.yml b/config/metrics/counts_28d/20210720144005_i_code_review_user_searches_diff_monthly.yml deleted file mode 100644 index 33394558ea7..00000000000 --- a/config/metrics/counts_28d/20210720144005_i_code_review_user_searches_diff_monthly.yml +++ /dev/null @@ -1,20 +0,0 @@ ---- -key_path: redis_hll_counters.code_review.i_code_review_user_searches_diff_monthly -description: Count of users who search merge request diffs -product_group: code_review -product_categories: -- code_review_workflow -value_type: number -status: active -milestone: '14.2' -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/66522 -time_frame: 28d -data_source: internal_events -events: - - name: i_code_review_user_searches_diff - unique: user.id -data_category: optional -tiers: - - free - - premium - - ultimate diff --git a/config/metrics/counts_28d/20211126084446_p_analytics_ci_cd_pipelines_monthly.yml b/config/metrics/counts_28d/20211126084446_p_analytics_ci_cd_pipelines_monthly.yml deleted file mode 100644 index 0bc50d04b25..00000000000 --- a/config/metrics/counts_28d/20211126084446_p_analytics_ci_cd_pipelines_monthly.yml +++ /dev/null @@ -1,19 +0,0 @@ ---- -key_path: redis_hll_counters.analytics.p_analytics_ci_cd_pipelines_monthly -description: Count of unique visits to the project level CI CD Analytics pipelines tab -product_group: optimize -value_type: number -status: active -milestone: '14.6' -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/75187 -time_frame: 28d -data_source: internal_events -data_category: optional -performance_indicator_type: [] -events: - - name: p_analytics_ci_cd_pipelines - unique: user.id -tiers: - - free - - premium - - ultimate diff --git a/config/metrics/counts_28d/20220221210352_users_creating_work_items_monthly.yml b/config/metrics/counts_28d/20220221210352_users_creating_work_items_monthly.yml deleted file mode 100644 index 687a6c3d51a..00000000000 --- a/config/metrics/counts_28d/20220221210352_users_creating_work_items_monthly.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- -key_path: redis_hll_counters.work_items.users_creating_work_items_monthly -description: Unique users creating work items -product_group: project_management -value_type: number -status: active -milestone: '14.9' -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81201 -time_frame: 28d -data_source: internal_events -data_category: optional -events: - - name: users_creating_work_items - unique: user.id -tiers: -- free -- premium -- ultimate diff --git a/config/metrics/counts_28d/20220622084700_p_analytics_ci_cd_time_to_restore_service_monthly.yml b/config/metrics/counts_28d/20220622084700_p_analytics_ci_cd_time_to_restore_service_monthly.yml deleted file mode 100644 index 75cb678ec50..00000000000 --- a/config/metrics/counts_28d/20220622084700_p_analytics_ci_cd_time_to_restore_service_monthly.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- -key_path: redis_hll_counters.analytics.p_analytics_ci_cd_time_to_restore_service_monthly -description: Count of unique visits to the project level CI/CD Analytics Time to restore service tab -product_group: optimize -value_type: number -status: active -milestone: "15.2" -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90856 -time_frame: 28d -data_source: internal_events -data_category: operational -performance_indicator_type: [] -tiers: -- premium -- ultimate -events: - - name: visit_ci_cd_time_to_restore_service_tab - unique: user.id diff --git a/config/metrics/counts_28d/20220707054530_p_analytics_ci_cd_change_failure_rate_monthly.yml b/config/metrics/counts_28d/20220707054530_p_analytics_ci_cd_change_failure_rate_monthly.yml deleted file mode 100644 index 06f1030e828..00000000000 --- a/config/metrics/counts_28d/20220707054530_p_analytics_ci_cd_change_failure_rate_monthly.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- -key_path: redis_hll_counters.analytics.p_analytics_ci_cd_change_failure_rate_monthly -description: Count of unique visits to the project level CI/CD Analytics Change failure rate tab -product_group: optimize -value_type: number -status: active -milestone: "15.2" -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91726 -time_frame: 28d -data_source: internal_events -data_category: operational -performance_indicator_type: [] -tiers: -- premium -- ultimate -events: - - name: visit_ci_cd_failure_rate_tab - unique: user.id diff --git a/config/metrics/counts_7d/20210720144005_i_code_review_user_searches_diff_weekly.yml b/config/metrics/counts_all/i_code_review_user_searches_diff.yml similarity index 93% rename from config/metrics/counts_7d/20210720144005_i_code_review_user_searches_diff_weekly.yml rename to config/metrics/counts_all/i_code_review_user_searches_diff.yml index 731ae0c8b46..2a1b69ad0f8 100644 --- a/config/metrics/counts_7d/20210720144005_i_code_review_user_searches_diff_weekly.yml +++ b/config/metrics/counts_all/i_code_review_user_searches_diff.yml @@ -1,5 +1,5 @@ --- -key_path: redis_hll_counters.code_review.i_code_review_user_searches_diff_weekly +key_path: redis_hll_counters.code_review.i_code_review_user_searches_diff description: Count of users who search merge request diffs product_group: code_review product_categories: @@ -8,7 +8,9 @@ value_type: number status: active milestone: '14.2' introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/66522 -time_frame: 7d +time_frame: +- 28d +- 7d data_source: internal_events events: - name: i_code_review_user_searches_diff diff --git a/config/metrics/counts_7d/20220707054526_p_analytics_ci_cd_change_failure_rate_weekly.yml b/config/metrics/counts_all/p_analytics_ci_cd_change_failure_rate.yml similarity index 93% rename from config/metrics/counts_7d/20220707054526_p_analytics_ci_cd_change_failure_rate_weekly.yml rename to config/metrics/counts_all/p_analytics_ci_cd_change_failure_rate.yml index 5dd01f8c382..7fa8a4f0352 100644 --- a/config/metrics/counts_7d/20220707054526_p_analytics_ci_cd_change_failure_rate_weekly.yml +++ b/config/metrics/counts_all/p_analytics_ci_cd_change_failure_rate.yml @@ -1,12 +1,14 @@ --- -key_path: redis_hll_counters.analytics.p_analytics_ci_cd_change_failure_rate_weekly +key_path: redis_hll_counters.analytics.p_analytics_ci_cd_change_failure_rate description: Count of unique visits to the project level CI/CD Analytics Change failure rate tab product_group: optimize value_type: number status: active milestone: "15.2" introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/91726 -time_frame: 7d +time_frame: +- 28d +- 7d data_source: internal_events data_category: operational performance_indicator_type: [] diff --git a/config/metrics/counts_7d/20211126084441_p_analytics_ci_cd_pipelines_weekly.yml b/config/metrics/counts_all/p_analytics_ci_cd_pipelines.yml similarity index 95% rename from config/metrics/counts_7d/20211126084441_p_analytics_ci_cd_pipelines_weekly.yml rename to config/metrics/counts_all/p_analytics_ci_cd_pipelines.yml index e92b234e3b3..be5c3269e8f 100644 --- a/config/metrics/counts_7d/20211126084441_p_analytics_ci_cd_pipelines_weekly.yml +++ b/config/metrics/counts_all/p_analytics_ci_cd_pipelines.yml @@ -1,12 +1,14 @@ --- -key_path: redis_hll_counters.analytics.p_analytics_ci_cd_pipelines_weekly +key_path: redis_hll_counters.analytics.p_analytics_ci_cd_pipelines description: Count of unique visits to the project level CI CD Analytics pipelines tab product_group: optimize value_type: number status: active milestone: '14.6' introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/75187 -time_frame: 7d +time_frame: +- 28d +- 7d data_source: internal_events data_category: optional performance_indicator_type: [] diff --git a/config/metrics/counts_7d/20220622084654_p_analytics_ci_cd_time_to_restore_service_weekly.yml b/config/metrics/counts_all/p_analytics_ci_cd_time_to_restore_service.yml similarity index 92% rename from config/metrics/counts_7d/20220622084654_p_analytics_ci_cd_time_to_restore_service_weekly.yml rename to config/metrics/counts_all/p_analytics_ci_cd_time_to_restore_service.yml index 320d9d2041b..979d5de92a1 100644 --- a/config/metrics/counts_7d/20220622084654_p_analytics_ci_cd_time_to_restore_service_weekly.yml +++ b/config/metrics/counts_all/p_analytics_ci_cd_time_to_restore_service.yml @@ -1,12 +1,14 @@ --- -key_path: redis_hll_counters.analytics.p_analytics_ci_cd_time_to_restore_service_weekly +key_path: redis_hll_counters.analytics.p_analytics_ci_cd_time_to_restore_service description: Count of unique visits to the project level CI/CD Analytics Time to restore service tab product_group: optimize value_type: number status: active milestone: "15.2" introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90856 -time_frame: 7d +time_frame: +- 28d +- 7d data_source: internal_events data_category: operational performance_indicator_type: [] diff --git a/config/metrics/counts_7d/20220221210026_users_creating_work_items_weekly.yml b/config/metrics/counts_all/users_creating_work_items.yml similarity index 94% rename from config/metrics/counts_7d/20220221210026_users_creating_work_items_weekly.yml rename to config/metrics/counts_all/users_creating_work_items.yml index e177fded31b..960b2879f75 100644 --- a/config/metrics/counts_7d/20220221210026_users_creating_work_items_weekly.yml +++ b/config/metrics/counts_all/users_creating_work_items.yml @@ -1,12 +1,14 @@ --- -key_path: redis_hll_counters.work_items.users_creating_work_items_weekly +key_path: redis_hll_counters.work_items.users_creating_work_items description: Unique users creating work items product_group: project_management value_type: number status: active milestone: '14.9' introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81201 -time_frame: 7d +time_frame: +- 28d +- 7d data_source: internal_events data_category: optional events: diff --git a/db/post_migrate/20250602065847_drop_table_catalog_resource_component_usages.rb b/db/post_migrate/20250602065847_drop_table_catalog_resource_component_usages.rb index 216433b62c4..9a71e450483 100644 --- a/db/post_migrate/20250602065847_drop_table_catalog_resource_component_usages.rb +++ b/db/post_migrate/20250602065847_drop_table_catalog_resource_component_usages.rb @@ -4,7 +4,7 @@ class DropTableCatalogResourceComponentUsages < Gitlab::Database::Migration[2.3] milestone '18.1' def up - drop_table :p_catalog_resource_component_usages, if_exists: true + drop_table :p_catalog_resource_component_usages, if_exists: true, cascade: true end def down diff --git a/db/post_migrate/20250605111724_add_each_batch_index_to_sbom_graph_paths.rb b/db/post_migrate/20250605111724_add_each_batch_index_to_sbom_graph_paths.rb new file mode 100644 index 00000000000..be9ec1a5b9b --- /dev/null +++ b/db/post_migrate/20250605111724_add_each_batch_index_to_sbom_graph_paths.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +class AddEachBatchIndexToSbomGraphPaths < Gitlab::Database::Migration[2.3] + disable_ddl_transaction! + + milestone '18.1' + + INDEX_NAME = "index_sbom_graph_paths_on_project_id_and_id" + + def up + add_concurrent_index :sbom_graph_paths, %i[project_id id], name: INDEX_NAME + end + + def down + remove_concurrent_index_by_name :sbom_graph_paths, INDEX_NAME + end +end diff --git a/db/schema_migrations/20250605111724 b/db/schema_migrations/20250605111724 new file mode 100644 index 00000000000..768d09bd40a --- /dev/null +++ b/db/schema_migrations/20250605111724 @@ -0,0 +1 @@ +59a0696d354eaa0472075fa476902ab94ac97288988e76af00fbd65f26c0cec7 \ No newline at end of file diff --git a/db/structure.sql b/db/structure.sql index 8184e7e7bb4..c3ea081d1da 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -37264,6 +37264,8 @@ CREATE INDEX index_sbom_graph_paths_on_descendant_id ON sbom_graph_paths USING b CREATE INDEX index_sbom_graph_paths_on_project_id_and_descendant_id ON sbom_graph_paths USING btree (project_id, descendant_id); +CREATE INDEX index_sbom_graph_paths_on_project_id_and_id ON sbom_graph_paths USING btree (project_id, id); + CREATE INDEX index_sbom_occurr_on_project_id_and_component_version_id_and_id ON sbom_occurrences USING btree (project_id, component_version_id, id); CREATE INDEX index_sbom_occurrences_on_component_id_and_id ON sbom_occurrences USING btree (component_id, id); diff --git a/doc/ci/pipelines/pipeline_security.md b/doc/ci/pipelines/pipeline_security.md index af82327b069..07f32488b33 100644 --- a/doc/ci/pipelines/pipeline_security.md +++ b/doc/ci/pipelines/pipeline_security.md @@ -201,10 +201,22 @@ include: - local: '/ci/security-scan.yml' # Verified and stored in the repository ``` -### Automatic SLSA attestation generation +### SLSA provenance generation -GitLab offers a SLSA Level 1 compliant attestation that can be [automatically generated for all build artifacts produced by the GitLab Runner](../runners/configure_runners.md#artifact-provenance-metadata). -This attestation is produced by the runner itself. +GitLab offers a SLSA Level 1 compliant provenance statement that can be +[automatically generated for all build artifacts produced by the GitLab Runner](../runners/configure_runners.md#artifact-provenance-metadata). +This provenance statement is produced by the runner itself. + +#### Sign and verify SLSA provenance with a CI/CD Component + +The [GitLab SLSA CI/CD component](https://gitlab.com/explore/catalog/components/slsa) +provides configurations for: + +- Signing runner-generated provenance statements. +- Generating [Verification Summary Attestations (VSA)](https://slsa.dev/spec/v1.0/verification_summary) + for job artifacts. + +For more information and example configurations, see the [SLSA Component documentation](https://gitlab.com/components/slsa#slsa-supply-chain-levels-for-software-artifacts). ### Related topics diff --git a/gems/config/rubocop.yml b/gems/config/rubocop.yml index 6f2b44b92f4..4c51967742c 100644 --- a/gems/config/rubocop.yml +++ b/gems/config/rubocop.yml @@ -164,3 +164,6 @@ Rake/TopLevelMethodDefinition: Scalability/RandomCronSchedule: Enabled: false + +Database/AvoidUsingConnectionExecute: + Enabled: false diff --git a/lib/gitlab/import_export/project/import_export.yml b/lib/gitlab/import_export/project/import_export.yml index 374f59937c3..c327182030e 100644 --- a/lib/gitlab/import_export/project/import_export.yml +++ b/lib/gitlab/import_export/project/import_export.yml @@ -931,7 +931,6 @@ excluded_attributes: - :artifacts_size - :commands - :runner_id - - :trigger_request_id - :erased_by_id - :auto_canceled_by_id - :stage_id diff --git a/lib/gitlab/middleware/path_traversal_check.rb b/lib/gitlab/middleware/path_traversal_check.rb index 66f7bb89d73..ecff6d8fda2 100644 --- a/lib/gitlab/middleware/path_traversal_check.rb +++ b/lib/gitlab/middleware/path_traversal_check.rb @@ -40,6 +40,10 @@ module Gitlab return @app.call(env) unless path_traversal_attempt?(request, log_params) log_params[:request_rejected] = true + + # TODO Remove this when https://gitlab.com/gitlab-org/ruby/gems/labkit-ruby/-/issues/41 is implemented + log_params[:remote_ip] = request.remote_ip + log(log_params) REJECT_RESPONSE diff --git a/package.json b/package.json index 469f82e6ace..cc0963e9420 100644 --- a/package.json +++ b/package.json @@ -146,7 +146,7 @@ "deckar01-task_list": "^2.3.1", "dexie": "^3.2.3", "diff": "^3.4.0", - "dompurify": "^3.2.5", + "dompurify": "^3.2.6", "dropzone": "^4.2.0", "editorconfig": "^0.15.3", "emoji-regex": "^10.3.0", diff --git a/rubocop/cop/database/avoid_using_connection_execute.rb b/rubocop/cop/database/avoid_using_connection_execute.rb new file mode 100644 index 00000000000..ecafe3be92b --- /dev/null +++ b/rubocop/cop/database/avoid_using_connection_execute.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module Database + # Avoid using connection.execute for read-only queries. + # + # @example + # + # # bad + # class MyClass < ApplicationRecord + # def all + # connection.execute('SELECT * FROM my_table') # This goes to the primary db node + # end + # end + # + # # good + # class MyClass < ApplicationRecord + # def all + # connection.select_all('SELECT * FROM my_table') # This goes to a read replica + # end + # end + class AvoidUsingConnectionExecute < RuboCop::Cop::Base + MSG = "The `connection.execute` method always runs SQL statements on the primary database node. " \ + "To ensure queries are routed to the appropriate node (replica or primary), use operations like " \ + "`.select_all` or `.select_rows` for reads and `.insert` or `.update` for write operations." + + # @!method connection_execute?(node) + def_node_matcher :connection_execute?, <<~PATTERN + (send (send nil? :connection) :execute ...) + PATTERN + + def on_send(node) + add_offense(node) if connection_execute?(node) + end + + alias_method :on_csend, :on_send + end + end + end +end diff --git a/spec/db/schema_spec.rb b/spec/db/schema_spec.rb index daab23a28df..10539a7ee59 100644 --- a/spec/db/schema_spec.rb +++ b/spec/db/schema_spec.rb @@ -151,7 +151,7 @@ RSpec.describe 'Database schema', oauth_device_grants: %w[resource_owner_id application_id], packages_nuget_symbols: %w[project_id], packages_package_files: %w[project_id], - p_ci_builds: %w[erased_by_id trigger_request_id partition_id auto_canceled_by_partition_id execution_config_id + p_ci_builds: %w[erased_by_id partition_id auto_canceled_by_partition_id execution_config_id upstream_pipeline_partition_id], p_ci_builds_metadata: %w[project_id build_id partition_id], p_ci_build_trace_metadata: %w[project_id], diff --git a/spec/fixtures/lib/gitlab/import_export/complex/tree/project/ci_pipelines.ndjson b/spec/fixtures/lib/gitlab/import_export/complex/tree/project/ci_pipelines.ndjson index 8e08ca3efd2..030d8e6b9db 100644 --- a/spec/fixtures/lib/gitlab/import_export/complex/tree/project/ci_pipelines.ndjson +++ b/spec/fixtures/lib/gitlab/import_export/complex/tree/project/ci_pipelines.ndjson @@ -1,9 +1,9 @@ -{"id":19,"project_id":5,"ref":"master","sha":"2ea1f3dec713d940208fb5ce4a38765ecb5d3f73","before_sha":null,"push_data":null,"created_at":"2016-03-22T15:20:35.763Z","updated_at":"2016-03-22T15:20:35.763Z","tag":null,"yaml_errors":null,"committed_at":null,"status":"waiting_for_resource","started_at":null,"finished_at":null,"duration":null,"stages":[{"id":24,"project_id":5,"pipeline_id":40,"name":"test","status":1,"created_at":"2016-03-22T15:44:44.772Z","updated_at":"2016-03-29T06:44:44.634Z","statuses":[{"id":79,"project_id":5,"status":"running","finished_at":"2016-03-29T06:28:12.695Z","trace":"Sed culpa est et facere saepe vel id ab. Quas temporibus aut similique dolorem consequatur corporis aut praesentium. Cum officia molestiae sit earum excepturi.\n\nSint possimus aut ratione quia. Quis nesciunt ratione itaque illo. Tenetur est dolor assumenda possimus voluptatem quia minima. Accusamus reprehenderit ut et itaque non reiciendis incidunt.\n\nRerum suscipit quibusdam dolore nam omnis. Consequatur ipsa nihil ut enim blanditiis delectus. Nulla quis hic occaecati mollitia qui placeat. Quo rerum sed perferendis a accusantium consequatur commodi ut. Sit quae et cumque vel eius tempora nostrum.\n\nUllam dolorem et itaque sint est. Ea molestias quia provident dolorem vitae error et et. Ea expedita officiis iste non. Qui vitae odit saepe illum. Dolores enim ratione deserunt tempore expedita amet non neque.\n\nEligendi asperiores voluptatibus omnis repudiandae expedita distinctio qui aliquid. Autem aut doloremque distinctio ab. Nostrum sapiente repudiandae aspernatur ea et quae voluptas. Officiis perspiciatis nisi laudantium asperiores error eligendi ab. Eius quia amet magni omnis exercitationem voluptatum et.\n\nVoluptatem ullam labore quas dicta est ex voluptas. Pariatur ea modi voluptas consequatur dolores perspiciatis similique. Numquam in distinctio perspiciatis ut qui earum. Quidem omnis mollitia facere aut beatae. Ea est iure et voluptatem.","created_at":"2016-03-22T15:20:35.950Z","updated_at":"2016-03-29T06:28:12.696Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":40,"commands":"$ build command","job_id":null,"name":"test build 1","deploy":false,"options":null,"allow_failure":false,"stage":"test","trigger_request_id":null,"stage_idx":1,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null},{"id":80,"project_id":5,"status":"success","finished_at":null,"trace":"Impedit et optio nemo ipsa. Non ad non quis ut sequi laudantium omnis velit. Corporis a enim illo eos. Quia totam tempore inventore ad est.\n\nNihil recusandae cupiditate eaque voluptatem molestias sint. Consequatur id voluptatem cupiditate harum. Consequuntur iusto quaerat reiciendis aut autem libero est. Quisquam dolores veritatis rerum et sint maxime ullam libero. Id quas porro ut perspiciatis rem amet vitae.\n\nNemo inventore minus blanditiis magnam. Modi consequuntur nostrum aut voluptatem ex. Sunt rerum rem optio mollitia qui aliquam officiis officia. Aliquid eos et id aut minus beatae reiciendis.\n\nDolores non in temporibus dicta. Fugiat voluptatem est aspernatur expedita voluptatum nam qui. Quia et eligendi sit quae sint tempore exercitationem eos. Est sapiente corrupti quidem at. Qui magni odio repudiandae saepe tenetur optio dolore.\n\nEos placeat soluta at dolorem adipisci provident. Quo commodi id reprehenderit possimus quo tenetur. Ipsum et quae eligendi laborum. Et qui nesciunt at quasi quidem voluptatem cum rerum. Excepturi non facilis aut sunt vero sed.\n\nQui explicabo ratione ut eligendi recusandae. Quis quasi quas molestiae consequatur voluptatem et voluptatem. Ex repellat saepe occaecati aperiam ea eveniet dignissimos facilis.","created_at":"2016-03-22T15:20:35.966Z","updated_at":"2016-03-22T15:20:35.966Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":40,"commands":"$ build command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"test","trigger_request_id":null,"stage_idx":1,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null}]}]} -{"id":20,"project_id":5,"ref":"master","sha":"ce84140e8b878ce6e7c4d298c7202ff38170e3ac","before_sha":null,"push_data":null,"created_at":"2016-03-22T15:20:35.763Z","updated_at":"2016-03-22T15:20:35.763Z","tag":false,"yaml_errors":null,"committed_at":null,"status":"preparing","started_at":null,"finished_at":null,"duration":null,"stages":[{"id":90,"project_id":5,"status":10,"finished_at":"2016-03-29T06:28:12.695Z","trace":"foo","created_at":"2016-03-22T15:20:35.950Z","updated_at":"2016-03-29T06:28:12.696Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":40,"commands":"$ build command","job_id":null,"name":"test build 1","deploy":false,"options":null,"allow_failure":false,"stage":"test","trigger_request_id":null,"stage_idx":1,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null}],"source":"external_pull_request_event","external_pull_request":{"id":3,"pull_request_iid":4,"source_branch":"feature","target_branch":"master","source_repository":"the-repository","target_repository":"the-repository","source_sha":"ce84140e8b878ce6e7c4d298c7202ff38170e3ac","target_sha":"a09386439ca39abe575675ffd4b89ae824fec22f","status":"open","created_at":"2016-03-22T15:20:35.763Z","updated_at":"2016-03-22T15:20:35.763Z"}} -{"id":26,"project_id":5,"ref":"master","sha":"048721d90c449b244b7b4c53a9186b04330174ec","before_sha":null,"push_data":null,"created_at":"2016-03-22T15:20:35.757Z","updated_at":"2016-03-22T15:20:35.757Z","tag":false,"yaml_errors":null,"committed_at":null,"status":"pending","started_at":null,"finished_at":null,"duration":null,"source":"merge_request_event","merge_request_id":27,"stages":[{"id":21,"project_id":5,"pipeline_id":37,"name":"test","status":1,"created_at":"2016-03-22T15:44:44.772Z","updated_at":"2016-03-29T06:44:44.634Z","builds":[{"id":74,"project_id":5,"status":"success","finished_at":null,"trace":"Ad ut quod repudiandae iste dolor doloribus. Adipisci consequuntur deserunt omnis quasi eveniet et sed fugit. Aut nemo omnis molestiae impedit ex consequatur ducimus. Voluptatum exercitationem quia aut est et hic dolorem.\n\nQuasi repellendus et eaque magni eum facilis. Dolorem aperiam nam nihil pariatur praesentium ad aliquam. Commodi enim et eos tenetur. Odio voluptatibus laboriosam mollitia rerum exercitationem magnam consequuntur. Tenetur ea vel eum corporis.\n\nVoluptatibus optio in aliquid est voluptates. Ad a ut ab placeat vero blanditiis. Earum aspernatur quia beatae expedita voluptatem dignissimos provident. Quis minima id nemo ut aut est veritatis provident.\n\nRerum voluptatem quidem eius maiores magnam veniam. Voluptatem aperiam aut voluptate et nulla deserunt voluptas. Quaerat aut accusantium laborum est dolorem architecto reiciendis. Aliquam asperiores doloribus omnis maxime enim nesciunt. Eum aut rerum repellendus debitis et ut eius.\n\nQuaerat assumenda ea sit consequatur autem in. Cum eligendi voluptatem quo sed. Ut fuga iusto cupiditate autem sint.\n\nOfficia totam officiis architecto corporis molestiae amet ut. Tempora sed dolorum rerum omnis voluptatem accusantium sit eum. Quia debitis ipsum quidem aliquam inventore sunt consequatur qui.","created_at":"2016-03-22T15:20:35.846Z","updated_at":"2016-03-22T15:20:35.846Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":37,"commands":"$ build command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"test","trigger_request_id":null,"stage_idx":1,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null},{"id":73,"project_id":5,"status":"canceled","finished_at":null,"trace":null,"created_at":"2016-03-22T15:20:35.842Z","updated_at":"2016-03-22T15:20:35.842Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":37,"commands":"$ build command","job_id":null,"name":"test build 1","deploy":false,"options":null,"allow_failure":false,"stage":"test","trigger_request_id":null,"stage_idx":1,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null}]}],"merge_request":{"id":27,"merge_when_pipeline_succeeds":true,"target_branch":"feature","source_branch":"feature_conflict","source_project_id":2147483547,"author_id":1,"assignee_id":null,"title":"MR1","created_at":"2016-06-14T15:02:36.568Z","updated_at":"2016-06-14T15:02:56.815Z","state":"opened","merge_status":"unchecked","target_project_id":5,"iid":9,"description":null,"position":0,"updated_by_id":null,"merge_error":null,"diff_head_sha":"HEAD","source_branch_sha":"ABCD","target_branch_sha":"DCBA","merge_params":{"force_remove_source_branch":null}}} -{"id":36,"project_id":5,"ref":null,"sha":"sha-notes","before_sha":null,"push_data":null,"created_at":"2016-03-22T15:20:35.755Z","updated_at":"2016-03-22T15:20:35.755Z","tag":null,"yaml_errors":null,"committed_at":null,"status":"running","started_at":null,"finished_at":null,"user_id":2147483547,"duration":null,"source":"push","merge_request_id":null,"pipeline_metadata": {"id": 2, "project_id": 5, "pipeline_id": 36, "name": "Build pipeline"},"notes":[{"id":2147483547,"note":"Natus rerum qui dolorem dolorum voluptas.","noteable_type":"Commit","author_id":1,"created_at":"2016-03-22T15:19:59.469Z","updated_at":"2016-03-22T15:19:59.469Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":"be93687618e4b132087f430a4d8fc3a609c9b77c","noteable_id":36,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"}}],"stages":[{"id":11,"project_id":5,"pipeline_id":36,"name":"test","status":1,"created_at":"2016-03-22T15:44:44.772Z","updated_at":"2016-03-29T06:44:44.634Z","builds":[{"id":71,"project_id":5,"status":"failed","finished_at":"2016-03-29T06:28:12.630Z","trace":null,"created_at":"2016-03-22T15:20:35.772Z","updated_at":"2016-03-29T06:28:12.634Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":36,"commands":"$ build command","job_id":null,"name":"test build 1","deploy":false,"options":{"image":"busybox:latest"},"allow_failure":false,"stage":"test","trigger_request_id":null,"stage_idx":1,"stage_id":11,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null,"type":"Ci::Build","token":"abcd","artifacts_file_store":1,"artifacts_metadata_store":1,"artifacts_size":10}],"bridges":[{",id":72,"project_id":5,"status":"success","finished_at":null,"trace":"Porro ea qui ut dolores. Labore ab nemo explicabo aspernatur quis voluptates corporis. Et quasi delectus est sit aperiam perspiciatis asperiores. Repudiandae cum aut consectetur accusantium officia sunt.\n\nQuidem dolore iusto quaerat ut aut inventore et molestiae. Libero voluptates atque nemo qui. Nulla temporibus ipsa similique facere.\n\nAliquam ipsam perferendis qui fugit accusantium omnis id voluptatum. Dignissimos aliquid dicta eos voluptatem assumenda quia. Sed autem natus unde dolor et non nisi et. Consequuntur nihil consequatur rerum est.\n\nSimilique neque est iste ducimus qui fuga cupiditate. Libero autem est aut fuga. Consectetur natus quis non ducimus ut dolore. Magni voluptatibus eius et maxime aut.\n\nAd officiis tempore voluptate vitae corrupti explicabo labore est. Consequatur expedita et sunt nihil aut. Deleniti porro iusto molestiae et beatae.\n\nDeleniti modi nulla qui et labore sequi corrupti. Qui voluptatem assumenda eum cupiditate et. Nesciunt ipsam ut ea possimus eum. Consectetur quidem suscipit atque dolore itaque voluptatibus et cupiditate.","created_at":"2016-03-22T15:20:35.777Z","updated_at":"2016-03-22T15:20:35.777Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":36,"commands":"$ deploy command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"deploy","trigger_request_id":null,"stage_idx":1,"stage_id":12,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null}], "generic_commit_statuses": [{"id":72,"project_id":5,"status":"success","finished_at":null,"trace":"Porro ea qui ut dolores. Labore ab nemo explicabo aspernatur quis voluptates corporis. Et quasi delectus est sit aperiam perspiciatis asperiores. Repudiandae cum aut consectetur accusantium officia sunt.\n\nQuidem dolore iusto quaerat ut aut inventore et molestiae. Libero voluptates atque nemo qui. Nulla temporibus ipsa similique facere.\n\nAliquam ipsam perferendis qui fugit accusantium omnis id voluptatum. Dignissimos aliquid dicta eos voluptatem assumenda quia. Sed autem natus unde dolor et non nisi et. Consequuntur nihil consequatur rerum est.\n\nSimilique neque est iste ducimus qui fuga cupiditate. Libero autem est aut fuga. Consectetur natus quis non ducimus ut dolore. Magni voluptatibus eius et maxime aut.\n\nAd officiis tempore voluptate vitae corrupti explicabo labore est. Consequatur expedita et sunt nihil aut. Deleniti porro iusto molestiae et beatae.\n\nDeleniti modi nulla qui et labore sequi corrupti. Qui voluptatem assumenda eum cupiditate et. Nesciunt ipsam ut ea possimus eum. Consectetur quidem suscipit atque dolore itaque voluptatibus et cupiditate.","created_at":"2016-03-22T15:20:35.777Z","updated_at":"2016-03-22T15:20:35.777Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":36,"commands":"$ deploy command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"deploy","trigger_request_id":null,"stage_idx":1,"stage_id":12,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null}]},{"id":12,"project_id":5,"pipeline_id":36,"name":"deploy","status":2,"created_at":"2016-03-22T15:45:45.772Z","updated_at":"2016-03-29T06:45:45.634Z"}]} -{"id":38,"iid":1,"project_id":5,"ref":"master","sha":"5f923865dde3436854e9ceb9cdb7815618d4e849","before_sha":null,"push_data":null,"created_at":"2016-03-22T15:20:35.759Z","updated_at":"2016-03-22T15:20:35.759Z","tag":null,"yaml_errors":null,"committed_at":null,"status":"created","started_at":null,"finished_at":null,"duration":null,"stages":[{"id":22,"project_id":5,"pipeline_id":38,"name":"test","status":3,"created_at":"2016-03-22T15:44:44.772Z","updated_at":"2016-03-29T06:44:44.634Z","builds":[{"id":76,"project_id":5,"status":"success","finished_at":null,"trace":"Et rerum quia ea cumque ut modi non. Libero eaque ipsam architecto maiores expedita deleniti. Ratione quia qui est id.\n\nQuod sit officiis sed unde inventore veniam quisquam velit. Ea harum cum quibusdam quisquam minima quo possimus non. Temporibus itaque aliquam aut rerum veritatis at.\n\nMagnam ipsum eius recusandae qui quis sit maiores eum. Et animi iusto aut itaque. Doloribus harum deleniti nobis accusantium et libero.\n\nRerum fuga perferendis magni commodi officiis id repudiandae. Consequatur ratione consequatur suscipit facilis sunt iure est dicta. Qui unde quasi facilis et quae nesciunt. Magnam iste et nobis officiis tenetur. Aspernatur quo et temporibus non in.\n\nNisi rerum velit est ad enim sint molestiae consequuntur. Quaerat nisi nesciunt quasi officiis. Possimus non blanditiis laborum quos.\n\nRerum laudantium facere animi qui. Ipsa est iusto magnam nihil. Enim omnis occaecati non dignissimos ut recusandae eum quasi. Qui maxime dolor et nemo voluptates incidunt quia.","created_at":"2016-03-22T15:20:35.882Z","updated_at":"2016-03-22T15:20:35.882Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":38,"commands":"$ build command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"test","trigger_request_id":null,"stage_idx":1,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null},{"id":75,"project_id":5,"status":"failed","finished_at":null,"trace":"Sed et iste recusandae dicta corporis. Sunt alias porro fugit sunt. Fugiat omnis nihil dignissimos aperiam explicabo doloremque sit aut. Harum fugit expedita quia rerum ut consequatur laboriosam aliquam.\n\nNatus libero ut ut tenetur earum. Tempora omnis autem omnis et libero dolores illum autem. Deleniti eos sunt mollitia ipsam. Cum dolor repellendus dolorum sequi officia. Ullam sunt in aut pariatur excepturi.\n\nDolor nihil debitis et est eos. Cumque eos eum saepe ducimus autem. Alias architecto consequatur aut pariatur possimus. Aut quos aut incidunt quam velit et. Quas voluptatum ad dolorum dignissimos.\n\nUt voluptates consectetur illo et. Est commodi accusantium vel quo. Eos qui fugiat soluta porro.\n\nRatione possimus alias vel maxime sint totam est repellat. Ipsum corporis eos sint voluptatem eos odit. Temporibus libero nulla harum eligendi labore similique ratione magnam. Suscipit sequi in omnis neque.\n\nLaudantium dolor amet omnis placeat mollitia aut molestiae. Aut rerum similique ipsum quod illo quas unde. Sunt aut veritatis eos omnis porro. Rem veritatis mollitia praesentium dolorem. Consequatur sequi ad cumque earum omnis quia necessitatibus.","created_at":"2016-03-22T15:20:35.864Z","updated_at":"2016-03-22T15:20:35.864Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":38,"commands":"$ build command","job_id":null,"name":"test build 1","deploy":false,"options":null,"allow_failure":false,"stage":"test","trigger_request_id":null,"stage_idx":1,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null}]}]} -{"id":39,"project_id":5,"ref":"master","sha":"d2d430676773caa88cdaf7c55944073b2fd5561a","before_sha":null,"push_data":null,"created_at":"2016-03-22T15:20:35.761Z","updated_at":"2016-03-22T15:20:35.761Z","tag":null,"yaml_errors":null,"committed_at":null,"status":"scheduled","started_at":null,"finished_at":null,"duration":null,"stages":[{"id":23,"project_id":5,"pipeline_id":39,"name":"test","status":1,"created_at":"2016-03-22T15:44:44.772Z","updated_at":"2016-03-29T06:44:44.634Z","builds":[{"id":78,"project_id":5,"status":"pending","finished_at":null,"trace":"Dolorem deserunt quas quia error hic quo cum vel. Natus voluptatem cumque expedita numquam odit. Eos expedita nostrum corporis consequatur est recusandae.\n\nCulpa blanditiis rerum repudiandae alias voluptatem. Velit iusto est ullam consequatur doloribus porro. Corporis voluptas consectetur est veniam et quia quae.\n\nEt aut magni fuga nesciunt officiis molestias. Quaerat et nam necessitatibus qui rerum. Architecto quia officiis voluptatem laborum est recusandae. Quasi ducimus soluta odit necessitatibus labore numquam dignissimos. Quia facere sint temporibus inventore sunt nihil saepe dolorum.\n\nFacere dolores quis dolores a. Est minus nostrum nihil harum. Earum laborum et ipsum unde neque sit nemo. Corrupti est consequatur minima fugit. Illum voluptatem illo error ducimus officia qui debitis.\n\nDignissimos porro a autem harum aut. Aut id reprehenderit et exercitationem. Est et quisquam ipsa temporibus molestiae. Architecto natus dolore qui fugiat incidunt. Autem odit veniam excepturi et voluptatibus culpa ipsum eos.\n\nAmet quo quisquam dignissimos soluta modi dolores. Sint omnis eius optio corporis dolor. Eligendi animi porro quia placeat ut.","created_at":"2016-03-22T15:20:35.927Z","updated_at":"2016-03-22T15:20:35.927Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":39,"commands":"$ build command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"test","trigger_request_id":null,"stage_idx":1,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null},{"id":77,"project_id":5,"status":"running","finished_at":null,"trace":"Rerum ut et suscipit est perspiciatis. Inventore debitis cum eius vitae. Ex incidunt id velit aut quo nisi. Laboriosam repellat deserunt eius reiciendis architecto et. Est harum quos nesciunt nisi consectetur.\n\nAlias esse omnis sint officia est consequatur in nobis. Dignissimos dolorum vel eligendi nesciunt dolores sit. Veniam mollitia ducimus et exercitationem molestiae libero sed. Atque omnis debitis laudantium voluptatibus qui. Repellendus tempore est commodi pariatur.\n\nExpedita voluptate illum est alias non. Modi nesciunt ab assumenda laborum nulla consequatur molestias doloremque. Magnam quod officia vel explicabo accusamus ut voluptatem incidunt. Rerum ut aliquid ullam saepe. Est eligendi debitis beatae blanditiis reiciendis.\n\nQui fuga sit dolores libero maiores et suscipit. Consectetur asperiores omnis minima impedit eos fugiat. Similique omnis nisi sed vero inventore ipsum aliquam exercitationem.\n\nBlanditiis magni iure dolorum omnis ratione delectus molestiae. Atque officia dolor voluptatem culpa quod. Incidunt suscipit quidem possimus veritatis non vel. Iusto aliquid et id quia quasi.\n\nVel facere velit blanditiis incidunt cupiditate sed maiores consequuntur. Quasi quia dicta consequuntur et quia voluptatem iste id. Incidunt et rerum fuga esse sint.","created_at":"2016-03-22T15:20:35.905Z","updated_at":"2016-03-22T15:20:35.905Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":39,"commands":"$ build command","job_id":null,"name":"test build 1","deploy":false,"options":null,"allow_failure":false,"stage":"test","trigger_request_id":null,"stage_idx":1,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null}],"bridges":[{"id":73,"project_id":5,"status":"pending","finished_at":null,"trace":"123","created_at":"2016-03-22T15:20:35.777Z","updated_at":"2016-03-22T15:20:35.777Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":36,"commands":"$ deploy command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"deploy","trigger_request_id":null,"stage_idx":1,"stage_id":12,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null},{"id":75,"project_id":5,"status":"waiting_for_resource","finished_at":null,"trace":"1234","created_at":"2016-03-22T15:20:35.777Z","updated_at":"2016-03-22T15:20:35.777Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":36,"commands":"$ deploy command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"deploy","trigger_request_id":null,"stage_idx":1,"stage_id":12,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null},{"id":76,"project_id":5,"status":"running","finished_at":null,"trace":"12345","created_at":"2016-03-22T15:20:35.777Z","updated_at":"2016-03-22T15:20:35.777Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":36,"commands":"$ deploy command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"deploy","trigger_request_id":null,"stage_idx":1,"stage_id":12,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null},{"id":77,"project_id":5,"status":"scheduled","finished_at":null,"trace":"123456","created_at":"2016-03-22T15:20:35.777Z","updated_at":"2016-03-22T15:20:35.777Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":36,"commands":"$ deploy command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"deploy","trigger_request_id":null,"stage_idx":1,"stage_id":12,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null}],"generic_commit_statuses": [{"id":73,"project_id":5,"status":"pending","finished_at":null,"trace":"123","created_at":"2016-03-22T15:20:35.777Z","updated_at":"2016-03-22T15:20:35.777Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":36,"commands":"$ deploy command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"deploy","trigger_request_id":null,"stage_idx":1,"stage_id":12,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null},{"id":74,"project_id":5,"status":"running","finished_at":null,"trace":"123","created_at":"2016-03-22T15:20:35.777Z","updated_at":"2016-03-22T15:20:35.777Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":36,"commands":"$ deploy command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"deploy","trigger_request_id":null,"stage_idx":1,"stage_id":12,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null}]}]} +{"id":19,"project_id":5,"ref":"master","sha":"2ea1f3dec713d940208fb5ce4a38765ecb5d3f73","before_sha":null,"push_data":null,"created_at":"2016-03-22T15:20:35.763Z","updated_at":"2016-03-22T15:20:35.763Z","tag":null,"yaml_errors":null,"committed_at":null,"status":"waiting_for_resource","started_at":null,"finished_at":null,"duration":null,"stages":[{"id":24,"project_id":5,"pipeline_id":40,"name":"test","status":1,"created_at":"2016-03-22T15:44:44.772Z","updated_at":"2016-03-29T06:44:44.634Z","statuses":[{"id":79,"project_id":5,"status":"running","finished_at":"2016-03-29T06:28:12.695Z","trace":"Sed culpa est et facere saepe vel id ab. Quas temporibus aut similique dolorem consequatur corporis aut praesentium. Cum officia molestiae sit earum excepturi.\n\nSint possimus aut ratione quia. Quis nesciunt ratione itaque illo. Tenetur est dolor assumenda possimus voluptatem quia minima. Accusamus reprehenderit ut et itaque non reiciendis incidunt.\n\nRerum suscipit quibusdam dolore nam omnis. Consequatur ipsa nihil ut enim blanditiis delectus. Nulla quis hic occaecati mollitia qui placeat. Quo rerum sed perferendis a accusantium consequatur commodi ut. Sit quae et cumque vel eius tempora nostrum.\n\nUllam dolorem et itaque sint est. Ea molestias quia provident dolorem vitae error et et. Ea expedita officiis iste non. Qui vitae odit saepe illum. Dolores enim ratione deserunt tempore expedita amet non neque.\n\nEligendi asperiores voluptatibus omnis repudiandae expedita distinctio qui aliquid. Autem aut doloremque distinctio ab. Nostrum sapiente repudiandae aspernatur ea et quae voluptas. Officiis perspiciatis nisi laudantium asperiores error eligendi ab. Eius quia amet magni omnis exercitationem voluptatum et.\n\nVoluptatem ullam labore quas dicta est ex voluptas. Pariatur ea modi voluptas consequatur dolores perspiciatis similique. Numquam in distinctio perspiciatis ut qui earum. Quidem omnis mollitia facere aut beatae. Ea est iure et voluptatem.","created_at":"2016-03-22T15:20:35.950Z","updated_at":"2016-03-29T06:28:12.696Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":40,"commands":"$ build command","job_id":null,"name":"test build 1","deploy":false,"options":null,"allow_failure":false,"stage":"test","stage_idx":1,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null},{"id":80,"project_id":5,"status":"success","finished_at":null,"trace":"Impedit et optio nemo ipsa. Non ad non quis ut sequi laudantium omnis velit. Corporis a enim illo eos. Quia totam tempore inventore ad est.\n\nNihil recusandae cupiditate eaque voluptatem molestias sint. Consequatur id voluptatem cupiditate harum. Consequuntur iusto quaerat reiciendis aut autem libero est. Quisquam dolores veritatis rerum et sint maxime ullam libero. Id quas porro ut perspiciatis rem amet vitae.\n\nNemo inventore minus blanditiis magnam. Modi consequuntur nostrum aut voluptatem ex. Sunt rerum rem optio mollitia qui aliquam officiis officia. Aliquid eos et id aut minus beatae reiciendis.\n\nDolores non in temporibus dicta. Fugiat voluptatem est aspernatur expedita voluptatum nam qui. Quia et eligendi sit quae sint tempore exercitationem eos. Est sapiente corrupti quidem at. Qui magni odio repudiandae saepe tenetur optio dolore.\n\nEos placeat soluta at dolorem adipisci provident. Quo commodi id reprehenderit possimus quo tenetur. Ipsum et quae eligendi laborum. Et qui nesciunt at quasi quidem voluptatem cum rerum. Excepturi non facilis aut sunt vero sed.\n\nQui explicabo ratione ut eligendi recusandae. Quis quasi quas molestiae consequatur voluptatem et voluptatem. Ex repellat saepe occaecati aperiam ea eveniet dignissimos facilis.","created_at":"2016-03-22T15:20:35.966Z","updated_at":"2016-03-22T15:20:35.966Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":40,"commands":"$ build command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"test","stage_idx":1,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null}]}]} +{"id":20,"project_id":5,"ref":"master","sha":"ce84140e8b878ce6e7c4d298c7202ff38170e3ac","before_sha":null,"push_data":null,"created_at":"2016-03-22T15:20:35.763Z","updated_at":"2016-03-22T15:20:35.763Z","tag":false,"yaml_errors":null,"committed_at":null,"status":"preparing","started_at":null,"finished_at":null,"duration":null,"stages":[{"id":90,"project_id":5,"status":10,"finished_at":"2016-03-29T06:28:12.695Z","trace":"foo","created_at":"2016-03-22T15:20:35.950Z","updated_at":"2016-03-29T06:28:12.696Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":40,"commands":"$ build command","job_id":null,"name":"test build 1","deploy":false,"options":null,"allow_failure":false,"stage":"test","stage_idx":1,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null}],"source":"external_pull_request_event","external_pull_request":{"id":3,"pull_request_iid":4,"source_branch":"feature","target_branch":"master","source_repository":"the-repository","target_repository":"the-repository","source_sha":"ce84140e8b878ce6e7c4d298c7202ff38170e3ac","target_sha":"a09386439ca39abe575675ffd4b89ae824fec22f","status":"open","created_at":"2016-03-22T15:20:35.763Z","updated_at":"2016-03-22T15:20:35.763Z"}} +{"id":26,"project_id":5,"ref":"master","sha":"048721d90c449b244b7b4c53a9186b04330174ec","before_sha":null,"push_data":null,"created_at":"2016-03-22T15:20:35.757Z","updated_at":"2016-03-22T15:20:35.757Z","tag":false,"yaml_errors":null,"committed_at":null,"status":"pending","started_at":null,"finished_at":null,"duration":null,"source":"merge_request_event","merge_request_id":27,"stages":[{"id":21,"project_id":5,"pipeline_id":37,"name":"test","status":1,"created_at":"2016-03-22T15:44:44.772Z","updated_at":"2016-03-29T06:44:44.634Z","builds":[{"id":74,"project_id":5,"status":"success","finished_at":null,"trace":"Ad ut quod repudiandae iste dolor doloribus. Adipisci consequuntur deserunt omnis quasi eveniet et sed fugit. Aut nemo omnis molestiae impedit ex consequatur ducimus. Voluptatum exercitationem quia aut est et hic dolorem.\n\nQuasi repellendus et eaque magni eum facilis. Dolorem aperiam nam nihil pariatur praesentium ad aliquam. Commodi enim et eos tenetur. Odio voluptatibus laboriosam mollitia rerum exercitationem magnam consequuntur. Tenetur ea vel eum corporis.\n\nVoluptatibus optio in aliquid est voluptates. Ad a ut ab placeat vero blanditiis. Earum aspernatur quia beatae expedita voluptatem dignissimos provident. Quis minima id nemo ut aut est veritatis provident.\n\nRerum voluptatem quidem eius maiores magnam veniam. Voluptatem aperiam aut voluptate et nulla deserunt voluptas. Quaerat aut accusantium laborum est dolorem architecto reiciendis. Aliquam asperiores doloribus omnis maxime enim nesciunt. Eum aut rerum repellendus debitis et ut eius.\n\nQuaerat assumenda ea sit consequatur autem in. Cum eligendi voluptatem quo sed. Ut fuga iusto cupiditate autem sint.\n\nOfficia totam officiis architecto corporis molestiae amet ut. Tempora sed dolorum rerum omnis voluptatem accusantium sit eum. Quia debitis ipsum quidem aliquam inventore sunt consequatur qui.","created_at":"2016-03-22T15:20:35.846Z","updated_at":"2016-03-22T15:20:35.846Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":37,"commands":"$ build command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"test","stage_idx":1,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null},{"id":73,"project_id":5,"status":"canceled","finished_at":null,"trace":null,"created_at":"2016-03-22T15:20:35.842Z","updated_at":"2016-03-22T15:20:35.842Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":37,"commands":"$ build command","job_id":null,"name":"test build 1","deploy":false,"options":null,"allow_failure":false,"stage":"test","stage_idx":1,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null}]}],"merge_request":{"id":27,"merge_when_pipeline_succeeds":true,"target_branch":"feature","source_branch":"feature_conflict","source_project_id":2147483547,"author_id":1,"assignee_id":null,"title":"MR1","created_at":"2016-06-14T15:02:36.568Z","updated_at":"2016-06-14T15:02:56.815Z","state":"opened","merge_status":"unchecked","target_project_id":5,"iid":9,"description":null,"position":0,"updated_by_id":null,"merge_error":null,"diff_head_sha":"HEAD","source_branch_sha":"ABCD","target_branch_sha":"DCBA","merge_params":{"force_remove_source_branch":null}}} +{"id":36,"project_id":5,"ref":null,"sha":"sha-notes","before_sha":null,"push_data":null,"created_at":"2016-03-22T15:20:35.755Z","updated_at":"2016-03-22T15:20:35.755Z","tag":null,"yaml_errors":null,"committed_at":null,"status":"running","started_at":null,"finished_at":null,"user_id":2147483547,"duration":null,"source":"push","merge_request_id":null,"pipeline_metadata": {"id": 2, "project_id": 5, "pipeline_id": 36, "name": "Build pipeline"},"notes":[{"id":2147483547,"note":"Natus rerum qui dolorem dolorum voluptas.","noteable_type":"Commit","author_id":1,"created_at":"2016-03-22T15:19:59.469Z","updated_at":"2016-03-22T15:19:59.469Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":"be93687618e4b132087f430a4d8fc3a609c9b77c","noteable_id":36,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"}}],"stages":[{"id":11,"project_id":5,"pipeline_id":36,"name":"test","status":1,"created_at":"2016-03-22T15:44:44.772Z","updated_at":"2016-03-29T06:44:44.634Z","builds":[{"id":71,"project_id":5,"status":"failed","finished_at":"2016-03-29T06:28:12.630Z","trace":null,"created_at":"2016-03-22T15:20:35.772Z","updated_at":"2016-03-29T06:28:12.634Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":36,"commands":"$ build command","job_id":null,"name":"test build 1","deploy":false,"options":{"image":"busybox:latest"},"allow_failure":false,"stage":"test","stage_idx":1,"stage_id":11,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null,"type":"Ci::Build","token":"abcd","artifacts_file_store":1,"artifacts_metadata_store":1,"artifacts_size":10}],"bridges":[{",id":72,"project_id":5,"status":"success","finished_at":null,"trace":"Porro ea qui ut dolores. Labore ab nemo explicabo aspernatur quis voluptates corporis. Et quasi delectus est sit aperiam perspiciatis asperiores. Repudiandae cum aut consectetur accusantium officia sunt.\n\nQuidem dolore iusto quaerat ut aut inventore et molestiae. Libero voluptates atque nemo qui. Nulla temporibus ipsa similique facere.\n\nAliquam ipsam perferendis qui fugit accusantium omnis id voluptatum. Dignissimos aliquid dicta eos voluptatem assumenda quia. Sed autem natus unde dolor et non nisi et. Consequuntur nihil consequatur rerum est.\n\nSimilique neque est iste ducimus qui fuga cupiditate. Libero autem est aut fuga. Consectetur natus quis non ducimus ut dolore. Magni voluptatibus eius et maxime aut.\n\nAd officiis tempore voluptate vitae corrupti explicabo labore est. Consequatur expedita et sunt nihil aut. Deleniti porro iusto molestiae et beatae.\n\nDeleniti modi nulla qui et labore sequi corrupti. Qui voluptatem assumenda eum cupiditate et. Nesciunt ipsam ut ea possimus eum. Consectetur quidem suscipit atque dolore itaque voluptatibus et cupiditate.","created_at":"2016-03-22T15:20:35.777Z","updated_at":"2016-03-22T15:20:35.777Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":36,"commands":"$ deploy command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"deploy","stage_idx":1,"stage_id":12,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null}], "generic_commit_statuses": [{"id":72,"project_id":5,"status":"success","finished_at":null,"trace":"Porro ea qui ut dolores. Labore ab nemo explicabo aspernatur quis voluptates corporis. Et quasi delectus est sit aperiam perspiciatis asperiores. Repudiandae cum aut consectetur accusantium officia sunt.\n\nQuidem dolore iusto quaerat ut aut inventore et molestiae. Libero voluptates atque nemo qui. Nulla temporibus ipsa similique facere.\n\nAliquam ipsam perferendis qui fugit accusantium omnis id voluptatum. Dignissimos aliquid dicta eos voluptatem assumenda quia. Sed autem natus unde dolor et non nisi et. Consequuntur nihil consequatur rerum est.\n\nSimilique neque est iste ducimus qui fuga cupiditate. Libero autem est aut fuga. Consectetur natus quis non ducimus ut dolore. Magni voluptatibus eius et maxime aut.\n\nAd officiis tempore voluptate vitae corrupti explicabo labore est. Consequatur expedita et sunt nihil aut. Deleniti porro iusto molestiae et beatae.\n\nDeleniti modi nulla qui et labore sequi corrupti. Qui voluptatem assumenda eum cupiditate et. Nesciunt ipsam ut ea possimus eum. Consectetur quidem suscipit atque dolore itaque voluptatibus et cupiditate.","created_at":"2016-03-22T15:20:35.777Z","updated_at":"2016-03-22T15:20:35.777Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":36,"commands":"$ deploy command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"deploy","stage_idx":1,"stage_id":12,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null}]},{"id":12,"project_id":5,"pipeline_id":36,"name":"deploy","status":2,"created_at":"2016-03-22T15:45:45.772Z","updated_at":"2016-03-29T06:45:45.634Z"}]} +{"id":38,"iid":1,"project_id":5,"ref":"master","sha":"5f923865dde3436854e9ceb9cdb7815618d4e849","before_sha":null,"push_data":null,"created_at":"2016-03-22T15:20:35.759Z","updated_at":"2016-03-22T15:20:35.759Z","tag":null,"yaml_errors":null,"committed_at":null,"status":"created","started_at":null,"finished_at":null,"duration":null,"stages":[{"id":22,"project_id":5,"pipeline_id":38,"name":"test","status":3,"created_at":"2016-03-22T15:44:44.772Z","updated_at":"2016-03-29T06:44:44.634Z","builds":[{"id":76,"project_id":5,"status":"success","finished_at":null,"trace":"Et rerum quia ea cumque ut modi non. Libero eaque ipsam architecto maiores expedita deleniti. Ratione quia qui est id.\n\nQuod sit officiis sed unde inventore veniam quisquam velit. Ea harum cum quibusdam quisquam minima quo possimus non. Temporibus itaque aliquam aut rerum veritatis at.\n\nMagnam ipsum eius recusandae qui quis sit maiores eum. Et animi iusto aut itaque. Doloribus harum deleniti nobis accusantium et libero.\n\nRerum fuga perferendis magni commodi officiis id repudiandae. Consequatur ratione consequatur suscipit facilis sunt iure est dicta. Qui unde quasi facilis et quae nesciunt. Magnam iste et nobis officiis tenetur. Aspernatur quo et temporibus non in.\n\nNisi rerum velit est ad enim sint molestiae consequuntur. Quaerat nisi nesciunt quasi officiis. Possimus non blanditiis laborum quos.\n\nRerum laudantium facere animi qui. Ipsa est iusto magnam nihil. Enim omnis occaecati non dignissimos ut recusandae eum quasi. Qui maxime dolor et nemo voluptates incidunt quia.","created_at":"2016-03-22T15:20:35.882Z","updated_at":"2016-03-22T15:20:35.882Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":38,"commands":"$ build command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"test","stage_idx":1,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null},{"id":75,"project_id":5,"status":"failed","finished_at":null,"trace":"Sed et iste recusandae dicta corporis. Sunt alias porro fugit sunt. Fugiat omnis nihil dignissimos aperiam explicabo doloremque sit aut. Harum fugit expedita quia rerum ut consequatur laboriosam aliquam.\n\nNatus libero ut ut tenetur earum. Tempora omnis autem omnis et libero dolores illum autem. Deleniti eos sunt mollitia ipsam. Cum dolor repellendus dolorum sequi officia. Ullam sunt in aut pariatur excepturi.\n\nDolor nihil debitis et est eos. Cumque eos eum saepe ducimus autem. Alias architecto consequatur aut pariatur possimus. Aut quos aut incidunt quam velit et. Quas voluptatum ad dolorum dignissimos.\n\nUt voluptates consectetur illo et. Est commodi accusantium vel quo. Eos qui fugiat soluta porro.\n\nRatione possimus alias vel maxime sint totam est repellat. Ipsum corporis eos sint voluptatem eos odit. Temporibus libero nulla harum eligendi labore similique ratione magnam. Suscipit sequi in omnis neque.\n\nLaudantium dolor amet omnis placeat mollitia aut molestiae. Aut rerum similique ipsum quod illo quas unde. Sunt aut veritatis eos omnis porro. Rem veritatis mollitia praesentium dolorem. Consequatur sequi ad cumque earum omnis quia necessitatibus.","created_at":"2016-03-22T15:20:35.864Z","updated_at":"2016-03-22T15:20:35.864Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":38,"commands":"$ build command","job_id":null,"name":"test build 1","deploy":false,"options":null,"allow_failure":false,"stage":"test","stage_idx":1,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null}]}]} +{"id":39,"project_id":5,"ref":"master","sha":"d2d430676773caa88cdaf7c55944073b2fd5561a","before_sha":null,"push_data":null,"created_at":"2016-03-22T15:20:35.761Z","updated_at":"2016-03-22T15:20:35.761Z","tag":null,"yaml_errors":null,"committed_at":null,"status":"scheduled","started_at":null,"finished_at":null,"duration":null,"stages":[{"id":23,"project_id":5,"pipeline_id":39,"name":"test","status":1,"created_at":"2016-03-22T15:44:44.772Z","updated_at":"2016-03-29T06:44:44.634Z","builds":[{"id":78,"project_id":5,"status":"pending","finished_at":null,"trace":"Dolorem deserunt quas quia error hic quo cum vel. Natus voluptatem cumque expedita numquam odit. Eos expedita nostrum corporis consequatur est recusandae.\n\nCulpa blanditiis rerum repudiandae alias voluptatem. Velit iusto est ullam consequatur doloribus porro. Corporis voluptas consectetur est veniam et quia quae.\n\nEt aut magni fuga nesciunt officiis molestias. Quaerat et nam necessitatibus qui rerum. Architecto quia officiis voluptatem laborum est recusandae. Quasi ducimus soluta odit necessitatibus labore numquam dignissimos. Quia facere sint temporibus inventore sunt nihil saepe dolorum.\n\nFacere dolores quis dolores a. Est minus nostrum nihil harum. Earum laborum et ipsum unde neque sit nemo. Corrupti est consequatur minima fugit. Illum voluptatem illo error ducimus officia qui debitis.\n\nDignissimos porro a autem harum aut. Aut id reprehenderit et exercitationem. Est et quisquam ipsa temporibus molestiae. Architecto natus dolore qui fugiat incidunt. Autem odit veniam excepturi et voluptatibus culpa ipsum eos.\n\nAmet quo quisquam dignissimos soluta modi dolores. Sint omnis eius optio corporis dolor. Eligendi animi porro quia placeat ut.","created_at":"2016-03-22T15:20:35.927Z","updated_at":"2016-03-22T15:20:35.927Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":39,"commands":"$ build command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"test","stage_idx":1,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null},{"id":77,"project_id":5,"status":"running","finished_at":null,"trace":"Rerum ut et suscipit est perspiciatis. Inventore debitis cum eius vitae. Ex incidunt id velit aut quo nisi. Laboriosam repellat deserunt eius reiciendis architecto et. Est harum quos nesciunt nisi consectetur.\n\nAlias esse omnis sint officia est consequatur in nobis. Dignissimos dolorum vel eligendi nesciunt dolores sit. Veniam mollitia ducimus et exercitationem molestiae libero sed. Atque omnis debitis laudantium voluptatibus qui. Repellendus tempore est commodi pariatur.\n\nExpedita voluptate illum est alias non. Modi nesciunt ab assumenda laborum nulla consequatur molestias doloremque. Magnam quod officia vel explicabo accusamus ut voluptatem incidunt. Rerum ut aliquid ullam saepe. Est eligendi debitis beatae blanditiis reiciendis.\n\nQui fuga sit dolores libero maiores et suscipit. Consectetur asperiores omnis minima impedit eos fugiat. Similique omnis nisi sed vero inventore ipsum aliquam exercitationem.\n\nBlanditiis magni iure dolorum omnis ratione delectus molestiae. Atque officia dolor voluptatem culpa quod. Incidunt suscipit quidem possimus veritatis non vel. Iusto aliquid et id quia quasi.\n\nVel facere velit blanditiis incidunt cupiditate sed maiores consequuntur. Quasi quia dicta consequuntur et quia voluptatem iste id. Incidunt et rerum fuga esse sint.","created_at":"2016-03-22T15:20:35.905Z","updated_at":"2016-03-22T15:20:35.905Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":39,"commands":"$ build command","job_id":null,"name":"test build 1","deploy":false,"options":null,"allow_failure":false,"stage":"test","stage_idx":1,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null}],"bridges":[{"id":73,"project_id":5,"status":"pending","finished_at":null,"trace":"123","created_at":"2016-03-22T15:20:35.777Z","updated_at":"2016-03-22T15:20:35.777Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":36,"commands":"$ deploy command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"deploy","stage_idx":1,"stage_id":12,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null},{"id":75,"project_id":5,"status":"waiting_for_resource","finished_at":null,"trace":"1234","created_at":"2016-03-22T15:20:35.777Z","updated_at":"2016-03-22T15:20:35.777Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":36,"commands":"$ deploy command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"deploy","stage_idx":1,"stage_id":12,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null},{"id":76,"project_id":5,"status":"running","finished_at":null,"trace":"12345","created_at":"2016-03-22T15:20:35.777Z","updated_at":"2016-03-22T15:20:35.777Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":36,"commands":"$ deploy command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"deploy","stage_idx":1,"stage_id":12,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null},{"id":77,"project_id":5,"status":"scheduled","finished_at":null,"trace":"123456","created_at":"2016-03-22T15:20:35.777Z","updated_at":"2016-03-22T15:20:35.777Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":36,"commands":"$ deploy command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"deploy","stage_idx":1,"stage_id":12,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null}],"generic_commit_statuses": [{"id":73,"project_id":5,"status":"pending","finished_at":null,"trace":"123","created_at":"2016-03-22T15:20:35.777Z","updated_at":"2016-03-22T15:20:35.777Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":36,"commands":"$ deploy command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"deploy","stage_idx":1,"stage_id":12,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null},{"id":74,"project_id":5,"status":"running","finished_at":null,"trace":"123","created_at":"2016-03-22T15:20:35.777Z","updated_at":"2016-03-22T15:20:35.777Z","started_at":null,"runner_id":null,"coverage":null,"commit_id":36,"commands":"$ deploy command","job_id":null,"name":"test build 2","deploy":false,"options":null,"allow_failure":false,"stage":"deploy","stage_idx":1,"stage_id":12,"tag":null,"ref":"master","user_id":null,"target_url":null,"description":null,"erased_by_id":null,"erased_at":null}]}]} {"id":41,"project_id":5,"ref":"master","sha":"2ea1f3dec713d940208fb5ce4a38765ecb5d3f73","before_sha":null,"push_data":null,"created_at":"2016-03-22T15:20:35.763Z","updated_at":"2016-03-22T15:20:35.763Z","tag":null,"yaml_errors":null,"committed_at":null,"status":"success","started_at":null,"finished_at":null,"duration":null,"stages":[]} {"id":42,"project_id":5,"ref":"master","sha":"1b6c4f044c63217d1ed06e514c84d22871bed912","before_sha":null,"push_data":null,"created_at":"2016-03-22T15:20:35.763Z","updated_at":"2016-03-22T15:20:35.763Z","tag":null,"yaml_errors":null,"committed_at":null,"status":"failed","started_at":null,"finished_at":null,"duration":null,"stages":[]} {"id":43,"project_id":5,"ref":"master","sha":"ded178474ef2ba1f80a9964ba15da3ddb3cf664b","before_sha":null,"push_data":null,"created_at":"2016-03-22T15:20:35.763Z","updated_at":"2016-03-22T15:20:35.763Z","tag":null,"yaml_errors":null,"committed_at":null,"status":"canceled","started_at":null,"finished_at":null,"duration":null,"stages":[]} diff --git a/spec/frontend/diffs/components/file_browser_toggle_spec.js b/spec/frontend/diffs/components/file_browser_toggle_spec.js index cc6fa2f5fdc..15eec67410d 100644 --- a/spec/frontend/diffs/components/file_browser_toggle_spec.js +++ b/spec/frontend/diffs/components/file_browser_toggle_spec.js @@ -100,7 +100,7 @@ describe('FileBrowserToggle', () => { it('Displays hide message for open file browser', () => { createComponent(); expect(findTooltip().value).toBe( - 'Hide file browser ', + 'Hide file browser ', ); }); @@ -109,7 +109,7 @@ describe('FileBrowserToggle', () => { useFileBrowser().fileBrowserVisible = false; await nextTick(); expect(findTooltip().value).toBe( - 'Show file browser ', + 'Show file browser ', ); }); }); diff --git a/spec/frontend/merge_request_tabs_spec.js b/spec/frontend/merge_request_tabs_spec.js index 3351058fe64..05bc1ab5eb8 100644 --- a/spec/frontend/merge_request_tabs_spec.js +++ b/spec/frontend/merge_request_tabs_spec.js @@ -574,6 +574,7 @@ describe('MergeRequestTabs', () => { ${'/user/diffs/-/merge_requests/1/pipelines'} | ${'pipelines'} ${'/user/pipelines/-/merge_requests/1/commits'} | ${'commits'} ${'/user/pipelines/1/-/merge_requests/1/diffs'} | ${'diffs'} + ${'/user/gitlab/-/merge_requests/new/diffs'} | ${'diffs'} ${'/user/pipelines/-/merge_requests/1'} | ${'show'} ${'/user/pipelines/-/merge_requests/1/reports'} | ${'reports'} ${'/group/reports/project/-/merge_requests/1/reports'} | ${'reports'} diff --git a/spec/frontend/repository/components/header_area/blob_controls_spec.js b/spec/frontend/repository/components/header_area/blob_controls_spec.js index 8aa3f18cdd9..8ea3920ca56 100644 --- a/spec/frontend/repository/components/header_area/blob_controls_spec.js +++ b/spec/frontend/repository/components/header_area/blob_controls_spec.js @@ -180,7 +180,7 @@ describe('Blob controls component', () => { expect(findFindButton().attributes('aria-keyshortcuts')).toBe('t'); expect(findFindButton().attributes('title')).toBe( - 'Go to find file ', + 'Go to find file ', ); expect(tooltip).toBeDefined(); }); diff --git a/spec/frontend/token_access/inbound_token_access_spec.js b/spec/frontend/token_access/inbound_token_access_spec.js index 7291379957d..b3d3c0b81ec 100644 --- a/spec/frontend/token_access/inbound_token_access_spec.js +++ b/spec/frontend/token_access/inbound_token_access_spec.js @@ -270,14 +270,14 @@ describe('TokenAccess component', () => { }); }); - it('adds the current project in alphabetical order', async () => { + it('adds the current project at the top of the list', async () => { await createComponent( [[getCiJobTokenScopeAllowlistQuery, ciJobTokenScopeAllowlistResponseHandler]], { isJobTokenPoliciesEnabled: true }, ); - expect(findTokenAccessTable().props('items')[0].fullPath).toBe('abc/123'); - expect(findTokenAccessTable().props('items')[1].fullPath).toBe('root/my-repo'); + expect(findTokenAccessTable().props('items')[0].fullPath).toBe('root/my-repo'); + expect(findTokenAccessTable().props('items')[1].fullPath).toBe('abc/123'); expect(findTokenAccessTable().props('items')[2].fullPath).toBe('root/your-repo'); expect(findTokenAccessTable().props('items')[3].fullPath).toBe('zed'); }); diff --git a/spec/frontend/vue_shared/components/markdown/markdown_content_spec.js b/spec/frontend/vue_shared/components/markdown/markdown_content_spec.js index dd88b4f9427..2def11d9563 100644 --- a/spec/frontend/vue_shared/components/markdown/markdown_content_spec.js +++ b/spec/frontend/vue_shared/components/markdown/markdown_content_spec.js @@ -15,7 +15,7 @@ const RENDERED_MARKDOWN = '\u003cp data-sourcepos="1:1-1:79" dir="auto"\u003eCheckout \u003ca href="http://gitlab.com"\u003eGitLab\u003c/a\u003e Hello! Welcome "\u0026gt;\u003c/p\u003e'; // HTML with v-safe-html const HTML_SAFE_RENDERED_MARKDOWN = - '\u003cp dir="auto" data-sourcepos="1:1-1:79"\u003eCheckout \u003ca href="http://gitlab.com"\u003eGitLab\u003c/a\u003e Hello! Welcome "\u0026gt;\u003c/p\u003e'; + '\u003cp data-sourcepos="1:1-1:79" dir="auto"\u003eCheckout \u003ca href="http://gitlab.com"\u003eGitLab\u003c/a\u003e Hello! Welcome "\u0026gt;\u003c/p\u003e'; describe('markdown_content.vue', () => { let wrapper; diff --git a/spec/frontend/work_items/components/shared/work_item_sidebar_dropdown_widget_spec.js b/spec/frontend/work_items/components/shared/work_item_sidebar_dropdown_widget_spec.js index 1d5d2d37867..fdbd5cc3e9e 100644 --- a/spec/frontend/work_items/components/shared/work_item_sidebar_dropdown_widget_spec.js +++ b/spec/frontend/work_items/components/shared/work_item_sidebar_dropdown_widget_spec.js @@ -228,7 +228,7 @@ describe('WorkItemSidebarDropdownWidget component', () => { it('shows tooltip with key when shortcut is provided', () => { createComponent({ canUpdate: true, shortcut }); - const expectedTooltip = 'Edit dropdown '; + const expectedTooltip = 'Edit dropdown '; expect(findEditButton().attributes('title')).toContain(expectedTooltip); }); diff --git a/spec/frontend/work_items/components/work_item_description_rendered_spec.js b/spec/frontend/work_items/components/work_item_description_rendered_spec.js index b87d50d85d5..e37a1e27897 100644 --- a/spec/frontend/work_items/components/work_item_description_rendered_spec.js +++ b/spec/frontend/work_items/components/work_item_description_rendered_spec.js @@ -164,9 +164,9 @@ describe('WorkItemDescriptionRendered', () => { describe('`disableHeadingAnchors` prop', () => { const baseAnchorHtml = - ''; + ''; const uninteractiveAnchorHtml = - ''; + ''; const baseHtml = '

This is an anchor

'; it('renders anchor links as normal when prop is `false`', () => { diff --git a/spec/frontend/work_items/components/work_item_title_spec.js b/spec/frontend/work_items/components/work_item_title_spec.js index 0a8415d3544..204511eacd5 100644 --- a/spec/frontend/work_items/components/work_item_title_spec.js +++ b/spec/frontend/work_items/components/work_item_title_spec.js @@ -8,7 +8,7 @@ describe('Work Item title', () => { const mockTitleHtml = 'Work Item title 😄'; const mockTitleHtmlResult = - '

Work Item title 😄

'; + '

Work Item title 😄

'; const mockTitleText = 'Work Item title 😄'; const createComponent = ({ isEditing = false, isModal = false } = {}) => { diff --git a/spec/lib/gitlab/import_export/safe_model_attributes.yml b/spec/lib/gitlab/import_export/safe_model_attributes.yml index 2c12e431a4b..0de163942df 100644 --- a/spec/lib/gitlab/import_export/safe_model_attributes.yml +++ b/spec/lib/gitlab/import_export/safe_model_attributes.yml @@ -386,7 +386,6 @@ Ci::Build: - options - allow_failure - stage -- trigger_request_id - stage_idx - stage_id - tag @@ -438,7 +437,6 @@ Ci::Bridge: - options - allow_failure - stage -- trigger_request_id - stage_idx - stage_id - tag @@ -490,7 +488,6 @@ GenericCommitStatus: - options - allow_failure - stage -- trigger_request_id - stage_idx - stage_id - tag diff --git a/spec/lib/gitlab/middleware/path_traversal_check_spec.rb b/spec/lib/gitlab/middleware/path_traversal_check_spec.rb index 56e7981e40e..e5dc3e99ade 100644 --- a/spec/lib/gitlab/middleware/path_traversal_check_spec.rb +++ b/spec/lib/gitlab/middleware/path_traversal_check_spec.rb @@ -62,6 +62,7 @@ RSpec.describe ::Gitlab::Middleware::PathTraversalCheck, feature_category: :shar message: described_class::PATH_TRAVERSAL_MESSAGE, fullpath: fullpath, method: method.upcase, + remote_ip: instance_of(String), request_rejected: true )).and_call_original expect(::Gitlab::Instrumentation::Middleware::PathTraversalCheck) diff --git a/spec/models/ci/processable_spec.rb b/spec/models/ci/processable_spec.rb index 4e5434bf1c1..76b6efded16 100644 --- a/spec/models/ci/processable_spec.rb +++ b/spec/models/ci/processable_spec.rb @@ -88,7 +88,7 @@ RSpec.describe Ci::Processable, feature_category: :continuous_integration do let(:ignore_accessors) do %i[type namespace lock_version target_url base_tags trace_sections commit_id deployment erased_by_id project_id project_mirror - runner_id taggings tags trigger_request_id trigger trigger_id + runner_id taggings tags trigger trigger_id user_id auto_canceled_by_id retried failure_reason sourced_pipelines sourced_pipeline artifacts_file_store artifacts_metadata_store metadata runner_manager_build runner_manager runner_session trace_chunks diff --git a/spec/requests/api/graphql/mutations/organizations/create_spec.rb b/spec/requests/api/graphql/mutations/organizations/create_spec.rb index f171eb83406..6a9368803ce 100644 --- a/spec/requests/api/graphql/mutations/organizations/create_spec.rb +++ b/spec/requests/api/graphql/mutations/organizations/create_spec.rb @@ -6,8 +6,8 @@ RSpec.describe Mutations::Organizations::Create, feature_category: :organization include GraphqlHelpers include WorkhorseHelpers - let_it_be(:user) { create(:user) } let_it_be(:organization) { create(:organization) } + let_it_be(:user) { create(:user, organizations: [organization]) } let(:mutation) { graphql_mutation(:organization_create, params) } let(:name) { 'Name' } diff --git a/spec/requests/api/graphql/organizations/organizations_query_spec.rb b/spec/requests/api/graphql/organizations/organizations_query_spec.rb index daaeaafff9a..a82c91bec56 100644 --- a/spec/requests/api/graphql/organizations/organizations_query_spec.rb +++ b/spec/requests/api/graphql/organizations/organizations_query_spec.rb @@ -5,8 +5,6 @@ require 'spec_helper' RSpec.describe 'getting organizations information', feature_category: :organization do include GraphqlHelpers - let_it_be(:user) { create(:user) } - let(:query) { graphql_query_for(:organizations, organizations_fields) } let(:organizations) { graphql_data_at(:organizations, :nodes) } let(:organizations_fields) do @@ -20,8 +18,9 @@ RSpec.describe 'getting organizations information', feature_category: :organizat end let_it_be(:private_organization) { create(:organization, :private) } - let_it_be(:public_organizations) { create_list(:organization, 3, :public) } + let_it_be(:organization) { public_organizations.first } + let_it_be(:user) { create(:user, organizations: [organization]) } subject(:request_organization) { post_graphql(query, current_user: current_user) } diff --git a/spec/rubocop/cop/database/avoid_using_connection_execute_spec.rb b/spec/rubocop/cop/database/avoid_using_connection_execute_spec.rb new file mode 100644 index 00000000000..d4179a2f41b --- /dev/null +++ b/spec/rubocop/cop/database/avoid_using_connection_execute_spec.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +require 'rubocop_spec_helper' +require_relative '../../../../rubocop/cop/database/avoid_using_connection_execute' + +RSpec.describe RuboCop::Cop::Database::AvoidUsingConnectionExecute, feature_category: :database do + it 'adds an offense when the using connection.execute' do + expect_offense(<<~RUBY) + class MyModel < ApplicationRecord + def execute + connection.execute('SELECT * FROM my_models LIMIT 1').to_a + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The `connection.execute` method always runs [...] + end + end + RUBY + end + + it 'adds no offense if only calls for execute' do + expect_no_offenses(<<~RUBY) + class MyModel < ApplicationRecord + def execute + execute('SELECT * FROM my_models LIMIT 1').to_a + end + end + RUBY + end +end diff --git a/spec/services/draft_notes/publish_service_spec.rb b/spec/services/draft_notes/publish_service_spec.rb index 32ec81d6968..2d0437cc6b6 100644 --- a/spec/services/draft_notes/publish_service_spec.rb +++ b/spec/services/draft_notes/publish_service_spec.rb @@ -144,48 +144,12 @@ RSpec.describe DraftNotes::PublishService, feature_category: :code_review_workfl expect(notes.last.note).to eq('second note') end - context 'when pub-sub event feature flag is disabled' do - before do - stub_feature_flags(notification_event_store_migration_draft_published: false) - end + it 'creates the correct pub-sub event' do + expect(::Gitlab::EventStore).to receive(:publish).with( + an_instance_of(MergeRequests::DraftNotePublishedEvent) + ).and_call_original - it 'resolves todos for the MR' do - expect(todo_service).to receive(:new_review).with(merge_request, user) - - publish - end - - it 'sends batch notification' do - expect(notification_service).to receive_message_chain(:async, :new_review).with(kind_of(Review)) - - publish - end - end - - context 'when pub-sub event feature flag is enabled' do - before do - stub_feature_flags(notification_event_store_migration_draft_published: true) - end - - it 'creates the correct pub-sub event' do - expect(::Gitlab::EventStore).to receive(:publish).with( - an_instance_of(MergeRequests::DraftNotePublishedEvent) - ).and_call_original - - publish - end - - it 'does not send batch notification' do - expect(notification_service).not_to receive(:async) - - publish - end - - it 'does not handle todos' do - expect(todo_service).not_to receive(:new_review) - - publish - end + publish end it 'tracks the publish event' do @@ -296,29 +260,11 @@ RSpec.describe DraftNotes::PublishService, feature_category: :code_review_workfl context 'with no draft notes' do let(:merge_request) { create(:merge_request) } - context 'when pub-sub event feature flag is disabled' do - before do - stub_feature_flags(notification_event_store_migration_draft_published: false) - end + it 'creates the correct pub-sub event' do + expect(::Gitlab::EventStore).to receive(:publish) + expect(MergeRequests::DraftNotePublishedEvent).to receive(:new) - it 'resolves todos for the MR' do - expect(todo_service).to receive(:new_review).with(merge_request, user) - - publish - end - end - - context 'when pub-sub event feature flag is enabled' do - before do - stub_feature_flags(notification_event_store_migration_draft_published: true) - end - - it 'creates the correct pub-sub event' do - expect(::Gitlab::EventStore).to receive(:publish) - expect(MergeRequests::DraftNotePublishedEvent).to receive(:new) - - publish - end + publish end end @@ -447,32 +393,12 @@ RSpec.describe DraftNotes::PublishService, feature_category: :code_review_workfl expect(Note.find(note.id).discussion.resolved?).to be true end - context 'when pub-sub event feature flag is enabled' do - before do - stub_feature_flags(notification_event_store_migration_draft_published: true) + it 'handles resolved discussions without sending notifications' do + expect_next_instance_of(MergeRequests::ResolvedDiscussionNotificationService) do |instance| + expect(instance).to receive(:execute).with(merge_request, send_notifications: false) end - it 'handles resolved discussions without sending notifications' do - expect_next_instance_of(MergeRequests::ResolvedDiscussionNotificationService) do |instance| - expect(instance).to receive(:execute).with(merge_request, send_notifications: false) - end - - publish - end - end - - context 'when pub-sub event feature flag is disabled' do - before do - stub_feature_flags(notification_event_store_migration_draft_published: false) - end - - it 'handles resolved discussions sending notifications' do - expect_next_instance_of(MergeRequests::ResolvedDiscussionNotificationService) do |instance| - expect(instance).to receive(:execute).with(merge_request, send_notifications: true) - end - - publish - end + publish end end diff --git a/spec/support/helpers/api_helpers.rb b/spec/support/helpers/api_helpers.rb index 7d154698107..58771f23730 100644 --- a/spec/support/helpers/api_helpers.rb +++ b/spec/support/helpers/api_helpers.rb @@ -31,8 +31,7 @@ module ApiHelpers elsif access_token query_string = "access_token=#{access_token.token}" elsif user - - organization = Organizations::Organization.first || build(:organization) + organization = user.organizations.first || FactoryBot.build(:organization) personal_access_token = if admin_mode && user.admin? create(:personal_access_token, :admin_mode, user: user, organization: organization) diff --git a/spec/support/shared_examples/features/wiki/user_views_wiki_sidebar_shared_examples.rb b/spec/support/shared_examples/features/wiki/user_views_wiki_sidebar_shared_examples.rb index 236ce16974a..426c3d70be5 100644 --- a/spec/support/shared_examples/features/wiki/user_views_wiki_sidebar_shared_examples.rb +++ b/spec/support/shared_examples/features/wiki/user_views_wiki_sidebar_shared_examples.rb @@ -127,7 +127,7 @@ RSpec.shared_examples 'User views wiki sidebar' do first_wiki_list.hover wiki_new_page_link = first(".wiki-list-create-child-button")['href'] - expect(wiki_new_page_link).to eq "#{wiki_link}/%7Bnew_page_title%7D" + expect(wiki_new_page_link).to eq "#{wiki_link}/%7Bnew_page_title%7D?view=create" end end end diff --git a/yarn.lock b/yarn.lock index 034a553914c..41be61498b5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6935,10 +6935,10 @@ domexception@^4.0.0: dependencies: webidl-conversions "^7.0.0" -dompurify@^3.0.5, dompurify@^3.2.5: - version "3.2.5" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.2.5.tgz#11b108656a5fb72b24d916df17a1421663d7129c" - integrity sha512-mLPd29uoRe9HpvwP2TxClGQBzGXeEC/we/q+bFlmPPmj2p2Ugl3r6ATu/UU1v77DXNcehiBg9zsr1dREyA/dJQ== +dompurify@^3.0.5, dompurify@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.2.6.tgz#ca040a6ad2b88e2a92dc45f38c79f84a714a1cad" + integrity sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ== optionalDependencies: "@types/trusted-types" "^2.0.7"