Commit 44fdf983 authored by GitLab Bot's avatar GitLab Bot

Add latest changes from gitlab-org/gitlab@12-10-stable-ee

parent bc9fa07b
...@@ -37,7 +37,7 @@ If applicable, any groups/projects that are happy to have this feature turned on ...@@ -37,7 +37,7 @@ If applicable, any groups/projects that are happy to have this feature turned on
- [ ] Coordinate a time to enable the flag with `#production` and `#g_delivery` on slack. - [ ] Coordinate a time to enable the flag with `#production` and `#g_delivery` on slack.
- [ ] Announce on the issue an estimated time this will be enabled on GitLab.com - [ ] Announce on the issue an estimated time this will be enabled on GitLab.com
- [ ] Enable on GitLab.com by running chatops command in `#production` - [ ] Enable on GitLab.com by running chatops command in `#production`
- [ ] Cross post chatops slack command to `#support_gitlab-com` and in your team channel - [ ] Cross post chatops slack command to `#support_gitlab-com` ([more guidance when this is necessary in the dev docs](https://docs.gitlab.com/ee/development/feature_flags/controls.html#where-to-run-commands)) and in your team channel
- [ ] Announce on the issue that the flag has been enabled - [ ] Announce on the issue that the flag has been enabled
- [ ] Remove feature flag and add changelog entry - [ ] Remove feature flag and add changelog entry
- [ ] After the flag removal is deployed, [clean up the feature flag](https://docs.gitlab.com/ee/development/feature_flags/controls.html#cleaning-up) by running chatops command in `#production` channel - [ ] After the flag removal is deployed, [clean up the feature flag](https://docs.gitlab.com/ee/development/feature_flags/controls.html#cleaning-up) by running chatops command in `#production` channel
......
...@@ -2,6 +2,400 @@ ...@@ -2,6 +2,400 @@
documentation](doc/development/changelog.md) for instructions on adding your own documentation](doc/development/changelog.md) for instructions on adding your own
entry. entry.
## 12.10.0 (2020-04-15)
### Removed (3 changes)
- Revert LDAP readonly attributes feature. !28541
- Remove deprecated /ci/lint page. !28562
- Remove open in file view link from Web IDE. !28705
### Fixed (111 changes, 24 of them are from the community)
- Return 202 for command only notes in REST API. !19624
- Run SAST using awk to pass env variables directly to docker without creating .env file. !21174 (Florian Gaultier)
- #42671: Project and group storage statistics now support values up to 8 PiB (up from 4GiB)
. !23131 (Matthias van de Meent)
- Fix 500 error on profile/chat_names for deleted projects. !24341
- Migrate the database to activate projects prometheus service integration for projects with prometheus installed on shared k8s cluster. !24684
- Fix archived corrupted projects not displaying in admin. !25171 (erickcspice)
- Fix some Web IDE bugs with empty projects. !25463
- Fix failing ci variable e2e test. !25924
- Fix new file not being created in non-ascii character folders. !26165
- Validate uniqueness of project_id and type when a new project service is created. !26308
- Fix not working File upload from Project overview page. !26828 (Gilang Gumilar)
- Fix assignee dropdown on new issue page. !26971
- Resolve Unable to expand multiple downstream pipelines. !27029
- Hide admin user actions for ghost and bot users. !27162
- Fix invalid ancestor group milestones when moving projects. !27262
- Fix right sidebar when scrollbars are always visible. !27314 (Shawn @CasualBot)
- Fix OpenAPI file detector. !27321 (Roger Meier)
- Fix managed_free_namespaces scope to only groups without a license or a free license. !27356
- Set commit status to failed if the TeamCity connection is refused. !27395
- Resolve Improve format support message in issue design. !27409
- Add tooltips with full path to file headers on file tree. !27437
- Scope WAF Statistics anomalies to environment.external_url. !27466
- Show the proper information in snippet edit form. !27479
- Fixes the repository Vue router not working with Chinese characters. !27494
- Fix smartcard config initialization. !27560
- Fix filtered search tokenization. !27648
- Fix processing of GrapqhQL query complexity based on used resolvers. !27652
- Update board scopes when promoting a label. !27662
- Reuse default generated snippet file name in repository. !27673
- Revert user bio back to non-italicized font to fix rendering of emojis. !27693
- Filter out Releases with missing tags. !27716
- Update detected languages for dependency scanning in no dind mode. !27723
- Fix logic for ingress can_uninstall?. !27729
- Amend GraphQL merge requests resolver to check for project presence. !27783
- Fix bug issue template handling of markdown. !27808 (Lee Tickett)
- Update discord notifications to be a single embed and include log messages. !27812 (Sam Bingner)
- Update detected languages for sast in no dind mode. !27831
- Fix bug inviting members whose emails start with numbers. !27848 (Lee Tickett)
- Allow self monitoring project to query internal Prometheus even when "Allow local requests in webhooks and services" setting is false. !27865
- Add missing docstring to Prometheus metric. !27868
- Resolve Snippet creation failure bug. !27891
- Fix optional params for deploy token API. !27961 (Nejc Habjan)
- Fix bug tracking snippet shard name. !27979
- Add `discussion_locked` to Webhook. !28018
- Fix invalid class option for ionice. !28023
- Improve SAST NO_DIND file detection with proper boundary conditions. !28036
- Detect skipped specs in JUnit reports and set TestCase status. !28053
- Allow 0 for pages size limit setting in admin settings. !28086
- Fix wrong colors displayed in charts. !28095
- Fix incorrect content returned on empty dotfile. !28144
- Include LDAP UID attribute in default attributes for all LDAP lookups. !28148
- Fix deploy token API to properly delete all associated deploy token records. !28156
- Fix Gitlab::Auth to handle orphaned oauth tokens. !28159
- Protect sidekiq admin UI with admin mode. !28164 (Diego Louzán)
- Resolve Snippet actions with binary data. !28191
- Make all HTTPS cookies set SameSite to none. !28205
- Don't send 'accept-encoding' in HttpIO requests. !28239
- Gracefully handle missing latest CI pipeline. !28263
- Fix name of approvals column in merge requests. !28274 (Steffen Köhler)
- Add management_project_id to group and project cluster creation, clarifies docs. !28289
- Check first if feature flag version_snippet is enabled. !28352
- Fix single stat panel percentile format support. !28365
- Use CTE optimization for searching board issues. !28430
- Fix missing synthetic milestone change notes for disabled milestone change event tracking feature flag. !28440
- Fix Releases page for Guest users of private projects. !28447
- Prevent ProjectUpdateRepositoryStorageWorker from moving to same filesystem. !28469
- Return error message for create_merge_request. !28482
- Fix storage rollback regression caused by previous refactor. !28496
- Include MR times in Milestone time overview. !28519 (Bob van de Vijver)
- Fix daily report result to use average of coverage values if there are multiple builds for a given group name. !28556
- Token creation uses HTTP status CREATED. !28587
- Allow award emoji same name & user duplicates when Importing. !28588
- Fix pagination in Merge Request GraphQL api. !28667 (briankabiro)
- Remove duplicate spec in web hook service spec. !28669 (Rajendra Kadam)
- Fix GraphQL SnippetType repo urls. !28673
- Fix incorrect regex used in FileUploader#extract_dynamic_path. !28683
- Update duplicate specs in notification service spec. !28742 (Rajendra Kadam)
- Fix styling of MR dropdown in Web IDE. !28746
- Better error message when importing a Github project and Github API rate limit is exceeded. !28785
- Prevent false positives in Ci::Pipeline#all_merge_requests. !28800
- Enable toggle all discussions button for logged out users. !28809 (Diego Louzán)
- Fix display of PyCharm generated Jupyter notebooks. !28810 (Jan Beckmann)
- Resolve Snippet update error with version flag disabled. !28815
- Show multimetric embeds on a single chart. !28841
- Fix race condition updating snippet without repository. !28851
- Normalize signature mime types when filtering attachments in emails. !28865 (Diego Louzán)
- Add autostop check to folder table. !28937
- Use NOT VALID to enforce a NOT NULL constraint on file_store to ci_job_artifacts, lfs_objects and uploads tables. !28946
- Fix 500 error on create release API when providing an invalid tag_name. !28969 (Sashi Kumar)
- Fix missing group icons on profile page when screen < 576px. !28973
- Stringify Sidekiq job args in exception logs. !28996
- Fully qualify id columns for keyset pagination (Projects API). !29026
- Ensure members are always added on Project Import when importing as admin. !29046
- Elasticsearch recommendation alert does not appears while screen is loaded. !29097
- Fix Slack notifications when upgrading from old GitLab versions. !29111
- Prevent wrong environment being used when processing Prometheus alert. !29119
- Exclude 'trial_ends_on', 'shared_runners_minutes_limit' & 'extra_shared_runners_minutes_limit' from list of exported Group attributes. !29259
- Group level container registry show subgroups repos. !29263
- Move prepend to last line in finders files. !29274 (Rajendra Kadam)
- Remove 'error' from diff note error message. !29281
- Migrate legacy uploads out of deprecated paths. !29295
- Move prepend to last line in commit status presenter. !29328 (Rajendra Kadam)
- Move prepend to last line in app serializers. !29332 (Rajendra Kadam)
- Move prepend to last line in app workers and uploaders. !29379 (Rajendra Kadam)
- fix: Publish toolbar dissappears when submitting empty content. !29410
- Replace deprecated GlLoadingIcon sizes. !29417
- Fix Web IDE not showing diff when opening commit tab. !29439
- Use music icon for files with .ogg extension. !29514
- Fix dashboard processing error which prevented dashboards with unknown attributes inside panels from being displayed. !29517
- Fixed whitespace toggle not showing the correct diff.
- Fixed upload file creating a file in the wrong directory.
### Deprecated (1 change)
- Deprecate 'token' attribute from Runners API. !29481
### Changed (48 changes, 7 of them are from the community)
- Only enable searching of projects by full path / name on certain dropdowns. !21910
- Support wiki events in activity streams. !23869
- Fix for issue 26426: Details of runners of nested groups of an owned group are now available for users with enough permissions. !24169 (nachootal@gmail.com)
- Rename "Project Services" to "Integrations" in frontend and docs. !26244
- Support multiple Evidences for a Release. !26509
- Move some global routes to - scope. !27106
- Only display mirrored URL to users who can manage Repository settings. !27166
- Disable lookup of other ActiveSessions to determine admin mode status. !27318 (Diego Louzán)
- Extract X509::Signature from X509::Commit. !27327 (Roger Meier)
- Show user statistics in admin area also in CE, and use daily generated data for these statistics. !27345
- Update aws-ecs image location in CI template. !27382
- Update More Pages button on Wiki Page. !27499
- Update ApplicationLimits to prefer defaults. !27574
- Allow external diff files to be removed. !27602
- Add atomic and cleanup-on-fail parameters for Helm. !27721
- Change the url when the timeslider changes. !27726
- Add user_details.bio column and migrate data from users.bio. !27773
- WAF settings will be read-only if there is a new version of ingress available. !27845
- Add an helper to check if a notification_event is enabled. !27880 (Jacopo Beschi @jacopo-beschi)
- Ensure freshness of settings with snippet creation. !27897
- Update copies in Admin Panel > Repository Storage section. !27986
- Add event tracking to Container regstry quickstart. !27990
- Render snippet repository blobs. !28085
- Accept `author_username` as a param in Merge Requests API. !28100
- Use rich icons for thw rows on the file tree. !28112
- Renamed Contribution Charts as Repository Analytics. !28162
- Move Alerting feature to Core. !28196
- Add file-based pipeline conditions to default Auto DevOps CI template. !28242
- Make pipeline info in chat notifications concise. !28284
- Use different approval icon if current user approved. !28290 (Steffen Köhler)
- Remove repeated examples in user model specs. !28450 (Rajendra Kadam)
- Show only active environments in monitoring dropdown. !28456
- Enable container expiration policies by default for new projects. !28480
- Show snippet error update to the user. !28516
- Move 'Additional Metrics' feature to GitLab Core. !28527
- Add ability to search by environment state in environments GraphQL API. !28567
- Add correlation_id to project_mirror_data, expose in /import API endpoints. !28662
- Add status column to container_registry. !28682
- Cleanup the descriptions of some fields of GraphQL ProjectType. !28735
- Remove duplicate show spec in admin routing. !28790 (Rajendra Kadam)
- Add grab cursor for operations dashboard cards. !28868
- Update copy when snippet git feature disabled. !28913
- Update informational text on Edit Release page. !28938
- Add support for dot (.) in variables masking. !29022
- Update Auto DevOps docker version to 19.03.8. !29081
- Make search redaction more robust. !29166
- Adjust label title applied to issues on import from Jira. !29246
- Increase the timing of polling for the merge request widget.
### Performance (42 changes)
- Limits issues displayed on milestones. !23102
- Optimize suggestions counters. !26443
- Prefetch DNS for asset host. !26868
- Move bots functionality to user_type column. !26981
- Optimize projects_service_active queries performance in usage data. !27093
- Optimize projects_mirrored_with_pipelines_enabled query performance in usage data. !27110
- Optimize ldap keys counters query performance in usage data. !27309
- Enable Workhorse upload acceleration for Project Import uploads via UI. !27332
- Cache ES enabled namespaces and projects. !27348
- Optimize template_repositories query by using batch counting. !27352
- Reduce SQL queries when rendering webhook settings. !27359
- Reduce number of SQL queries for service templates. !27396
- Improve Advanced global search performance by using routing. !27398
- Improve performance of the container repository cleanup tags service. !27441
- Optimize usage ping queries by using batch counting. !27455
- Fix redundant query execution when loading board issues. !27505
- Optimize projects_enforcing_code_owner_approval counter query performance for usage ping. !27526
- Optimize projects_reporting_ci_cd_back_to_github query performance for usage data. !27533
- Optimize service desk enabled projects counter. !27589
- Improve pagination in discussions API. !27697
- Improve API response for archived project searchs. !27717
- Optimize ci builds counters in usage data. !27770
- Enable streaming serializer feature flag by default. !27813
- Harden jira usage data. !27973
- Create merge request pipelines in background jobs. !28024
- Optimize ci builds non distinct counters in usage data. !28027
- Remove feature flag 'export_fast_serialize' and 'export_fast_serialize_with_raw_json'. !28037
- Improve API response for descending internal project searches. !28038
- Make Rails.cache and Gitlab::Redis::Cache share the same Redis connection pool. !28074
- Introduce rate limit for creating issues via web UI. !28129
- Introduce rate limit for creating issues via API. !28130
- Remove unnecessary index index_ci_builds_on_name_for_security_reports_values. !28224
- Disallow distinct count for regular batch count. !28518
- Resolve an N+1 in merge request CI variables. !28688
- Use faster streaming serializer for project exports. !28925
- Add index for created_at of resource_milestone_events. !28929
- Optimize issues with embedded grafana charts usage counter. !28936
- Avoid scheduling duplicate sidekiq jobs. !29116
- Optimize projects with repositories enabled usage data. !29117
- Use diff-stats for calculating raw diffs modified paths. !29134
- Optimize protected branches usage data. !29148
- Add index on users.unlock_token. !276298
### Added (118 changes, 32 of them are from the community)
- New package list is enabled which includes filtering by type. !18860
- Create a rake task to cleanup unused LFS files. !21747
- Support Asciidoc docname attribute. !22313 (Jouke Witteveen)
- Adds features to delete stopped environments. !22629
- Highlight line which includes search term is code search results. !22914 (Alex Terekhov (terales))
- Allow embedded metrics charts to be hidden. !23929
- Add toggle all discussions button to MRs. !24670 (Martin Hobert & Diego Louzán)
- Store daily code coverages into ci_daily_report_results table. !24695
- Add cluster management project template. !25318
- Add limit metric to lists. !25532
- Add support for Okta as a SCIM provider. !25649
- Add grape custom validator for git reference params. !26102 (Rajendra Kadam)
- Add healthy column to clusters_applications_prometheus table. !26168
- Add API endpoint to list runners for a group. !26328
- Add unlock_membership_to_ldap boolean to Groups. !26474
- Adds wiki metadata models. !26529
- Create model to store Terraform state files. !26619
- Improve logs dropdown with more clear labels. !26635
- Add all pods view to logs explorer. !26883
- Populate user_highest_roles table. !27127
- Add option for switching between blocking and logging for WAF. !27133
- Add bar chart support to monitoring dashboard. !27155
- Start merge request for custom dashboard if new branch is provided. !27189
- Update user's highest role to keep the users statistics up to date. !27231
- Make "Value Stream" the default page that appears when clicking the project-level "Analytics" sidebar item. !27279 (Gilang Gumilar)
- Add metric to derive new users count. !27351
- Display cluster type in cluster info page. !27366
- Improve logs filters on mobile, simplify kubernetes API logs filters. !27484
- Adds branch information to the package details title section. !27488
- Add forking_access_level to projects API. !27514 (Mathieu Parent)
- Add a DB column to track external issue and epic ids when importing from external sources. !27522
- Added Edit Title shared component. !27582
- Add metrics dashboard annotation model, relation, policy, create and delete services. To provide interface for create and delete operations. !27583
- Adds filter by name to the packages list. !27586
- Allow querying of Jira imports and their status via GraphQL. !27587
- Update Gitaly to 12.9.0-rc5. !27631
- Add filtered search for elastic search in logs. !27654
- Add cost factor fields to ci runners. !27666
- Add auto_ssl_failed to pages_domains. !27671
- Allow to start Jira import through graphql mutation. !27684
- Add terraform report to merge request widget. !27700
- Read metadata from Wiki front-matter. !27706
- Support custom graceful timeout for Sidekiq Cluster processes. !27710
- Show storage size on project page. !27724 (Roger Meier)
- Upload a design by copy/pasting the file into the Design Tab. !27776
- Update Active checkbox component to use toggle. !27778
- Add namespace_storage_size_limit to application settings. !27786
- Add issues to graphQL group endpoint. !27789
- Enable container registry at the group level. !27814
- Expose created_at property in Groups API. !27824
- Add an endpoint to allow group admin users to purge the dependency proxy for a group. !27843
- Filter health endpoint metrics. !27847
- Add support for system note metadata in project Import/Export. !27853 (Melvin Vermeeren)
- Add daily job to create users statistics. !27883
- Add DS_REMEDIATE env var to dependency scanning template. !27947
- Add Swift Dockerfile to GitLab templates. !28035
- Update user's highest role to keep the users statistics up to date. !28087
- Add jira_imports table to track current jira import progress as well as historical imports data. !28108
- Add initial support for Cloud Native Buildpacks in Auto DevOps builds. !28165
- Add app server type to usage ping. !28189
- Add last_activity_before and last_activity_after filter to /api/projects endpoint. !28221 (Roger Meier)
- Expose basic project services attributes through GraphQL. !28234
- Add environment-state flag to metrics data. !28237
- Allow defining of metric step in dashboard yml. !28247
- Separate validators into own class files. !28266 (Rajendra Kadam)
- Enable log explorer to use the full height of the screen. !28312
- Automatically assign id to each panel within dashboard to support panel scoped annotations. !28341
- Add Praefect rake task to print out replica checksums. !28369
- Add rake task to update x509 signatures. !28406 (Roger Meier)
- Add application setting to enable container expiration and retention policies on pre 12.8 projects. !28479
- Add Prometheus alerts automatically after Prometheus Service was created. !28503
- Add ability to filter commits by author. !28509
- Add usage data metrics for instance level clusters and clusters with management projects. !28510
- Refactor duplicate specs in wiki page specs. !28551 (Rajendra Kadam)
- Refactor duplicate member specs. !28574 (Rajendra Kadam)
- Remove design management as a license feature. !28589
- Add api endpoint to get x509 signature. !28590 (Roger Meier)
- Add support for database-independent embedded metric charts. !28618
- Fix issuable duplicate spec. !28632 (Rajendra Kadam)
- Fix build duplicate spec. !28633 (Rajendra Kadam)
- Remove duplicate specs in ability model. !28644 (Rajendra Kadam)
- Remove duplicate specs in update service spec. !28650 (Rajendra Kadam)
- Add added_lines and removed_lines columns to merge_request_metrics table. !28658
- Remove duplicate specs in pipeline message spec. !28664 (Rajendra Kadam)
- Add status endpoint to Pages Internal API. !28743
- Enable last user activity logging on the REST API. !28755
- Refresh metrics dashboard data without reloading the page. !28756
- Update duplicate specs in update large table spec. !28787 (Rajendra Kadam)
- Fix duplicate spec in factory relation spec. !28794 (Rajendra Kadam)
- Remove duplicate spec from changelog spec. !28801 (Rajendra Kadam)
- Remove duplicate spec from closing issue spec. !28803 (Rajendra Kadam)
- Allow Release links to be edited on the Edit Release page. !28816
- Create operations_user_lists table. !28822
- Added the clone button for Snippet view. !28840
- Add Fluentd table for cluster apps. !28844
- Fix duplicate spec from user helper spec. !28854 (Rajendra Kadam)
- Add missing spec for gitlab schema. !28855 (Rajendra Kadam)
- Fix duplciate spec in merge requests. !28856 (Rajendra Kadam)
- Fix duplicate spec in environment finder. !28857 (Rajendra Kadam)
- Fix duplicate spec in template dropdown spec. !28858 (Rajendra Kadam)
- Fix duplicate spec in user post diff notes. !28859 (Rajendra Kadam)
- Fix duplicate spec in filter issues. !28860 (Rajendra Kadam)
- Remove `ci_dag_support` feature flag. !28863 (Lee Tickett)
- Validate dependency on job generating a CI config when using dynamic child pipelines. !28901
- Add read_api scope to personal access tokens for granting read only API access. !28944
- Add write_registry scope to deploy tokens for container registry push access. !28958
- Add Nginx error percentage metric. !28983
- Provide configuration options for Static Site Editor. !29058
- Remove blobs_fetch_in_batches feature flag. !29069
- API endpoint to create annotations for environments dashboard. !29089
- Add graphQL interface to fetch metrics dashboard. !29112
- Save changes in Static Site Editor using REST GitLab API. !29286
- Add API endpoint to get users without projects. !29347
- Allow sorting of issue and MR discussions. !29492
- Add jira issues import feature.
- Add wildcard case in documentation for artifacts. (Fábio Matavelli)
- Add namespace storage size limit setting.
- Add placeholders to broadcast message notifications.
### Other (46 changes, 15 of them are from the community)
- Convert schema to plain SQL using structure.sql. !22808
- Provide link to a survey for Knative users. !23025
- Complete the migration of Job Artifact to Security Scan. !24244
- Migrate .fa-spinner to .spinner for app/views/shared/notes. !25028 (nuwe1)
- Migrate .fa-spinner to .spinner for app/views/ci/variables. !25030 (nuwe1)
- Migrate .fa-spinner to .spinner for ee/app/views/projects/settings. !25038 (nuwe1)
- Migrate .fa-spinner to .spinner for app/views/projects/mirrors. !25041 (nuwe1)
- Migrate .fa-spinner to .spinner for app/views/projects/network. !25050 (nuwe1)
- Migrate .fa-spinner to .spinner for app/views/groups. !25053 (nuwe1)
- Replace underscore with lodash for ./app/assets/javascripts/vue_shared. !25108 (Tobias Spagert)
- Remove health_status column from epics. !26302
- Show object access warning when disabling repo LFS. !26696
- Update icons in Sentry Error Tracking list for ignored/resolved errors. !27125
- Use Ruby 2.7 in specs to remove Ruby 2.1/2.2/2.3. !27269 (Takuya Noguchi)
- Fill user_type for ghost users. !27387
- Add Bitbucket Importer metrics. !27524
- Consume remaining LinkLFsObjectsProjects jobs. !27558
- Update GitLab Runner Helm Chart to 0.15.0. !27670
- Log Redis call count and duration to log files. !27735
- Use id instead of cve where possible when parsing remediations. !27815
- Log member additions when importing Project/Group. !27930
- Change project_export_worker urgency to throttled. !27941
- Add missing track_exception() call to Ci::CreateJobArtifactsService. !27954
- Add possibility to conigure additional rails hosts with env variable. !28133
- Remove new issue tooltip. !28261 (Victor Wu)
- Improve message when promoting project labels. !28265
- Change the link to chart copy text. !28371
- Conditional mocking of admin mode in specs by directory. !28420 (Diego Louzán)
- Align color and font-weight styles of heading elements and their typography classes. !28422
- Fix merge request thread’s icon buttons color. !28465
- Updated spinner next to forking message. !28506 (Victor Wu)
- Replaced old-style buttons with the new ones on Snippet view. !28614
- Change redo for retry icon in metrics dashboard. !28670
- Remove User's association max_access_level_membership. !28757
- Reduce urgency of EmailsOnPushWorker. !28783
- Use concern instead of service to update highest role. !28791
- Normalize error message between Gitea and Fogbugz importers. !28802
- Fix keyboard shortcut to navigate to your groups. !28873 (Victor Wu)
- Fix keyboard shortcut to navigate to dashboard activity. !28985 (Victor Wu)
- Remove unused index for vulnerability severity levels. !29023
- Update query labels dynamically for embedded charts. !29034
- Refactor projects/:id/packages API to supply only necessary params to PackagesFinder. !29052 (Sashi Kumar)
- Update GitLab Shell to v12.1.0. !29167
- Update GitLab Elasticsearch Indexer. !29256
- Add Gitlab User-Agent to ContainerRegistry::Client. !29294 (Sashi Kumar)
- Improve error message in DAST CI template. !29388
## 12.9.3 (2020-04-14) ## 12.9.3 (2020-04-14)
### Security (3 changes) ### Security (3 changes)
......
<script> <script>
import { mapActions, mapState } from 'vuex'; import { mapActions, mapGetters, mapState } from 'vuex';
import { GlAlert, GlSprintf, GlLink } from '@gitlab/ui'; import { GlAlert, GlSprintf, GlLink } from '@gitlab/ui';
import { s__ } from '~/locale'; import { s__ } from '~/locale';
...@@ -15,8 +15,15 @@ export default { ...@@ -15,8 +15,15 @@ export default {
GlLink, GlLink,
}, },
i18n: { i18n: {
unavailableFeatureText: s__( unavailableFeatureTitle: s__(
'ContainerRegistry|Currently, the Container Registry tag expiration feature is not available for projects created before GitLab version 12.8. For updates and more information, visit Issue %{linkStart}#196124%{linkEnd}', `ContainerRegistry|Container Registry tag expiration and retention policy is disabled`,
),
unavailableFeatureIntroText: s__(
`ContainerRegistry|The Container Registry tag expiration and retention policies for this project have not been enabled.`,
),
unavailableUserFeatureText: s__(`ContainerRegistry|Please contact your administrator.`),
unavailableAdminFeatureText: s__(
`ContainerRegistry| Please visit the %{linkStart}administration settings%{linkEnd} to enable this feature.`,
), ),
fetchSettingsErrorText: FETCH_SETTINGS_ERROR_MESSAGE, fetchSettingsErrorText: FETCH_SETTINGS_ERROR_MESSAGE,
}, },
...@@ -26,10 +33,19 @@ export default { ...@@ -26,10 +33,19 @@ export default {
}; };
}, },
computed: { computed: {
...mapState(['isDisabled']), ...mapState(['isAdmin', 'adminSettingsPath']),
...mapGetters({ isDisabled: 'getIsDisabled' }),
showSettingForm() { showSettingForm() {
return !this.isDisabled && !this.fetchSettingsError; return !this.isDisabled && !this.fetchSettingsError;
}, },
showDisabledFormMessage() {
return this.isDisabled && !this.fetchSettingsError;
},
unavailableFeatureMessage() {
return this.isAdmin
? this.$options.i18n.unavailableAdminFeatureText
: this.$options.i18n.unavailableUserFeatureText;
},
}, },
mounted() { mounted() {
this.fetchSettings().catch(() => { this.fetchSettings().catch(() => {
...@@ -59,16 +75,21 @@ export default { ...@@ -59,16 +75,21 @@ export default {
</ul> </ul>
<settings-form v-if="showSettingForm" /> <settings-form v-if="showSettingForm" />
<template v-else> <template v-else>
<gl-alert v-if="isDisabled" :dismissible="false"> <gl-alert
<p> v-if="showDisabledFormMessage"
<gl-sprintf :message="$options.i18n.unavailableFeatureText"> :dismissible="false"
<template #link="{content}"> :title="$options.i18n.unavailableFeatureTitle"
<gl-link href="https://gitlab.com/gitlab-org/gitlab/issues/196124" target="_blank"> variant="tip"
{{ content }} >
</gl-link> {{ $options.i18n.unavailableFeatureIntroText }}
</template>
</gl-sprintf> <gl-sprintf :message="unavailableFeatureMessage">
</p> <template #link="{ content }">
<gl-link :href="adminSettingsPath" target="_blank">
{{ content }}
</gl-link>
</template>
</gl-sprintf>
</gl-alert> </gl-alert>
<gl-alert v-else-if="fetchSettingsError" variant="warning" :dismissible="false"> <gl-alert v-else-if="fetchSettingsError" variant="warning" :dismissible="false">
<gl-sprintf :message="$options.i18n.fetchSettingsErrorText" /> <gl-sprintf :message="$options.i18n.fetchSettingsErrorText" />
......
...@@ -5,11 +5,7 @@ export const setInitialState = ({ commit }, data) => commit(types.SET_INITIAL_ST ...@@ -5,11 +5,7 @@ export const setInitialState = ({ commit }, data) => commit(types.SET_INITIAL_ST
export const updateSettings = ({ commit }, data) => commit(types.UPDATE_SETTINGS, data); export const updateSettings = ({ commit }, data) => commit(types.UPDATE_SETTINGS, data);
export const toggleLoading = ({ commit }) => commit(types.TOGGLE_LOADING); export const toggleLoading = ({ commit }) => commit(types.TOGGLE_LOADING);
export const receiveSettingsSuccess = ({ commit }, data) => { export const receiveSettingsSuccess = ({ commit }, data) => {
if (data) { commit(types.SET_SETTINGS, data);
commit(types.SET_SETTINGS, data);
} else {
commit(types.SET_IS_DISABLED, true);
}
}; };
export const resetSettings = ({ commit }) => commit(types.RESET_SETTINGS); export const resetSettings = ({ commit }) => commit(types.RESET_SETTINGS);
......
...@@ -19,3 +19,7 @@ export const getSettings = (state, getters) => ({ ...@@ -19,3 +19,7 @@ export const getSettings = (state, getters) => ({
}); });
export const getIsEdited = state => !isEqual(state.original, state.settings); export const getIsEdited = state => !isEqual(state.original, state.settings);
export const getIsDisabled = state => {
return !(state.original || state.enableHistoricEntries);
};
...@@ -3,4 +3,3 @@ export const UPDATE_SETTINGS = 'UPDATE_SETTINGS'; ...@@ -3,4 +3,3 @@ export const UPDATE_SETTINGS = 'UPDATE_SETTINGS';
export const TOGGLE_LOADING = 'TOGGLE_LOADING'; export const TOGGLE_LOADING = 'TOGGLE_LOADING';
export const SET_SETTINGS = 'SET_SETTINGS'; export const SET_SETTINGS = 'SET_SETTINGS';
export const RESET_SETTINGS = 'RESET_SETTINGS'; export const RESET_SETTINGS = 'RESET_SETTINGS';
export const SET_IS_DISABLED = 'SET_IS_DISABLED';
import { parseBoolean } from '~/lib/utils/common_utils';
import * as types from './mutation_types'; import * as types from './mutation_types';
export default { export default {
...@@ -8,19 +9,19 @@ export default { ...@@ -8,19 +9,19 @@ export default {
keepN: JSON.parse(initialState.keepNOptions), keepN: JSON.parse(initialState.keepNOptions),
olderThan: JSON.parse(initialState.olderThanOptions), olderThan: JSON.parse(initialState.olderThanOptions),
}; };
state.enableHistoricEntries = parseBoolean(initialState.enableHistoricEntries);
state.isAdmin = parseBoolean(initialState.isAdmin);
state.adminSettingsPath = initialState.adminSettingsPath;
}, },
[types.UPDATE_SETTINGS](state, data) { [types.UPDATE_SETTINGS](state, data) {
state.settings = { ...state.settings, ...data.settings }; state.settings = { ...state.settings, ...data.settings };
}, },
[types.SET_SETTINGS](state, settings) { [types.SET_SETTINGS](state, settings) {
state.settings = settings; state.settings = settings ?? state.settings;
state.original = Object.freeze(settings); state.original = Object.freeze(settings);
}, },
[types.SET_IS_DISABLED](state, isDisabled) {
state.isDisabled = isDisabled;
},
[types.RESET_SETTINGS](state) { [types.RESET_SETTINGS](state) {
state.settings = { ...state.original }; state.settings = Object.assign({}, state.original);
}, },
[types.TOGGLE_LOADING](state) { [types.TOGGLE_LOADING](state) {
state.isLoading = !state.isLoading; state.isLoading = !state.isLoading;
......
...@@ -8,9 +8,17 @@ export default () => ({ ...@@ -8,9 +8,17 @@ export default () => ({
*/ */
isLoading: false, isLoading: false,
/* /*
* Boolean to determine if the user is allowed to interact with the form * Boolean to determine if the user is an admin
*/ */
isDisabled: false, isAdmin: false,
/*
* String containing the full path to the admin config page for CI/CD
*/
adminSettingsPath: '',
/*
* Boolean to determine if project created before 12.8 can use this feature
*/
enableHistoricEntries: false,
/* /*
* This contains the data shown and manipulated in the UI * This contains the data shown and manipulated in the UI
* Has the following structure: * Has the following structure:
...@@ -24,9 +32,9 @@ export default () => ({ ...@@ -24,9 +32,9 @@ export default () => ({
*/ */
settings: {}, settings: {},
/* /*
* Same structure as settings, above but Frozen object and used only in case the user clicks 'cancel' * Same structure as settings, above but Frozen object and used only in case the user clicks 'cancel', initialized to null
*/ */
original: {}, original: null,
/* /*
* Contains the options used to populate the form selects * Contains the options used to populate the form selects
*/ */
......
...@@ -202,7 +202,7 @@ const fileExtensionIcons = { ...@@ -202,7 +202,7 @@ const fileExtensionIcons = {
flv: 'movie', flv: 'movie',
vob: 'movie', vob: 'movie',
ogv: 'movie', ogv: 'movie',
ogg: 'movie', ogg: 'music',
gifv: 'movie', gifv: 'movie',
avi: 'movie', avi: 'movie',
mov: 'movie', mov: 'movie',
......
...@@ -496,6 +496,10 @@ class ApplicationController < ActionController::Base ...@@ -496,6 +496,10 @@ class ApplicationController < ActionController::Base
html_request? && !devise_controller? html_request? && !devise_controller?
end end
def public_visibility_restricted?
Gitlab::CurrentSettings.restricted_visibility_levels.include? Gitlab::VisibilityLevel::PUBLIC
end
def set_usage_stats_consent_flag def set_usage_stats_consent_flag
return unless current_user return unless current_user
return if sessionless_user? return if sessionless_user?
......
# frozen_string_literal: true # frozen_string_literal: true
class Explore::ApplicationController < ApplicationController class Explore::ApplicationController < ApplicationController
skip_before_action :authenticate_user! skip_before_action :authenticate_user!, unless: :public_visibility_restricted?
layout 'explore' layout 'explore'
end end
# frozen_string_literal: true # frozen_string_literal: true
class HelpController < ApplicationController class HelpController < ApplicationController
skip_before_action :authenticate_user! skip_before_action :authenticate_user!, unless: :public_visibility_restricted?
layout 'help' layout 'help'
......
...@@ -51,6 +51,10 @@ module ExploreHelper ...@@ -51,6 +51,10 @@ module ExploreHelper
links.any? { |link| explore_nav_link?(link) } links.any? { |link| explore_nav_link?(link) }
end end
def public_visibility_restricted?
Gitlab::CurrentSettings.restricted_visibility_levels.include? Gitlab::VisibilityLevel::PUBLIC
end
private private
def get_explore_nav_links def get_explore_nav_links
......
...@@ -74,7 +74,7 @@ module ServicesHelper ...@@ -74,7 +74,7 @@ module ServicesHelper
def scoped_integration_path(integration) def scoped_integration_path(integration)
if @project.present? if @project.present?
project_settings_integration_path(@project, integration) project_service_path(@project, integration)
elsif @group.present? elsif @group.present?
group_settings_integration_path(@group, integration) group_settings_integration_path(@group, integration)
else else
......
...@@ -14,6 +14,7 @@ class ApplicationSetting < ApplicationRecord ...@@ -14,6 +14,7 @@ class ApplicationSetting < ApplicationRecord
add_authentication_token_field :static_objects_external_storage_auth_token add_authentication_token_field :static_objects_external_storage_auth_token
belongs_to :self_monitoring_project, class_name: "Project", foreign_key: 'instance_administration_project_id' belongs_to :self_monitoring_project, class_name: "Project", foreign_key: 'instance_administration_project_id'
belongs_to :push_rule
alias_attribute :self_monitoring_project_id, :instance_administration_project_id alias_attribute :self_monitoring_project_id, :instance_administration_project_id
belongs_to :instance_administrators_group, class_name: "Group" belongs_to :instance_administrators_group, class_name: "Group"
......
...@@ -15,6 +15,8 @@ class AlertsService < Service ...@@ -15,6 +15,8 @@ class AlertsService < Service
before_validation :ensure_token, if: :activated? before_validation :ensure_token, if: :activated?
def url def url
return if instance? || template?
url_helpers.project_alerts_notify_url(project, format: :json) url_helpers.project_alerts_notify_url(project, format: :json)
end end
......
...@@ -9,3 +9,5 @@ class ProjectSetting < ApplicationRecord ...@@ -9,3 +9,5 @@ class ProjectSetting < ApplicationRecord
where(primary_key => safe_find_or_create_by(attrs)) where(primary_key => safe_find_or_create_by(attrs))
end end
end end
ProjectSetting.prepend_if_ee('EE::ProjectSetting')
...@@ -56,7 +56,12 @@ module Groups ...@@ -56,7 +56,12 @@ module Groups
end end
def tree_exporter def tree_exporter
Gitlab::ImportExport::Group::TreeSaver.new(group: @group, current_user: @current_user, shared: @shared, params: @params) Gitlab::ImportExport::Group::LegacyTreeSaver.new(
group: @group,
current_user: @current_user,
shared: @shared,
params: @params
)
end end
def file_saver def file_saver
......
...@@ -38,7 +38,9 @@ ...@@ -38,7 +38,9 @@
%hr.footer-fixed %hr.footer-fixed
.container.footer-container .container.footer-container
.footer-links .footer-links
= link_to _("Explore"), explore_root_path - if !public_visibility_restricted?
= link_to _("Help"), help_path = link_to _("Explore"), explore_root_path
= link_to _("Help"), help_path
= link_to _("About GitLab"), "https://about.gitlab.com/" = link_to _("About GitLab"), "https://about.gitlab.com/"
= footer_message = footer_message
...@@ -14,7 +14,8 @@ ...@@ -14,7 +14,8 @@
%hr %hr
.container .container
.footer-links .footer-links
= link_to _("Explore"), explore_root_path - if !public_visibility_restricted?
= link_to _("Help"), help_path = link_to _("Explore"), explore_root_path
= link_to _("Help"), help_path
= link_to _("About GitLab"), "https://about.gitlab.com/" = link_to _("About GitLab"), "https://about.gitlab.com/"
= footer_message = footer_message
#js-registry-settings{ data: { project_id: @project.id, #js-registry-settings{ data: { project_id: @project.id,
cadence_options: cadence_options.to_json, cadence_options: cadence_options.to_json,
keep_n_options: keep_n_options.to_json, keep_n_options: keep_n_options.to_json,
older_than_options: older_than_options.to_json} } older_than_options: older_than_options.to_json,
is_admin: current_user&.admin.to_s,
admin_settings_path: ci_cd_admin_application_settings_path(anchor: 'js-registry-settings'),
enable_historic_entries: Gitlab::CurrentSettings.try(:container_expiration_policies_enable_historic_entries).to_s} }
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
- if @service.respond_to?(:detailed_description) - if @service.respond_to?(:detailed_description)
%p= @service.detailed_description %p= @service.detailed_description
.col-lg-9 .col-lg-9
= form_for(@service, as: :service, url: project_service_path(@project, @service.to_param), method: :put, html: { class: 'gl-show-field-errors integration-settings-form js-integration-settings-form', data: { 'can-test' => @service.can_test?, 'test-url' => test_project_service_path(@project, @service) } }) do |form| = form_for(@service, as: :service, url: scoped_integration_path(@service), method: :put, html: { class: 'gl-show-field-errors integration-settings-form js-integration-settings-form', data: { 'can-test' => @service.can_test?, 'test-url' => test_project_service_path(@project, @service) } }) do |form|
= render 'shared/service_settings', form: form, service: @service = render 'shared/service_settings', form: form, service: @service
- if @service.editable? - if @service.editable?
.footer-block.row-content-block .footer-block.row-content-block
......
.js-alerts-service-settings{ data: { activated: @service.activated?.to_s, .js-alerts-service-settings{ data: { activated: @service.activated?.to_s,
form_path: project_service_path(@project, @service.to_param), form_path: scoped_integration_path(@service),
authorization_key: @service.token, url: @service.url, learn_more_url: 'https://docs.gitlab.com/ee/user/project/integrations/generic_alerts.html' } } authorization_key: @service.token, url: @service.url || _('<namespace / project>'), learn_more_url: 'https://docs.gitlab.com/ee/user/project/integrations/generic_alerts.html' } }
- run_actions_text = s_("ProjectService|Perform common operations on GitLab project: %{project_name}") % { project_name: @project.full_name } - pretty_name = @project&.full_name || _('<project name>')
- run_actions_text = s_("ProjectService|Perform common operations on GitLab project: %{project_name}") % { project_name: pretty_name }
%p= s_("ProjectService|To set up this service:") %p= s_("ProjectService|To set up this service:")
%ul.list-unstyled.indent-list %ul.list-unstyled.indent-list
...@@ -20,7 +21,7 @@ ...@@ -20,7 +21,7 @@
.form-group .form-group
= label_tag :display_name, _('Display name'), class: 'col-12 col-form-label label-bold' = label_tag :display_name, _('Display name'), class: 'col-12 col-form-label label-bold'
.col-12.input-group .col-12.input-group
= text_field_tag :display_name, "GitLab / #{@project.full_name}", class: 'form-control form-control-sm', readonly: 'readonly' = text_field_tag :display_name, "GitLab / #{pretty_name}", class: 'form-control form-control-sm', readonly: 'readonly'
.input-group-append .input-group-append
= clipboard_button(target: '#display_name', class: 'input-group-text') = clipboard_button(target: '#display_name', class: 'input-group-text')
...@@ -38,8 +39,9 @@ ...@@ -38,8 +39,9 @@
%p %p
= s_('MattermostService|Suggestions:') = s_('MattermostService|Suggestions:')
%code= 'gitlab' %code= 'gitlab'
%code= @project.path # Path contains no spaces, but dashes - if @project
%code= @project.full_path %code= @project.path # Path contains no spaces, but dashes
%code= @project.full_path
.form-group .form-group
= label_tag :request_url, s_('MattermostService|Request URL'), class: 'col-12 col-form-label label-bold' = label_tag :request_url, s_('MattermostService|Request URL'), class: 'col-12 col-form-label label-bold'
......
- pretty_name = defined?(@project) ? @project.full_name : 'namespace / path' - pretty_name = @project&.full_name || _('<project name>')
- run_actions_text = "Perform common operations on GitLab project: #{pretty_name}" - run_actions_text = s_("ProjectService|Perform common operations on GitLab project: %{project_name}") % { project_name: pretty_name }
.info-well .info-well
.well-segment .well-segment
...@@ -31,8 +31,10 @@ ...@@ -31,8 +31,10 @@
%p %p
= _("Suggestions:") = _("Suggestions:")
%code= 'gitlab' %code= 'gitlab'
%code= @project.path # Path contains no spaces, but dashes %code= 'project'
%code= @project.full_path - if @project
%code= @project.path # Path contains no spaces, but dashes
%code= @project.full_path
.form-group .form-group
= label_tag :url, 'URL', class: 'col-12 col-form-label label-bold' = label_tag :url, 'URL', class: 'col-12 col-form-label label-bold'
......
---
title: Add an endpoint to allow group admin users to purge the dependency proxy for a group
merge_request: 27843
author:
type: added
---
title: Add Nginx error percentage metric
merge_request: 28983
author:
type: added
---
title: Add Prometheus alerts automatically after Prometheus Service was created
merge_request: 28503
author:
type: added
---
title: Resolve Unable to expand multiple downstream pipelines.
merge_request: 27029
author:
type: fixed
---
title: Update detected languages for dependency scanning in no dind mode
merge_request: 27723
author:
type: fixed
---
title: Update detected languages for sast in no dind mode
merge_request: 27831
author:
type: fixed
---
title: Add limit metric to lists
merge_request: 25532
author:
type: added
---
title: Add usage data metrics for instance level clusters and clusters with management projects
merge_request: 28510
author:
type: added
---
title: Add ability to filter commits by author
merge_request: 28509
author:
type: added
---
title: Add unlock_membership_to_ldap boolean to Groups
merge_request: 26474
author:
type: added
---
title: Fix archived corrupted projects not displaying in admin
merge_request: 25171
author: erickcspice
type: fixed
---
title: "Add support for system note metadata in project Import/Export"
merge_request: 27853
author: Melvin Vermeeren
type: added
---
title: Use Ruby 2.7 in specs to remove Ruby 2.1/2.2/2.3
merge_request: 27269
author: Takuya Noguchi
type: other
---
title: Hide admin user actions for ghost and bot users
merge_request: 27162
author:
type: fixed
---
title: Update query labels dynamically for embedded charts
merge_request: 29034
author:
type: other
---
title: Fix right sidebar when scrollbars are always visible
merge_request: 27314
author: Shawn @CasualBot
type: fixed
---
title: Highlight line which includes search term is code search results
merge_request: 22914
author: Alex Terekhov (terales)
type: added
---
title: Improve Advanced global search performance by using routing
merge_request: 27398
author:
type: performance
---
title: Add issues to graphQL group endpoint
merge_request: 27789
author:
type: added
---
title: Add added_lines and removed_lines columns to merge_request_metrics table
merge_request: 28658
author:
type: added
---
title: Adds filter by name to the packages list
merge_request: 27586
author:
type: added
---
title: Adds branch information to the package details title section
merge_request: 27488
author:
type: added
---
title: Improve API response for archived project searchs
merge_request: 27717
author:
type: performance
---
title: Improve API response for descending internal project searches
merge_request: 28038
author:
type: performance
---
title: Improve SAST NO_DIND file detection with proper boundary conditions
merge_request: 28036
author:
type: fixed
---
title: Resolve an N+1 in merge request CI variables
merge_request: 28688
author:
type: performance
---
title: Support multiple Evidences for a Release
merge_request: 26509
author:
type: changed
---
title: Remove open in file view link from Web IDE
merge_request: 28705
author:
type: removed
---
title: Fix Web IDE not showing diff when opening commit tab
merge_request: 29439
author:
type: fixed
---
title: Allow 0 for pages size limit setting in admin settings
merge_request: 28086
author:
type: fixed
---
title: Update Active checkbox component to use toggle
merge_request: 27778
author:
type: added
---
title: Make search redaction more robust
merge_request: 29166
author:
type: changed
---
title: Fix wrong colors displayed in charts
merge_request: 28095
author:
type: fixed
---
title: Upload a design by copy/pasting the file into the Design Tab
merge_request: 27776
author:
type: added
---
title: Add read_api scope to personal access tokens for granting read only API access
merge_request: 28944
author:
type: added
---
title: Only enable searching of projects by full path / name on certain dropdowns
merge_request: 21910
author:
type: changed
---
title: Added the clone button for Snippet view
merge_request: 28840
author:
type: added
---
title: Prevent wrong environment being used when processing Prometheus alert
merge_request: 29119
author:
type: fixed
---
title: Add user_details.bio column and migrate data from users.bio
merge_request: 27773
author:
type: changed
---
title: Added Edit Title shared component
merge_request: 27582
author:
type: added
---
title: Validate uniqueness of project_id and type when a new project service is created
merge_request: 26308
author:
type: fixed
---
title: Create model to store Terraform state files
merge_request: 26619
author:
type: added
---
title: Add terraform report to merge request widget
merge_request: 27700
author:
type: added
---
title: Refresh metrics dashboard data without reloading the page
merge_request: 28756
author:
type: added
---
title: Improve logs filters on mobile, simplify kubernetes API logs filters
merge_request: 27484
author:
type: added
---
title: Improve logs dropdown with more clear labels
merge_request: 26635
author:
type: added
---
title: Add filtered search for elastic search in logs
merge_request: 27654
author:
type: added
---
title: Start merge request for custom dashboard if new branch is provided
merge_request: 27189
author:
type: added
---
title: Reduce number of SQL queries for service templates
merge_request: 27396
author:
type: performance
---
title: Improve performance of the container repository cleanup tags service
merge_request: 27441
author:
type: performance
---
title: Optimize ldap keys counters query performance in usage data
merge_request: 27309
author:
type: performance
---
title: Enable container expiration policies by default for new projects
merge_request: 28480
author:
type: changed
---
title: Add status column to container_registry
merge_request: 28682
author:
type: changed
---
title: Amend GraphQL merge requests resolver to check for project presence
merge_request: 27783
author:
type: fixed
---
title: Add app server type to usage ping
merge_request: 28189
author:
type: added
---
title: Rename "Project Services" to "Integrations" in frontend and docs
merge_request: 26244
author:
type: changed
---
title: Enable Workhorse upload acceleration for Project Import uploads via UI
merge_request: 27332
author:
type: performance
---
title: Add application setting to enable container expiration and retention policies
on pre 12.8 projects
merge_request: 28479
author:
type: added
---
title: Update icons in Sentry Error Tracking list for ignored/resolved errors
merge_request: 27125
author:
type: other
---
title: Optimize ci builds non distinct counters in usage data
merge_request: 28027
author:
type: performance
---
title: Optimize ci builds counters in usage data
merge_request: 27770
author:
type: performance
---
title: Optimize suggestions counters
merge_request: 26443
author:
type: performance
---
title: Fix managed_free_namespaces scope to only groups without a license or a free license
merge_request: 27356
author:
type: fixed
---
title: Move bots functionality to user_type column
merge_request: 26981
author:
type: performance
---
title: Optimize projects_enforcing_code_owner_approval counter query performance for usage ping
merge_request: 27526
author:
type: performance
---
title: Optimize template_repositories query by using batch counting
merge_request: 27352
author:
type: performance
---
title: Optimize projects_reporting_ci_cd_back_to_github query performance for usage data
merge_request: 27533
author:
type: performance
---
title: Optimize projects_service_active queries performance in usage data
merge_request: 27093
author:
type: performance
---
title: Optimize projects_mirrored_with_pipelines_enabled query performance in usage data
merge_request: 27110
author:
type: performance
---
title: Optimize usage ping queries by using batch counting
merge_request: 27455
author:
type: performance
---
title: Consume remaining LinkLFsObjectsProjects jobs
merge_request: 27558
author:
type: other
---
title: Fix not working File upload from Project overview page.
merge_request: 26828
author: Gilang Gumilar
type: fixed
---
title: Cache ES enabled namespaces and projects
merge_request: 27348
author:
type: performance
---
title: Fix incorrect regex used in FileUploader#extract_dynamic_path
merge_request: 28683
author:
type: fixed
---
title: Fix assignee dropdown on new issue page
merge_request: 26971
author:
type: fixed
---
title: Fill user_type for ghost users
merge_request: 27387
author:
type: other
---
title: Make "Value Stream" the default page that appears when clicking the project-level "Analytics" sidebar item.
merge_request: 27279
author: Gilang Gumilar
type: added
---
title: Resolve Improve format support message in issue design
merge_request: 27409
author:
type: fixed
---
title: Revert LDAP readonly attributes feature
merge_request: 28541
author:
type: removed
---
title: Enable log explorer to use the full height of the screen
merge_request: 28312
author:
type: added
---
title: Add correlation_id to project_mirror_data, expose in /import API endpoints
merge_request: 28662
author:
type: changed
---
title: Update aws-ecs image location in CI template
merge_request: 27382
author:
type: changed
---
title: Add cost factor fields to ci runners
merge_request: 27666
author:
type: added
---
title: Fix smartcard config initialization
merge_request: 27560
author:
type: fixed
---
title: Filter out Releases with missing tags
merge_request: 27716
author:
type: fixed
---
title: Update More Pages button on Wiki Page
merge_request: 27499
author:
type: changed
---
title: Add an helper to check if a notification_event is enabled
merge_request: 27880
author: Jacopo Beschi @jacopo-beschi
type: changed
---
title: Fix storage rollback regression caused by previous refactor
merge_request: 28496
author:
type: fixed
---
title: API endpoint to create annotations for environments dashboard
merge_request: 29089
author:
type: added
---
title: Fix incorrect content returned on empty dotfile
merge_request: 28144
author:
type: fixed
---
title: Scope WAF Statistics anomalies to environment.external_url
merge_request: 27466
author:
type: fixed
---
title: Cleanup the descriptions of some fields of GraphQL ProjectType
merge_request: 28735
author:
type: changed
---
title: Add a DB column to track external issue and epic ids when importing from external sources
merge_request: 27522
author:
type: added
---
title: Add jira_imports table to track current jira import progress as well as historical imports data
merge_request: 28108
author:
type: added
---
title: Optimize service desk enabled projects counter
merge_request: 27589
author:
type: performance
---
title: Use faster streaming serializer for project exports
merge_request: 28925
author:
type: performance
---
title: Enable streaming serializer feature flag by default.
merge_request: 27813
author:
type: performance
---
title: Revert user bio back to non-italicized font to fix rendering of emojis
merge_request: 27693
author:
type: fixed
---
title: Fix invalid class option for ionice
merge_request: 28023
author:
type: fixed
---
title: Add management_project_id to group and project cluster creation, clarifies
docs.
merge_request: 28289
author:
type: fixed
---
title: Fix Slack notifications when upgrading from old GitLab versions
merge_request: 29111
author:
type: fixed
---
title: Resolve Snippet creation failure bug
merge_request: 27891
author:
type: fixed
---
title: Add event tracking to Container regstry quickstart
merge_request: 27990
author:
type: changed
---
title: Add environment-state flag to metrics data
merge_request: 28237
author:
type: added
---
title: Harden jira usage data
merge_request: 27973
author:
type: performance
---
title: Add `discussion_locked` to Webhook
merge_request: 28018
author:
type: fixed
---
title: Remove feature flag 'export_fast_serialize' and 'export_fast_serialize_with_raw_json'
merge_request: 28037
author:
type: performance
---
title: Fix deploy token API to properly delete all associated deploy token records
merge_request: 28156
author:
type: fixed
---
title: Fix Gitlab::Auth to handle orphaned oauth tokens
merge_request: 28159
author:
type: fixed
---
title: Provide configuration options for Static Site Editor
merge_request: 29058
author:
type: added
---
title: 'fix: Publish toolbar dissappears when submitting empty content'
merge_request: 29410
author:
type: fixed
---
title: Save changes in Static Site Editor using REST GitLab API
merge_request: 29286
author:
type: added
---
title: Remove unnecessary index index_ci_builds_on_name_for_security_reports_values
merge_request: 28224
author:
type: performance
---
title: Resolve Snippet actions with binary data
merge_request: 28191
author:
type: fixed
---
title: Improve message when promoting project labels
merge_request: 28265
author:
type: other
---
title: Group level container registry show subgroups repos
merge_request: 29263
author:
type: fixed
---
title: Fix missing synthetic milestone change notes for disabled milestone change event tracking feature flag
merge_request: 28440
author:
type: fixed
---
title: Disallow distinct count for regular batch count
merge_request: 28518
author:
type: performance
---
title: Optimize issues with embedded grafana charts usage counter
merge_request: 28936
author:
type: performance
---
title: Remove design management as a license feature
merge_request: 28589
author:
type: added
---
title: Adjust label title applied to issues on import from Jira
merge_request: 29246
author:
type: changed
---
title: Add autostop check to folder table
merge_request: 28937
author:
type: fixed
---
title: Fix styling of MR dropdown in Web IDE
merge_request: 28746
author:
type: fixed
---
title: Elasticsearch recommendation alert does not appears while screen is loaded
merge_request: 29097
author:
type: fixed
---
title: Resolve Snippet update error with version flag disabled
merge_request: 28815
author:
type: fixed
---
title: Use NOT VALID to enforce a NOT NULL constraint on file_store to ci_job_artifacts,
lfs_objects and uploads tables
merge_request: 28946
author:
type: fixed
---
title: Add jira issues import feature
merge_request:
author:
type: added
---
title: Optimize projects with repositories enabled usage data
merge_request: 29117
author:
type: performance
---
title: Optimize protected branches usage data
merge_request: 29148
author:
type: performance
---
title: Allow sorting of issue and MR discussions
merge_request: 29492
author:
type: added
---
title: Deprecate 'token' attribute from Runners API
merge_request: 29481
author:
type: deprecated
---
title: Fix dashboard processing error which prevented dashboards with unknown attributes
inside panels from being displayed
merge_request: 29517
author:
type: fixed
---
title: Add write_registry scope to deploy tokens for container registry push access
merge_request: 28958
author:
type: added
---
title: >
#42671: Project and group storage statistics now support values up to 8 PiB (up from 4GiB)
merge_request: 23131
author: Matthias van de Meent
type: fixed
---
title: Update board scopes when promoting a label
merge_request: 27662
author:
type: fixed
---
title: Enable container registry at the group level
merge_request: 27814
author:
type: added
---
title: 'Fix for issue 26426: Details of runners of nested groups of an owned group
are now available for users with enough permissions'
merge_request: 24169
author: nachootal@gmail.com
type: changed
---
title: Move Alerting feature to Core
merge_request: 28196
author:
type: changed
---
title: Update discord notifications to be a single embed and include log messages
merge_request: 27812
author: Sam Bingner
type: fixed
---
title: Fix display of PyCharm generated Jupyter notebooks
merge_request: 28810
author: Jan Beckmann
type: fixed
---
title: Fix some Web IDE bugs with empty projects
merge_request: 25463
author:
type: fixed
---
title: Fix missing group icons on profile page when screen < 576px
merge_request: 28973
author:
type: fixed
---
title: Add API endpoint to get users without projects
merge_request: 29347
author:
type: added
---
title: Set commit status to failed if the TeamCity connection is refused
merge_request: 27395
author:
type: fixed
---
title: Add auto_ssl_failed to pages_domains
merge_request: 27671
author:
type: added
---
title: Adds wiki metadata models
merge_request: 26529
author:
type: added
---
title: Support wiki events in activity streams
merge_request: 23869
author:
type: changed
---
title: Migrate legacy uploads out of deprecated paths
merge_request: 29295
author:
type: fixed
---
title: Improve pagination in discussions API
merge_request: 27697
author:
type: performance
---
title: Add DS_REMEDIATE env var to dependency scanning template
merge_request: 27947
author:
type: added
---
title: New package list is enabled which includes filtering by type
merge_request: 18860
author:
type: added
---
title: Only display mirrored URL to users who can manage Repository settings
merge_request: 27166
author:
type: changed
---
title: Fix pagination in Merge Request GraphQL api
merge_request: 28667
author: briankabiro
type: fixed
---
title: Provide link to a survey for Knative users
merge_request: 23025
author:
type: other
---
title: Return 202 for command only notes in REST API
merge_request: 19624
author:
type: fixed
---
title: Use CTE optimization for searching board issues
merge_request: 28430
author:
type: fixed
---
title: Show only active environments in monitoring dropdown
merge_request: 28456
author:
type: changed
---
title: Add ability to search by environment state in environments GraphQL API
merge_request: 28567
author:
type: changed
---
title: Create a rake task to cleanup unused LFS files
merge_request: 21747
author:
type: added
---
title: Add grab cursor for operations dashboard cards
merge_request: 28868
author:
type: changed
---
title: Add cluster management project template
merge_request: 25318
author:
type: added
---
title: Allow external diff files to be removed
merge_request: 27602
author:
type: changed
---
title: Add index for created_at of resource_milestone_events
merge_request: 28929
author:
type: performance
---
title: Adds features to delete stopped environments
merge_request: 22629
author:
type: added
---
title: Move 'Additional Metrics' feature to GitLab Core
merge_request: 28527
author:
type: changed
---
title: Introduce rate limit for creating issues via web UI
merge_request: 28129
author:
type: performance
---
title: Migrate .fa-spinner to .spinner for app/views/ci/variables
merge_request: 25030
author: nuwe1
type: other
---
title: Migrate .fa-spinner to .spinner for app/views/groups
merge_request: 25053
author: nuwe1
type: other
---
title: Migrate .fa-spinner to .spinner for app/views/projects/mirrors
merge_request: 25041
author: nuwe1
type: other
---
title: Migrate .fa-spinner to .spinner for app/views/projects/network
merge_request: 25050
author: nuwe1
type: other
---
title: Migrate .fa-spinner to .spinner for app/views/shared/notes
merge_request: 25028
author: nuwe1
type: other
---
title: Migrate .fa-spinner to .spinner for ee/app/views/projects/settings
merge_request: 25038
author: nuwe1
type: other
---
title: Fully qualify id columns for keyset pagination (Projects API)
merge_request: 29026
author:
type: fixed
---
title: Convert schema to plain SQL using structure.sql
merge_request: 22808
author:
type: other
---
title: Add healthy column to clusters_applications_prometheus table
merge_request: 26168
author:
type: added
---
title: Add bar chart support to monitoring dashboard
merge_request: 27155
author:
type: added
---
title: Add status endpoint to Pages Internal API
merge_request: 28743
author:
type: added
---
title: Add missing track_exception() call to Ci::CreateJobArtifactsService
merge_request: 27954
author:
type: other
---
title: Create operations_user_lists table
merge_request: 28822
author:
type: added
---
title: Add Gitlab User-Agent to ContainerRegistry::Client
merge_request: 29294
author: Sashi Kumar
type: other
---
title: Add wildcard case in documentation for artifacts
merge_request:
author: Fábio Matavelli
type: added
---
title: Add Fluentd table for cluster apps
merge_request: 28844
author:
type: added
---
title: Add atomic and cleanup-on-fail parameters for Helm
merge_request: 27721
author:
type: changed
---
title: Add option for switching between blocking and logging for WAF
merge_request: 27133
author:
type: added
---
title: WAF settings will be read-only if there is a new version of ingress available
merge_request: 27845
author:
type: changed
---
title: Remove duplicate show spec in admin routing
merge_request: 28790
author: Rajendra Kadam
type: changed
---
title: Accept `author_username` as a param in Merge Requests API
merge_request: 28100
author:
type: changed
---
title: Read metadata from Wiki front-matter
merge_request: 27706
author:
type: added
---
title: Add all pods view to logs explorer
merge_request: 26883
author:
type: added
---
title: Fix 500 error on profile/chat_names for deleted projects
merge_request: 24341
author:
type: fixed
---
title: Add tooltips with full path to file headers on file tree
merge_request: 27437
author:
type: fixed
---
title: Make all HTTPS cookies set SameSite to none
merge_request: 28205
author:
type: fixed
---
title: Move prepend to last line in finders files
merge_request: 29274
author: Rajendra Kadam
type: fixed
---
title: Move prepend to last line in app serializers
merge_request: 29332
author: Rajendra Kadam
type: fixed
---
title: Move prepend to last line in app workers and uploaders
merge_request: 29379
author: Rajendra Kadam
type: fixed
---
title: Update ApplicationLimits to prefer defaults
merge_request: 27574
author:
type: changed
---
title: Use different approval icon if current user approved
merge_request: 28290
author: Steffen Köhler
type: changed
---
title: Support Asciidoc docname attribute
merge_request: 22313
author: Jouke Witteveen
type: added
---
title: Avoid scheduling duplicate sidekiq jobs
merge_request: 29116
author:
type: performance
---
title: Remove duplicate spec from changelog spec
merge_request: 28801
author: Rajendra Kadam
type: added
---
title: Conditional mocking of admin mode in specs by directory
merge_request: 28420
author: Diego Louzán
type: other
---
title: Complete the migration of Job Artifact to Security Scan
merge_request: 24244
author:
type: other
---
title: Remove duplicate spec from closing issue spec
merge_request: 28803
author: Rajendra Kadam
type: added
---
title: Move prepend to last line in commit status presenter
merge_request: 29328
author: Rajendra Kadam
type: fixed
---
title: Add possibility to conigure additional rails hosts with env variable
merge_request: 28133
author:
type: other
---
title: Token creation uses HTTP status CREATED
merge_request: 28587
author:
type: fixed
---
title: Include LDAP UID attribute in default attributes for all LDAP lookups
merge_request: 28148
author:
type: fixed
---
title: Add support for Okta as a SCIM provider
merge_request: 25649
author:
type: added
---
title: Renamed Contribution Charts as Repository Analytics
merge_request: 28162
author:
type: changed
---
title: Replaced old-style buttons with the new ones on Snippet view
merge_request: 28614
author:
type: other
---
title: "Add Swift Dockerfile to GitLab templates"
merge_request: 28035
author:
type: added
---
title: Align color and font-weight styles of heading elements and their typography
classes
merge_request: 28422
author:
type: other
---
title: Remove unused index for vulnerability severity levels
merge_request: 29023
author:
type: other
---
title: Move some global routes to - scope
merge_request: 27106
author:
type: changed
---
title: Store daily code coverages into ci_daily_report_results table
merge_request: 24695
author:
type: added
---
title: Fix daily report result to use average of coverage values if there are multiple builds for a given group
name
merge_request: 28556
author:
type: fixed
---
title: Fix duplicate spec in environment finder
merge_request: 28857
author: Rajendra Kadam
type: added
---
title: Expose created_at property in Groups API
merge_request: 27824
author:
type: added
---
title: Add toggle all discussions button to MRs
merge_request: 24670
author: Martin Hobert & Diego Louzán
type: added
---
title: Add last_activity_before and last_activity_after filter to /api/projects endpoint
merge_request: 28221
author: Roger Meier
type: added
---
title: Show storage size on project page
merge_request: 27724
author: Roger Meier
type: added
---
title: Add api endpoint to get x509 signature
merge_request: 28590
author: Roger Meier
type: added
---
title: Add rake task to update x509 signatures
merge_request: 28406
author: Roger Meier
type: added
---
title: Fix duplicate spec in filter issues
merge_request: 28860
author: Rajendra Kadam
type: added
---
title: Prevent false positives in Ci::Pipeline#all_merge_requests
merge_request: 28800
author:
type: fixed
---
title: Fix filtered search tokenization
merge_request: 27648
author:
type: fixed
---
title: Fix name of approvals column in merge requests
merge_request: 28274
author: Steffen Köhler
type: fixed
---
title: Fix optional params for deploy token API
merge_request: 27961
author: Nejc Habjan
type: fixed
---
title: Enable toggle all discussions button for logged out users
merge_request: 28809
author: Diego Louzán
type: fixed
---
title: Fix invalid ancestor group milestones when moving projects
merge_request: 27262
author:
type: fixed
---
title: Fix keyboard shortcut to navigate to dashboard activity
merge_request: 28985
author: Victor Wu
type: other
---
title: Fix keyboard shortcut to navigate to your groups
merge_request: 28873
author: Victor Wu
type: other
---
title: Normalize signature mime types when filtering attachments in emails
merge_request: 28865
author: Diego Louzán
type: fixed
---
title: Fix OpenAPI file detector
merge_request: 27321
author: Roger Meier
type: fixed
---
title: Fix 500 error on create release API when providing an invalid tag_name
merge_request: 28969
author: Sashi Kumar
type: fixed
---
title: Fix bug issue template handling of markdown
merge_request: 27808
author: Lee Tickett
type: fixed
---
title: Fix logic for ingress can_uninstall?
merge_request: 27729
author:
type: fixed
---
title: Fix bug tracking snippet shard name
merge_request: 27979
author:
type: fixed
---
title: Fix race condition updating snippet without repository
merge_request: 28851
author:
type: fixed
---
title: Ensure freshness of settings with snippet creation
merge_request: 27897
author:
type: changed
---
title: Show the proper information in snippet edit form
merge_request: 27479
author:
type: fixed
---
title: Check first if feature flag version_snippet is enabled
merge_request: 28352
author:
type: fixed
---
title: Update copy when snippet git feature disabled
merge_request: 28913
author:
type: changed
---
title: Reuse default generated snippet file name in repository
merge_request: 27673
author:
type: fixed
---
title: Show snippet error update to the user
merge_request: 28516
author:
type: changed
---
title: Render snippet repository blobs
merge_request: 28085
author:
type: changed
---
title: Update copies in Admin Panel > Repository Storage section
merge_request: 27986
author:
type: changed
---
title: Add forking_access_level to projects API
merge_request: 27514
author: Mathieu Parent
type: added
---
title: Add Bitbucket Importer metrics
merge_request: 27524
author:
type: other
---
title: Ensure members are always added on Project Import when importing as admin
merge_request: 29046
author:
type: fixed
---
title: Allow award emoji same name & user duplicates when Importing
merge_request: 28588
author:
type: fixed
---
title: Log member additions when importing Project/Group
merge_request: 27930
author:
type: other
---
title: Exclude 'trial_ends_on', 'shared_runners_minutes_limit' & 'extra_shared_runners_minutes_limit' from list of exported Group attributes
merge_request: 29259
author:
type: fixed
---
title: Better error message when importing a Github project and Github API rate limit is exceeded
merge_request: 28785
author:
type: fixed
---
title: Add missing spec for gitlab schema
merge_request: 28855
author: Rajendra Kadam
type: added
---
title: Fix processing of GrapqhQL query complexity based on used resolvers.
merge_request: 27652
author:
type: fixed
---
title: Expose basic project services attributes through GraphQL
merge_request: 28234
author:
type: added
---
title: Fix bug inviting members whose emails start with numbers
merge_request: 27848
author: Lee Tickett
type: fixed
---
title: Use diff-stats for calculating raw diffs modified paths
merge_request: 29134
author:
type: performance
---
title: Remove blobs_fetch_in_batches feature flag
merge_request: 29069
author:
type: added
---
title: Show object access warning when disabling repo LFS
merge_request: 26696
author:
type: other
---
title: Reduce SQL queries when rendering webhook settings
merge_request: 27359
author:
type: performance
---
title: Include MR times in Milestone time overview
merge_request: 28519
author: Bob van de Vijver
type: fixed
---
title: Use concern instead of service to update highest role
merge_request: 28791
author:
type: other
---
title: Limits issues displayed on milestones
merge_request: 23102
author:
type: performance
---
title: Prevent ProjectUpdateRepositoryStorageWorker from moving to same filesystem
merge_request: 28469
author:
type: fixed
---
title: Add Praefect rake task to print out replica checksums
merge_request: 28369
author:
type: added
---
title: Allow querying of Jira imports and their status via GraphQL
merge_request: 27587
author:
type: added
---
title: Change the link to chart copy text
merge_request: 28371
author:
type: other
---
title: Change the url when the timeslider changes
merge_request: 27726
author:
type: changed
---
title: Fix single stat panel percentile format support
merge_request: 28365
author:
type: fixed
---
title: Change redo for retry icon in metrics dashboard
merge_request: 28670
author:
type: other
---
title: Add API endpoint to list runners for a group
merge_request: 26328
author:
type: added
---
title: Reduce urgency of EmailsOnPushWorker
merge_request: 28783
author:
type: other
---
title: Add file-based pipeline conditions to default Auto DevOps CI template
merge_request: 28242
author:
type: changed
---
title: Return error message for create_merge_request
merge_request: 28482
author:
type: fixed
---
title: Fix duplciate spec in merge requests
merge_request: 28856
author: Rajendra Kadam
type: added
---
title: Fix redundant query execution when loading board issues
merge_request: 27505
author:
type: performance
---
title: Add metrics dashboard annotation model, relation, policy, create and delete services. To provide interface for create and delete operations.
merge_request: 27583
author:
type: added
---
title: Add graphQL interface to fetch metrics dashboard
merge_request: 29112
author:
type: added
---
title: Automatically assign id to each panel within dashboard to support panel scoped annotations
merge_request: 28341
author:
type: added
---
title: Migrate the database to activate projects prometheus service integration for
projects with prometheus installed on shared k8s cluster.
merge_request: 24684
author:
type: fixed
---
title: Update informational text on Edit Release page
merge_request: 28938
author:
type: changed
---
title: Allow Release links to be edited on the Edit Release page
merge_request: 28816
author:
type: added
---
title: Fix Releases page for Guest users of private projects
merge_request: 28447
author:
type: fixed
---
title: Add namespace_storage_size_limit to application settings
merge_request: 27786
author:
type: added
---
title: Add placeholders to broadcast message notifications
merge_request:
author:
type: added
---
title: Add namespace storage size limit setting
merge_request:
author:
type: added
---
title: Normalize error message between Gitea and Fogbugz importers
merge_request: 28802
author:
type: other
---
title: Update duplicate specs in notification service spec
merge_request: 28742
author: Rajendra Kadam
type: fixed
---
title: Support custom graceful timeout for Sidekiq Cluster processes
merge_request: 27710
author:
type: added
---
title: Detect skipped specs in JUnit reports and set TestCase status
merge_request: 28053
author:
type: fixed
---
title: Remove 'error' from diff note error message
merge_request: 29281
author:
type: fixed
---
title: Fix merge request thread’s icon buttons color
merge_request: 28465
author:
type: other
---
title: Fixes the repository Vue router not working with Chinese characters
merge_request: 27494
author:
type: fixed
---
title: Increase the timing of polling for the merge request widget
merge_request:
author:
type: changed
---
title: Fixed whitespace toggle not showing the correct diff
merge_request:
author:
type: fixed
---
title: Fixed upload file creating a file in the wrong directory
merge_request:
author:
type: fixed
---
title: Fix new file not being created in non-ascii character folders
merge_request: 26165
author:
type: fixed
---
title: Use rich icons for thw rows on the file tree
merge_request: 28112
author:
type: changed
---
title: Remove duplicate specs in pipeline message spec
merge_request: 28664
author: Rajendra Kadam
type: added
---
title: Update Gitaly to 12.9.0-rc5
merge_request: 27631
author:
type: added
---
title: Populate user_highest_roles table
merge_request: 27127
author:
type: added
---
title: Change project_export_worker urgency to throttled
merge_request: 27941
author:
type: other
---
title: Filter health endpoint metrics
merge_request: 27847
author:
type: added
---
title: Allow defining of metric step in dashboard yml
merge_request: 28247
author:
type: added
---
title: Add grape custom validator for git reference params
merge_request: 26102
author: Rajendra Kadam
type: added
---
title: Remove duplicate specs in ability model
merge_request: 28644
author: Rajendra Kadam
type: added
---
title: Disable lookup of other ActiveSessions to determine admin mode status
merge_request: 27318
author: Diego Louzán
type: changed
---
title: Fix build duplicate spec
merge_request: 28633
author: Rajendra Kadam
type: added
---
title: Fix issuable duplicate spec
merge_request: 28632
author: Rajendra Kadam
type: added
---
title: Refactor duplicate member specs
merge_request: 28574
author: Rajendra Kadam
type: added
---
title: Remove duplicate specs in update service spec
merge_request: 28650
author: Rajendra Kadam
type: added
---
title: Remove repeated examples in user model specs
merge_request: 28450
author: Rajendra Kadam
type: changed
---
title: Extract X509::Signature from X509::Commit
merge_request: 27327
author: Roger Meier
type: changed
---
title: Refactor push rules and add push_rule_id columns in project settings and application settings
merge_request: 28286
author:
type: added
---
title: Refactor duplicate specs in wiki page specs
merge_request: 28551
author: Rajendra Kadam
type: added
---
title: Fix duplicate spec in factory relation spec
merge_request: 28794
author: Rajendra Kadam
type: added
---
title: Validate dependency on job generating a CI config when using dynamic child pipelines
merge_request: 28901
author:
type: added
---
title: Prefetch DNS for asset host
merge_request: 26868
author:
type: performance
---
title: Remove deprecated /ci/lint page
merge_request: 28562
author:
type: removed
---
title: Remove health_status column from epics
merge_request: 26302
author:
type: other
---
title: Remove new issue tooltip
merge_request: 28261
author: Victor Wu
type: other
---
title: Create merge request pipelines in background jobs
merge_request: 28024
author:
type: performance
---
title: Enable last user activity logging on the REST API
merge_request: 28755
author:
type: added
---
title: Remove `ci_dag_support` feature flag
merge_request: 28863
author: Lee Tickett
type: added
---
title: Use id instead of cve where possible when parsing remediations
merge_request: 27815
author:
type: other
---
title: Remove User's association max_access_level_membership
merge_request: 28757
author:
type: other
---
title: Replace underscore with lodash for ./app/assets/javascripts/vue_shared
merge_request: 25108
author: Tobias Spagert
type: other
---
title: Add missing docstring to Prometheus metric
merge_request: 27868
author:
type: fixed
---
title: Allow self monitoring project to query internal Prometheus even when "Allow local requests in webhooks and services" setting is false
merge_request: 27865
author:
type: fixed
---
title: "Run SAST using awk to pass env variables directly to docker without creating .env file"
merge_request: 21174
author: Florian Gaultier
type: fixed
---
title: Separate validators into own class files
merge_request: 28266
author: Rajendra Kadam
type: added
---
title: Add index on users.unlock_token
merge_request: 276298
author:
type: performance
---
title: Stringify Sidekiq job args in exception logs
merge_request: 28996
author:
type: fixed
---
title: Gracefully handle missing latest CI pipeline
merge_request: 28263
author:
type: fixed
---
title: Improve error message in DAST CI template
merge_request: 29388
author:
type: other
---
title: Log Redis call count and duration to log files
merge_request: 27735
author:
type: other
---
title: Make Rails.cache and Gitlab::Redis::Cache share the same Redis connection pool
merge_request: 28074
author:
type: performance
---
title: Display cluster type in cluster info page
merge_request: 27366
author:
type: added
---
title: Refactor projects/:id/packages API to supply only necessary params to PackagesFinder
merge_request: 29052
author: Sashi Kumar
type: other
---
title: Make pipeline info in chat notifications concise
merge_request: 28284
author:
type: changed
---
title: Allow to start Jira import through graphql mutation
merge_request: 27684
author:
type: added
---
title: Add support for dot (.) in variables masking
merge_request: 29022
author:
type: changed
---
title: Show multimetric embeds on a single chart
merge_request: 28841
author:
type: fixed
---
title: Add support for database-independent embedded metric charts
merge_request: 28618
author:
type: added
---
title: Fix duplicate spec in template dropdown spec
merge_request: 28858
author: Rajendra Kadam
type: added
---
title: Allow embedded metrics charts to be hidden
merge_request: 23929
author:
type: added
---
title: Add initial support for Cloud Native Buildpacks in Auto DevOps builds
merge_request: 28165
author:
type: added
---
title: Fix failing ci variable e2e test
merge_request: 25924
author:
type: fixed
---
title: Update Auto DevOps docker version to 19.03.8
merge_request: 29081
author:
type: changed
---
title: Update GitLab Elasticsearch Indexer
merge_request: 29256
author:
type: other
---
title: Update GitLab Runner Helm Chart to 0.15.0
merge_request: 27670
author:
type: other
---
title: Update GitLab Shell to v12.1.0
merge_request: 29167
author:
type: other
---
title: Update duplicate specs in update large table spec
merge_request: 28787
author: Rajendra Kadam
type: added
---
title: Update user's highest role to keep the users statistics up to date
merge_request: 28087
author:
type: added
---
title: Update user's highest role to keep the users statistics up to date
merge_request: 27231
author:
type: added
---
title: Updated spinner next to forking message
merge_request: 28506
author: Victor Wu
type: other
---
title: Show user statistics in admin area also in CE, and use daily generated data for these statistics
merge_request: 27345
author:
type: changed
---
title: Add metric to derive new users count
merge_request: 27351
author:
type: added
---
title: Fix duplicate spec from user helper spec
merge_request: 28854
author: Rajendra Kadam
type: added
---
title: Fix duplicate spec in user post diff notes
merge_request: 28859
author: Rajendra Kadam
type: added
---
title: Add daily job to create users statistics
merge_request: 27883
author:
type: added
---
title: Fix GraphQL SnippetType repo urls
merge_request: 28673
author:
type: fixed
---
title: Replace deprecated GlLoadingIcon sizes
merge_request: 29417
author:
type: fixed
---
title: Don't send 'accept-encoding' in HttpIO requests
merge_request: 28239
author:
type: fixed
---
title: Remove duplicate spec in web hook service spec
merge_request: 28669
author: Rajendra Kadam
type: fixed
constraint = lambda { |request| request.env['warden'].authenticate? && request.env['warden'].user.admin? } constraints ::Constraints::AdminConstrainer.new do
constraints constraint do
mount Sidekiq::Web, at: '/admin/sidekiq', as: :sidekiq mount Sidekiq::Web, at: '/admin/sidekiq', as: :sidekiq
end end
# frozen_string_literal: true
class AddPushRulesIdToProjectSettings < ActiveRecord::Migration[6.0]
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
def up
with_lock_retries do
add_column :project_settings, :push_rule_id, :bigint
end
end
def down
with_lock_retries do
remove_column :project_settings, :push_rule_id
end
end
end
# frozen_string_literal: true
class AddPushRulesForeignKeyToProjectSettings < ActiveRecord::Migration[6.0]
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
disable_ddl_transaction!
def up
add_concurrent_index :project_settings, :push_rule_id, unique: true
add_concurrent_foreign_key :project_settings, :push_rules, column: :push_rule_id, on_delete: :cascade
end
def down
remove_foreign_key_if_exists :project_settings, column: :push_rule_id
remove_concurrent_index :project_settings, :push_rule_id
end
end
# frozen_string_literal: true
class AddPushRulesIdToApplicationSettings < ActiveRecord::Migration[6.0]
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
def up
with_lock_retries do
add_column :application_settings, :push_rule_id, :bigint
end
end
def down
with_lock_retries do
remove_column :application_settings, :push_rule_id
end
end
end
# frozen_string_literal: true
class AddPushRulesForeignKeyToApplicationSettings < ActiveRecord::Migration[6.0]
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
disable_ddl_transaction!
def up
add_concurrent_index :application_settings, :push_rule_id, unique: true
add_concurrent_foreign_key :application_settings, :push_rules, column: :push_rule_id, on_delete: :nullify
end
def down
remove_concurrent_index :application_settings, :push_rule_id
remove_foreign_key_if_exists :application_settings, column: :push_rule_id
end
end
# frozen_string_literal: true
class ScheduleBackfillPushRulesIdInProjects < ActiveRecord::Migration[6.0]
include Gitlab::Database::MigrationHelpers
disable_ddl_transaction!
MIGRATION = 'BackfillPushRulesIdInProjects'.freeze
BATCH_SIZE = 1_000
class PushRules < ActiveRecord::Base
include EachBatch
self.table_name = 'push_rules'
end
def up
# Update one record that is connected to the instance
value_to_be_updated_to = ScheduleBackfillPushRulesIdInProjects::PushRules.find_by(is_sample: true)&.id
execute "UPDATE application_settings SET push_rule_id = #{value_to_be_updated_to}" if value_to_be_updated_to
ApplicationSetting.expire
queue_background_migration_jobs_by_range_at_intervals(ScheduleBackfillPushRulesIdInProjects::PushRules,
MIGRATION,
5.minutes,
batch_size: BATCH_SIZE)
end
def down
execute "UPDATE application_settings SET push_rule_id = NULL"
ApplicationSetting.expire
end
end
...@@ -399,7 +399,8 @@ CREATE TABLE public.application_settings ( ...@@ -399,7 +399,8 @@ CREATE TABLE public.application_settings (
namespace_storage_size_limit bigint DEFAULT 0 NOT NULL, namespace_storage_size_limit bigint DEFAULT 0 NOT NULL,
seat_link_enabled boolean DEFAULT true NOT NULL, seat_link_enabled boolean DEFAULT true NOT NULL,
container_expiration_policies_enable_historic_entries boolean DEFAULT false NOT NULL, container_expiration_policies_enable_historic_entries boolean DEFAULT false NOT NULL,
issues_create_limit integer DEFAULT 300 NOT NULL issues_create_limit integer DEFAULT 300 NOT NULL,
push_rule_id bigint
); );
CREATE SEQUENCE public.application_settings_id_seq CREATE SEQUENCE public.application_settings_id_seq
...@@ -5025,7 +5026,8 @@ ALTER SEQUENCE public.project_repository_states_id_seq OWNED BY public.project_r ...@@ -5025,7 +5026,8 @@ ALTER SEQUENCE public.project_repository_states_id_seq OWNED BY public.project_r
CREATE TABLE public.project_settings ( CREATE TABLE public.project_settings (
project_id integer NOT NULL, project_id integer NOT NULL,
created_at timestamp with time zone NOT NULL, created_at timestamp with time zone NOT NULL,
updated_at timestamp with time zone NOT NULL updated_at timestamp with time zone NOT NULL,
push_rule_id bigint
); );
CREATE TABLE public.project_statistics ( CREATE TABLE public.project_statistics (
...@@ -8677,6 +8679,8 @@ CREATE INDEX index_application_settings_on_file_template_project_id ON public.ap ...@@ -8677,6 +8679,8 @@ CREATE INDEX index_application_settings_on_file_template_project_id ON public.ap
CREATE INDEX index_application_settings_on_instance_administrators_group_id ON public.application_settings USING btree (instance_administrators_group_id); CREATE INDEX index_application_settings_on_instance_administrators_group_id ON public.application_settings USING btree (instance_administrators_group_id);
CREATE UNIQUE INDEX index_application_settings_on_push_rule_id ON public.application_settings USING btree (push_rule_id);
CREATE INDEX index_application_settings_on_usage_stats_set_by_user_id ON public.application_settings USING btree (usage_stats_set_by_user_id); CREATE INDEX index_application_settings_on_usage_stats_set_by_user_id ON public.application_settings USING btree (usage_stats_set_by_user_id);
CREATE INDEX index_applicationsettings_on_instance_administration_project_id ON public.application_settings USING btree (instance_administration_project_id); CREATE INDEX index_applicationsettings_on_instance_administration_project_id ON public.application_settings USING btree (instance_administration_project_id);
...@@ -9891,6 +9895,8 @@ CREATE INDEX index_project_repositories_on_shard_id ON public.project_repositori ...@@ -9891,6 +9895,8 @@ CREATE INDEX index_project_repositories_on_shard_id ON public.project_repositori
CREATE UNIQUE INDEX index_project_repository_states_on_project_id ON public.project_repository_states USING btree (project_id); CREATE UNIQUE INDEX index_project_repository_states_on_project_id ON public.project_repository_states USING btree (project_id);
CREATE UNIQUE INDEX index_project_settings_on_push_rule_id ON public.project_settings USING btree (push_rule_id);
CREATE INDEX index_project_statistics_on_namespace_id ON public.project_statistics USING btree (namespace_id); CREATE INDEX index_project_statistics_on_namespace_id ON public.project_statistics USING btree (namespace_id);
CREATE UNIQUE INDEX index_project_statistics_on_project_id ON public.project_statistics USING btree (project_id); CREATE UNIQUE INDEX index_project_statistics_on_project_id ON public.project_statistics USING btree (project_id);
...@@ -10636,6 +10642,9 @@ ALTER TABLE ONLY public.epics ...@@ -10636,6 +10642,9 @@ ALTER TABLE ONLY public.epics
ALTER TABLE ONLY public.ci_pipelines ALTER TABLE ONLY public.ci_pipelines
ADD CONSTRAINT fk_3d34ab2e06 FOREIGN KEY (pipeline_schedule_id) REFERENCES public.ci_pipeline_schedules(id) ON DELETE SET NULL; ADD CONSTRAINT fk_3d34ab2e06 FOREIGN KEY (pipeline_schedule_id) REFERENCES public.ci_pipeline_schedules(id) ON DELETE SET NULL;
ALTER TABLE ONLY public.project_settings
ADD CONSTRAINT fk_413a953e20 FOREIGN KEY (push_rule_id) REFERENCES public.push_rules(id) ON DELETE CASCADE;
ALTER TABLE ONLY public.ci_pipeline_schedule_variables ALTER TABLE ONLY public.ci_pipeline_schedule_variables
ADD CONSTRAINT fk_41c35fda51 FOREIGN KEY (pipeline_schedule_id) REFERENCES public.ci_pipeline_schedules(id) ON DELETE CASCADE; ADD CONSTRAINT fk_41c35fda51 FOREIGN KEY (pipeline_schedule_id) REFERENCES public.ci_pipeline_schedules(id) ON DELETE CASCADE;
...@@ -10687,6 +10696,9 @@ ALTER TABLE ONLY public.merge_requests ...@@ -10687,6 +10696,9 @@ ALTER TABLE ONLY public.merge_requests
ALTER TABLE ONLY public.ci_builds ALTER TABLE ONLY public.ci_builds
ADD CONSTRAINT fk_6661f4f0e8 FOREIGN KEY (resource_group_id) REFERENCES public.ci_resource_groups(id) ON DELETE SET NULL; ADD CONSTRAINT fk_6661f4f0e8 FOREIGN KEY (resource_group_id) REFERENCES public.ci_resource_groups(id) ON DELETE SET NULL;
ALTER TABLE ONLY public.application_settings
ADD CONSTRAINT fk_693b8795e4 FOREIGN KEY (push_rule_id) REFERENCES public.push_rules(id) ON DELETE SET NULL;
ALTER TABLE ONLY public.merge_requests ALTER TABLE ONLY public.merge_requests
ADD CONSTRAINT fk_6a5165a692 FOREIGN KEY (milestone_id) REFERENCES public.milestones(id) ON DELETE SET NULL; ADD CONSTRAINT fk_6a5165a692 FOREIGN KEY (milestone_id) REFERENCES public.milestones(id) ON DELETE SET NULL;
...@@ -13113,9 +13125,14 @@ COPY "schema_migrations" (version) FROM STDIN; ...@@ -13113,9 +13125,14 @@ COPY "schema_migrations" (version) FROM STDIN;
20200323134519 20200323134519
20200324093258 20200324093258
20200324115359 20200324115359
20200325104755
20200325104756
20200325104833
20200325104834
20200325111432 20200325111432
20200325152327 20200325152327
20200325160952 20200325160952
20200325162730
20200325183636 20200325183636
20200326114443 20200326114443
20200326122700 20200326122700
......
...@@ -390,7 +390,7 @@ CAUTION: **Caution:** ...@@ -390,7 +390,7 @@ CAUTION: **Caution:**
For performance reasons since For performance reasons since
[GitLab 11.8](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/23931) [GitLab 11.8](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/23931)
and **behind the `api_kaminari_count_with_limit` and **behind the `api_kaminari_count_with_limit`
[feature flag](../development/feature_flags.md)**, if the number of resources is [feature flag](../development/feature_flags/index.md)**, if the number of resources is
more than 10,000, the `X-Total` and `X-Total-Pages` headers as well as the more than 10,000, the `X-Total` and `X-Total-Pages` headers as well as the
`rel="last"` `Link` are not present in the response headers. `rel="last"` `Link` are not present in the response headers.
......
...@@ -740,6 +740,14 @@ the `weight` parameter: ...@@ -740,6 +740,14 @@ the `weight` parameter:
**Note**: The `closed_by` attribute was [introduced in GitLab 10.6](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/17042). This value will only be present for issues which were closed after GitLab 10.6 and when the user account that closed the issue still exists. **Note**: The `closed_by` attribute was [introduced in GitLab 10.6](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/17042). This value will only be present for issues which were closed after GitLab 10.6 and when the user account that closed the issue still exists.
## Rate limits
To help avoid abuse, users are limited to:
| Request Type | Limit |
| ---------------- | --------------------------- |
| Create | 300 issues per minute |
## Edit issue ## Edit issue
Updates an existing project issue. This call is also used to mark an issue as Updates an existing project issue. This call is also used to mark an issue as
......
...@@ -63,7 +63,7 @@ Complementary reads: ...@@ -63,7 +63,7 @@ Complementary reads:
styleguide if you are contributing to the [GraphQL API](../api/graphql/index.md) styleguide if you are contributing to the [GraphQL API](../api/graphql/index.md)
- [Sidekiq guidelines](sidekiq_style_guide.md) for working with Sidekiq workers - [Sidekiq guidelines](sidekiq_style_guide.md) for working with Sidekiq workers
- [Working with Gitaly](gitaly.md) - [Working with Gitaly](gitaly.md)
- [Manage feature flags](feature_flags.md) - [Manage feature flags](feature_flags/index.md)
- [Licensed feature availability](licensed_feature_availability.md) - [Licensed feature availability](licensed_feature_availability.md)
- [View sent emails or preview mailers](emails.md) - [View sent emails or preview mailers](emails.md)
- [Shell commands](shell_commands.md) in the GitLab codebase - [Shell commands](shell_commands.md) in the GitLab codebase
......
...@@ -5,9 +5,9 @@ file, as well as information and history about our changelog process. ...@@ -5,9 +5,9 @@ file, as well as information and history about our changelog process.
## Overview ## Overview
Each bullet point, or **entry**, in our [`CHANGELOG.md`][changelog.md] file is Each bullet point, or **entry**, in our [`CHANGELOG.md`](https://gitlab.com/gitlab-org/gitlab/blob/master/CHANGELOG.md) file is
generated from a single data file in the [`changelogs/unreleased/`][unreleased] generated from a single data file in the [`changelogs/unreleased/`](https://gitlab.com/gitlab-org/gitlab-foss/tree/master/changelogs/)
(or corresponding EE) folder. The file is expected to be a [YAML] file in the (or corresponding EE) folder. The file is expected to be a [YAML](https://en.wikipedia.org/wiki/YAML) file in the
following format: following format:
```yaml ```yaml
...@@ -27,15 +27,12 @@ valid options are: added, fixed, changed, deprecated, removed, security, perform ...@@ -27,15 +27,12 @@ valid options are: added, fixed, changed, deprecated, removed, security, perform
Community contributors and core team members are encouraged to add their name to Community contributors and core team members are encouraged to add their name to
the `author` field. GitLab team members **should not**. the `author` field. GitLab team members **should not**.
[changelog.md]: https://gitlab.com/gitlab-org/gitlab/blob/master/CHANGELOG.md
[unreleased]: https://gitlab.com/gitlab-org/gitlab-foss/tree/master/changelogs/
[YAML]: https://en.wikipedia.org/wiki/YAML
## What warrants a changelog entry? ## What warrants a changelog entry?
- Any change that introduces a database migration, whether it's regular, post, - Any change that introduces a database migration, whether it's regular, post,
or data migration, **must** have a changelog entry. or data migration, **must** have a changelog entry.
- [Security fixes] **must** have a changelog entry, without `merge_request` value - [Security fixes](https://gitlab.com/gitlab-org/release/docs/blob/master/general/security/developer.md)
**must** have a changelog entry, without `merge_request` value
and with `type` set to `security`. and with `type` set to `security`.
- Any user-facing change **should** have a changelog entry. Example: "GitLab now - Any user-facing change **should** have a changelog entry. Example: "GitLab now
uses system fonts for all text." uses system fonts for all text."
...@@ -269,13 +266,14 @@ as the other was merged. When we had dozens of merge requests fighting for the ...@@ -269,13 +266,14 @@ as the other was merged. When we had dozens of merge requests fighting for the
same changelog entry location, this quickly became a major source of merge same changelog entry location, this quickly became a major source of merge
conflicts and delays in development. conflicts and delays in development.
This led us to a [boring solution] of "add your entry in a random location in This led us to a [boring solution](https://about.gitlab.com/handbook/values/#boring-solutions) of "add your entry in a random location in
the list." This actually worked pretty well as we got further along in each the list." This actually worked pretty well as we got further along in each
monthly release cycle, but at the start of a new cycle, when a new version monthly release cycle, but at the start of a new cycle, when a new version
section was added and there were fewer places to "randomly" add an entry, the section was added and there were fewer places to "randomly" add an entry, the
conflicts became a problem again until we had a sufficient number of entries. conflicts became a problem again until we had a sufficient number of entries.
On top of all this, it created an entirely different headache for [release managers] On top of all this, it created an entirely different headache for
[release managers](https://gitlab.com/gitlab-org/release/docs/blob/master/quickstart/release-manager.md)
when they cherry-picked a commit into a stable branch for a patch release. If when they cherry-picked a commit into a stable branch for a patch release. If
the commit included an entry in the `CHANGELOG`, it would include the entire the commit included an entry in the `CHANGELOG`, it would include the entire
changelog for the latest version in `master`, so the release manager would have changelog for the latest version in `master`, so the release manager would have
...@@ -283,16 +281,11 @@ to manually remove the later entries. They often would have had to do this ...@@ -283,16 +281,11 @@ to manually remove the later entries. They often would have had to do this
multiple times per patch release. This was compounded when we had to release multiple times per patch release. This was compounded when we had to release
multiple patches at once due to a security issue. multiple patches at once due to a security issue.
We needed to automate all of this manual work. So we [started brainstorming]. We needed to automate all of this manual work. So we
[started brainstorming](https://gitlab.com/gitlab-org/gitlab-foss/issues/17826).
After much discussion we settled on the current solution of one file per entry, After much discussion we settled on the current solution of one file per entry,
and then compiling the entries into the overall `CHANGELOG.md` file during the and then compiling the entries into the overall `CHANGELOG.md` file during the
[release process]. [release process](https://gitlab.com/gitlab-org/release-tools).
[boring solution]: https://about.gitlab.com/handbook/values/#boring-solutions
[release managers]: https://gitlab.com/gitlab-org/release/docs/blob/master/quickstart/release-manager.md
[started brainstorming]: https://gitlab.com/gitlab-org/gitlab-foss/issues/17826
[release process]: https://gitlab.com/gitlab-org/release-tools
[Security fixes]: https://gitlab.com/gitlab-org/release/docs/blob/master/general/security/developer.md
--- ---
......
...@@ -490,15 +490,11 @@ A good example of collaboration on an MR touching multiple parts of the codebase ...@@ -490,15 +490,11 @@ A good example of collaboration on an MR touching multiple parts of the codebase
### Credits ### Credits
Largely based on the [thoughtbot code review guide]. Largely based on the [thoughtbot code review guide](https://github.com/thoughtbot/guides/tree/master/code-review).
[thoughtbot code review guide]: https://github.com/thoughtbot/guides/tree/master/code-review
--- ---
[Return to Development documentation](README.md) [Return to Development documentation](README.md)
[projects]: https://about.gitlab.com/handbook/engineering/projects/
[build handbook]: https://about.gitlab.com/handbook/build/handbook/build#how-to-work-with-build
[^1]: Please note that specs other than JavaScript specs are considered backend code. [^1]: Please note that specs other than JavaScript specs are considered backend code.
[^2]: We encourage you to seek guidance from a database maintainer if your merge request is potentially introducing expensive queries. It is most efficient to comment on the line of code in question with the SQL queries so they can give their advice. [^2]: We encourage you to seek guidance from a database maintainer if your merge request is potentially introducing expensive queries. It is most efficient to comment on the line of code in question with the SQL queries so they can give their advice.
...@@ -402,7 +402,8 @@ below will make it easy to manage this, without unnecessary overhead. ...@@ -402,7 +402,8 @@ below will make it easy to manage this, without unnecessary overhead.
Every monthly release has a corresponding issue on the CE issue tracker to keep Every monthly release has a corresponding issue on the CE issue tracker to keep
track of functionality broken by that release and any fixes that need to be track of functionality broken by that release and any fixes that need to be
included in a patch release (see [8.3 Regressions] as an example). included in a patch release (see
[8.3 Regressions](https://gitlab.com/gitlab-org/gitlab-foss/issues/4127) as an example).
As outlined in the issue description, the intended workflow is to post one note As outlined in the issue description, the intended workflow is to post one note
with a reference to an issue describing the regression, and then to update that with a reference to an issue describing the regression, and then to update that
...@@ -412,11 +413,9 @@ If you're a contributor who doesn't have the required permissions to update ...@@ -412,11 +413,9 @@ If you're a contributor who doesn't have the required permissions to update
other users' notes, please post a new note with a reference to both the issue other users' notes, please post a new note with a reference to both the issue
and the merge request. and the merge request.
The release manager will [update the notes] in the regression issue as fixes are The release manager will
addressed. [update the notes](https://gitlab.com/gitlab-org/release-tools/blob/master/doc/pro-tips.md#update-the-regression-issue)
in the regression issue as fixes are addressed.
[8.3 Regressions]: https://gitlab.com/gitlab-org/gitlab-foss/issues/4127
[update the notes]: https://gitlab.com/gitlab-org/release-tools/blob/master/doc/pro-tips.md#update-the-regression-issue
## Technical and UX debt ## Technical and UX debt
......
...@@ -1349,11 +1349,9 @@ Replace `reconfigure` with `restart` where appropriate. ...@@ -1349,11 +1349,9 @@ Replace `reconfigure` with `restart` where appropriate.
In [step 2 of the installation guide](../../install/installation.md#2-ruby), In [step 2 of the installation guide](../../install/installation.md#2-ruby),
we install Ruby from source. Whenever there is a new version that needs to we install Ruby from source. Whenever there is a new version that needs to
be updated, remember to change it throughout the codeblock and also replace be updated, remember to change it throughout the codeblock and also replace
the sha256sum (it can be found in the [downloads page][ruby-dl] of the Ruby the sha256sum (it can be found in the [downloads page](https://www.ruby-lang.org/en/downloads/) of the Ruby
website). website).
[ruby-dl]: https://www.ruby-lang.org/en/downloads/ "Ruby download website"
### Configuration documentation for source and Omnibus installations ### Configuration documentation for source and Omnibus installations
GitLab currently officially supports two installation methods: installations GitLab currently officially supports two installation methods: installations
...@@ -1380,7 +1378,7 @@ the style below as a guide: ...@@ -1380,7 +1378,7 @@ the style below as a guide:
external_url "https://gitlab.example.com" external_url "https://gitlab.example.com"
``` ```
1. Save the file and [reconfigure] GitLab for the changes to take effect. 1. Save the file and [reconfigure](path/to/administration/restart_gitlab.md#omnibus-gitlab-reconfigure) GitLab for the changes to take effect.
--- ---
...@@ -1393,10 +1391,7 @@ the style below as a guide: ...@@ -1393,10 +1391,7 @@ the style below as a guide:
host: "gitlab.example.com" host: "gitlab.example.com"
``` ```
1. Save the file and [restart] GitLab for the changes to take effect. 1. Save the file and [restart](path/to/administration/restart_gitlab.md#installations-from-source) GitLab for the changes to take effect.
[reconfigure]: path/to/administration/restart_gitlab.md#omnibus-gitlab-reconfigure
[restart]: path/to/administration/restart_gitlab.md#installations-from-source
```` ````
In this case: In this case:
......
...@@ -9,7 +9,8 @@ ...@@ -9,7 +9,8 @@
## Act as CE when unlicensed ## Act as CE when unlicensed
Since the implementation of [GitLab CE features to work with unlicensed EE instance][ee-as-ce] Since the implementation of
[GitLab CE features to work with unlicensed EE instance](https://gitlab.com/gitlab-org/gitlab/issues/2500)
GitLab Enterprise Edition should work like GitLab Community Edition GitLab Enterprise Edition should work like GitLab Community Edition
when no license is active. So EE features always should be guarded by when no license is active. So EE features always should be guarded by
`project.feature_available?` or `group.feature_available?` (or `project.feature_available?` or `group.feature_available?` (or
...@@ -24,8 +25,6 @@ setting the [`FOSS_ONLY` environment variable](https://gitlab.com/gitlab-org/git ...@@ -24,8 +25,6 @@ setting the [`FOSS_ONLY` environment variable](https://gitlab.com/gitlab-org/git
to something that evaluates as `true`. The same works for running tests to something that evaluates as `true`. The same works for running tests
(for example `FOSS_ONLY=1 yarn jest`). (for example `FOSS_ONLY=1 yarn jest`).
[ee-as-ce]: https://gitlab.com/gitlab-org/gitlab/issues/2500
## Separation of EE code ## Separation of EE code
All EE code should be put inside the `ee/` top-level directory. The All EE code should be put inside the `ee/` top-level directory. The
...@@ -53,11 +52,9 @@ is applied not only to models. Here's a list of other examples: ...@@ -53,11 +52,9 @@ is applied not only to models. Here's a list of other examples:
- `ee/app/views/foo/_bar.html.haml` - `ee/app/views/foo/_bar.html.haml`
This works because for every path that is present in CE's eager-load/auto-load This works because for every path that is present in CE's eager-load/auto-load
paths, we add the same `ee/`-prepended path in [`config/application.rb`]. paths, we add the same `ee/`-prepended path in [`config/application.rb`](https://gitlab.com/gitlab-org/gitlab/blob/925d3d4ebc7a2c72964ce97623ae41b8af12538d/config/application.rb#L42-52).
This also applies to views. This also applies to views.
[`config/application.rb`]: https://gitlab.com/gitlab-org/gitlab/blob/925d3d4ebc7a2c72964ce97623ae41b8af12538d/config/application.rb#L42-52
### EE features based on CE features ### EE features based on CE features
For features that build on existing CE features, write a module in the `EE` For features that build on existing CE features, write a module in the `EE`
......
...@@ -29,6 +29,11 @@ Monitor stage, Health group. ...@@ -29,6 +29,11 @@ Monitor stage, Health group.
For all production environment Chatops commands, use the `#production` channel. For all production environment Chatops commands, use the `#production` channel.
As per the template, where a feature would have a (potentially) significant user
impact and the feature is being enabled instance wide prior to release, please copy
the Slack message and repost in the `#support_gitlab-com` channel for added visibility
and awareness, preferably with a link to the issue, MR, or docs.
Regardless of the channel in which the Chatops command is ran, any feature flag change that affects GitLab.com will automatically be logged in an issue. Regardless of the channel in which the Chatops command is ran, any feature flag change that affects GitLab.com will automatically be logged in an issue.
The issue is created in the [gl-infra/feature-flag-log](https://gitlab.com/gitlab-com/gl-infra/feature-flag-log/issues?scope=all&utf8=%E2%9C%93&state=closed) project, and it will at minimum log the Slack handle of person enabling a feature flag, the time, and the name of the flag being changed. The issue is created in the [gl-infra/feature-flag-log](https://gitlab.com/gitlab-com/gl-infra/feature-flag-log/issues?scope=all&utf8=%E2%9C%93&state=closed) project, and it will at minimum log the Slack handle of person enabling a feature flag, the time, and the name of the flag being changed.
......
# File Storage in GitLab # File Storage in GitLab
We use the [CarrierWave] gem to handle file upload, store and retrieval. We use the [CarrierWave](https://github.com/carrierwaveuploader/carrierwave) gem to handle file upload, store and retrieval.
File uploads should be accelerated by workhorse, for details please refer to [uploads development documentation](uploads.md). File uploads should be accelerated by workhorse, for details please refer to [uploads development documentation](uploads.md).
...@@ -46,14 +46,14 @@ they are still not 100% standardized. You can see them below: ...@@ -46,14 +46,14 @@ they are still not 100% standardized. You can see them below:
CI Artifacts and LFS Objects behave differently in CE and EE. In CE they inherit the `GitlabUploader` CI Artifacts and LFS Objects behave differently in CE and EE. In CE they inherit the `GitlabUploader`
while in EE they inherit the `ObjectStorage` and store files in and S3 API compatible object store. while in EE they inherit the `ObjectStorage` and store files in and S3 API compatible object store.
In the case of Issues/MR/Notes Markdown attachments, there is a different approach using the [Hashed Storage] layout, In the case of Issues/MR/Notes Markdown attachments, there is a different approach using the [Hashed Storage](../administration/repository_storage_types.md) layout,
instead of basing the path into a mutable variable `:project_path_with_namespace`, it's possible to use the instead of basing the path into a mutable variable `:project_path_with_namespace`, it's possible to use the
hash of the project ID instead, if project migrates to the new approach (introduced in 10.2). hash of the project ID instead, if project migrates to the new approach (introduced in 10.2).
> Note: We provide an [all-in-one Rake task] to migrate all uploads to object > Note: We provide an [all-in-one Rake task](../administration/raketasks/uploads/migrate.md) to migrate all uploads to object
> storage in one go. If a new Uploader class or model type is introduced, make > storage in one go. If a new Uploader class or model type is introduced, make
> sure you add a Rake task invocation corresponding to it to the [category > sure you add a Rake task invocation corresponding to it to the
> list]. > [category list](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/tasks/gitlab/uploads/migrate.rake).
### Path segments ### Path segments
...@@ -144,8 +144,3 @@ class Thing < ActiveRecord::Base ...@@ -144,8 +144,3 @@ class Thing < ActiveRecord::Base
... ...
end end
``` ```
[CarrierWave]: https://github.com/carrierwaveuploader/carrierwave
[Hashed Storage]: ../administration/repository_storage_types.md
[all-in-one rake task]: ../administration/raketasks/uploads/migrate.md
[category list]: https://gitlab.com/gitlab-org/gitlab/blob/master/lib/tasks/gitlab/uploads/migrate.rake
...@@ -9,7 +9,7 @@ when making _backend_ changes that might involve multiple features or [component ...@@ -9,7 +9,7 @@ when making _backend_ changes that might involve multiple features or [component
## Uploads ## Uploads
GitLab supports uploads to [object storage]. That means every feature and GitLab supports uploads to [object storage](https://docs.gitlab.com/charts/advanced/external-object-storage/). That means every feature and
change that affects uploads should also be tested against [object storage], change that affects uploads should also be tested against [object storage],
which is _not_ enabled by default in [GDK](https://gitlab.com/gitlab-org/gitlab-development-kit). which is _not_ enabled by default in [GDK](https://gitlab.com/gitlab-org/gitlab-development-kit).
...@@ -25,5 +25,3 @@ See also [File Storage in GitLab](file_storage.md). ...@@ -25,5 +25,3 @@ See also [File Storage in GitLab](file_storage.md).
GitLab supports a great amount of features for [merge requests](../user/project/merge_requests/index.md). One GitLab supports a great amount of features for [merge requests](../user/project/merge_requests/index.md). One
of them is the ability to create merge requests from and to [forks](../gitlab-basics/fork-project.md), of them is the ability to create merge requests from and to [forks](../gitlab-basics/fork-project.md),
which should also be highly considered and tested upon development phase. which should also be highly considered and tested upon development phase.
[object storage]: https://docs.gitlab.com/charts/advanced/external-object-storage/
...@@ -8,7 +8,7 @@ consistent performance of GitLab. ...@@ -8,7 +8,7 @@ consistent performance of GitLab.
The process of solving performance problems is roughly as follows: The process of solving performance problems is roughly as follows:
1. Make sure there's an issue open somewhere (for example, on the GitLab CE issue 1. Make sure there's an issue open somewhere (for example, on the GitLab CE issue
tracker), and create one if there is not. See [#15607][#15607] for an example. tracker), and create one if there is not. See [#15607](https://gitlab.com/gitlab-org/gitlab-foss/issues/15607) for an example.
1. Measure the performance of the code in a production environment such as 1. Measure the performance of the code in a production environment such as
GitLab.com (see the [Tooling](#tooling) section below). Performance should be GitLab.com (see the [Tooling](#tooling) section below). Performance should be
measured over a period of _at least_ 24 hours. measured over a period of _at least_ 24 hours.
...@@ -495,7 +495,7 @@ just memory but also unnecessary time spent in CPU and I/O for processing lines ...@@ -495,7 +495,7 @@ just memory but also unnecessary time spent in CPU and I/O for processing lines
## Anti-Patterns ## Anti-Patterns
This is a collection of [anti-patterns][anti-pattern] that should be avoided This is a collection of [anti-patterns](https://en.wikipedia.org/wiki/Anti-pattern) that should be avoided
unless these changes have a measurable, significant, and positive impact on unless these changes have a measurable, significant, and positive impact on
production environments. production environments.
...@@ -539,6 +539,3 @@ Assuming you are working with ActiveRecord models, you might also find these lin ...@@ -539,6 +539,3 @@ Assuming you are working with ActiveRecord models, you might also find these lin
You may find some useful examples in this snippet: You may find some useful examples in this snippet:
<https://gitlab.com/gitlab-org/gitlab-foss/snippets/33946> <https://gitlab.com/gitlab-org/gitlab-foss/snippets/33946>
[#15607]: https://gitlab.com/gitlab-org/gitlab-foss/issues/15607
[anti-pattern]: https://en.wikipedia.org/wiki/Anti-pattern
...@@ -205,7 +205,7 @@ On the EC2 dashboard, look for Load Balancer in the left navigation bar: ...@@ -205,7 +205,7 @@ On the EC2 dashboard, look for Load Balancer in the left navigation bar:
1. Click **Configure Health Check** and set up a health check for your EC2 instances. 1. Click **Configure Health Check** and set up a health check for your EC2 instances.
1. For **Ping Protocol**, select HTTP. 1. For **Ping Protocol**, select HTTP.
1. For **Ping Port**, enter 80. 1. For **Ping Port**, enter 80.
1. For **Ping Path**, enter `/explore`. (We use `/explore` as it's a public endpoint that does 1. For **Ping Path**, enter `/users/sign_in`. (We use `/users/sign_in` as it's a public endpoint that does
not require authorization.) not require authorization.)
1. Keep the default **Advanced Details** or adjust them according to your needs. 1. Keep the default **Advanced Details** or adjust them according to your needs.
1. Click **Add EC2 Instances** but, as we don't have any instances to add yet, come back 1. Click **Add EC2 Instances** but, as we don't have any instances to add yet, come back
......
...@@ -69,6 +69,16 @@ you are privileged to. ...@@ -69,6 +69,16 @@ you are privileged to.
If the public level is restricted, user profiles are only visible to logged in users. If the public level is restricted, user profiles are only visible to logged in users.
## Visibility of pages
By default, the following directories are visible to unauthenticated users:
- Public access (`/public`).
- Explore (`/explore`).
- Help (`/help`).
However, if the access level of the `/public` directory is restricted, these directories are visible only to logged in users.
## Restricting the use of public or internal projects ## Restricting the use of public or internal projects
You can restrict the use of visibility levels for users when they create a project or a You can restrict the use of visibility levels for users when they create a project or a
......
...@@ -91,7 +91,7 @@ For more details on group visibility, see [Public access](../../../public_access ...@@ -91,7 +91,7 @@ For more details on group visibility, see [Public access](../../../public_access
## Restricted visibility levels ## Restricted visibility levels
To set the available visibility levels for new projects and snippets: To set the available visibility levels for projects, snippets, and selected pages:
1. Check the desired visibility levels. 1. Check the desired visibility levels.
1. Click **Save changes**. 1. Click **Save changes**.
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
1. [By uploading a manifest file (AOSP)](manifest.md) 1. [By uploading a manifest file (AOSP)](manifest.md)
1. [From Gemnasium](gemnasium.md) 1. [From Gemnasium](gemnasium.md)
1. [From Phabricator](phabricator.md) 1. [From Phabricator](phabricator.md)
1. [From Jira (issues only)](jira.md)
In addition to the specific migration documentation above, you can import any In addition to the specific migration documentation above, you can import any
Git repository via HTTP from the New Project page. Be aware that if the Git repository via HTTP from the New Project page. Be aware that if the
......
# Import your Jira project issues to GitLab
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2766) in GitLab 12.10.
Using GitLab Jira importer, you can import your Jira issues to GitLab.com or to
your self-managed GitLab instance.
Jira issues import is an MVC, project-level feature, meaning that issues from multiple
Jira projects can be imported into a GitLab project. MVC version imports issue title and description
as well as some other issue metadata as a section in the issue description.
## Prerequisites
### Permissions
In order to be able to import issues from a Jira project you need to have read access on Jira
issues and a [Maintainer or higher](../../permissions.md#project-members-permissions) role in the
GitLab project that you wish to import into.
### Jira integration
This feature uses the existing GitLab [Jira integration](../integrations/jira.md).
Make sure you have the integration set up before trying to import Jira issues.
## Import Jira issues to GitLab
To import Jira issues to a GitLab project, follow the steps below.
NOTE: **Note:**
Importing Jira issues is done as an asynchronous background job, which
may result in delays based on import queues load, system load, or other factors.
Importing large projects may take several minutes depending on the size of the import.
1. On the **{issues}** **Issues** page, click the **Import Issues** (**{import}**) button.
1. Select **Import from Jira**.
![Import issues from Jira button](img/jira/import_issues_from_jira_button_v12_10.png)
The following form appears.
![Import issues from Jira form](img/jira/import_issues_from_jira_form_v12_10.png)
If you've previously set up the [Jira integration](../integrations/jira.md), you now see the Jira
projects that you have access to in the dropdown.
1. Select the Jira project that you wish to import issues from.
![Import issues from Jira form](img/jira/import_issues_from_jira_projects_v12_10.png)
1. Click **Import Issues**. You're presented with a confirmation that import has started.
While the import is running in the background, you can navigate away from the import status page
to the issues page, and you'll see the new issues appearing in the issues list.
1. To check the status of your import, go back to the Jira import page.
![Import issues from Jira button](img/jira/import_issues_from_jira_button_v12_10.png)
# frozen_string_literal: true
module API
module Helpers
module RateLimiter
def check_rate_limit!(key, scope)
if rate_limiter.throttled?(key, scope: scope)
log_request(key)
render_exceeded_limit_error!
end
end
private
def rate_limiter
::Gitlab::ApplicationRateLimiter
end
def render_exceeded_limit_error!
render_api_error!({ error: _('This endpoint has been requested too many times. Try again later.') }, 429)
end
def log_request(key)
rate_limiter.log_request(request, "#{key}_request_limit".to_sym, current_user)
end
end
end
end
...@@ -4,6 +4,7 @@ module API ...@@ -4,6 +4,7 @@ module API
class Issues < Grape::API class Issues < Grape::API
include PaginationParams include PaginationParams
helpers Helpers::IssuesHelpers helpers Helpers::IssuesHelpers
helpers Helpers::RateLimiter
helpers ::Gitlab::IssuableMetadata helpers ::Gitlab::IssuableMetadata
before { authenticate_non_get! } before { authenticate_non_get! }
...@@ -211,6 +212,8 @@ module API ...@@ -211,6 +212,8 @@ module API
post ':id/issues' do post ':id/issues' do
Gitlab::QueryLimiting.whitelist('https://gitlab.com/gitlab-org/gitlab-foss/issues/42320') Gitlab::QueryLimiting.whitelist('https://gitlab.com/gitlab-org/gitlab-foss/issues/42320')
check_rate_limit! :issues_create, [current_user, :issues_create]
authorize! :create_issue, user_project authorize! :create_issue, user_project
params.delete(:created_at) unless current_user.can?(:set_issue_created_at, user_project) params.delete(:created_at) unless current_user.can?(:set_issue_created_at, user_project)
......
...@@ -2,15 +2,8 @@ ...@@ -2,15 +2,8 @@
module API module API
class ProjectExport < Grape::API class ProjectExport < Grape::API
helpers do helpers Helpers::RateLimiter
def throttled?(action)
rate_limiter.throttled?(action, scope: [current_user, action, user_project])
end
def rate_limiter
::Gitlab::ApplicationRateLimiter
end
end
before do before do
not_found! unless Gitlab::CurrentSettings.project_export_enabled? not_found! unless Gitlab::CurrentSettings.project_export_enabled?
authorize_admin_project authorize_admin_project
...@@ -32,9 +25,7 @@ module API ...@@ -32,9 +25,7 @@ module API
detail 'This feature was introduced in GitLab 10.6.' detail 'This feature was introduced in GitLab 10.6.'
end end
get ':id/export/download' do get ':id/export/download' do
if throttled?(:project_download_export) check_rate_limit! :project_download_export, [current_user, :project_download_export, user_project]
render_api_error!({ error: 'This endpoint has been requested too many times. Try again later.' }, 429)
end
if user_project.export_file_exists? if user_project.export_file_exists?
present_carrierwave_file!(user_project.export_file) present_carrierwave_file!(user_project.export_file)
...@@ -54,9 +45,7 @@ module API ...@@ -54,9 +45,7 @@ module API
end end
end end
post ':id/export' do post ':id/export' do
if throttled?(:project_export) check_rate_limit! :project_export, [current_user, :project_export, user_project]
render_api_error!({ error: 'This endpoint has been requested too many times. Try again later.' }, 429)
end
project_export_params = declared_params(include_missing: false) project_export_params = declared_params(include_missing: false)
after_export_params = project_export_params.delete(:upload) || {} after_export_params = project_export_params.delete(:upload) || {}
......
...@@ -8,19 +8,12 @@ module API ...@@ -8,19 +8,12 @@ module API
helpers Helpers::ProjectsHelpers helpers Helpers::ProjectsHelpers
helpers Helpers::FileUploadHelpers helpers Helpers::FileUploadHelpers
helpers Helpers::RateLimiter
helpers do helpers do
def import_params def import_params
declared_params(include_missing: false) declared_params(include_missing: false)
end end
def throttled?(key, scope)
rate_limiter.throttled?(key, scope: scope)
end
def rate_limiter
::Gitlab::ApplicationRateLimiter
end
end end
before do before do
...@@ -69,13 +62,7 @@ module API ...@@ -69,13 +62,7 @@ module API
post 'import' do post 'import' do
require_gitlab_workhorse! require_gitlab_workhorse!
key = "project_import".to_sym check_rate_limit! :project_import, [current_user, :project_import]
if throttled?(key, [current_user, key])
rate_limiter.log_request(request, "#{key}_request_limit".to_sym, current_user)
render_api_error!({ error: _('This endpoint has been requested too many times. Try again later.') }, 429)
end
Gitlab::QueryLimiting.whitelist('https://gitlab.com/gitlab-org/gitlab-foss/issues/42437') Gitlab::QueryLimiting.whitelist('https://gitlab.com/gitlab-org/gitlab-foss/issues/42437')
......
# frozen_string_literal: true
module Constraints
class AdminConstrainer
def matches?(request)
if Feature.enabled?(:user_mode_in_session)
admin_mode_enabled?(request)
else
user_is_admin?(request)
end
end
private
def user_is_admin?(request)
request.env['warden'].authenticate? && request.env['warden'].user.admin?
end
def admin_mode_enabled?(request)
Gitlab::Session.with_session(request.session) do
request.env['warden'].authenticate? && Gitlab::Auth::CurrentUserMode.new(request.env['warden'].user).admin_mode?
end
end
end
end
# frozen_string_literal: true
module Gitlab
module BackgroundMigration
# Class that will insert record into project_push_rules
# for each existing push_rule
class BackfillPushRulesIdInProjects
# Temporary AR table for push rules
class ProjectSetting < ActiveRecord::Base
self.table_name = 'project_settings'
end
def perform(start_id, stop_id)
ProjectSetting.connection.execute(<<~SQL)
UPDATE project_settings ps1
SET push_rule_id = pr.id
FROM project_settings ps2
INNER JOIN push_rules pr
ON ps2.project_id = pr.project_id
WHERE pr.is_sample = false
AND pr.id BETWEEN #{start_id} AND #{stop_id}
AND ps1.project_id = ps2.project_id
SQL
end
end
end
end
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
module Gitlab module Gitlab
module ImportExport module ImportExport
module Group module Group
class TreeSaver class LegacyTreeSaver
attr_reader :full_path, :shared attr_reader :full_path, :shared
def initialize(group:, current_user:, shared:, params: {}) def initialize(group:, current_user:, shared:, params: {})
......
...@@ -788,12 +788,18 @@ msgstr "" ...@@ -788,12 +788,18 @@ msgstr ""
msgid "<code>\"johnsmith@example.com\": \"johnsmith@example.com\"</code> will add \"By <a href=\"#\">johnsmith@example.com</a>\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address." msgid "<code>\"johnsmith@example.com\": \"johnsmith@example.com\"</code> will add \"By <a href=\"#\">johnsmith@example.com</a>\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address."
msgstr "" msgstr ""
msgid "<namespace / project>"
msgstr ""
msgid "<no name set>" msgid "<no name set>"
msgstr "" msgstr ""
msgid "<no scopes selected>" msgid "<no scopes selected>"
msgstr "" msgstr ""
msgid "<project name>"
msgstr ""
msgid "<strong>%{group_name}</strong> group members" msgid "<strong>%{group_name}</strong> group members"
msgstr "" msgstr ""
...@@ -5456,6 +5462,9 @@ msgstr "" ...@@ -5456,6 +5462,9 @@ msgstr ""
msgid "Container repositories sync capacity" msgid "Container repositories sync capacity"
msgstr "" msgstr ""
msgid "ContainerRegistry| Please visit the %{linkStart}administration settings%{linkEnd} to enable this feature."
msgstr ""
msgid "ContainerRegistry|%{imageName} tags" msgid "ContainerRegistry|%{imageName} tags"
msgstr "" msgstr ""
...@@ -5471,6 +5480,9 @@ msgstr "" ...@@ -5471,6 +5480,9 @@ msgstr ""
msgid "ContainerRegistry|Container Registry" msgid "ContainerRegistry|Container Registry"
msgstr "" msgstr ""
msgid "ContainerRegistry|Container Registry tag expiration and retention policy is disabled"
msgstr ""
msgid "ContainerRegistry|Copy build command" msgid "ContainerRegistry|Copy build command"
msgstr "" msgstr ""
...@@ -5480,9 +5492,6 @@ msgstr "" ...@@ -5480,9 +5492,6 @@ msgstr ""
msgid "ContainerRegistry|Copy push command" msgid "ContainerRegistry|Copy push command"
msgstr "" msgstr ""
msgid "ContainerRegistry|Currently, the Container Registry tag expiration feature is not available for projects created before GitLab version 12.8. For updates and more information, visit Issue %{linkStart}#196124%{linkEnd}"
msgstr ""
msgid "ContainerRegistry|Docker connection error" msgid "ContainerRegistry|Docker connection error"
msgstr "" msgstr ""
...@@ -5531,6 +5540,9 @@ msgstr "" ...@@ -5531,6 +5540,9 @@ msgstr ""
msgid "ContainerRegistry|Number of tags to retain:" msgid "ContainerRegistry|Number of tags to retain:"
msgstr "" msgstr ""
msgid "ContainerRegistry|Please contact your administrator."
msgstr ""
msgid "ContainerRegistry|Push an image" msgid "ContainerRegistry|Push an image"
msgstr "" msgstr ""
...@@ -5587,6 +5599,9 @@ msgstr "" ...@@ -5587,6 +5599,9 @@ msgstr ""
msgid "ContainerRegistry|Tags deleted successfully" msgid "ContainerRegistry|Tags deleted successfully"
msgstr "" msgstr ""
msgid "ContainerRegistry|The Container Registry tag expiration and retention policies for this project have not been enabled."
msgstr ""
msgid "ContainerRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator." msgid "ContainerRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
msgstr "" msgstr ""
......
...@@ -22,4 +22,18 @@ describe Explore::GroupsController do ...@@ -22,4 +22,18 @@ describe Explore::GroupsController do
expect(assigns(:groups)).to contain_exactly(member_of_group, public_group) expect(assigns(:groups)).to contain_exactly(member_of_group, public_group)
end end
context 'restricted visibility level is public' do
before do
sign_out(user)
stub_application_setting(restricted_visibility_levels: [Gitlab::VisibilityLevel::PUBLIC])
end
it 'redirects to login page' do
get :index
expect(response).to redirect_to new_user_session_path
end
end
end end
...@@ -171,5 +171,17 @@ describe Explore::ProjectsController do ...@@ -171,5 +171,17 @@ describe Explore::ProjectsController do
get :index, params: { sort: sorting_param } get :index, params: { sort: sorting_param }
end end
end end
context 'restricted visibility level is public' do
before do
stub_application_setting(restricted_visibility_levels: [Gitlab::VisibilityLevel::PUBLIC])
end
it 'redirects to login page' do
get :index
expect(response).to redirect_to new_user_session_path
end
end
end end
end end
...@@ -79,6 +79,20 @@ describe HelpController do ...@@ -79,6 +79,20 @@ describe HelpController do
expect(assigns[:help_index]).to eq '[protocol-relative](//example.com)' expect(assigns[:help_index]).to eq '[protocol-relative](//example.com)'
end end
end end
context 'restricted visibility set to public' do
before do
sign_out(user)
stub_application_setting(restricted_visibility_levels: [Gitlab::VisibilityLevel::PUBLIC])
end
it 'redirects to sign_in path' do
get :index
expect(response).to redirect_to(new_user_session_path)
end
end
end end
describe 'GET #show' do describe 'GET #show' do
......
...@@ -89,5 +89,17 @@ describe 'Explore Groups', :js do ...@@ -89,5 +89,17 @@ describe 'Explore Groups', :js do
end end
it_behaves_like 'renders group in public groups area' it_behaves_like 'renders group in public groups area'
context 'when visibility is restricted to public' do
before do
stub_application_setting(restricted_visibility_levels: [Gitlab::VisibilityLevel::PUBLIC])
end
it 'redirects to the sign in page' do
visit explore_groups_path
expect(page).to have_current_path(new_user_session_path)
end
end
end end
end end
...@@ -16,6 +16,17 @@ describe 'User explores projects' do ...@@ -16,6 +16,17 @@ describe 'User explores projects' do
include_examples 'shows public projects' include_examples 'shows public projects'
end end
context 'when visibility is restricted to public' do
before do
stub_application_setting(restricted_visibility_levels: [Gitlab::VisibilityLevel::PUBLIC])
visit(explore_projects_path)
end
it 'redirects to login page' do
expect(page).to have_current_path(new_user_session_path)
end
end
end end
context 'when signed in' do context 'when signed in' do
......
import { shallowMount } from '@vue/test-utils'; import { shallowMount } from '@vue/test-utils';
import { GlAlert } from '@gitlab/ui'; import { GlAlert, GlSprintf, GlLink } from '@gitlab/ui';
import component from '~/registry/settings/components/registry_settings_app.vue'; import component from '~/registry/settings/components/registry_settings_app.vue';
import SettingsForm from '~/registry/settings/components/settings_form.vue'; import SettingsForm from '~/registry/settings/components/settings_form.vue';
import { createStore } from '~/registry/settings/store/'; import { createStore } from '~/registry/settings/store/';
import { SET_IS_DISABLED } from '~/registry/settings/store/mutation_types'; import { SET_SETTINGS, SET_INITIAL_STATE } from '~/registry/settings/store/mutation_types';
import { FETCH_SETTINGS_ERROR_MESSAGE } from '~/registry/shared/constants'; import { FETCH_SETTINGS_ERROR_MESSAGE } from '~/registry/shared/constants';
import { stringifiedFormOptions } from '../../shared/mock_data';
describe('Registry Settings App', () => { describe('Registry Settings App', () => {
let wrapper; let wrapper;
...@@ -13,14 +14,14 @@ describe('Registry Settings App', () => { ...@@ -13,14 +14,14 @@ describe('Registry Settings App', () => {
const findSettingsComponent = () => wrapper.find(SettingsForm); const findSettingsComponent = () => wrapper.find(SettingsForm);
const findAlert = () => wrapper.find(GlAlert); const findAlert = () => wrapper.find(GlAlert);
const mountComponent = ({ dispatchMock = 'mockResolvedValue', isDisabled = false } = {}) => { const mountComponent = ({ dispatchMock = 'mockResolvedValue' } = {}) => {
store = createStore();
store.commit(SET_IS_DISABLED, isDisabled);
const dispatchSpy = jest.spyOn(store, 'dispatch'); const dispatchSpy = jest.spyOn(store, 'dispatch');
if (dispatchMock) { dispatchSpy[dispatchMock]();
dispatchSpy[dispatchMock]();
}
wrapper = shallowMount(component, { wrapper = shallowMount(component, {
stubs: {
GlSprintf,
},
mocks: { mocks: {
$toast: { $toast: {
show: jest.fn(), show: jest.fn(),
...@@ -30,11 +31,16 @@ describe('Registry Settings App', () => { ...@@ -30,11 +31,16 @@ describe('Registry Settings App', () => {
}); });
}; };
beforeEach(() => {
store = createStore();
});
afterEach(() => { afterEach(() => {
wrapper.destroy(); wrapper.destroy();
}); });
it('renders', () => { it('renders', () => {
store.commit(SET_SETTINGS, { foo: 'bar' });
mountComponent(); mountComponent();
expect(wrapper.element).toMatchSnapshot(); expect(wrapper.element).toMatchSnapshot();
}); });
...@@ -45,13 +51,15 @@ describe('Registry Settings App', () => { ...@@ -45,13 +51,15 @@ describe('Registry Settings App', () => {
}); });
it('renders the setting form', () => { it('renders the setting form', () => {
store.commit(SET_SETTINGS, { foo: 'bar' });
mountComponent(); mountComponent();
expect(findSettingsComponent().exists()).toBe(true); expect(findSettingsComponent().exists()).toBe(true);
}); });
describe('isDisabled', () => { describe('the form is disabled', () => {
beforeEach(() => { beforeEach(() => {
mountComponent({ isDisabled: true }); store.commit(SET_SETTINGS, undefined);
mountComponent();
}); });
it('the form is hidden', () => { it('the form is hidden', () => {
...@@ -59,9 +67,27 @@ describe('Registry Settings App', () => { ...@@ -59,9 +67,27 @@ describe('Registry Settings App', () => {
}); });
it('shows an alert', () => { it('shows an alert', () => {
expect(findAlert().html()).toContain( const text = findAlert().text();
'Currently, the Container Registry tag expiration feature is not available', expect(text).toContain(
'The Container Registry tag expiration and retention policies for this project have not been enabled.',
); );
expect(text).toContain('Please contact your administrator.');
});
describe('an admin is visiting the page', () => {
beforeEach(() => {
store.commit(SET_INITIAL_STATE, {
...stringifiedFormOptions,
isAdmin: true,
adminSettingsPath: 'foo',
});
});
it('shows the admin part of the alert message', () => {
const sprintf = findAlert().find(GlSprintf);
expect(sprintf.text()).toBe('administration settings');
expect(sprintf.find(GlLink).attributes('href')).toBe('foo');
});
}); });
}); });
......
...@@ -20,7 +20,7 @@ describe('Actions Registry Store', () => { ...@@ -20,7 +20,7 @@ describe('Actions Registry Store', () => {
); );
describe('receiveSettingsSuccess', () => { describe('receiveSettingsSuccess', () => {
it('calls SET_SETTINGS when data is present', () => { it('calls SET_SETTINGS', () => {
testAction( testAction(
actions.receiveSettingsSuccess, actions.receiveSettingsSuccess,
'foo', 'foo',
...@@ -29,15 +29,6 @@ describe('Actions Registry Store', () => { ...@@ -29,15 +29,6 @@ describe('Actions Registry Store', () => {
[], [],
); );
}); });
it('calls SET_IS_DISABLED when data is not present', () => {
testAction(
actions.receiveSettingsSuccess,
null,
{},
[{ type: types.SET_IS_DISABLED, payload: true }],
[],
);
});
}); });
describe('fetchSettings', () => { describe('fetchSettings', () => {
......
...@@ -29,7 +29,7 @@ describe('Getters registry settings store', () => { ...@@ -29,7 +29,7 @@ describe('Getters registry settings store', () => {
}); });
}); });
describe('getIsDisabled', () => { describe('getIsEdited', () => {
it('returns false when original is equal to settings', () => { it('returns false when original is equal to settings', () => {
const same = { foo: 'bar' }; const same = { foo: 'bar' };
expect(getters.getIsEdited({ original: same, settings: same })).toBe(false); expect(getters.getIsEdited({ original: same, settings: same })).toBe(false);
...@@ -41,4 +41,18 @@ describe('Getters registry settings store', () => { ...@@ -41,4 +41,18 @@ describe('Getters registry settings store', () => {
); );
}); });
}); });
describe('getIsDisabled', () => {
it.each`
original | enableHistoricEntries | result
${undefined} | ${false} | ${true}
${{ foo: 'bar' }} | ${undefined} | ${false}
${{}} | ${false} | ${false}
`(
'returns $result when original is $original and enableHistoricEntries is $enableHistoricEntries',
({ original, enableHistoricEntries, result }) => {
expect(getters.getIsDisabled({ original, enableHistoricEntries })).toBe(result);
},
);
});
}); });
...@@ -12,14 +12,19 @@ describe('Mutations Registry Store', () => { ...@@ -12,14 +12,19 @@ describe('Mutations Registry Store', () => {
describe('SET_INITIAL_STATE', () => { describe('SET_INITIAL_STATE', () => {
it('should set the initial state', () => { it('should set the initial state', () => {
const expectedState = { ...mockState, projectId: 'foo', formOptions }; const payload = {
mutations[types.SET_INITIAL_STATE](mockState, {
projectId: 'foo', projectId: 'foo',
enableHistoricEntries: false,
adminSettingsPath: 'foo',
isAdmin: true,
};
const expectedState = { ...mockState, ...payload, formOptions };
mutations[types.SET_INITIAL_STATE](mockState, {
...payload,
...stringifiedFormOptions, ...stringifiedFormOptions,
}); });
expect(mockState.projectId).toEqual(expectedState.projectId); expect(mockState).toEqual(expectedState);
expect(mockState.formOptions).toEqual(expectedState.formOptions);
}); });
}); });
...@@ -41,6 +46,13 @@ describe('Mutations Registry Store', () => { ...@@ -41,6 +46,13 @@ describe('Mutations Registry Store', () => {
expect(mockState.settings).toEqual(expectedState.settings); expect(mockState.settings).toEqual(expectedState.settings);
expect(mockState.original).toEqual(expectedState.settings); expect(mockState.original).toEqual(expectedState.settings);
}); });
it('should keep the default state when settings is not present', () => {
const originalSettings = { ...mockState.settings };
mutations[types.SET_SETTINGS](mockState);
expect(mockState.settings).toEqual(originalSettings);
expect(mockState.original).toEqual(undefined);
});
}); });
describe('RESET_SETTINGS', () => { describe('RESET_SETTINGS', () => {
...@@ -50,6 +62,13 @@ describe('Mutations Registry Store', () => { ...@@ -50,6 +62,13 @@ describe('Mutations Registry Store', () => {
mutations[types.RESET_SETTINGS](mockState); mutations[types.RESET_SETTINGS](mockState);
expect(mockState.settings).toEqual(mockState.original); expect(mockState.settings).toEqual(mockState.original);
}); });
it('if original is undefined it should initialize to empty object', () => {
mockState.settings = { foo: 'bar' };
mockState.original = undefined;
mutations[types.RESET_SETTINGS](mockState);
expect(mockState.settings).toEqual({});
});
}); });
describe('TOGGLE_LOADING', () => { describe('TOGGLE_LOADING', () => {
...@@ -58,11 +77,4 @@ describe('Mutations Registry Store', () => { ...@@ -58,11 +77,4 @@ describe('Mutations Registry Store', () => {
expect(mockState.isLoading).toEqual(true); expect(mockState.isLoading).toEqual(true);
}); });
}); });
describe('SET_IS_DISABLED', () => {
it('should set isDisabled', () => {
mutations[types.SET_IS_DISABLED](mockState, true);
expect(mockState.isDisabled).toEqual(true);
});
});
}); });
# frozen_string_literal: true
#
require 'spec_helper'
describe Constraints::AdminConstrainer, :do_not_mock_admin_mode do
let(:user) { create(:user) }
let(:session) { {} }
let(:env) { { 'warden' => double(:warden, authenticate?: true, user: user) } }
let(:request) { double(:request, session: session, env: env) }
around do |example|
Gitlab::Session.with_session(session) do
example.run
end
end
describe '#matches' do
context 'feature flag :user_mode_in_session is enabled' do
context 'when user is a regular user' do
it 'forbids access' do
expect(subject.matches?(request)).to be(false)
end
end
context 'when user is an admin' do
let(:user) { create(:admin) }
context 'admin mode is disabled' do
it 'forbids access' do
expect(subject.matches?(request)).to be(false)
end
end
context 'admin mode is enabled' do
before do
current_user_mode = Gitlab::Auth::CurrentUserMode.new(user)
current_user_mode.request_admin_mode!
current_user_mode.enable_admin_mode!(password: user.password)
end
it 'allows access' do
expect(subject.matches?(request)).to be(true)
end
end
end
end
context 'feature flag :user_mode_in_session is disabled' do
before do
stub_feature_flags(user_mode_in_session: false)
end
context 'when user is a regular user' do
it 'forbids access' do
expect(subject.matches?(request)).to be(false)
end
end
context 'when user is an admin' do
let(:user) { create(:admin) }
it 'allows access' do
expect(subject.matches?(request)).to be(true)
end
end
end
end
end
# frozen_string_literal: true
require 'spec_helper'
describe Gitlab::BackgroundMigration::BackfillPushRulesIdInProjects, :migration, schema: 2020_03_25_162730 do
let(:push_rules) { table(:push_rules) }
let(:projects) { table(:projects) }
let(:project_settings) { table(:project_settings) }
let(:namespace) { table(:namespaces).create(name: 'user', path: 'user') }
subject { described_class.new }
describe '#perform' do
it 'creates new project push_rules for all push rules in the range' do
project_1 = projects.create(id: 1, namespace_id: namespace.id)
project_2 = projects.create(id: 2, namespace_id: namespace.id)
project_3 = projects.create(id: 3, namespace_id: namespace.id)
project_settings_1 = project_settings.create(project_id: project_1.id)
project_settings_2 = project_settings.create(project_id: project_2.id)
project_settings_3 = project_settings.create(project_id: project_3.id)
push_rule_1 = push_rules.create(id: 5, is_sample: false, project_id: project_1.id)
push_rule_2 = push_rules.create(id: 6, is_sample: false, project_id: project_2.id)
push_rules.create(id: 8, is_sample: false, project_id: 3)
subject.perform(5, 7)
expect(project_settings_1.reload.push_rule_id).to eq(push_rule_1.id)
expect(project_settings_2.reload.push_rule_id).to eq(push_rule_2.id)
expect(project_settings_3.reload.push_rule_id).to be_nil
end
end
end
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
require 'spec_helper' require 'spec_helper'
describe Gitlab::ImportExport::Group::TreeSaver do describe Gitlab::ImportExport::Group::LegacyTreeSaver do
describe 'saves the group tree into a json object' do describe 'saves the group tree into a json object' do
let(:shared) { Gitlab::ImportExport::Shared.new(group) } let(:shared) { Gitlab::ImportExport::Shared.new(group) }
let(:group_tree_saver) { described_class.new(group: group, current_user: user, shared: shared) } let(:group_tree_saver) { described_class.new(group: group, current_user: user, shared: shared) }
...@@ -28,7 +28,7 @@ describe Gitlab::ImportExport::Group::TreeSaver do ...@@ -28,7 +28,7 @@ describe Gitlab::ImportExport::Group::TreeSaver do
# except: # except:
# context 'with description override' do # context 'with description override' do
# context 'group members' do # context 'group members' do
# ^ These are specific for the Group::TreeSaver # ^ These are specific for the Group::LegacyTreeSaver
context 'JSON' do context 'JSON' do
let(:saved_group_json) do let(:saved_group_json) do
group_tree_saver.save group_tree_saver.save
......
# frozen_string_literal: true
require 'spec_helper'
require Rails.root.join('db', 'post_migrate', '20200325162730_schedule_backfill_push_rules_id_in_projects.rb')
describe ScheduleBackfillPushRulesIdInProjects do
let(:push_rules) { table(:push_rules) }
it 'adds global rule association to application settings' do
application_settings = table(:application_settings)
setting = application_settings.create!
sample_rule = push_rules.create!(is_sample: true)
Sidekiq::Testing.fake! do
disable_migrations_output { migrate! }
end
setting.reload
expect(setting.push_rule_id).to eq(sample_rule.id)
end
it 'schedules worker to migrate project push rules' do
rule_1 = push_rules.create!
rule_2 = push_rules.create!
Sidekiq::Testing.fake! do
disable_migrations_output { migrate! }
expect(BackgroundMigrationWorker.jobs.size).to eq(1)
expect(described_class::MIGRATION)
.to be_scheduled_delayed_migration(5.minutes, rule_1.id, rule_2.id)
end
end
end
...@@ -381,6 +381,20 @@ describe API::Issues do ...@@ -381,6 +381,20 @@ describe API::Issues do
end.not_to change { project.labels.count } end.not_to change { project.labels.count }
end end
end end
context 'when request exceeds the rate limit' do
before do
allow(::Gitlab::ApplicationRateLimiter).to receive(:throttled?).and_return(true)
end
it 'prevents users from creating more issues' do
post api("/projects/#{project.id}/issues", user),
params: { title: 'new issue', labels: 'label, label2', weight: 3, assignee_ids: [user2.id] }
expect(response).to have_gitlab_http_status(:too_many_requests)
expect(json_response['message']['error']).to eq('This endpoint has been requested too many times. Try again later.')
end
end
end end
describe 'POST /projects/:id/issues with spam filtering' do describe 'POST /projects/:id/issues with spam filtering' do
......
...@@ -50,7 +50,7 @@ describe Groups::ImportExport::ExportService do ...@@ -50,7 +50,7 @@ describe Groups::ImportExport::ExportService do
end end
it 'saves the models' do it 'saves the models' do
expect(Gitlab::ImportExport::Group::TreeSaver).to receive(:new).and_call_original expect(Gitlab::ImportExport::Group::LegacyTreeSaver).to receive(:new).and_call_original
service.execute service.execute
end end
......
File mode changed from 100755 to 100644
File mode changed from 100755 to 100644
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment