diff options
259 files changed, 1458 insertions, 1180 deletions
diff --git a/.haml-lint.yml b/.haml-lint.yml index 9f3676fa080..0412b24a48c 100644 --- a/.haml-lint.yml +++ b/.haml-lint.yml @@ -7,7 +7,7 @@ exclude: - 'vendor/**/*' - 'spec/**/*' require: - - './lib/haml_lint/linter/no_plain_nodes.rb' + - './haml_lint/linter/no_plain_nodes.rb' linters: AltText: diff --git a/CHANGELOG.md b/CHANGELOG.md index 17b185358ed..88521222b8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,191 @@ documentation](doc/development/changelog.md) for instructions on adding your own entry. +## 11.11.0 (2019-05-22) + +### Security (1 change) + +- Destroy project remote mirrors instead of disabling. !27087 + +### Fixed (74 changes, 19 of them are from the community) + +- Don't create a temp reference for branch comparisons within project. !24038 +- Fix some label links not appearing on group labels page and label title being a link on project labels page. !24060 (Tanya Pazitny) +- Fix extra emails for custom notifications. !25607 +- Rewind IID on Ci::Pipelines. !26490 +- Fix duplicate merge request pipelines created by Sidekiq worker retry. !26643 +- Catch and report OpenSSL exceptions while fetching external configuration files in CI::Config. !26750 (Drew Cimino) +- stop rendering download links for expired artifacts on the project tags page. !26753 (Drew Cimino) +- Format extra help page text like wiki. !26782 (Bastian Blank) +- Always show instance configuration link. !26783 (Bastian Blank) +- Display maximum artifact size from runtime config. !26784 (Bastian Blank) +- Resolve issue where list labels did not have the correct text color on creation. !26794 (Tucker Chapman) +- Set release name when adding release notes to an existing tag. !26807 +- Fix the bug that the project statistics is not updated. !26854 (Hiroyuki Sato) +- Client side changes for ListLastCommitsForTree response update. !26880 +- Fix api group visibility. !26896 +- Require all templates to use default stages. !26954 +- Remove a "reopen merge request button" on a "merged" merge request. !26965 (Hiroyuki Sato) +- Fix misaligned image diff swipe view. !26969 (ftab) +- Add badge-pill class on group member count. !27019 +- Remove leading / trailing spaces from heading when generating header ids. !27025 (Willian Balmant) +- Respect updated_at attribute in notes produced by API calls. !27124 (Ben Gamari) +- Fix GitHub project import visibility. !27133 (Daniel Wyatt) +- Fixes actions dropdowns in environments page. !27160 +- Fixes create button background for Environments form. !27161 +- Display scoped labels in Issue Boards. !27164 +- Align UrlValidator to validate_url gem implementation. !27194 (Horatiu Eugen Vlad) +- Resolve Web IDE template dropdown showing duplicates. !27237 +- Update GitLab Workhorse to v8.6.0. !27260 +- Only show in autocomplete when author active. !27292 +- Remove deadline for Git fsck. !27299 +- Show prioritized labels to guests. !27307 +- Properly expire all pipeline caches when pipeline is deleted. !27334 +- Replaced icon for external URL with doc-text icon. !27365 +- Add auto direction for issue title. !27378 (Ahmad Haghighi) +- fix wiki search result links in titles. !27400 (khm) +- Fix system notes timestamp when creating issue in the past. !27406 +- Fix approvals sometimes being reset after a merge request is rebased. !27446 +- Fix empty block in MR widget when user doesn't have permission. !27462 +- Fix wrong use of ActiveRecord in PoolRepository. !27464 +- Show proper preview for uploaded images in Web IDE. !27471 +- Resolve Renaming an image via Web IDE corrupts it. !27486 +- Clean up CarrierWave's import/export files. !27487 +- Fix autocomplete dropdown for usernames starting with period. !27533 (Jan Beckmann) +- Disable password autocomplete in mirror repository form. !27542 +- Always use internal ID tables in development and production. !27544 +- Only show the "target branch has advanced" message when the merge request is open. !27588 +- Resolve Misalignment on suggested changes diff table. !27612 +- Update Workhorse to v8.7.0. !27630 +- Fix FE API and IDE handling of '/' relative_url_root. !27635 +- Hide ScopedBadge overflow notes. !27651 +- Fix base domain help text update. !27746 +- Upgrade letter_opener_web to support Rails 5.1. !27829 +- Fix webpack assets handling when relative url root is '/'. !27909 +- Fix IDE get file data with '/' as relative root. !27911 +- Allow a member to have an access level equal to parent group. !27913 +- Fix issuables state_id nil when importing projects from GitHub. !28027 +- Fix uploading of LFS tracked file through UI. !28052 +- Render Next badge only for gitlab.com. !28056 +- Fix update head pipeline process of Pipelines for merge requests. !28057 +- Fix visual issues in set status modal. !28147 +- Use a path for the related merge requests endpoint. !28171 +- disable SSH key validation in key details view. !28180 (Roger Meier) +- Fix MR discussion border missing in chrome sometimes. !28185 +- Fix Error 500 when inviting user already present. !28198 +- Remove non-semantic use of `.row` in member listing controls. !28204 +- Properly handle LFS Batch API response in project import. !28223 +- Fix project visibility level validation. !28305 (Peter Marko) +- Fix incorrect prefix used in new uploads for personal snippets. !28337 +- Fix Rugged get_tree_entries recursive flag not working. !28494 +- Fixes next badge being always visible. +- Next badge must visible when canary flag is true. +- Adds arrow icons to select option in CI/CD settings. +- Vertically aligns the play button for stages. +- Allow replying to individual notes from API. + +### Changed (19 changes, 3 of them are from the community) + +- Sort by due date and popularity in both directions for Issues and Merge requests. !25502 (Nermin Vehabovic) +- Improve pipelines table spacing, add triggerer column. !26136 +- Allow extra arguments in helm commands when deploying the application in Auto-DevOps.gitlab-ci.yml. !26171 (tortuetorche) +- Switch to sassc-rails for faster stylesheet compilation. !26224 +- Reorganize project merge request settings. !26834 +- Display a toast message when the Kubernetes runner has successfully upgraded. !27206 +- Allow guests users to access project releases. !27247 +- Add help texts to K8 form fields. !27274 +- Support prometheus for group level clusters. !27280 +- Include link to raw job log in plain-text emails. !27409 +- Only escape Markdown emphasis characters in autocomplete when necessary. !27457 +- Move location of charts/auto-deploy-app -> gitlab-org/charts/auto-deploy-app. !27477 +- Make canceled jobs not retryable. !27503 +- Upgrade to Gitaly v1.36.0. !27831 +- Update deployment event chat notification message. !27972 +- Upgrade to Gitaly v1.42.0. !28135 +- Resolve discussion when apply suggestion. !28160 +- Improve expanding diff to full file performance. +- Knative version bump 0.3 -> 0.5. (Chris Baumbauer <cab@cabnetworks.net>) + +### Performance (5 changes) + +- Added list_pages method to avoid loading all wiki pages content. !22801 +- Add gitaly session id & catfile-cache feature flag. !27472 +- Add improvements to global search of issues and merge requests. !27817 +- Disable method replacement in avatar loading. !27866 +- Fix Blob.lazy always loading all previously-requested blobs when a new request is made. + +### Added (36 changes, 10 of them are from the community) + +- Add time preferences for user. !25381 +- Added write_repository scope for personal access token. !26021 (Horatiu Eugen Vlad) +- Mark disabled pages domains for removal, but don't remove them yet. !26212 +- Remove pages domains if they weren't verified for 1 week. !26227 +- Expose pipeline variables via API. !26501 (Agustin Henze <tin@redhat.com>) +- Download a folder from repository. !26532 (kiameisomabes) +- Remove cleaned up OIDs from database and cache. !26555 +- Disables kubernetes resources creation if a cluster is not managed. !26565 +- Add CI_COMMIT_REF_PROTECTED CI variable. !26716 (Jason van den Hurk) +- Add new API endpoint to expose a single environment. !26887 +- Allow Sentry configuration to be passed on gitlab.yml. !27091 (Roger Meier) +- CI variables of type file. !27112 +- Allow linking to a private helm repository by providing credentials, and customisation of repository name. !27123 (Stuart Moore @stjm-cc) +- Add time tracking information to Issue Boards sidebar. !27166 +- Play all manual jobs in a stage. !27188 +- Instance level kubernetes clusters. !27196 +- Adds if InfluxDB and Prometheus metrics are enabled to usage ping data. !27238 +- Autosave description in epics. !27296 +- Add deployment events to chat notification services. !27338 +- Add packages_size to ProjectStatistics. !27373 +- Added OmniAuth OpenID Connect strategy. !27383 (Horatiu Eugen Vlad) +- Test using Git 2.21. !27418 +- Use official Gitea logo in importer. !27424 (Matti Ranta (@techknowlogick)) +- Add option to set access_level of runners upon registration. !27490 (Zelin L) +- Add initial GraphQL query for Groups. !27492 +- Enable Sidekiq Reliable Fetcher for background jobs by default. !27530 +- Add backend support for a External Dashboard URL setting. !27550 +- Implement UI for uninstalling Cluster’s managed apps. !27559 +- Resolve Salesforce.com omniauth support. !27834 +- Leave project/group from access granted email. !27892 +- Allow Sentry client-side DSN to be passed on gitlab.yml. !27967 +- GraphQL: improve evaluation of query complexity based on arguments and query limits. !28017 +- Adds badge for Canary environment and help link. +- Support negative matches. +- Show category icons in user popover. +- Added Omniauth UltraAuth strategy to GitLab. (Kartikey Tanna) + +### Other (29 changes, 8 of them are from the community) + +- Validate refs used in controllers don't have spaces. !24037 +- Migrate correlation and tracing code to LabKit. !25379 +- Update node.js to 10.15.3 in CI template for Hexo. !25943 (Takuya Noguchi) +- Improve icons and button order in project overview. !26796 +- Add instructions on how to contribute a Built-In template for project. !26976 +- Extract DiscussionNotes component from NoteableDiscussion. !27066 +- Bump gRPC to 1.19.0 and protobuf to 3.7.1. !27086 +- Extract DiscussionActions component from NoteableDiscussion. !27227 +- Show disabled project repo mirrors in settings. !27326 +- Add backtrace to Gitaly performance bar. !27345 +- Moved EE/CE differences for dropdown_value_collapsed into CE. !27367 +- Remove "You are already signed in" banner. !27377 +- Move ee-specific code from boards/components/issue_card_inner.vue. !27394 (Roman Rodionov) +- Upgrade to Rails 5.1. !27480 (Jasper Maes) +- Update GitLab Runner Helm Chart to 0.4.0. !27508 +- Update GitLab Runner Helm Chart to 0.4.1. !27627 +- Refactored notes tests from Karma to Jest. !27648 (Martin Hobert) +- refactor(issue): Refactored issue tests from Karma to Jest. !27673 (Martin Hobert) +- Refactored Karma spec files to Jest. !27688 (Martin Hobert) +- Add CSS fix for <wbr> elements on IE11. !27846 +- Update clair-local-scan to v2.0.8 for container scanning. !27977 +- Use PostgreSQL 10.7 in tests. !28020 +- Document EE License Auto Import During Install. !28106 +- Remove the note in the docs that multi-line suggestions are not yet available. !28119 (hardysim) +- Update gitlab-shell to v9.1.0. !28184 +- Add EE fixtures to SeedFu list. !28241 +- Replaces CSS with BS4 utility class for pipeline schedules. +- Creates a vendors folder for external CSS. +- Add some frozen string to spec/**/*.rb. (gfyoung) + + ## 11.10.4 (2019-05-01) ### Fixed (12 changes) @@ -379,7 +379,7 @@ group :development, :test do end group :test do - gem 'shoulda-matchers', '~> 3.1.2', require: false + gem 'shoulda-matchers', '~> 4.0.1', require: false gem 'email_spec', '~> 2.2.0' gem 'json-schema', '~> 2.8.0' gem 'webmock', '~> 3.5.1' diff --git a/Gemfile.lock b/Gemfile.lock index 2dbff1674df..a63b7cc84aa 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -857,8 +857,8 @@ GEM sexp_processor (4.12.0) sham_rack (1.3.6) rack - shoulda-matchers (3.1.2) - activesupport (>= 4.0.0) + shoulda-matchers (4.0.1) + activesupport (>= 4.2.0) sidekiq (5.2.7) connection_pool (~> 2.2, >= 2.2.2) rack (>= 1.5.0) @@ -1199,7 +1199,7 @@ DEPENDENCIES sentry-raven (~> 2.7) settingslogic (~> 2.0.9) sham_rack (~> 1.3.6) - shoulda-matchers (~> 3.1.2) + shoulda-matchers (~> 4.0.1) sidekiq (~> 5.2.7) sidekiq-cron (~> 1.0) simple_po_parser (~> 1.1.2) @@ -1 +1 @@ -11.11.0-pre +11.12.0-pre diff --git a/app/assets/javascripts/filtered_search/dropdown_user.js b/app/assets/javascripts/filtered_search/dropdown_user.js index f1e7be6bde1..a65c0012b4d 100644 --- a/app/assets/javascripts/filtered_search/dropdown_user.js +++ b/app/assets/javascripts/filtered_search/dropdown_user.js @@ -18,6 +18,7 @@ export default class DropdownUser extends DropdownAjaxFilter { group_id: this.getGroupId(), project_id: this.getProjectId(), current_user: true, + ...this.projectOrGroupId(), }, onLoadingFinished: () => { this.hideCurrentUser(); @@ -36,4 +37,17 @@ export default class DropdownUser extends DropdownAjaxFilter { getProjectId() { return this.input.getAttribute('data-project-id'); } + + projectOrGroupId() { + const projectId = this.getProjectId(); + const groupId = this.getGroupId(); + if (groupId) { + return { + group_id: groupId, + }; + } + return { + project_id: projectId, + }; + } } diff --git a/app/assets/javascripts/repository/components/table/index.vue b/app/assets/javascripts/repository/components/table/index.vue index 7119861c7b3..ad3d8f9329d 100644 --- a/app/assets/javascripts/repository/components/table/index.vue +++ b/app/assets/javascripts/repository/components/table/index.vue @@ -4,11 +4,13 @@ import { sprintf, __ } from '../../../locale'; import getRefMixin from '../../mixins/get_ref'; import getFiles from '../../queries/getFiles.graphql'; import TableHeader from './header.vue'; +import TableRow from './row.vue'; export default { components: { GlLoadingIcon, TableHeader, + TableRow, }, mixins: [getRefMixin], apollo: { @@ -57,7 +59,15 @@ export default { }} </caption> <table-header /> - <tbody></tbody> + <tbody> + <table-row + v-for="entry in files" + :id="entry.id" + :key="entry.id" + :path="entry.flatPath" + :type="entry.type" + /> + </tbody> </table> <gl-loading-icon v-if="isLoadingFiles" class="my-3" size="md" /> </div> diff --git a/app/assets/javascripts/repository/components/table/row.vue b/app/assets/javascripts/repository/components/table/row.vue new file mode 100644 index 00000000000..0ad0fdbd605 --- /dev/null +++ b/app/assets/javascripts/repository/components/table/row.vue @@ -0,0 +1,60 @@ +<script> +import { getIconName } from '../../utils/icon'; +import getRefMixin from '../../mixins/get_ref'; + +export default { + mixins: [getRefMixin], + props: { + id: { + type: Number, + required: true, + }, + path: { + type: String, + required: true, + }, + type: { + type: String, + required: true, + }, + }, + computed: { + routerLinkTo() { + return this.isFolder ? { path: `/tree/${this.ref}/${this.path}` } : null; + }, + iconName() { + return `fa-${getIconName(this.type, this.path)}`; + }, + isFolder() { + return this.type === 'folder'; + }, + isSubmodule() { + return this.type === 'commit'; + }, + linkComponent() { + return this.isFolder ? 'router-link' : 'a'; + }, + }, + methods: { + openRow() { + if (this.isFolder) { + this.$router.push(this.routerLinkTo); + } + }, + }, +}; +</script> + +<template> + <tr v-once :class="`file_${id}`" class="tree-item" @click="openRow"> + <td class="tree-item-file-name"> + <i :aria-label="type" role="img" :class="iconName" class="fa fa-fw"></i> + <component :is="linkComponent" :to="routerLinkTo" class="str-truncated">{{ path }}</component> + <template v-if="isSubmodule"> + @ <a href="#" class="commit-sha">{{ id }}</a> + </template> + </td> + <td class="d-none d-sm-table-cell tree-commit"></td> + <td class="tree-time-ago text-right"></td> + </tr> +</template> diff --git a/app/assets/javascripts/repository/graphql.js b/app/assets/javascripts/repository/graphql.js index 0aedc73fc12..c85db5c01e5 100644 --- a/app/assets/javascripts/repository/graphql.js +++ b/app/assets/javascripts/repository/graphql.js @@ -7,7 +7,36 @@ Vue.use(VueApollo); const defaultClient = createDefaultClient({ Query: { files() { - return []; + return [ + { + __typename: 'file', + id: 1, + name: 'app', + flatPath: 'app', + type: 'folder', + }, + { + __typename: 'file', + id: 2, + name: 'gitlab-svg', + flatPath: 'gitlab-svg', + type: 'commit', + }, + { + __typename: 'file', + id: 3, + name: 'index.js', + flatPath: 'index.js', + type: 'blob', + }, + { + __typename: 'file', + id: 4, + name: 'test.pdf', + flatPath: 'fixtures/test.pdf', + type: 'blob', + }, + ]; }, }, }); diff --git a/app/assets/javascripts/repository/pages/tree.vue b/app/assets/javascripts/repository/pages/tree.vue index 413102b2cd3..3b898d1aa91 100644 --- a/app/assets/javascripts/repository/pages/tree.vue +++ b/app/assets/javascripts/repository/pages/tree.vue @@ -2,7 +2,7 @@ import FileTable from '../components/table/index.vue'; export default { - component: { + components: { FileTable, }, props: { diff --git a/app/assets/javascripts/repository/queries/getFiles.graphql b/app/assets/javascripts/repository/queries/getFiles.graphql index 5ceaf67ea82..fb446780ed1 100644 --- a/app/assets/javascripts/repository/queries/getFiles.graphql +++ b/app/assets/javascripts/repository/queries/getFiles.graphql @@ -1,8 +1,7 @@ query getFiles($path: String!, $ref: String!) { files(path: $path, ref: $ref) @client { id - name - fullPath + flatPath type } } diff --git a/app/assets/javascripts/repository/utils/icon.js b/app/assets/javascripts/repository/utils/icon.js new file mode 100644 index 00000000000..3e93ff0ec39 --- /dev/null +++ b/app/assets/javascripts/repository/utils/icon.js @@ -0,0 +1,99 @@ +const entryTypeIcons = { + folder: 'folder', + commit: 'archive', +}; + +const fileTypeIcons = [ + { extensions: ['pdf'], name: 'file-pdf-o' }, + { + extensions: [ + 'jpg', + 'jpeg', + 'jif', + 'jfif', + 'jp2', + 'jpx', + 'j2k', + 'j2c', + 'png', + 'gif', + 'tif', + 'tiff', + 'svg', + 'ico', + 'bmp', + ], + name: 'file-image-o', + }, + { + extensions: ['zip', 'zipx', 'tar', 'gz', 'bz', 'bzip', 'xz', 'rar', '7z'], + name: 'file-archive-o', + }, + { extensions: ['mp3', 'wma', 'ogg', 'oga', 'wav', 'flac', 'aac'], name: 'file-audio-o' }, + { + extensions: [ + 'mp4', + 'm4p', + 'm4v', + 'mpg', + 'mp2', + 'mpeg', + 'mpe', + 'mpv', + 'm2v', + 'avi', + 'mkv', + 'flv', + 'ogv', + 'mov', + '3gp', + '3g2', + ], + name: 'file-video-o', + }, + { extensions: ['doc', 'dot', 'docx', 'docm', 'dotx', 'dotm', 'docb'], name: 'file-word-o' }, + { + extensions: [ + 'xls', + 'xlt', + 'xlm', + 'xlsx', + 'xlsm', + 'xltx', + 'xltm', + 'xlsb', + 'xla', + 'xlam', + 'xll', + 'xlw', + ], + name: 'file-excel-o', + }, + { + extensions: [ + 'ppt', + 'pot', + 'pps', + 'pptx', + 'pptm', + 'potx', + 'potm', + 'ppam', + 'ppsx', + 'ppsm', + 'sldx', + 'sldm', + ], + name: 'file-powerpoint-o', + }, +]; + +// eslint-disable-next-line import/prefer-default-export +export const getIconName = (type, path) => { + if (entryTypeIcons[type]) return entryTypeIcons[type]; + + const extension = path.split('.').pop(); + const file = fileTypeIcons.find(t => t.extensions.some(ext => ext === extension)); + + return file ? file.name : 'file-text-o'; +}; diff --git a/app/assets/javascripts/search_autocomplete.js b/app/assets/javascripts/search_autocomplete.js index 0a4583b5861..e5c3cebfb9a 100644 --- a/app/assets/javascripts/search_autocomplete.js +++ b/app/assets/javascripts/search_autocomplete.js @@ -2,7 +2,7 @@ import $ from 'jquery'; import { escape, throttle } from 'underscore'; -import { s__, sprintf } from '~/locale'; +import { s__, __, sprintf } from '~/locale'; import { getIdenticonBackgroundClass, getIdenticonTitle } from '~/helpers/avatar_helper'; import axios from './lib/utils/axios_utils'; import DropdownUtils from './filtered_search/dropdown_utils'; @@ -439,7 +439,7 @@ export class SearchAutocomplete { restoreMenu() { var html; - html = '<ul><li class="dropdown-menu-empty-item"><a>Loading...</a></li></ul>'; + html = `<ul><li class="dropdown-menu-empty-item"><a>${__('Loading...')}</a></li></ul>`; return this.dropdownContent.html(html); } diff --git a/app/assets/javascripts/star.js b/app/assets/javascripts/star.js index 7404dfbf22a..70f89152f70 100644 --- a/app/assets/javascripts/star.js +++ b/app/assets/javascripts/star.js @@ -31,7 +31,7 @@ export default class Star { $this.prepend(spriteIcon('star', iconClasses)); } }) - .catch(() => Flash('Star toggle failed. Try again later.')); + .catch(() => Flash(__('Star toggle failed. Try again later.'))); }); } } diff --git a/app/assets/javascripts/subscription_select.js b/app/assets/javascripts/subscription_select.js index ebe1c6dd02d..7206bbd7109 100644 --- a/app/assets/javascripts/subscription_select.js +++ b/app/assets/javascripts/subscription_select.js @@ -1,4 +1,5 @@ import $ from 'jquery'; +import { __ } from './locale'; export default function subscriptionSelect() { $('.js-subscription-event').each((i, element) => { @@ -8,7 +9,7 @@ export default function subscriptionSelect() { selectable: true, fieldName, toggleLabel(selected, el, instance) { - let label = 'Subscription'; + let label = __('Subscription'); const $item = instance.dropdown.find('.is-active'); if ($item.length) { label = $item.text(); diff --git a/app/assets/stylesheets/framework/mixins.scss b/app/assets/stylesheets/framework/mixins.scss index 18eb10c1f23..97de0c98325 100644 --- a/app/assets/stylesheets/framework/mixins.scss +++ b/app/assets/stylesheets/framework/mixins.scss @@ -325,8 +325,8 @@ line-height: 1; padding: 0; min-width: 16px; - color: $gray-darkest; - fill: $gray-darkest; + color: $gray-600; + fill: $gray-600; .fa { position: relative; diff --git a/app/assets/stylesheets/pages/notes.scss b/app/assets/stylesheets/pages/notes.scss index fcb57db590a..50c87e55f56 100644 --- a/app/assets/stylesheets/pages/notes.scss +++ b/app/assets/stylesheets/pages/notes.scss @@ -645,7 +645,7 @@ $note-form-margin-left: 72px; display: inline-flex; align-items: center; margin-left: 10px; - color: $gray-darkest; + color: $gray-600; @include notes-media('max', map-get($grid-breakpoints, sm) - 1) { float: none; diff --git a/app/controllers/concerns/enforces_two_factor_authentication.rb b/app/controllers/concerns/enforces_two_factor_authentication.rb index 71bdef8ce03..0fddf15d197 100644 --- a/app/controllers/concerns/enforces_two_factor_authentication.rb +++ b/app/controllers/concerns/enforces_two_factor_authentication.rb @@ -16,7 +16,7 @@ module EnforcesTwoFactorAuthentication end def check_two_factor_requirement - if two_factor_authentication_required? && current_user && !current_user.two_factor_enabled? && !skip_two_factor? + if two_factor_authentication_required? && current_user && !current_user.temp_oauth_email? && !current_user.two_factor_enabled? && !skip_two_factor? redirect_to profile_two_factor_auth_path end end diff --git a/app/finders/projects/serverless/functions_finder.rb b/app/finders/projects/serverless/functions_finder.rb index d9802598c64..e5bffccabfe 100644 --- a/app/finders/projects/serverless/functions_finder.rb +++ b/app/finders/projects/serverless/functions_finder.rb @@ -3,6 +3,8 @@ module Projects module Serverless class FunctionsFinder + attr_reader :project + def initialize(project) @clusters = project.clusters @project = project @@ -27,7 +29,7 @@ module Projects environment_scope == c.environment_scope end - func = ::Serverless::Function.new(@project, name, cluster.platform_kubernetes&.actual_namespace) + func = ::Serverless::Function.new(project, name, cluster.kubernetes_namespace_for(project)) prometheus_adapter.query(:knative_invocation, func) end @@ -43,7 +45,7 @@ module Projects clusters_with_knative_installed.preload_knative.map do |cluster| next if environment_scope != cluster.environment_scope - services = cluster.application_knative.services_for(ns: cluster.platform_kubernetes&.actual_namespace) + services = cluster.application_knative.services_for(ns: cluster.kubernetes_namespace_for(project)) .select { |svc| svc["metadata"]["name"] == name } add_metadata(cluster, services).first unless services.nil? @@ -52,7 +54,7 @@ module Projects def knative_services clusters_with_knative_installed.preload_knative.map do |cluster| - services = cluster.application_knative.services_for(ns: cluster.platform_kubernetes&.actual_namespace) + services = cluster.application_knative.services_for(ns: cluster.kubernetes_namespace_for(project)) add_metadata(cluster, services) unless services.nil? end end @@ -64,7 +66,7 @@ module Projects if services.length == 1 s["podcount"] = cluster.application_knative.service_pod_details( - cluster.platform_kubernetes&.actual_namespace, + cluster.kubernetes_namespace_for(project), s["metadata"]["name"]).length end end @@ -76,7 +78,7 @@ module Projects # rubocop: disable CodeReuse/ServiceClass def prometheus_adapter - @prometheus_adapter ||= ::Prometheus::AdapterService.new(@project).prometheus_adapter + @prometheus_adapter ||= ::Prometheus::AdapterService.new(project).prometheus_adapter end # rubocop: enable CodeReuse/ServiceClass end diff --git a/app/graphql/resolvers/tree_resolver.rb b/app/graphql/resolvers/tree_resolver.rb new file mode 100644 index 00000000000..5aad1c71b40 --- /dev/null +++ b/app/graphql/resolvers/tree_resolver.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +module Resolvers + class TreeResolver < BaseResolver + argument :path, GraphQL::STRING_TYPE, + required: false, + default_value: '', + description: 'The path to get the tree for. Default value is the root of the repository' + argument :ref, GraphQL::STRING_TYPE, + required: false, + default_value: :head, + description: 'The commit ref to get the tree for. Default value is HEAD' + argument :recursive, GraphQL::BOOLEAN_TYPE, + required: false, + default_value: false, + description: 'Used to get a recursive tree. Default is false' + + alias_method :repository, :object + + def resolve(**args) + return unless repository.exists? + + repository.tree(args[:ref], args[:path], recursive: args[:recursive]) + end + end +end diff --git a/app/graphql/types/project_type.rb b/app/graphql/types/project_type.rb index baea6658e05..06a1aab09f6 100644 --- a/app/graphql/types/project_type.rb +++ b/app/graphql/types/project_type.rb @@ -69,6 +69,8 @@ module Types field :namespace, Types::NamespaceType, null: false field :group, Types::GroupType, null: true + field :repository, Types::RepositoryType, null: false + field :merge_requests, Types::MergeRequestType.connection_type, null: true, diff --git a/app/graphql/types/repository_type.rb b/app/graphql/types/repository_type.rb new file mode 100644 index 00000000000..5987467e1ea --- /dev/null +++ b/app/graphql/types/repository_type.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module Types + class RepositoryType < BaseObject + graphql_name 'Repository' + + authorize :download_code + + field :root_ref, GraphQL::STRING_TYPE, null: true + field :empty, GraphQL::BOOLEAN_TYPE, null: false, method: :empty? + field :exists, GraphQL::BOOLEAN_TYPE, null: false, method: :exists? + field :tree, Types::Tree::TreeType, null: true, resolver: Resolvers::TreeResolver + end +end diff --git a/app/graphql/types/tree/blob_type.rb b/app/graphql/types/tree/blob_type.rb new file mode 100644 index 00000000000..230624201b0 --- /dev/null +++ b/app/graphql/types/tree/blob_type.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true +module Types + module Tree + class BlobType < BaseObject + implements Types::Tree::EntryType + + graphql_name 'Blob' + end + end +end diff --git a/app/graphql/types/tree/entry_type.rb b/app/graphql/types/tree/entry_type.rb new file mode 100644 index 00000000000..d8e8642ddb8 --- /dev/null +++ b/app/graphql/types/tree/entry_type.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true +module Types + module Tree + module EntryType + include Types::BaseInterface + + field :id, GraphQL::ID_TYPE, null: false + field :name, GraphQL::STRING_TYPE, null: false + field :type, Tree::TypeEnum, null: false + field :path, GraphQL::STRING_TYPE, null: false + field :flat_path, GraphQL::STRING_TYPE, null: false + end + end +end diff --git a/app/graphql/types/tree/submodule_type.rb b/app/graphql/types/tree/submodule_type.rb new file mode 100644 index 00000000000..cea76dbfd2a --- /dev/null +++ b/app/graphql/types/tree/submodule_type.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true +module Types + module Tree + class SubmoduleType < BaseObject + implements Types::Tree::EntryType + + graphql_name 'Submodule' + end + end +end diff --git a/app/graphql/types/tree/tree_entry_type.rb b/app/graphql/types/tree/tree_entry_type.rb new file mode 100644 index 00000000000..d5cfb898aea --- /dev/null +++ b/app/graphql/types/tree/tree_entry_type.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true +module Types + module Tree + class TreeEntryType < BaseObject + implements Types::Tree::EntryType + + graphql_name 'TreeEntry' + description 'Represents a directory' + end + end +end diff --git a/app/graphql/types/tree/tree_type.rb b/app/graphql/types/tree/tree_type.rb new file mode 100644 index 00000000000..1eb6c43972e --- /dev/null +++ b/app/graphql/types/tree/tree_type.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true +module Types + module Tree + class TreeType < BaseObject + graphql_name 'Tree' + + field :trees, Types::Tree::TreeEntryType.connection_type, null: false + field :submodules, Types::Tree::SubmoduleType.connection_type, null: false + field :blobs, Types::Tree::BlobType.connection_type, null: false + end + end +end diff --git a/app/graphql/types/tree/type_enum.rb b/app/graphql/types/tree/type_enum.rb new file mode 100644 index 00000000000..6560d91e9e5 --- /dev/null +++ b/app/graphql/types/tree/type_enum.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module Types + module Tree + class TypeEnum < BaseEnum + graphql_name 'EntryType' + description 'Type of a tree entry' + + value 'tree', value: :tree + value 'blob', value: :blob + value 'commit', value: :commit + end + end +end diff --git a/app/models/clusters/cluster.rb b/app/models/clusters/cluster.rb index 9299e61dad3..f7ea7accab2 100644 --- a/app/models/clusters/cluster.rb +++ b/app/models/clusters/cluster.rb @@ -45,7 +45,6 @@ module Clusters has_one :application_knative, class_name: 'Clusters::Applications::Knative' has_many :kubernetes_namespaces - has_one :kubernetes_namespace, -> { order(id: :desc) }, class_name: 'Clusters::KubernetesNamespace' accepts_nested_attributes_for :provider_gcp, update_only: true accepts_nested_attributes_for :platform_kubernetes, update_only: true @@ -108,7 +107,7 @@ module Clusters scope :preload_knative, -> { preload( - :kubernetes_namespace, + :kubernetes_namespaces, :platform_kubernetes, :application_knative ) @@ -187,16 +186,16 @@ module Clusters platform_kubernetes.kubeclient if kubernetes? end + def kubernetes_namespace_for(project) + find_or_initialize_kubernetes_namespace_for_project(project).namespace + end + def find_or_initialize_kubernetes_namespace_for_project(project) - if project_type? - kubernetes_namespaces.find_or_initialize_by( - project: project, - cluster_project: cluster_project - ) - else - kubernetes_namespaces.find_or_initialize_by( - project: project - ) + attributes = { project: project } + attributes[:cluster_project] = cluster_project if project_type? + + kubernetes_namespaces.find_or_initialize_by(attributes).tap do |namespace| + namespace.set_defaults end end diff --git a/app/models/clusters/platforms/kubernetes.rb b/app/models/clusters/platforms/kubernetes.rb index 3b7b93e7631..9b951578aee 100644 --- a/app/models/clusters/platforms/kubernetes.rb +++ b/app/models/clusters/platforms/kubernetes.rb @@ -52,11 +52,14 @@ module Clusters alias_attribute :ca_pem, :ca_cert - delegate :project, to: :cluster, allow_nil: true delegate :enabled?, to: :cluster, allow_nil: true delegate :provided_by_user?, to: :cluster, allow_nil: true delegate :allow_user_defined_namespace?, to: :cluster, allow_nil: true - delegate :kubernetes_namespace, to: :cluster + + # This is just to maintain compatibility with KubernetesService, which + # will be removed in https://gitlab.com/gitlab-org/gitlab-ce/issues/39217. + # It can be removed once KubernetesService is gone. + delegate :kubernetes_namespace_for, to: :cluster, allow_nil: true alias_method :active?, :enabled? @@ -68,18 +71,6 @@ module Clusters default_value_for :authorization_type, :rbac - def actual_namespace - if namespace.present? - namespace - else - default_namespace - end - end - - def namespace_for(project) - cluster.find_or_initialize_kubernetes_namespace_for_project(project).namespace - end - def predefined_variables(project:) Gitlab::Ci::Variables::Collection.new.tap do |variables| variables.append(key: 'KUBE_URL', value: api_url) @@ -98,11 +89,13 @@ module Clusters # Once we have marked all project-level clusters that make use of this # behaviour as "unmanaged", we can remove the `cluster.project_type?` # check here. + project_namespace = cluster.kubernetes_namespace_for(project) + variables .append(key: 'KUBE_URL', value: api_url) .append(key: 'KUBE_TOKEN', value: token, public: false, masked: true) - .append(key: 'KUBE_NAMESPACE', value: actual_namespace) - .append(key: 'KUBECONFIG', value: kubeconfig, public: false, file: true) + .append(key: 'KUBE_NAMESPACE', value: project_namespace) + .append(key: 'KUBECONFIG', value: kubeconfig(project_namespace), public: false, file: true) end variables.concat(cluster.predefined_variables) @@ -115,8 +108,10 @@ module Clusters # short time later def terminals(environment) with_reactive_cache do |data| + project = environment.project + pods = filter_by_project_environment(data[:pods], project.full_path_slug, environment.slug) - terminals = pods.flat_map { |pod| terminals_for_pod(api_url, actual_namespace, pod) }.compact + terminals = pods.flat_map { |pod| terminals_for_pod(api_url, cluster.kubernetes_namespace_for(project), pod) }.compact terminals.each { |terminal| add_terminal_auth(terminal, terminal_auth) } end end @@ -124,7 +119,7 @@ module Clusters # Caches resources in the namespace so other calls don't need to block on # network access def calculate_reactive_cache - return unless enabled? && project && !project.pending_delete? + return unless enabled? # We may want to cache extra things in the future { pods: read_pods } @@ -136,33 +131,16 @@ module Clusters private - def kubeconfig + def kubeconfig(namespace) to_kubeconfig( url: api_url, - namespace: actual_namespace, + namespace: namespace, token: token, ca_pem: ca_pem) end - def default_namespace - kubernetes_namespace&.namespace.presence || fallback_default_namespace - end - - # DEPRECATED - # - # On 11.4 Clusters::KubernetesNamespace was introduced, this model will allow to - # have multiple namespaces per project. This method will be removed after migration - # has been completed. - def fallback_default_namespace - return unless project - - slug = "#{project.path}-#{project.id}".downcase - Gitlab::NamespaceSanitizer.sanitize(slug) - end - def build_kube_client! raise "Incomplete settings" unless api_url - raise "No namespace" if cluster.project_type? && actual_namespace.empty? # can probably remove this line once we remove #actual_namespace unless (username && password) || token raise "Either username/password or token is required to access API" @@ -178,9 +156,13 @@ module Clusters # Returns a hash of all pods in the namespace def read_pods - kubeclient = build_kube_client! + # TODO: The project lookup here should be moved (to environment?), + # which will enable reading pods from the correct namespace for group + # and instance clusters. + # This will be done in https://gitlab.com/gitlab-org/gitlab-ce/issues/61156 + return [] unless cluster.project_type? - kubeclient.get_pods(namespace: actual_namespace).as_json + kubeclient.get_pods(namespace: cluster.kubernetes_namespace_for(cluster.first_project)).as_json rescue Kubeclient::ResourceNotFoundError [] end diff --git a/app/models/clusters/project.rb b/app/models/clusters/project.rb index d2b68b3f117..e0bf60164ba 100644 --- a/app/models/clusters/project.rb +++ b/app/models/clusters/project.rb @@ -8,6 +8,5 @@ module Clusters belongs_to :project, class_name: '::Project' has_many :kubernetes_namespaces, class_name: 'Clusters::KubernetesNamespace', foreign_key: :cluster_project_id - has_one :kubernetes_namespace, -> { order(id: :desc) }, class_name: 'Clusters::KubernetesNamespace', foreign_key: :cluster_project_id end end diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index df162e4844c..311ba1ce6bd 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -581,6 +581,8 @@ class MergeRequest < ApplicationRecord end def validate_branches + return unless target_project && source_project + if target_project == source_project && target_branch == source_branch errors.add :branch_conflict, "You can't use same project/branch for source and target" return diff --git a/app/models/project_services/kubernetes_service.rb b/app/models/project_services/kubernetes_service.rb index fc8afa9bead..aa6b4aa1d5e 100644 --- a/app/models/project_services/kubernetes_service.rb +++ b/app/models/project_services/kubernetes_service.rb @@ -86,7 +86,7 @@ class KubernetesService < DeploymentService ] end - def actual_namespace + def kubernetes_namespace_for(project) if namespace.present? namespace else @@ -94,10 +94,6 @@ class KubernetesService < DeploymentService end end - def namespace_for(project) - actual_namespace - end - # Check we can connect to the Kubernetes API def test(*args) kubeclient = build_kube_client! @@ -118,7 +114,7 @@ class KubernetesService < DeploymentService variables .append(key: 'KUBE_URL', value: api_url) .append(key: 'KUBE_TOKEN', value: token, public: false, masked: true) - .append(key: 'KUBE_NAMESPACE', value: actual_namespace) + .append(key: 'KUBE_NAMESPACE', value: kubernetes_namespace_for(project)) .append(key: 'KUBECONFIG', value: kubeconfig, public: false, file: true) if ca_pem.present? @@ -135,8 +131,10 @@ class KubernetesService < DeploymentService # short time later def terminals(environment) with_reactive_cache do |data| + project = environment.project + pods = filter_by_project_environment(data[:pods], project.full_path_slug, environment.slug) - terminals = pods.flat_map { |pod| terminals_for_pod(api_url, actual_namespace, pod) }.compact + terminals = pods.flat_map { |pod| terminals_for_pod(api_url, kubernetes_namespace_for(project), pod) }.compact terminals.each { |terminal| add_terminal_auth(terminal, terminal_auth) } end end @@ -173,7 +171,7 @@ class KubernetesService < DeploymentService def kubeconfig to_kubeconfig( url: api_url, - namespace: actual_namespace, + namespace: kubernetes_namespace_for(project), token: token, ca_pem: ca_pem) end @@ -190,7 +188,7 @@ class KubernetesService < DeploymentService end def build_kube_client! - raise "Incomplete settings" unless api_url && actual_namespace && token + raise "Incomplete settings" unless api_url && kubernetes_namespace_for(project) && token Gitlab::Kubernetes::KubeClient.new( api_url, @@ -204,7 +202,7 @@ class KubernetesService < DeploymentService def read_pods kubeclient = build_kube_client! - kubeclient.get_pods(namespace: actual_namespace).as_json + kubeclient.get_pods(namespace: kubernetes_namespace_for(project)).as_json rescue Kubeclient::ResourceNotFoundError [] end diff --git a/app/services/projects/git_deduplication_service.rb b/app/services/projects/git_deduplication_service.rb new file mode 100644 index 00000000000..74d469ecf37 --- /dev/null +++ b/app/services/projects/git_deduplication_service.rb @@ -0,0 +1,64 @@ +# frozen_string_literal: true + +module Projects + class GitDeduplicationService < BaseService + include ExclusiveLeaseGuard + + LEASE_TIMEOUT = 86400 + + delegate :pool_repository, to: :project + attr_reader :project + + def initialize(project) + @project = project + end + + def execute + try_obtain_lease do + unless project.has_pool_repository? + disconnect_git_alternates + break + end + + if source_project? && pool_can_fetch_from_source? + fetch_from_source + end + + project.link_pool_repository if same_storage_as_pool?(project.repository) + end + end + + private + + def disconnect_git_alternates + project.repository.disconnect_alternates + end + + def pool_can_fetch_from_source? + project.git_objects_poolable? && + same_storage_as_pool?(pool_repository.source_project.repository) + end + + def same_storage_as_pool?(repository) + pool_repository.object_pool.repository.storage == repository.storage + end + + def fetch_from_source + project.pool_repository.object_pool.fetch + end + + def source_project? + return unless project.has_pool_repository? + + project.pool_repository.source_project == project + end + + def lease_timeout + LEASE_TIMEOUT + end + + def lease_key + "git_deduplication:#{project.id}" + end + end +end diff --git a/app/views/admin/users/_form.html.haml b/app/views/admin/users/_form.html.haml index 296ef073144..0656feb79cb 100644 --- a/app/views/admin/users/_form.html.haml +++ b/app/views/admin/users/_form.html.haml @@ -48,6 +48,10 @@ = render partial: 'access_levels', locals: { f: f } + = render_if_exists 'admin/users/namespace_plan_fieldset', f: f + + = render_if_exists 'admin/users/limits', f: f + %fieldset %legend Profile .form-group.row @@ -73,6 +77,8 @@ = f.label :website_url, 'Website', class: 'col-form-label' .col-sm-10= f.text_field :website_url, class: 'form-control' + = render_if_exists 'admin/users/admin_notes', f: f + .form-actions - if @user.new_record? = f.submit 'Create user', class: "btn btn-success" diff --git a/app/views/devise/shared/_signin_box.html.haml b/app/views/devise/shared/_signin_box.html.haml index ec968e435cd..f8f36a8bfff 100644 --- a/app/views/devise/shared/_signin_box.html.haml +++ b/app/views/devise/shared/_signin_box.html.haml @@ -3,17 +3,21 @@ .login-box.tab-pane{ id: "crowd", role: 'tabpanel', class: active_when(form_based_auth_provider_has_active_class?(:crowd)) } .login-body = render 'devise/sessions/new_crowd' + + = render_if_exists 'devise/sessions/new_kerberos_tab' + - @ldap_servers.each_with_index do |server, i| .login-box.tab-pane{ id: "#{server['provider_name']}", role: 'tabpanel', class: active_when(i.zero? && form_based_auth_provider_has_active_class?(:ldapmain)) } .login-body = render 'devise/sessions/new_ldap', server: server + + = render_if_exists 'devise/sessions/new_smartcard' + - if password_authentication_enabled_for_web? .login-box.tab-pane{ id: 'login-pane', role: 'tabpanel' } .login-body = render 'devise/sessions/new_base' - = render_if_exists 'devise/sessions/new_smartcard' - - elsif password_authentication_enabled_for_web? .login-box.tab-pane.active{ id: 'login-pane', role: 'tabpanel' } .login-body diff --git a/app/views/shared/_import_form.html.haml b/app/views/shared/_import_form.html.haml index 7b593ca4f76..3ee713cf499 100644 --- a/app/views/shared/_import_form.html.haml +++ b/app/views/shared/_import_form.html.haml @@ -18,3 +18,6 @@ = import_will_timeout_message(ci_cd_only) %li = import_svn_message(ci_cd_only) + = render_if_exists 'shared/ci_cd_only_link', ci_cd_only: ci_cd_only + += render_if_exists 'shared/ee/import_form', f: f, ci_cd_only: ci_cd_only diff --git a/app/views/shared/_label_row.html.haml b/app/views/shared/_label_row.html.haml index a1aab2e6a08..af11ce94ec5 100644 --- a/app/views/shared/_label_row.html.haml +++ b/app/views/shared/_label_row.html.haml @@ -22,3 +22,4 @@ · %li.label-link-item.priority-badge.js-priority-badge.inline.prepend-left-10 .label-badge.label-badge-blue= _('Prioritized label') + = render_if_exists 'shared/label_row_epics_link', label: label diff --git a/app/views/snippets/_actions.html.haml b/app/views/snippets/_actions.html.haml index ef8664e6f47..9952f373156 100644 --- a/app/views/snippets/_actions.html.haml +++ b/app/views/snippets/_actions.html.haml @@ -7,7 +7,7 @@ - if can?(current_user, :admin_personal_snippet, @snippet) = link_to snippet_path(@snippet), method: :delete, data: { confirm: _("Are you sure?") }, class: "btn btn-grouped btn-inverted btn-remove", title: _('Delete Snippet') do = _("Delete") - = link_to new_snippet_path, class: "btn btn-grouped btn-inverted btn-create", title: _("New snippet") do + = link_to new_snippet_path, class: "btn btn-grouped btn-success btn-inverted", title: _("New snippet") do = _("New snippet") - if @snippet.submittable_as_spam_by?(current_user) = link_to _('Submit as spam'), mark_as_spam_snippet_path(@snippet), method: :post, class: 'btn btn-grouped btn-spam', title: _('Submit as spam') diff --git a/app/workers/git_garbage_collect_worker.rb b/app/workers/git_garbage_collect_worker.rb index d4a6f53dae5..489d6215774 100644 --- a/app/workers/git_garbage_collect_worker.rb +++ b/app/workers/git_garbage_collect_worker.rb @@ -23,7 +23,9 @@ class GitGarbageCollectWorker end task = task.to_sym - project.link_pool_repository + + ::Projects::GitDeduplicationService.new(project).execute + gitaly_call(task, project.repository.raw_repository) # Refresh the branch cache in case garbage collection caused a ref lookup to fail diff --git a/changelogs/unreleased/10012-move-ee-diff-for-boards-issue-card-inner.yml b/changelogs/unreleased/10012-move-ee-diff-for-boards-issue-card-inner.yml deleted file mode 100644 index f15375e83f4..00000000000 --- a/changelogs/unreleased/10012-move-ee-diff-for-boards-issue-card-inner.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Move ee-specific code from boards/components/issue_card_inner.vue -merge_request: 27394 -author: Roman Rodionov -type: other diff --git a/changelogs/unreleased/10083-dropdown-ce-ee-difference.yml b/changelogs/unreleased/10083-dropdown-ce-ee-difference.yml deleted file mode 100644 index e8594edb76a..00000000000 --- a/changelogs/unreleased/10083-dropdown-ce-ee-difference.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Moved EE/CE differences for dropdown_value_collapsed into CE -merge_request: 27367 -author: -type: other diff --git a/changelogs/unreleased/10327-enable-reliable-fetcher-by-default.yml b/changelogs/unreleased/10327-enable-reliable-fetcher-by-default.yml deleted file mode 100644 index 89d2fced6e1..00000000000 --- a/changelogs/unreleased/10327-enable-reliable-fetcher-by-default.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Enable Sidekiq Reliable Fetcher for background jobs by default -merge_request: 27530 -author: -type: added diff --git a/changelogs/unreleased/10808-allow-license-import-during-install.yml b/changelogs/unreleased/10808-allow-license-import-during-install.yml deleted file mode 100644 index f93edf03d51..00000000000 --- a/changelogs/unreleased/10808-allow-license-import-during-install.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Document EE License Auto Import During Install -merge_request: 28106 -author: -type: other diff --git a/changelogs/unreleased/10921-display-scoped-labels-ce.yml b/changelogs/unreleased/10921-display-scoped-labels-ce.yml deleted file mode 100644 index 7a0e7fec41b..00000000000 --- a/changelogs/unreleased/10921-display-scoped-labels-ce.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Display scoped labels in Issue Boards -merge_request: 27164 -author: -type: fixed diff --git a/changelogs/unreleased/11254-overflow-ce.yml b/changelogs/unreleased/11254-overflow-ce.yml deleted file mode 100644 index dcac46000ac..00000000000 --- a/changelogs/unreleased/11254-overflow-ce.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Hide ScopedBadge overflow notes -merge_request: 27651 -author: -type: fixed diff --git a/changelogs/unreleased/18432-switch-to-sassc-rails.yml b/changelogs/unreleased/18432-switch-to-sassc-rails.yml deleted file mode 100644 index 1c9d515c52f..00000000000 --- a/changelogs/unreleased/18432-switch-to-sassc-rails.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Switch to sassc-rails for faster stylesheet compilation -merge_request: 26224 -author: -type: changed diff --git a/changelogs/unreleased/24704-download-repository-path.yml b/changelogs/unreleased/24704-download-repository-path.yml deleted file mode 100644 index ff3082bec45..00000000000 --- a/changelogs/unreleased/24704-download-repository-path.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Download a folder from repository -merge_request: 26532 -author: kiameisomabes -type: added diff --git a/changelogs/unreleased/24985-align-urlvalidator-to-validate_url-gem-implementation.yml b/changelogs/unreleased/24985-align-urlvalidator-to-validate_url-gem-implementation.yml deleted file mode 100644 index 1143e4effea..00000000000 --- a/changelogs/unreleased/24985-align-urlvalidator-to-validate_url-gem-implementation.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: "Align UrlValidator to validate_url gem implementation" -merge_request: 27194 -author: Horatiu Eugen Vlad -type: fixed diff --git a/changelogs/unreleased/25604-add-dotnet-core-yaml-template.yml b/changelogs/unreleased/25604-add-dotnet-core-yaml-template.yml deleted file mode 100644 index ef9172aaf3b..00000000000 --- a/changelogs/unreleased/25604-add-dotnet-core-yaml-template.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add .NET Core YAML template -merge_request: 25604 -author: Piotr Wosiek -type: added diff --git a/changelogs/unreleased/26021-added-write_repository-scope-for-personal-access-token.yml b/changelogs/unreleased/26021-added-write_repository-scope-for-personal-access-token.yml deleted file mode 100644 index da550d35f12..00000000000 --- a/changelogs/unreleased/26021-added-write_repository-scope-for-personal-access-token.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Added write_repository scope for personal access token -merge_request: 26021 -author: Horatiu Eugen Vlad -type: added diff --git a/changelogs/unreleased/27383-added_omniauth_openid_connect_startegy.yml b/changelogs/unreleased/27383-added_omniauth_openid_connect_startegy.yml deleted file mode 100644 index c49b201f0de..00000000000 --- a/changelogs/unreleased/27383-added_omniauth_openid_connect_startegy.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Added OmniAuth OpenID Connect strategy -merge_request: 27383 -author: Horatiu Eugen Vlad -type: added diff --git a/changelogs/unreleased/27424-tklk-gitea-logo.yml b/changelogs/unreleased/27424-tklk-gitea-logo.yml deleted file mode 100644 index 0d41bb39aad..00000000000 --- a/changelogs/unreleased/27424-tklk-gitea-logo.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: "Use official Gitea logo in importer" -merge_request: 27424 -author: Matti Ranta (@techknowlogick) -type: added
\ No newline at end of file diff --git a/changelogs/unreleased/28119-remove-note-multi-line-suggestions.yml b/changelogs/unreleased/28119-remove-note-multi-line-suggestions.yml deleted file mode 100644 index 2fbacbcb011..00000000000 --- a/changelogs/unreleased/28119-remove-note-multi-line-suggestions.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Remove the note in the docs that multi-line suggestions are not yet available -merge_request: 28119 -author: hardysim -type: other diff --git a/changelogs/unreleased/28741-play-all-manual-jobs.yml b/changelogs/unreleased/28741-play-all-manual-jobs.yml deleted file mode 100644 index 30b26e3c0ed..00000000000 --- a/changelogs/unreleased/28741-play-all-manual-jobs.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Play all manual jobs in a stage -merge_request: 27188 -author: -type: added diff --git a/changelogs/unreleased/30093-apply-bfg-object-map-to-database.yml b/changelogs/unreleased/30093-apply-bfg-object-map-to-database.yml deleted file mode 100644 index ec851dfcacc..00000000000 --- a/changelogs/unreleased/30093-apply-bfg-object-map-to-database.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Remove cleaned up OIDs from database and cache -merge_request: 26555 -author: -type: added diff --git a/changelogs/unreleased/30157-api-expose-single-environment.yml b/changelogs/unreleased/30157-api-expose-single-environment.yml deleted file mode 100644 index f9619dbcc7d..00000000000 --- a/changelogs/unreleased/30157-api-expose-single-environment.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: 'Add new API endpoint to expose a single environment.' -merge_request: 26887 -author: -type: added diff --git a/changelogs/unreleased/31331-add-time-tracking-issue-boards-sidebar.yml b/changelogs/unreleased/31331-add-time-tracking-issue-boards-sidebar.yml deleted file mode 100644 index b3ffb77ccad..00000000000 --- a/changelogs/unreleased/31331-add-time-tracking-issue-boards-sidebar.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add time tracking information to Issue Boards sidebar -merge_request: 27166 -author: -type: added diff --git a/changelogs/unreleased/46048-canary-next.yml b/changelogs/unreleased/46048-canary-next.yml deleted file mode 100644 index 1a702cccff9..00000000000 --- a/changelogs/unreleased/46048-canary-next.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Adds badge for Canary environment and help link -merge_request: -author: -type: added diff --git a/changelogs/unreleased/46806-typed-ci-variables.yml b/changelogs/unreleased/46806-typed-ci-variables.yml deleted file mode 100644 index aa15c31bca1..00000000000 --- a/changelogs/unreleased/46806-typed-ci-variables.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: CI variables of type file -merge_request: 27112 -author: -type: added diff --git a/changelogs/unreleased/47327-fix-github-import-visibility.yml b/changelogs/unreleased/47327-fix-github-import-visibility.yml deleted file mode 100644 index b02318f0e89..00000000000 --- a/changelogs/unreleased/47327-fix-github-import-visibility.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix GitHub project import visibility -merge_request: 27133 -author: Daniel Wyatt -type: fixed diff --git a/changelogs/unreleased/47584-label-text-color.yml b/changelogs/unreleased/47584-label-text-color.yml deleted file mode 100644 index 7d5eaa62793..00000000000 --- a/changelogs/unreleased/47584-label-text-color.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Resolve issue where list labels did not have the correct text color on creation -merge_request: 26794 -author: Tucker Chapman -type: fixed diff --git a/changelogs/unreleased/48479-auto-direction-for-issue-title.yml b/changelogs/unreleased/48479-auto-direction-for-issue-title.yml deleted file mode 100644 index 0571f58ab4d..00000000000 --- a/changelogs/unreleased/48479-auto-direction-for-issue-title.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add auto direction for issue title -merge_request: 27378 -author: Ahmad Haghighi -type: fixed diff --git a/changelogs/unreleased/50926-sort-by-due-date-and-popularity.yml b/changelogs/unreleased/50926-sort-by-due-date-and-popularity.yml deleted file mode 100644 index 7efc800be1e..00000000000 --- a/changelogs/unreleased/50926-sort-by-due-date-and-popularity.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Sort by due date and popularity in both directions for Issues and Merge requests -merge_request: 25502 -author: Nermin Vehabovic -type: changed diff --git a/changelogs/unreleased/51963-support-prometheus-for-group-level-clusters.yml b/changelogs/unreleased/51963-support-prometheus-for-group-level-clusters.yml deleted file mode 100644 index ede2e242156..00000000000 --- a/changelogs/unreleased/51963-support-prometheus-for-group-level-clusters.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Support prometheus for group level clusters -merge_request: 27280 -author: -type: changed diff --git a/changelogs/unreleased/53064-bypassing-pipeline-jobs-by-canceling-the-pipeline-and-manually-running-later-jobs.yml b/changelogs/unreleased/53064-bypassing-pipeline-jobs-by-canceling-the-pipeline-and-manually-running-later-jobs.yml deleted file mode 100644 index 48f0a668982..00000000000 --- a/changelogs/unreleased/53064-bypassing-pipeline-jobs-by-canceling-the-pipeline-and-manually-running-later-jobs.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Make canceled jobs not retryable -merge_request: 27503 -author: -type: changed diff --git a/changelogs/unreleased/53138-add-metrics-usage-ping.yml b/changelogs/unreleased/53138-add-metrics-usage-ping.yml deleted file mode 100644 index db6af77a647..00000000000 --- a/changelogs/unreleased/53138-add-metrics-usage-ping.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Adds if InfluxDB and Prometheus metrics are enabled to usage ping data -merge_request: 27238 -author: -type: added diff --git a/changelogs/unreleased/53279-fix-updated_at-api.yml b/changelogs/unreleased/53279-fix-updated_at-api.yml deleted file mode 100644 index c64dada7eaa..00000000000 --- a/changelogs/unreleased/53279-fix-updated_at-api.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: "Respect updated_at attribute in notes produced by API calls" -merge_request: 27124 -author: Ben Gamari -type: fixed diff --git a/changelogs/unreleased/53973-fix-subpixel-border-issue.yml b/changelogs/unreleased/53973-fix-subpixel-border-issue.yml deleted file mode 100644 index 0dae7047236..00000000000 --- a/changelogs/unreleased/53973-fix-subpixel-border-issue.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix MR discussion border missing in chrome sometimes -merge_request: 28185 -author: -type: fixed diff --git a/changelogs/unreleased/54405-resolve-discussion-when-applying-a-suggested-change.yml b/changelogs/unreleased/54405-resolve-discussion-when-applying-a-suggested-change.yml deleted file mode 100644 index 862ce623d8c..00000000000 --- a/changelogs/unreleased/54405-resolve-discussion-when-applying-a-suggested-change.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Resolve discussion when apply suggestion -merge_request: 28160 -author: -type: changed diff --git a/changelogs/unreleased/55948-help-text-formatting-wiki.yml b/changelogs/unreleased/55948-help-text-formatting-wiki.yml deleted file mode 100644 index e1e0475a117..00000000000 --- a/changelogs/unreleased/55948-help-text-formatting-wiki.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Format extra help page text like wiki -merge_request: 26782 -author: Bastian Blank -type: fixed diff --git a/changelogs/unreleased/56557-disable-kubernetes-namespace-service-account-backend.yml b/changelogs/unreleased/56557-disable-kubernetes-namespace-service-account-backend.yml deleted file mode 100644 index 6521eb9d1c0..00000000000 --- a/changelogs/unreleased/56557-disable-kubernetes-namespace-service-account-backend.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Disables kubernetes resources creation if a cluster is not managed -merge_request: 26565 -author: -type: added diff --git a/changelogs/unreleased/56838-allow-guest-access-to-releases.yml b/changelogs/unreleased/56838-allow-guest-access-to-releases.yml deleted file mode 100644 index 701a015b9ac..00000000000 --- a/changelogs/unreleased/56838-allow-guest-access-to-releases.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Allow guests users to access project releases -merge_request: 27247 -author: -type: changed diff --git a/changelogs/unreleased/57017-add-toast-success-message.yml b/changelogs/unreleased/57017-add-toast-success-message.yml deleted file mode 100644 index 931e7755591..00000000000 --- a/changelogs/unreleased/57017-add-toast-success-message.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Display a toast message when the Kubernetes runner has successfully upgraded. -merge_request: 27206 -author: -type: changed diff --git a/changelogs/unreleased/57077-add-salesforce-omniauth.yml b/changelogs/unreleased/57077-add-salesforce-omniauth.yml deleted file mode 100644 index ebd0637ddac..00000000000 --- a/changelogs/unreleased/57077-add-salesforce-omniauth.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Resolve Salesforce.com omniauth support -merge_request: 27834 -author: -type: added diff --git a/changelogs/unreleased/57171-add-dashboard-settings.yml b/changelogs/unreleased/57171-add-dashboard-settings.yml deleted file mode 100644 index f235872b35c..00000000000 --- a/changelogs/unreleased/57171-add-dashboard-settings.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add backend support for a External Dashboard URL setting -merge_request: 27550 -author: -type: added diff --git a/changelogs/unreleased/57247-show-prioritized-labels-to-guests.yml b/changelogs/unreleased/57247-show-prioritized-labels-to-guests.yml deleted file mode 100644 index 5210ff0ccef..00000000000 --- a/changelogs/unreleased/57247-show-prioritized-labels-to-guests.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Show prioritized labels to guests -merge_request: 27307 -author: -type: fixed diff --git a/changelogs/unreleased/57293-fix-image-rename.yml b/changelogs/unreleased/57293-fix-image-rename.yml deleted file mode 100644 index 50dddbdf114..00000000000 --- a/changelogs/unreleased/57293-fix-image-rename.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Resolve Renaming an image via Web IDE corrupts it -merge_request: 27486 -author: -type: fixed diff --git a/changelogs/unreleased/57654-add-time-preferences-for-user-fe.yml b/changelogs/unreleased/57654-add-time-preferences-for-user-fe.yml deleted file mode 100644 index f4ce3a51724..00000000000 --- a/changelogs/unreleased/57654-add-time-preferences-for-user-fe.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add time preferences for user -merge_request: 25381 -author: -type: added diff --git a/changelogs/unreleased/57815.yml b/changelogs/unreleased/57815.yml deleted file mode 100644 index ccf76c99f1e..00000000000 --- a/changelogs/unreleased/57815.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Added Omniauth UltraAuth strategy to GitLab -merge_request: -author: Kartikey Tanna -type: added diff --git a/changelogs/unreleased/58105-pipeline-author-and-commit-author-too-close-together-in-pipeline-list.yml b/changelogs/unreleased/58105-pipeline-author-and-commit-author-too-close-together-in-pipeline-list.yml deleted file mode 100644 index aef0a5ad53e..00000000000 --- a/changelogs/unreleased/58105-pipeline-author-and-commit-author-too-close-together-in-pipeline-list.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Improve pipelines table spacing, add triggerer column -merge_request: 26136 -author: -type: changed diff --git a/changelogs/unreleased/58252-web-ide-dropdown-duplicates.yml b/changelogs/unreleased/58252-web-ide-dropdown-duplicates.yml deleted file mode 100644 index 48b03994586..00000000000 --- a/changelogs/unreleased/58252-web-ide-dropdown-duplicates.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Resolve Web IDE template dropdown showing duplicates -merge_request: 27237 -author: -type: fixed diff --git a/changelogs/unreleased/58293-extract-discussion-actions.yml b/changelogs/unreleased/58293-extract-discussion-actions.yml deleted file mode 100644 index 2ca4716a6de..00000000000 --- a/changelogs/unreleased/58293-extract-discussion-actions.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Extract DiscussionActions component from NoteableDiscussion -merge_request: 27227 -author: -type: other diff --git a/changelogs/unreleased/58294-discussion-notes-component.yml b/changelogs/unreleased/58294-discussion-notes-component.yml deleted file mode 100644 index fbe08360a9a..00000000000 --- a/changelogs/unreleased/58294-discussion-notes-component.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Extract DiscussionNotes component from NoteableDiscussion -merge_request: 27066 -author: -type: other diff --git a/changelogs/unreleased/58361-issue-create-system-note-timestamp.yml b/changelogs/unreleased/58361-issue-create-system-note-timestamp.yml deleted file mode 100644 index d8fe3e4aa48..00000000000 --- a/changelogs/unreleased/58361-issue-create-system-note-timestamp.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix system notes timestamp when creating issue in the past -merge_request: 27406 -author: -type: fixed diff --git a/changelogs/unreleased/58748-update-nodejs-to-10-15-3.yml b/changelogs/unreleased/58748-update-nodejs-to-10-15-3.yml deleted file mode 100644 index 4c7e4b5c604..00000000000 --- a/changelogs/unreleased/58748-update-nodejs-to-10-15-3.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Update node.js to 10.15.3 in CI template for Hexo -merge_request: 25943 -author: Takuya Noguchi -type: other diff --git a/changelogs/unreleased/58850-fix-misplaced-swipe-view-26969.yml b/changelogs/unreleased/58850-fix-misplaced-swipe-view-26969.yml deleted file mode 100644 index fa3e81df4e0..00000000000 --- a/changelogs/unreleased/58850-fix-misplaced-swipe-view-26969.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: "Fix misaligned image diff swipe view" -merge_request: 26969 -author: ftab -type: fixed diff --git a/changelogs/unreleased/59034-external-link-button.yml b/changelogs/unreleased/59034-external-link-button.yml deleted file mode 100644 index 3d8e9e82836..00000000000 --- a/changelogs/unreleased/59034-external-link-button.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Replaced icon for external URL with doc-text icon -merge_request: 27365 -author: -type: fixed diff --git a/changelogs/unreleased/59275-cluster-form-hints.yml b/changelogs/unreleased/59275-cluster-form-hints.yml deleted file mode 100644 index 0031b9557f4..00000000000 --- a/changelogs/unreleased/59275-cluster-form-hints.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add help texts to K8 form fields -merge_request: 27274 -author: -type: changed diff --git a/changelogs/unreleased/59514-uploading-images-base64.yml b/changelogs/unreleased/59514-uploading-images-base64.yml deleted file mode 100644 index 905b00db06a..00000000000 --- a/changelogs/unreleased/59514-uploading-images-base64.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Show proper preview for uploaded images in Web IDE -merge_request: 27471 -author: -type: fixed diff --git a/changelogs/unreleased/5966-rebase-with-block.yml b/changelogs/unreleased/5966-rebase-with-block.yml deleted file mode 100644 index 9272a02977f..00000000000 --- a/changelogs/unreleased/5966-rebase-with-block.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix approvals sometimes being reset after a merge request is rebased -merge_request: 27446 -author: -type: fixed diff --git a/changelogs/unreleased/59708-vendor-css.yml b/changelogs/unreleased/59708-vendor-css.yml deleted file mode 100644 index ec7def7a9e6..00000000000 --- a/changelogs/unreleased/59708-vendor-css.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Creates a vendors folder for external CSS -merge_request: -author: -type: other diff --git a/changelogs/unreleased/59921-pipeline-schedule.yml b/changelogs/unreleased/59921-pipeline-schedule.yml deleted file mode 100644 index 4227a047913..00000000000 --- a/changelogs/unreleased/59921-pipeline-schedule.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Replaces CSS with BS4 utility class for pipeline schedules -merge_request: -author: -type: other diff --git a/changelogs/unreleased/60026-group-member-count-bg.yml b/changelogs/unreleased/60026-group-member-count-bg.yml deleted file mode 100644 index 0a1f6eac2ea..00000000000 --- a/changelogs/unreleased/60026-group-member-count-bg.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add badge-pill class on group member count -merge_request: 27019 -author: -type: fixed diff --git a/changelogs/unreleased/60224-btn-env.yml b/changelogs/unreleased/60224-btn-env.yml deleted file mode 100644 index 5053ddb31fa..00000000000 --- a/changelogs/unreleased/60224-btn-env.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fixes actions dropdowns in environments page -merge_request: 27160 -author: -type: fixed diff --git a/changelogs/unreleased/60261-save-btn-env.yml b/changelogs/unreleased/60261-save-btn-env.yml deleted file mode 100644 index b0936198d2e..00000000000 --- a/changelogs/unreleased/60261-save-btn-env.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fixes create button background for Environments form -merge_request: 27161 -author: -type: fixed diff --git a/changelogs/unreleased/60387-use-icons-in-user-popovers.yml b/changelogs/unreleased/60387-use-icons-in-user-popovers.yml deleted file mode 100644 index 100d33690b3..00000000000 --- a/changelogs/unreleased/60387-use-icons-in-user-popovers.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Show category icons in user popover -merge_request: -author: -type: added diff --git a/changelogs/unreleased/60462-empty-pipeline-section.yml b/changelogs/unreleased/60462-empty-pipeline-section.yml deleted file mode 100644 index 7d90215e20c..00000000000 --- a/changelogs/unreleased/60462-empty-pipeline-section.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix empty block in MR widget when user doesn't have permission -merge_request: 27462 -author: -type: fixed diff --git a/changelogs/unreleased/60552-period-dropdown.yml b/changelogs/unreleased/60552-period-dropdown.yml deleted file mode 100644 index e1b4a098ab0..00000000000 --- a/changelogs/unreleased/60552-period-dropdown.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix autocomplete dropdown for usernames starting with period -merge_request: 27533 -author: Jan Beckmann -type: fixed diff --git a/changelogs/unreleased/60777-uninstall-button.yml b/changelogs/unreleased/60777-uninstall-button.yml deleted file mode 100644 index a2727b16ef1..00000000000 --- a/changelogs/unreleased/60777-uninstall-button.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Implement UI for uninstalling Cluster’s managed apps -merge_request: 27559 -author: -type: added diff --git a/changelogs/unreleased/60808-only-show-target-branch-advanced-error-before-merge.yml b/changelogs/unreleased/60808-only-show-target-branch-advanced-error-before-merge.yml deleted file mode 100644 index b340f8408f3..00000000000 --- a/changelogs/unreleased/60808-only-show-target-branch-advanced-error-before-merge.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Only show the "target branch has advanced" message when the merge request is - open -merge_request: 27588 -author: -type: fixed diff --git a/changelogs/unreleased/60874-fix-suggestion-misalignment.yml b/changelogs/unreleased/60874-fix-suggestion-misalignment.yml deleted file mode 100644 index f5717ac19fd..00000000000 --- a/changelogs/unreleased/60874-fix-suggestion-misalignment.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Resolve Misalignment on suggested changes diff table -merge_request: 27612 -author: -type: fixed diff --git a/changelogs/unreleased/61036-fix-ingress-base-domain-text.yml b/changelogs/unreleased/61036-fix-ingress-base-domain-text.yml deleted file mode 100644 index 32f0e023923..00000000000 --- a/changelogs/unreleased/61036-fix-ingress-base-domain-text.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix base domain help text update -merge_request: 27746 -author: -type: fixed diff --git a/changelogs/unreleased/61203-fix-lfs-ui-upload.yml b/changelogs/unreleased/61203-fix-lfs-ui-upload.yml deleted file mode 100644 index 66afe9f0597..00000000000 --- a/changelogs/unreleased/61203-fix-lfs-ui-upload.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix uploading of LFS tracked file through UI -merge_request: 28052 -author: -type: fixed diff --git a/changelogs/unreleased/61278-next.yml b/changelogs/unreleased/61278-next.yml deleted file mode 100644 index 829f37f75ba..00000000000 --- a/changelogs/unreleased/61278-next.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Render Next badge only for gitlab.com -merge_request: 28056 -author: -type: fixed diff --git a/changelogs/unreleased/61324-non-project-snippet-new-snippet-button-should-be-green-outline.yml b/changelogs/unreleased/61324-non-project-snippet-new-snippet-button-should-be-green-outline.yml new file mode 100644 index 00000000000..350fd525a30 --- /dev/null +++ b/changelogs/unreleased/61324-non-project-snippet-new-snippet-button-should-be-green-outline.yml @@ -0,0 +1,5 @@ +--- +title: Give New Snippet button green outline +merge_request: 28559 +author: Marcel van Remmerden +type: other diff --git a/changelogs/unreleased/61441.yml b/changelogs/unreleased/61441.yml new file mode 100644 index 00000000000..2ad0c6f62d3 --- /dev/null +++ b/changelogs/unreleased/61441.yml @@ -0,0 +1,5 @@ +--- +title: Allow user to set primary email first when 2FA is required +merge_request: 28097 +author: Kartikey Tanna +type: fixed diff --git a/changelogs/unreleased/61469-align-play-icon.yml b/changelogs/unreleased/61469-align-play-icon.yml deleted file mode 100644 index a118da29703..00000000000 --- a/changelogs/unreleased/61469-align-play-icon.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Vertically aligns the play button for stages -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/61494-set-status-modal-visual-bugs.yml b/changelogs/unreleased/61494-set-status-modal-visual-bugs.yml deleted file mode 100644 index 4126b8f93c1..00000000000 --- a/changelogs/unreleased/61494-set-status-modal-visual-bugs.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix visual issues in set status modal -merge_request: 28147 -author: -type: fixed diff --git a/changelogs/unreleased/61550-next-badge.yml b/changelogs/unreleased/61550-next-badge.yml deleted file mode 100644 index 122e394a68c..00000000000 --- a/changelogs/unreleased/61550-next-badge.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fixes next badge being always visible -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/62038-chevron-down.yml b/changelogs/unreleased/62038-chevron-down.yml deleted file mode 100644 index 9d58c364bc9..00000000000 --- a/changelogs/unreleased/62038-chevron-down.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Adds arrow icons to select option in CI/CD settings -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/62061-note-icon-color.yml b/changelogs/unreleased/62061-note-icon-color.yml new file mode 100644 index 00000000000..5bfea1a9ed3 --- /dev/null +++ b/changelogs/unreleased/62061-note-icon-color.yml @@ -0,0 +1,5 @@ +--- +title: Update icon color to match design system, pass accessibility +merge_request: 28498 +author: Jarek Ostrowski @jareko +type: fixed diff --git a/changelogs/unreleased/8723-geo-remove-gitlab-lfstoken-legacyredisdevisetoken-implementation-and-usage-geo.yml b/changelogs/unreleased/8723-geo-remove-gitlab-lfstoken-legacyredisdevisetoken-implementation-and-usage-geo.yml new file mode 100644 index 00000000000..173c7d9383e --- /dev/null +++ b/changelogs/unreleased/8723-geo-remove-gitlab-lfstoken-legacyredisdevisetoken-implementation-and-usage-geo.yml @@ -0,0 +1,5 @@ +--- +title: 'Geo: Remove Gitlab::LfsToken::LegacyRedisDeviseToken implementation and usage' +merge_request: 28546 +author: +type: changed diff --git a/changelogs/unreleased/ac-package-storage-stats.yml b/changelogs/unreleased/ac-package-storage-stats.yml deleted file mode 100644 index fedffb41597..00000000000 --- a/changelogs/unreleased/ac-package-storage-stats.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add packages_size to ProjectStatistics -merge_request: 27373 -author: -type: added diff --git a/changelogs/unreleased/add-ci-variable-protected-ref.yml b/changelogs/unreleased/add-ci-variable-protected-ref.yml deleted file mode 100644 index 150ddcc21ad..00000000000 --- a/changelogs/unreleased/add-ci-variable-protected-ref.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add CI_COMMIT_REF_PROTECTED CI variable -merge_request: 26716 -author: Jason van den Hurk -type: added diff --git a/changelogs/unreleased/add-runner-access-level-registration.yml b/changelogs/unreleased/add-runner-access-level-registration.yml deleted file mode 100644 index 7ae95025abb..00000000000 --- a/changelogs/unreleased/add-runner-access-level-registration.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add option to set access_level of runners upon registration -merge_request: 27490 -author: Zelin L -type: added diff --git a/changelogs/unreleased/allow-replying-to-individual-notes-from-api.yml b/changelogs/unreleased/allow-replying-to-individual-notes-from-api.yml deleted file mode 100644 index b268b0689ad..00000000000 --- a/changelogs/unreleased/allow-replying-to-individual-notes-from-api.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Allow replying to individual notes from API -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/always-link-instance-configuration.yml b/changelogs/unreleased/always-link-instance-configuration.yml deleted file mode 100644 index 3f08747edf7..00000000000 --- a/changelogs/unreleased/always-link-instance-configuration.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Always show instance configuration link -merge_request: 26783 -author: Bastian Blank -type: fixed diff --git a/changelogs/unreleased/an-use-labkit.yml b/changelogs/unreleased/an-use-labkit.yml deleted file mode 100644 index ab293c15787..00000000000 --- a/changelogs/unreleased/an-use-labkit.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Migrate correlation and tracing code to LabKit -merge_request: 25379 -author: -type: other diff --git a/changelogs/unreleased/autodevops_remote_private_helm_repository.yml b/changelogs/unreleased/autodevops_remote_private_helm_repository.yml deleted file mode 100644 index 5341abb1095..00000000000 --- a/changelogs/unreleased/autodevops_remote_private_helm_repository.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Allow linking to a private helm repository by providing credentials, and customisation - of repository name -merge_request: 27123 -author: Stuart Moore @stjm-cc -type: added diff --git a/changelogs/unreleased/bw-add-graphql-groups.yml b/changelogs/unreleased/bw-add-graphql-groups.yml deleted file mode 100644 index f72ee1cf2b7..00000000000 --- a/changelogs/unreleased/bw-add-graphql-groups.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add initial GraphQL query for Groups -merge_request: 27492 -author: -type: added diff --git a/changelogs/unreleased/ce-10725-restructure-project-merge-request-settings-page.yml b/changelogs/unreleased/ce-10725-restructure-project-merge-request-settings-page.yml deleted file mode 100644 index 7aa9204fe4e..00000000000 --- a/changelogs/unreleased/ce-10725-restructure-project-merge-request-settings-page.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Reorganize project merge request settings -merge_request: 26834 -author: -type: changed diff --git a/changelogs/unreleased/ce-11430-update_clair_local_scan.yml b/changelogs/unreleased/ce-11430-update_clair_local_scan.yml deleted file mode 100644 index 04bb04c3919..00000000000 --- a/changelogs/unreleased/ce-11430-update_clair_local_scan.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Update clair-local-scan to v2.0.8 for container scanning -merge_request: 27977 -author: -type: other diff --git a/changelogs/unreleased/ce-11542-remove-non-semantic-use-of-row-in-member-listing-controls.yml b/changelogs/unreleased/ce-11542-remove-non-semantic-use-of-row-in-member-listing-controls.yml deleted file mode 100644 index c2dcd309abd..00000000000 --- a/changelogs/unreleased/ce-11542-remove-non-semantic-use-of-row-in-member-listing-controls.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Remove non-semantic use of `.row` in member listing controls -merge_request: 28204 -author: -type: fixed diff --git a/changelogs/unreleased/ce-4681-autosave.yml b/changelogs/unreleased/ce-4681-autosave.yml deleted file mode 100644 index 029954ec92b..00000000000 --- a/changelogs/unreleased/ce-4681-autosave.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Autosave description in epics -merge_request: 27296 -author: -type: added diff --git a/changelogs/unreleased/ce-its-simple-just-destroy-the-mirrors.yml b/changelogs/unreleased/ce-its-simple-just-destroy-the-mirrors.yml deleted file mode 100644 index ac5fc27cf36..00000000000 --- a/changelogs/unreleased/ce-its-simple-just-destroy-the-mirrors.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Destroy project remote mirrors instead of disabling -merge_request: 27087 -author: -type: security diff --git a/changelogs/unreleased/ce-remove-already-signed-in.yml b/changelogs/unreleased/ce-remove-already-signed-in.yml deleted file mode 100644 index 70bed136ced..00000000000 --- a/changelogs/unreleased/ce-remove-already-signed-in.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Remove "You are already signed in" banner -merge_request: 27377 -author: -type: other diff --git a/changelogs/unreleased/ci-lint-ssl-error.yml b/changelogs/unreleased/ci-lint-ssl-error.yml deleted file mode 100644 index d59b9204357..00000000000 --- a/changelogs/unreleased/ci-lint-ssl-error.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Catch and report OpenSSL exceptions while fetching external configuration files - in CI::Config -merge_request: 26750 -author: Drew Cimino -type: fixed diff --git a/changelogs/unreleased/da-sentry-client-side-settings.yml b/changelogs/unreleased/da-sentry-client-side-settings.yml deleted file mode 100644 index e36ac7c354b..00000000000 --- a/changelogs/unreleased/da-sentry-client-side-settings.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Allow Sentry client-side DSN to be passed on gitlab.yml -merge_request: 27967 -author: -type: added diff --git a/changelogs/unreleased/delay-update-statictics.yml b/changelogs/unreleased/delay-update-statictics.yml deleted file mode 100644 index d0201fb6db8..00000000000 --- a/changelogs/unreleased/delay-update-statictics.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix the bug that the project statistics is not updated -merge_request: 26854 -author: Hiroyuki Sato -type: fixed diff --git a/changelogs/unreleased/do-not-reopen-merged-mr.yml b/changelogs/unreleased/do-not-reopen-merged-mr.yml deleted file mode 100644 index 14d1455cca4..00000000000 --- a/changelogs/unreleased/do-not-reopen-merged-mr.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Remove a "reopen merge request button" on a "merged" merge request -merge_request: 26965 -author: Hiroyuki Sato -type: fixed diff --git a/changelogs/unreleased/downloading-expired-artifacts.yml b/changelogs/unreleased/downloading-expired-artifacts.yml deleted file mode 100644 index 2f4b79ca106..00000000000 --- a/changelogs/unreleased/downloading-expired-artifacts.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: stop rendering download links for expired artifacts on the project tags page -merge_request: 26753 -author: Drew Cimino -type: fixed diff --git a/changelogs/unreleased/dz-scope-project-routes.yml b/changelogs/unreleased/dz-scope-project-routes.yml new file mode 100644 index 00000000000..66eb5d928f0 --- /dev/null +++ b/changelogs/unreleased/dz-scope-project-routes.yml @@ -0,0 +1,5 @@ +--- +title: Move some project routes under /-/ scope +merge_request: 28435 +author: +type: changed diff --git a/changelogs/unreleased/expand-diff-performance.yml b/changelogs/unreleased/expand-diff-performance.yml deleted file mode 100644 index 134ea4081e4..00000000000 --- a/changelogs/unreleased/expand-diff-performance.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Improve expanding diff to full file performance -merge_request: -author: -type: changed diff --git a/changelogs/unreleased/expose-pipeline-variables-via-api.yml b/changelogs/unreleased/expose-pipeline-variables-via-api.yml deleted file mode 100644 index f37bf0c5cd8..00000000000 --- a/changelogs/unreleased/expose-pipeline-variables-via-api.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Expose pipeline variables via API -merge_request: 26501 -author: Agustin Henze <tin@redhat.com> -type: added diff --git a/changelogs/unreleased/feat-sentry-environment.yml b/changelogs/unreleased/feat-sentry-environment.yml deleted file mode 100644 index 44ea19375f8..00000000000 --- a/changelogs/unreleased/feat-sentry-environment.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Allow Sentry configuration to be passed on gitlab.yml -merge_request: 27091 -author: Roger Meier -type: added diff --git a/changelogs/unreleased/fix-api-group-visibility.yml b/changelogs/unreleased/fix-api-group-visibility.yml deleted file mode 100644 index 7fbdcd729c6..00000000000 --- a/changelogs/unreleased/fix-api-group-visibility.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix api group visibility -merge_request: 26896 -author: -type: fixed diff --git a/changelogs/unreleased/fix-api-ide-relative-url-root.yml b/changelogs/unreleased/fix-api-ide-relative-url-root.yml deleted file mode 100644 index 8c058645f3e..00000000000 --- a/changelogs/unreleased/fix-api-ide-relative-url-root.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix FE API and IDE handling of '/' relative_url_root -merge_request: 27635 -author: -type: fixed diff --git a/changelogs/unreleased/fix-extra-emails-for-custom-notifications.yml b/changelogs/unreleased/fix-extra-emails-for-custom-notifications.yml deleted file mode 100644 index 6eb3225e4a1..00000000000 --- a/changelogs/unreleased/fix-extra-emails-for-custom-notifications.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix extra emails for custom notifications -merge_request: 25607 -author: -type: fixed diff --git a/changelogs/unreleased/fix-ide-relative-url-bug.yml b/changelogs/unreleased/fix-ide-relative-url-bug.yml deleted file mode 100644 index 183af722657..00000000000 --- a/changelogs/unreleased/fix-ide-relative-url-bug.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix IDE get file data with '/' as relative root -merge_request: 27911 -author: -type: fixed diff --git a/changelogs/unreleased/fix-js-error-ssh-key-view.yml b/changelogs/unreleased/fix-js-error-ssh-key-view.yml deleted file mode 100644 index 0615f2ee217..00000000000 --- a/changelogs/unreleased/fix-js-error-ssh-key-view.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: disable SSH key validation in key details view -merge_request: 28180 -author: Roger Meier -type: fixed diff --git a/changelogs/unreleased/fix-lazy-blobs-requesting-all-previous-blobs.yml b/changelogs/unreleased/fix-lazy-blobs-requesting-all-previous-blobs.yml deleted file mode 100644 index 58f5a9c943c..00000000000 --- a/changelogs/unreleased/fix-lazy-blobs-requesting-all-previous-blobs.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Fix Blob.lazy always loading all previously-requested blobs when a new request - is made -merge_request: -author: -type: performance diff --git a/changelogs/unreleased/fix-merge-request-pipeline-exist-method.yml b/changelogs/unreleased/fix-merge-request-pipeline-exist-method.yml deleted file mode 100644 index 294a665ff3e..00000000000 --- a/changelogs/unreleased/fix-merge-request-pipeline-exist-method.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix duplicate merge request pipelines created by Sidekiq worker retry -merge_request: 26643 -author: -type: fixed diff --git a/changelogs/unreleased/fix-project-visibility-level-validation.yml b/changelogs/unreleased/fix-project-visibility-level-validation.yml deleted file mode 100644 index 9581a475842..00000000000 --- a/changelogs/unreleased/fix-project-visibility-level-validation.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix project visibility level validation -merge_request: 28305 -author: Peter Marko -type: fixed diff --git a/changelogs/unreleased/fix-schedule-head-pipeline-update-method.yml b/changelogs/unreleased/fix-schedule-head-pipeline-update-method.yml deleted file mode 100644 index 5e574ef686c..00000000000 --- a/changelogs/unreleased/fix-schedule-head-pipeline-update-method.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix update head pipeline process of Pipelines for merge requests -merge_request: 28057 -author: -type: fixed diff --git a/changelogs/unreleased/fix-webpack-assets-relative-url-bug.yml b/changelogs/unreleased/fix-webpack-assets-relative-url-bug.yml deleted file mode 100644 index 80936245f3e..00000000000 --- a/changelogs/unreleased/fix-webpack-assets-relative-url-bug.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix webpack assets handling when relative url root is '/' -merge_request: 27909 -author: -type: fixed diff --git a/changelogs/unreleased/fj-53523-add-option-avoid-loading-wiki-page-content.yml b/changelogs/unreleased/fj-53523-add-option-avoid-loading-wiki-page-content.yml deleted file mode 100644 index 49eaff52e5a..00000000000 --- a/changelogs/unreleased/fj-53523-add-option-avoid-loading-wiki-page-content.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Added list_pages method to avoid loading all wiki pages content -merge_request: 22801 -author: -type: performance diff --git a/changelogs/unreleased/fj-59522-improve-search-controller-performance.yml b/changelogs/unreleased/fj-59522-improve-search-controller-performance.yml deleted file mode 100644 index c513f3c3aeb..00000000000 --- a/changelogs/unreleased/fj-59522-improve-search-controller-performance.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add improvements to global search of issues and merge requests -merge_request: 27817 -author: -type: performance diff --git a/changelogs/unreleased/fj-bump-workhorse-version-8-6-0.yml b/changelogs/unreleased/fj-bump-workhorse-version-8-6-0.yml deleted file mode 100644 index e53499e21ba..00000000000 --- a/changelogs/unreleased/fj-bump-workhorse-version-8-6-0.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Update GitLab Workhorse to v8.6.0 -merge_request: 27260 -author: -type: fixed diff --git a/changelogs/unreleased/fl-fix-next-flag-for-good.yml b/changelogs/unreleased/fl-fix-next-flag-for-good.yml deleted file mode 100644 index 93f27824213..00000000000 --- a/changelogs/unreleased/fl-fix-next-flag-for-good.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Next badge must visible when canary flag is true -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/friendly-wrap-component.yml b/changelogs/unreleased/friendly-wrap-component.yml deleted file mode 100644 index c16ca0af287..00000000000 --- a/changelogs/unreleased/friendly-wrap-component.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add CSS fix for <wbr> elements on IE11 -merge_request: 27846 -author: -type: other diff --git a/changelogs/unreleased/frozen-string-spec-some.yml b/changelogs/unreleased/frozen-string-spec-some.yml deleted file mode 100644 index 55381d7ccbe..00000000000 --- a/changelogs/unreleased/frozen-string-spec-some.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add some frozen string to spec/**/*.rb -merge_request: -author: gfyoung -type: other diff --git a/changelogs/unreleased/gitaly-version-v1.36.0.yml b/changelogs/unreleased/gitaly-version-v1.36.0.yml deleted file mode 100644 index 22fdca8da80..00000000000 --- a/changelogs/unreleased/gitaly-version-v1.36.0.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Upgrade to Gitaly v1.36.0 -merge_request: 27831 -author: -type: changed diff --git a/changelogs/unreleased/gitaly-version-v1.42.0.yml b/changelogs/unreleased/gitaly-version-v1.42.0.yml deleted file mode 100644 index 38621fa071e..00000000000 --- a/changelogs/unreleased/gitaly-version-v1.42.0.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Upgrade to Gitaly v1.42.0 -merge_request: 28135 -author: -type: changed diff --git a/changelogs/unreleased/gitlab-issue-54894.yml b/changelogs/unreleased/gitlab-issue-54894.yml deleted file mode 100644 index 513c0163c0e..00000000000 --- a/changelogs/unreleased/gitlab-issue-54894.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Fix some label links not appearing on group labels page and label title being - a link on project labels page -merge_request: 24060 -author: Tanya Pazitny -type: fixed diff --git a/changelogs/unreleased/graphql-resolvers-complexity.yml b/changelogs/unreleased/graphql-resolvers-complexity.yml deleted file mode 100644 index 503ffbd97f2..00000000000 --- a/changelogs/unreleased/graphql-resolvers-complexity.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: 'GraphQL: improve evaluation of query complexity based on arguments and query - limits.' -merge_request: 28017 -author: -type: added diff --git a/changelogs/unreleased/include-ee-fixtures.yml b/changelogs/unreleased/include-ee-fixtures.yml deleted file mode 100644 index ba500d92de3..00000000000 --- a/changelogs/unreleased/include-ee-fixtures.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add EE fixtures to SeedFu list -merge_request: 28241 -author: -type: other diff --git a/changelogs/unreleased/instance-configuration-artifact-size.yml b/changelogs/unreleased/instance-configuration-artifact-size.yml deleted file mode 100644 index 077f8631af5..00000000000 --- a/changelogs/unreleased/instance-configuration-artifact-size.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Display maximum artifact size from runtime config -merge_request: 26784 -author: Bastian Blank -type: fixed diff --git a/changelogs/unreleased/instance_level_clusters.yml b/changelogs/unreleased/instance_level_clusters.yml deleted file mode 100644 index afd06a4e05f..00000000000 --- a/changelogs/unreleased/instance_level_clusters.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Instance level kubernetes clusters -merge_request: 27196 -author: -type: added diff --git a/changelogs/unreleased/issue-42692-deployment-chat-notifications.yml b/changelogs/unreleased/issue-42692-deployment-chat-notifications.yml deleted file mode 100644 index 3f0a96ad50e..00000000000 --- a/changelogs/unreleased/issue-42692-deployment-chat-notifications.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add deployment events to chat notification services -merge_request: 27338 -author: -type: added diff --git a/changelogs/unreleased/issue-58418-release-notes.yml b/changelogs/unreleased/issue-58418-release-notes.yml deleted file mode 100644 index 80e6529eb12..00000000000 --- a/changelogs/unreleased/issue-58418-release-notes.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Set release name when adding release notes to an existing tag -merge_request: 26807 -author: -type: fixed diff --git a/changelogs/unreleased/issue-61038-deploy-chat-message-update.yml b/changelogs/unreleased/issue-61038-deploy-chat-message-update.yml deleted file mode 100644 index c85ddc7b91c..00000000000 --- a/changelogs/unreleased/issue-61038-deploy-chat-message-update.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Update deployment event chat notification message -merge_request: 27972 -author: -type: changed diff --git a/changelogs/unreleased/issue_57906_fix_github_import.yml b/changelogs/unreleased/issue_57906_fix_github_import.yml deleted file mode 100644 index d28a78d5d11..00000000000 --- a/changelogs/unreleased/issue_57906_fix_github_import.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix issuables state_id nil when importing projects from GitHub -merge_request: 28027 -author: -type: fixed diff --git a/changelogs/unreleased/jc-client-gitaly-session-id.yml b/changelogs/unreleased/jc-client-gitaly-session-id.yml deleted file mode 100644 index ae5b7144b98..00000000000 --- a/changelogs/unreleased/jc-client-gitaly-session-id.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add gitaly session id & catfile-cache feature flag -merge_request: 27472 -author: -type: performance diff --git a/changelogs/unreleased/jc-update-list-last-commits.yml b/changelogs/unreleased/jc-update-list-last-commits.yml deleted file mode 100644 index 0e72c4255ae..00000000000 --- a/changelogs/unreleased/jc-update-list-last-commits.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Client side changes for ListLastCommitsForTree response update -merge_request: 26880 -author: -type: fixed diff --git a/changelogs/unreleased/jv-dedup-activerecord.yml b/changelogs/unreleased/jv-dedup-activerecord.yml deleted file mode 100644 index 7b440c7c0db..00000000000 --- a/changelogs/unreleased/jv-dedup-activerecord.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Fix wrong use of ActiveRecord in PoolRepository -merge_request: 27464 -author: -type: fixed - diff --git a/changelogs/unreleased/knative-0-5.yml b/changelogs/unreleased/knative-0-5.yml deleted file mode 100644 index c7112b957e9..00000000000 --- a/changelogs/unreleased/knative-0-5.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Knative version bump 0.3 -> 0.5 -merge_request: -author: Chris Baumbauer <cab@cabnetworks.net> -type: changed diff --git a/changelogs/unreleased/markdown-autocomplete-escaping.yml b/changelogs/unreleased/markdown-autocomplete-escaping.yml deleted file mode 100644 index 0ea034b14ee..00000000000 --- a/changelogs/unreleased/markdown-autocomplete-escaping.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Only escape Markdown emphasis characters in autocomplete when necessary -merge_request: 27457 -author: -type: changed diff --git a/changelogs/unreleased/member-access-granted-leave-email-fe.yml b/changelogs/unreleased/member-access-granted-leave-email-fe.yml deleted file mode 100644 index 919a2464a4d..00000000000 --- a/changelogs/unreleased/member-access-granted-leave-email-fe.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Leave project/group from access granted email -merge_request: 27892 -author: -type: added diff --git a/changelogs/unreleased/patch-49.yml b/changelogs/unreleased/patch-49.yml deleted file mode 100644 index 2c8af1e5c48..00000000000 --- a/changelogs/unreleased/patch-49.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Remove leading / trailing spaces from heading when generating header ids -merge_request: 27025 -author: Willian Balmant -type: fixed diff --git a/changelogs/unreleased/pl-upgrade-letter_opener_web.yml b/changelogs/unreleased/pl-upgrade-letter_opener_web.yml deleted file mode 100644 index 9891344215a..00000000000 --- a/changelogs/unreleased/pl-upgrade-letter_opener_web.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Upgrade letter_opener_web to support Rails 5.1 -merge_request: 27829 -author: -type: fixed diff --git a/changelogs/unreleased/rails5-1.yml b/changelogs/unreleased/rails5-1.yml deleted file mode 100644 index da16735bb0d..00000000000 --- a/changelogs/unreleased/rails5-1.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Upgrade to Rails 5.1 -merge_request: 27480 -author: Jasper Maes -type: other diff --git a/changelogs/unreleased/refactor-58827-migrate-issue-spec-to-jest.yml b/changelogs/unreleased/refactor-58827-migrate-issue-spec-to-jest.yml deleted file mode 100644 index 03d94c39c10..00000000000 --- a/changelogs/unreleased/refactor-58827-migrate-issue-spec-to-jest.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: 'refactor(issue): Refactored issue tests from Karma to Jest' -merge_request: 27673 -author: Martin Hobert -type: other diff --git a/changelogs/unreleased/refactor-58829-migrate-notes-spec-to-jest.yml b/changelogs/unreleased/refactor-58829-migrate-notes-spec-to-jest.yml deleted file mode 100644 index 9a1886797da..00000000000 --- a/changelogs/unreleased/refactor-58829-migrate-notes-spec-to-jest.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: 'Refactored notes tests from Karma to Jest' -merge_request: 27648 -author: Martin Hobert -type: other diff --git a/changelogs/unreleased/refactor-58830-migrate-sidebar-spec-to-jest.yml b/changelogs/unreleased/refactor-58830-migrate-sidebar-spec-to-jest.yml deleted file mode 100644 index 20a4be8c9ad..00000000000 --- a/changelogs/unreleased/refactor-58830-migrate-sidebar-spec-to-jest.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: 'Refactored Karma spec files to Jest' -merge_request: 27688 -author: Martin Hobert -type: other diff --git a/changelogs/unreleased/remove-disabled-pages-domains-part-2.yml b/changelogs/unreleased/remove-disabled-pages-domains-part-2.yml deleted file mode 100644 index 9b208cbaa0e..00000000000 --- a/changelogs/unreleased/remove-disabled-pages-domains-part-2.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Remove pages domains if they weren't verified for 1 week -merge_request: 26227 -author: -type: added diff --git a/changelogs/unreleased/remove-disabled-pages-domains.yml b/changelogs/unreleased/remove-disabled-pages-domains.yml deleted file mode 100644 index e23561329ef..00000000000 --- a/changelogs/unreleased/remove-disabled-pages-domains.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Mark disabled pages domains for removal, but don't remove them yet -merge_request: 26212 -author: -type: added diff --git a/changelogs/unreleased/rename_auto_deploy_app_links.yml b/changelogs/unreleased/rename_auto_deploy_app_links.yml deleted file mode 100644 index c56b5fb5e5c..00000000000 --- a/changelogs/unreleased/rename_auto_deploy_app_links.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Move location of charts/auto-deploy-app -> gitlab-org/charts/auto-deploy-app -merge_request: 27477 -author: -type: changed diff --git a/changelogs/unreleased/require-all-templates-to-include-default-stages.yml b/changelogs/unreleased/require-all-templates-to-include-default-stages.yml deleted file mode 100644 index de8b07160ba..00000000000 --- a/changelogs/unreleased/require-all-templates-to-include-default-stages.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Require all templates to use default stages -merge_request: 26954 -author: -type: fixed diff --git a/changelogs/unreleased/rewind-iid-on-pipelines.yml b/changelogs/unreleased/rewind-iid-on-pipelines.yml deleted file mode 100644 index b5738860024..00000000000 --- a/changelogs/unreleased/rewind-iid-on-pipelines.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Rewind IID on Ci::Pipelines -merge_request: 26490 -author: -type: fixed diff --git a/changelogs/unreleased/sh-add-gitaly-backtrace.yml b/changelogs/unreleased/sh-add-gitaly-backtrace.yml deleted file mode 100644 index 1515edd6db9..00000000000 --- a/changelogs/unreleased/sh-add-gitaly-backtrace.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add backtrace to Gitaly performance bar -merge_request: 27345 -author: -type: other diff --git a/changelogs/unreleased/sh-allow-equal-level-in-subgroup-membership.yml b/changelogs/unreleased/sh-allow-equal-level-in-subgroup-membership.yml deleted file mode 100644 index adbed52db81..00000000000 --- a/changelogs/unreleased/sh-allow-equal-level-in-subgroup-membership.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Allow a member to have an access level equal to parent group -merge_request: 27913 -author: -type: fixed diff --git a/changelogs/unreleased/sh-avoid-fetching-temp-refs-within-project.yml b/changelogs/unreleased/sh-avoid-fetching-temp-refs-within-project.yml deleted file mode 100644 index 7511543f7f6..00000000000 --- a/changelogs/unreleased/sh-avoid-fetching-temp-refs-within-project.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Don't create a temp reference for branch comparisons within project -merge_request: 24038 -author: -type: fixed diff --git a/changelogs/unreleased/sh-cleanup-import-export.yml b/changelogs/unreleased/sh-cleanup-import-export.yml deleted file mode 100644 index 3d5d6f3c907..00000000000 --- a/changelogs/unreleased/sh-cleanup-import-export.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Clean up CarrierWave's import/export files -merge_request: 27487 -author: -type: fixed diff --git a/changelogs/unreleased/sh-disable-batch-load-replace-methods.yml b/changelogs/unreleased/sh-disable-batch-load-replace-methods.yml deleted file mode 100644 index 00f897ac4b1..00000000000 --- a/changelogs/unreleased/sh-disable-batch-load-replace-methods.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Disable method replacement in avatar loading -merge_request: 27866 -author: -type: performance diff --git a/changelogs/unreleased/sh-disable-internal-ids-available-check.yml b/changelogs/unreleased/sh-disable-internal-ids-available-check.yml deleted file mode 100644 index 069a9ba7d69..00000000000 --- a/changelogs/unreleased/sh-disable-internal-ids-available-check.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Always use internal ID tables in development and production -merge_request: 27544 -author: -type: fixed diff --git a/changelogs/unreleased/sh-fix-autocomplete-mirror-repo.yml b/changelogs/unreleased/sh-fix-autocomplete-mirror-repo.yml deleted file mode 100644 index e855684bab1..00000000000 --- a/changelogs/unreleased/sh-fix-autocomplete-mirror-repo.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Disable password autocomplete in mirror repository form -merge_request: 27542 -author: -type: fixed diff --git a/changelogs/unreleased/sh-fix-invited-members.yml b/changelogs/unreleased/sh-fix-invited-members.yml deleted file mode 100644 index 96e43e1aa53..00000000000 --- a/changelogs/unreleased/sh-fix-invited-members.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix Error 500 when inviting user already present -merge_request: 28198 -author: -type: fixed diff --git a/changelogs/unreleased/sh-fix-lfs-download-errors.yml b/changelogs/unreleased/sh-fix-lfs-download-errors.yml deleted file mode 100644 index ad67df6bb06..00000000000 --- a/changelogs/unreleased/sh-fix-lfs-download-errors.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Properly handle LFS Batch API response in project import -merge_request: 28223 -author: -type: fixed diff --git a/changelogs/unreleased/sh-fix-personal-snippet-uploads-object-storage.yml b/changelogs/unreleased/sh-fix-personal-snippet-uploads-object-storage.yml deleted file mode 100644 index 603afa8573f..00000000000 --- a/changelogs/unreleased/sh-fix-personal-snippet-uploads-object-storage.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix incorrect prefix used in new uploads for personal snippets -merge_request: 28337 -author: -type: fixed diff --git a/changelogs/unreleased/sh-fix-pipeline-delete-caching.yml b/changelogs/unreleased/sh-fix-pipeline-delete-caching.yml deleted file mode 100644 index 98846ea9825..00000000000 --- a/changelogs/unreleased/sh-fix-pipeline-delete-caching.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Properly expire all pipeline caches when pipeline is deleted -merge_request: 27334 -author: -type: fixed diff --git a/changelogs/unreleased/sh-fix-related-merge-requests-path.yml b/changelogs/unreleased/sh-fix-related-merge-requests-path.yml deleted file mode 100644 index 4b4108feda4..00000000000 --- a/changelogs/unreleased/sh-fix-related-merge-requests-path.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Use a path for the related merge requests endpoint -merge_request: 28171 -author: -type: fixed diff --git a/changelogs/unreleased/sh-fix-rugged-get-tree-entries-recursive.yml b/changelogs/unreleased/sh-fix-rugged-get-tree-entries-recursive.yml deleted file mode 100644 index a9d46c6f460..00000000000 --- a/changelogs/unreleased/sh-fix-rugged-get-tree-entries-recursive.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix Rugged get_tree_entries recursive flag not working -merge_request: 28494 -author: -type: fixed diff --git a/changelogs/unreleased/sh-upgrade-grpc-and-protobuf.yml b/changelogs/unreleased/sh-upgrade-grpc-and-protobuf.yml deleted file mode 100644 index a43a59a4f8a..00000000000 --- a/changelogs/unreleased/sh-upgrade-grpc-and-protobuf.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Bump gRPC to 1.19.0 and protobuf to 3.7.1 -merge_request: 27086 -author: -type: other diff --git a/changelogs/unreleased/sh-validate-ref-name-in-commit.yml b/changelogs/unreleased/sh-validate-ref-name-in-commit.yml deleted file mode 100644 index 399529556bc..00000000000 --- a/changelogs/unreleased/sh-validate-ref-name-in-commit.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Validate refs used in controllers don't have spaces -merge_request: 24037 -author: -type: other diff --git a/changelogs/unreleased/shell-9-1-0.yml b/changelogs/unreleased/shell-9-1-0.yml deleted file mode 100644 index d5a01ee57ee..00000000000 --- a/changelogs/unreleased/shell-9-1-0.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Update gitlab-shell to v9.1.0 -merge_request: 28184 -author: -type: other diff --git a/changelogs/unreleased/show-disabled-mirrors.yml b/changelogs/unreleased/show-disabled-mirrors.yml deleted file mode 100644 index a401606b331..00000000000 --- a/changelogs/unreleased/show-disabled-mirrors.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Show disabled project repo mirrors in settings -merge_request: 27326 -author: -type: other diff --git a/changelogs/unreleased/support-negative-matches.yml b/changelogs/unreleased/support-negative-matches.yml deleted file mode 100644 index 8d3f2d3cbae..00000000000 --- a/changelogs/unreleased/support-negative-matches.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Support negative matches -merge_request: -author: -type: added diff --git a/changelogs/unreleased/tc-raw-log-in-plaintext-mail.yml b/changelogs/unreleased/tc-raw-log-in-plaintext-mail.yml deleted file mode 100644 index 373c2847ef2..00000000000 --- a/changelogs/unreleased/tc-raw-log-in-plaintext-mail.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Include link to raw job log in plain-text emails -merge_request: 27409 -author: -type: changed diff --git a/changelogs/unreleased/tortuetorche-gitlab-ce-patch-auto-deploy-extra-values.yml b/changelogs/unreleased/tortuetorche-gitlab-ce-patch-auto-deploy-extra-values.yml deleted file mode 100644 index 84ed4a8fccb..00000000000 --- a/changelogs/unreleased/tortuetorche-gitlab-ce-patch-auto-deploy-extra-values.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Allow extra arguments in helm commands when deploying the application in Auto-DevOps.gitlab-ci.yml -merge_request: 26171 -author: tortuetorche -type: changed diff --git a/changelogs/unreleased/update-gitlab-runner-helm-chart-to-0-4-0.yml b/changelogs/unreleased/update-gitlab-runner-helm-chart-to-0-4-0.yml deleted file mode 100644 index 7eb5bd58035..00000000000 --- a/changelogs/unreleased/update-gitlab-runner-helm-chart-to-0-4-0.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Update GitLab Runner Helm Chart to 0.4.0 -merge_request: 27508 -author: -type: other diff --git a/changelogs/unreleased/update-gitlab-runner-helm-chart-to-0-4-1.yml b/changelogs/unreleased/update-gitlab-runner-helm-chart-to-0-4-1.yml deleted file mode 100644 index f36c1d0e77e..00000000000 --- a/changelogs/unreleased/update-gitlab-runner-helm-chart-to-0-4-1.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Update GitLab Runner Helm Chart to 0.4.1 -merge_request: 27627 -author: -type: other diff --git a/changelogs/unreleased/update-workhorse-master.yml b/changelogs/unreleased/update-workhorse-master.yml deleted file mode 100644 index 97e2e891ab1..00000000000 --- a/changelogs/unreleased/update-workhorse-master.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Update Workhorse to v8.7.0 -merge_request: 27630 -author: -type: fixed diff --git a/changelogs/unreleased/use-pg-10-7.yml b/changelogs/unreleased/use-pg-10-7.yml deleted file mode 100644 index aa57c3a6a17..00000000000 --- a/changelogs/unreleased/use-pg-10-7.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Use PostgreSQL 10.7 in tests -merge_request: 28020 -author: -type: other diff --git a/changelogs/unreleased/weimeng-user-autocomplete-fix.yml b/changelogs/unreleased/weimeng-user-autocomplete-fix.yml deleted file mode 100644 index aca9fc4be30..00000000000 --- a/changelogs/unreleased/weimeng-user-autocomplete-fix.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Only show in autocomplete when author active -merge_request: 27292 -author: -type: fixed diff --git a/changelogs/unreleased/wiki-search-results-fix.yml b/changelogs/unreleased/wiki-search-results-fix.yml deleted file mode 100644 index 693867eb385..00000000000 --- a/changelogs/unreleased/wiki-search-results-fix.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: fix wiki search result links in titles -merge_request: 27400 -author: khm -type: fixed diff --git a/changelogs/unreleased/xanf-gitlab-ce-add-template-link.yml b/changelogs/unreleased/xanf-gitlab-ce-add-template-link.yml deleted file mode 100644 index b868758dcd2..00000000000 --- a/changelogs/unreleased/xanf-gitlab-ce-add-template-link.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add instructions on how to contribute a Built-In template for project -merge_request: 26976 -author: -type: other diff --git a/changelogs/unreleased/xanf-gitlab-ce-improve-project-overview.yml b/changelogs/unreleased/xanf-gitlab-ce-improve-project-overview.yml deleted file mode 100644 index 9755540953a..00000000000 --- a/changelogs/unreleased/xanf-gitlab-ce-improve-project-overview.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Improve icons and button order in project overview -merge_request: 26796 -author: -type: other diff --git a/changelogs/unreleased/zj-fsck-no-timeout.yml b/changelogs/unreleased/zj-fsck-no-timeout.yml deleted file mode 100644 index 044f269bb4d..00000000000 --- a/changelogs/unreleased/zj-fsck-no-timeout.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Remove deadline for Git fsck -merge_request: 27299 -author: -type: fixed diff --git a/changelogs/unreleased/zj-git-2-21-tests.yml b/changelogs/unreleased/zj-git-2-21-tests.yml deleted file mode 100644 index 56711379368..00000000000 --- a/changelogs/unreleased/zj-git-2-21-tests.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Test using Git 2.21 -merge_request: 27418 -author: -type: added diff --git a/config/routes/project.rb b/config/routes/project.rb index 93d746f3282..fdc2a3c0086 100644 --- a/config/routes/project.rb +++ b/config/routes/project.rb @@ -442,16 +442,23 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do end end end - namespace :settings do - get :members, to: redirect("%{namespace_id}/%{project_id}/project_members") - resource :ci_cd, only: [:show, :update], controller: 'ci_cd' do - post :reset_cache - put :reset_registration_token - end - resource :integrations, only: [:show] - resource :repository, only: [:show], controller: :repository do - post :create_deploy_token, path: 'deploy_token/create' - post :cleanup + + scope '-' do + namespace :settings do + get :members, to: redirect("%{namespace_id}/%{project_id}/project_members") + + resource :ci_cd, only: [:show, :update], controller: 'ci_cd' do + post :reset_cache + put :reset_registration_token + end + + resource :operations, only: [:show, :update] + resource :integrations, only: [:show] + + resource :repository, only: [:show], controller: :repository do + post :create_deploy_token, path: 'deploy_token/create' + post :cleanup + end end end @@ -465,10 +472,6 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do # its preferable to keep it below all other project routes draw :wiki draw :repository - - namespace :settings do - resource :operations, only: [:show, :update] - end end resources(:projects, @@ -493,4 +496,18 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do end end end + + # Legacy routes. + # Introduced in 12.0. + # Should be removed after 12.1 + scope(path: '*namespace_id', + as: :namespace, + namespace_id: Gitlab::PathRegex.full_namespace_route_regex) do + scope(path: ':project_id', + constraints: { project_id: Gitlab::PathRegex.project_route_regex }, + module: :projects, + as: :project) do + Gitlab::Routing.redirect_legacy_paths(self, :settings, :branches, :tags, :network, :graphs) + end + end end diff --git a/config/routes/repository.rb b/config/routes/repository.rb index f5201b9ddbb..b96315bfe8b 100644 --- a/config/routes/repository.rb +++ b/config/routes/repository.rb @@ -39,7 +39,7 @@ scope format: false do end end - scope constraints: { id: Gitlab::PathRegex.git_reference_regex } do + scope path: '-', constraints: { id: Gitlab::PathRegex.git_reference_regex } do resources :network, only: [:show] resources :graphs, only: [:show] do diff --git a/doc/development/contributing/issue_workflow.md b/doc/development/contributing/issue_workflow.md index 0e1ab8663ed..fef94c0a4b5 100644 --- a/doc/development/contributing/issue_workflow.md +++ b/doc/development/contributing/issue_workflow.md @@ -121,6 +121,27 @@ The Stage labels are used to generate the [direction pages][direction-pages] aut [devops-stages]: https://about.gitlab.com/direction/#devops-stages [direction-pages]: https://about.gitlab.com/direction/ +## Group labels + +Group labels specify which [groups][structure-groups] the issue belongs to. + +Examples include: + +- ~"group:control" +- ~"group:editor" + +These labels should be mutually exclusive. If an issue belongs to multiple +groups, the most relevant should be used. + +Groups are nested beneath a particular stage, so only one stage label and one group label +should be applied to a single issue. You can find the groups listed in the +[Product Categories pages][product-categories]. For example, ~"group:control" and +~"group:framework" labels can be applied to issues related to the [Manage stage][manage-stage]. + +[structure-groups]: https://about.gitlab.com/company/team/structure/#groups +[product-categories]: https://about.gitlab.com/handbook/product/categories/ +[manage-stage]: https://about.gitlab.com/handbook/product/categories/#manage-stage + ## Release Scoping labels Release Scoping labels help us clearly communicate expectations of the work for the diff --git a/doc/user/project/web_ide/index.md b/doc/user/project/web_ide/index.md index 2a2507d98a3..a634a8b2f54 100644 --- a/doc/user/project/web_ide/index.md +++ b/doc/user/project/web_ide/index.md @@ -8,7 +8,7 @@ projects by providing an advanced editor with commit staging. ## Open the Web IDE -The Web IDE can be opened when viewing a file, from the repository file list, +You can open the Web IDE when viewing a file, from the repository file list, and from merge requests. ![Open Web IDE](img/open_web_ide.png) @@ -45,7 +45,7 @@ Single file editing is based on the [Ace Editor](https://ace.c9.io). ## Stage and commit changes -After making your changes, click the Commit button in the bottom left to +After making your changes, click the **Commit** button in the bottom left to review the list of changed files. Click on each file to review the changes and click the tick icon to stage the file. @@ -67,10 +67,11 @@ shows you a preview of the merge request diff if you commit your changes. > [Introduced](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/19279) in [GitLab Core][ce] 11.0. -The Web IDE can be used to quickly fix failing tests by opening the branch or -merge request in the Web IDE and opening the logs of the failed job. The status -of all jobs for the most recent pipeline and job traces for the current commit -can be accessed by clicking the **Pipelines** button in the top right. +You can use the Web IDE to quickly fix failing tests by opening +the branch or merge request in the Web IDE and opening the logs of the failed +job. You can access the status of all jobs for the most recent pipeline and job +traces for the current commit by clicking the **Pipelines** button in the top +right. The pipeline status is also shown at all times in the status bar in the bottom left. @@ -79,31 +80,31 @@ left. > [Introduced](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/19318) in [GitLab Core][ce] 11.0. -Switching between your authored and assigned merge requests can be done without -leaving the Web IDE. Click the dropdown in the top of the sidebar to open a list -of merge requests. You will need to commit or discard all your changes before -switching to a different merge request. +To switch between your authored and assigned merge requests, click the +dropdown in the top of the sidebar to open a list of merge requests. You will +need to commit or discard all your changes before switching to a different merge +request. ## Switching branches > [Introduced](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/20850) in [GitLab Core][ce] 11.2. -Switching between branches of the current project repository can be done without -leaving the Web IDE. Click the dropdown in the top of the sidebar to open a list -of branches. You will need to commit or discard all your changes before -switching to a different branch. +To switch between branches of the current project repository, click the dropdown +in the top of the sidebar to open a list of branches. +You will need to commit or discard all your changes before switching to a +different branch. ## Client Side Evaluation > [Introduced](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/19764) in [GitLab Core][ce] 11.2. -The Web IDE can be used to preview JavaScript projects right in the browser. +You can use the Web IDE to preview JavaScript projects right in the browser. This feature uses CodeSandbox to compile and bundle the JavaScript used to preview the web application. ![Web IDE Client Side Evaluation](img/clientside_evaluation.png) -Additionally, for public projects an `Open in CodeSandbox` button is available +Additionally, for public projects an **Open in CodeSandbox** button is available to transfer the contents of the project into a public CodeSandbox project to quickly share your project with others. @@ -115,9 +116,9 @@ GitLab.com ![Admin Client Side Evaluation setting](img/admin_clientside_evaluation.png) -Once it has been enabled in application settings, projects with a -`package.json` file and a `main` entry point can be previewed inside of the Web -IDE. An example `package.json` is below. +Once you have done that, you can preview projects with a `package.json` file and +a `main` entry point inside the Web IDE. An example `package.json` is shown +below. ```json { diff --git a/lib/haml_lint/inline_javascript.rb b/haml_lint/inline_javascript.rb index 1b17162f71d..da6af92e82b 100644 --- a/lib/haml_lint/inline_javascript.rb +++ b/haml_lint/inline_javascript.rb @@ -7,7 +7,7 @@ unless Rails.env.production? module HamlLint class Linter::InlineJavaScript < Linter - include LinterRegistry + include ::HamlLint::LinterRegistry def visit_filter(node) return unless node.filter_type == 'javascript' diff --git a/lib/haml_lint/linter/no_plain_nodes.rb b/haml_lint/linter/no_plain_nodes.rb index d5cea0d07cf..c39f61fa80d 100644 --- a/lib/haml_lint/linter/no_plain_nodes.rb +++ b/haml_lint/linter/no_plain_nodes.rb @@ -5,7 +5,7 @@ require 'active_support/core_ext/array/grouping' module HamlLint class Linter class NoPlainNodes < Linter - include LinterRegistry + include ::HamlLint::LinterRegistry def visit_tag(node) if inline_plain_node?(node) diff --git a/lib/gitlab/lfs_token.rb b/lib/gitlab/lfs_token.rb index 31e6fc9d8c7..124e34562c1 100644 --- a/lib/gitlab/lfs_token.rb +++ b/lib/gitlab/lfs_token.rb @@ -35,8 +35,7 @@ module Gitlab end def token_valid?(token_to_check) - HMACToken.new(actor).token_valid?(token_to_check) || - LegacyRedisDeviseToken.new(actor).token_valid?(token_to_check) + HMACToken.new(actor).token_valid?(token_to_check) end def deploy_key_pushable?(project) @@ -103,44 +102,5 @@ module Gitlab Settings.attr_encrypted_db_key_base.first(16) end end - - # TODO: LegacyRedisDeviseToken and references need to be removed after - # next released milestone - # - class LegacyRedisDeviseToken - TOKEN_LENGTH = 50 - DEFAULT_EXPIRY_TIME = 1800 * 1000 # 30 mins - - def initialize(actor) - @actor = actor - end - - def token_valid?(token_to_check) - Devise.secure_compare(stored_token, token_to_check) - end - - def stored_token - Gitlab::Redis::SharedState.with { |redis| redis.get(state_key) } - end - - # This method exists purely to facilitate legacy testing to ensure the - # same redis key is used. - # - def store_new_token(expiry_time_in_ms = DEFAULT_EXPIRY_TIME) - Gitlab::Redis::SharedState.with do |redis| - new_token = Devise.friendly_token(TOKEN_LENGTH) - redis.set(state_key, new_token, px: expiry_time_in_ms) - new_token - end - end - - private - - attr_reader :actor - - def state_key - "gitlab:lfs_token:#{actor.class.name.underscore}_#{actor.id}" - end - end end end diff --git a/lib/gitlab/prometheus/query_variables.rb b/lib/gitlab/prometheus/query_variables.rb index dca09aef47d..9cc21129547 100644 --- a/lib/gitlab/prometheus/query_variables.rb +++ b/lib/gitlab/prometheus/query_variables.rb @@ -5,8 +5,7 @@ module Gitlab module QueryVariables def self.call(environment) deployment_platform = environment.deployment_platform - namespace = deployment_platform&.namespace_for(environment.project) || - deployment_platform&.actual_namespace || '' + namespace = deployment_platform&.kubernetes_namespace_for(environment.project) || '' { ci_environment_slug: environment.slug, diff --git a/lib/tasks/haml-lint.rake b/lib/tasks/haml-lint.rake index 786efd14b1a..305e15d69d5 100644 --- a/lib/tasks/haml-lint.rake +++ b/lib/tasks/haml-lint.rake @@ -1,6 +1,6 @@ unless Rails.env.production? require 'haml_lint/rake_task' - require 'haml_lint/inline_javascript' + require Rails.root.join('haml_lint/inline_javascript') # Workaround for warnings from parser/current # Keep it even if it no longer emits any warnings, diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 64d70f235b7..6209530deab 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -9100,6 +9100,9 @@ msgstr "" msgid "Star a label to make it a priority label. Order the prioritized labels to change their relative priority, by dragging." msgstr "" +msgid "Star toggle failed. Try again later." +msgstr "" + msgid "StarProject|Star" msgstr "" @@ -9232,6 +9235,9 @@ msgstr "" msgid "Subscribed" msgstr "" +msgid "Subscription" +msgstr "" + msgid "Subtracts" msgstr "" diff --git a/qa/docs/WRITING_TESTS_FROM_SCRATCH.md b/qa/docs/WRITING_TESTS_FROM_SCRATCH.md index a6daffc964e..f91286c232e 100644 --- a/qa/docs/WRITING_TESTS_FROM_SCRATCH.md +++ b/qa/docs/WRITING_TESTS_FROM_SCRATCH.md @@ -188,7 +188,7 @@ def select_label_and_refresh(label) end ``` -By creating a reusable `select_label_and_refresh` method we remove the code duplication, and later we can move this method to a Page Object class that will be created for easier maintenance purposes. +By creating a reusable `select_label_and_refresh` method, we remove the code duplication, and later we can move this method to a Page Object class that will be created for easier maintenance purposes. > Notice that the reusable method is created in the bottom of the file. The reason for that is that reading the code should be similar to reading a newspaper, where high-level information is at the top, like the title and summary of the news, while low level, or more specific information, is at the bottom. @@ -361,7 +361,109 @@ Finally, the `select_label_and_refresh` method is changed to `select_labels_and_ ### 7. Resources -TBD. +You can think of resources as anything that can be created on GitLab CE or EE, either through the GUI, the API, or the CLI. + +With that in mind, resources can be a project, an epic, an issue, a label, a commit, etc. + +As you saw in the tests' pre-conditions and the optimization sections, we're already creating some of these resources, and we are doing that by calling the `fabricate_via_api!` method. + +> We could be using the `fabricate!` method instead, which would use the `fabricate_via_api!` method if it exists, and fallback to GUI fabrication otherwise, but we recommend being explicit to make it clear what the test does. Also, we always recommend fabricating resources via API since this makes tests faster and more reliable. + +For our test suite example, the [project resource](https://gitlab.com/gitlab-org/gitlab-ee/blob/d3584e80b4236acdf393d815d604801573af72cc/qa/qa/resource/project.rb#L55) already had a `fabricate_via_api!` method available, while other resources don't have it, so we will have to create them, like for the issue and label resources. Also, we will have to make a small change in the project resource to expose its `id` attribute so that we can refer to it when fabricating the issue. + +#### Implementation + +Following we describe the changes needed in every of the before-mentioned resource files. + +**Project resource** + +Let's start with the smallest change. + +In the [project resource](https://gitlab.com/gitlab-org/gitlab-ee/blob/master/qa/qa/resource/project.rb), let's expose its `id` attribute. + +Add the following `attribute :id` right below the [`attribute :description`](https://gitlab.com/gitlab-org/gitlab-ee/blob/d3584e80b4236acdf393d815d604801573af72cc/qa/qa/resource/project.rb#L11). + +> This line is needed to allow for issues and labels to be automatically added to a project when fabricating them via API. + +**Issue resource** + +Now, let's make it possible to create an issue resource through the API. + +First, in the [issue resource](https://gitlab.com/gitlab-org/gitlab-ee/blob/d3584e80b4236acdf393d815d604801573af72cc/qa/qa/resource/issue.rb), let's expose its labels attribute. + +Add the following `attribute :labels` right below the [`attribute :title`](https://gitlab.com/gitlab-org/gitlab-ee/blob/d3584e80b4236acdf393d815d604801573af72cc/qa/qa/resource/issue.rb#L15). + +> This line is needed to allow for labels to be automatically added to an issue when fabricating it via API. + +Next, add the following code right below the [`fabricate!`](https://gitlab.com/gitlab-org/gitlab-ee/blob/d3584e80b4236acdf393d815d604801573af72cc/qa/qa/resource/issue.rb#L27) method. + +```ruby +def api_get_path + "/projects/#{project.id}/issues/#{id}" +end + +def api_post_path + "/projects/#{project.id}/issues" +end + +def api_post_body + { + title: title, + labels: [labels] + } +end +``` + +By defining the `api_get_path` method, we allow the [`ApiFabricator`](https://gitlab.com/gitlab-org/gitlab-ee/blob/master/qa/qa/resource/api_fabricator.rb) module to know which path to use to get a single issue. + +> This `GET` path can be found in the [public API documentation](https://docs.gitlab.com/ee/api/issues.html#single-issue). + +By defining the `api_post_path` method, we allow the [`ApiFabricator`](https://gitlab.com/gitlab-org/gitlab-ee/blob/master/qa/qa/resource/api_fabricator.rb) module to know which path to use to create a new issue in a specific project. + +> This `POST` path can be found in the [public API documentation](https://docs.gitlab.com/ee/api/issues.html#new-issue). + +By defining the `api_post_body` method, we allow the [`ApiFabricator.api_post`](https://gitlab.com/gitlab-org/gitlab-ee/blob/a9177ca1812bac57e2b2fa4560e1d5dd8ffac38b/qa/qa/resource/api_fabricator.rb#L68) method to know which data to send when making the `POST` request. + +> Notice that we pass both `title` and `labels` attributes in the `api_post_body`, where `labels` receives an array of labels, and [`title` is required](https://docs.gitlab.com/ee/api/issues.html#new-issue). + +**Label resource** + +Finally, let's make it possible to create label resources through the API. + +Add the following code right below the [`fabricate!`](https://gitlab.com/gitlab-org/gitlab-ee/blob/a9177ca1812bac57e2b2fa4560e1d5dd8ffac38b/qa/qa/resource/label.rb#L36) method. + +```ruby +def resource_web_url(resource) + super +rescue ResourceURLMissingError + # this particular resource does not expose a web_url property +end + +def api_get_path + raise NotImplementedError, "The Labels API doesn't expose a single-resource endpoint so this method cannot be properly implemented." +end + +def api_post_path + "/projects/#{project}/labels" +end + +def api_post_body + { + name: @title, + color: @color + } +end +``` + +By defining the `resource_web_url(resource)` method, we override the one from the [`ApiFabricator`](https://gitlab.com/gitlab-org/gitlab-ee/blob/master/qa/qa/resource/api_fabricator.rb#L44) module. We do that to avoid failing the test due to this particular resource not exposing a `web_url` property. + +By defining the `api_get_path` method, we **would** allow for the [`ApiFabricator`](https://gitlab.com/gitlab-org/gitlab-ee/blob/master/qa/qa/resource/api_fabricator.rb) module to know which path to use to get a single label, but since there's no path available for that in the publich API, we raise a `NotImplementedError` instead. + +By defining the `api_post_path` method, we allow for the [`ApiFabricator `](https://gitlab.com/gitlab-org/gitlab-ee/blob/master/qa/qa/resource/api_fabricator.rb) module to know which path to use to create a new label in a specific project. + +By defining the `api_post_body` method, we we allow for the [`ApiFabricator.api_post`](https://gitlab.com/gitlab-org/gitlab-ee/blob/a9177ca1812bac57e2b2fa4560e1d5dd8ffac38b/qa/qa/resource/api_fabricator.rb#L68) method to know which data to send when making the `POST` request. + +> Notice that we pass both `name` and `color` attributes in the `api_post_body` since [those are required](https://docs.gitlab.com/ee/api/labels.html#create-a-new-label). ### 8. Page Objects @@ -377,4 +479,4 @@ Now, let's go back to our examples. #### Adding testability -TBD.
\ No newline at end of file +TBD. diff --git a/qa/qa/resource/README.md b/qa/qa/resource/README.md index 4cdeb3f42a2..2c8859b6599 100644 --- a/qa/qa/resource/README.md +++ b/qa/qa/resource/README.md @@ -1,7 +1,7 @@ # Resource class in GitLab QA Resources are primarily created using Browser UI steps, but can also -be created via the API. +be created via the API or the CLI. ## How to properly implement a resource class? diff --git a/qa/qa/runtime/browser.rb b/qa/qa/runtime/browser.rb index a5218fc9ab1..174a52bd376 100644 --- a/qa/qa/runtime/browser.rb +++ b/qa/qa/runtime/browser.rb @@ -76,6 +76,9 @@ module QA # https://developers.google.com/web/updates/2017/04/headless-chrome#cli options.add_argument("disable-gpu") end + + # Disable /dev/shm use in CI. See https://gitlab.com/gitlab-org/gitlab-ee/issues/4252 + options.add_argument("disable-dev-shm-usage") if QA::Runtime::Env.running_in_ci? end # Use the same profile on QA runs if CHROME_REUSE_PROFILE is true. @@ -85,9 +88,6 @@ module QA options.add_argument("user-data-dir=#{qa_profile_dir}") end - # Disable /dev/shm use in CI. See https://gitlab.com/gitlab-org/gitlab-ee/issues/4252 - options.add_argument("disable-dev-shm-usage") if QA::Runtime::Env.running_in_ci? - selenium_options = { browser: QA::Runtime::Env.browser, clear_local_storage: true, diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb index 7296a4b4526..5ecd1b6b7c8 100644 --- a/spec/controllers/application_controller_spec.rb +++ b/spec/controllers/application_controller_spec.rb @@ -206,8 +206,19 @@ describe ApplicationController do describe '#check_two_factor_requirement' do subject { controller.send :check_two_factor_requirement } + it 'does not redirect if user has temporary oauth email' do + oauth_user = create(:user, email: 'temp-email-for-oauth@email.com') + allow(controller).to receive(:two_factor_authentication_required?).and_return(true) + allow(controller).to receive(:current_user).and_return(oauth_user) + + expect(controller).not_to receive(:redirect_to) + + subject + end + it 'does not redirect if 2FA is not required' do allow(controller).to receive(:two_factor_authentication_required?).and_return(false) + expect(controller).not_to receive(:redirect_to) subject @@ -216,6 +227,7 @@ describe ApplicationController do it 'does not redirect if user is not logged in' do allow(controller).to receive(:two_factor_authentication_required?).and_return(true) allow(controller).to receive(:current_user).and_return(nil) + expect(controller).not_to receive(:redirect_to) subject @@ -223,8 +235,9 @@ describe ApplicationController do it 'does not redirect if user has 2FA enabled' do allow(controller).to receive(:two_factor_authentication_required?).and_return(true) - allow(controller).to receive(:current_user).twice.and_return(user) + allow(controller).to receive(:current_user).thrice.and_return(user) allow(user).to receive(:two_factor_enabled?).and_return(true) + expect(controller).not_to receive(:redirect_to) subject @@ -232,9 +245,10 @@ describe ApplicationController do it 'does not redirect if 2FA setup can be skipped' do allow(controller).to receive(:two_factor_authentication_required?).and_return(true) - allow(controller).to receive(:current_user).twice.and_return(user) + allow(controller).to receive(:current_user).thrice.and_return(user) allow(user).to receive(:two_factor_enabled?).and_return(false) allow(controller).to receive(:skip_two_factor?).and_return(true) + expect(controller).not_to receive(:redirect_to) subject @@ -242,10 +256,11 @@ describe ApplicationController do it 'redirects to 2FA setup otherwise' do allow(controller).to receive(:two_factor_authentication_required?).and_return(true) - allow(controller).to receive(:current_user).twice.and_return(user) + allow(controller).to receive(:current_user).thrice.and_return(user) allow(user).to receive(:two_factor_enabled?).and_return(false) allow(controller).to receive(:skip_two_factor?).and_return(false) allow(controller).to receive(:profile_two_factor_auth_path) + expect(controller).to receive(:redirect_to) subject diff --git a/spec/frontend/repository/components/table/__snapshots__/row_spec.js.snap b/spec/frontend/repository/components/table/__snapshots__/row_spec.js.snap new file mode 100644 index 00000000000..f0b72343b6e --- /dev/null +++ b/spec/frontend/repository/components/table/__snapshots__/row_spec.js.snap @@ -0,0 +1,33 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Repository table row component renders table row 1`] = ` +<tr + class="tree-item file_1" +> + <td + class="tree-item-file-name" + > + <i + aria-label="file" + class="fa fa-fw fa-file-text-o" + role="img" + /> + + <a + class="str-truncated" + > + test + </a> + + <!----> + </td> + + <td + class="d-none d-sm-table-cell tree-commit" + /> + + <td + class="tree-time-ago text-right" + /> +</tr> +`; diff --git a/spec/frontend/repository/components/table/row_spec.js b/spec/frontend/repository/components/table/row_spec.js new file mode 100644 index 00000000000..216128dce25 --- /dev/null +++ b/spec/frontend/repository/components/table/row_spec.js @@ -0,0 +1,85 @@ +import { shallowMount, RouterLinkStub } from '@vue/test-utils'; +import TableRow from '~/repository/components/table/row.vue'; + +let vm; +let $router; + +function factory(propsData = {}) { + $router = { + push: jest.fn(), + }; + + vm = shallowMount(TableRow, { + propsData, + mocks: { + $router, + }, + stubs: { + RouterLink: RouterLinkStub, + }, + }); + + vm.setData({ ref: 'master' }); +} + +describe('Repository table row component', () => { + afterEach(() => { + vm.destroy(); + }); + + it('renders table row', () => { + factory({ + id: 1, + path: 'test', + type: 'file', + }); + + expect(vm.element).toMatchSnapshot(); + }); + + it.each` + type | component | componentName + ${'folder'} | ${RouterLinkStub} | ${'RouterLink'} + ${'file'} | ${'a'} | ${'hyperlink'} + ${'commit'} | ${'a'} | ${'hyperlink'} + `('renders a $componentName for type $type', ({ type, component }) => { + factory({ + id: 1, + path: 'test', + type, + }); + + expect(vm.find(component).exists()).toBe(true); + }); + + it.each` + type | pushes + ${'folder'} | ${true} + ${'file'} | ${false} + ${'commit'} | ${false} + `('pushes new router if type $type is folder', ({ type, pushes }) => { + factory({ + id: 1, + path: 'test', + type, + }); + + vm.trigger('click'); + + if (pushes) { + expect($router.push).toHaveBeenCalledWith({ path: '/tree/master/test' }); + } else { + expect($router.push).not.toHaveBeenCalled(); + } + }); + + it('renders commit ID for submodule', () => { + factory({ + id: 1, + path: 'test', + type: 'commit', + }); + + expect(vm.find('.commit-sha').text()).toContain('1'); + }); +}); diff --git a/spec/frontend/repository/utils/icon_spec.js b/spec/frontend/repository/utils/icon_spec.js new file mode 100644 index 00000000000..52787327bef --- /dev/null +++ b/spec/frontend/repository/utils/icon_spec.js @@ -0,0 +1,23 @@ +import { getIconName } from '~/repository/utils/icon'; + +describe('getIconName', () => { + // Tests the returning font awesome icon name + // We only test one for each file type to save testing a lot of different + // file types + it.each` + type | path | icon + ${'folder'} | ${''} | ${'folder'} + ${'commit'} | ${''} | ${'archive'} + ${'file'} | ${'test.pdf'} | ${'file-pdf-o'} + ${'file'} | ${'test.jpg'} | ${'file-image-o'} + ${'file'} | ${'test.zip'} | ${'file-archive-o'} + ${'file'} | ${'test.mp3'} | ${'file-audio-o'} + ${'file'} | ${'test.flv'} | ${'file-video-o'} + ${'file'} | ${'test.dotx'} | ${'file-word-o'} + ${'file'} | ${'test.xlsb'} | ${'file-excel-o'} + ${'file'} | ${'test.ppam'} | ${'file-powerpoint-o'} + ${'file'} | ${'test.js'} | ${'file-text-o'} + `('returns $icon for $type with path $path', ({ type, path, icon }) => { + expect(getIconName(type, path)).toEqual(icon); + }); +}); diff --git a/spec/graphql/resolvers/tree_resolver_spec.rb b/spec/graphql/resolvers/tree_resolver_spec.rb new file mode 100644 index 00000000000..9f95b740ab1 --- /dev/null +++ b/spec/graphql/resolvers/tree_resolver_spec.rb @@ -0,0 +1,35 @@ +require 'spec_helper' + +describe Resolvers::TreeResolver do + include GraphqlHelpers + + let(:repository) { create(:project, :repository).repository } + + describe '#resolve' do + it 'resolves to a tree' do + result = resolve_repository({ ref: "master" }) + + expect(result).to be_an_instance_of(Tree) + end + + it 'resolve to a recursive tree' do + result = resolve_repository({ ref: "master", recursive: true }) + + expect(result.trees[4].path).to eq('files/html') + end + + context 'when repository does not exist' do + it 'returns nil' do + allow(repository).to receive(:exists?).and_return(false) + + result = resolve_repository({ ref: "master" }) + + expect(result).to be(nil) + end + end + end + + def resolve_repository(args) + resolve(described_class, obj: repository, args: args) + end +end diff --git a/spec/graphql/types/project_type_spec.rb b/spec/graphql/types/project_type_spec.rb index e0ad09bdf22..075fa7c7e43 100644 --- a/spec/graphql/types/project_type_spec.rb +++ b/spec/graphql/types/project_type_spec.rb @@ -17,4 +17,6 @@ describe GitlabSchema.types['Project'] do end it { is_expected.to have_graphql_field(:pipelines) } + + it { is_expected.to have_graphql_field(:repository) } end diff --git a/spec/graphql/types/repository_type_spec.rb b/spec/graphql/types/repository_type_spec.rb new file mode 100644 index 00000000000..8a8238f2a2a --- /dev/null +++ b/spec/graphql/types/repository_type_spec.rb @@ -0,0 +1,11 @@ +require 'spec_helper' + +describe GitlabSchema.types['Repository'] do + it { expect(described_class.graphql_name).to eq('Repository') } + + it { expect(described_class).to require_graphql_authorizations(:download_code) } + + it { is_expected.to have_graphql_field(:root_ref) } + + it { is_expected.to have_graphql_field(:tree) } +end diff --git a/spec/graphql/types/tree/blob_type_spec.rb b/spec/graphql/types/tree/blob_type_spec.rb new file mode 100644 index 00000000000..fa29bb5fff7 --- /dev/null +++ b/spec/graphql/types/tree/blob_type_spec.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Types::Tree::BlobType do + it { expect(described_class.graphql_name).to eq('Blob') } + + it { expect(described_class).to have_graphql_fields(:id, :name, :type, :path, :flat_path) } +end diff --git a/spec/graphql/types/tree/submodule_type_spec.rb b/spec/graphql/types/tree/submodule_type_spec.rb new file mode 100644 index 00000000000..bdb3149b41c --- /dev/null +++ b/spec/graphql/types/tree/submodule_type_spec.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Types::Tree::SubmoduleType do + it { expect(described_class.graphql_name).to eq('Submodule') } + + it { expect(described_class).to have_graphql_fields(:id, :name, :type, :path, :flat_path) } +end diff --git a/spec/graphql/types/tree/tree_entry_type_spec.rb b/spec/graphql/types/tree/tree_entry_type_spec.rb new file mode 100644 index 00000000000..397cabde8e5 --- /dev/null +++ b/spec/graphql/types/tree/tree_entry_type_spec.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Types::Tree::TreeEntryType do + it { expect(described_class.graphql_name).to eq('TreeEntry') } + + it { expect(described_class).to have_graphql_fields(:id, :name, :type, :path, :flat_path) } +end diff --git a/spec/graphql/types/tree/tree_type_spec.rb b/spec/graphql/types/tree/tree_type_spec.rb new file mode 100644 index 00000000000..b9c5570115e --- /dev/null +++ b/spec/graphql/types/tree/tree_type_spec.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Types::Tree::TreeType do + it { expect(described_class.graphql_name).to eq('Tree') } + + it { expect(described_class).to have_graphql_fields(:trees, :submodules, :blobs) } +end diff --git a/spec/graphql/types/tree/type_enum_spec.rb b/spec/graphql/types/tree/type_enum_spec.rb new file mode 100644 index 00000000000..4caf9e1c457 --- /dev/null +++ b/spec/graphql/types/tree/type_enum_spec.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Types::Tree::TypeEnum do + it { expect(described_class.graphql_name).to eq('EntryType') } + + it 'exposes all tree entry types' do + expect(described_class.values.keys).to include(*%w[tree blob commit]) + end +end diff --git a/spec/lib/haml_lint/linter/no_plain_nodes_spec.rb b/spec/haml_lint/linter/no_plain_nodes_spec.rb index 99cc9b9bc8d..08deb5a4e9e 100644 --- a/spec/lib/haml_lint/linter/no_plain_nodes_spec.rb +++ b/spec/haml_lint/linter/no_plain_nodes_spec.rb @@ -3,6 +3,7 @@ require 'spec_helper' require 'haml_lint' require 'haml_lint/spec' +require Rails.root.join('haml_lint/linter/no_plain_nodes') describe HamlLint::Linter::NoPlainNodes do include_context 'linter' diff --git a/spec/javascripts/api_spec.js b/spec/javascripts/api_spec.js index 494b3b934a8..805bb10bda6 100644 --- a/spec/javascripts/api_spec.js +++ b/spec/javascripts/api_spec.js @@ -288,7 +288,7 @@ describe('Api', () => { it('creates a group label', done => { const namespace = 'group/subgroup'; const labelData = { some: 'data' }; - const expectedUrl = `${dummyUrlRoot}/groups/${namespace}/-/labels`; + const expectedUrl = Api.buildUrl(Api.groupLabelsPath).replace(':namespace_path', namespace); const expectedData = { label: labelData, }; diff --git a/spec/lib/gitlab/lfs_token_spec.rb b/spec/lib/gitlab/lfs_token_spec.rb index 8961ecc4be0..701ed1f3a1b 100644 --- a/spec/lib/gitlab/lfs_token_spec.rb +++ b/spec/lib/gitlab/lfs_token_spec.rb @@ -77,96 +77,42 @@ describe Gitlab::LfsToken, :clean_gitlab_redis_shared_state do let(:actor) { create(:user, username: 'test_user_lfs_1') } let(:lfs_token) { described_class.new(actor) } - context 'for an HMAC token' do - before do - # We're not interested in testing LegacyRedisDeviseToken here - allow(Gitlab::LfsToken::LegacyRedisDeviseToken).to receive_message_chain(:new, :token_valid?).and_return(false) - end - - context 'where the token is invalid' do - context "because it's junk" do - it 'returns false' do - expect(lfs_token.token_valid?('junk')).to be_falsey - end - end - - context "because it's been fiddled with" do - it 'returns false' do - fiddled_token = lfs_token.token.tap { |token| token[0] = 'E' } - expect(lfs_token.token_valid?(fiddled_token)).to be_falsey - end - end - - context "because it was generated with a different secret" do - it 'returns false' do - different_actor = create(:user, username: 'test_user_lfs_2') - different_secret_token = described_class.new(different_actor).token - expect(lfs_token.token_valid?(different_secret_token)).to be_falsey - end - end - - context "because it's expired" do - it 'returns false' do - expired_token = lfs_token.token - # Needs to be at least 1860 seconds, because the default expiry is - # 1800 seconds with an additional 60 second leeway. - Timecop.freeze(Time.now + 1865) do - expect(lfs_token.token_valid?(expired_token)).to be_falsey - end - end + context 'where the token is invalid' do + context "because it's junk" do + it 'returns false' do + expect(lfs_token.token_valid?('junk')).to be_falsey end end - context 'where the token is valid' do - it 'returns true' do - expect(lfs_token.token_valid?(lfs_token.token)).to be_truthy + context "because it's been fiddled with" do + it 'returns false' do + fiddled_token = lfs_token.token.tap { |token| token[0] = 'E' } + expect(lfs_token.token_valid?(fiddled_token)).to be_falsey end end - end - - context 'for a LegacyRedisDevise token' do - before do - # We're not interested in testing HMACToken here - allow_any_instance_of(Gitlab::LfsToken::HMACToken).to receive(:token_valid?).and_return(false) - end - - context 'where the token is invalid' do - context "because it's junk" do - it 'returns false' do - expect(lfs_token.token_valid?('junk')).to be_falsey - end - end - context "because it's been fiddled with" do - it 'returns false' do - generated_token = Gitlab::LfsToken::LegacyRedisDeviseToken.new(actor).store_new_token - fiddled_token = generated_token.tap { |token| token[0] = 'E' } - expect(lfs_token.token_valid?(fiddled_token)).to be_falsey - end - end - - context "because it was generated with a different secret" do - it 'returns false' do - different_actor = create(:user, username: 'test_user_lfs_2') - different_secret_token = described_class.new(different_actor).token - expect(lfs_token.token_valid?(different_secret_token)).to be_falsey - end + context "because it was generated with a different secret" do + it 'returns false' do + different_actor = create(:user, username: 'test_user_lfs_2') + different_secret_token = described_class.new(different_actor).token + expect(lfs_token.token_valid?(different_secret_token)).to be_falsey end + end - context "because it's expired" do - it 'returns false' do - generated_token = Gitlab::LfsToken::LegacyRedisDeviseToken.new(actor).store_new_token(1) - # We need a real sleep here because we need to wait for redis to expire the key. - sleep(0.01) - expect(lfs_token.token_valid?(generated_token)).to be_falsey + context "because it's expired" do + it 'returns false' do + expired_token = lfs_token.token + # Needs to be at least 1860 seconds, because the default expiry is + # 1800 seconds with an additional 60 second leeway. + Timecop.freeze(Time.now + 1865) do + expect(lfs_token.token_valid?(expired_token)).to be_falsey end end end context 'where the token is valid' do it 'returns true' do - generated_token = Gitlab::LfsToken::LegacyRedisDeviseToken.new(actor).store_new_token - expect(lfs_token.token_valid?(generated_token)).to be_truthy + expect(lfs_token.token_valid?(lfs_token.token)).to be_truthy end end end diff --git a/spec/lib/gitlab/prometheus/query_variables_spec.rb b/spec/lib/gitlab/prometheus/query_variables_spec.rb index 048f4af6020..6dc99ef26ec 100644 --- a/spec/lib/gitlab/prometheus/query_variables_spec.rb +++ b/spec/lib/gitlab/prometheus/query_variables_spec.rb @@ -23,7 +23,7 @@ describe Gitlab::Prometheus::QueryVariables do context 'with deployment platform' do context 'with project cluster' do - let(:kube_namespace) { environment.deployment_platform.actual_namespace } + let(:kube_namespace) { environment.deployment_platform.cluster.kubernetes_namespace_for(project) } before do create(:cluster, :project, :provided_by_user, projects: [project]) diff --git a/spec/models/ci/pipeline_schedule_spec.rb b/spec/models/ci/pipeline_schedule_spec.rb index 1bfc14d2839..42d4769a921 100644 --- a/spec/models/ci/pipeline_schedule_spec.rb +++ b/spec/models/ci/pipeline_schedule_spec.rb @@ -3,6 +3,8 @@ require 'spec_helper' describe Ci::PipelineSchedule do + subject { build(:ci_pipeline_schedule) } + it { is_expected.to belong_to(:project) } it { is_expected.to belong_to(:owner) } diff --git a/spec/models/clusters/cluster_spec.rb b/spec/models/clusters/cluster_spec.rb index 58203da5b22..3ee8c340bfe 100644 --- a/spec/models/clusters/cluster_spec.rb +++ b/spec/models/clusters/cluster_spec.rb @@ -5,6 +5,8 @@ require 'spec_helper' describe Clusters::Cluster do it_behaves_like 'having unique enum values' + subject { build(:cluster) } + it { is_expected.to belong_to(:user) } it { is_expected.to have_many(:cluster_projects) } it { is_expected.to have_many(:projects) } @@ -17,7 +19,6 @@ describe Clusters::Cluster do it { is_expected.to have_one(:application_prometheus) } it { is_expected.to have_one(:application_runner) } it { is_expected.to have_many(:kubernetes_namespaces) } - it { is_expected.to have_one(:kubernetes_namespace) } it { is_expected.to have_one(:cluster_project) } it { is_expected.to delegate_method(:status).to(:provider) } diff --git a/spec/models/clusters/platforms/kubernetes_spec.rb b/spec/models/clusters/platforms/kubernetes_spec.rb index e35d14f2282..c485850c16e 100644 --- a/spec/models/clusters/platforms/kubernetes_spec.rb +++ b/spec/models/clusters/platforms/kubernetes_spec.rb @@ -15,10 +15,8 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching it { is_expected.to validate_presence_of(:api_url) } it { is_expected.to validate_presence_of(:token) } - it { is_expected.to delegate_method(:project).to(:cluster) } it { is_expected.to delegate_method(:enabled?).to(:cluster) } it { is_expected.to delegate_method(:provided_by_user?).to(:cluster) } - it { is_expected.to delegate_method(:kubernetes_namespace).to(:cluster) } it_behaves_like 'having unique enum values' @@ -209,7 +207,7 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching it { is_expected.to be_truthy } end - describe '#actual_namespace' do + describe '#kubernetes_namespace_for' do let(:cluster) { create(:cluster, :project) } let(:project) { cluster.project } @@ -219,7 +217,7 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching namespace: namespace) end - subject { platform.actual_namespace } + subject { platform.kubernetes_namespace_for(project) } context 'with a namespace assigned' do let(:namespace) { 'namespace-123' } @@ -305,8 +303,6 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching end context 'no namespace provided' do - let(:namespace) { kubernetes.actual_namespace } - it_behaves_like 'setting variables' it 'sets KUBE_TOKEN' do @@ -389,7 +385,7 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching end context 'with valid pods' do - let(:pod) { kube_pod(environment_slug: environment.slug, project_slug: project.full_path_slug) } + let(:pod) { kube_pod(environment_slug: environment.slug, namespace: cluster.kubernetes_namespace_for(project), project_slug: project.full_path_slug) } let(:pod_with_no_terminal) { kube_pod(environment_slug: environment.slug, project_slug: project.full_path_slug, status: "Pending") } let(:terminals) { kube_terminals(service, pod) } @@ -419,6 +415,7 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching let!(:cluster) { create(:cluster, :project, enabled: enabled, platform_kubernetes: service) } let(:service) { create(:cluster_platform_kubernetes, :configured) } let(:enabled) { true } + let(:namespace) { cluster.kubernetes_namespace_for(cluster.project) } context 'when cluster is disabled' do let(:enabled) { false } @@ -428,8 +425,8 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching context 'when kubernetes responds with valid pods and deployments' do before do - stub_kubeclient_pods - stub_kubeclient_deployments + stub_kubeclient_pods(namespace) + stub_kubeclient_deployments(namespace) end it { is_expected.to include(pods: [kube_pod]) } @@ -437,8 +434,8 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching context 'when kubernetes responds with 500s' do before do - stub_kubeclient_pods(status: 500) - stub_kubeclient_deployments(status: 500) + stub_kubeclient_pods(namespace, status: 500) + stub_kubeclient_deployments(namespace, status: 500) end it { expect { subject }.to raise_error(Kubeclient::HttpError) } @@ -446,12 +443,18 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching context 'when kubernetes responds with 404s' do before do - stub_kubeclient_pods(status: 404) - stub_kubeclient_deployments(status: 404) + stub_kubeclient_pods(namespace, status: 404) + stub_kubeclient_deployments(namespace, status: 404) end it { is_expected.to include(pods: []) } end + + context 'when the cluster is not project level' do + let(:cluster) { create(:cluster, :group, platform_kubernetes: service) } + + it { is_expected.to include(pods: []) } + end end describe '#update_kubernetes_namespace' do diff --git a/spec/models/clusters/project_spec.rb b/spec/models/clusters/project_spec.rb index 2f017e69251..671af085d10 100644 --- a/spec/models/clusters/project_spec.rb +++ b/spec/models/clusters/project_spec.rb @@ -6,5 +6,4 @@ describe Clusters::Project do it { is_expected.to belong_to(:cluster) } it { is_expected.to belong_to(:project) } it { is_expected.to have_many(:kubernetes_namespaces) } - it { is_expected.to have_one(:kubernetes_namespace) } end diff --git a/spec/models/deployment_spec.rb b/spec/models/deployment_spec.rb index f51322e1404..1dceef3fc00 100644 --- a/spec/models/deployment_spec.rb +++ b/spec/models/deployment_spec.rb @@ -5,8 +5,8 @@ require 'spec_helper' describe Deployment do subject { build(:deployment) } - it { is_expected.to belong_to(:project) } - it { is_expected.to belong_to(:environment) } + it { is_expected.to belong_to(:project).required } + it { is_expected.to belong_to(:environment).required } it { is_expected.to belong_to(:user) } it { is_expected.to belong_to(:deployable) } diff --git a/spec/models/environment_spec.rb b/spec/models/environment_spec.rb index 17246f238e0..7233d2454c6 100644 --- a/spec/models/environment_spec.rb +++ b/spec/models/environment_spec.rb @@ -6,7 +6,7 @@ describe Environment do let(:project) { create(:project, :stubbed_repository) } subject(:environment) { create(:environment, project: project) } - it { is_expected.to belong_to(:project) } + it { is_expected.to belong_to(:project).required } it { is_expected.to have_many(:deployments) } it { is_expected.to delegate_method(:stop_action).to(:last_deployment) } diff --git a/spec/models/project_services/kubernetes_service_spec.rb b/spec/models/project_services/kubernetes_service_spec.rb index 3a381cb405d..2fce120381b 100644 --- a/spec/models/project_services/kubernetes_service_spec.rb +++ b/spec/models/project_services/kubernetes_service_spec.rb @@ -161,8 +161,8 @@ describe KubernetesService, :use_clean_rails_memory_store_caching do end end - describe '#actual_namespace' do - subject { service.actual_namespace } + describe '#kubernetes_namespace_for' do + subject { service.kubernetes_namespace_for(project) } shared_examples 'a correctly formatted namespace' do it 'returns a valid Kubernetes namespace name' do @@ -298,7 +298,7 @@ describe KubernetesService, :use_clean_rails_memory_store_caching do end context 'no namespace provided' do - let(:namespace) { subject.actual_namespace } + let(:namespace) { subject.kubernetes_namespace_for(project) } it_behaves_like 'setting variables' @@ -325,7 +325,7 @@ describe KubernetesService, :use_clean_rails_memory_store_caching do end context 'with valid pods' do - let(:pod) { kube_pod(environment_slug: environment.slug, project_slug: project.full_path_slug) } + let(:pod) { kube_pod(environment_slug: environment.slug, namespace: service.kubernetes_namespace_for(project), project_slug: project.full_path_slug) } let(:pod_with_no_terminal) { kube_pod(environment_slug: environment.slug, project_slug: project.full_path_slug, status: "Pending") } let(:terminals) { kube_terminals(service, pod) } @@ -352,6 +352,8 @@ describe KubernetesService, :use_clean_rails_memory_store_caching do describe '#calculate_reactive_cache' do subject { service.calculate_reactive_cache } + let(:namespace) { service.kubernetes_namespace_for(project) } + context 'when service is inactive' do before do service.active = false @@ -362,8 +364,8 @@ describe KubernetesService, :use_clean_rails_memory_store_caching do context 'when kubernetes responds with valid pods' do before do - stub_kubeclient_pods - stub_kubeclient_deployments # Used by EE + stub_kubeclient_pods(namespace) + stub_kubeclient_deployments(namespace) # Used by EE end it { is_expected.to include(pods: [kube_pod]) } @@ -371,8 +373,8 @@ describe KubernetesService, :use_clean_rails_memory_store_caching do context 'when kubernetes responds with 500s' do before do - stub_kubeclient_pods(status: 500) - stub_kubeclient_deployments(status: 500) # Used by EE + stub_kubeclient_pods(namespace, status: 500) + stub_kubeclient_deployments(namespace, status: 500) # Used by EE end it { expect { subject }.to raise_error(Kubeclient::HttpError) } @@ -380,8 +382,8 @@ describe KubernetesService, :use_clean_rails_memory_store_caching do context 'when kubernetes responds with 404s' do before do - stub_kubeclient_pods(status: 404) - stub_kubeclient_deployments(status: 404) # Used by EE + stub_kubeclient_pods(namespace, status: 404) + stub_kubeclient_deployments(namespace, status: 404) # Used by EE end it { is_expected.to include(pods: []) } diff --git a/spec/presenters/merge_request_presenter_spec.rb b/spec/presenters/merge_request_presenter_spec.rb index 451dc88880c..0e1aed42cc5 100644 --- a/spec/presenters/merge_request_presenter_spec.rb +++ b/spec/presenters/merge_request_presenter_spec.rb @@ -403,7 +403,7 @@ describe MergeRequestPresenter do allow(resource).to receive(:source_branch_exists?) { true } is_expected - .to eq("/#{resource.source_project.full_path}/branches/#{resource.source_branch}") + .to eq("/#{resource.source_project.full_path}/-/branches/#{resource.source_branch}") end end @@ -426,7 +426,7 @@ describe MergeRequestPresenter do allow(resource).to receive(:target_branch_exists?) { true } is_expected - .to eq("/#{resource.source_project.full_path}/branches/#{resource.target_branch}") + .to eq("/#{resource.source_project.full_path}/-/branches/#{resource.target_branch}") end end diff --git a/spec/requests/api/graphql/project/repository_spec.rb b/spec/requests/api/graphql/project/repository_spec.rb new file mode 100644 index 00000000000..67af612a4a0 --- /dev/null +++ b/spec/requests/api/graphql/project/repository_spec.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true +require 'spec_helper' + +describe 'getting a repository in a project' do + include GraphqlHelpers + + let(:project) { create(:project, :repository) } + let(:current_user) { project.owner } + let(:fields) do + <<~QUERY + #{all_graphql_fields_for('repository'.classify)} + QUERY + end + let(:query) do + graphql_query_for( + 'project', + { 'fullPath' => project.full_path }, + query_graphql_field('repository', {}, fields) + ) + end + + it 'returns repository' do + post_graphql(query, current_user: current_user) + + expect(graphql_data['project']['repository']).to be_present + end + + context 'as a non-authorized user' do + let(:current_user) { create(:user) } + + it 'returns nil' do + post_graphql(query, current_user: current_user) + + expect(graphql_data['project']).to be(nil) + end + end +end diff --git a/spec/requests/api/graphql/project/tree/tree_spec.rb b/spec/requests/api/graphql/project/tree/tree_spec.rb new file mode 100644 index 00000000000..b07aa1e12d3 --- /dev/null +++ b/spec/requests/api/graphql/project/tree/tree_spec.rb @@ -0,0 +1,73 @@ +# frozen_string_literal: true +require 'spec_helper' + +describe 'getting a tree in a project' do + include GraphqlHelpers + + let(:project) { create(:project, :repository) } + let(:current_user) { project.owner } + let(:path) { "" } + let(:ref) { "master" } + let(:fields) do + <<~QUERY + tree(path:"#{path}", ref:"#{ref}") { + #{all_graphql_fields_for('tree'.classify)} + } + QUERY + end + let(:query) do + graphql_query_for( + 'project', + { 'fullPath' => project.full_path }, + query_graphql_field('repository', {}, fields) + ) + end + + context 'when path does not exist' do + let(:path) { "testing123" } + + it 'returns empty tree' do + post_graphql(query, current_user: current_user) + + expect(graphql_data['project']['repository']['tree']['trees']['edges']).to eq([]) + expect(graphql_data['project']['repository']['tree']['submodules']['edges']).to eq([]) + expect(graphql_data['project']['repository']['tree']['blobs']['edges']).to eq([]) + end + end + + context 'when ref does not exist' do + let(:ref) { "testing123" } + + it 'returns empty tree' do + post_graphql(query, current_user: current_user) + + expect(graphql_data['project']['repository']['tree']['trees']['edges']).to eq([]) + expect(graphql_data['project']['repository']['tree']['submodules']['edges']).to eq([]) + expect(graphql_data['project']['repository']['tree']['blobs']['edges']).to eq([]) + end + end + + context 'when ref and path exist' do + it 'returns tree' do + post_graphql(query, current_user: current_user) + + expect(graphql_data['project']['repository']['tree']).to be_present + end + + it 'returns blobs, subtrees and submodules inside tree' do + post_graphql(query, current_user: current_user) + + expect(graphql_data['project']['repository']['tree']['trees']['edges'].size).to be > 0 + expect(graphql_data['project']['repository']['tree']['blobs']['edges'].size).to be > 0 + expect(graphql_data['project']['repository']['tree']['submodules']['edges'].size).to be > 0 + end + end + + context 'when current user is nil' do + it 'returns empty project' do + post_graphql(query, current_user: nil) + + expect(graphql_data['project']).to be(nil) + end + end +end diff --git a/spec/requests/api/project_clusters_spec.rb b/spec/requests/api/project_clusters_spec.rb index 5357be3cdee..fc0381159dd 100644 --- a/spec/requests/api/project_clusters_spec.rb +++ b/spec/requests/api/project_clusters_spec.rb @@ -351,7 +351,7 @@ describe API::ProjectClusters do it 'does not update cluster attributes' do expect(cluster.domain).not_to eq('new_domain.com') expect(cluster.platform_kubernetes.namespace).not_to eq('invalid_namespace') - expect(cluster.kubernetes_namespace.namespace).not_to eq('invalid_namespace') + expect(cluster.kubernetes_namespace_for(project)).not_to eq('invalid_namespace') end it 'returns validation errors' do diff --git a/spec/routing/project_routing_spec.rb b/spec/routing/project_routing_spec.rb index a0d01fc8263..dd9540c11d1 100644 --- a/spec/routing/project_routing_spec.rb +++ b/spec/routing/project_routing_spec.rb @@ -204,25 +204,27 @@ describe 'project routing' do describe Projects::BranchesController, 'routing' do it 'to #branches' do - expect(get('/gitlab/gitlabhq/branches')).to route_to('projects/branches#index', namespace_id: 'gitlab', project_id: 'gitlabhq') - expect(delete('/gitlab/gitlabhq/branches/feature%2345')).to route_to('projects/branches#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature#45') - expect(delete('/gitlab/gitlabhq/branches/feature%2B45')).to route_to('projects/branches#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature+45') - expect(delete('/gitlab/gitlabhq/branches/feature@45')).to route_to('projects/branches#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature@45') - expect(delete('/gitlab/gitlabhq/branches/feature%2345/foo/bar/baz')).to route_to('projects/branches#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature#45/foo/bar/baz') - expect(delete('/gitlab/gitlabhq/branches/feature%2B45/foo/bar/baz')).to route_to('projects/branches#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature+45/foo/bar/baz') - expect(delete('/gitlab/gitlabhq/branches/feature@45/foo/bar/baz')).to route_to('projects/branches#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature@45/foo/bar/baz') + expect(get('/gitlab/gitlabhq/-/branches')).to route_to('projects/branches#index', namespace_id: 'gitlab', project_id: 'gitlabhq') + expect(delete('/gitlab/gitlabhq/-/branches/feature%2345')).to route_to('projects/branches#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature#45') + expect(delete('/gitlab/gitlabhq/-/branches/feature%2B45')).to route_to('projects/branches#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature+45') + expect(delete('/gitlab/gitlabhq/-/branches/feature@45')).to route_to('projects/branches#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature@45') + expect(delete('/gitlab/gitlabhq/-/branches/feature%2345/foo/bar/baz')).to route_to('projects/branches#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature#45/foo/bar/baz') + expect(delete('/gitlab/gitlabhq/-/branches/feature%2B45/foo/bar/baz')).to route_to('projects/branches#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature+45/foo/bar/baz') + expect(delete('/gitlab/gitlabhq/-/branches/feature@45/foo/bar/baz')).to route_to('projects/branches#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature@45/foo/bar/baz') end + + it_behaves_like 'redirecting a legacy project path', "/gitlab/gitlabhq/branches", "/gitlab/gitlabhq/-/branches" end describe Projects::TagsController, 'routing' do it 'to #tags' do - expect(get('/gitlab/gitlabhq/tags')).to route_to('projects/tags#index', namespace_id: 'gitlab', project_id: 'gitlabhq') - expect(delete('/gitlab/gitlabhq/tags/feature%2345')).to route_to('projects/tags#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature#45') - expect(delete('/gitlab/gitlabhq/tags/feature%2B45')).to route_to('projects/tags#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature+45') - expect(delete('/gitlab/gitlabhq/tags/feature@45')).to route_to('projects/tags#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature@45') - expect(delete('/gitlab/gitlabhq/tags/feature%2345/foo/bar/baz')).to route_to('projects/tags#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature#45/foo/bar/baz') - expect(delete('/gitlab/gitlabhq/tags/feature%2B45/foo/bar/baz')).to route_to('projects/tags#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature+45/foo/bar/baz') - expect(delete('/gitlab/gitlabhq/tags/feature@45/foo/bar/baz')).to route_to('projects/tags#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature@45/foo/bar/baz') + expect(get('/gitlab/gitlabhq/-/tags')).to route_to('projects/tags#index', namespace_id: 'gitlab', project_id: 'gitlabhq') + expect(delete('/gitlab/gitlabhq/-/tags/feature%2345')).to route_to('projects/tags#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature#45') + expect(delete('/gitlab/gitlabhq/-/tags/feature%2B45')).to route_to('projects/tags#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature+45') + expect(delete('/gitlab/gitlabhq/-/tags/feature@45')).to route_to('projects/tags#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature@45') + expect(delete('/gitlab/gitlabhq/-/tags/feature%2345/foo/bar/baz')).to route_to('projects/tags#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature#45/foo/bar/baz') + expect(delete('/gitlab/gitlabhq/-/tags/feature%2B45/foo/bar/baz')).to route_to('projects/tags#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature+45/foo/bar/baz') + expect(delete('/gitlab/gitlabhq/-/tags/feature@45/foo/bar/baz')).to route_to('projects/tags#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature@45/foo/bar/baz') end end @@ -247,6 +249,7 @@ describe 'project routing' do it_behaves_like 'RESTful project resources' do let(:actions) { [:index, :create, :destroy] } let(:controller) { 'protected_branches' } + let(:controller_path) { '/-/protected_branches' } end end @@ -592,18 +595,22 @@ describe 'project routing' do describe Projects::NetworkController, 'routing' do it 'to #show' do - expect(get('/gitlab/gitlabhq/network/master')).to route_to('projects/network#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master') - expect(get('/gitlab/gitlabhq/network/ends-with.json')).to route_to('projects/network#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'ends-with.json') - expect(get('/gitlab/gitlabhq/network/master?format=json')).to route_to('projects/network#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master', format: 'json') + expect(get('/gitlab/gitlabhq/-/network/master')).to route_to('projects/network#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master') + expect(get('/gitlab/gitlabhq/-/network/ends-with.json')).to route_to('projects/network#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'ends-with.json') + expect(get('/gitlab/gitlabhq/-/network/master?format=json')).to route_to('projects/network#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master', format: 'json') end + + it_behaves_like 'redirecting a legacy project path', "/gitlab/gitlabhq/network/master", "/gitlab/gitlabhq/-/network/master" end describe Projects::GraphsController, 'routing' do it 'to #show' do - expect(get('/gitlab/gitlabhq/graphs/master')).to route_to('projects/graphs#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master') - expect(get('/gitlab/gitlabhq/graphs/ends-with.json')).to route_to('projects/graphs#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'ends-with.json') - expect(get('/gitlab/gitlabhq/graphs/master?format=json')).to route_to('projects/graphs#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master', format: 'json') + expect(get('/gitlab/gitlabhq/-/graphs/master')).to route_to('projects/graphs#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master') + expect(get('/gitlab/gitlabhq/-/graphs/ends-with.json')).to route_to('projects/graphs#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'ends-with.json') + expect(get('/gitlab/gitlabhq/-/graphs/master?format=json')).to route_to('projects/graphs#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master', format: 'json') end + + it_behaves_like 'redirecting a legacy project path', "/gitlab/gitlabhq/graphs/master", "/gitlab/gitlabhq/-/graphs/master" end describe Projects::ForksController, 'routing' do @@ -661,4 +668,12 @@ describe 'project routing' do end end end + + describe Projects::Settings::RepositoryController, 'routing' do + it 'to #show' do + expect(get('/gitlab/gitlabhq/-/settings/repository')).to route_to('projects/settings/repository#show', namespace_id: 'gitlab', project_id: 'gitlabhq') + end + + it_behaves_like 'redirecting a legacy project path', "/gitlab/gitlabhq/settings/repository", "/gitlab/gitlabhq/-/settings/repository" + end end diff --git a/spec/services/clusters/gcp/kubernetes/create_or_update_namespace_service_spec.rb b/spec/services/clusters/gcp/kubernetes/create_or_update_namespace_service_spec.rb index 18f218fc236..be052a07da7 100644 --- a/spec/services/clusters/gcp/kubernetes/create_or_update_namespace_service_spec.rb +++ b/spec/services/clusters/gcp/kubernetes/create_or_update_namespace_service_spec.rb @@ -113,7 +113,7 @@ describe Clusters::Gcp::Kubernetes::CreateOrUpdateNamespaceService, '#execute' d it 'does not create any Clusters::KubernetesNamespace' do subject - expect(cluster.kubernetes_namespace).to eq(kubernetes_namespace) + expect(cluster.kubernetes_namespaces).to eq([kubernetes_namespace]) end it 'creates project service account' do diff --git a/spec/services/projects/git_deduplication_service_spec.rb b/spec/services/projects/git_deduplication_service_spec.rb new file mode 100644 index 00000000000..3acbc46b473 --- /dev/null +++ b/spec/services/projects/git_deduplication_service_spec.rb @@ -0,0 +1,90 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Projects::GitDeduplicationService do + include ExclusiveLeaseHelpers + + let(:pool) { create(:pool_repository, :ready) } + let(:project) { create(:project, :repository) } + let(:lease_key) { "git_deduplication:#{project.id}" } + let(:lease_timeout) { Projects::GitDeduplicationService::LEASE_TIMEOUT } + + subject(:service) { described_class.new(project) } + + describe '#execute' do + context 'when there is not already a lease' do + context 'when the project does not have a pool repository' do + it 'calls disconnect_git_alternates' do + stub_exclusive_lease(lease_key, timeout: lease_timeout) + + expect(project.repository).to receive(:disconnect_alternates) + + service.execute + end + end + + context 'when the project has a pool repository' do + let(:project) { create(:project, :repository, pool_repository: pool) } + + context 'when the project is a source project' do + let(:lease_key) { "git_deduplication:#{pool.source_project.id}" } + + subject(:service) { described_class.new(pool.source_project) } + + it 'calls fetch' do + stub_exclusive_lease(lease_key, timeout: lease_timeout) + allow(pool.source_project).to receive(:git_objects_poolable?).and_return(true) + + expect(pool.object_pool).to receive(:fetch) + + service.execute + end + + it 'does not call fetch if git objects are not poolable' do + stub_exclusive_lease(lease_key, timeout: lease_timeout) + allow(pool.source_project).to receive(:git_objects_poolable?).and_return(false) + + expect(pool.object_pool).not_to receive(:fetch) + + service.execute + end + + it 'does not call fetch if pool and project are not on the same storage' do + stub_exclusive_lease(lease_key, timeout: lease_timeout) + allow(pool.source_project.repository).to receive(:storage).and_return('special_storage_001') + + expect(pool.object_pool).not_to receive(:fetch) + + service.execute + end + end + + it 'links the repository to the object pool' do + expect(project).to receive(:link_pool_repository) + + service.execute + end + + it 'does not link the repository to the object pool if they are not on the same storage' do + allow(project.repository).to receive(:storage).and_return('special_storage_001') + expect(project).not_to receive(:link_pool_repository) + + service.execute + end + end + + context 'when a lease is already out' do + before do + stub_exclusive_lease_taken(lease_key, timeout: lease_timeout) + end + + it 'fails when a lease is already out' do + expect(service).to receive(:log_error).with('Cannot obtain an exclusive lease. There must be another instance already in execution.') + + service.execute + end + end + end + end +end diff --git a/spec/services/system_note_service_spec.rb b/spec/services/system_note_service_spec.rb index 51c5a803dbd..4d33c6f4094 100644 --- a/spec/services/system_note_service_spec.rb +++ b/spec/services/system_note_service_spec.rb @@ -132,7 +132,7 @@ describe SystemNoteService do end it 'sets the note text' do - link = "http://localhost/#{project.full_path}/tags/#{tag_name}" + link = "http://localhost/#{project.full_path}/-/tags/#{tag_name}" expect(subject.note).to eq "tagged commit #{noteable.sha} to [`#{tag_name}`](#{link})" end diff --git a/spec/support/helpers/kubernetes_helpers.rb b/spec/support/helpers/kubernetes_helpers.rb index ac52acb6570..78b7ae9c00c 100644 --- a/spec/support/helpers/kubernetes_helpers.rb +++ b/spec/support/helpers/kubernetes_helpers.rb @@ -24,30 +24,34 @@ module KubernetesHelpers WebMock.stub_request(:get, api_url + '/apis/serving.knative.dev/v1alpha1').to_return(kube_response(kube_v1alpha1_serving_knative_discovery_body)) end - def stub_kubeclient_service_pods(response = nil) + def stub_kubeclient_service_pods(status: nil) stub_kubeclient_discover(service.api_url) pods_url = service.api_url + "/api/v1/pods" + response = { status: status } if status WebMock.stub_request(:get, pods_url).to_return(response || kube_pods_response) end - def stub_kubeclient_pods(response = nil) + def stub_kubeclient_pods(namespace, status: nil) stub_kubeclient_discover(service.api_url) - pods_url = service.api_url + "/api/v1/namespaces/#{service.actual_namespace}/pods" + pods_url = service.api_url + "/api/v1/namespaces/#{namespace}/pods" + response = { status: status } if status WebMock.stub_request(:get, pods_url).to_return(response || kube_pods_response) end - def stub_kubeclient_logs(pod_name, response = nil) + def stub_kubeclient_logs(pod_name, namespace, status: nil) stub_kubeclient_discover(service.api_url) - logs_url = service.api_url + "/api/v1/namespaces/#{service.actual_namespace}/pods/#{pod_name}/log?tailLines=#{Clusters::Platforms::Kubernetes::LOGS_LIMIT}" + logs_url = service.api_url + "/api/v1/namespaces/#{namespace}/pods/#{pod_name}/log?tailLines=#{Clusters::Platforms::Kubernetes::LOGS_LIMIT}" + response = { status: status } if status WebMock.stub_request(:get, logs_url).to_return(response || kube_logs_response) end - def stub_kubeclient_deployments(response = nil) + def stub_kubeclient_deployments(namespace, status: nil) stub_kubeclient_discover(service.api_url) - deployments_url = service.api_url + "/apis/extensions/v1beta1/namespaces/#{service.actual_namespace}/deployments" + deployments_url = service.api_url + "/apis/extensions/v1beta1/namespaces/#{namespace}/deployments" + response = { status: status } if status WebMock.stub_request(:get, deployments_url).to_return(response || kube_deployments_response) end @@ -250,10 +254,11 @@ module KubernetesHelpers # This is a partial response, it will have many more elements in reality but # these are the ones we care about at the moment - def kube_pod(name: "kube-pod", environment_slug: "production", project_slug: "project-path-slug", status: "Running", track: nil) + def kube_pod(name: "kube-pod", environment_slug: "production", namespace: "project-namespace", project_slug: "project-path-slug", status: "Running", track: nil) { "metadata" => { "name" => name, + "namespace" => namespace, "generate_name" => "generated-name-with-suffix", "creationTimestamp" => "2016-11-25T19:55:19Z", "annotations" => { @@ -369,12 +374,13 @@ module KubernetesHelpers def kube_terminals(service, pod) pod_name = pod['metadata']['name'] + pod_namespace = pod['metadata']['namespace'] containers = pod['spec']['containers'] containers.map do |container| terminal = { selectors: { pod: pod_name, container: container['name'] }, - url: container_exec_url(service.api_url, service.actual_namespace, pod_name, container['name']), + url: container_exec_url(service.api_url, pod_namespace, pod_name, container['name']), subprotocols: ['channel.k8s.io'], headers: { 'Authorization' => ["Bearer #{service.token}"] }, created_at: DateTime.parse(pod['metadata']['creationTimestamp']), diff --git a/spec/support/prometheus/additional_metrics_shared_examples.rb b/spec/support/prometheus/additional_metrics_shared_examples.rb index 0fd67531c3b..8044b061ca5 100644 --- a/spec/support/prometheus/additional_metrics_shared_examples.rb +++ b/spec/support/prometheus/additional_metrics_shared_examples.rb @@ -46,7 +46,7 @@ RSpec.shared_examples 'additional metrics query' do describe 'project has Kubernetes service' do shared_examples 'same behavior between KubernetesService and Platform::Kubernetes' do let(:environment) { create(:environment, slug: 'environment-slug', project: project) } - let(:kube_namespace) { project.deployment_platform.actual_namespace } + let(:kube_namespace) { project.deployment_platform.kubernetes_namespace_for(project) } it_behaves_like 'query context containing environment slug and filter' diff --git a/spec/support/shared_examples/legacy_path_redirect_shared_examples.rb b/spec/support/shared_examples/legacy_path_redirect_shared_examples.rb index f300bdd48b1..f326e502092 100644 --- a/spec/support/shared_examples/legacy_path_redirect_shared_examples.rb +++ b/spec/support/shared_examples/legacy_path_redirect_shared_examples.rb @@ -11,3 +11,11 @@ shared_examples 'redirecting a legacy path' do |source, target| expect(get(source)).not_to redirect_to(target) end end + +shared_examples 'redirecting a legacy project path' do |source, target| + include RSpec::Rails::RequestExampleGroup + + it "redirects #{source} to #{target}" do + expect(get(source)).to redirect_to(target) + end +end diff --git a/spec/support/shoulda/matchers/rails_shim.rb b/spec/support/shoulda/matchers/rails_shim.rb deleted file mode 100644 index 8d70598beb5..00000000000 --- a/spec/support/shoulda/matchers/rails_shim.rb +++ /dev/null @@ -1,27 +0,0 @@ -# monkey patch which fixes serialization matcher in Rails 5 -# https://github.com/thoughtbot/shoulda-matchers/issues/913 -# This can be removed when a new version of shoulda-matchers -# is released -module Shoulda - module Matchers - class RailsShim - def self.serialized_attributes_for(model) - if defined?(::ActiveRecord::Type::Serialized) - # Rails 5+ - serialized_columns = model.columns.select do |column| - model.type_for_attribute(column.name).is_a?( - ::ActiveRecord::Type::Serialized - ) - end - - serialized_columns.inject({}) do |hash, column| # rubocop:disable Style/EachWithObject - hash[column.name.to_s] = model.type_for_attribute(column.name).coder - hash - end - else - model.serialized_attributes - end - end - end - end -end diff --git a/spec/views/help/index.html.haml_spec.rb b/spec/views/help/index.html.haml_spec.rb index 34e93d929a7..257991549a9 100644 --- a/spec/views/help/index.html.haml_spec.rb +++ b/spec/views/help/index.html.haml_spec.rb @@ -31,7 +31,7 @@ describe 'help/index' do render expect(rendered).to match '8.0.2' - expect(rendered).to have_link('8.0.2', href: %r{https://gitlab.com/gitlab-org/gitlab-(ce|ee)/tags/v8.0.2}) + expect(rendered).to have_link('8.0.2', href: %r{https://gitlab.com/gitlab-org/gitlab-(ce|ee)/-/tags/v8.0.2}) end it 'shows a link to the commit for pre-releases' do |