Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2021-01-20 12:11:06 +00:00
parent 8994750e4e
commit f2ebc27236
79 changed files with 925 additions and 208 deletions

View File

@ -173,7 +173,7 @@
/.gitlab/CODEOWNERS @gl-quality/eng-prod
Dangerfile @gl-quality/eng-prod
/danger/ @gl-quality/eng-prod
/lib/gitlab/danger/ @gl-quality/eng-prod
/tooling/danger/ @gl-quality/eng-prod
/scripts/ @gl-quality/eng-prod
/scripts/frontend/ @gl-quality/eng-prod @gitlab-org/maintainers/frontend
/scripts/review_apps/seed-dast-test-data.sh @dappelt @ngeorge1 @gl-quality/eng-prod

View File

@ -433,6 +433,8 @@ rspec:deprecations:
variables:
SETUP_DB: "false"
script:
- grep -h -R "keyword" deprecations/ | awk '{$1=$1};1' | sort | uniq -c | sort
- grep -R "keyword" deprecations/ | wc
- run_timed_command "bundle exec rubocop --only Lint/LastKeywordArgument --parallel"
artifacts:
expire_in: 31d

View File

@ -78,21 +78,7 @@ Style/AccessModifierDeclarations:
# Frozen String Literal
Style/FrozenStringLiteralComment:
Enabled: true
Exclude:
- 'config.ru'
- 'Dangerfile'
- 'Gemfile'
- 'Rakefile'
- 'app/views/**/*'
- 'config/**/*'
- 'danger/**/*'
- 'db/**/*'
- 'ee/db/**/*'
- 'ee/lib/tasks/**/*'
- 'lib/tasks/**/*'
- 'qa/**/*'
- 'rubocop/**/*'
- 'scripts/**/*'
EnforcedStyle: always_true
RSpec/FilePath:
Exclude:
@ -256,7 +242,7 @@ Gitlab/Json:
- 'scripts/**/*'
- 'lib/rspec_flaky/**/*'
- 'lib/quality/**/*'
- 'lib/gitlab/danger/**/*'
- 'tooling/danger/**/*'
Gitlab/AvoidUploadedFileFromParams:
Enabled: true

View File

@ -2721,3 +2721,315 @@ Gitlab/NamespacedClass:
- 'spec/support/sidekiq_middleware.rb'
- 'spec/tasks/gitlab/task_helpers_spec.rb'
- 'spec/uploaders/object_storage_spec.rb'
# WIP: https://gitlab.com/gitlab-org/gitlab/-/issues/299105
Style/FrozenStringLiteralComment:
Exclude:
- 'Gemfile'
- 'Rakefile'
- 'app/views/dashboard/issues.atom.builder'
- 'app/views/dashboard/projects/index.atom.builder'
- 'app/views/events/_event.atom.builder'
- 'app/views/groups/issues.atom.builder'
- 'app/views/groups/show.atom.builder'
- 'app/views/issues/_issue.atom.builder'
- 'app/views/issues/_issues_calendar.ics.ruby'
- 'app/views/layouts/xml.atom.builder'
- 'app/views/projects/commits/_commit.atom.builder'
- 'app/views/projects/commits/show.atom.builder'
- 'app/views/projects/issues/index.atom.builder'
- 'app/views/projects/show.atom.builder'
- 'app/views/projects/tags/_tag.atom.builder'
- 'app/views/projects/tags/index.atom.builder'
- 'app/views/users/show.atom.builder'
- 'bin/secpick'
- 'config.ru'
- 'config/boot.rb'
- 'config/environment.rb'
- 'config/environments/development.rb'
- 'config/environments/production.rb'
- 'config/environments/test.rb'
- 'config/initializers/01_secret_token.rb'
- 'config/initializers/0_acts_as_taggable.rb'
- 'config/initializers/0_inject_feature_flags.rb'
- 'config/initializers/0_post_deployment_migrations.rb'
- 'config/initializers/1_settings.rb'
- 'config/initializers/2_gitlab.rb'
- 'config/initializers/5_backend.rb'
- 'config/initializers/6_validations.rb'
- 'config/initializers/7_prometheus_metrics.rb'
- 'config/initializers/7_redis.rb'
- 'config/initializers/8_devise.rb'
- 'config/initializers/8_gitaly.rb'
- 'config/initializers/9_fast_gettext.rb'
- 'config/initializers/action_dispatch_http_mime_negotiation.rb'
- 'config/initializers/action_mailer_hooks.rb'
- 'config/initializers/active_record_data_types.rb'
- 'config/initializers/active_record_ping.rb'
- 'config/initializers/active_record_preloader.rb'
- 'config/initializers/active_record_schema_ignore_tables.rb'
- 'config/initializers/active_record_table_definition.rb'
- 'config/initializers/ar_speed_up_migration_checking.rb'
- 'config/initializers/asset_proxy_settings.rb'
- 'config/initializers/attr_encrypted_no_db_connection.rb'
- 'config/initializers/backtrace_silencers.rb'
- 'config/initializers/batch_loader.rb'
- 'config/initializers/bootstrap_form.rb'
- 'config/initializers/bullet.rb'
- 'config/initializers/cluster_events_before_phased_restart.rb'
- 'config/initializers/console_message.rb'
- 'config/initializers/cookies_serializer.rb'
- 'config/initializers/date_time_formats.rb'
- 'config/initializers/default_url_options.rb'
- 'config/initializers/deprecations.rb'
- 'config/initializers/direct_upload_support.rb'
- 'config/initializers/doorkeeper.rb'
- 'config/initializers/doorkeeper_openid_connect.rb'
- 'config/initializers/etag_caching.rb'
- 'config/initializers/fill_shards.rb'
- 'config/initializers/fix_local_cache_middleware.rb'
- 'config/initializers/fog_google_https_private_urls.rb'
- 'config/initializers/forbid_sidekiq_in_transactions.rb'
- 'config/initializers/gettext_rails_i18n_patch.rb'
- 'config/initializers/gitlab_kas_secret.rb'
- 'config/initializers/gitlab_shell_secret_token.rb'
- 'config/initializers/gitlab_workhorse_secret.rb'
- 'config/initializers/go_get.rb'
- 'config/initializers/grpc.rb'
- 'config/initializers/hamlit.rb'
- 'config/initializers/health_check.rb'
- 'config/initializers/http_hostname_override.rb'
- 'config/initializers/kaminari_active_record_relation_methods_with_limit.rb'
- 'config/initializers/kaminari_config.rb'
- 'config/initializers/lograge.rb'
- 'config/initializers/mail_encoding_patch.rb'
- 'config/initializers/mime_types.rb'
- 'config/initializers/mini_magick.rb'
- 'config/initializers/new_framework_defaults.rb'
- 'config/initializers/octokit.rb'
- 'config/initializers/omniauth.rb'
- 'config/initializers/peek.rb'
- 'config/initializers/postgresql_cte.rb'
- 'config/initializers/premailer.rb'
- 'config/initializers/query_limiting.rb'
- 'config/initializers/rack_lineprof.rb'
- 'config/initializers/relative_naming_ci_namespace.rb'
- 'config/initializers/request_context.rb'
- 'config/initializers/request_profiler.rb'
- 'config/initializers/routing_draw.rb'
- 'config/initializers/sentry.rb'
- 'config/initializers/server_uptime.rb'
- 'config/initializers/session_store.rb'
- 'config/initializers/sherlock.rb'
- 'config/initializers/sprockets.rb'
- 'config/initializers/static_files.rb'
- 'config/initializers/time_zone.rb'
- 'config/initializers/trusted_proxies.rb'
- 'config/initializers/warden.rb'
- 'config/initializers/workhorse_multipart.rb'
- 'config/initializers/wrap_parameters.rb'
- 'config/initializers/zz_metrics.rb'
- 'config/initializers_before_autoloader/000_inflections.rb'
- 'config/object_store_settings.rb'
- 'config/routes.rb'
- 'config/routes/admin.rb'
- 'config/routes/api.rb'
- 'config/routes/dashboard.rb'
- 'config/routes/development.rb'
- 'config/routes/explore.rb'
- 'config/routes/git_http.rb'
- 'config/routes/google_api.rb'
- 'config/routes/help.rb'
- 'config/routes/import.rb'
- 'config/routes/legacy_builds.rb'
- 'config/routes/repository.rb'
- 'config/routes/sherlock.rb'
- 'config/routes/sidekiq.rb'
- 'config/routes/snippets.rb'
- 'config/routes/uploads.rb'
- 'config/routes/wiki.rb'
- 'config/smime_signature_settings.rb'
- 'config/spring.rb'
- 'danger/changes_size/Dangerfile'
- 'danger/metadata/Dangerfile'
- 'db/migrate/20190325080727_truncate_user_fullname.rb'
- 'db/migrate/20190828110802_add_not_null_constraints_to_prometheus_metrics_y_label_and_unit.rb'
- 'db/migrate/20190828172831_create_package_tag.rb'
- 'db/migrate/20191003195218_add_pendo_enabled_to_application_settings.rb'
- 'db/migrate/20191003195620_add_pendo_url_to_application_settings.rb'
- 'db/migrate/20191120200015_add_index_to_grafana_integrations.rb'
- 'db/migrate/20200229171700_create_custom_emojis.rb'
- 'db/migrate/20201004163918_remove_project_id_and_id_index_from_vulnerabilities_table.rb'
- 'db/migrate/20201214000000_change_mr_allow_maintainer_to_push_default.rb'
- 'db/optional_migrations/composite_primary_keys.rb'
- 'db/post_migrate/20190214112022_schedule_sync_issuables_state_id.rb'
- 'db/post_migrate/20201030121314_schedule_update_existing_users_that_require_two_factor_auth.rb'
- 'ee/db/fixtures/development/20_burndown.rb'
- 'ee/db/fixtures/development/20_vulnerabilities.rb'
- 'ee/db/fixtures/development/22_epics.rb'
- 'ee/db/geo/migrate/20170206203234_create_project_registry.rb'
- 'ee/db/geo/migrate/20170223033541_create_file_registry.rb'
- 'ee/db/geo/migrate/20170302005747_add_index_to_project_id_on_project_registry.rb'
- 'ee/db/geo/migrate/20170526214010_convert_file_bytes_to_int64.rb'
- 'ee/db/geo/migrate/20170605154253_create_event_log_state.rb'
- 'ee/db/geo/migrate/20170606155045_add_needs_resync_to_project_registry.rb'
- 'ee/db/geo/migrate/20170614201943_add_last_wiki_synced_at_to_project_registry.rb'
- 'ee/db/geo/migrate/20170627195211_add_index_to_project_registry.rb'
- 'ee/db/geo/migrate/20170906174622_remove_duplicates_from_project_registry.rb'
- 'ee/db/geo/migrate/20170906182752_add_unique_index_to_project_id_on_project_registry.rb'
- 'ee/db/geo/migrate/20171005045404_remove_file_uploads_from_registry.rb'
- 'ee/db/geo/migrate/20171009162208_add_file_registry_success.rb'
- 'ee/db/geo/migrate/20171009162209_add_file_registry_success_index.rb'
- 'ee/db/geo/migrate/20171101105200_add_retry_count_fields_to_registries.rb'
- 'ee/db/geo/migrate/20171115143841_add_last_sync_failure_to_project_registry.rb'
- 'ee/db/geo/migrate/20180201154345_add_repository_verification_to_project_registry.rb'
- 'ee/db/geo/migrate/20180314175612_add_partial_index_to_project_registy_verification_failure_columns.rb'
- 'ee/db/geo/migrate/20180315222132_add_partial_index_to_project_registy_checksum_columns.rb'
- 'ee/db/geo/migrate/20180321144947_change_repository_verification_checksum_to_sha.rb'
- 'ee/db/geo/migrate/20180322062741_migrate_ci_job_artifacts_to_separate_registry.rb'
- 'ee/db/geo/migrate/20180323182105_add_missing_on_primary_to_file_registry.rb'
- 'ee/db/geo/migrate/20180327071612_add_partial_index_to_project_registy_checksum_sha_columns.rb'
- 'ee/db/geo/migrate/20180402170913_add_missing_on_primary_to_job_artifact_registry..rb'
- 'ee/db/geo/migrate/20180405074130_add_partial_index_project_repository_verification.rb'
- 'ee/db/geo/migrate/20180412213305_add_index_to_artifact_id_on_job_artifact_registry.rb'
- 'ee/db/geo/migrate/20180419174834_add_checksum_mismatch_fields_to_project_registry.rb'
- 'ee/db/geo/migrate/20180419192603_add_indexes_to_checksum_mismatch_fields_on_project_registry.rb'
- 'ee/db/geo/migrate/20180427114641_add_repository_check_to_geo_project_registry.rb'
- 'ee/db/geo/migrate/20180510223634_set_resync_flag_for_retried_projects.rb'
- 'ee/db/geo/migrate/20180613184349_add_resync_was_scheduled_at_to_project_registry.rb'
- 'ee/db/geo/post_migrate/20180320011914_remove_last_verification_failed_columns_from_geo_project_registry.rb'
- 'ee/db/geo/post_migrate/20180320013929_remove_last_verification_at_columns_from_geo_project_registry.rb'
- 'ee/db/geo/post_migrate/20180326171626_remove_old_repository_verification_checksum_from_geo_project_registry.rb'
- 'ee/db/geo/post_migrate/20180331055706_delete_job_artifacts_from_file_registry.rb'
- 'ee/lib/tasks/geo.rake'
- 'ee/lib/tasks/geo/git.rake'
- 'ee/lib/tasks/geo/replication.rake'
- 'ee/lib/tasks/gitlab/db.rake'
- 'ee/lib/tasks/gitlab/elastic.rake'
- 'ee/lib/tasks/gitlab/elastic/test.rake'
- 'ee/lib/tasks/gitlab/geo.rake'
- 'ee/lib/tasks/gitlab/indexer.rake'
- 'ee/lib/tasks/gitlab/ldap.rake'
- 'ee/lib/tasks/gitlab/seed/insights.rake'
- 'ee/lib/tasks/gitlab/seed/metrics.rake'
- 'ee/lib/tasks/migrate/ldap.rake'
- 'lib/tasks/brakeman.rake'
- 'lib/tasks/cache.rake'
- 'lib/tasks/ci/cleanup.rake'
- 'lib/tasks/cleanup.rake'
- 'lib/tasks/config_lint.rake'
- 'lib/tasks/db_obsolete_ignored_columns.rake'
- 'lib/tasks/dev.rake'
- 'lib/tasks/downtime_check.rake'
- 'lib/tasks/eslint.rake'
- 'lib/tasks/file_hooks.rake'
- 'lib/tasks/frontend.rake'
- 'lib/tasks/gemojione.rake'
- 'lib/tasks/gitlab/artifacts/check.rake'
- 'lib/tasks/gitlab/artifacts/migrate.rake'
- 'lib/tasks/gitlab/backup.rake'
- 'lib/tasks/gitlab/bulk_add_permission.rake'
- 'lib/tasks/gitlab/check.rake'
- 'lib/tasks/gitlab/container_registry.rake'
- 'lib/tasks/gitlab/db.rake'
- 'lib/tasks/gitlab/doctor/secrets.rake'
- 'lib/tasks/gitlab/exclusive_lease.rake'
- 'lib/tasks/gitlab/external_diffs.rake'
- 'lib/tasks/gitlab/features.rake'
- 'lib/tasks/gitlab/generate_sample_prometheus_data.rake'
- 'lib/tasks/gitlab/git.rake'
- 'lib/tasks/gitlab/gitaly.rake'
- 'lib/tasks/gitlab/helpers.rake'
- 'lib/tasks/gitlab/import.rake'
- 'lib/tasks/gitlab/import_export.rake'
- 'lib/tasks/gitlab/info.rake'
- 'lib/tasks/gitlab/ldap.rake'
- 'lib/tasks/gitlab/lfs/check.rake'
- 'lib/tasks/gitlab/lfs/migrate.rake'
- 'lib/tasks/gitlab/list_repos.rake'
- 'lib/tasks/gitlab/packages/events.rake'
- 'lib/tasks/gitlab/packages/migrate.rake'
- 'lib/tasks/gitlab/pages.rake'
- 'lib/tasks/gitlab/praefect.rake'
- 'lib/tasks/gitlab/seed.rake'
- 'lib/tasks/gitlab/setup.rake'
- 'lib/tasks/gitlab/shell.rake'
- 'lib/tasks/gitlab/storage.rake'
- 'lib/tasks/gitlab/tcp_check.rake'
- 'lib/tasks/gitlab/test.rake'
- 'lib/tasks/gitlab/two_factor.rake'
- 'lib/tasks/gitlab/update_templates.rake'
- 'lib/tasks/gitlab/uploads/check.rake'
- 'lib/tasks/gitlab/uploads/migrate.rake'
- 'lib/tasks/gitlab/uploads/sanitize.rake'
- 'lib/tasks/gitlab/usage_data.rake'
- 'lib/tasks/gitlab/user_management.rake'
- 'lib/tasks/gitlab/web_hook.rake'
- 'lib/tasks/gitlab/workhorse.rake'
- 'lib/tasks/gitlab/x509/update.rake'
- 'lib/tasks/gitlab_danger.rake'
- 'lib/tasks/grape.rake'
- 'lib/tasks/haml-lint.rake'
- 'lib/tasks/import.rake'
- 'lib/tasks/karma.rake'
- 'lib/tasks/lint.rake'
- 'lib/tasks/migrate/composite_primary_keys.rake'
- 'lib/tasks/migrate/migrate_iids.rake'
- 'lib/tasks/migrate/setup_postgresql.rake'
- 'lib/tasks/pngquant.rake'
- 'lib/tasks/rubocop.rake'
- 'lib/tasks/scss-lint.rake'
- 'lib/tasks/setup.rake'
- 'lib/tasks/test.rake'
- 'lib/tasks/tokens.rake'
- 'qa/Gemfile'
- 'qa/Rakefile'
- 'qa/bin/qa'
- 'qa/bin/rubymine'
- 'qa/qa/fixtures/auto_devops_rack/Gemfile'
- 'qa/qa/fixtures/auto_devops_rack/Rakefile'
- 'qa/qa/fixtures/auto_devops_rack/config.ru'
- 'qa/qa/page/page_concern.rb'
- 'rubocop/cop/avoid_keyword_arguments_in_sidekiq_workers.rb'
- 'rubocop/cop/gitlab/finder_with_find_by.rb'
- 'rubocop/cop/gitlab/keys-first-and-values-first.rb'
- 'rubocop/cop/gitlab/module_with_instance_variables.rb'
- 'rubocop/cop/gitlab/predicate_memoization.rb'
- 'rubocop/cop/migration/add_concurrent_foreign_key.rb'
- 'rubocop/cop/migration/add_concurrent_index.rb'
- 'rubocop/cop/migration/add_index.rb'
- 'rubocop/cop/migration/add_timestamps.rb'
- 'rubocop/cop/migration/datetime.rb'
- 'rubocop/cop/migration/hash_index.rb'
- 'rubocop/cop/migration/remove_column.rb'
- 'rubocop/cop/migration/remove_concurrent_index.rb'
- 'rubocop/cop/migration/remove_index.rb'
- 'rubocop/cop/migration/safer_boolean_column.rb'
- 'rubocop/cop/migration/timestamps.rb'
- 'rubocop/cop/migration/update_column_in_batches.rb'
- 'rubocop/cop/project_path_helper.rb'
- 'rubocop/migration_helpers.rb'
- 'rubocop/qa_helpers.rb'
- 'scripts/flaky_examples/detect-new-flaky-examples'
- 'scripts/flaky_examples/prune-old-flaky-examples'
- 'scripts/gather-test-memory-data'
- 'scripts/generate-gems-memory-metrics-static'
- 'scripts/generate-gems-size-metrics-static'
- 'scripts/generate-memory-metrics-on-boot'
- 'scripts/generate-test-mapping'
- 'scripts/gitaly-test-build'
- 'scripts/gitaly-test-spawn'
- 'scripts/gitaly_test.rb'
- 'scripts/insert-rspec-profiling-data'
- 'scripts/lint-rugged'
- 'scripts/merge-html-reports'
- 'scripts/merge-reports'
- 'scripts/merge-simplecov'
- 'scripts/no-ee-check'
- 'scripts/pack-test-mapping'
- 'scripts/static-analysis'
- 'scripts/sync-reports'
- 'scripts/unpack-test-mapping'
- 'scripts/update-feature-categories'
- 'scripts/used-feature-flags'
- 'scripts/verify-tff-mapping'

View File

@ -141,7 +141,7 @@ Lint/BinaryOperatorWithIdenticalOperands:
- 'ee/spec/lib/ee/gitlab/application_context_spec.rb'
- 'spec/helpers/visibility_level_helper_spec.rb'
- 'spec/lib/gitlab/conan_token_spec.rb'
- 'spec/lib/gitlab/danger/sidekiq_queues_spec.rb'
- 'spec/tooling/danger/sidekiq_queues_spec.rb'
- 'spec/lib/gitlab/git/conflict/parser_spec.rb'
- 'spec/lib/gitlab/graphql/lazy_spec.rb'
- 'spec/models/ci/build_trace_chunk_spec.rb'
@ -185,8 +185,8 @@ Lint/EmptyFile:
# Cop supports --auto-correct.
Lint/IdentityComparison:
Exclude:
- 'spec/lib/gitlab/danger/weightage/maintainers_spec.rb'
- 'spec/lib/gitlab/danger/weightage/reviewers_spec.rb'
- 'spec/tooling/danger/weightage/maintainers_spec.rb'
- 'spec/tooling/danger/weightage/reviewers_spec.rb'
# Offense count: 184
# Configuration parameters: MaximumRangeSize.
@ -263,7 +263,7 @@ Metrics/CyclomaticComplexity:
- 'lib/banzai/filter/abstract_reference_filter.rb'
- 'lib/declarative_policy/runner.rb'
- 'lib/gitlab/conflict/file.rb'
- 'lib/gitlab/danger/roulette.rb'
- 'tooling/danger/roulette.rb'
- 'lib/gitlab/diff/parser.rb'
- 'lib/gitlab/rack_attack.rb'
- 'lib/gitlab/sidekiq_cluster/cli.rb'
@ -285,7 +285,7 @@ Metrics/PerceivedComplexity:
- 'lib/banzai/renderer.rb'
- 'lib/declarative_policy/runner.rb'
- 'lib/gitlab/conflict/file.rb'
- 'lib/gitlab/danger/roulette.rb'
- 'tooling/danger/roulette.rb'
- 'lib/gitlab/rack_attack.rb'
- 'lib/gitlab/sidekiq_cluster/cli.rb'
- 'lib/gitlab/utils/merge_hash.rb'
@ -629,7 +629,7 @@ Rails/IndexBy:
- 'ee/lib/gitlab/analytics/type_of_work/tasks_by_type.rb'
- 'ee/lib/gitlab/elastic/document_reference.rb'
- 'ee/lib/gitlab/group_plans_preloader.rb'
- 'lib/gitlab/danger/sidekiq_queues.rb'
- 'tooling/danger/sidekiq_queues.rb'
- 'lib/gitlab/database/count/reltuples_count_strategy.rb'
- 'lib/gitlab/language_detection.rb'

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true
require_relative 'lib/gitlab_danger'
require_relative 'lib/gitlab/danger/request_helper'
require_relative 'tooling/gitlab_danger'
require_relative 'tooling/danger/request_helper'
danger.import_plugin('danger/plugins/helper.rb')
danger.import_plugin('danger/plugins/roulette.rb')

View File

@ -1,5 +1,6 @@
import Vue from 'vue';
import Translate from '~/vue_shared/translate';
import { parseBoolean } from '~/lib/utils/common_utils';
import SettingsApp from './components/group_settings_app.vue';
import { apolloProvider } from './graphql';
@ -13,6 +14,10 @@ export default () => {
return new Vue({
el,
apolloProvider,
provide: {
defaultExpanded: parseBoolean(el.dataset.defaultExpanded),
groupPath: el.dataset.groupPath,
},
render(createElement) {
return createElement(SettingsApp);
},

View File

@ -1,9 +1,75 @@
<script>
import { GlSprintf, GlLink } from '@gitlab/ui';
import SettingsBlock from '~/vue_shared/components/settings/settings_block.vue';
import {
PACKAGE_SETTINGS_HEADER,
PACKAGE_SETTINGS_DESCRIPTION,
PACKAGES_DOCS_PATH,
} from '../constants';
import getGroupPackagesSettingsQuery from '../graphql/queries/get_group_packages_settings.query.graphql';
export default {
name: 'GroupSettingsApp',
i18n: {
PACKAGE_SETTINGS_HEADER,
PACKAGE_SETTINGS_DESCRIPTION,
},
links: {
PACKAGES_DOCS_PATH,
},
components: {
GlSprintf,
GlLink,
SettingsBlock,
},
inject: {
defaultExpanded: {
type: Boolean,
default: false,
required: true,
},
groupPath: {
type: String,
required: true,
},
},
apollo: {
packageSettings: {
query: getGroupPackagesSettingsQuery,
variables() {
return {
fullPath: this.groupPath,
};
},
update(data) {
return data.group?.packageSettings;
},
},
},
data() {
return {
packageSettings: {},
};
},
};
</script>
<template>
<section></section>
<div>
<settings-block :default-expanded="defaultExpanded">
<template #title> {{ $options.i18n.PACKAGE_SETTINGS_HEADER }}</template>
<template #description>
<span data-testid="description">
<gl-sprintf :message="$options.i18n.PACKAGE_SETTINGS_DESCRIPTION">
<template #link="{ content }">
<gl-link :href="$options.links.PACKAGES_DOCS_PATH" target="_blank">{{
content
}}</gl-link>
</template>
</gl-sprintf>
</span>
</template>
</settings-block>
</div>
</template>

View File

@ -0,0 +1,9 @@
import { s__ } from '~/locale';
import { helpPagePath } from '~/helpers/help_page_helper';
export const PACKAGE_SETTINGS_HEADER = s__('PackageRegistry|Package Registry');
export const PACKAGE_SETTINGS_DESCRIPTION = s__(
'PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}',
);
export const PACKAGES_DOCS_PATH = helpPagePath('user/packages');

View File

@ -0,0 +1,9 @@
mutation updateNamespacePackageSettings($input: UpdateNamespacePackageSettingsInput!) {
updateNamespacePackageSettings(input: $input) {
packageSettings {
mavenDuplicatesAllowed
mavenDuplicateExceptionRegex
}
errors
}
}

View File

@ -0,0 +1,8 @@
query getGroupPackagesSettings($fullPath: ID!) {
group(fullPath: $fullPath) {
packageSettings {
mavenDuplicatesAllowed
mavenDuplicateExceptionRegex
}
}
}

View File

@ -0,0 +1,45 @@
<script>
import { GlButton } from '@gitlab/ui';
import { __ } from '~/locale';
export default {
components: { GlButton },
props: {
defaultExpanded: {
type: Boolean,
default: false,
required: false,
},
},
data() {
return {
sectionExpanded: false,
};
},
computed: {
expanded() {
return this.defaultExpanded || this.sectionExpanded;
},
toggleText() {
return this.expanded ? __('Collapse') : __('Expand');
},
},
};
</script>
<template>
<section class="settings no-animate" :class="{ expanded }">
<div class="settings-header">
<h4><slot name="title"></slot></h4>
<gl-button @click="sectionExpanded = !sectionExpanded">
{{ toggleText }}
</gl-button>
<p>
<slot name="description"></slot>
</p>
</div>
<div class="settings-content">
<slot></slot>
</div>
</section>
</template>

View File

@ -2,4 +2,4 @@
- page_title _('Packages & Registries')
- @content_class = 'limit-container-width' unless fluid_layout
%section#js-packages-and-registries-settings
%section#js-packages-and-registries-settings{ data: { default_expanded: expanded_by_default?.to_s, group_path: @group.path } }

View File

@ -7,6 +7,8 @@ class MergeRequestCleanupRefsWorker
idempotent!
def perform(merge_request_id)
return unless Feature.enabled?(:merge_request_refs_cleanup, default_enabled: false)
merge_request = MergeRequest.find_by_id(merge_request_id)
unless merge_request

View File

@ -16,6 +16,7 @@ class ScheduleMergeRequestCleanupRefsWorker
def perform
return if Gitlab::Database.read_only?
return unless Feature.enabled?(:merge_request_refs_cleanup, default_enabled: false)
ids = MergeRequest::CleanupSchedule.scheduled_merge_request_ids(LIMIT).map { |id| [id] }

View File

@ -0,0 +1,5 @@
---
title: Apply GitLab UI button styles to button _blank_state_ee_trial
merge_request: 51778
author: Yogi (@yo)
type: other

View File

@ -1,5 +1,5 @@
---
name: api_json_content_type
name: api_always_use_application_json
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/42229
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/270067
milestone: '13.6'

View File

@ -0,0 +1,8 @@
---
name: merge_request_refs_cleanup
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51558
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/296874
milestone: '13.8'
type: development
group: group::code review
default_enabled: false

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true
require_relative File.expand_path('../../lib/gitlab/danger/commit_linter', __dir__)
require_relative File.expand_path('../../lib/gitlab/danger/merge_request_linter', __dir__)
require_relative File.expand_path('../../tooling/danger/commit_linter', __dir__)
require_relative File.expand_path('../../tooling/danger/merge_request_linter', __dir__)
COMMIT_MESSAGE_GUIDELINES = "https://docs.gitlab.com/ee/development/contributing/merge_request_workflow.html#commit-messages-guidelines"
MORE_INFO = "For more information, take a look at our [Commit message guidelines](#{COMMIT_MESSAGE_GUIDELINES})."
@ -54,7 +54,7 @@ end
# https://github.com/jonallured/danger-commit_lint because its output is not
# very helpful, and it doesn't offer the means of ignoring merge commits.
def lint_commit(commit)
linter = Gitlab::Danger::CommitLinter.new(commit)
linter = Tooling::Danger::CommitLinter.new(commit)
# For now we'll ignore merge commits, as getting rid of those is a problem
# separate from enforcing good commit messages.
@ -93,7 +93,7 @@ end
def lint_mr_title(mr_title)
commit = Struct.new(:message, :sha).new(mr_title)
Gitlab::Danger::MergeRequestLinter.new(commit).lint
Tooling::Danger::MergeRequestLinter.new(commit).lint
end
def count_non_fixup_commits(commit_linters)

View File

@ -1,47 +0,0 @@
# frozen_string_literal: true
FILE_EXTENSION = ".rb"
FROZEN_STRING_MAGIC_COMMENT = "# frozen_string_literal: true"
SHEBANG_COMMENT = "#!"
def get_files_with_no_magic_comment(files)
files.select do |path|
path.end_with?(FILE_EXTENSION) &&
!file_has_frozen_string_magic_comment?(path)
end
end
def file_has_frozen_string_magic_comment?(path)
File.open(path) do |file|
first_line = file.gets
line_has_frozen_string_magic_comment?(first_line) ||
(line_has_shebang?(first_line) &&
line_has_frozen_string_magic_comment?(file.gets))
end
end
def line_has_frozen_string_magic_comment?(line)
line&.start_with?(FROZEN_STRING_MAGIC_COMMENT)
end
def line_has_shebang?(line)
line&.start_with?(SHEBANG_COMMENT)
end
files_to_fix = get_files_with_no_magic_comment(git.added_files)
if files_to_fix.any?
warn 'This merge request adds files that do not enforce frozen string literal. ' \
'See https://gitlab.com/gitlab-org/gitlab-foss/issues/47424 for more information.'
if GitlabDanger.new(helper.gitlab_helper).ci?
markdown(<<~MARKDOWN)
## Enable Frozen String Literal
The following files should have `#{FROZEN_STRING_MAGIC_COMMENT}` on the first line:
* #{files_to_fix.map { |path| "`#{path}`" }.join("\n* ")}
MARKDOWN
end
end

View File

@ -1,10 +1,10 @@
# frozen_string_literal: true
require_relative '../../lib/gitlab/danger/changelog'
require_relative '../../tooling/danger/changelog'
module Danger
class Changelog < Plugin
# Put the helper code somewhere it can be tested
include Gitlab::Danger::Changelog
include Tooling::Danger::Changelog
end
end

View File

@ -1,12 +1,12 @@
# frozen_string_literal: true
require_relative '../../lib/gitlab/danger/helper'
require_relative '../../tooling/danger/helper'
module Danger
# Common helper functions for our danger scripts. See Gitlab::Danger::Helper
# Common helper functions for our danger scripts. See Tooling::Danger::Helper
# for more details
class Helper < Plugin
# Put the helper code somewhere it can be tested
include Gitlab::Danger::Helper
include Tooling::Danger::Helper
end
end

View File

@ -1,10 +1,10 @@
# frozen_string_literal: true
require_relative '../../lib/gitlab/danger/roulette'
require_relative '../../tooling/danger/roulette'
module Danger
class Roulette < Plugin
# Put the helper code somewhere it can be tested
include Gitlab::Danger::Roulette
include Tooling::Danger::Roulette
end
end

View File

@ -1,10 +1,10 @@
# frozen_string_literal: true
require_relative '../../lib/gitlab/danger/sidekiq_queues'
require_relative '../../tooling/danger/sidekiq_queues'
module Danger
class SidekiqQueues < Plugin
# Put the helper code somewhere it can be tested
include Gitlab::Danger::SidekiqQueues
include Tooling::Danger::SidekiqQueues
end
end

View File

@ -22,10 +22,13 @@ tracking_files = [
'app/helpers/tracking_helper.rb',
'spec/helpers/tracking_helper_spec.rb',
'app/assets/javascripts/tracking.js',
'spec/frontend/tracking_spec.js'
'spec/frontend/tracking_spec.js',
'generator_templates/usage_metric_definition/metric_definition.yml',
'lib/generators/rails/usage_metric_definition_generator.rb',
'spec/lib/generators/usage_metric_definition_generator_spec.rb'
]
usage_data_changed_files = helper.changed_files(/usage_data/)
usage_data_changed_files = helper.changed_files(%r{(usage_data)|(config/metrics)|(ee/config/metrics)})
snowplow_events_changed_files = git.modified_files & tracking_files
changed_files = (usage_data_changed_files + snowplow_events_changed_files)

View File

@ -35,7 +35,7 @@ UNKNOWN_FILES_MESSAGE = <<MARKDOWN
These files couldn't be categorised, so Danger was unable to suggest a reviewer.
Please consider creating a merge request to
[add support](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/danger/helper.rb)
[add support](https://gitlab.com/gitlab-org/gitlab/blob/master/tooling/danger/helper.rb)
for them.
MARKDOWN

View File

@ -105,9 +105,9 @@ minimize the number of lines of code in `danger/`. A non-trivial `Dangerfile`
should mostly call plugin code with arguments derived from the methods provided
by Danger. The plugin code itself should have unit tests.
At present, we do this by putting the code in a module in `lib/gitlab/danger/...`,
At present, we do this by putting the code in a module in `tooling/danger/...`,
and including it in the matching `danger/plugins/...` file. Specs can then be
added in `spec/lib/gitlab/danger/...`.
added in `spec/tooling/danger/...`.
To determine if your `Dangerfile` works, push the branch that contains it to
GitLab. This can be quite frustrating, as it significantly increases the cycle

View File

@ -123,13 +123,32 @@ module API
format :json
formatter :json, Gitlab::Json::GrapeFormatter
content_type :json, 'application/json'
# Remove the `text/plain+deprecated` with `api_always_use_application_json` feature flag
# There is a small chance some users depend on the old behavior.
# We this change under a feature flag to see if affects GitLab.com users.
if Gitlab::Database.cached_table_exists?('features') && Feature.enabled?(:api_json_content_type)
content_type :json, 'application/json'
else
content_type :txt, 'text/plain'
# The `+deprecated` is added to distinguish content type
# as defined by `API::API` vs ex. `API::Repositories`
content_type :txt, 'text/plain+deprecated'
before do
# the feature flag workaround is only for `.txt`
api_format = env[Grape::Env::API_FORMAT]
next unless api_format == :txt
# get all defined content-types for the endpoint
api_endpoint = env[Grape::Env::API_ENDPOINT]
content_types = api_endpoint&.namespace_stackable_with_hash(:content_types).to_h
# Only overwrite `text/plain+deprecated`
if content_types[api_format] == 'text/plain+deprecated'
if Feature.enabled?(:api_always_use_application_json)
content_type 'application/json'
else
content_type 'text/plain'
end
end
end
# Ensure the namespace is right, otherwise we might load Grape::API::Helpers

View File

@ -72,6 +72,7 @@ module API
namespace 'users' do
format :txt
content_type :txt, 'text/plain'
desc 'Authenticate user against conan CLI' do
detail 'This feature was introduced in GitLab 12.2'

View File

@ -32,6 +32,7 @@ module API
helpers ::API::Helpers::Packages::BasicAuthHelpers
format :txt
content_type :txt, 'text/plain'
rescue_from ArgumentError do |e|
render_api_error!(e.message, 400)

View File

@ -82,7 +82,8 @@ module API
content_type 'text/plain'
env['api.format'] = :binary
trace = build.trace.raw
# The trace can be nil bu body method expects a string as an argument.
trace = build.trace.raw || ''
body trace
end

View File

@ -1,6 +1,6 @@
desc 'Run local Danger rules'
task :danger_local do
require 'gitlab_danger'
require_relative '../../tooling/gitlab_danger'
require 'gitlab/popen'
puts("#{GitlabDanger.local_warning_message}\n")

View File

@ -20304,6 +20304,9 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
msgstr ""
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""

View File

@ -13,7 +13,7 @@ module QA
issue.visit!
end
it 'collapses and expands reply for comments in an issue', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/434' do
it 'collapses and expands reply for comments in an issue', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1163' do
Page::Project::Issue::Show.perform do |show|
show.select_all_activities_filter
show.start_discussion('My first discussion')

View File

@ -9,7 +9,7 @@ module QA
Flow::Login.sign_in
end
it 'creates an issue', :reliable, testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/432' do
it 'creates an issue', :reliable, testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1167' do
issue = Resource::Issue.fabricate_via_browser_ui!
Page::Project::Menu.perform(&:click_issues)

View File

@ -13,7 +13,7 @@ module QA
end.project.visit!
end
it 'shows issue suggestions when creating a new issue', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/412' do
it 'shows issue suggestions when creating a new issue', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1175' do
Page::Project::Show.perform(&:go_to_new_issue)
Page::Project::Issue::New.perform do |new_page|
new_page.fill_title("issue")

View File

@ -21,7 +21,7 @@ module QA
end.visit!
end
it 'mentions another user in an issue', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/446' do
it 'mentions another user in an issue', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1166' do
Page::Project::Issue::Show.perform do |show|
at_username = "@#{user.username}"

View File

@ -13,7 +13,7 @@ module QA
Flow::Login.sign_in
end
it 'focuses on issue board', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/820' do
it 'focuses on issue board', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1176' do
project.visit!
Page::Project::Menu.perform(&:go_to_boards)

View File

@ -14,7 +14,7 @@ module QA
Flow::Login.sign_in
end
it 'creates a project milestone', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/901' do
it 'creates a project milestone', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1165' do
project_milestone = Resource::ProjectMilestone.fabricate_via_browser_ui! do |milestone|
milestone.title = title
milestone.description = description

View File

@ -25,7 +25,7 @@ module QA
Flow::Login.sign_in
end
it 'relates and unrelates one issue to/from another', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/541' do
it 'relates and unrelates one issue to/from another', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1172' do
issue_1.visit!
Page::Project::Issue::Show.perform do |show|

View File

@ -25,7 +25,7 @@ module QA
runner.remove_via_api!
end
it 'parent pipelines passes if child passes', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/754' do
it 'parent pipelines passes if child passes', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1161' do
add_ci_files(success_child_ci_file)
Flow::Pipeline.visit_latest_pipeline(pipeline_condition: 'completed')
@ -35,7 +35,7 @@ module QA
end
end
it 'parent pipeline passes even if child fails', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/753' do
it 'parent pipeline passes even if child fails', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1162' do
add_ci_files(fail_child_ci_file)
Flow::Pipeline.visit_latest_pipeline(pipeline_condition: 'completed')

View File

@ -6,7 +6,8 @@ export BUNDLE_INSTALL_FLAGS=${BUNDLE_INSTALL_FLAGS:-"--without=production develo
if [ "$USE_BUNDLE_INSTALL" != "false" ]; then
bundle --version
run_timed_command "bundle install --clean ${BUNDLE_INSTALL_FLAGS}"
bundle config set clean 'true'
run_timed_command "bundle install ${BUNDLE_INSTALL_FLAGS}"
run_timed_command "bundle check"
# When we test multiple versions of PG in the same pipeline, we have a single `setup-test-env`
# job but the `pg` gem needs to be rebuilt since it includes extensions (https://guides.rubygems.org/gems-with-extensions).

View File

@ -47,6 +47,13 @@ RSpec.describe 'Group Packages & Registries settings' do
sidebar = find('.nav-sidebar')
expect(sidebar).to have_link _('Packages & Registries')
end
it 'has a Package Registry section', :js do
visit_settings_page
expect(page).to have_content('Package Registry')
expect(page).to have_button('Collapse')
end
end
def find_settings_menu

View File

@ -0,0 +1,99 @@
import { shallowMount, createLocalVue } from '@vue/test-utils';
import { GlSprintf, GlLink } from '@gitlab/ui';
import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
import component from '~/packages_and_registries/settings/group/components/group_settings_app.vue';
import SettingsBlock from '~/vue_shared/components/settings/settings_block.vue';
import {
PACKAGE_SETTINGS_HEADER,
PACKAGE_SETTINGS_DESCRIPTION,
PACKAGES_DOCS_PATH,
} from '~/packages_and_registries/settings/group/constants';
import getGroupPackagesSettingsQuery from '~/packages_and_registries/settings/group/graphql/queries/get_group_packages_settings.query.graphql';
import { groupPackageSettingsMock } from '../mock_data';
const localVue = createLocalVue();
describe('Group Settings App', () => {
let wrapper;
let apolloProvider;
const defaultProvide = {
defaultExpanded: false,
groupPath: 'foo_group_path',
};
const mountComponent = ({
provide = defaultProvide,
resolver = jest.fn().mockResolvedValue(groupPackageSettingsMock),
} = {}) => {
localVue.use(VueApollo);
const requestHandlers = [[getGroupPackagesSettingsQuery, resolver]];
apolloProvider = createMockApollo(requestHandlers);
wrapper = shallowMount(component, {
localVue,
apolloProvider,
provide,
stubs: {
GlSprintf,
SettingsBlock,
},
});
};
afterEach(() => {
wrapper.destroy();
wrapper = null;
});
const findSettingsBlock = () => wrapper.find(SettingsBlock);
const findDescription = () => wrapper.find('[data-testid="description"');
const findLink = () => wrapper.find(GlLink);
it('renders a settings block', () => {
mountComponent();
expect(findSettingsBlock().exists()).toBe(true);
});
it('passes the correct props to settings block', () => {
mountComponent();
expect(findSettingsBlock().props('defaultExpanded')).toBe(false);
});
it('has the correct header text', () => {
mountComponent();
expect(wrapper.text()).toContain(PACKAGE_SETTINGS_HEADER);
});
it('has the correct description text', () => {
mountComponent();
expect(findDescription().text()).toMatchInterpolatedText(PACKAGE_SETTINGS_DESCRIPTION);
});
it('has the correct link', () => {
mountComponent();
expect(findLink().attributes()).toMatchObject({
href: PACKAGES_DOCS_PATH,
target: '_blank',
});
expect(findLink().text()).toBe('More Information');
});
it('calls the graphql API with the proper variables', () => {
const resolver = jest.fn().mockResolvedValue(groupPackageSettingsMock);
mountComponent({ resolver });
expect(resolver).toHaveBeenCalledWith({
fullPath: defaultProvide.groupPath,
});
});
});

View File

@ -0,0 +1,12 @@
export const groupPackageSettingsMock = {
data: {
group: {
packageSettings: {
mavenDuplicatesAllowed: true,
mavenDuplicateExceptionRegex: '',
__typename: 'PackageSettings',
},
__typename: 'Group',
},
},
};

View File

@ -0,0 +1,43 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`Settings Block renders the correct markup 1`] = `
<section
class="settings no-animate"
>
<div
class="settings-header"
>
<h4>
<div
data-testid="title-slot"
/>
</h4>
<gl-button-stub
buttontextclasses=""
category="primary"
icon=""
size="medium"
variant="default"
>
Expand
</gl-button-stub>
<p>
<div
data-testid="description-slot"
/>
</p>
</div>
<div
class="settings-content"
>
<div
data-testid="default-slot"
/>
</div>
</section>
`;

View File

@ -0,0 +1,86 @@
import { shallowMount } from '@vue/test-utils';
import { GlButton } from '@gitlab/ui';
import component from '~/vue_shared/components/settings/settings_block.vue';
describe('Settings Block', () => {
let wrapper;
const mountComponent = (propsData) => {
wrapper = shallowMount(component, {
propsData,
slots: {
title: '<div data-testid="title-slot"></div>',
description: '<div data-testid="description-slot"></div>',
default: '<div data-testid="default-slot"></div>',
},
});
};
afterEach(() => {
wrapper.destroy();
wrapper = null;
});
const findDefaultSlot = () => wrapper.find('[data-testid="default-slot"]');
const findTitleSlot = () => wrapper.find('[data-testid="title-slot"]');
const findDescriptionSlot = () => wrapper.find('[data-testid="description-slot"]');
const findExpandButton = () => wrapper.find(GlButton);
it('renders the correct markup', () => {
mountComponent();
expect(wrapper.element).toMatchSnapshot();
});
it('has a default slot', () => {
mountComponent();
expect(findDefaultSlot().exists()).toBe(true);
});
it('has a title slot', () => {
mountComponent();
expect(findTitleSlot().exists()).toBe(true);
});
it('has a description slot', () => {
mountComponent();
expect(findDescriptionSlot().exists()).toBe(true);
});
describe('expanded behaviour', () => {
it('is collapsed by default', () => {
mountComponent();
expect(wrapper.classes('expanded')).toBe(false);
});
it('adds expanded class when the expand button is clicked', async () => {
mountComponent();
expect(wrapper.classes('expanded')).toBe(false);
expect(findExpandButton().text()).toBe('Expand');
await findExpandButton().vm.$emit('click');
expect(wrapper.classes('expanded')).toBe(true);
expect(findExpandButton().text()).toBe('Collapse');
});
it('is expanded when `defaultExpanded` is true no matter what', async () => {
mountComponent({ defaultExpanded: true });
expect(wrapper.classes('expanded')).toBe(true);
await findExpandButton().vm.$emit('click');
expect(wrapper.classes('expanded')).toBe(true);
await findExpandButton().vm.$emit('click');
expect(wrapper.classes('expanded')).toBe(true);
});
});
});

View File

@ -126,4 +126,34 @@ RSpec.describe API::API do
get(api('/users'))
end
end
describe 'supported content-types' do
context 'GET /user/:id.txt' do
let_it_be(:user) { create(:user) }
subject { get api("/users/#{user.id}.txt", user) }
it 'returns application/json' do
subject
expect(response).to have_gitlab_http_status(:ok)
expect(response.media_type).to eq('application/json')
expect(response.body).to include('{"id":')
end
context 'when api_always_use_application_json is disabled' do
before do
stub_feature_flags(api_always_use_application_json: false)
end
it 'returns text/plain' do
subject
expect(response).to have_gitlab_http_status(:ok)
expect(response.media_type).to eq('text/plain')
expect(response.body).to include('#<API::Entities::User:')
end
end
end
end
end

View File

@ -1,12 +1,11 @@
# frozen_string_literal: true
require 'fast_spec_helper'
require 'rspec-parameterized'
require_relative 'danger_spec_helper'
require 'gitlab/danger/base_linter'
require_relative '../../../tooling/danger/base_linter'
RSpec.describe Gitlab::Danger::BaseLinter do
RSpec.describe Tooling::Danger::BaseLinter do
let(:commit_class) do
Struct.new(:message, :sha, :diff_parent)
end

View File

@ -1,11 +1,10 @@
# frozen_string_literal: true
require 'fast_spec_helper'
require_relative 'danger_spec_helper'
require 'gitlab/danger/changelog'
require_relative '../../../tooling/danger/changelog'
RSpec.describe Gitlab::Danger::Changelog do
RSpec.describe Tooling::Danger::Changelog do
include DangerSpecHelper
let(:added_files) { nil }
@ -53,8 +52,8 @@ RSpec.describe Gitlab::Danger::Changelog do
describe '#optional?' do
let(:category_with_changelog) { :backend }
let(:label_with_changelog) { 'frontend' }
let(:category_without_changelog) { Gitlab::Danger::Changelog::NO_CHANGELOG_CATEGORIES.first }
let(:label_without_changelog) { Gitlab::Danger::Changelog::NO_CHANGELOG_LABELS.first }
let(:category_without_changelog) { Tooling::Danger::Changelog::NO_CHANGELOG_CATEGORIES.first }
let(:label_without_changelog) { Tooling::Danger::Changelog::NO_CHANGELOG_LABELS.first }
subject { changelog.optional? }

View File

@ -1,12 +1,11 @@
# frozen_string_literal: true
require 'fast_spec_helper'
require 'rspec-parameterized'
require_relative 'danger_spec_helper'
require 'gitlab/danger/commit_linter'
require_relative '../../../tooling/danger/commit_linter'
RSpec.describe Gitlab::Danger::CommitLinter do
RSpec.describe Tooling::Danger::CommitLinter do
using RSpec::Parameterized::TableSyntax
let(:total_files_changed) { 2 }

View File

@ -1,11 +1,10 @@
# frozen_string_literal: true
require 'fast_spec_helper'
require 'rspec-parameterized'
require 'gitlab/danger/emoji_checker'
require_relative '../../../tooling/danger/emoji_checker'
RSpec.describe Gitlab::Danger::EmojiChecker do
RSpec.describe Tooling::Danger::EmojiChecker do
using RSpec::Parameterized::TableSyntax
describe '#includes_text_emoji?' do

View File

@ -4,9 +4,9 @@ require 'fast_spec_helper'
require 'rspec-parameterized'
require_relative 'danger_spec_helper'
require 'gitlab/danger/helper'
require_relative '../../../tooling/danger/helper'
RSpec.describe Gitlab::Danger::Helper do
RSpec.describe Tooling::Danger::Helper do
using RSpec::Parameterized::TableSyntax
include DangerSpecHelper
@ -37,7 +37,7 @@ RSpec.describe Gitlab::Danger::Helper do
context 'when danger gitlab plugin is not available' do
it 'returns nil' do
invalid_danger = Class.new do
include Gitlab::Danger::Helper
include Tooling::Danger::Helper
end.new
expect(invalid_danger.gitlab_helper).to be_nil
@ -289,8 +289,8 @@ RSpec.describe Gitlab::Danger::Helper do
'.gitlab/ci/cng.gitlab-ci.yml' | [:engineering_productivity]
'.gitlab/ci/ee-specific-checks.gitlab-ci.yml' | [:engineering_productivity]
'scripts/foo' | [:engineering_productivity]
'lib/gitlab/danger/foo' | [:engineering_productivity]
'ee/lib/gitlab/danger/foo' | [:engineering_productivity]
'tooling/danger/foo' | [:engineering_productivity]
'ee/tooling/danger/foo' | [:engineering_productivity]
'lefthook.yml' | [:engineering_productivity]
'.editorconfig' | [:engineering_productivity]
'tooling/bin/find_foss_tests' | [:engineering_productivity]

View File

@ -1,12 +1,11 @@
# frozen_string_literal: true
require 'fast_spec_helper'
require 'rspec-parameterized'
require_relative 'danger_spec_helper'
require 'gitlab/danger/merge_request_linter'
require_relative '../../../tooling/danger/merge_request_linter'
RSpec.describe Gitlab::Danger::MergeRequestLinter do
RSpec.describe Tooling::Danger::MergeRequestLinter do
using RSpec::Parameterized::TableSyntax
let(:mr_class) do

View File

@ -3,10 +3,10 @@
require 'webmock/rspec'
require 'timecop'
require 'gitlab/danger/roulette'
require_relative '../../../tooling/danger/roulette'
require 'active_support/testing/time_helpers'
RSpec.describe Gitlab::Danger::Roulette do
RSpec.describe Tooling::Danger::Roulette do
include ActiveSupport::Testing::TimeHelpers
around do |example|
@ -16,7 +16,7 @@ RSpec.describe Gitlab::Danger::Roulette do
let(:backend_available) { true }
let(:backend_tz_offset_hours) { 2.0 }
let(:backend_maintainer) do
Gitlab::Danger::Teammate.new(
Tooling::Danger::Teammate.new(
'username' => 'backend-maintainer',
'name' => 'Backend maintainer',
'role' => 'Backend engineer',
@ -27,7 +27,7 @@ RSpec.describe Gitlab::Danger::Roulette do
end
let(:frontend_reviewer) do
Gitlab::Danger::Teammate.new(
Tooling::Danger::Teammate.new(
'username' => 'frontend-reviewer',
'name' => 'Frontend reviewer',
'role' => 'Frontend engineer',
@ -38,7 +38,7 @@ RSpec.describe Gitlab::Danger::Roulette do
end
let(:frontend_maintainer) do
Gitlab::Danger::Teammate.new(
Tooling::Danger::Teammate.new(
'username' => 'frontend-maintainer',
'name' => 'Frontend maintainer',
'role' => 'Frontend engineer',
@ -49,7 +49,7 @@ RSpec.describe Gitlab::Danger::Roulette do
end
let(:software_engineer_in_test) do
Gitlab::Danger::Teammate.new(
Tooling::Danger::Teammate.new(
'username' => 'software-engineer-in-test',
'name' => 'Software Engineer in Test',
'role' => 'Software Engineer in Test, Create:Source Code',
@ -60,7 +60,7 @@ RSpec.describe Gitlab::Danger::Roulette do
end
let(:engineering_productivity_reviewer) do
Gitlab::Danger::Teammate.new(
Tooling::Danger::Teammate.new(
'username' => 'eng-prod-reviewer',
'name' => 'EP engineer',
'role' => 'Engineering Productivity',
@ -71,7 +71,7 @@ RSpec.describe Gitlab::Danger::Roulette do
end
let(:ci_template_reviewer) do
Gitlab::Danger::Teammate.new(
Tooling::Danger::Teammate.new(
'username' => 'ci-template-maintainer',
'name' => 'CI Template engineer',
'role' => '~"ci::templates"',
@ -121,7 +121,7 @@ RSpec.describe Gitlab::Danger::Roulette do
let!(:project) { 'gitlab' }
let!(:mr_source_branch) { 'a-branch' }
let!(:mr_labels) { ['backend', 'devops::create'] }
let!(:author) { Gitlab::Danger::Teammate.new('username' => 'johndoe') }
let!(:author) { Tooling::Danger::Teammate.new('username' => 'johndoe') }
let(:timezone_experiment) { false }
let(:spins) do
# Stub the request at the latest time so that we can modify the raw data, e.g. available fields.
@ -330,7 +330,7 @@ RSpec.describe Gitlab::Danger::Roulette do
describe '#spin_for_person' do
let(:person_tz_offset_hours) { 0.0 }
let(:person1) do
Gitlab::Danger::Teammate.new(
Tooling::Danger::Teammate.new(
'username' => 'user1',
'available' => true,
'tz_offset_hours' => person_tz_offset_hours
@ -338,21 +338,21 @@ RSpec.describe Gitlab::Danger::Roulette do
end
let(:person2) do
Gitlab::Danger::Teammate.new(
Tooling::Danger::Teammate.new(
'username' => 'user2',
'available' => true,
'tz_offset_hours' => person_tz_offset_hours)
end
let(:author) do
Gitlab::Danger::Teammate.new(
Tooling::Danger::Teammate.new(
'username' => 'johndoe',
'available' => true,
'tz_offset_hours' => 0.0)
end
let(:unavailable) do
Gitlab::Danger::Teammate.new(
Tooling::Danger::Teammate.new(
'username' => 'janedoe',
'available' => false,
'tz_offset_hours' => 0.0)

View File

@ -1,12 +1,11 @@
# frozen_string_literal: true
require 'fast_spec_helper'
require 'rspec-parameterized'
require_relative 'danger_spec_helper'
require 'gitlab/danger/sidekiq_queues'
require_relative '../../../tooling/danger/sidekiq_queues'
RSpec.describe Gitlab::Danger::SidekiqQueues do
RSpec.describe Tooling::Danger::SidekiqQueues do
using RSpec::Parameterized::TableSyntax
include DangerSpecHelper

View File

@ -1,12 +1,9 @@
# frozen_string_literal: true
require 'timecop'
require 'rspec-parameterized'
require 'gitlab/danger/teammate'
require_relative '../../../tooling/danger/teammate'
require 'active_support/testing/time_helpers'
RSpec.describe Gitlab::Danger::Teammate do
RSpec.describe Tooling::Danger::Teammate do
using RSpec::Parameterized::TableSyntax
subject { described_class.new(options) }

View File

@ -1,11 +1,10 @@
# frozen_string_literal: true
require 'fast_spec_helper'
require 'rspec-parameterized'
require 'gitlab/danger/title_linting'
require_relative '../../../tooling/danger/title_linting'
RSpec.describe Gitlab::Danger::TitleLinting do
RSpec.describe Tooling::Danger::TitleLinting do
using RSpec::Parameterized::TableSyntax
describe '#sanitize_mr_title' do

View File

@ -1,9 +1,9 @@
# frozen_string_literal: true
require 'gitlab/danger/weightage/maintainers'
require_relative '../../../../tooling/danger/weightage/maintainers'
RSpec.describe Gitlab::Danger::Weightage::Maintainers do
let(:multiplier) { Gitlab::Danger::Weightage::CAPACITY_MULTIPLIER }
RSpec.describe Tooling::Danger::Weightage::Maintainers do
let(:multiplier) { Tooling::Danger::Weightage::CAPACITY_MULTIPLIER }
let(:regular_maintainer) { double('Teammate', reduced_capacity: false) }
let(:reduced_capacity_maintainer) { double('Teammate', reduced_capacity: true) }
let(:maintainers) do
@ -13,8 +13,8 @@ RSpec.describe Gitlab::Danger::Weightage::Maintainers do
]
end
let(:maintainer_count) { Gitlab::Danger::Weightage::BASE_REVIEWER_WEIGHT * multiplier }
let(:reduced_capacity_maintainer_count) { Gitlab::Danger::Weightage::BASE_REVIEWER_WEIGHT }
let(:maintainer_count) { Tooling::Danger::Weightage::BASE_REVIEWER_WEIGHT * multiplier }
let(:reduced_capacity_maintainer_count) { Tooling::Danger::Weightage::BASE_REVIEWER_WEIGHT }
subject(:weighted_maintainers) { described_class.new(maintainers).execute }

View File

@ -1,9 +1,9 @@
# frozen_string_literal: true
require 'gitlab/danger/weightage/reviewers'
require_relative '../../../../tooling/danger/weightage/reviewers'
RSpec.describe Gitlab::Danger::Weightage::Reviewers do
let(:multiplier) { Gitlab::Danger::Weightage::CAPACITY_MULTIPLIER }
RSpec.describe Tooling::Danger::Weightage::Reviewers do
let(:multiplier) { Tooling::Danger::Weightage::CAPACITY_MULTIPLIER }
let(:regular_reviewer) { double('Teammate', hungry: false, reduced_capacity: false) }
let(:hungry_reviewer) { double('Teammate', hungry: true, reduced_capacity: false) }
let(:reduced_capacity_reviewer) { double('Teammate', hungry: false, reduced_capacity: true) }
@ -26,11 +26,11 @@ RSpec.describe Gitlab::Danger::Weightage::Reviewers do
]
end
let(:hungry_reviewer_count) { Gitlab::Danger::Weightage::BASE_REVIEWER_WEIGHT * multiplier + described_class::DEFAULT_REVIEWER_WEIGHT }
let(:hungry_reviewer_count) { Tooling::Danger::Weightage::BASE_REVIEWER_WEIGHT * multiplier + described_class::DEFAULT_REVIEWER_WEIGHT }
let(:hungry_traintainer_count) { described_class::TRAINTAINER_WEIGHT * multiplier + described_class::DEFAULT_REVIEWER_WEIGHT }
let(:reviewer_count) { Gitlab::Danger::Weightage::BASE_REVIEWER_WEIGHT * multiplier }
let(:traintainer_count) { Gitlab::Danger::Weightage::BASE_REVIEWER_WEIGHT * described_class::TRAINTAINER_WEIGHT * multiplier }
let(:reduced_capacity_reviewer_count) { Gitlab::Danger::Weightage::BASE_REVIEWER_WEIGHT }
let(:reviewer_count) { Tooling::Danger::Weightage::BASE_REVIEWER_WEIGHT * multiplier }
let(:traintainer_count) { Tooling::Danger::Weightage::BASE_REVIEWER_WEIGHT * described_class::TRAINTAINER_WEIGHT * multiplier }
let(:reduced_capacity_reviewer_count) { Tooling::Danger::Weightage::BASE_REVIEWER_WEIGHT }
let(:reduced_capacity_traintainer_count) { described_class::TRAINTAINER_WEIGHT }
subject(:weighted_reviewers) { described_class.new(reviewers, traintainers).execute }

View File

@ -1,6 +1,6 @@
# frozen_string_literal: true
require 'fast_spec_helper'
require_relative '../../tooling/gitlab_danger'
RSpec.describe GitlabDanger do
let(:gitlab_danger_helper) { nil }

View File

@ -17,6 +17,18 @@ RSpec.describe MergeRequestCleanupRefsWorker do
subject
end
end
context 'when merge_request_refs_cleanup flag is disabled' do
before do
stub_feature_flags(merge_request_refs_cleanup: false)
end
it 'does not clean up the merge request' do
expect(MergeRequests::CleanupRefsService).not_to receive(:new)
perform_multiple(1)
end
end
end
context 'when merge request does not exist' do

View File

@ -20,6 +20,18 @@ RSpec.describe ScheduleMergeRequestCleanupRefsWorker do
worker.perform
end
context 'when merge_request_refs_cleanup flag is disabled' do
before do
stub_feature_flags(merge_request_refs_cleanup: false)
end
it 'does not schedule any merge request clean ups' do
expect(MergeRequestCleanupRefsWorker).not_to receive(:bulk_perform_in)
worker.perform
end
end
include_examples 'an idempotent worker' do
it 'schedules MergeRequestCleanupRefsWorker to be performed by batch' do
expect(MergeRequestCleanupRefsWorker)

View File

@ -2,7 +2,7 @@
require_relative 'title_linting'
module Gitlab
module Tooling
module Danger
class BaseLinter
MIN_SUBJECT_WORDS_COUNT = 3

View File

@ -2,7 +2,7 @@
require_relative 'title_linting'
module Gitlab
module Tooling
module Danger
module Changelog
NO_CHANGELOG_LABELS = [

View File

@ -1,17 +1,9 @@
# frozen_string_literal: true
emoji_checker_path = File.expand_path('emoji_checker', __dir__)
base_linter_path = File.expand_path('base_linter', __dir__)
require_relative 'base_linter'
require_relative 'emoji_checker'
if defined?(Rails)
require_dependency(base_linter_path)
require_dependency(emoji_checker_path)
else
require_relative(base_linter_path)
require_relative(emoji_checker_path)
end
module Gitlab
module Tooling
module Danger
class CommitLinter < BaseLinter
MAX_CHANGED_FILES_IN_COMMIT = 3
@ -151,7 +143,7 @@ module Gitlab
end
def emoji_checker
@emoji_checker ||= Gitlab::Danger::EmojiChecker.new
@emoji_checker ||= Tooling::Danger::EmojiChecker.new
end
end
end

View File

@ -2,11 +2,11 @@
require 'json'
module Gitlab
module Tooling
module Danger
class EmojiChecker
DIGESTS = File.expand_path('../../../fixtures/emojis/digests.json', __dir__)
ALIASES = File.expand_path('../../../fixtures/emojis/aliases.json', __dir__)
DIGESTS = File.expand_path('../../fixtures/emojis/digests.json', __dir__)
ALIASES = File.expand_path('../../fixtures/emojis/aliases.json', __dir__)
# A regex that indicates a piece of text _might_ include an Emoji. The regex
# alone is not enough, as we'd match `:foo:bar:baz`. Instead, we use this

View File

@ -3,7 +3,7 @@
require_relative 'teammate'
require_relative 'title_linting'
module Gitlab
module Tooling
module Danger
module Helper
RELEASE_TOOLS_BOT = 'gitlab-release-tools-bot'
@ -171,7 +171,7 @@ module Gitlab
%r{\Alefthook.yml\z} => :engineering_productivity,
%r{\A\.editorconfig\z} => :engineering_productivity,
%r{Dangerfile\z} => :engineering_productivity,
%r{\A(ee/)?(danger/|lib/gitlab/danger/)} => :engineering_productivity,
%r{\A(ee/)?(danger/|tooling/danger/)} => :engineering_productivity,
%r{\A(ee/)?scripts/} => :engineering_productivity,
%r{\Atooling/} => :engineering_productivity,
%r{(CODEOWNERS)} => :engineering_productivity,
@ -213,7 +213,7 @@ module Gitlab
}.freeze
def new_teammates(usernames)
usernames.map { |u| Gitlab::Danger::Teammate.new('username' => u) }
usernames.map { |u| Tooling::Danger::Teammate.new('username' => u) }
end
def draft_mr?

View File

@ -1,14 +1,8 @@
# frozen_string_literal: true
base_linter_path = File.expand_path('base_linter', __dir__)
require_relative 'base_linter'
if defined?(Rails)
require_dependency(base_linter_path)
else
require_relative(base_linter_path)
end
module Gitlab
module Tooling
module Danger
class MergeRequestLinter < BaseLinter
alias_method :lint, :lint_subject

View File

@ -3,7 +3,7 @@
require 'net/http'
require 'json'
module Gitlab
module Tooling
module Danger
module RequestHelper
HTTPError = Class.new(RuntimeError)

View File

@ -1,11 +1,11 @@
# frozen_string_literal: true
require_relative 'teammate'
require_relative 'request_helper' unless defined?(Gitlab::Danger::RequestHelper)
require_relative 'request_helper'
require_relative 'weightage/reviewers'
require_relative 'weightage/maintainers'
module Gitlab
module Tooling
module Danger
module Roulette
ROULETTE_DATA_URL = 'https://gitlab-org.gitlab.io/gitlab-roulette/roulette.json'
@ -72,8 +72,8 @@ module Gitlab
def team
@team ||=
begin
data = Gitlab::Danger::RequestHelper.http_get_json(ROULETTE_DATA_URL)
data.map { |hash| ::Gitlab::Danger::Teammate.new(hash) }
data = Tooling::Danger::RequestHelper.http_get_json(ROULETTE_DATA_URL)
data.map { |hash| ::Tooling::Danger::Teammate.new(hash) }
rescue JSON::ParserError
raise "Failed to parse JSON response from #{ROULETTE_DATA_URL}"
end

View File

@ -1,6 +1,6 @@
# frozen_string_literal: true
module Gitlab
module Tooling
module Danger
module SidekiqQueues
def changed_queue_files

View File

@ -1,6 +1,6 @@
# frozen_string_literal: true
module Gitlab
module Tooling
module Danger
class Teammate
attr_reader :options, :username, :name, :role, :projects, :available, :hungry, :reduced_capacity, :tz_offset_hours

View File

@ -1,6 +1,6 @@
# frozen_string_literal: true
module Gitlab
module Tooling
module Danger
module TitleLinting
DRAFT_REGEX = /\A*#{Regexp.union(/(?i)(\[WIP\]\s*|WIP:\s*|WIP$)/, /(?i)(\[draft\]|\(draft\)|draft:|draft\s\-\s|draft$)/)}+\s*/i.freeze

View File

@ -1,6 +1,6 @@
# frozen_string_literal: true
module Gitlab
module Tooling
module Danger
module Weightage
CAPACITY_MULTIPLIER = 2 # change this number to change what it means to be a reduced capacity reviewer 1/this number

View File

@ -2,7 +2,7 @@
require_relative '../weightage'
module Gitlab
module Tooling
module Danger
module Weightage
class Maintainers

View File

@ -2,7 +2,7 @@
require_relative '../weightage'
module Gitlab
module Tooling
module Danger
module Weightage
# Weights after (current multiplier of 2)

View File

@ -1,10 +1,10 @@
# frozen_string_literal: true
# rubocop:todo Gitlab/NamespacedClass
class GitlabDanger
LOCAL_RULES ||= %w[
changes_size
documentation
frozen_string
duplicate_yarn_dependencies
prettier
eslint