diff options
author | Phil Hughes <me@iamphill.com> | 2018-03-22 13:17:02 +0300 |
---|---|---|
committer | Phil Hughes <me@iamphill.com> | 2018-03-22 13:17:02 +0300 |
commit | 58fe13ec9c8b5eab067012ce9e642b4690863474 (patch) | |
tree | ab9754d8e629543c30166e07ae23d56c6caa46c1 | |
parent | b6a9a8baf5d05121b2665e62a7169bb55459ae69 (diff) | |
parent | 4718f22f5751f8d50bd7897ff4a967ccc5625c80 (diff) |
Merge branch 'master' into '44453-performance-bar-modalbox'
# Conflicts:
# app/assets/javascripts/performance_bar/components/detailed_metric.vue
217 files changed, 2795 insertions, 1250 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c64e68967e..e737c38e35c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,198 @@ documentation](doc/development/changelog.md) for instructions on adding your own entry. +## 10.6.0 (2018-03-22) + +### Security (4 changes) + +- Fixed some SSRF vulnerabilities in services, hooks and integrations. !2337 +- Ensure that OTP backup codes are always invalidated. +- Add verification for GitLab Pages custom domains. +- Fix GitLab Auth0 integration signing in the wrong user. + +### Fixed (75 changes, 17 of them are from the community) + +- Ensure users cannot create environments with leading or trailing slashes (Fixes #39885). !15273 +- Fix new project path input overlapping. !16755 (George Tsiolis) +- Respect description and visibility when creating project from template. !16820 (George Tsiolis) +- Remove user notification settings for groups and projects when user leaves. !16906 (Jacopo Beschi @jacopo-beschi) +- Fix Teleporting Emoji. !16963 (Jared Deckard <jared.deckard@gmail.com>) +- Fix duplicate system notes when merging a merge request. !17035 +- Fix breadcrumb on labels page for groups. !17045 (Onuwa Nnachi Isaac) +- Fix user avatar's vertical align on the issues and merge requests pages. !17072 (Laszlo Karpati) +- Fix settings panels not expanding when fragment hash linked. !17074 +- Fix 404 when listing archived projects in a group where all projects have been archived. !17077 (Ashley Dumaine) +- Allow to call PUT /projects/:id API with only ci_config_path specified. !17105 (Laszlo Karpati) +- Fix long list of recipients on group request membership email. !17121 (Jacopo Beschi @jacopo-beschi) +- Remove duplicated error message on duplicate variable validation. !17135 +- Keep "Import project" tab/form active when validation fails trying to import "Repo by URL". !17136 +- Fixed bug with unauthenticated requests through git ssh. !17149 +- Allows project rename after validation error. !17150 +- Fix "Remove source branch" button in Merge request widget during merge when pipeline succeeds state. !17192 +- Add missing pagination on the commit diff endpoint. !17203 (Maxime Roussin-Bélanger) +- Fix get a single pages domain when project path contains a period. !17206 (Travis Miller) +- remove avater underline. !17219 (Ken Ding) +- Allows the usage of /milestone quick action for group milestones. !17239 (Jacopo Beschi @jacopo-beschi) +- Encode branch name as binary before creating a RPC request to copy attributes. !17291 +- Restart Unicorn and Sidekiq when GRPC throws 14:Endpoint read failed. !17293 +- Do not persist Google Project verification flash errors after a page reload. !17299 +- Ensure group issues and merge requests pages show results from subgroups when there are no results from the current group. !17312 +- Prevent trace artifact migration to incur data loss. !17313 +- Fixes gpg popover layout. !17323 +- Return a 404 instead of 403 if the repository does not exist on disk. !17341 +- Fix Slack/Mattermost notifications not respecting `notify_only_default_branch` setting for pushes. !17345 +- Fix Group labels load failure when there are duplicate labels present. !17353 +- Allow Prometheus application to be installed from Cluster applications. !17372 +- Fixes Prometheus admin configuration page. !17377 +- Enable filtering MR list based on clicked label in MR sidebar. !17390 +- Fix code and wiki search results pages when non-ASCII text is displayed. !17413 +- Count comments on diffs and discussions as contributions for the contributions calendar. !17418 (Riccardo Padovani) +- Add Assignees vue component missing data container. !17426 (George Tsiolis) +- Update tooltip on pipeline cancel to Stop (#42946). !17444 +- Removing the two factor check when the user sets a new password. !17457 +- Fix quick actions for users who cannot update issues and merge requests. !17482 +- Stop loading spinner on error of milestone update on issue. !17507 (Takuya Noguchi) +- Set margins around dropdown dividers to 4px. !17517 +- Fix pages flaky failure by reloading stale object. !17522 +- Remove extra breadcrumb on tags. !17562 (Takuya Noguchi) +- Fix missing uploads after group transfer. !17658 +- Fix markdown table showing extra column. !17669 +- Ensure the API returns https links when https is configured. !17681 +- Sanitize extra blank spaces used when uploading a SSH key. !40552 +- Render htmlentities correctly for links not supported by Rinku. +- Keep link when redacting unauthorized object links. +- Handle empty state in Pipelines page. +- Revert Project.public_or_visible_to_user changes and only apply to snippets. +- Release libgit2 cache and open file descriptors after `git gc` run. +- Fix project dashboard showing the wrong timestamps. +- Fix "Can't modify frozen hash" error when project is destroyed. +- Fix Error 500 when viewing a commit with a GPG signature in Geo. +- Don't error out in system hook if user has `nil` datetime columns. +- Remove double caching of Repository#empty?. +- Don't delete todos or unassign issues and MRs when a user leaves a project. +- Don't cache a nil repository root ref to prevent caching issues. +- Escape HTML entities in commit messages. +- Verify project import status again before marking as failed. +- [GitHub Import] Create an empty wiki if wiki import failed. +- Create empty wiki when import from GitLab and wiki is not there. +- Make sure wiki exists when it's enabled. +- Fix broken loading state for close issue button. +- Fix code and wiki search results when filename is non-ASCII. +- Fix file upload on project show page. +- Fix squashing when a file is renamed. +- Show loading button inline in refresh button in MR widget. +- Fix close button on issues not working on mobile. +- Adds tooltip in environment names to increase readability. +- Fixed issue edit shortcut not opening edit form. +- Fix 500 error being shown when diff has context marker with invalid encoding. +- Render modified icon for moved file in changes dropdown. +- Remember assignee when moving an issue. + +### Changed (16 changes, 9 of them are from the community) + +- Allow including custom attributes in API responses. !16526 (Markus Koller) +- Apply new default and inline label design. !16956 (George Tsiolis) +- Remove whitespace from the username/email sign in form field. !17020 (Peter lauck) +- CI charts now include the current day. !17032 (Dakkaron) +- Hide CI secret variable values after saving. !17044 +- Add new modal Vue component. !17108 +- Asciidoc now support inter-document cross references between files in repository. !17125 (Turo Soisenniemi) +- Update issue closing pattern to allow variations in punctuation. !17198 (Vicky Chijwani) +- Add a button to deploy a runner to a Kubernetes cluster in the settings page. !17278 +- Pages custom domain: allow update of key/certificate. !17376 (rfwatson) +- Clear the Labels dropdown search filter after a selection is made. !17393 (Andrew Torres) +- Hook data for pipelines includes detailed_status. !17607 +- Avoid showing unnecessary Trigger checkboxes for project Integrations with only one event. !17607 +- Display a link to external issue tracker when enabled. +- Allow token authentication on go-get request. +- Update SSH key link to include existing keys. (Brendan O'Leary) + +### Performance (24 changes, 5 of them are from the community) + +- Add catch-up background migration to migrate pipeline stages. !15741 +- Move BoardNewIssue vue component. !16947 (George Tsiolis) +- Move IssuableTimeTracker vue component. !16948 (George Tsiolis) +- Move RecentSearchesDropdownContent vue component. !16951 (George Tsiolis) +- Move Assignees vue component. !16952 (George Tsiolis) +- Improve performance of pipeline page by reducing DB queries. !17168 +- Store sha256 checksum to job artifacts. !17354 +- Move SidebarAssignees vue component. !17398 (George Tsiolis) +- Improve database response time for user activity listing. !17454 +- Use persisted/memoized value for MRs shas instead of doing git lookups. !17555 +- Cache MergeRequests can_be_resolved_in_ui? git operations. !17589 +- Prevent the graphs page from generating unnecessary Gitaly requests. !37602 +- Use a user object in ApplicationHelper#avatar_icon where possible to avoid N+1 queries. !42800 +- Submit a single batch blob RPC to Gitaly per HTTP request when viewing diffs. +- Avoid re-fetching merge-base SHA from Gitaly unnecessarily. +- Don't use ProjectsFinder in TodosFinder. +- Adding missing indexes on taggings table. +- Add index on section_name_id on ci_build_trace_sections table. +- Cache column_exists? for application settings. +- Cache table_exists?('application_settings') to reduce repeated schema reloads. +- Make --prune a configurable parameter in fetching a git remote. +- Fix timeouts loading /admin/projects page. +- Add partial indexes on todos to handle users with many todos. +- Optimize search queries on the search page by setting a limit for matching records in project scope. + +### Added (30 changes, 9 of them are from the community) + +- Add CommonMark markdown engine (experimental). !14835 (blackst0ne) +- API: Get references a commit is pushed to. !15026 (Robert Schilling) +- Add overview of branches and a filter for active/stale branches. !15402 (Takuya Noguchi) +- Add project export API. !15860 (Travis Miller) +- expose more metrics in merge requests api. !16589 (haseebeqx) +- #28481: Display time tracking totals on milestone page. !16753 (Riccardo Padovani) +- Add a button on the project page to set up a Kubernetes cluster and enable Auto DevOps. !16900 +- Include cycle time in usage ping data. !16973 +- Add ability to use external plugins as an alternative to system hooks. !17003 +- Add search param to Branches API. !17005 (bunufi) +- API endpoint for importing a project export. !17025 +- Display ingress IP address in the Kubernetes page. !17052 +- Implemented badge API endpoints. !17082 +- Allow installation of GitLab Runner with a single click. !17134 +- Allow commits endpoint to work over all commits of a repository. !17182 +- Display Runner IP Address. !17286 +- Add archive feature to trace. !17314 +- Allow maintainers to push to forks of their projects when a merge request is open. !17395 +- Foreground verification of uploads and LFS objects. !17402 +- Adds updated_at filter to issues and merge_requests API. !17417 (Jacopo Beschi @jacopo-beschi) +- Port /wip quick action command to Merge Request creation (on description). !17463 (Adam Pahlevi) +- Add a paragraph about security implications on Cluster's page. !17486 +- Add plugins list to the system hooks page. !17518 +- Enable privileged mode for GitLab Runner. !17528 +- Expose GITLAB_FEATURES as CI/CD variable (fixes #40994). +- Upgrade GitLab Workhorse to 4.0.0. +- Allow CI/CD Jobs being grouped on version strings. +- Add discussions API for Issues and Snippets. +- Add one group board to Libre. +- Add support for filtering by source and target branch to merge requests API. + +### Other (14 changes, 3 of them are from the community) + +- Update vue component naming guidelines. !17018 (George Tsiolis) +- Added new design for promotion modals. !17197 +- Update to github-linguist 5.3.x. !17241 (Ken Ding) +- update toml-rb to 1.0.0. !17259 (Ken Ding) +- Keep track of projects a user interacted with. !17327 +- Enables eslint in codeclimate job. !17392 +- Port Labels Select dropdown to Vue. !17411 +- Add NOT NULL constraint to projects.namespace_id. !17448 +- Ensure foreign keys on clusters applications. !17488 +- Started translation into Turkish, Indonesian and Filipino. !17526 +- Add documentation for displayed K8s Ingress IP address (#44330). !17836 +- Move Ruby endpoints to OPT_OUT. +- Upgrade Workhorse to version 3.8.0 to support structured logging. +- Use host URL to build JIRA remote link icon. + + +## 10.5.6 (2018-03-16) + +### Security (2 changes) + +- Fixed some SSRF vulnerabilities in services, hooks and integrations. !2337 +- Fix GitLab Auth0 integration signing in the wrong user. + + ## 10.5.5 (2018-03-15) ### Fixed (3 changes) @@ -261,6 +453,14 @@ entry. - Adds empty state illustration for pending job. +## 10.4.6 (2018-03-16) + +### Security (2 changes) + +- Fixed some SSRF vulnerabilities in services, hooks and integrations. !2337 +- Fix GitLab Auth0 integration signing in the wrong user. + + ## 10.4.5 (2018-03-01) ### Security (1 change) @@ -492,6 +692,15 @@ entry. - Use a background migration for issues.closed_at. +## 10.3.9 (2018-03-16) + +### Security (3 changes) + +- Fixed some SSRF vulnerabilities in services, hooks and integrations. !2337 +- Update nokogiri to 1.8.2. !16807 +- Fix GitLab Auth0 integration signing in the wrong user. + + ## 10.3.8 (2018-03-01) ### Security (1 change) diff --git a/GITLAB_SHELL_VERSION b/GITLAB_SHELL_VERSION index 1aa5e414fd3..a3fcc7121bb 100644 --- a/GITLAB_SHELL_VERSION +++ b/GITLAB_SHELL_VERSION @@ -1 +1 @@ -6.0.4 +7.1.0 @@ -1,6 +1,19 @@ +# --- Special code for migrating to Rails 5.0 --- +def rails5? + %w[1 true].include?(ENV["RAILS5"]) +end + +gem_versions = {} +gem_versions['activerecord_sane_schema_dumper'] = rails5? ? '1.0' : '0.2' +gem_versions['default_value_for'] = rails5? ? '~> 3.0.5' : '~> 3.0.0' +gem_versions['html-pipeline'] = rails5? ? '~> 2.6.0' : '~> 1.11.0' +gem_versions['rails'] = rails5? ? '5.0.6' : '4.2.10' +gem_versions['rails-i18n'] = rails5? ? '~> 5.1' : '~> 4.0.9' +# --- The end of special code for migrating to Rails 5.0 --- + source 'https://rubygems.org' -gem 'rails', '4.2.10' +gem 'rails', gem_versions['rails'] gem 'rails-deprecated_sanitizer', '~> 1.0.3' # Responders respond_to and respond_with @@ -9,7 +22,7 @@ gem 'responders', '~> 2.0' gem 'sprockets', '~> 3.7.0' # Default values for AR models -gem 'default_value_for', '~> 3.0.0' +gem 'default_value_for', gem_versions['default_value_for'] # Supported DBs gem 'mysql2', '~> 0.4.10', group: :mysql @@ -24,7 +37,7 @@ gem 'faraday', '~> 0.12' gem 'devise', '~> 4.2' gem 'doorkeeper', '~> 4.3' gem 'doorkeeper-openid_connect', '~> 1.3' -gem 'omniauth', '~> 1.4.2' +gem 'omniauth', '~> 1.8' gem 'omniauth-auth0', '~> 1.4.1' gem 'omniauth-azure-oauth2', '~> 0.0.9' gem 'omniauth-cas3', '~> 1.1.4' @@ -122,7 +135,7 @@ gem 'unf', '~> 0.1.4' gem 'seed-fu', '~> 2.3.7' # Markdown and HTML processing -gem 'html-pipeline', '~> 1.11.0' +gem 'html-pipeline', gem_versions['html-pipeline'] gem 'deckar01-task_list', '2.0.0' gem 'gitlab-markup', '~> 1.6.2' gem 'redcarpet', '~> 3.4' @@ -266,7 +279,7 @@ gem 'premailer-rails', '~> 1.9.7' # I18n gem 'ruby_parser', '~> 3.8', require: false -gem 'rails-i18n', '~> 4.0.9' +gem 'rails-i18n', gem_versions['rails-i18n'] gem 'gettext_i18n_rails', '~> 1.8.0' gem 'gettext_i18n_rails_js', '~> 1.3' gem 'gettext', '~> 3.2.2', require: false, group: :development @@ -357,7 +370,7 @@ group :development, :test do gem 'license_finder', '~> 3.1', require: false gem 'knapsack', '~> 1.16' - gem 'activerecord_sane_schema_dumper', '0.2' + gem 'activerecord_sane_schema_dumper', gem_versions['activerecord_sane_schema_dumper'] gem 'stackprof', '~> 0.2.10', require: false diff --git a/Gemfile.lock b/Gemfile.lock index f063edccc66..9eff80cd4d7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -524,8 +524,8 @@ GEM rack (>= 1.2, < 3) octokit (4.8.0) sawyer (~> 0.8.0, >= 0.5.3) - omniauth (1.4.3) - hashie (>= 1.2, < 4) + omniauth (1.8.1) + hashie (>= 3.4.6, < 3.6.0) rack (>= 1.6.2, < 3) omniauth-auth0 (1.4.1) omniauth-oauth2 (~> 1.1) @@ -1104,7 +1104,7 @@ DEPENDENCIES nokogiri (~> 1.8.2) oauth2 (~> 1.4) octokit (~> 4.8) - omniauth (~> 1.4.2) + omniauth (~> 1.8) omniauth-auth0 (~> 1.4.1) omniauth-authentiq (~> 0.3.1) omniauth-azure-oauth2 (~> 0.0.9) diff --git a/Gemfile.rails5 b/Gemfile.rails5 new file mode 100644 index 00000000000..2b526b19ba0 --- /dev/null +++ b/Gemfile.rails5 @@ -0,0 +1,7 @@ +# BUNDLE_GEMFILE=Gemfile.rails5 bundle install + +ENV["RAILS5"] = "true" + +gemfile = File.expand_path("../Gemfile", __FILE__) + +eval(File.read(gemfile), nil, gemfile) diff --git a/Gemfile.rails5.lock b/Gemfile.rails5.lock new file mode 100644 index 00000000000..85bf28ef8dd --- /dev/null +++ b/Gemfile.rails5.lock @@ -0,0 +1,1230 @@ +GEM + remote: https://rubygems.org/ + specs: + RedCloth (4.3.2) + abstract_type (0.0.7) + ace-rails-ap (4.1.4) + actioncable (5.0.6) + actionpack (= 5.0.6) + nio4r (>= 1.2, < 3.0) + websocket-driver (~> 0.6.1) + actionmailer (5.0.6) + actionpack (= 5.0.6) + actionview (= 5.0.6) + activejob (= 5.0.6) + mail (~> 2.5, >= 2.5.4) + rails-dom-testing (~> 2.0) + actionpack (5.0.6) + actionview (= 5.0.6) + activesupport (= 5.0.6) + rack (~> 2.0) + rack-test (~> 0.6.3) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.2) + actionview (5.0.6) + activesupport (= 5.0.6) + builder (~> 3.1) + erubis (~> 2.7.0) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.3) + activejob (5.0.6) + activesupport (= 5.0.6) + globalid (>= 0.3.6) + activemodel (5.0.6) + activesupport (= 5.0.6) + activerecord (5.0.6) + activemodel (= 5.0.6) + activesupport (= 5.0.6) + arel (~> 7.0) + activerecord_sane_schema_dumper (1.0) + rails (>= 5, < 6) + activesupport (5.0.6) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (~> 0.7) + minitest (~> 5.1) + tzinfo (~> 1.1) + acts-as-taggable-on (4.0.0) + activerecord (>= 4.0) + adamantium (0.2.0) + ice_nine (~> 0.11.0) + memoizable (~> 0.4.0) + addressable (2.5.2) + public_suffix (>= 2.0.2, < 4.0) + aes_key_wrap (1.0.1) + akismet (2.0.0) + allocations (1.0.5) + arel (7.1.4) + asana (0.6.3) + faraday (~> 0.9) + faraday_middleware (~> 0.9) + faraday_middleware-multi_json (~> 0.0) + oauth2 (~> 1.0) + asciidoctor (1.5.6.1) + asciidoctor-plantuml (0.0.7) + asciidoctor (~> 1.5) + asset_sync (2.2.0) + activemodel (>= 4.1.0) + fog-core + mime-types (>= 2.99) + unf + ast (2.4.0) + atomic (1.1.100) + attr_encrypted (3.0.3) + encryptor (~> 3.0.0) + attr_required (1.0.1) + autoprefixer-rails (8.1.0.1) + execjs + awesome_print (1.2.0) + axiom-types (0.1.1) + descendants_tracker (~> 0.0.4) + ice_nine (~> 0.11.0) + thread_safe (~> 0.3, >= 0.3.1) + babosa (1.0.2) + base32 (0.3.2) + batch-loader (1.2.1) + bcrypt (3.1.11) + bcrypt_pbkdf (1.0.0) + benchmark-ips (2.3.0) + better_errors (2.1.1) + coderay (>= 1.0.0) + erubis (>= 2.6.6) + rack (>= 0.9.0) + bindata (2.4.3) + binding_of_caller (0.7.3) + debug_inspector (>= 0.0.1) + blankslate (2.1.2.4) + bootstrap-sass (3.3.7) + autoprefixer-rails (>= 5.2.1) + sass (>= 3.3.4) + bootstrap_form (2.7.0) + brakeman (3.6.2) + browser (2.5.3) + builder (3.2.3) + bullet (5.5.1) + activesupport (>= 3.0.0) + uniform_notifier (~> 1.10.0) + bundler-audit (0.5.0) + bundler (~> 1.2) + thor (~> 0.18) + byebug (9.0.6) + capybara (2.18.0) + addressable + mini_mime (>= 0.1.3) + nokogiri (>= 1.3.3) + rack (>= 1.0.0) + rack-test (>= 0.5.4) + xpath (>= 2.0, < 4.0) + capybara-screenshot (1.0.18) + capybara (>= 1.0, < 3) + launchy + carrierwave (1.2.2) + activemodel (>= 4.0.0) + activesupport (>= 4.0.0) + mime-types (>= 1.16) + charlock_holmes (0.7.5) + childprocess (0.9.0) + ffi (~> 1.0, >= 1.0.11) + chronic (0.10.2) + chronic_duration (0.10.6) + numerizer (~> 0.1.1) + chunky_png (1.3.10) + citrus (3.0.2) + coderay (1.1.2) + coercible (1.0.0) + descendants_tracker (~> 0.0.1) + colorize (0.8.1) + commonmarker (0.17.9) + ruby-enum (~> 0.5) + concord (0.1.5) + adamantium (~> 0.2.0) + equalizer (~> 0.0.9) + concurrent-ruby (1.0.5) + concurrent-ruby-ext (1.0.5) + concurrent-ruby (= 1.0.5) + connection_pool (2.2.1) + crack (0.4.3) + safe_yaml (~> 1.0.0) + creole (0.5.0) + css_parser (1.6.0) + addressable + d3_rails (3.5.17) + railties (>= 3.1.0) + daemons (1.2.6) + database_cleaner (1.5.3) + debug_inspector (0.0.3) + debugger-ruby_core_source (1.3.8) + deckar01-task_list (2.0.0) + html-pipeline + declarative (0.0.10) + declarative-option (0.1.0) + default_value_for (3.0.5) + activerecord (>= 3.2.0, < 5.2) + descendants_tracker (0.0.4) + thread_safe (~> 0.3, >= 0.3.1) + devise (4.4.1) + bcrypt (~> 3.0) + orm_adapter (~> 0.1) + railties (>= 4.1.0, < 5.2) + responders + warden (~> 1.2.3) + devise-two-factor (3.0.2) + activesupport (< 5.2) + attr_encrypted (>= 1.3, < 4, != 2) + devise (~> 4.0) + railties (< 5.2) + rotp (~> 2.0) + diff-lcs (1.3) + diffy (3.1.0) + docile (1.1.5) + domain_name (0.5.20170404) + unf (>= 0.0.5, < 1.0.0) + doorkeeper (4.2.6) + railties (>= 4.2) + doorkeeper-openid_connect (1.2.0) + doorkeeper (~> 4.0) + json-jwt (~> 1.6) + dropzonejs-rails (0.7.4) + rails (> 3.1) + email_reply_trimmer (0.1.10) + email_spec (1.6.0) + launchy (~> 2.1) + mail (~> 2.2) + encryptor (3.0.0) + equalizer (0.0.11) + erubis (2.7.0) + escape_utils (1.1.1) + et-orbi (1.0.9) + tzinfo + eventmachine (1.2.5) + excon (0.60.0) + execjs (2.7.0) + expression_parser (0.9.0) + factory_bot (4.8.2) + activesupport (>= 3.0.0) + factory_bot_rails (4.8.2) + factory_bot (~> 4.8.2) + railties (>= 3.0.0) + faraday (0.12.2) + multipart-post (>= 1.2, < 3) + faraday_middleware (0.12.2) + faraday (>= 0.7.4, < 1.0) + faraday_middleware-multi_json (0.0.6) + faraday_middleware + multi_json + fast_blank (1.0.0) + fast_gettext (1.6.0) + ffaker (2.8.1) + ffi (1.9.23) + flay (2.10.0) + erubis (~> 2.7.0) + path_expander (~> 1.0) + ruby_parser (~> 3.0) + sexp_processor (~> 4.0) + flipper (0.11.0) + flipper-active_record (0.11.0) + activerecord (>= 3.2, < 6) + flipper (~> 0.11.0) + flipper-active_support_cache_store (0.11.0) + activesupport (>= 3.2, < 6) + flipper (~> 0.11.0) + flowdock (0.7.1) + httparty (~> 0.7) + multi_json + fog-aliyun (0.2.0) + fog-core (~> 1.27) + fog-json (~> 1.0) + ipaddress (~> 0.8) + xml-simple (~> 1.1) + fog-aws (1.4.1) + fog-core (~> 1.38) + fog-json (~> 1.0) + fog-xml (~> 0.1) + ipaddress (~> 0.8) + fog-core (1.45.0) + builder + excon (~> 0.58) + formatador (~> 0.2) + fog-google (0.6.0) + fog-core + fog-json + fog-xml + fog-json (1.0.2) + fog-core (~> 1.0) + multi_json (~> 1.10) + fog-local (0.5.0) + fog-core (>= 1.27, < 3.0) + fog-openstack (0.1.24) + fog-core (~> 1.40) + fog-json (>= 1.0) + ipaddress (>= 0.8) + fog-rackspace (0.1.5) + fog-core (>= 1.35) + fog-json (>= 1.0) + fog-xml (>= 0.1) + ipaddress (>= 0.8) + fog-xml (0.1.3) + fog-core + nokogiri (>= 1.5.11, < 2.0.0) + font-awesome-rails (4.7.0.3) + railties (>= 3.2, < 5.2) + foreman (0.78.0) + thor (~> 0.19.1) + formatador (0.2.5) + fuubar (2.2.0) + rspec-core (~> 3.0) + ruby-progressbar (~> 1.4) + gemnasium-gitlab-service (0.2.6) + rugged (~> 0.21) + gemojione (3.3.0) + json + get_process_mem (0.2.1) + gettext (3.2.9) + locale (>= 2.0.5) + text (>= 1.3.0) + gettext_i18n_rails (1.8.0) + fast_gettext (>= 0.9.0) + gettext_i18n_rails_js (1.2.0) + gettext (>= 3.0.2) + gettext_i18n_rails (>= 0.7.1) + po_to_json (>= 1.0.0) + rails (>= 3.2.0) + gherkin-ruby (0.3.2) + gitaly-proto (0.88.0) + google-protobuf (~> 3.1) + grpc (~> 1.0) + github-linguist (5.3.3) + charlock_holmes (~> 0.7.5) + escape_utils (~> 1.1.0) + mime-types (>= 1.19) + rugged (>= 0.25.1) + github-markup (1.7.0) + gitlab-flowdock-git-hook (1.0.1) + flowdock (~> 0.7) + gitlab-grit (>= 2.4.1) + multi_json + gitlab-grit (2.8.2) + charlock_holmes (~> 0.6) + diff-lcs (~> 1.1) + mime-types (>= 1.16) + posix-spawn (~> 0.3) + gitlab-markup (1.6.3) + gitlab-styles (2.3.2) + rubocop (~> 0.51) + rubocop-gitlab-security (~> 0.1.0) + rubocop-rspec (~> 1.19) + gitlab_omniauth-ldap (2.0.4) + net-ldap (~> 0.16) + omniauth (~> 1.3) + pyu-ruby-sasl (>= 0.0.3.3, < 0.1) + rubyntlm (~> 0.5) + globalid (0.4.1) + activesupport (>= 4.2.0) + gollum-grit_adapter (1.0.1) + gitlab-grit (~> 2.7, >= 2.7.1) + gollum-lib (4.2.7) + gemojione (~> 3.2) + github-markup (~> 1.6) + gollum-grit_adapter (~> 1.0) + nokogiri (>= 1.6.1, < 2.0) + rouge (~> 2.1) + sanitize (~> 2.1) + stringex (~> 2.6) + gollum-rugged_adapter (0.4.4) + mime-types (>= 1.15) + rugged (~> 0.25) + gon (6.1.0) + actionpack (>= 3.0) + json + multi_json + request_store (>= 1.0) + google-api-client (0.13.6) + addressable (~> 2.5, >= 2.5.1) + googleauth (~> 0.5) + httpclient (>= 2.8.1, < 3.0) + mime-types (~> 3.0) + representable (~> 3.0) + retriable (>= 2.0, < 4.0) + google-protobuf (3.5.1) + googleapis-common-protos-types (1.0.1) + google-protobuf (~> 3.0) + googleauth (0.6.2) + faraday (~> 0.12) + jwt (>= 1.4, < 3.0) + logging (~> 2.0) + memoist (~> 0.12) + multi_json (~> 1.11) + os (~> 0.9) + signet (~> 0.7) + gpgme (2.0.16) + mini_portile2 (~> 2.3) + grape (1.0.2) + activesupport + builder + mustermann-grape (~> 1.0.0) + rack (>= 1.3.0) + rack-accept + virtus (>= 1.0.0) + grape-entity (0.6.1) + activesupport (>= 5.0.0) + multi_json (>= 1.3.2) + grape-route-helpers (2.1.0) + activesupport + grape (>= 0.16.0) + rake + grape_logging (1.7.0) + grape + grpc (1.10.0) + google-protobuf (~> 3.1) + googleapis-common-protos-types (~> 1.0.0) + googleauth (>= 0.5.1, < 0.7) + haml (4.0.7) + tilt + haml_lint (0.26.0) + haml (>= 4.0, < 5.1) + rainbow + rake (>= 10, < 13) + rubocop (>= 0.49.0) + sysexits (~> 1.1) + hamlit (2.6.2) + temple (~> 0.7.6) + thor + tilt + hashdiff (0.3.7) + hashie (3.5.7) + hashie-forbidden_attributes (0.1.1) + hashie (>= 3.0) + health_check (2.6.0) + rails (>= 4.0) + hipchat (1.5.4) + httparty + mimemagic + html-pipeline (2.6.0) + activesupport (>= 2) + nokogiri (>= 1.4) + html2text (0.2.1) + nokogiri (~> 1.6) + htmlentities (4.3.4) + http (0.9.8) + addressable (~> 2.3) + http-cookie (~> 1.0) + http-form_data (~> 1.0.1) + http_parser.rb (~> 0.6.0) + http-cookie (1.0.3) + domain_name (~> 0.5) + http-form_data (1.0.3) + http_parser.rb (0.6.0) + httparty (0.13.7) + json (~> 1.8) + multi_xml (>= 0.5.2) + httpclient (2.8.3) + i18n (0.9.5) + concurrent-ruby (~> 1.0) + ice_nine (0.11.2) + influxdb (0.5.3) + ipaddress (0.8.3) + jira-ruby (1.5.0) + activesupport + multipart-post + oauth (~> 0.5, >= 0.5.0) + jquery-atwho-rails (1.3.2) + jquery-rails (4.3.1) + rails-dom-testing (>= 1, < 3) + railties (>= 4.2.0) + thor (>= 0.14, < 2.0) + json (1.8.6) + json-jwt (1.9.2) + activesupport + aes_key_wrap + bindata + securecompare + url_safe_base64 + json-schema (2.8.0) + addressable (>= 2.4) + jwt (1.5.6) + kaminari (1.1.1) + activesupport (>= 4.1.0) + kaminari-actionview (= 1.1.1) + kaminari-activerecord (= 1.1.1) + kaminari-core (= 1.1.1) + kaminari-actionview (1.1.1) + actionview + kaminari-core (= 1.1.1) + kaminari-activerecord (1.1.1) + activerecord + kaminari-core (= 1.1.1) + kaminari-core (1.1.1) + kgio (2.11.2) + knapsack (1.11.1) + rake + timecop (>= 0.1.0) + kubeclient (2.2.0) + http (= 0.9.8) + recursive-open-struct (= 1.0.0) + rest-client + launchy (2.4.3) + addressable (~> 2.3) + letter_opener (1.6.0) + launchy (~> 2.2) + letter_opener_web (1.3.3) + actionmailer (>= 3.2) + letter_opener (~> 1.0) + railties (>= 3.2) + license_finder (3.1.1) + bundler + httparty + rubyzip + thor + toml (= 0.1.2) + with_env (> 1.0) + xml-simple + licensee (8.7.0) + rugged (~> 0.24) + little-plugger (1.1.4) + locale (2.1.2) + logging (2.2.2) + little-plugger (~> 1.1) + multi_json (~> 1.10) + lograge (0.9.0) + actionpack (>= 4) + activesupport (>= 4) + railties (>= 4) + request_store (~> 1.0) + loofah (2.0.3) + nokogiri (>= 1.5.9) + mail (2.7.0) + mini_mime (>= 0.1.1) + mail_room (0.9.1) + memoist (0.16.0) + memoizable (0.4.2) + thread_safe (~> 0.3, >= 0.3.1) + method_source (0.9.0) + mime-types (3.1) + mime-types-data (~> 3.2015) + mime-types-data (3.2016.0521) + mimemagic (0.3.2) + mini_mime (1.0.0) + mini_portile2 (2.3.0) + minitest (5.7.0) + mousetrap-rails (1.4.6) + multi_json (1.13.1) + multi_xml (0.6.0) + multipart-post (2.0.0) + mustermann (1.0.2) + mustermann-grape (1.0.0) + mustermann (~> 1.0.0) + mysql2 (0.4.10) + net-ldap (0.16.1) + net-ssh (4.1.0) + netrc (0.11.0) + nio4r (2.2.0) + nokogiri (1.8.2) + mini_portile2 (~> 2.3.0) + numerizer (0.1.1) + oauth (0.5.4) + oauth2 (1.4.0) + faraday (>= 0.8, < 0.13) + jwt (~> 1.0) + multi_json (~> 1.3) + multi_xml (~> 0.5) + rack (>= 1.2, < 3) + octokit (4.6.2) + sawyer (~> 0.8.0, >= 0.5.3) + oj (2.17.5) + omniauth (1.4.3) + hashie (>= 1.2, < 4) + rack (>= 1.6.2, < 3) + omniauth-auth0 (1.4.2) + omniauth-oauth2 (~> 1.1) + omniauth-authentiq (0.3.1) + omniauth-oauth2 (~> 1.3, >= 1.3.1) + omniauth-azure-oauth2 (0.0.9) + jwt (~> 1.0) + omniauth (~> 1.0) + omniauth-oauth2 (~> 1.4) + omniauth-cas3 (1.1.4) + addressable (~> 2.3) + nokogiri (~> 1.7, >= 1.7.1) + omniauth (~> 1.2) + omniauth-facebook (4.0.0) + omniauth-oauth2 (~> 1.2) + omniauth-github (1.1.2) + omniauth (~> 1.0) + omniauth-oauth2 (~> 1.1) + omniauth-gitlab (1.0.3) + omniauth (~> 1.0) + omniauth-oauth2 (~> 1.0) + omniauth-google-oauth2 (0.5.3) + jwt (>= 1.5) + omniauth (>= 1.1.1) + omniauth-oauth2 (>= 1.5) + omniauth-kerberos (0.3.0) + omniauth-multipassword + timfel-krb5-auth (~> 0.8) + omniauth-multipassword (0.4.2) + omniauth (~> 1.0) + omniauth-oauth (1.1.0) + oauth + omniauth (~> 1.0) + omniauth-oauth2 (1.5.0) + oauth2 (~> 1.1) + omniauth (~> 1.2) + omniauth-oauth2-generic (0.2.4) + omniauth-oauth2 (~> 1.0) + omniauth-saml (1.7.0) + omniauth (~> 1.3) + ruby-saml (~> 1.4) + omniauth-shibboleth (1.2.1) + omniauth (>= 1.0.0) + omniauth-twitter (1.2.1) + json (~> 1.3) + omniauth-oauth (~> 1.1) + omniauth_crowd (2.2.3) + activesupport + nokogiri (>= 1.4.4) + omniauth (~> 1.0) + org-ruby (0.9.12) + rubypants (~> 0.2) + orm_adapter (0.5.0) + os (0.9.6) + parallel (1.12.1) + parser (2.5.0.4) + ast (~> 2.4.0) + parslet (1.5.0) + blankslate (~> 2.0) + path_expander (1.0.2) + peek (1.0.1) + concurrent-ruby (>= 0.9.0) + concurrent-ruby-ext (>= 0.9.0) + railties (>= 4.0.0) + peek-gc (0.0.2) + peek + peek-host (1.0.0) + peek + peek-mysql2 (1.1.0) + atomic (>= 1.0.0) + mysql2 + peek + peek-performance_bar (1.3.1) + peek (>= 0.1.0) + peek-pg (1.3.0) + concurrent-ruby + concurrent-ruby-ext + peek + pg + peek-rblineprof (0.2.0) + peek + rblineprof + peek-redis (1.2.0) + atomic (>= 1.0.0) + peek + redis + peek-sidekiq (1.0.3) + atomic (>= 1.0.0) + peek + sidekiq + pg (0.18.4) + po_to_json (1.0.1) + json (>= 1.6.0) + posix-spawn (0.3.13) + powerpack (0.1.1) + premailer (1.11.1) + addressable + css_parser (>= 1.6.0) + htmlentities (>= 4.0.0) + premailer-rails (1.9.7) + actionmailer (>= 3, < 6) + premailer (~> 1.7, >= 1.7.9) + proc_to_ast (0.1.0) + coderay + parser + unparser + procto (0.0.3) + prometheus-client-mmap (0.9.1) + pry (0.11.3) + coderay (~> 1.1.0) + method_source (~> 0.9.0) + pry-byebug (3.4.3) + byebug (>= 9.0, < 9.1) + pry (~> 0.10) + pry-rails (0.3.6) + pry (>= 0.10.4) + public_suffix (3.0.2) + pyu-ruby-sasl (0.0.3.3) + rack (2.0.4) + rack-accept (0.4.5) + rack (>= 0.4) + rack-attack (4.4.1) + rack + rack-cors (1.0.2) + rack-oauth2 (1.2.3) + activesupport (>= 2.3) + attr_required (>= 0.0.5) + httpclient (>= 2.4) + multi_json (>= 1.3.6) + rack (>= 1.1) + rack-protection (2.0.1) + rack + rack-proxy (0.6.4) + rack + rack-test (0.6.3) + rack (>= 1.0) + rails (5.0.6) + actioncable (= 5.0.6) + actionmailer (= 5.0.6) + actionpack (= 5.0.6) + actionview (= 5.0.6) + activejob (= 5.0.6) + activemodel (= 5.0.6) + activerecord (= 5.0.6) + activesupport (= 5.0.6) + bundler (>= 1.3.0) + railties (= 5.0.6) + sprockets-rails (>= 2.0.0) + rails-deprecated_sanitizer (1.0.3) + activesupport (>= 4.2.0.alpha) + rails-dom-testing (2.0.3) + activesupport (>= 4.2.0) + nokogiri (>= 1.6) + rails-html-sanitizer (1.0.3) + loofah (~> 2.0) + rails-i18n (5.1.1) + i18n (>= 0.7, < 2) + railties (>= 5.0, < 6) + railties (5.0.6) + actionpack (= 5.0.6) + activesupport (= 5.0.6) + method_source + rake (>= 0.8.7) + thor (>= 0.18.1, < 2.0) + rainbow (2.2.2) + rake + raindrops (0.19.0) + rake (12.3.0) + rb-fsevent (0.10.3) + rb-inotify (0.9.10) + ffi (>= 0.5.0, < 2) + rblineprof (0.3.7) + debugger-ruby_core_source (~> 1.3) + rbnacl (4.0.2) + ffi + rbnacl-libsodium (1.0.16) + rbnacl (>= 3.0.1) + rdoc (4.3.0) + re2 (1.1.1) + recaptcha (3.4.0) + json + recursive-open-struct (1.0.0) + redcarpet (3.4.0) + redis (3.3.5) + redis-actionpack (5.0.2) + actionpack (>= 4.0, < 6) + redis-rack (>= 1, < 3) + redis-store (>= 1.1.0, < 2) + redis-activesupport (5.0.4) + activesupport (>= 3, < 6) + redis-store (>= 1.3, < 2) + redis-namespace (1.5.3) + redis (~> 3.0, >= 3.0.4) + redis-rack (2.0.4) + rack (>= 1.5, < 3) + redis-store (>= 1.2, < 2) + redis-rails (5.0.2) + redis-actionpack (>= 5.0, < 6) + redis-activesupport (>= 5.0, < 6) + redis-store (>= 1.2, < 2) + redis-store (1.4.1) + redis (>= 2.2, < 5) + representable (3.0.4) + declarative (< 0.1.0) + declarative-option (< 0.2.0) + uber (< 0.2.0) + request_store (1.4.0) + rack (>= 1.4) + responders (2.4.0) + actionpack (>= 4.2.0, < 5.3) + railties (>= 4.2.0, < 5.3) + rest-client (2.0.2) + http-cookie (>= 1.0.2, < 2.0) + mime-types (>= 1.16, < 4.0) + netrc (~> 0.8) + retriable (3.1.1) + rinku (2.0.4) + rotp (2.1.2) + rouge (2.2.1) + rqrcode (0.10.1) + chunky_png (~> 1.0) + rqrcode-rails3 (0.1.7) + rqrcode (>= 0.4.2) + rspec (3.6.0) + rspec-core (~> 3.6.0) + rspec-expectations (~> 3.6.0) + rspec-mocks (~> 3.6.0) + rspec-core (3.6.0) + rspec-support (~> 3.6.0) + rspec-expectations (3.6.0) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.6.0) + rspec-mocks (3.6.0) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.6.0) + rspec-parameterized (0.4.0) + binding_of_caller + parser + proc_to_ast + rspec (>= 2.13, < 4) + unparser + rspec-rails (3.6.1) + actionpack (>= 3.0) + activesupport (>= 3.0) + railties (>= 3.0) + rspec-core (~> 3.6.0) + rspec-expectations (~> 3.6.0) + rspec-mocks (~> 3.6.0) + rspec-support (~> 3.6.0) + rspec-retry (0.4.6) + rspec-core + rspec-set (0.1.3) + rspec-support (3.6.0) + rspec_profiling (0.0.5) + activerecord + pg + rails + sqlite3 + rubocop (0.52.1) + parallel (~> 1.10) + parser (>= 2.4.0.2, < 3.0) + powerpack (~> 0.1) + rainbow (>= 2.2.2, < 4.0) + ruby-progressbar (~> 1.7) + unicode-display_width (~> 1.0, >= 1.0.1) + rubocop-gitlab-security (0.1.1) + rubocop (>= 0.51) + rubocop-rspec (1.22.2) + rubocop (>= 0.52.1) + ruby-enum (0.7.2) + i18n + ruby-fogbugz (0.2.1) + crack (~> 0.4) + ruby-prof (0.16.2) + ruby-progressbar (1.9.0) + ruby-saml (1.7.2) + nokogiri (>= 1.5.10) + ruby_parser (3.11.0) + sexp_processor (~> 4.9) + rubyntlm (0.6.2) + rubypants (0.7.0) + rubyzip (1.2.1) + rufus-scheduler (3.4.2) + et-orbi (~> 1.0) + rugged (0.26.0) + safe_yaml (1.0.4) + sanitize (2.1.0) + nokogiri (>= 1.4.4) + sass (3.5.5) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + sass-rails (5.0.7) + railties (>= 4.0.0, < 6) + sass (~> 3.1) + sprockets (>= 2.8, < 4.0) + sprockets-rails (>= 2.0, < 4.0) + tilt (>= 1.1, < 3) + sawyer (0.8.1) + addressable (>= 2.3.5, < 2.6) + faraday (~> 0.8, < 1.0) + scss_lint (0.56.0) + rake (>= 0.9, < 13) + sass (~> 3.5.3) + securecompare (1.0.0) + seed-fu (2.3.7) + activerecord (>= 3.1) + activesupport (>= 3.1) + select2-rails (3.5.10) + thor (~> 0.14) + selenium-webdriver (3.11.0) + childprocess (~> 0.5) + rubyzip (~> 1.2) + sentry-raven (2.5.3) + faraday (>= 0.7.6, < 1.0) + settingslogic (2.0.9) + sexp_processor (4.10.1) + sham_rack (1.3.6) + rack + shoulda-matchers (3.1.2) + activesupport (>= 4.0.0) + sidekiq (5.1.1) + concurrent-ruby (~> 1.0) + connection_pool (~> 2.2, >= 2.2.0) + rack-protection (>= 1.5.0) + redis (>= 3.3.5, < 5) + sidekiq-cron (0.6.3) + rufus-scheduler (>= 3.3.0) + sidekiq (>= 4.2.1) + sidekiq-limit_fetch (3.4.0) + sidekiq (>= 4) + signet (0.8.1) + addressable (~> 2.3) + faraday (~> 0.9) + jwt (>= 1.5, < 3.0) + multi_json (~> 1.10) + simple_po_parser (1.1.3) + simplecov (0.14.1) + docile (~> 1.1.0) + json (>= 1.8, < 3) + simplecov-html (~> 0.10.0) + simplecov-html (0.10.2) + slack-notifier (1.5.1) + spinach (0.10.1) + colorize + gherkin-ruby (>= 0.3.2) + json + spinach-rails (0.2.1) + capybara (>= 2.0.0) + railties (>= 3) + spinach (>= 0.4) + spinach-rerun-reporter (0.0.2) + spinach (~> 0.8) + spring (2.0.2) + activesupport (>= 4.2) + spring-commands-rspec (1.0.4) + spring (>= 0.9.1) + spring-commands-spinach (1.1.0) + spring (>= 0.9.1) + sprockets (3.7.1) + concurrent-ruby (~> 1.0) + rack (> 1, < 3) + sprockets-rails (3.2.1) + actionpack (>= 4.0) + activesupport (>= 4.0) + sprockets (>= 3.0.0) + sqlite3 (1.3.13) + sshkey (1.9.0) + stackprof (0.2.11) + state_machines (0.5.0) + state_machines-activemodel (0.5.0) + activemodel (>= 4.1, < 5.2) + state_machines (>= 0.5.0) + state_machines-activerecord (0.4.1) + activerecord (>= 4.1, < 5.2) + state_machines-activemodel (>= 0.3.0) + stringex (2.8.4) + sys-filesystem (1.1.9) + ffi + sysexits (1.2.0) + temple (0.7.7) + test-prof (0.2.5) + test_after_commit (1.1.0) + activerecord (>= 3.2) + text (1.3.1) + thin (1.7.2) + daemons (~> 1.0, >= 1.0.9) + eventmachine (~> 1.0, >= 1.0.4) + rack (>= 1, < 3) + thor (0.19.4) + thread_safe (0.3.6) + tilt (2.0.8) + timecop (0.8.1) + timfel-krb5-auth (0.8.3) + toml (0.1.2) + parslet (~> 1.5.0) + toml-rb (1.0.0) + citrus (~> 3.0, > 3.0) + truncato (0.7.10) + htmlentities (~> 4.3.1) + nokogiri (~> 1.8.0, >= 1.7.0) + tzinfo (1.2.5) + thread_safe (~> 0.1) + u2f (0.2.1) + uber (0.1.0) + uglifier (2.7.2) + execjs (>= 0.3.0) + json (>= 1.8.0) + unf (0.1.4) + unf_ext + unf_ext (0.0.7.5) + unicode-display_width (1.3.0) + unicorn (5.1.0) + kgio (~> 2.6) + raindrops (~> 0.7) + unicorn-worker-killer (0.4.4) + get_process_mem (~> 0) + unicorn (>= 4, < 6) + uniform_notifier (1.10.0) + unparser (0.2.7) + abstract_type (~> 0.0.7) + adamantium (~> 0.2.0) + concord (~> 0.1.5) + diff-lcs (~> 1.3) + equalizer (~> 0.0.9) + parser (>= 2.3.1.2, < 2.6) + procto (~> 0.0.2) + url_safe_base64 (0.2.2) + validates_hostname (1.0.8) + activerecord (>= 3.0) + activesupport (>= 3.0) + version_sorter (2.1.0) + virtus (1.0.5) + axiom-types (~> 0.1) + coercible (~> 1.0) + descendants_tracker (~> 0.0, >= 0.0.3) + equalizer (~> 0.0, >= 0.0.9) + vmstat (2.3.0) + warden (1.2.7) + rack (>= 1.0) + webmock (2.3.2) + addressable (>= 2.3.6) + crack (>= 0.3.2) + hashdiff + webpack-rails (0.9.11) + railties (>= 3.2.0) + websocket-driver (0.6.5) + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.3) + wikicloth (0.8.1) + builder + expression_parser + rinku + with_env (1.1.0) + xml-simple (1.1.5) + xpath (3.0.0) + nokogiri (~> 1.8) + +PLATFORMS + ruby + +DEPENDENCIES + RedCloth (~> 4.3.2) + ace-rails-ap (~> 4.1.0) + activerecord_sane_schema_dumper (= 1.0) + acts-as-taggable-on (~> 4.0) + addressable (~> 2.5.2) + akismet (~> 2.0) + allocations (~> 1.0) + asana (~> 0.6.0) + asciidoctor (~> 1.5.2) + asciidoctor-plantuml (= 0.0.7) + asset_sync (~> 2.2.0) + attr_encrypted (~> 3.0.0) + awesome_print (~> 1.2.0) + babosa (~> 1.0.2) + base32 (~> 0.3.0) + batch-loader (~> 1.2.1) + bcrypt_pbkdf (~> 1.0) + benchmark-ips (~> 2.3.0) + better_errors (~> 2.1.0) + binding_of_caller (~> 0.7.2) + bootstrap-sass (~> 3.3.0) + bootstrap_form (~> 2.7.0) + brakeman (~> 3.6.0) + browser (~> 2.2) + bullet (~> 5.5.0) + bundler-audit (~> 0.5.0) + capybara (~> 2.15) + capybara-screenshot (~> 1.0.0) + carrierwave (~> 1.2) + charlock_holmes (~> 0.7.5) + chronic (~> 0.10.2) + chronic_duration (~> 0.10.6) + commonmarker (~> 0.17) + concurrent-ruby (~> 1.0.5) + connection_pool (~> 2.0) + creole (~> 0.5.0) + d3_rails (~> 3.5.0) + database_cleaner (~> 1.5.0) + deckar01-task_list (= 2.0.0) + default_value_for (~> 3.0.5) + devise (~> 4.2) + devise-two-factor (~> 3.0.0) + diffy (~> 3.1.0) + doorkeeper (~> 4.2.0) + doorkeeper-openid_connect (~> 1.2.0) + dropzonejs-rails (~> 0.7.1) + email_reply_trimmer (~> 0.1) + email_spec (~> 1.6.0) + factory_bot_rails (~> 4.8.2) + faraday (~> 0.12) + fast_blank + ffaker (~> 2.4) + flay (~> 2.10.0) + flipper (~> 0.11.0) + flipper-active_record (~> 0.11.0) + flipper-active_support_cache_store (~> 0.11.0) + fog-aliyun (~> 0.2.0) + fog-aws (~> 1.4) + fog-core (~> 1.44) + fog-google (~> 0.5) + fog-local (~> 0.3) + fog-openstack (~> 0.1) + fog-rackspace (~> 0.1.1) + font-awesome-rails (~> 4.7) + foreman (~> 0.78.0) + fuubar (~> 2.2.0) + gemnasium-gitlab-service (~> 0.2) + gemojione (~> 3.3) + gettext (~> 3.2.2) + gettext_i18n_rails (~> 1.8.0) + gettext_i18n_rails_js (~> 1.2.0) + gitaly-proto (~> 0.88.0) + github-linguist (~> 5.3.3) + gitlab-flowdock-git-hook (~> 1.0.1) + gitlab-markup (~> 1.6.2) + gitlab-styles (~> 2.3) + gitlab_omniauth-ldap (~> 2.0.4) + gollum-lib (~> 4.2) + gollum-rugged_adapter (~> 0.4.4) + gon (~> 6.1.0) + google-api-client (~> 0.13.6) + google-protobuf (= 3.5.1) + gpgme + grape (~> 1.0) + grape-entity (~> 0.6.0) + grape-route-helpers (~> 2.1.0) + grape_logging (~> 1.7) + grpc (~> 1.10.0) + haml_lint (~> 0.26.0) + hamlit (~> 2.6.1) + hashie-forbidden_attributes + health_check (~> 2.6.0) + hipchat (~> 1.5.0) + html-pipeline (~> 2.6.0) + html2text + httparty (~> 0.13.3) + influxdb (~> 0.2) + jira-ruby (~> 1.4) + jquery-atwho-rails (~> 1.3.2) + jquery-rails (~> 4.3.1) + json-schema (~> 2.8.0) + jwt (~> 1.5.6) + kaminari (~> 1.0) + knapsack (~> 1.11.0) + kubeclient (~> 2.2.0) + letter_opener_web (~> 1.3.0) + license_finder (~> 3.1) + licensee (~> 8.7.0) + lograge (~> 0.5) + loofah (~> 2.0.3) + mail_room (~> 0.9.1) + method_source (~> 0.8) + minitest (~> 5.7.0) + mousetrap-rails (~> 1.4.6) + mysql2 (~> 0.4.10) + net-ldap + net-ssh (~> 4.1.0) + nokogiri (~> 1.8.2) + oauth2 (~> 1.4) + octokit (~> 4.6.2) + oj (~> 2.17.4) + omniauth (~> 1.4.2) + omniauth-auth0 (~> 1.4.1) + omniauth-authentiq (~> 0.3.1) + omniauth-azure-oauth2 (~> 0.0.9) + omniauth-cas3 (~> 1.1.4) + omniauth-facebook (~> 4.0.0) + omniauth-github (~> 1.1.1) + omniauth-gitlab (~> 1.0.2) + omniauth-google-oauth2 (~> 0.5.2) + omniauth-kerberos (~> 0.3.0) + omniauth-oauth2-generic (~> 0.2.2) + omniauth-saml (~> 1.7.0) + omniauth-shibboleth (~> 1.2.0) + omniauth-twitter (~> 1.2.0) + omniauth_crowd (~> 2.2.0) + org-ruby (~> 0.9.12) + peek (~> 1.0.1) + peek-gc (~> 0.0.2) + peek-host (~> 1.0.0) + peek-mysql2 (~> 1.1.0) + peek-performance_bar (~> 1.3.0) + peek-pg (~> 1.3.0) + peek-rblineprof (~> 0.2.0) + peek-redis (~> 1.2.0) + peek-sidekiq (~> 1.0.3) + pg (~> 0.18.2) + premailer-rails (~> 1.9.7) + prometheus-client-mmap (~> 0.9.1) + pry-byebug (~> 3.4.1) + pry-rails (~> 0.3.4) + rack-attack (~> 4.4.1) + rack-cors (~> 1.0.0) + rack-oauth2 (~> 1.2.1) + rack-proxy (~> 0.6.0) + rails (= 5.0.6) + rails-deprecated_sanitizer (~> 1.0.3) + rails-i18n (~> 5.1) + rainbow (~> 2.2) + raindrops (~> 0.18) + rblineprof (~> 0.3.6) + rbnacl (~> 4.0) + rbnacl-libsodium + rdoc (~> 4.2) + re2 (~> 1.1.1) + recaptcha (~> 3.0) + redcarpet (~> 3.4) + redis (~> 3.2) + redis-namespace (~> 1.5.2) + redis-rails (~> 5.0.2) + request_store (~> 1.3) + responders (~> 2.0) + rouge (~> 2.0) + rqrcode-rails3 (~> 0.1.7) + rspec-parameterized + rspec-rails (~> 3.6.0) + rspec-retry (~> 0.4.5) + rspec-set (~> 0.1.3) + rspec_profiling (~> 0.0.5) + rubocop (~> 0.52.1) + rubocop-rspec (~> 1.22.1) + ruby-fogbugz (~> 0.2.1) + ruby-prof (~> 0.16.2) + ruby_parser (~> 3.8) + rufus-scheduler (~> 3.4) + rugged (~> 0.26.0) + sanitize (~> 2.0) + sass-rails (~> 5.0.6) + scss_lint (~> 0.56.0) + seed-fu (~> 2.3.7) + select2-rails (~> 3.5.9) + selenium-webdriver (~> 3.5) + sentry-raven (~> 2.5.3) + settingslogic (~> 2.0.9) + sham_rack (~> 1.3.6) + shoulda-matchers (~> 3.1.2) + sidekiq (~> 5.0) + sidekiq-cron (~> 0.6.0) + sidekiq-limit_fetch (~> 3.4) + simple_po_parser (~> 1.1.2) + simplecov (~> 0.14.0) + slack-notifier (~> 1.5.1) + spinach-rails (~> 0.2.1) + spinach-rerun-reporter (~> 0.0.2) + spring (~> 2.0.0) + spring-commands-rspec (~> 1.0.4) + spring-commands-spinach (~> 1.1.0) + sprockets (~> 3.7.0) + sshkey (~> 1.9.0) + stackprof (~> 0.2.10) + state_machines-activerecord (~> 0.4.0) + sys-filesystem (~> 1.1.6) + test-prof (~> 0.2.5) + test_after_commit (~> 1.1) + thin (~> 1.7.0) + timecop (~> 0.8.0) + toml-rb (~> 1.0.0) + truncato (~> 0.7.9) + u2f (~> 0.2.1) + uglifier (~> 2.7.2) + unf (~> 0.1.4) + unicorn (~> 5.1.0) + unicorn-worker-killer (~> 0.4.4) + validates_hostname (~> 1.0.6) + version_sorter (~> 2.1.0) + virtus (~> 1.0.1) + vmstat (~> 2.3.0) + webmock (~> 2.3.2) + webpack-rails (~> 0.9.10) + wikicloth (= 0.8.1) + +BUNDLED WITH + 1.16.1 @@ -4,4 +4,3 @@ # web: RAILS_ENV=development bin/web start_foreground worker: RAILS_ENV=development bin/background_jobs start_foreground -# mail_room: bundle exec mail_room -q -c config/mail_room.yml @@ -1 +1 @@ -10.6.0-pre +10.7.0-pre diff --git a/app/assets/javascripts/ide/components/repo_file.vue b/app/assets/javascripts/ide/components/repo_file.vue index 03a40096bb0..297b9c2628f 100644 --- a/app/assets/javascripts/ide/components/repo_file.vue +++ b/app/assets/javascripts/ide/components/repo_file.vue @@ -43,6 +43,7 @@ export default { 'file-open': this.isBlob && this.file.opened, 'file-active': this.isBlob && this.file.active, folder: this.isTree, + 'is-open': this.file.opened, }; }, }, diff --git a/app/assets/javascripts/ide/ide_router.js b/app/assets/javascripts/ide/ide_router.js index 048d5316922..db89c1d44db 100644 --- a/app/assets/javascripts/ide/ide_router.js +++ b/app/assets/javascripts/ide/ide_router.js @@ -54,41 +54,61 @@ const router = new VueRouter({ router.beforeEach((to, from, next) => { if (to.params.namespace && to.params.project) { - store.dispatch('getProjectData', { - namespace: to.params.namespace, - projectId: to.params.project, - }) - .then(() => { - const fullProjectId = `${to.params.namespace}/${to.params.project}`; + store + .dispatch('getProjectData', { + namespace: to.params.namespace, + projectId: to.params.project, + }) + .then(() => { + const fullProjectId = `${to.params.namespace}/${to.params.project}`; - if (to.params.branch) { - store.dispatch('getBranchData', { - projectId: fullProjectId, - branchId: to.params.branch, - }); + if (to.params.branch) { + store.dispatch('getBranchData', { + projectId: fullProjectId, + branchId: to.params.branch, + }); - store.dispatch('getFiles', { - projectId: fullProjectId, - branchId: to.params.branch, - }) - .then(() => { - if (to.params[0]) { - const treeEntry = store.state.entries[to.params[0]]; - if (treeEntry) { - store.dispatch('handleTreeEntryAction', treeEntry); - } - } - }) - .catch((e) => { - flash('Error while loading the branch files. Please try again.', 'alert', document, null, false, true); - throw e; - }); - } - }) - .catch((e) => { - flash('Error while loading the project data. Please try again.', 'alert', document, null, false, true); - throw e; - }); + store + .dispatch('getFiles', { + projectId: fullProjectId, + branchId: to.params.branch, + }) + .then(() => { + if (to.params[0]) { + const path = + to.params[0].slice(-1) === '/' + ? to.params[0].slice(0, -1) + : to.params[0]; + const treeEntry = store.state.entries[path]; + if (treeEntry) { + store.dispatch('handleTreeEntryAction', treeEntry); + } + } + }) + .catch(e => { + flash( + 'Error while loading the branch files. Please try again.', + 'alert', + document, + null, + false, + true, + ); + throw e; + }); + } + }) + .catch(e => { + flash( + 'Error while loading the project data. Please try again.', + 'alert', + document, + null, + false, + true, + ); + throw e; + }); } next(); diff --git a/app/assets/javascripts/ide/stores/workers/files_decorator_worker.js b/app/assets/javascripts/ide/stores/workers/files_decorator_worker.js index e959130300b..a4cd1ab099f 100644 --- a/app/assets/javascripts/ide/stores/workers/files_decorator_worker.js +++ b/app/assets/javascripts/ide/stores/workers/files_decorator_worker.js @@ -1,10 +1,14 @@ -import { - decorateData, - sortTree, -} from '../utils'; +import { decorateData, sortTree } from '../utils'; -self.addEventListener('message', (e) => { - const { data, projectId, branchId, tempFile = false, content = '', base64 = false } = e.data; +self.addEventListener('message', e => { + const { + data, + projectId, + branchId, + tempFile = false, + content = '', + base64 = false, + } = e.data; const treeList = []; let file; @@ -15,7 +19,9 @@ self.addEventListener('message', (e) => { if (pathSplit.length > 0) { pathSplit.reduce((pathAcc, folderName) => { const parentFolder = acc[pathAcc[pathAcc.length - 1]]; - const folderPath = `${(parentFolder ? `${parentFolder.path}/` : '')}${folderName}`; + const folderPath = `${ + parentFolder ? `${parentFolder.path}/` : '' + }${folderName}`; const foundEntry = acc[folderPath]; if (!foundEntry) { @@ -25,9 +31,11 @@ self.addEventListener('message', (e) => { id: folderPath, name: folderName, path: folderPath, - url: `/${projectId}/tree/${branchId}/${folderPath}`, + url: `/${projectId}/tree/${branchId}/${folderPath}/`, type: 'tree', - parentTreeUrl: parentFolder ? parentFolder.url : `/${projectId}/tree/${branchId}/`, + parentTreeUrl: parentFolder + ? parentFolder.url + : `/${projectId}/tree/${branchId}/`, tempFile, changed: tempFile, opened: tempFile, @@ -62,7 +70,9 @@ self.addEventListener('message', (e) => { path, url: `/${projectId}/blob/${branchId}/${path}`, type: 'blob', - parentTreeUrl: fileFolder ? fileFolder.url : `/${projectId}/blob/${branchId}`, + parentTreeUrl: fileFolder + ? fileFolder.url + : `/${projectId}/blob/${branchId}`, tempFile, changed: tempFile, content, diff --git a/app/assets/javascripts/notes.js b/app/assets/javascripts/notes.js index 2afa4e4c1bf..09f0ea37103 100644 --- a/app/assets/javascripts/notes.js +++ b/app/assets/javascripts/notes.js @@ -1727,6 +1727,7 @@ export default class Notes { // Get Form metadata const $submitBtn = $(e.target); + $submitBtn.prop('disabled', true); let $form = $submitBtn.parents('form'); const $closeBtn = $form.find('.js-note-target-close'); const isDiscussionNote = @@ -1761,7 +1762,6 @@ export default class Notes { // If comment is to resolve discussion, disable submit buttons while // comment posting is finished. if (isDiscussionResolve) { - $submitBtn.disable(); $form.find('.js-comment-submit-button').disable(); } @@ -1816,6 +1816,7 @@ export default class Notes { .then(res => { const note = res.data; + $submitBtn.prop('disabled', false); // Submission successful! remove placeholder $notesContainer.find(`#${noteUniqueId}`).remove(); @@ -1899,7 +1900,7 @@ export default class Notes { .catch(() => { // Submission failed, remove placeholder note and show Flash error message $notesContainer.find(`#${noteUniqueId}`).remove(); - + $submitBtn.prop('disabled', false); const blurEvent = new CustomEvent('blur.imageDiff', { detail: e, }); diff --git a/app/assets/javascripts/performance_bar/components/detailed_metric.vue b/app/assets/javascripts/performance_bar/components/detailed_metric.vue index 68d539c57a4..882d6f7077a 100644 --- a/app/assets/javascripts/performance_bar/components/detailed_metric.vue +++ b/app/assets/javascripts/performance_bar/components/detailed_metric.vue @@ -27,12 +27,21 @@ export default { required: true, }, }, + computed: { + metricDetails() { + return this.currentRequest.details[this.metric]; + }, + detailsList() { + return this.metricDetails[this.details]; + }, + }, }; </script> <template> <div :id="`peek-view-${metric}`" class="view" + v-if="currentRequest.details" > <button :data-target="`#modal-peek-${metric}-details`" @@ -40,35 +49,40 @@ export default { type="button" data-toggle="modal" > - <span - v-if="currentRequest.details" - class="bold" - > - {{ currentRequest.details[metric].duration }} - / - {{ currentRequest.details[metric].calls }} - </span> + {{ metricDetails.duration }} + / + {{ metricDetails.calls }} </button> <gl-modal - v-if="currentRequest.details" :id="`modal-peek-${metric}-details`" :header-title-text="header" class="performance-bar-modal" > - <table class="table"> - <tr - v-for="(item, index) in currentRequest.details[metric][details]" - :key="index" - > - <td><strong>{{ item.duration }}ms</strong></td> - <td - v-for="key in keys" - :key="key" - class="break-all" + <table + class="table" + > + <template v-if="detailsList.length"> + <tr + v-for="(item, index) in detailsList" + :key="index" > - {{ item[key] }} - </td> - </tr> + <td><strong>{{ item.duration }}ms</strong></td> + <td + v-for="key in keys" + :key="key" + class="break-all" + > + {{ item[key] }} + </td> + </tr> + </template> + <template v-else> + <tr> + <td> + No {{ header.toLowerCase() }} for this request. + </td> + </tr> + </template> </table> <div slot="footer"> diff --git a/app/assets/javascripts/performance_bar/components/performance_bar_app.vue b/app/assets/javascripts/performance_bar/components/performance_bar_app.vue index 88345cf2ad9..2fd1715ee79 100644 --- a/app/assets/javascripts/performance_bar/components/performance_bar_app.vue +++ b/app/assets/javascripts/performance_bar/components/performance_bar_app.vue @@ -113,27 +113,21 @@ export default { id="js-peek" :class="env" > - <request-selector - v-if="currentRequest" - :current-request="currentRequest" - :requests="requests" - @change-current-request="changeCurrentRequest" - /> - <div - id="peek-view-host" - class="view prepend-left-5" - > - <span - v-if="currentRequest && currentRequest.details" - class="current-host" - > - {{ currentRequest.details.host.hostname }} - </span> - </div> <div v-if="currentRequest" - class="wrapper" + class="container-fluid container-limited" > + <div + id="peek-view-host" + class="view" + > + <span + v-if="currentRequest.details" + class="current-host" + > + {{ currentRequest.details.host.hostname }} + </span> + </div> <upstream-performance-bar v-if="initialRequest && currentRequest.details" /> @@ -186,6 +180,12 @@ export default { gc </span> </div> + <request-selector + v-if="currentRequest" + :current-request="currentRequest" + :requests="requests" + @change-current-request="changeCurrentRequest" + /> </div> </div> </template> diff --git a/app/assets/javascripts/performance_bar/components/request_selector.vue b/app/assets/javascripts/performance_bar/components/request_selector.vue index 2f360ea6f6c..3ed07a4a47d 100644 --- a/app/assets/javascripts/performance_bar/components/request_selector.vue +++ b/app/assets/javascripts/performance_bar/components/request_selector.vue @@ -37,7 +37,7 @@ export default { <template> <div id="peek-request-selector" - class="append-right-5 pull-right" + class="pull-right" > <select v-model="currentRequestId"> <option diff --git a/app/assets/javascripts/performance_bar/components/upstream_performance_bar.vue b/app/assets/javascripts/performance_bar/components/upstream_performance_bar.vue index d438b1ec27b..2b5915f381f 100644 --- a/app/assets/javascripts/performance_bar/components/upstream_performance_bar.vue +++ b/app/assets/javascripts/performance_bar/components/upstream_performance_bar.vue @@ -5,6 +5,8 @@ export default { .getElementById('peek-view-performance-bar') .cloneNode(true); + upstreamPerformanceBar.classList.remove('hidden'); + this.$refs.wrapper.appendChild(upstreamPerformanceBar); }, }; diff --git a/app/assets/javascripts/performance_bar/index.js b/app/assets/javascripts/performance_bar/index.js index fca488120f6..a0ddf36a672 100644 --- a/app/assets/javascripts/performance_bar/index.js +++ b/app/assets/javascripts/performance_bar/index.js @@ -4,9 +4,9 @@ import Vue from 'vue'; import performanceBarApp from './components/performance_bar_app.vue'; import PerformanceBarStore from './stores/performance_bar_store'; -export default () => +export default ({ container }) => new Vue({ - el: '#js-peek', + el: container, components: { performanceBarApp, }, diff --git a/app/assets/javascripts/sidebar/components/time_tracking/collapsed_state.js b/app/assets/javascripts/sidebar/components/time_tracking/collapsed_state.js deleted file mode 100644 index a9fbc7f1a2f..00000000000 --- a/app/assets/javascripts/sidebar/components/time_tracking/collapsed_state.js +++ /dev/null @@ -1,96 +0,0 @@ -import stopwatchSvg from 'icons/_icon_stopwatch.svg'; -import { abbreviateTime } from '../../../lib/utils/pretty_time'; - -export default { - name: 'time-tracking-collapsed-state', - props: { - showComparisonState: { - type: Boolean, - required: true, - }, - showSpentOnlyState: { - type: Boolean, - required: true, - }, - showEstimateOnlyState: { - type: Boolean, - required: true, - }, - showNoTimeTrackingState: { - type: Boolean, - required: true, - }, - timeSpentHumanReadable: { - type: String, - required: false, - default: '', - }, - timeEstimateHumanReadable: { - type: String, - required: false, - default: '', - }, - }, - computed: { - timeSpent() { - return this.abbreviateTime(this.timeSpentHumanReadable); - }, - timeEstimate() { - return this.abbreviateTime(this.timeEstimateHumanReadable); - }, - divClass() { - if (this.showComparisonState) { - return 'compare'; - } else if (this.showEstimateOnlyState) { - return 'estimate-only'; - } else if (this.showSpentOnlyState) { - return 'spend-only'; - } else if (this.showNoTimeTrackingState) { - return 'no-tracking'; - } - - return ''; - }, - spanClass() { - if (this.showComparisonState) { - return ''; - } else if (this.showEstimateOnlyState || this.showSpentOnlyState) { - return 'bold'; - } else if (this.showNoTimeTrackingState) { - return 'no-value'; - } - - return ''; - }, - text() { - if (this.showComparisonState) { - return `${this.timeSpent} / ${this.timeEstimate}`; - } else if (this.showEstimateOnlyState) { - return `-- / ${this.timeEstimate}`; - } else if (this.showSpentOnlyState) { - return `${this.timeSpent} / --`; - } else if (this.showNoTimeTrackingState) { - return 'None'; - } - - return ''; - }, - }, - methods: { - abbreviateTime(timeStr) { - return abbreviateTime(timeStr); - }, - }, - template: ` - <div class="sidebar-collapsed-icon"> - ${stopwatchSvg} - <div class="time-tracking-collapsed-summary"> - <div :class="divClass"> - <span :class="spanClass"> - {{ text }} - </span> - </div> - </div> - </div> - `, -}; diff --git a/app/assets/javascripts/sidebar/components/time_tracking/collapsed_state.vue b/app/assets/javascripts/sidebar/components/time_tracking/collapsed_state.vue new file mode 100644 index 00000000000..3b86f1145d1 --- /dev/null +++ b/app/assets/javascripts/sidebar/components/time_tracking/collapsed_state.vue @@ -0,0 +1,102 @@ +<script> + import icon from '../../../vue_shared/components/icon.vue'; + import { abbreviateTime } from '../../../lib/utils/pretty_time'; + + export default { + name: 'TimeTrackingCollapsedState', + components: { + icon, + }, + props: { + showComparisonState: { + type: Boolean, + required: true, + }, + showSpentOnlyState: { + type: Boolean, + required: true, + }, + showEstimateOnlyState: { + type: Boolean, + required: true, + }, + showNoTimeTrackingState: { + type: Boolean, + required: true, + }, + timeSpentHumanReadable: { + type: String, + required: false, + default: '', + }, + timeEstimateHumanReadable: { + type: String, + required: false, + default: '', + }, + }, + computed: { + timeSpent() { + return this.abbreviateTime(this.timeSpentHumanReadable); + }, + timeEstimate() { + return this.abbreviateTime(this.timeEstimateHumanReadable); + }, + divClass() { + if (this.showComparisonState) { + return 'compare'; + } else if (this.showEstimateOnlyState) { + return 'estimate-only'; + } else if (this.showSpentOnlyState) { + return 'spend-only'; + } else if (this.showNoTimeTrackingState) { + return 'no-tracking'; + } + + return ''; + }, + spanClass() { + if (this.showComparisonState) { + return ''; + } else if (this.showEstimateOnlyState || this.showSpentOnlyState) { + return 'bold'; + } else if (this.showNoTimeTrackingState) { + return 'no-value'; + } + + return ''; + }, + text() { + if (this.showComparisonState) { + return `${this.timeSpent} / ${this.timeEstimate}`; + } else if (this.showEstimateOnlyState) { + return `-- / ${this.timeEstimate}`; + } else if (this.showSpentOnlyState) { + return `${this.timeSpent} / --`; + } else if (this.showNoTimeTrackingState) { + return 'None'; + } + + return ''; + }, + }, + methods: { + abbreviateTime(timeStr) { + return abbreviateTime(timeStr); + }, + }, + }; +</script> + +<template> + <div class="sidebar-collapsed-icon"> + <icon name="timer" /> + <div class="time-tracking-collapsed-summary"> + <div :class="divClass"> + <span :class="spanClass"> + {{ text }} + </span> + </div> + </div> + </div> +</template> diff --git a/app/assets/javascripts/sidebar/components/time_tracking/time_tracker.vue b/app/assets/javascripts/sidebar/components/time_tracking/time_tracker.vue index 230736a56b8..28240468d2c 100644 --- a/app/assets/javascripts/sidebar/components/time_tracking/time_tracker.vue +++ b/app/assets/javascripts/sidebar/components/time_tracking/time_tracker.vue @@ -1,6 +1,6 @@ <script> import timeTrackingHelpState from './help_state'; -import timeTrackingCollapsedState from './collapsed_state'; +import TimeTrackingCollapsedState from './collapsed_state.vue'; import timeTrackingSpentOnlyPane from './spent_only_pane'; import timeTrackingNoTrackingPane from './no_tracking_pane'; import timeTrackingEstimateOnlyPane from './estimate_only_pane'; @@ -11,7 +11,7 @@ import eventHub from '../../event_hub'; export default { name: 'IssuableTimeTracker', components: { - 'time-tracking-collapsed-state': timeTrackingCollapsedState, + TimeTrackingCollapsedState, 'time-tracking-estimate-only-pane': timeTrackingEstimateOnlyPane, 'time-tracking-spent-only-pane': timeTrackingSpentOnlyPane, 'time-tracking-no-tracking-pane': timeTrackingNoTrackingPane, diff --git a/app/assets/javascripts/vue_shared/components/file_icon.vue b/app/assets/javascripts/vue_shared/components/file_icon.vue index c9d7c0f4999..ee1c3498748 100644 --- a/app/assets/javascripts/vue_shared/components/file_icon.vue +++ b/app/assets/javascripts/vue_shared/components/file_icon.vue @@ -62,8 +62,7 @@ return `${gon.sprite_file_icons}#${iconName}`; }, folderIconName() { - // We don't have a open folder icon yet - return this.opened ? 'folder' : 'folder'; + return this.opened ? 'folder-open' : 'folder'; }, iconSizeClass() { return this.size ? `s${this.size}` : ''; diff --git a/app/assets/stylesheets/performance_bar.scss b/app/assets/stylesheets/performance_bar.scss index 9c1d36fc59a..d69b390ac27 100644 --- a/app/assets/stylesheets/performance_bar.scss +++ b/app/assets/stylesheets/performance_bar.scss @@ -43,12 +43,6 @@ } } - .wrapper { - width: 80%; - height: $performance-bar-height; - margin: 0 auto; - } - // UI Elements .bucket { background: $perf-bar-bucket-bg; diff --git a/app/helpers/issuables_helper.rb b/app/helpers/issuables_helper.rb index f6ddb6d4cfe..6d6b840f485 100644 --- a/app/helpers/issuables_helper.rb +++ b/app/helpers/issuables_helper.rb @@ -377,4 +377,11 @@ module IssuablesHelper def parent @project || @group end + + def issuable_milestone_tooltip_title(issuable) + if issuable.milestone + milestone_tooltip = milestone_tooltip_title(issuable.milestone) + _('Milestone') + (milestone_tooltip ? ': ' + milestone_tooltip : '') + end + end end diff --git a/app/models/group.rb b/app/models/group.rb index 8d183006c65..f669b1a7009 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -230,13 +230,13 @@ class Group < Namespace end GroupMember - .active_without_invites + .active_without_invites_and_requests .where(source_id: source_ids) end def members_with_descendants GroupMember - .active_without_invites + .active_without_invites_and_requests .where(source_id: self_and_descendants.reorder(nil).select(:id)) end diff --git a/app/models/member.rb b/app/models/member.rb index ec8156bbb01..e1a32148538 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -52,7 +52,7 @@ class Member < ActiveRecord::Base end # Like active, but without invites. For when a User is required. - scope :active_without_invites, -> do + scope :active_without_invites_and_requests, -> do left_join_users .where(users: { state: 'active' }) .non_request diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb index ab94db2c1e5..d7d2cde1004 100644 --- a/app/services/notification_service.rb +++ b/app/services/notification_service.rb @@ -208,9 +208,9 @@ class NotificationService def new_access_request(member) return true unless member.notifiable?(:subscription) - recipients = member.source.members.active_without_invites.owners_and_masters + recipients = member.source.members.active_without_invites_and_requests.owners_and_masters if fallback_to_group_owners_masters?(recipients, member) - recipients = member.source.group.members.active_without_invites.owners_and_masters + recipients = member.source.group.members.active_without_invites_and_requests.owners_and_masters end recipients.each { |recipient| deliver_access_request_email(recipient, member) } diff --git a/app/views/layouts/_mailer.html.haml b/app/views/layouts/_mailer.html.haml index b50537438a9..ddc1cdb24b5 100644 --- a/app/views/layouts/_mailer.html.haml +++ b/app/views/layouts/_mailer.html.haml @@ -67,12 +67,8 @@ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:25px 0;font-size:13px;line-height:1.6;color:#5c5c5c;" } %img{ alt: "GitLab", height: "33", src: image_url('mailers/gitlab_footer_logo.gif'), style: "display:block;margin:0 auto 1em;", width: "90" }/ %div - %a{ href: profile_notifications_url, style: "color:#3777b0;text-decoration:none;" } Manage all notifications - · - %a{ href: help_url, style: "color:#3777b0;text-decoration:none;" } Help - %div - You're receiving this email because of your account on - = succeed "." do - %a{ href: root_url, style: "color:#3777b0;text-decoration:none;" }= Gitlab.config.gitlab.host + - manage_notifications_link = link_to(_("Manage all notifications"), profile_notifications_url, style: "color:#3777b0;text-decoration:none;") + - help_link = link_to(_("Help"), help_url, style: "color:#3777b0;text-decoration:none;") + = _("You're receiving this email because of your account on %{host}. %{manage_notifications_link} · %{help_link}").html_safe % { host: Gitlab.config.gitlab.host, manage_notifications_link: manage_notifications_link, help_link: help_link } = yield :additional_footer diff --git a/app/views/peek/_bar.html.haml b/app/views/peek/_bar.html.haml index 14dafa197b5..b4d86e1601c 100644 --- a/app/views/peek/_bar.html.haml +++ b/app/views/peek/_bar.html.haml @@ -6,7 +6,7 @@ profile_url: url_for(params.merge(lineprofiler: 'true')) }, class: Peek.env } -#peek-view-performance-bar +#peek-view-performance-bar.hidden = render_server_response_time %span#serverstats %ul.performance-bar diff --git a/app/views/projects/issues/_issue.html.haml b/app/views/projects/issues/_issue.html.haml index 64c648f201b..0c58dd60e2c 100644 --- a/app/views/projects/issues/_issue.html.haml +++ b/app/views/projects/issues/_issue.html.haml @@ -7,7 +7,9 @@ .issue-main-info .issue-title.title %span.issue-title-text - = confidential_icon(issue) + - if issue.confidential? + %span.has-tooltip{ title: _('Confidential') } + = confidential_icon(issue) = link_to issue.title, issue_path(issue) - if issue.tasks? %span.task-status.hidden-xs @@ -24,11 +26,11 @@ - if issue.milestone %span.issuable-milestone.hidden-xs - = link_to project_issues_path(issue.project, milestone_title: issue.milestone.title), data: { html: 1, toggle: 'tooltip', title: milestone_tooltip_title(issue.milestone) } do + = link_to project_issues_path(issue.project, milestone_title: issue.milestone.title), data: { html: 1, toggle: 'tooltip', title: issuable_milestone_tooltip_title(issue) } do = icon('clock-o') = issue.milestone.title - if issue.due_date - %span.issuable-due-date.hidden-xs{ class: "#{'cred' if issue.overdue?}" } + %span.issuable-due-date.hidden-xs.has-tooltip{ class: "#{'cred' if issue.overdue?}", title: _('Due date') } = icon('calendar') = issue.due_date.to_s(:medium) diff --git a/app/views/projects/merge_requests/_merge_request.html.haml b/app/views/projects/merge_requests/_merge_request.html.haml index f45a000833b..a94267deeb2 100644 --- a/app/views/projects/merge_requests/_merge_request.html.haml +++ b/app/views/projects/merge_requests/_merge_request.html.haml @@ -23,11 +23,11 @@ - if merge_request.milestone %span.issuable-milestone.hidden-xs - = link_to project_merge_requests_path(merge_request.project, milestone_title: merge_request.milestone.title), data: { html: 1, toggle: 'tooltip', title: milestone_tooltip_title(merge_request.milestone) } do + = link_to project_merge_requests_path(merge_request.project, milestone_title: merge_request.milestone.title), data: { html: 1, toggle: 'tooltip', title: issuable_milestone_tooltip_title(merge_request) } do = icon('clock-o') = merge_request.milestone.title - if merge_request.target_project.default_branch != merge_request.target_branch - %span.project-ref-path + %span.project-ref-path.has-tooltip{ title: _('Target branch') } = link_to project_ref_path(merge_request.project, merge_request.target_branch), class: 'ref-name' do = sprite_icon('fork', size: 12, css_class: 'fork-sprite') @@ -51,11 +51,11 @@ = render_pipeline_status(merge_request.head_pipeline) - if merge_request.open? && merge_request.broken? %li.issuable-pipeline-broken.hidden-xs - = link_to merge_request_path(merge_request), class: "has-tooltip", title: "Cannot be merged automatically", data: { container: 'body' } do + = link_to merge_request_path(merge_request), class: "has-tooltip", title: _('Cannot be merged automatically') do = icon('exclamation-triangle') - if merge_request.assignee %li - = link_to_member(merge_request.source_project, merge_request.assignee, name: false, title: "Assigned to :name") + = link_to_member(merge_request.source_project, merge_request.assignee, name: false, title: _('Assigned to :name')) = render 'shared/issuable_meta_data', issuable: merge_request diff --git a/app/views/projects/tree/_tree_header.html.haml b/app/views/projects/tree/_tree_header.html.haml index 67613949b7d..5ef5e9c09a2 100644 --- a/app/views/projects/tree/_tree_header.html.haml +++ b/app/views/projects/tree/_tree_header.html.haml @@ -77,7 +77,7 @@ = render 'projects/find_file_link' = succeed " " do - = link_to ide_edit_path(@project, @id), class: 'btn btn-default' do + = link_to ide_edit_path(@project, @id, ""), class: 'btn btn-default' do = _('Web IDE') = render 'projects/buttons/download', project: @project, ref: @ref diff --git a/app/views/shared/_issuable_meta_data.html.haml b/app/views/shared/_issuable_meta_data.html.haml index 435acbc634c..430d9a9dd76 100644 --- a/app/views/shared/_issuable_meta_data.html.haml +++ b/app/views/shared/_issuable_meta_data.html.haml @@ -5,21 +5,21 @@ - issuable_mr = @issuable_meta_data[issuable.id].merge_requests_count - if issuable_mr > 0 - %li.issuable-mr.hidden-xs + %li.issuable-mr.hidden-xs.has-tooltip{ title: _('Related merge requests') } = image_tag('icon-merge-request-unmerged.svg', class: 'icon-merge-request-unmerged') = issuable_mr - if upvotes > 0 - %li.issuable-upvotes.hidden-xs + %li.issuable-upvotes.hidden-xs.has-tooltip{ title: _('Upvotes') } = icon('thumbs-up') = upvotes - if downvotes > 0 - %li.issuable-downvotes.hidden-xs + %li.issuable-downvotes.hidden-xs.has-tooltip{ title: _('Downvotes') } = icon('thumbs-down') = downvotes %li.issuable-comments.hidden-xs - = link_to issuable_url, class: ('no-comments' if note_count.zero?) do + = link_to issuable_url, class: ['has-tooltip', ('no-comments' if note_count.zero?)], title: _('Comments') do = icon('comments') = note_count diff --git a/app/views/shared/boards/components/_board.html.haml b/app/views/shared/boards/components/_board.html.haml index 2e9ad380012..149bf8da4b9 100644 --- a/app/views/shared/boards/components/_board.html.haml +++ b/app/views/shared/boards/components/_board.html.haml @@ -4,7 +4,7 @@ %header.board-header{ ":class" => '{ "has-border": list.label && list.label.color }', ":style" => "{ borderTopColor: (list.label && list.label.color ? list.label.color : null) }", "@click" => "toggleExpanded($event)" } %h3.board-title.js-board-handle{ ":class" => '{ "user-can-drag": (!disabled && !list.preset) }' } %i.fa.fa-fw.board-title-expandable-toggle{ "v-if": "list.isExpandable", - ":class": "{ \"fa-caret-down\": list.isExpanded, \"fa-caret-right\": !list.isExpanded && list.position === -1, \"fa-caret-left\": !list.isExpanded && list.position !== -1 }", + ":class": "{ \"fa-caret-down\": list.isExpanded, \"fa-caret-right\": !list.isExpanded }", "aria-hidden": "true" } %span.board-title-text.has-tooltip{ "v-if": "list.type !== \"label\"", diff --git a/changelogs/unreleased/17203-add-missing-pagination-commit-diff-endpoint.yml b/changelogs/unreleased/17203-add-missing-pagination-commit-diff-endpoint.yml deleted file mode 100644 index efd936ca104..00000000000 --- a/changelogs/unreleased/17203-add-missing-pagination-commit-diff-endpoint.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- - title: Add missing pagination on the commit diff endpoint - merge_request: 17203 - author: Maxime Roussin-Bélanger - type: fixed diff --git a/changelogs/unreleased/17359-move-oauth-modules-to-auth-dir-structure.yml b/changelogs/unreleased/17359-move-oauth-modules-to-auth-dir-structure.yml deleted file mode 100644 index ca049f9edaa..00000000000 --- a/changelogs/unreleased/17359-move-oauth-modules-to-auth-dir-structure.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Moved o_auth/saml/ldap modules under gitlab/auth -merge_request: 17359 -author: Horatiu Eugen Vlad diff --git a/changelogs/unreleased/17500-mr-multiple-issues-oxford-comma.yml b/changelogs/unreleased/17500-mr-multiple-issues-oxford-comma.yml deleted file mode 100644 index a94e6153a05..00000000000 --- a/changelogs/unreleased/17500-mr-multiple-issues-oxford-comma.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Update issue closing pattern to allow variations in punctuation -merge_request: 17198 -author: Vicky Chijwani -type: changed diff --git a/changelogs/unreleased/24774-clear-the-Labels-dropdown-search-filter.yml b/changelogs/unreleased/24774-clear-the-Labels-dropdown-search-filter.yml deleted file mode 100644 index b909bb2d021..00000000000 --- a/changelogs/unreleased/24774-clear-the-Labels-dropdown-search-filter.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Clear the Labels dropdown search filter after a selection is made -merge_request: 17393 -author: Andrew Torres -type: changed diff --git a/changelogs/unreleased/26039-Update-to-github-linguist5-3-x.yml b/changelogs/unreleased/26039-Update-to-github-linguist5-3-x.yml deleted file mode 100644 index 0f1cb2fef9d..00000000000 --- a/changelogs/unreleased/26039-Update-to-github-linguist5-3-x.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Update to github-linguist 5.3.x -merge_request: 17241 -author: Ken Ding -type: other diff --git a/changelogs/unreleased/26466-natural-sort-mrs.yml b/changelogs/unreleased/26466-natural-sort-mrs.yml deleted file mode 100644 index e3bf9834f24..00000000000 --- a/changelogs/unreleased/26466-natural-sort-mrs.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Group MRs on issue page by project and namespace. -merge_request: 8494 -author: Jeff Stubler diff --git a/changelogs/unreleased/29130-api-project-export.yml b/changelogs/unreleased/29130-api-project-export.yml deleted file mode 100644 index 7dee349232a..00000000000 --- a/changelogs/unreleased/29130-api-project-export.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add project export API -merge_request: 15860 -author: Travis Miller -type: added diff --git a/changelogs/unreleased/29497-pages-custom-domain-dns-verification.yml b/changelogs/unreleased/29497-pages-custom-domain-dns-verification.yml deleted file mode 100644 index f958f3f1272..00000000000 --- a/changelogs/unreleased/29497-pages-custom-domain-dns-verification.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add verification for GitLab Pages custom domains -merge_request: -author: -type: security diff --git a/changelogs/unreleased/30665-add-email-button-to-new-issue-by-email.yml b/changelogs/unreleased/30665-add-email-button-to-new-issue-by-email.yml deleted file mode 100644 index 175b3103d90..00000000000 --- a/changelogs/unreleased/30665-add-email-button-to-new-issue-by-email.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Add email button to new issue by email -merge_request: 10942 -author: Islam Wazery diff --git a/changelogs/unreleased/32564-fix-double-system-closing-notes.yml b/changelogs/unreleased/32564-fix-double-system-closing-notes.yml deleted file mode 100644 index e6e1ef8c76d..00000000000 --- a/changelogs/unreleased/32564-fix-double-system-closing-notes.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix duplicate system notes when merging a merge request. -merge_request: 17035 -author: -type: fixed diff --git a/changelogs/unreleased/32831-single-deploy-of-runner-in-k8s-cluster.yml b/changelogs/unreleased/32831-single-deploy-of-runner-in-k8s-cluster.yml deleted file mode 100644 index 74675992105..00000000000 --- a/changelogs/unreleased/32831-single-deploy-of-runner-in-k8s-cluster.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Allow installation of GitLab Runner with a single click -merge_request: 17134 -author: -type: added diff --git a/changelogs/unreleased/33570-slack-notify-default-branch.yml b/changelogs/unreleased/33570-slack-notify-default-branch.yml deleted file mode 100644 index 5c90ce47729..00000000000 --- a/changelogs/unreleased/33570-slack-notify-default-branch.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix Slack/Mattermost notifications not respecting `notify_only_default_branch` setting for pushes -merge_request: 17345 -author: -type: fixed diff --git a/changelogs/unreleased/35418-remove-underline-for-avatar.yml b/changelogs/unreleased/35418-remove-underline-for-avatar.yml deleted file mode 100644 index 034365e1137..00000000000 --- a/changelogs/unreleased/35418-remove-underline-for-avatar.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: remove avater underline -merge_request: 17219 -author: Ken Ding -type: fixed diff --git a/changelogs/unreleased/35530-teleporting-emoji.yml b/changelogs/unreleased/35530-teleporting-emoji.yml deleted file mode 100644 index a60a42b9e48..00000000000 --- a/changelogs/unreleased/35530-teleporting-emoji.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix Teleporting Emoji -merge_request: 16963 -author: Jared Deckard <jared.deckard@gmail.com> -type: fixed diff --git a/changelogs/unreleased/36847-update-update-toml-rb-to-1-0-0.yml b/changelogs/unreleased/36847-update-update-toml-rb-to-1-0-0.yml deleted file mode 100644 index 74eaf57c056..00000000000 --- a/changelogs/unreleased/36847-update-update-toml-rb-to-1-0-0.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: update toml-rb to 1.0.0 -merge_request: 17259 -author: Ken Ding -type: other diff --git a/changelogs/unreleased/37050-ext-issue-tracker.yml b/changelogs/unreleased/37050-ext-issue-tracker.yml deleted file mode 100644 index 29bccdded02..00000000000 --- a/changelogs/unreleased/37050-ext-issue-tracker.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Display a link to external issue tracker when enabled -merge_request: -author: -type: changed diff --git a/changelogs/unreleased/38587-pipelines-empty-state.yml b/changelogs/unreleased/38587-pipelines-empty-state.yml deleted file mode 100644 index 58ea204d394..00000000000 --- a/changelogs/unreleased/38587-pipelines-empty-state.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Handle empty state in Pipelines page -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/39444-make-margin-around-dropdown-dividers-4px.yml b/changelogs/unreleased/39444-make-margin-around-dropdown-dividers-4px.yml deleted file mode 100644 index da65cfff799..00000000000 --- a/changelogs/unreleased/39444-make-margin-around-dropdown-dividers-4px.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Set margins around dropdown dividers to 4px -merge_request: 17517 -author: -type: fixed diff --git a/changelogs/unreleased/39607-fix-avatar--vertical-align.yml b/changelogs/unreleased/39607-fix-avatar--vertical-align.yml deleted file mode 100644 index 4d9fee12f04..00000000000 --- a/changelogs/unreleased/39607-fix-avatar--vertical-align.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: "Fix user avatar's vertical align on the issues and merge requests pages" -merge_request: 17072 -author: Laszlo Karpati -type: fixed diff --git a/changelogs/unreleased/40187-project-branch-dashboard-with-active-stale-branches.yml b/changelogs/unreleased/40187-project-branch-dashboard-with-active-stale-branches.yml deleted file mode 100644 index 3833aab42dd..00000000000 --- a/changelogs/unreleased/40187-project-branch-dashboard-with-active-stale-branches.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add overview of branches and a filter for active/stale branches -merge_request: 15402 -author: Takuya Noguchi -type: added diff --git a/changelogs/unreleased/40502-osw-keep-link-when-redacting-unauthorized-objects.yml b/changelogs/unreleased/40502-osw-keep-link-when-redacting-unauthorized-objects.yml deleted file mode 100644 index dddd8473df5..00000000000 --- a/changelogs/unreleased/40502-osw-keep-link-when-redacting-unauthorized-objects.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Keep link when redacting unauthorized object links -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/40525-listing-user-activity-timeouts.yml b/changelogs/unreleased/40525-listing-user-activity-timeouts.yml deleted file mode 100644 index 39ce873dba6..00000000000 --- a/changelogs/unreleased/40525-listing-user-activity-timeouts.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Improve database response time for user activity listing. -merge_request: 17454 -author: -type: performance diff --git a/changelogs/unreleased/40552-sanitize-extra-blank-spaces-used-when-uploading-a-ssh-key.yml b/changelogs/unreleased/40552-sanitize-extra-blank-spaces-used-when-uploading-a-ssh-key.yml deleted file mode 100644 index 9e4811ca308..00000000000 --- a/changelogs/unreleased/40552-sanitize-extra-blank-spaces-used-when-uploading-a-ssh-key.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Sanitize extra blank spaces used when uploading a SSH key -merge_request: 40552 -author: -type: fixed diff --git a/changelogs/unreleased/40623-fix-404-when-listing-archived-projects-in-a-group-where-all-projects-have-been-archived.yml b/changelogs/unreleased/40623-fix-404-when-listing-archived-projects-in-a-group-where-all-projects-have-been-archived.yml deleted file mode 100644 index 543fd7c5e8d..00000000000 --- a/changelogs/unreleased/40623-fix-404-when-listing-archived-projects-in-a-group-where-all-projects-have-been-archived.yml +++ /dev/null @@ -1,4 +0,0 @@ -title: Fix 404 when listing archived projects in a group where all projects have been archived -merge_request: 17077 -author: Ashley Dumaine -type: fixed diff --git a/changelogs/unreleased/40668-pages-domain-api-returns-404-when-using-a-specific-domain.yml b/changelogs/unreleased/40668-pages-domain-api-returns-404-when-using-a-specific-domain.yml deleted file mode 100644 index d77572d6175..00000000000 --- a/changelogs/unreleased/40668-pages-domain-api-returns-404-when-using-a-specific-domain.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix get a single pages domain when project path contains a period -merge_request: 17206 -author: Travis Miller -type: fixed diff --git a/changelogs/unreleased/40994-expose-features-as-ci-cd-variable.yml b/changelogs/unreleased/40994-expose-features-as-ci-cd-variable.yml deleted file mode 100644 index 1e377094791..00000000000 --- a/changelogs/unreleased/40994-expose-features-as-ci-cd-variable.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: 'Expose GITLAB_FEATURES as CI/CD variable (fixes #40994)' -merge_request: -author: -type: added diff --git a/changelogs/unreleased/41616-api-issues-between-date.yml b/changelogs/unreleased/41616-api-issues-between-date.yml deleted file mode 100644 index d8a23f48699..00000000000 --- a/changelogs/unreleased/41616-api-issues-between-date.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Adds updated_at filter to issues and merge_requests API -merge_request: 17417 -author: Jacopo Beschi @jacopo-beschi -type: added diff --git a/changelogs/unreleased/41719-mr-title-fix.yml b/changelogs/unreleased/41719-mr-title-fix.yml deleted file mode 100644 index 92388f30cb2..00000000000 --- a/changelogs/unreleased/41719-mr-title-fix.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Render htmlentities correctly for links not supported by Rinku -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/41777-include-cycle-time-in-usage-ping.yml b/changelogs/unreleased/41777-include-cycle-time-in-usage-ping.yml deleted file mode 100644 index 8d8a5dfefa3..00000000000 --- a/changelogs/unreleased/41777-include-cycle-time-in-usage-ping.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Include cycle time in usage ping data -merge_request: 16973 -author: -type: added diff --git a/changelogs/unreleased/41851-enable-eslint-codeclimate.yml b/changelogs/unreleased/41851-enable-eslint-codeclimate.yml deleted file mode 100644 index 98924f3eae8..00000000000 --- a/changelogs/unreleased/41851-enable-eslint-codeclimate.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Enables eslint in codeclimate job -merge_request: 17392 -author: -type: other diff --git a/changelogs/unreleased/41899-api-endpoint-for-importing-a-project-export.yml b/changelogs/unreleased/41899-api-endpoint-for-importing-a-project-export.yml deleted file mode 100644 index 29ab7cc7cab..00000000000 --- a/changelogs/unreleased/41899-api-endpoint-for-importing-a-project-export.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: API endpoint for importing a project export -merge_request: 17025 -author: -type: added diff --git a/changelogs/unreleased/41905_merge_request_and_issue_metrics.yml b/changelogs/unreleased/41905_merge_request_and_issue_metrics.yml deleted file mode 100644 index c9e23360e3b..00000000000 --- a/changelogs/unreleased/41905_merge_request_and_issue_metrics.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: expose more metrics in merge requests api -merge_request: 16589 -author: haseebeqx -type: added diff --git a/changelogs/unreleased/41949-move.yml b/changelogs/unreleased/41949-move.yml deleted file mode 100644 index 40ccac63a28..00000000000 --- a/changelogs/unreleased/41949-move.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Remember assignee when moving an issue -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/42044-osw-add-button-to-deploy-runner-to-kubernetes.yml b/changelogs/unreleased/42044-osw-add-button-to-deploy-runner-to-kubernetes.yml deleted file mode 100644 index 6cf0de5b3fa..00000000000 --- a/changelogs/unreleased/42044-osw-add-button-to-deploy-runner-to-kubernetes.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add a button to deploy a runner to a Kubernetes cluster in the settings page -merge_request: 17278 -author: -type: changed diff --git a/changelogs/unreleased/42274-group-request-membership-long-too.yml b/changelogs/unreleased/42274-group-request-membership-long-too.yml deleted file mode 100644 index 03efedba638..00000000000 --- a/changelogs/unreleased/42274-group-request-membership-long-too.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix long list of recipients on group request membership email -merge_request: 17121 -author: Jacopo Beschi @jacopo-beschi -type: fixed diff --git a/changelogs/unreleased/42314-diff-file.yml b/changelogs/unreleased/42314-diff-file.yml deleted file mode 100644 index 1eed5ef1a34..00000000000 --- a/changelogs/unreleased/42314-diff-file.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Render modified icon for moved file in changes dropdown -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/42332-actionview-template-error-366-524-out-of-range.yml b/changelogs/unreleased/42332-actionview-template-error-366-524-out-of-range.yml deleted file mode 100644 index 626c761bfbd..00000000000 --- a/changelogs/unreleased/42332-actionview-template-error-366-524-out-of-range.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix 500 error being shown when diff has context marker with invalid encoding -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/42431-add-auto-devops-and-clusters-button-to-projects.yml b/changelogs/unreleased/42431-add-auto-devops-and-clusters-button-to-projects.yml deleted file mode 100644 index 5613b2af763..00000000000 --- a/changelogs/unreleased/42431-add-auto-devops-and-clusters-button-to-projects.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Add a button on the project page to set up a Kubernetes cluster and enable - Auto DevOps -merge_request: 16900 -author: -type: added diff --git a/changelogs/unreleased/42434-allow-commits-endpoint-to-work-over-all-commits.yml b/changelogs/unreleased/42434-allow-commits-endpoint-to-work-over-all-commits.yml deleted file mode 100644 index c596a88ba0b..00000000000 --- a/changelogs/unreleased/42434-allow-commits-endpoint-to-work-over-all-commits.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Allow commits endpoint to work over all commits of a repository -merge_request: 17182 -author: -type: added diff --git a/changelogs/unreleased/42481-remove-notification-settings-left-projects.yml b/changelogs/unreleased/42481-remove-notification-settings-left-projects.yml deleted file mode 100644 index ea99649131b..00000000000 --- a/changelogs/unreleased/42481-remove-notification-settings-left-projects.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Remove user notification settings for groups and projects when user leaves -merge_request: 16906 -author: Jacopo Beschi @jacopo-beschi -type: fixed diff --git a/changelogs/unreleased/42509-fix-API-PUT-projects-fails-when-only-ci_config_path-is-specified.yml b/changelogs/unreleased/42509-fix-API-PUT-projects-fails-when-only-ci_config_path-is-specified.yml deleted file mode 100644 index a3dc1917001..00000000000 --- a/changelogs/unreleased/42509-fix-API-PUT-projects-fails-when-only-ci_config_path-is-specified.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Allow to call PUT /projects/:id API with only ci_config_path specified -merge_request: 17105 -author: Laszlo Karpati -type: fixed diff --git a/changelogs/unreleased/42545-milestion-quick-actions-for-groups.yml b/changelogs/unreleased/42545-milestion-quick-actions-for-groups.yml deleted file mode 100644 index d29f79aaaf8..00000000000 --- a/changelogs/unreleased/42545-milestion-quick-actions-for-groups.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Allows the usage of /milestone quick action for group milestones -merge_request: 17239 -author: Jacopo Beschi @jacopo-beschi -type: fixed diff --git a/changelogs/unreleased/42643-persist-external-ip-of-ingress-controller-gke.yml b/changelogs/unreleased/42643-persist-external-ip-of-ingress-controller-gke.yml deleted file mode 100644 index 35457db82f4..00000000000 --- a/changelogs/unreleased/42643-persist-external-ip-of-ingress-controller-gke.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Display ingress IP address in the Kubernetes page -merge_request: 17052 -author: -type: added diff --git a/changelogs/unreleased/42712_api_branches_add_search_param_20180207.yml b/changelogs/unreleased/42712_api_branches_add_search_param_20180207.yml deleted file mode 100644 index 609b5ce48ef..00000000000 --- a/changelogs/unreleased/42712_api_branches_add_search_param_20180207.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add search param to Branches API -merge_request: 17005 -author: bunufi -type: added diff --git a/changelogs/unreleased/42800-change-usage-of-avatar_icon.yml b/changelogs/unreleased/42800-change-usage-of-avatar_icon.yml deleted file mode 100644 index 00f4b7436a7..00000000000 --- a/changelogs/unreleased/42800-change-usage-of-avatar_icon.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Use a user object in ApplicationHelper#avatar_icon where possible to avoid - N+1 queries. -merge_request: 42800 -author: -type: performance diff --git a/changelogs/unreleased/42814-fix-remove-source-branch-when-mwps.yml b/changelogs/unreleased/42814-fix-remove-source-branch-when-mwps.yml deleted file mode 100644 index 08e77ee7c3b..00000000000 --- a/changelogs/unreleased/42814-fix-remove-source-branch-when-mwps.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Fix "Remove source branch" button in Merge request widget during merge when pipeline - succeeds state -merge_request: 17192 -author: -type: fixed diff --git a/changelogs/unreleased/42921-ci-charts-include-current-day.yml b/changelogs/unreleased/42921-ci-charts-include-current-day.yml deleted file mode 100644 index d0de6665735..00000000000 --- a/changelogs/unreleased/42921-ci-charts-include-current-day.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: CI charts now include the current day -merge_request: 17032 -author: Dakkaron -type: changed diff --git a/changelogs/unreleased/42922-environment-name.yml b/changelogs/unreleased/42922-environment-name.yml deleted file mode 100644 index 0e9544245f6..00000000000 --- a/changelogs/unreleased/42922-environment-name.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Adds tooltip in environment names to increase readability -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/42923-close-issue.yml b/changelogs/unreleased/42923-close-issue.yml deleted file mode 100644 index e332bbf5dec..00000000000 --- a/changelogs/unreleased/42923-close-issue.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix close button on issues not working on mobile -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/42929-hide-new-variable-values.yml b/changelogs/unreleased/42929-hide-new-variable-values.yml deleted file mode 100644 index 68decd25b5a..00000000000 --- a/changelogs/unreleased/42929-hide-new-variable-values.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Hide CI secret variable values after saving -merge_request: 17044 -author: -type: changed diff --git a/changelogs/unreleased/42946-update-pipeline-cancel-tooltip-to-stop.yml b/changelogs/unreleased/42946-update-pipeline-cancel-tooltip-to-stop.yml deleted file mode 100644 index 0e566dd0abf..00000000000 --- a/changelogs/unreleased/42946-update-pipeline-cancel-tooltip-to-stop.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Update tooltip on pipeline cancel to Stop (#42946) -merge_request: 17444 -author: -type: fixed diff --git a/changelogs/unreleased/43134-reduce-queries-pipelines-controller-show.yml b/changelogs/unreleased/43134-reduce-queries-pipelines-controller-show.yml deleted file mode 100644 index c1e9614b676..00000000000 --- a/changelogs/unreleased/43134-reduce-queries-pipelines-controller-show.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Improve performance of pipeline page by reducing DB queries -merge_request: 17168 -author: -type: performance diff --git a/changelogs/unreleased/43198-fix-settings-panel-expanding-when-fragment-hash-linked.yml b/changelogs/unreleased/43198-fix-settings-panel-expanding-when-fragment-hash-linked.yml deleted file mode 100644 index 49ba48a0fef..00000000000 --- a/changelogs/unreleased/43198-fix-settings-panel-expanding-when-fragment-hash-linked.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix settings panels not expanding when fragment hash linked -merge_request: 17074 -author: -type: fixed diff --git a/changelogs/unreleased/43201-rename-repository-submit-button-disabled.yml b/changelogs/unreleased/43201-rename-repository-submit-button-disabled.yml deleted file mode 100644 index b527000332e..00000000000 --- a/changelogs/unreleased/43201-rename-repository-submit-button-disabled.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Allows project rename after validation error -merge_request: 17150 -author: -type: fixed diff --git a/changelogs/unreleased/43261-fix-import-from-url-name-collision-active-tab.yml b/changelogs/unreleased/43261-fix-import-from-url-name-collision-active-tab.yml deleted file mode 100644 index 71073b2e214..00000000000 --- a/changelogs/unreleased/43261-fix-import-from-url-name-collision-active-tab.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Keep "Import project" tab/form active when validation fails trying to import - "Repo by URL" -merge_request: 17136 -author: -type: fixed diff --git a/changelogs/unreleased/43275-improve-variables-validation-message.yml b/changelogs/unreleased/43275-improve-variables-validation-message.yml deleted file mode 100644 index 88ef93123a0..00000000000 --- a/changelogs/unreleased/43275-improve-variables-validation-message.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Remove duplicated error message on duplicate variable validation -merge_request: 17135 -author: -type: fixed diff --git a/changelogs/unreleased/43315-gpg-popover.yml b/changelogs/unreleased/43315-gpg-popover.yml deleted file mode 100644 index 69238aa8075..00000000000 --- a/changelogs/unreleased/43315-gpg-popover.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fixes gpg popover layout -merge_request: 17323 -author: -type: fixed diff --git a/changelogs/unreleased/43334-reply-by-email-did-not-pick-up-unsubscribe-quick-action.yml b/changelogs/unreleased/43334-reply-by-email-did-not-pick-up-unsubscribe-quick-action.yml deleted file mode 100644 index 86be5ee1804..00000000000 --- a/changelogs/unreleased/43334-reply-by-email-did-not-pick-up-unsubscribe-quick-action.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix quick actions for users who cannot update issues and merge requests -merge_request: 17482 -author: -type: fixed diff --git a/changelogs/unreleased/43460-track-projects-a-user-interacted-with.yml b/changelogs/unreleased/43460-track-projects-a-user-interacted-with.yml deleted file mode 100644 index 99b6ac76a3e..00000000000 --- a/changelogs/unreleased/43460-track-projects-a-user-interacted-with.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Keep track of projects a user interacted with. -merge_request: 17327 -author: -type: other diff --git a/changelogs/unreleased/43489-display-runner-ip.yml b/changelogs/unreleased/43489-display-runner-ip.yml deleted file mode 100644 index 621c2ec709a..00000000000 --- a/changelogs/unreleased/43489-display-runner-ip.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Display Runner IP Address -merge_request: 17286 -author: -type: added diff --git a/changelogs/unreleased/43496-error-message-for-gke-clusters-persists-in-the-next-page.yml b/changelogs/unreleased/43496-error-message-for-gke-clusters-persists-in-the-next-page.yml deleted file mode 100644 index c10b0e7a3cf..00000000000 --- a/changelogs/unreleased/43496-error-message-for-gke-clusters-persists-in-the-next-page.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Do not persist Google Project verification flash errors after a page reload -merge_request: 17299 -author: -type: fixed diff --git a/changelogs/unreleased/43598-fix-duplicate-label-load-failure.yml b/changelogs/unreleased/43598-fix-duplicate-label-load-failure.yml deleted file mode 100644 index bda4ec84e5c..00000000000 --- a/changelogs/unreleased/43598-fix-duplicate-label-load-failure.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix Group labels load failure when there are duplicate labels present -merge_request: 17353 -author: -type: fixed diff --git a/changelogs/unreleased/43643-fix-mr-label-filtering.yml b/changelogs/unreleased/43643-fix-mr-label-filtering.yml deleted file mode 100644 index 32a44aef243..00000000000 --- a/changelogs/unreleased/43643-fix-mr-label-filtering.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Enable filtering MR list based on clicked label in MR sidebar -merge_request: 17390 -author: -type: fixed diff --git a/changelogs/unreleased/43780-add-a-paragraph-about-clusters-security-implications.yml b/changelogs/unreleased/43780-add-a-paragraph-about-clusters-security-implications.yml deleted file mode 100644 index 0fa21a2013c..00000000000 --- a/changelogs/unreleased/43780-add-a-paragraph-about-clusters-security-implications.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add a paragraph about security implications on Cluster's page -merge_request: 17486 -author: -type: added diff --git a/changelogs/unreleased/43786-on-the-issuable-list-add-tooltips-to-icons.yml b/changelogs/unreleased/43786-on-the-issuable-list-add-tooltips-to-icons.yml new file mode 100644 index 00000000000..19b633daace --- /dev/null +++ b/changelogs/unreleased/43786-on-the-issuable-list-add-tooltips-to-icons.yml @@ -0,0 +1,5 @@ +--- +title: Add tooltips to icons in lists of issues and merge requests +merge_request: 17700 +author: +type: changed diff --git a/changelogs/unreleased/43793-enable-privileged-mode-for-runner.yml b/changelogs/unreleased/43793-enable-privileged-mode-for-runner.yml deleted file mode 100644 index 08109632e8e..00000000000 --- a/changelogs/unreleased/43793-enable-privileged-mode-for-runner.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Enable privileged mode for GitLab Runner -merge_request: 17528 -author: -type: added diff --git a/changelogs/unreleased/43802-ensure-foreign-keys-on-clusters-applications.yml b/changelogs/unreleased/43802-ensure-foreign-keys-on-clusters-applications.yml deleted file mode 100644 index 860a8becd65..00000000000 --- a/changelogs/unreleased/43802-ensure-foreign-keys-on-clusters-applications.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Ensure foreign keys on clusters applications -merge_request: 17488 -author: -type: other diff --git a/changelogs/unreleased/43829-update-ssh-addtion-text.yml b/changelogs/unreleased/43829-update-ssh-addtion-text.yml deleted file mode 100644 index b7052bb171e..00000000000 --- a/changelogs/unreleased/43829-update-ssh-addtion-text.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Update SSH key link to include existing keys -merge_request: -author: Brendan O'Leary -type: changed diff --git a/changelogs/unreleased/43837-error-handle-in-updating-milestone-on-issue.yml b/changelogs/unreleased/43837-error-handle-in-updating-milestone-on-issue.yml deleted file mode 100644 index 526523964c3..00000000000 --- a/changelogs/unreleased/43837-error-handle-in-updating-milestone-on-issue.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Stop loading spinner on error of milestone update on issue -merge_request: 17507 -author: Takuya Noguchi -type: fixed diff --git a/changelogs/unreleased/43924-breadcrumbs-on-project-tags.yml b/changelogs/unreleased/43924-breadcrumbs-on-project-tags.yml deleted file mode 100644 index 67c223b31c5..00000000000 --- a/changelogs/unreleased/43924-breadcrumbs-on-project-tags.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Remove extra breadcrumb on tags -merge_request: 17562 -author: Takuya Noguchi -type: fixed diff --git a/changelogs/unreleased/44024-fix-table-extra-column.yml b/changelogs/unreleased/44024-fix-table-extra-column.yml deleted file mode 100644 index 92c354a0844..00000000000 --- a/changelogs/unreleased/44024-fix-table-extra-column.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix markdown table showing extra column -merge_request: 17669 -author: -type: fixed diff --git a/changelogs/unreleased/44149-issue-comment-buttons.yml b/changelogs/unreleased/44149-issue-comment-buttons.yml deleted file mode 100644 index c874c0d3d66..00000000000 --- a/changelogs/unreleased/44149-issue-comment-buttons.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix broken loading state for close issue button -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/44330-docs-for-ingress-ip.yml b/changelogs/unreleased/44330-docs-for-ingress-ip.yml deleted file mode 100644 index 3dfaea6e17e..00000000000 --- a/changelogs/unreleased/44330-docs-for-ingress-ip.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add documentation for displayed K8s Ingress IP address (#44330) -merge_request: 17836 -author: -type: other diff --git a/changelogs/unreleased/4826-create-empty-wiki-when-it-s-enabled.yml b/changelogs/unreleased/4826-create-empty-wiki-when-it-s-enabled.yml deleted file mode 100644 index c0fa8e2e377..00000000000 --- a/changelogs/unreleased/4826-create-empty-wiki-when-it-s-enabled.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Make sure wiki exists when it's enabled -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/4826-geo-wikisyncservice-attempts-to-sync-projects.yml b/changelogs/unreleased/4826-geo-wikisyncservice-attempts-to-sync-projects.yml deleted file mode 100644 index 7f1ccbfcc7e..00000000000 --- a/changelogs/unreleased/4826-geo-wikisyncservice-attempts-to-sync-projects.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Create empty wiki when import from GitLab and wiki is not there -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/4826-github-import-wiki-fix-1.yml b/changelogs/unreleased/4826-github-import-wiki-fix-1.yml deleted file mode 100644 index 69145cb6daf..00000000000 --- a/changelogs/unreleased/4826-github-import-wiki-fix-1.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: "[GitHub Import] Create an empty wiki if wiki import failed" -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/ab-44446-add-indexes-for-user-activity-queries.yml b/changelogs/unreleased/ab-44446-add-indexes-for-user-activity-queries.yml new file mode 100644 index 00000000000..0f89c06fcee --- /dev/null +++ b/changelogs/unreleased/ab-44446-add-indexes-for-user-activity-queries.yml @@ -0,0 +1,5 @@ +--- +title: Add indexes for user activity queries. +merge_request: 17890 +author: +type: performance diff --git a/changelogs/unreleased/add-indexes-to-todos-for-heavy-users-like-sean.yml b/changelogs/unreleased/add-indexes-to-todos-for-heavy-users-like-sean.yml deleted file mode 100644 index f0e5103a9d9..00000000000 --- a/changelogs/unreleased/add-indexes-to-todos-for-heavy-users-like-sean.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add partial indexes on todos to handle users with many todos -merge_request: -author: -type: performance diff --git a/changelogs/unreleased/add-query-counts-to-profiler-output.yml b/changelogs/unreleased/add-query-counts-to-profiler-output.yml new file mode 100644 index 00000000000..8a90b1cbeb0 --- /dev/null +++ b/changelogs/unreleased/add-query-counts-to-profiler-output.yml @@ -0,0 +1,5 @@ +--- +title: Add query counts to profiler output +merge_request: +author: +type: other diff --git a/changelogs/unreleased/an-network-controller-fix.yml b/changelogs/unreleased/an-network-controller-fix.yml deleted file mode 100644 index cb2c447b957..00000000000 --- a/changelogs/unreleased/an-network-controller-fix.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Prevent the graphs page from generating unnecessary Gitaly requests -merge_request: 37602 -author: -type: performance diff --git a/changelogs/unreleased/an-workhorse-3-8-0.yml b/changelogs/unreleased/an-workhorse-3-8-0.yml deleted file mode 100644 index 5e2a72e1eda..00000000000 --- a/changelogs/unreleased/an-workhorse-3-8-0.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Upgrade Workhorse to version 3.8.0 to support structured logging -merge_request: -author: -type: other diff --git a/changelogs/unreleased/api-refs-for-commit.yml b/changelogs/unreleased/api-refs-for-commit.yml deleted file mode 100644 index df8a2b0eccc..00000000000 --- a/changelogs/unreleased/api-refs-for-commit.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: 'API: Get references a commit is pushed to' -merge_request: 15026 -author: Robert Schilling -type: added diff --git a/changelogs/unreleased/asciidoc_inter_document_cross_references.yml b/changelogs/unreleased/asciidoc_inter_document_cross_references.yml deleted file mode 100644 index 34b26753312..00000000000 --- a/changelogs/unreleased/asciidoc_inter_document_cross_references.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Asciidoc now support inter-document cross references between files in repository -merge_request: 17125 -author: Turo Soisenniemi -type: changed diff --git a/changelogs/unreleased/assignees-vue-component-missing-data-container.yml b/changelogs/unreleased/assignees-vue-component-missing-data-container.yml deleted file mode 100644 index 233d983b415..00000000000 --- a/changelogs/unreleased/assignees-vue-component-missing-data-container.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add Assignees vue component missing data container -merge_request: 17426 -author: George Tsiolis -type: fixed diff --git a/changelogs/unreleased/bvl-allow-maintainer-to-push.yml b/changelogs/unreleased/bvl-allow-maintainer-to-push.yml deleted file mode 100644 index a3fefc2889a..00000000000 --- a/changelogs/unreleased/bvl-allow-maintainer-to-push.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Allow maintainers to push to forks of their projects when a merge request is open -merge_request: 17395 -author: -type: added diff --git a/changelogs/unreleased/bvl-port-of-ee-translations.yml b/changelogs/unreleased/bvl-port-of-ee-translations.yml deleted file mode 100644 index 8f232ec8da3..00000000000 --- a/changelogs/unreleased/bvl-port-of-ee-translations.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Started translation into Turkish, Indonesian and Filipino -merge_request: 17526 -author: -type: other diff --git a/changelogs/unreleased/cache-refactor.yml b/changelogs/unreleased/cache-refactor.yml deleted file mode 100644 index dec7a0392a5..00000000000 --- a/changelogs/unreleased/cache-refactor.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Cache MergeRequests can_be_resolved_in_ui? git operations -merge_request: 17589 -author: -type: performance diff --git a/changelogs/unreleased/ce-jej-github-project-service-for-ci.yml b/changelogs/unreleased/ce-jej-github-project-service-for-ci.yml deleted file mode 100644 index 6102b7ecd93..00000000000 --- a/changelogs/unreleased/ce-jej-github-project-service-for-ci.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Hook data for pipelines includes detailed_status -merge_request: 17607 -author: -type: changed diff --git a/changelogs/unreleased/ce-jej-integrations-can-hide-trigger-checkboxes.yml b/changelogs/unreleased/ce-jej-integrations-can-hide-trigger-checkboxes.yml deleted file mode 100644 index 771df06e7a6..00000000000 --- a/changelogs/unreleased/ce-jej-integrations-can-hide-trigger-checkboxes.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Avoid showing unnecessary Trigger checkboxes for project Integrations with - only one event -merge_request: 17607 -author: -type: changed diff --git a/changelogs/unreleased/change-strip-whitespace-from-username-input-42637.yml b/changelogs/unreleased/change-strip-whitespace-from-username-input-42637.yml deleted file mode 100644 index a51781396ee..00000000000 --- a/changelogs/unreleased/change-strip-whitespace-from-username-input-42637.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Remove whitespace from the username/email sign in form field -merge_request: 17020 -author: Peter lauck -type: changed diff --git a/changelogs/unreleased/discussions-api.yml b/changelogs/unreleased/discussions-api.yml deleted file mode 100644 index 110df3aa414..00000000000 --- a/changelogs/unreleased/discussions-api.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add discussions API for Issues and Snippets -merge_request: -author: -type: added diff --git a/changelogs/unreleased/dm-dont-cache-nil-root-ref.yml b/changelogs/unreleased/dm-dont-cache-nil-root-ref.yml deleted file mode 100644 index 4dab7d0ffca..00000000000 --- a/changelogs/unreleased/dm-dont-cache-nil-root-ref.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Don't cache a nil repository root ref to prevent caching issues -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/dm-escape-commit-message.yml b/changelogs/unreleased/dm-escape-commit-message.yml deleted file mode 100644 index 89af2da3484..00000000000 --- a/changelogs/unreleased/dm-escape-commit-message.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Escape HTML entities in commit messages -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/dm-go-get-api-token.yml b/changelogs/unreleased/dm-go-get-api-token.yml deleted file mode 100644 index ad9cfe05849..00000000000 --- a/changelogs/unreleased/dm-go-get-api-token.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Allow token authentication on go-get request -merge_request: -author: -type: changed diff --git a/changelogs/unreleased/dm-stuck-import-jobs-verify.yml b/changelogs/unreleased/dm-stuck-import-jobs-verify.yml deleted file mode 100644 index ed2c2d30f0d..00000000000 --- a/changelogs/unreleased/dm-stuck-import-jobs-verify.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Verify project import status again before marking as failed -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/docs-update-vue-naming-guidelines.yml b/changelogs/unreleased/docs-update-vue-naming-guidelines.yml deleted file mode 100644 index 95bfd212370..00000000000 --- a/changelogs/unreleased/docs-update-vue-naming-guidelines.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Update vue component naming guidelines -merge_request: 17018 -author: George Tsiolis -type: other diff --git a/changelogs/unreleased/dz-namespace-id-not-null.yml b/changelogs/unreleased/dz-namespace-id-not-null.yml deleted file mode 100644 index 07b32aeeb86..00000000000 --- a/changelogs/unreleased/dz-namespace-id-not-null.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add NOT NULL constraint to projects.namespace_id -merge_request: 17448 -author: -type: other diff --git a/changelogs/unreleased/dz-plugins-project-integrations.yml b/changelogs/unreleased/dz-plugins-project-integrations.yml deleted file mode 100644 index 9dbe82f9af8..00000000000 --- a/changelogs/unreleased/dz-plugins-project-integrations.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add plugins list to the system hooks page -merge_request: 17518 -author: -type: added diff --git a/changelogs/unreleased/dz-system-hooks-plugins.yml b/changelogs/unreleased/dz-system-hooks-plugins.yml deleted file mode 100644 index e6eb1dfb03b..00000000000 --- a/changelogs/unreleased/dz-system-hooks-plugins.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add ability to use external plugins as an alternative to system hooks -merge_request: 17003 -author: -type: added diff --git a/changelogs/unreleased/ee-4862-verify-file-checksums.yml b/changelogs/unreleased/ee-4862-verify-file-checksums.yml deleted file mode 100644 index 392c766ab37..00000000000 --- a/changelogs/unreleased/ee-4862-verify-file-checksums.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Foreground verification of uploads and LFS objects -merge_request: 17402 -author: -type: added diff --git a/changelogs/unreleased/feature--2848-display-time-tracking-totals-milestone-page.yml b/changelogs/unreleased/feature--2848-display-time-tracking-totals-milestone-page.yml deleted file mode 100644 index ca877d32b05..00000000000 --- a/changelogs/unreleased/feature--2848-display-time-tracking-totals-milestone-page.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: "#28481: Display time tracking totals on milestone page" -merge_request: 16753 -author: Riccardo Padovani -type: added diff --git a/changelogs/unreleased/feature--43691-count-diff-note-calendar-activity.yml b/changelogs/unreleased/feature--43691-count-diff-note-calendar-activity.yml deleted file mode 100644 index d8020592897..00000000000 --- a/changelogs/unreleased/feature--43691-count-diff-note-calendar-activity.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Count comments on diffs and discussions as contributions for the contributions calendar -merge_request: 17418 -author: Riccardo Padovani -type: fixed diff --git a/changelogs/unreleased/feature-26598-clear-button-ci-lint.yml b/changelogs/unreleased/feature-26598-clear-button-ci-lint.yml deleted file mode 100644 index fcf237f20f0..00000000000 --- a/changelogs/unreleased/feature-26598-clear-button-ci-lint.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Added clear button to ci lint editor -merge_request: -author: Michael Robinson diff --git a/changelogs/unreleased/feature-edit_pages_domain.yml b/changelogs/unreleased/feature-edit_pages_domain.yml deleted file mode 100644 index bd0af53296c..00000000000 --- a/changelogs/unreleased/feature-edit_pages_domain.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: 'Pages custom domain: allow update of key/certificate' -merge_request: 17376 -author: rfwatson -type: changed diff --git a/changelogs/unreleased/feature-gb-pipeline-variable-expressions.yml b/changelogs/unreleased/feature-gb-pipeline-variable-expressions.yml deleted file mode 100644 index 28820649af3..00000000000 --- a/changelogs/unreleased/feature-gb-pipeline-variable-expressions.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add catch-up background migration to migrate pipeline stages -merge_request: 15741 -author: -type: performance diff --git a/changelogs/unreleased/feature-include-custom-attributes-in-api.yml b/changelogs/unreleased/feature-include-custom-attributes-in-api.yml deleted file mode 100644 index f1087d7f7cc..00000000000 --- a/changelogs/unreleased/feature-include-custom-attributes-in-api.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Allow including custom attributes in API responses -merge_request: 16526 -author: Markus Koller -type: changed diff --git a/changelogs/unreleased/feature-oidc-groups-claim.yml b/changelogs/unreleased/feature-oidc-groups-claim.yml deleted file mode 100644 index bde19130114..00000000000 --- a/changelogs/unreleased/feature-oidc-groups-claim.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Add groups to OpenID Connect claims -merge_request: 16929 -author: Hassan Zamani diff --git a/changelogs/unreleased/feature-sm-add-check-sum-to-job-artifacts.yml b/changelogs/unreleased/feature-sm-add-check-sum-to-job-artifacts.yml deleted file mode 100644 index 23a870d6e9f..00000000000 --- a/changelogs/unreleased/feature-sm-add-check-sum-to-job-artifacts.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Store sha256 checksum to job artifacts -merge_request: 17354 -author: -type: performance diff --git a/changelogs/unreleased/fix-change-event-body-label-font-size.yml b/changelogs/unreleased/fix-change-event-body-label-font-size.yml deleted file mode 100644 index 3192a7bff92..00000000000 --- a/changelogs/unreleased/fix-change-event-body-label-font-size.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Apply new default and inline label design -merge_request: 16956 -author: George Tsiolis -type: changed diff --git a/changelogs/unreleased/fix-dropzone-project-show.yml b/changelogs/unreleased/fix-dropzone-project-show.yml deleted file mode 100644 index 660780812d8..00000000000 --- a/changelogs/unreleased/fix-dropzone-project-show.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix file upload on project show page -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/fix-new-project-path-input-overlapping.yml b/changelogs/unreleased/fix-new-project-path-input-overlapping.yml deleted file mode 100644 index fb33ce9437a..00000000000 --- a/changelogs/unreleased/fix-new-project-path-input-overlapping.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix new project path input overlapping -merge_request: 16755 -author: George Tsiolis -type: fixed diff --git a/changelogs/unreleased/fix-squash-with-renamed-files.yml b/changelogs/unreleased/fix-squash-with-renamed-files.yml deleted file mode 100644 index f7cd3a84367..00000000000 --- a/changelogs/unreleased/fix-squash-with-renamed-files.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix squashing when a file is renamed -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/fix-template-project-visibility.yml b/changelogs/unreleased/fix-template-project-visibility.yml deleted file mode 100644 index 6576097822b..00000000000 --- a/changelogs/unreleased/fix-template-project-visibility.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Respect description and visibility when creating project from template -merge_request: 16820 -author: George Tsiolis -type: fixed diff --git a/changelogs/unreleased/fj-28141-redirection-loop.yml b/changelogs/unreleased/fj-28141-redirection-loop.yml deleted file mode 100644 index db7e109a06e..00000000000 --- a/changelogs/unreleased/fj-28141-redirection-loop.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Removing the two factor check when the user sets a new password -merge_request: 17457 -author: -type: fixed diff --git a/changelogs/unreleased/fj-41174-projects-groups-badges-api.yml b/changelogs/unreleased/fj-41174-projects-groups-badges-api.yml deleted file mode 100644 index 7cb12e26332..00000000000 --- a/changelogs/unreleased/fj-41174-projects-groups-badges-api.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Implemented badge API endpoints -merge_request: 17082 -author: -type: added diff --git a/changelogs/unreleased/fj-42910-unauthenticated-limit-via-ssh.yml b/changelogs/unreleased/fj-42910-unauthenticated-limit-via-ssh.yml deleted file mode 100644 index cef339ef787..00000000000 --- a/changelogs/unreleased/fj-42910-unauthenticated-limit-via-ssh.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fixed bug with unauthenticated requests through git ssh -merge_request: 17149 -author: -type: fixed diff --git a/changelogs/unreleased/fl-refresh-btn.yml b/changelogs/unreleased/fl-refresh-btn.yml deleted file mode 100644 index 640fdda9ce7..00000000000 --- a/changelogs/unreleased/fl-refresh-btn.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Show loading button inline in refresh button in MR widget -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/group-label-page-breadcrumb.yml b/changelogs/unreleased/group-label-page-breadcrumb.yml deleted file mode 100644 index c6cc4618c52..00000000000 --- a/changelogs/unreleased/group-label-page-breadcrumb.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix breadcrumb on labels page for groups -merge_request: 17045 -author: Onuwa Nnachi Isaac -type: fixed diff --git a/changelogs/unreleased/ide-folder-button-path.yml b/changelogs/unreleased/ide-folder-button-path.yml new file mode 100644 index 00000000000..84a122fab75 --- /dev/null +++ b/changelogs/unreleased/ide-folder-button-path.yml @@ -0,0 +1,5 @@ +--- +title: Fixed IDE button opening the wrong URL in tree list +merge_request: +author: +type: fixed diff --git a/changelogs/unreleased/issue-39885.yml b/changelogs/unreleased/issue-39885.yml deleted file mode 100644 index 75bf9434152..00000000000 --- a/changelogs/unreleased/issue-39885.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: 'Ensure users cannot create environments with leading or trailing slashes (Fixes #39885)' -merge_request: 15273 -author: -type: fixed diff --git a/changelogs/unreleased/issue_31081.yml b/changelogs/unreleased/issue_31081.yml deleted file mode 100644 index ac547c285db..00000000000 --- a/changelogs/unreleased/issue_31081.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Use host URL to build JIRA remote link icon -merge_request: -author: -type: other diff --git a/changelogs/unreleased/issue_38337.yml b/changelogs/unreleased/issue_38337.yml deleted file mode 100644 index df65118b65c..00000000000 --- a/changelogs/unreleased/issue_38337.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add one group board to Libre -merge_request: -author: -type: added diff --git a/changelogs/unreleased/jivl-new-modal-project-labels-milestones.yml b/changelogs/unreleased/jivl-new-modal-project-labels-milestones.yml deleted file mode 100644 index 6b7e14c6cfc..00000000000 --- a/changelogs/unreleased/jivl-new-modal-project-labels-milestones.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Added new design for promotion modals -merge_request: 17197 -author: -type: other diff --git a/changelogs/unreleased/jprovazn-scoped-limit.yml b/changelogs/unreleased/jprovazn-scoped-limit.yml deleted file mode 100644 index 45724bb3479..00000000000 --- a/changelogs/unreleased/jprovazn-scoped-limit.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Optimize search queries on the search page by setting a limit for matching - records in project scope -merge_request: -author: -type: performance diff --git a/changelogs/unreleased/kp-label-select-vue.yml b/changelogs/unreleased/kp-label-select-vue.yml deleted file mode 100644 index 1f5952f2554..00000000000 --- a/changelogs/unreleased/kp-label-select-vue.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Port Labels Select dropdown to Vue -merge_request: 17411 -author: -type: other diff --git a/changelogs/unreleased/merge-requests-api-filter-by-branch.yml b/changelogs/unreleased/merge-requests-api-filter-by-branch.yml deleted file mode 100644 index 03a7e4d0f71..00000000000 --- a/changelogs/unreleased/merge-requests-api-filter-by-branch.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add support for filtering by source and target branch to merge requests API -merge_request: -author: -type: added diff --git a/changelogs/unreleased/move-email-footer-info-to-single-line.yml b/changelogs/unreleased/move-email-footer-info-to-single-line.yml new file mode 100644 index 00000000000..87ed5638056 --- /dev/null +++ b/changelogs/unreleased/move-email-footer-info-to-single-line.yml @@ -0,0 +1,5 @@ +--- +title: Move email footer info to a single line +merge_request: 17916 +author: +type: changed diff --git a/changelogs/unreleased/mr-commit-optimization.yml b/changelogs/unreleased/mr-commit-optimization.yml deleted file mode 100644 index 522d8951b18..00000000000 --- a/changelogs/unreleased/mr-commit-optimization.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Use persisted/memoized value for MRs shas instead of doing git lookups -merge_request: 17555 -author: -type: performance diff --git a/changelogs/unreleased/oauth_generic_provider.yml b/changelogs/unreleased/oauth_generic_provider.yml deleted file mode 100644 index 3b6f8b04529..00000000000 --- a/changelogs/unreleased/oauth_generic_provider.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Make oauth provider login generic -merge_request: 8809 -author: Horatiu Eugen Vlad
\ No newline at end of file diff --git a/changelogs/unreleased/osw-43951-single-batch-blob-request-to-gitaly.yml b/changelogs/unreleased/osw-43951-single-batch-blob-request-to-gitaly.yml deleted file mode 100644 index 34f834298b6..00000000000 --- a/changelogs/unreleased/osw-43951-single-batch-blob-request-to-gitaly.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Submit a single batch blob RPC to Gitaly per HTTP request when viewing diffs -merge_request: -author: -type: performance diff --git a/changelogs/unreleased/osw-stop-recalculating-merge-base-on-mr-loading.yml b/changelogs/unreleased/osw-stop-recalculating-merge-base-on-mr-loading.yml deleted file mode 100644 index 1673e1d3658..00000000000 --- a/changelogs/unreleased/osw-stop-recalculating-merge-base-on-mr-loading.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Avoid re-fetching merge-base SHA from Gitaly unnecessarily -merge_request: -author: -type: performance diff --git a/changelogs/unreleased/proper-fix-for-artifacts-service.yml b/changelogs/unreleased/proper-fix-for-artifacts-service.yml deleted file mode 100644 index e92e995dbf5..00000000000 --- a/changelogs/unreleased/proper-fix-for-artifacts-service.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add archive feature to trace -merge_request: 17314 -author: -type: added diff --git a/changelogs/unreleased/refactor-move-assignees-vue-component.yml b/changelogs/unreleased/refactor-move-assignees-vue-component.yml deleted file mode 100644 index 98cfa6b4c81..00000000000 --- a/changelogs/unreleased/refactor-move-assignees-vue-component.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Move Assignees vue component -merge_request: 16952 -author: George Tsiolis -type: performance diff --git a/changelogs/unreleased/refactor-move-board-new-issue-vue-component.yml b/changelogs/unreleased/refactor-move-board-new-issue-vue-component.yml deleted file mode 100644 index 20d05530513..00000000000 --- a/changelogs/unreleased/refactor-move-board-new-issue-vue-component.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Move BoardNewIssue vue component -merge_request: 16947 -author: George Tsiolis -type: performance diff --git a/changelogs/unreleased/refactor-move-filtered-search-vue-component.yml b/changelogs/unreleased/refactor-move-filtered-search-vue-component.yml deleted file mode 100644 index d65318d7ba1..00000000000 --- a/changelogs/unreleased/refactor-move-filtered-search-vue-component.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Move RecentSearchesDropdownContent vue component -merge_request: 16951 -author: George Tsiolis -type: performance diff --git a/changelogs/unreleased/refactor-move-issuable-time-tracker-vue-component.yml b/changelogs/unreleased/refactor-move-issuable-time-tracker-vue-component.yml deleted file mode 100644 index 5ed06c61817..00000000000 --- a/changelogs/unreleased/refactor-move-issuable-time-tracker-vue-component.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Move IssuableTimeTracker vue component -merge_request: 16948 -author: George Tsiolis -type: performance diff --git a/changelogs/unreleased/refactor-move-sidebar-assignee-vue-component.yml b/changelogs/unreleased/refactor-move-sidebar-assignee-vue-component.yml deleted file mode 100644 index e77b651363e..00000000000 --- a/changelogs/unreleased/refactor-move-sidebar-assignee-vue-component.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Move SidebarAssignees vue component -merge_request: 17398 -author: George Tsiolis -type: performance diff --git a/changelogs/unreleased/refactor-move-time-tracking-vue-components.yml b/changelogs/unreleased/refactor-move-time-tracking-vue-components.yml new file mode 100644 index 00000000000..8151655250a --- /dev/null +++ b/changelogs/unreleased/refactor-move-time-tracking-vue-components.yml @@ -0,0 +1,5 @@ +--- +title: Move TimeTrackingCollapsedState vue component +merge_request: 17399 +author: George Tsiolis +type: performance diff --git a/changelogs/unreleased/replace_redcarpet_with_cmark.yml b/changelogs/unreleased/replace_redcarpet_with_cmark.yml deleted file mode 100644 index 7ce848b0bbd..00000000000 --- a/changelogs/unreleased/replace_redcarpet_with_cmark.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add CommonMark markdown engine (experimental) -merge_request: 14835 -author: blackst0ne -type: added diff --git a/changelogs/unreleased/sh-cache-column-exists.yml b/changelogs/unreleased/sh-cache-column-exists.yml deleted file mode 100644 index 8bc648f2b32..00000000000 --- a/changelogs/unreleased/sh-cache-column-exists.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Cache column_exists? for application settings -merge_request: -author: -type: performance diff --git a/changelogs/unreleased/sh-cache-table-exists.yml b/changelogs/unreleased/sh-cache-table-exists.yml deleted file mode 100644 index 37407b2a005..00000000000 --- a/changelogs/unreleased/sh-cache-table-exists.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Cache table_exists?('application_settings') to reduce repeated schema reloads -merge_request: -author: -type: performance diff --git a/changelogs/unreleased/sh-cleanup-after-git-gc.yml b/changelogs/unreleased/sh-cleanup-after-git-gc.yml deleted file mode 100644 index 4b652f4d6ce..00000000000 --- a/changelogs/unreleased/sh-cleanup-after-git-gc.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Release libgit2 cache and open file descriptors after `git gc` run -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/sh-dashboard-sort-fix.yml b/changelogs/unreleased/sh-dashboard-sort-fix.yml deleted file mode 100644 index 6fd252f6707..00000000000 --- a/changelogs/unreleased/sh-dashboard-sort-fix.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix project dashboard showing the wrong timestamps -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/sh-fix-failure-project-destroy.yml b/changelogs/unreleased/sh-fix-failure-project-destroy.yml deleted file mode 100644 index d5f5cd3f954..00000000000 --- a/changelogs/unreleased/sh-fix-failure-project-destroy.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix "Can't modify frozen hash" error when project is destroyed -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/sh-fix-geo-error-500-gpg-commit.yml b/changelogs/unreleased/sh-fix-geo-error-500-gpg-commit.yml deleted file mode 100644 index 5b4bbe0dc7a..00000000000 --- a/changelogs/unreleased/sh-fix-geo-error-500-gpg-commit.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix Error 500 when viewing a commit with a GPG signature in Geo -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/sh-fix-issue-43871-system-hooks.yml b/changelogs/unreleased/sh-fix-issue-43871-system-hooks.yml deleted file mode 100644 index 7c7ef39cb75..00000000000 --- a/changelogs/unreleased/sh-fix-issue-43871-system-hooks.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Don't error out in system hook if user has `nil` datetime columns -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/sh-fix-otp-backup-code-invalidation.yml b/changelogs/unreleased/sh-fix-otp-backup-code-invalidation.yml deleted file mode 100644 index cedb09c9a7a..00000000000 --- a/changelogs/unreleased/sh-fix-otp-backup-code-invalidation.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Ensure that OTP backup codes are always invalidated -merge_request: -author: -type: security diff --git a/changelogs/unreleased/sh-make-prune-optional-in-git-fetch.yml b/changelogs/unreleased/sh-make-prune-optional-in-git-fetch.yml deleted file mode 100644 index e961a23a031..00000000000 --- a/changelogs/unreleased/sh-make-prune-optional-in-git-fetch.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Make --prune a configurable parameter in fetching a git remote -merge_request: -author: -type: performance diff --git a/changelogs/unreleased/sh-optimize-admin-projects-page.yml b/changelogs/unreleased/sh-optimize-admin-projects-page.yml deleted file mode 100644 index 242ea758dab..00000000000 --- a/changelogs/unreleased/sh-optimize-admin-projects-page.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix timeouts loading /admin/projects page -merge_request: -author: -type: performance diff --git a/changelogs/unreleased/tc-api-fix-expose_url.yml b/changelogs/unreleased/tc-api-fix-expose_url.yml deleted file mode 100644 index c701f64d6bf..00000000000 --- a/changelogs/unreleased/tc-api-fix-expose_url.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Ensure the API returns https links when https is configured -merge_request: 17681 -author: -type: fixed diff --git a/changelogs/unreleased/unassign-when-leaving.yml b/changelogs/unreleased/unassign-when-leaving.yml deleted file mode 100644 index c00a87b1749..00000000000 --- a/changelogs/unreleased/unassign-when-leaving.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Don't delete todos or unassign issues and MRs when a user leaves a project -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/upgrade-workhorse-4-0-0.yml b/changelogs/unreleased/upgrade-workhorse-4-0-0.yml deleted file mode 100644 index f9dbdc7fc56..00000000000 --- a/changelogs/unreleased/upgrade-workhorse-4-0-0.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Upgrade GitLab Workhorse to 4.0.0 -merge_request: -author: -type: added diff --git a/changelogs/unreleased/winh-new-modal-component.yml b/changelogs/unreleased/winh-new-modal-component.yml deleted file mode 100644 index bcc0d489c88..00000000000 --- a/changelogs/unreleased/winh-new-modal-component.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add new modal Vue component -merge_request: 17108 -author: -type: changed diff --git a/changelogs/unreleased/wip-new-mr-cmd.yml b/changelogs/unreleased/wip-new-mr-cmd.yml deleted file mode 100644 index e930758ec9d..00000000000 --- a/changelogs/unreleased/wip-new-mr-cmd.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Port /wip quick action command to Merge Request creation (on description) -merge_request: 17463 -author: Adam Pahlevi -type: added diff --git a/changelogs/unreleased/zj-move-opt-out-ruby-endpoints.yml b/changelogs/unreleased/zj-move-opt-out-ruby-endpoints.yml deleted file mode 100644 index 0ddb42bc80a..00000000000 --- a/changelogs/unreleased/zj-move-opt-out-ruby-endpoints.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Move Ruby endpoints to OPT_OUT -merge_request: -author: -type: other diff --git a/changelogs/unreleased/zj-version-string-grouping-ci.yml b/changelogs/unreleased/zj-version-string-grouping-ci.yml deleted file mode 100644 index 04ef0f65b1e..00000000000 --- a/changelogs/unreleased/zj-version-string-grouping-ci.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Allow CI/CD Jobs being grouped on version strings -merge_request: -author: -type: added diff --git a/config/initializers/ar5_batching.rb b/config/initializers/ar5_batching.rb index 6ebaf8834d2..874455ce5af 100644 --- a/config/initializers/ar5_batching.rb +++ b/config/initializers/ar5_batching.rb @@ -1,41 +1,39 @@ -# Port ActiveRecord::Relation#in_batches from ActiveRecord 5. -# https://github.com/rails/rails/blob/ac027338e4a165273607dccee49a3d38bc836794/activerecord/lib/active_record/relation/batches.rb#L184 -# TODO: this can be removed once we're using AR5. -raise "Vendored ActiveRecord 5 code! Delete #{__FILE__}!" if ActiveRecord::VERSION::MAJOR >= 5 - -module ActiveRecord - module Batches - # Differences from upstream: enumerator support was removed, and custom - # order/limit clauses are ignored without a warning. - def in_batches(of: 1000, start: nil, finish: nil, load: false) - raise "Must provide a block" unless block_given? - - relation = self.reorder(batch_order).limit(of) - relation = relation.where(arel_table[primary_key].gteq(start)) if start - relation = relation.where(arel_table[primary_key].lteq(finish)) if finish - batch_relation = relation - - loop do - if load - records = batch_relation.records - ids = records.map(&:id) - yielded_relation = self.where(primary_key => ids) - yielded_relation.load_records(records) - else - ids = batch_relation.pluck(primary_key) - yielded_relation = self.where(primary_key => ids) +# Remove this file when upgraded to rails 5.0. +unless Gitlab.rails5? + module ActiveRecord + module Batches + # Differences from upstream: enumerator support was removed, and custom + # order/limit clauses are ignored without a warning. + def in_batches(of: 1000, start: nil, finish: nil, load: false) + raise "Must provide a block" unless block_given? + + relation = self.reorder(batch_order).limit(of) + relation = relation.where(arel_table[primary_key].gteq(start)) if start + relation = relation.where(arel_table[primary_key].lteq(finish)) if finish + batch_relation = relation + + loop do + if load + records = batch_relation.records + ids = records.map(&:id) + yielded_relation = self.where(primary_key => ids) + yielded_relation.load_records(records) + else + ids = batch_relation.pluck(primary_key) + yielded_relation = self.where(primary_key => ids) + end + + break if ids.empty? + + primary_key_offset = ids.last + raise ArgumentError.new("Primary key not included in the custom select clause") unless primary_key_offset + + yield yielded_relation + + break if ids.length < of + + batch_relation = relation.where(arel_table[primary_key].gt(primary_key_offset)) end - - break if ids.empty? - - primary_key_offset = ids.last - raise ArgumentError.new("Primary key not included in the custom select clause") unless primary_key_offset - - yield yielded_relation - - break if ids.length < of - - batch_relation = relation.where(arel_table[primary_key].gt(primary_key_offset)) end end end diff --git a/config/initializers/ar5_pg_10_support.rb b/config/initializers/ar5_pg_10_support.rb index a529c74a8ce..40548290ce8 100644 --- a/config/initializers/ar5_pg_10_support.rb +++ b/config/initializers/ar5_pg_10_support.rb @@ -1,6 +1,5 @@ -raise "Vendored ActiveRecord 5 code! Delete #{__FILE__}!" if ActiveRecord::VERSION::MAJOR >= 5 - -if Gitlab::Database.postgresql? +# Remove this file when upgraded to rails 5.0. +if !Gitlab.rails5? && Gitlab::Database.postgresql? require 'active_record/connection_adapters/postgresql_adapter' require 'active_record/connection_adapters/postgresql/schema_statements' diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index f642e6d47e0..362b9cc9a88 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -219,49 +219,5 @@ Devise.setup do |config| end end - Gitlab.config.omniauth.providers.each do |provider| - provider_arguments = [] - - %w[app_id app_secret].each do |argument| - provider_arguments << provider[argument] if provider[argument] - end - - case provider['args'] - when Array - # An Array from the configuration will be expanded. - provider_arguments.concat provider['args'] - when Hash - # Add procs for handling SLO - if provider['name'] == 'cas3' - provider['args'][:on_single_sign_out] = lambda do |request| - ticket = request.params[:session_index] - raise "Service Ticket not found." unless Gitlab::Auth::OAuth::Session.valid?(:cas3, ticket) - - Gitlab::Auth::OAuth::Session.destroy(:cas3, ticket) - true - end - end - - if provider['name'] == 'authentiq' - provider['args'][:remote_sign_out_handler] = lambda do |request| - authentiq_session = request.params['sid'] - if Gitlab::Auth::OAuth::Session.valid?(:authentiq, authentiq_session) - Gitlab::Auth::OAuth::Session.destroy(:authentiq, authentiq_session) - true - else - false - end - end - end - - if provider['name'] == 'shibboleth' - provider['args'][:fail_with_empty_uid] = true - end - - # A Hash from the configuration will be passed as is. - provider_arguments << provider['args'].symbolize_keys - end - - config.omniauth provider['name'].to_sym, *provider_arguments - end + Gitlab::OmniauthInitializer.new(config).execute(Gitlab.config.omniauth.providers) end diff --git a/db/migrate/20170530130129_project_foreign_keys_with_cascading_deletes.rb b/db/migrate/20170530130129_project_foreign_keys_with_cascading_deletes.rb index af6d10b5158..1199073ed3a 100644 --- a/db/migrate/20170530130129_project_foreign_keys_with_cascading_deletes.rb +++ b/db/migrate/20170530130129_project_foreign_keys_with_cascading_deletes.rb @@ -154,7 +154,7 @@ class ProjectForeignKeysWithCascadingDeletes < ActiveRecord::Migration end def add_foreign_key_if_not_exists(source, target, column:) - return if foreign_key_exists?(source, column) + return if foreign_key_exists?(source, target, column: column) add_concurrent_foreign_key(source, target, column: column) end @@ -175,12 +175,6 @@ class ProjectForeignKeysWithCascadingDeletes < ActiveRecord::Migration rescue ArgumentError end - def foreign_key_exists?(table, column) - foreign_keys(table).any? do |key| - key.options[:column] == column.to_s - end - end - def connection # Rails memoizes connection objects, but this causes them to be shared # amongst threads; we don't want that. diff --git a/db/migrate/20170703102400_add_stage_id_foreign_key_to_builds.rb b/db/migrate/20170703102400_add_stage_id_foreign_key_to_builds.rb index 68b947583d3..a89d348b127 100644 --- a/db/migrate/20170703102400_add_stage_id_foreign_key_to_builds.rb +++ b/db/migrate/20170703102400_add_stage_id_foreign_key_to_builds.rb @@ -10,13 +10,13 @@ class AddStageIdForeignKeyToBuilds < ActiveRecord::Migration add_concurrent_index(:ci_builds, :stage_id) end - unless foreign_key_exists?(:ci_builds, :stage_id) + unless foreign_key_exists?(:ci_builds, :ci_stages, column: :stage_id) add_concurrent_foreign_key(:ci_builds, :ci_stages, column: :stage_id, on_delete: :cascade) end end def down - if foreign_key_exists?(:ci_builds, :stage_id) + if foreign_key_exists?(:ci_builds, column: :stage_id) remove_foreign_key(:ci_builds, column: :stage_id) end @@ -24,12 +24,4 @@ class AddStageIdForeignKeyToBuilds < ActiveRecord::Migration remove_concurrent_index(:ci_builds, :stage_id) end end - - private - - def foreign_key_exists?(table, column) - foreign_keys(:ci_builds).any? do |key| - key.options[:column] == column.to_s - end - end end diff --git a/db/migrate/20170713104829_add_foreign_key_to_merge_requests.rb b/db/migrate/20170713104829_add_foreign_key_to_merge_requests.rb index c25d4fd5986..c409915ceed 100644 --- a/db/migrate/20170713104829_add_foreign_key_to_merge_requests.rb +++ b/db/migrate/20170713104829_add_foreign_key_to_merge_requests.rb @@ -23,23 +23,15 @@ class AddForeignKeyToMergeRequests < ActiveRecord::Migration merge_requests.update_all(head_pipeline_id: nil) end - unless foreign_key_exists?(:merge_requests, :head_pipeline_id) + unless foreign_key_exists?(:merge_requests, column: :head_pipeline_id) add_concurrent_foreign_key(:merge_requests, :ci_pipelines, column: :head_pipeline_id, on_delete: :nullify) end end def down - if foreign_key_exists?(:merge_requests, :head_pipeline_id) + if foreign_key_exists?(:merge_requests, column: :head_pipeline_id) remove_foreign_key(:merge_requests, column: :head_pipeline_id) end end - - private - - def foreign_key_exists?(table, column) - foreign_keys(table).any? do |key| - key.options[:column] == column.to_s - end - end end diff --git a/db/migrate/20180320182229_add_indexes_for_user_activity_queries.rb b/db/migrate/20180320182229_add_indexes_for_user_activity_queries.rb new file mode 100644 index 00000000000..824bbb3ac05 --- /dev/null +++ b/db/migrate/20180320182229_add_indexes_for_user_activity_queries.rb @@ -0,0 +1,40 @@ +class AddIndexesForUserActivityQueries < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + def up + add_concurrent_index :events, [:author_id, :project_id] unless index_exists?(:events, [:author_id, :project_id]) + add_concurrent_index :user_interacted_projects, :user_id unless index_exists?(:user_interacted_projects, :user_id) + end + + def down + remove_concurrent_index :events, [:author_id, :project_id] if index_exists?(:events, [:author_id, :project_id]) + + patch_foreign_keys do + remove_concurrent_index :user_interacted_projects, :user_id if index_exists?(:user_interacted_projects, :user_id) + end + end + + private + + def patch_foreign_keys + return yield if Gitlab::Database.postgresql? + + # MySQL doesn't like to remove the index with a foreign key using it. + remove_foreign_key :user_interacted_projects, :users if fk_exists?(:user_interacted_projects, :user_id) + + yield + + # Let's re-add the foreign key using the existing index on (user_id, project_id) + add_concurrent_foreign_key :user_interacted_projects, :users, column: :user_id unless fk_exists?(:user_interacted_projects, :user_id) + end + + def fk_exists?(table, column) + foreign_keys(table).any? do |key| + key.options[:column] == column.to_s + end + end +end diff --git a/db/post_migrate/20180223124427_build_user_interacted_projects_table.rb b/db/post_migrate/20180223124427_build_user_interacted_projects_table.rb index d1a29a5c71b..9addd36dca6 100644 --- a/db/post_migrate/20180223124427_build_user_interacted_projects_table.rb +++ b/db/post_migrate/20180223124427_build_user_interacted_projects_table.rb @@ -26,11 +26,11 @@ class BuildUserInteractedProjectsTable < ActiveRecord::Migration def down execute "TRUNCATE user_interacted_projects" - if foreign_key_exists?(:user_interacted_projects, :user_id) + if foreign_key_exists?(:user_interacted_projects, :users) remove_foreign_key :user_interacted_projects, :users end - if foreign_key_exists?(:user_interacted_projects, :project_id) + if foreign_key_exists?(:user_interacted_projects, :projects) remove_foreign_key :user_interacted_projects, :projects end @@ -115,7 +115,7 @@ class BuildUserInteractedProjectsTable < ActiveRecord::Migration end def create_fk(table, target, column) - return if foreign_key_exists?(table, column) + return if foreign_key_exists?(table, target, column: column) add_foreign_key table, target, column: column, on_delete: :cascade end @@ -158,11 +158,11 @@ class BuildUserInteractedProjectsTable < ActiveRecord::Migration add_concurrent_index :user_interacted_projects, [:project_id, :user_id], unique: true, name: UNIQUE_INDEX_NAME end - unless foreign_key_exists?(:user_interacted_projects, :user_id) + unless foreign_key_exists?(:user_interacted_projects, :users, column: :user_id) add_concurrent_foreign_key :user_interacted_projects, :users, column: :user_id, on_delete: :cascade end - unless foreign_key_exists?(:user_interacted_projects, :project_id) + unless foreign_key_exists?(:user_interacted_projects, :projects, column: :project_id) add_concurrent_foreign_key :user_interacted_projects, :projects, column: :project_id, on_delete: :cascade end end diff --git a/db/schema.rb b/db/schema.rb index 3ff1a8754e2..e441ca2a1f0 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20180309160427) do +ActiveRecord::Schema.define(version: 20180320182229) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -727,6 +727,7 @@ ActiveRecord::Schema.define(version: 20180309160427) do end add_index "events", ["action"], name: "index_events_on_action", using: :btree + add_index "events", ["author_id", "project_id"], name: "index_events_on_author_id_and_project_id", using: :btree add_index "events", ["author_id"], name: "index_events_on_author_id", using: :btree add_index "events", ["project_id", "id"], name: "index_events_on_project_id_and_id", using: :btree add_index "events", ["target_type", "target_id"], name: "index_events_on_target_type_and_target_id", using: :btree @@ -1863,6 +1864,7 @@ ActiveRecord::Schema.define(version: 20180309160427) do end add_index "user_interacted_projects", ["project_id", "user_id"], name: "index_user_interacted_projects_on_project_id_and_user_id", unique: true, using: :btree + add_index "user_interacted_projects", ["user_id"], name: "index_user_interacted_projects_on_user_id", using: :btree create_table "user_synced_attributes_metadata", force: :cascade do |t| t.boolean "name_synced", default: false diff --git a/doc/ci/README.md b/doc/ci/README.md index 532ae52a184..6aa0e5885db 100644 --- a/doc/ci/README.md +++ b/doc/ci/README.md @@ -65,7 +65,8 @@ learn how to leverage its potential even more. environments and use them for different purposes like testing, building and deploying - [Job artifacts](../user/project/pipelines/job_artifacts.md) -- [Git submodules](git_submodules.md): How to run your CI jobs when Git +- [Caching dependencies](caching/index.md) +- [Git submodules](git_submodules.md) - How to run your CI jobs when Git submodules are involved - [Use SSH keys in your build environment](ssh_keys/README.md) - [Trigger pipelines through the GitLab API](triggers/README.md) diff --git a/doc/ci/caching/index.md b/doc/ci/caching/index.md new file mode 100644 index 00000000000..c4b2a25d4a8 --- /dev/null +++ b/doc/ci/caching/index.md @@ -0,0 +1,516 @@ +# Cache dependencies in GitLab CI/CD + +GitLab CI/CD provides a caching mechanism that can be used to save time +when your jobs are running. + +Caching is about speeding the time a job is executed by reusing the same +content of a previous job. It can be particularly useful when your are +developing software that depends on other libraries which are fetched via the +internet during build time. + +If caching is enabled, it's shared between pipelines and jobs by default, +starting from GitLab 9.0. + +Make sure you read the [`cache` reference](../yaml/README.md#cache) to learn +how it is defined in `.gitlab-ci.yml`. + +## Good caching practices + +We have the cache from the perspective of the developers (who consume a cache +within the job) and the cache from the perspective of the Runner. Depending on +which type of Runner you are using, cache can act differently. + +From the perspective of the developer, to ensure maximum availability of the +cache, when declaring `cache` in your jobs, use one or a mix of the following: + +- [Tag your Runners](../runners/README.md#using-tags) and use the tag on jobs + that share their cache. +- [Use sticky Runners](../runners/README.md#locking-a-specific-runner-from-being-enabled-for-other-projects) + that will be only available to a particular project. +- [Use a `key`](../yaml/README.md#cache-key) that fits your workflow (e.g., + different caches on each branch). For that, you can take advantage of the + [CI/CD predefined variables](../variables/README.md#predefined-variables-environment-variables). + +TIP: **Tip:** +Using the same Runner for your pipeline, is the most simple and efficient way to +cache files in one stage or pipeline, and pass this cache to subsequent stages +or pipelines in a guaranteed manner. + +From the perspective of the Runner, in order for cache to work effectively, one +of the following must be true: + +- Use a single Runner for all your jobs +- Use multiple Runners (in autoscale mode or not) that use + [distributed caching](https://docs.gitlab.com/runner/configuration/autoscale.html#distributed-runners-caching), + where the cache is stored in S3 buckets (like shared Runners on GitLab.com) +- Use multiple Runners (not in autoscale mode) of the same architecture that + share a common network-mounted directory (using NFS or something similar) + where the cache will be stored + +TIP: **Tip:** +Read about the [availability of the cache](#availability-of-the-cache) +to learn more about the internals and get a better idea how cache works. + +### Sharing caches across the same branch + +Define a cache with the `key: ${CI_COMMIT_REF_SLUG}` so that jobs of each +branch always use the same cache: + +```yaml +cache: + key: ${CI_COMMIT_REF_SLUG} +``` + +While this feels like it might be safe from accidentally overwriting the cache, +it means merge requests get slow first pipelines, which might be a bad +developer experience. The next time a new commit is pushed to the branch, the +cache will be re-used. + +To enable per-job and per-branch caching: + +```yaml +cache: + key: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG" +``` + +To enable per-branch and per-stage caching: + +```yaml +cache: + key: "$CI_JOB_STAGE-$CI_COMMIT_REF_SLUG" +``` + +### Sharing caches across different branches + +If the files you are caching need to be shared across all branches and all jobs, +you can use the same key for all of them: + +```yaml +cache: + key: one-key-to-rull-them-all +``` + +To share the same cache between branches, but separate them by job: + +```yaml +cache: + key: ${CI_JOB_NAME} +``` + +### Disabling cache on specific jobs + +If you have defined the cache globally, it means that each job will use the +same definition. You can override this behavior per-job, and if you want to +disable it completely, use an empty hash: + +```yaml +job: + cache: {} +``` + +For more fine tuning, read also about the +[`cache: policy`](../yaml/README.md#cache-policy). + +## Common use cases + +The most common use case of cache is to preserve contents between subsequent +runs of jobs for things like dependencies and commonly used libraries +(Nodejs packages, PHP packages, rubygems, python libraries, etc.), +so they don't have to be re-fetched from the public internet. + +NOTE: **Note:** +For more examples, check the [GitLab CI Yml](https://gitlab.com/gitlab-org/gitlab-ci-yml) +project. + +### Caching Nodejs dependencies + +Assuming your project is using [npm](https://www.npmjs.com/) or +[Yarn](https://yarnpkg.com/en/) to install the Nodejs dependencies, the +following example defines `cache` globally so that all jobs inherit it. +Nodejs modules are installed in `node_modules/` and are cached per-branch: + +```yaml +# +# https://gitlab.com/gitlab-org/gitlab-ci-yml/blob/master/Nodejs.gitlab-ci.yml +# +image: node:latest + +# Cache modules in between jobs +cache: + key: ${CI_COMMIT_REF_SLUG} + paths: + - node_modules/ + +before_script: + - npm install + +test_async: + script: + - node ./specs/start.js ./specs/async.spec.js +``` + +### Caching PHP dependencies + +Assuming your project is using [Composer](https://getcomposer.org/) to install +the PHP dependencies, the following example defines `cache` globally so that +all jobs inherit it. PHP libraries modules are installed in `vendor/` and +are cached per-branch: + +```yaml +# +# https://gitlab.com/gitlab-org/gitlab-ci-yml/blob/master/PHP.gitlab-ci.yml +# +image: php:7.2 + +# Cache libraries in between jobs +cache: + key: ${CI_COMMIT_REF_SLUG} + paths: + - vendor/ + +before_script: +# Install and run Composer +- curl --show-error --silent https://getcomposer.org/installer | php +- php composer.phar install + +test: + script: + - vendor/bin/phpunit --configuration phpunit.xml --coverage-text --colors=never +``` + +### Caching Python dependencies + +Assuming your project is using [pip](https://pip.pypa.io/en/stable/) to install +the python dependencies, the following example defines `cache` globally so that +all jobs inherit it. Python libraries are installed in a virtualenv under `venv/`, +pip's cache is defined under `.cache/pip/` and both are cached per-branch: + +```yaml +# +# https://gitlab.com/gitlab-org/gitlab-ci-yml/blob/master/Python.gitlab-ci.yml +# +image: python:latest + +# Change pip's cache directory to be inside the project directory since we can +# only cache local items. +variables: + PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache" + +# Pip's cache doesn't store the python packages +# https://pip.pypa.io/en/stable/reference/pip_install/#caching +# +# If you want to also cache the installed packages, you have to install +# them in a virtualenv and cache it as well. +cache: + paths: + - .cache/ + - venv/ + +before_script: + - python -V # Print out python version for debugging + - pip install virtualenv + - virtualenv venv + - source venv/bin/activate + +test: + script: + - python setup.py test + - pip install flake8 + - flake8 . +``` + +### Caching Ruby dependencies + +Assuming your project is using [Bundler](https://bundler.io) to install the +gem dependencies, the following example defines `cache` globally so that all +jobs inherit it. Gems are installed in `vendor/ruby/` and are cached per-branch: + +```yaml +# +# https://gitlab.com/gitlab-org/gitlab-ci-yml/blob/master/Ruby.gitlab-ci.yml +# +image: ruby:2.5 + +# Cache gems in between builds +cache: + key: ${CI_COMMIT_REF_SLUG} + paths: + - vendor/ruby + +before_script: + - ruby -v # Print out ruby version for debugging + - gem install bundler --no-ri --no-rdoc # Bundler is not installed with the image + - bundle install -j $(nproc) --path vendor # Install dependencies into ./vendor/ruby + +rspec: + script: + - rspec spec +``` + +## Availability of the cache + +Caching is an optimization, but isn't guaranteed to always work, so you need to +be prepared to regenerate any cached files in each job that needs them. + +Assuming you have properly [defined `cache` in `.gitlab-ci.yml`](../yaml/README.md#cache) +according to your workflow, the availability of the cache ultimately depends on +how the Runner has been configured (the executor type and whether different +Runners are used for passing the cache between jobs). + +### Where the caches are stored + +Since the Runner is the one responsible for storing the cache, it's essential +to know **where** it's stored. All the cache paths defined under a job in +`.gitlab-ci.yml` are archived in a single `cache.zip` file and stored in the +Runner's configured cache location. By default, they are stored locally in the +machine where the Runner is installed and depends on the type of the executor. + +| GitLab Runner executor | Default path of the cache | +| ---------------------- | ------------------------- | +| [Shell](https://docs.gitlab.com/runner/executors/shell.html) | Locally, stored under the `gitlab-runner` user's home directory: `/home/gitlab-runner/cache/<user>/<project>/<cache-key>/cache.zip`. | +| [Docker](https://docs.gitlab.com/runner/executors/docker.html) | Locally, stored under [Docker volumes](https://docs.gitlab.com/runner/executors/docker.html#the-builds-and-cache-storage): `/var/lib/docker/volumes/<volume-id>/_data/<user>/<project>/<cache-key>/cache.zip`. | +| [Docker machine](https://docs.gitlab.com/runner/executors/docker_machine.html) (autoscale Runners) | Behaves the same as the Docker executor. | + +### How archiving and extracting works + +In the most simple scenario, consider that you use only one machine where the +Runner is installed, and all jobs of your project run on the same host. + +Let's see the following example of two jobs that belong to two consecutive +stages: + +```yaml +stages: +- build +- test + +before_script: +- echo "Hello" + +job A: + stage: build + script: + - mkdir vendor/ + - echo "build" > vendor/hello.txt + cache: + key: build-cache + paths: + - vendor/ + after_script: + - echo "World" + +job B: + stage: test + script: + - cat vendor/hello.txt + cache: + key: build-cache +``` + +Here's what happens behind the scenes: + +1. Pipeline starts +1. `job A` runs +1. `before_script` is executed +1. `script` is executed +1. `after_script` is executed +1. `cache` runs and the `vendor/` directory is zipped into `cache.zip`. + This file is then saved in the directory based on the + [Runner's setting](#where-the-caches-are-stored) and the `cache: key`. +1. `job B` runs +1. The cache is extracted (if found) +1. `before_script` is executed +1. `script` is executed +1. Pipeline finishes + +By using a single Runner on a single machine, you'll not have the issue where +`job B` might execute on a Runner different from `job A`, thus guaranteeing the +cache between stages. That will only work if the build goes from stage `build` +to `test` in the same Runner/machine, otherwise, you [might not have the cache +available](#cache-mismatch). + +During the caching process, there's also a couple of things to consider: + +- If some other job, with another cache configuration had saved its + cache in the same zip file, it is overwritten. If the S3 based shared cache is + used, the file is additionally uploaded to S3 to an object based on the cache + key. So, two jobs with different paths, but the same cache key, will overwrite + their cache. +- When extracting the cache from `cache.zip`, everything in the zip file is + extracted in the job's working directory (usually the repository which is + pulled down), and the Runner doesn't mind if the archive of `job A` overwrites + things in the archive of `job B`. + +The reason why it works this way is because the cache created for one Runner +often will not be valid when used by a different one which can run on a +**different architecture** (e.g., when the cache includes binary files). And +since the different steps might be executed by Runners running on different +machines, it is a safe default. + +### Cache mismatch + +In the following table, you can see some reasons where you might hit a cache +mismatch and a few ideas how to fix it. + +| Reason of a cache mismatch | How to fix it | +| -------------------------- | ------------- | +| You use multiple standalone Runners (not in autoscale mode) attached to one project without a shared cache | Use only one Runner for your project or use multiple Runners with distributed cache enabled | +| You use Runners in autoscale mode without a distributed cache enabled | Configure the autoscale Runner to use a distributed cache | +| The machine the Runner is installed on is low on disk space or, if you've set up distributed cache, the S3 bucket where the cache is stored doesn't have enough space | Make sure you clear some space to allow new caches to be stored. Currently, there's no automatic way to do this. | +| You use the same `key` for jobs where they cache different paths. | Use different cache keys to that the cache archive is stored to a different location and doesn't overwrite wrong caches. | + +Let's explore some examples. + +--- + +Let's assume you have only one Runner assigned to your project, so the cache +will be stored in the Runner's machine by default. If two jobs, A and B, +have the same cache key, but they cache different paths, cache B would overwrite +cache A, even if their `paths` don't match: + +We want `job A` and `job B` to re-use their +cache when the pipeline is run for a second time. + +```yaml +stages: +- build +- test + +job A: + stage: build + script: make build + cache: + key: same-key + paths: + - public/ + +job B: + stage: test + script: make test + cache: + key: same-key + paths: + - vendor/ +``` + +1. `job A` runs +1. `public/` is cached as cache.zip +1. `job B` runs +1. The previous cache, if any, is unzipped +1. `vendor/` is cached as cache.zip and overwrites the previous one +1. The next time `job A` runs it will use the cache of `job B` which is different + and thus will be ineffective + +To fix that, use different `keys` for each job. + +--- + +In another case, let's assume you have more than one Runners assigned to your +project, but the distributed cache is not enabled. We want the second time the +pipeline is run, `job A` and `job B` to re-use their cache (which in this case +will be different): + +```yaml +stages: +- build +- test + +job A: + stage: build + script: build + cache: + key: keyA + paths: + - vendor/ + +job B: + stage: test + script: test + cache: + key: keyB + paths: + - vendor/ +``` + +In that case, even if the `key` is different (no fear of overwriting), you +might experience the cached files to "get cleaned" before each stage if the +jobs run on different Runners in the subsequent pipelines. + +## Clearing the cache + +GitLab Runners use [cache](../yaml/README.md#cache) to speed up the execution +of your jobs by reusing existing data. This however, can sometimes lead to an +inconsistent behavior. + +To start with a fresh copy of the cache, there are two ways to do that. + +### Clearing the cache by changing `cache:key` + +All you have to do is set a new `cache: key` in your `.gitlab-ci.yml`. In the +next run of the pipeline, the cache will be stored in a different location. + +### Clearing the cache manually + +> [Introduced](https://gitlab.com/gitlab-org/gitlab-ce/issues/41249) in GitLab 10.4. + +If you want to avoid editing `.gitlab-ci.yml`, you can easily clear the cache +via GitLab's UI. This will have an impact on all caches of your project as +name of the cache directory will be renamed by appending an integer to it +(`-1`, `-2`, etc.): + +1. Navigate to your project's **CI/CD > Pipelines** page. +1. Click on the **Clear Runner caches** to clean up the cache. +1. On the next push, your CI/CD job will use a new cache. + +Behind the scenes, this works by increasing a counter in the database, and the +value of that counter is used to create the key for the cache. After a push, a +new key is generated and the old cache is not valid anymore. + +## Cache vs artifacts + +NOTE: **Note:** +Be careful if you use cache and artifacts to store the same path in your jobs +as **caches are restored before artifacts** and the content would be overwritten. + +Don't mix the caching with passing artifacts between stages. Caching is not +designed to pass artifacts between stages. Cache is for runtime dependencies +needed to compile the project: + +- `cache` - **Use for temporary storage for project dependencies.** Not useful + for keeping intermediate build results, like `jar` or `apk` files. + Cache was designed to be used to speed up invocations of subsequent runs of a + given job, by keeping things like dependencies (e.g., npm packages, Go vendor + packages, etc.) so they don't have to be re-fetched from the public internet. + While the cache can be abused to pass intermediate build results between stages, + there may be cases where artifacts are a better fit. +- `artifacts` - **Use for stage results that will be passed between stages.** + Artifacts were designed to upload some compiled/generated bits of the build, + and they can be fetched by any number of concurrent Runners. They are + guaranteed to be available and are there to pass data between jobs. They are + also exposed to be downloaded from the UI. + +It's sometimes confusing because the name artifact sounds like something that +is only useful outside of the job, like for downloading a final image. But +artifacts are also available in between stages within a pipeline. So if you +build your application by downloading all the required modules, you might want +to declare them as artifacts so that each subsequent stage can depend on them +being there. There are some optimizations like declaring an +[expiry time](../yaml/README.md#artifacts-expire_in) so you don't keep artifacts +around too long, and using [dependencies](../yaml/README.md#dependencies) to +control exactly where artifacts are passed around. + +So, to sum up: +- Caches are disabled if not defined globally or per job (using `cache:`) +- Caches are available for all jobs in your `.gitlab-ci.yml` if enabled globally +- Caches can be used by subsequent pipelines of that very same job (a script in + a stage) in which the cache was created (if not defined globally). +- Caches are stored where the Runner is installed **and** uploaded to S3 if + [distributed cache is enabled](https://docs.gitlab.com/runner/configuration/autoscale.html#distributed-runners-caching) +- Caches defined per job are only used either a) for the next pipeline of that job, + or b) if that same cache is also defined in a subsequent job of the same pipeline +- Artifacts are disabled if not defined per job (using `artifacts:`) +- Artifacts can only be enabled per job, not globally +- Artifacts are created during a pipeline and can be used by the subsequent + jobs of that currently active pipeline +- Artifacts are always uploaded to GitLab (known as coordinator) +- Artifacts can have an expiration value for controlling disk usage (30 days by default) diff --git a/doc/ci/runners/README.md b/doc/ci/runners/README.md index 9f2538b9c9f..7a7b50b294d 100644 --- a/doc/ci/runners/README.md +++ b/doc/ci/runners/README.md @@ -146,24 +146,7 @@ To protect/unprotect Runners: ## Manually clearing the Runners cache -> [Introduced](https://gitlab.com/gitlab-org/gitlab-ce/issues/41249) in GitLab 10.4. - -GitLab Runners use [cache](../yaml/README.md#cache) to speed up the execution -of your jobs by reusing existing data. This however, can sometimes lead to an -inconsistent behavior. - -To start with a fresh copy of the cache, you can easily do it via GitLab's UI: - -1. Navigate to your project's **CI/CD > Pipelines** page. -1. Click on the **Clear Runner caches** to clean up the cache. -1. On the next push, your CI/CD job will use a new cache. - -That way, you don't have to change the [cache key](../yaml/README.md#cache-key) -in your `.gitlab-ci.yml`. - -Behind the scenes, this works by increasing a counter in the database, and the -value of that counter is used to create the key for the cache. After a push, a -new key is generated and the old cache is not valid anymore. +Read [clearing the cache](../caching/index.md#clearing-the-cache). ## How shared Runners pick jobs @@ -227,15 +210,16 @@ that it may encounter on the projects it's shared over. This would be problematic for large amounts of projects, if it wasn't for tags. By tagging a Runner for the types of jobs it can handle, you can make sure -shared Runners will only run the jobs they are equipped to run. +shared Runners will [only run the jobs they are equipped to run](../yaml/README.md#tags). For instance, at GitLab we have Runners tagged with "rails" if they contain the appropriate dependencies to run Rails test suites. ### Preventing Runners with tags from picking jobs without tags -You can configure a Runner to prevent it from picking jobs with tags when -the Runner does not have tags assigned. This setting can be enabled the first +You can configure a Runner to prevent it from picking +[jobs with tags](../yaml/README.md#tags) when the Runner does not have tags +assigned. This setting can be enabled the first time you [register a Runner][register] and can be changed afterwards under each Runner's settings. diff --git a/doc/ci/yaml/README.md b/doc/ci/yaml/README.md index accf6340398..3b9f9be2f6e 100644 --- a/doc/ci/yaml/README.md +++ b/doc/ci/yaml/README.md @@ -674,6 +674,10 @@ as Review Apps. You can see a simple example using Review Apps at by default. - From GitLab 9.2, caches are restored before [artifacts](#artifacts). +TIP: **Learn more:** +Read how caching works and find out some good practices in the +[caching dependencies documentation](../caching/index.md). + `cache` is used to specify a list of files and directories which should be cached between jobs. You can only use paths that are within the project workspace. @@ -681,35 +685,20 @@ workspace. If `cache` is defined outside the scope of jobs, it means it is set globally and all jobs will use that definition. -Cache all files in `binaries` and `.config`: - -```yaml -rspec: - script: test - cache: - paths: - - binaries/ - - .config -``` - -Cache all Git untracked files: +### `cache:paths` -```yaml -rspec: - script: test - cache: - untracked: true -``` +Use the `paths` directive to choose which files or directories will be cached. +Wildcards can be used as well. -Cache all Git untracked files and files in `binaries`: +Cache all files in `binaries` that end in `.apk` and the `.config` file: ```yaml rspec: script: test cache: - untracked: true paths: - - binaries/ + - binaries/*.apk + - .config ``` Locally defined cache overrides globally defined options. The following `rspec` @@ -723,33 +712,26 @@ cache: rspec: script: test cache: - key: rspec paths: - binaries/ ``` -Note that since cache is shared between jobs, if you're using different -paths for different jobs, you should also set a different **cache:key** -otherwise cache content can be overwritten. - -NOTE: **Note:** -The cache is provided on a best-effort basis, so don't expect that the cache -will be always present. - ### `cache:key` > Introduced in GitLab Runner v1.0.0. -The `key` directive allows you to define the affinity of caching -between jobs, allowing to have a single cache for all jobs, -cache per-job, cache per-branch or any other way that fits your needs. +Since the cache is shared between jobs, if you're using different +paths for different jobs, you should also set a different `cache:key` +otherwise cache content can be overwritten. -This way, you can fine tune caching, allowing you to cache data between -different jobs or even different branches. +The `key` directive allows you to define the affinity of caching between jobs, +allowing to have a single cache for all jobs, cache per-job, cache per-branch +or any other way that fits your workflow. This way, you can fine tune caching, +allowing you to cache data between different jobs or even different branches. The `cache:key` variable can use any of the [predefined variables](../variables/README.md), and the default key, if not set, -is set as `$CI_JOB_NAME-$CI_COMMIT_REF_NAME` which translates as "per-job and +is `$CI_JOB_NAME-$CI_COMMIT_REF_NAME` which translates as "per-job and per-branch". It is the default across the project, therefore everything is shared between pipelines and jobs running on the same branch by default. @@ -757,56 +739,56 @@ NOTE: **Note:** The `cache:key` variable cannot contain the `/` character, or the equivalent URI-encoded `%2F`; a value made only of dots (`.`, `%2E`) is also forbidden. -**Example configurations** - -To enable per-job caching: - -```yaml -cache: - key: "$CI_JOB_NAME" - untracked: true -``` - -To enable per-branch caching: +For example, to enable per-branch caching: ```yaml cache: key: "$CI_COMMIT_REF_SLUG" - untracked: true + paths: + - binaries/ ``` -To enable per-job and per-branch caching: +If you use **Windows Batch** to run your shell scripts you need to replace +`$` with `%`: ```yaml cache: - key: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG" - untracked: true + key: "%CI_JOB_STAGE%-%CI_COMMIT_REF_SLUG%" + paths: + - binaries/ ``` -To enable per-branch and per-stage caching: +If you use **Windows PowerShell** to run your shell scripts you need to replace +`$` with `$env:`: ```yaml cache: - key: "$CI_JOB_STAGE-$CI_COMMIT_REF_SLUG" - untracked: true + key: "$env:CI_JOB_STAGE-$env:CI_COMMIT_REF_SLUG" + paths: + - binaries/ ``` -If you use **Windows Batch** to run your shell scripts you need to replace -`$` with `%`: +### `cache:untracked` + +Set `untracked: true` to cache all files that are untracked in your Git +repository: ```yaml -cache: - key: "%CI_JOB_STAGE%-%CI_COMMIT_REF_SLUG%" - untracked: true +rspec: + script: test + cache: + untracked: true ``` -If you use **Windows PowerShell** to run your shell scripts you need to replace -`$` with `$env:`: +Cache all Git untracked files and files in `binaries`: ```yaml -cache: - key: "$env:CI_JOB_STAGE-$env:CI_COMMIT_REF_SLUG" - untracked: true +rspec: + script: test + cache: + untracked: true + paths: + - binaries/ ``` ### `cache:policy` diff --git a/doc/development/emails.md b/doc/development/emails.md index 677029b1295..4dbf064fd75 100644 --- a/doc/development/emails.md +++ b/doc/development/emails.md @@ -60,16 +60,10 @@ See the [Rails guides] for more info. As mentioned, the part after `+` is ignored, and this will end up in the mailbox for `gitlab-incoming@gmail.com`. -1. Uncomment the `mail_room` line in your `Procfile`: - - ```yaml - mail_room: bundle exec mail_room -q -c config/mail_room.yml - ``` - -1. Restart GitLab: +1. Run this command in the GitLab root directory to launch `mail_room`: ```sh - bundle exec foreman start + bundle exec mail_room -q -c config/mail_room.yml ``` 1. Verify that everything is configured correctly: diff --git a/doc/development/migration_style_guide.md b/doc/development/migration_style_guide.md index 243ac7f0c98..1e060ffd941 100644 --- a/doc/development/migration_style_guide.md +++ b/doc/development/migration_style_guide.md @@ -136,11 +136,14 @@ class MyMigration < ActiveRecord::Migration disable_ddl_transaction! def up - remove_concurrent_index :table_name, :column_name if index_exists?(:table_name, :column_name) + remove_concurrent_index :table_name, :column_name end end ``` +Note that it is not necessary to check if the index exists prior to +removing it. + ## Adding indexes If you need to add a unique index please keep in mind there is the possibility diff --git a/lib/api/helpers/internal_helpers.rb b/lib/api/helpers/internal_helpers.rb index 4b564cfdef2..14648588dfd 100644 --- a/lib/api/helpers/internal_helpers.rb +++ b/lib/api/helpers/internal_helpers.rb @@ -109,7 +109,7 @@ module API # Return the Gitaly Address if it is enabled def gitaly_payload(action) - return unless %w[git-receive-pack git-upload-pack].include?(action) + return unless %w[git-receive-pack git-upload-pack git-upload-archive].include?(action) { repository: repository.gitaly_repository, diff --git a/lib/gitlab/database/migration_helpers.rb b/lib/gitlab/database/migration_helpers.rb index 21287a8efd0..44ca434056f 100644 --- a/lib/gitlab/database/migration_helpers.rb +++ b/lib/gitlab/database/migration_helpers.rb @@ -59,6 +59,11 @@ module Gitlab disable_statement_timeout end + if index_exists?(table_name, column_name, options) + Rails.logger.warn "Index not created because it already exists (this may be due to an aborted migration or similar): table_name: #{table_name}, column_name: #{column_name}" + return + end + add_index(table_name, column_name, options) end @@ -83,6 +88,11 @@ module Gitlab disable_statement_timeout end + unless index_exists?(table_name, column_name, options) + Rails.logger.warn "Index not removed because it does not exist (this may be due to an aborted migration or similar): table_name: #{table_name}, column_name: #{column_name}" + return + end + remove_index(table_name, options.merge({ column: column_name })) end @@ -107,6 +117,11 @@ module Gitlab disable_statement_timeout end + unless index_exists_by_name?(table_name, index_name) + Rails.logger.warn "Index not removed because it does not exist (this may be due to an aborted migration or similar): table_name: #{table_name}, index_name: #{index_name}" + return + end + remove_index(table_name, options.merge({ name: index_name })) end @@ -140,6 +155,13 @@ module Gitlab # of PostgreSQL's "VALIDATE CONSTRAINT". As a result we'll just fall # back to the normal foreign key procedure. if Database.mysql? + if foreign_key_exists?(source, target, column: column) + Rails.logger.warn "Foreign key not created because it exists already " \ + "(this may be due to an aborted migration or similar): " \ + "source: #{source}, target: #{target}, column: #{column}" + return + end + return add_foreign_key(source, target, column: column, on_delete: on_delete) @@ -151,25 +173,43 @@ module Gitlab key_name = concurrent_foreign_key_name(source, column) - # Using NOT VALID allows us to create a key without immediately - # validating it. This means we keep the ALTER TABLE lock only for a - # short period of time. The key _is_ enforced for any newly created - # data. - execute <<-EOF.strip_heredoc - ALTER TABLE #{source} - ADD CONSTRAINT #{key_name} - FOREIGN KEY (#{column}) - REFERENCES #{target} (id) - #{on_delete ? "ON DELETE #{on_delete.upcase}" : ''} - NOT VALID; - EOF + unless foreign_key_exists?(source, target, column: column) + Rails.logger.warn "Foreign key not created because it exists already " \ + "(this may be due to an aborted migration or similar): " \ + "source: #{source}, target: #{target}, column: #{column}" + + # Using NOT VALID allows us to create a key without immediately + # validating it. This means we keep the ALTER TABLE lock only for a + # short period of time. The key _is_ enforced for any newly created + # data. + execute <<-EOF.strip_heredoc + ALTER TABLE #{source} + ADD CONSTRAINT #{key_name} + FOREIGN KEY (#{column}) + REFERENCES #{target} (id) + #{on_delete ? "ON DELETE #{on_delete.upcase}" : ''} + NOT VALID; + EOF + end # Validate the existing constraint. This can potentially take a very # long time to complete, but fortunately does not lock the source table # while running. + # + # Note this is a no-op in case the constraint is VALID already execute("ALTER TABLE #{source} VALIDATE CONSTRAINT #{key_name};") end + def foreign_key_exists?(source, target = nil, column: nil) + foreign_keys(source).any? do |key| + if column + key.options[:column].to_s == column.to_s + else + key.to_table.to_s == target.to_s + end + end + end + # Returns the name for a concurrent foreign key. # # PostgreSQL constraint names have a limit of 63 bytes. The logic used @@ -860,12 +900,6 @@ into similar problems in the future (e.g. when new tables are created). end end - def foreign_key_exists?(table, column) - foreign_keys(table).any? do |key| - key.options[:column] == column.to_s - end - end - # Rails' index_exists? doesn't work when you only give it a table and index # name. As such we have to use some extra code to check if an index exists for # a given name. diff --git a/lib/gitlab/middleware/read_only.rb b/lib/gitlab/middleware/read_only.rb index d9d5f90596f..7f63e39b3aa 100644 --- a/lib/gitlab/middleware/read_only.rb +++ b/lib/gitlab/middleware/read_only.rb @@ -13,7 +13,7 @@ module Gitlab end def call(env) - ReadOnly::Controller.new(@app, env).call + ::Gitlab::Middleware::ReadOnly::Controller.new(@app, env).call end end end diff --git a/lib/gitlab/omniauth_initializer.rb b/lib/gitlab/omniauth_initializer.rb new file mode 100644 index 00000000000..35ed3a5ac05 --- /dev/null +++ b/lib/gitlab/omniauth_initializer.rb @@ -0,0 +1,75 @@ +module Gitlab + class OmniauthInitializer + def initialize(devise_config) + @devise_config = devise_config + end + + def execute(providers) + providers.each do |provider| + add_provider(provider['name'].to_sym, *arguments_for(provider)) + end + end + + private + + def add_provider(*args) + @devise_config.omniauth(*args) + end + + def arguments_for(provider) + provider_arguments = [] + + %w[app_id app_secret].each do |argument| + provider_arguments << provider[argument] if provider[argument] + end + + case provider['args'] + when Array + # An Array from the configuration will be expanded. + provider_arguments.concat provider['args'] + when Hash + hash_arguments = provider['args'].merge(provider_defaults(provider)) + + # A Hash from the configuration will be passed as is. + provider_arguments << hash_arguments.symbolize_keys + end + + provider_arguments + end + + def provider_defaults(provider) + case provider['name'] + when 'cas3' + { on_single_sign_out: cas3_signout_handler } + when 'authentiq' + { remote_sign_out_handler: authentiq_signout_handler } + when 'shibboleth' + { fail_with_empty_uid: true } + else + {} + end + end + + def cas3_signout_handler + lambda do |request| + ticket = request.params[:session_index] + raise "Service Ticket not found." unless Gitlab::Auth::OAuth::Session.valid?(:cas3, ticket) + + Gitlab::Auth::OAuth::Session.destroy(:cas3, ticket) + true + end + end + + def authentiq_signout_handler + lambda do |request| + authentiq_session = request.params['sid'] + if Gitlab::Auth::OAuth::Session.valid?(:authentiq, authentiq_session) + Gitlab::Auth::OAuth::Session.destroy(:authentiq, authentiq_session) + true + else + false + end + end + end + end +end diff --git a/lib/gitlab/profiler.rb b/lib/gitlab/profiler.rb index 98a168b43bb..18540e64d4c 100644 --- a/lib/gitlab/profiler.rb +++ b/lib/gitlab/profiler.rb @@ -92,8 +92,8 @@ module Gitlab if type && time @load_times_by_model ||= {} - @load_times_by_model[type] ||= 0 - @load_times_by_model[type] += time.to_f + @load_times_by_model[type] ||= [] + @load_times_by_model[type] << time.to_f end super @@ -135,8 +135,12 @@ module Gitlab def self.log_load_times_by_model(logger) return unless logger.respond_to?(:load_times_by_model) - logger.load_times_by_model.to_a.sort_by(&:last).reverse.each do |(model, time)| - logger.info("#{model} total: #{time.round(2)}ms") + summarised_load_times = logger.load_times_by_model.to_a.map do |(model, times)| + [model, times.count, times.sum] + end + + summarised_load_times.sort_by(&:last).reverse.each do |(model, query_count, time)| + logger.info("#{model} total (#{query_count}): #{time.round(2)}ms") end end end diff --git a/lib/tasks/haml-lint.rake b/lib/tasks/haml-lint.rake index 5c0cc4990fc..ad2d034b0b4 100644 --- a/lib/tasks/haml-lint.rake +++ b/lib/tasks/haml-lint.rake @@ -2,14 +2,5 @@ unless Rails.env.production? require 'haml_lint/rake_task' require 'haml_lint/inline_javascript' - # Workaround for warnings from parser/current - # TODO: Remove this after we update parser gem - task :haml_lint do - require 'parser' - def Parser.warn(*args) - puts(*args) # static-analysis ignores stdout if status is 0 - end - end - HamlLint::RakeTask.new end diff --git a/spec/features/projects/tree/tree_show_spec.rb b/spec/features/projects/tree/tree_show_spec.rb index c8a17871508..c4b3fb9d171 100644 --- a/spec/features/projects/tree/tree_show_spec.rb +++ b/spec/features/projects/tree/tree_show_spec.rb @@ -25,4 +25,18 @@ feature 'Projects tree' do expect(page).to have_selector('.label-lfs', text: 'LFS') end end + + context 'web IDE', :js do + before do + visit project_tree_path(project, File.join('master', 'bar')) + + click_link 'Web IDE' + + find('.ide-file-list') + end + + it 'opens folder in IDE' do + expect(page).to have_selector('.is-open', text: 'bar') + end + end end diff --git a/spec/javascripts/notes_spec.js b/spec/javascripts/notes_spec.js index 8f317b06792..1858d6b6474 100644 --- a/spec/javascripts/notes_spec.js +++ b/spec/javascripts/notes_spec.js @@ -549,6 +549,20 @@ import timeoutPromise from './helpers/set_timeout_promise_helper'; }); }); + it('should disable the submit button when comment button is clicked', (done) => { + expect($form.find('.js-comment-submit-button').is(':disabled')).toEqual(false); + + mockNotesPost(); + $('.js-comment-button').click(); + expect($form.find('.js-comment-submit-button').is(':disabled')).toEqual(true); + + setTimeout(() => { + expect($form.find('.js-comment-submit-button').is(':disabled')).toEqual(false); + + done(); + }); + }); + it('should show actual note element when new comment is done posting', (done) => { mockNotesPost(); diff --git a/spec/javascripts/performance_bar/components/detailed_metric_spec.js b/spec/javascripts/performance_bar/components/detailed_metric_spec.js index eee0210a2a9..c4611dc7662 100644 --- a/spec/javascripts/performance_bar/components/detailed_metric_spec.js +++ b/spec/javascripts/performance_bar/components/detailed_metric_spec.js @@ -20,16 +20,8 @@ describe('detailedMetric', () => { }); }); - it('does not display details', () => { - expect(vm.$el.innerText).not.toContain('/'); - }); - - it('does not display the modal', () => { - expect(vm.$el.querySelector('.performance-bar-modal')).toBeNull(); - }); - - it('displays the metric name', () => { - expect(vm.$el.innerText).toContain('gitaly'); + it('does not render the element', () => { + expect(vm.$el.innerHTML).toEqual(undefined); }); }); diff --git a/spec/lib/gitlab/database/migration_helpers_spec.rb b/spec/lib/gitlab/database/migration_helpers_spec.rb index 1de3a14b809..a41b7f4e104 100644 --- a/spec/lib/gitlab/database/migration_helpers_spec.rb +++ b/spec/lib/gitlab/database/migration_helpers_spec.rb @@ -67,17 +67,35 @@ describe Gitlab::Database::MigrationHelpers do model.add_concurrent_index(:users, :foo, unique: true) end + + it 'does nothing if the index exists already' do + expect(model).to receive(:index_exists?) + .with(:users, :foo, { algorithm: :concurrently, unique: true }).and_return(true) + expect(model).not_to receive(:add_index) + + model.add_concurrent_index(:users, :foo, unique: true) + end end context 'using MySQL' do - it 'creates a regular index' do - expect(Gitlab::Database).to receive(:postgresql?).and_return(false) + before do + allow(Gitlab::Database).to receive(:postgresql?).and_return(false) + end + it 'creates a regular index' do expect(model).to receive(:add_index) .with(:users, :foo, {}) model.add_concurrent_index(:users, :foo) end + + it 'does nothing if the index exists already' do + expect(model).to receive(:index_exists?) + .with(:users, :foo, { unique: true }).and_return(true) + expect(model).not_to receive(:add_index) + + model.add_concurrent_index(:users, :foo, unique: true) + end end end @@ -95,6 +113,7 @@ describe Gitlab::Database::MigrationHelpers do context 'outside a transaction' do before do allow(model).to receive(:transaction_open?).and_return(false) + allow(model).to receive(:index_exists?).and_return(true) end context 'using PostgreSQL' do @@ -103,18 +122,41 @@ describe Gitlab::Database::MigrationHelpers do allow(model).to receive(:disable_statement_timeout) end - it 'removes the index concurrently by column name' do - expect(model).to receive(:remove_index) - .with(:users, { algorithm: :concurrently, column: :foo }) + describe 'by column name' do + it 'removes the index concurrently' do + expect(model).to receive(:remove_index) + .with(:users, { algorithm: :concurrently, column: :foo }) - model.remove_concurrent_index(:users, :foo) + model.remove_concurrent_index(:users, :foo) + end + + it 'does nothing if the index does not exist' do + expect(model).to receive(:index_exists?) + .with(:users, :foo, { algorithm: :concurrently, unique: true }).and_return(false) + expect(model).not_to receive(:remove_index) + + model.remove_concurrent_index(:users, :foo, unique: true) + end end - it 'removes the index concurrently by index name' do - expect(model).to receive(:remove_index) - .with(:users, { algorithm: :concurrently, name: "index_x_by_y" }) + describe 'by index name' do + before do + allow(model).to receive(:index_exists_by_name?).with(:users, "index_x_by_y").and_return(true) + end + + it 'removes the index concurrently by index name' do + expect(model).to receive(:remove_index) + .with(:users, { algorithm: :concurrently, name: "index_x_by_y" }) + + model.remove_concurrent_index_by_name(:users, "index_x_by_y") + end + + it 'does nothing if the index does not exist' do + expect(model).to receive(:index_exists_by_name?).with(:users, "index_x_by_y").and_return(false) + expect(model).not_to receive(:remove_index) - model.remove_concurrent_index_by_name(:users, "index_x_by_y") + model.remove_concurrent_index_by_name(:users, "index_x_by_y") + end end end @@ -141,6 +183,10 @@ describe Gitlab::Database::MigrationHelpers do end describe '#add_concurrent_foreign_key' do + before do + allow(model).to receive(:foreign_key_exists?).and_return(false) + end + context 'inside a transaction' do it 'raises an error' do expect(model).to receive(:transaction_open?).and_return(true) @@ -157,14 +203,23 @@ describe Gitlab::Database::MigrationHelpers do end context 'using MySQL' do - it 'creates a regular foreign key' do + before do allow(Gitlab::Database).to receive(:mysql?).and_return(true) + end + it 'creates a regular foreign key' do expect(model).to receive(:add_foreign_key) .with(:projects, :users, column: :user_id, on_delete: :cascade) model.add_concurrent_foreign_key(:projects, :users, column: :user_id) end + + it 'does not create a foreign key if it exists already' do + expect(model).to receive(:foreign_key_exists?).with(:projects, :users, column: :user_id).and_return(true) + expect(model).not_to receive(:add_foreign_key) + + model.add_concurrent_foreign_key(:projects, :users, column: :user_id) + end end context 'using PostgreSQL' do @@ -189,6 +244,14 @@ describe Gitlab::Database::MigrationHelpers do column: :user_id, on_delete: :nullify) end + + it 'does not create a foreign key if it exists already' do + expect(model).to receive(:foreign_key_exists?).with(:projects, :users, column: :user_id).and_return(true) + expect(model).not_to receive(:execute).with(/ADD CONSTRAINT/) + expect(model).to receive(:execute).with(/VALIDATE CONSTRAINT/) + + model.add_concurrent_foreign_key(:projects, :users, column: :user_id) + end end end end @@ -203,6 +266,29 @@ describe Gitlab::Database::MigrationHelpers do end end + describe '#foreign_key_exists?' do + before do + key = ActiveRecord::ConnectionAdapters::ForeignKeyDefinition.new(:projects, :users, { column: :non_standard_id }) + allow(model).to receive(:foreign_keys).with(:projects).and_return([key]) + end + + it 'finds existing foreign keys by column' do + expect(model.foreign_key_exists?(:projects, :users, column: :non_standard_id)).to be_truthy + end + + it 'finds existing foreign keys by target table only' do + expect(model.foreign_key_exists?(:projects, :users)).to be_truthy + end + + it 'compares by column name if given' do + expect(model.foreign_key_exists?(:projects, :users, column: :user_id)).to be_falsey + end + + it 'compares by target if no column given' do + expect(model.foreign_key_exists?(:projects, :other_table)).to be_falsey + end + end + describe '#disable_statement_timeout' do context 'using PostgreSQL' do it 'disables statement timeouts' do diff --git a/spec/lib/gitlab/omniauth_initializer_spec.rb b/spec/lib/gitlab/omniauth_initializer_spec.rb new file mode 100644 index 00000000000..d808b4d49e0 --- /dev/null +++ b/spec/lib/gitlab/omniauth_initializer_spec.rb @@ -0,0 +1,65 @@ +require 'spec_helper' + +describe Gitlab::OmniauthInitializer do + let(:devise_config) { class_double(Devise) } + + subject { described_class.new(devise_config) } + + describe '#execute' do + it 'configures providers from array' do + generic_config = { 'name' => 'generic' } + + expect(devise_config).to receive(:omniauth).with(:generic) + + subject.execute([generic_config]) + end + + it 'allows "args" array for app_id and app_secret' do + legacy_config = { 'name' => 'legacy', 'args' => %w(123 abc) } + + expect(devise_config).to receive(:omniauth).with(:legacy, '123', 'abc') + + subject.execute([legacy_config]) + end + + it 'passes app_id and app_secret as additional arguments' do + twitter_config = { 'name' => 'twitter', 'app_id' => '123', 'app_secret' => 'abc' } + + expect(devise_config).to receive(:omniauth).with(:twitter, '123', 'abc') + + subject.execute([twitter_config]) + end + + it 'passes "args" hash as symbolized hash argument' do + hash_config = { 'name' => 'hash', 'args' => { 'custom' => 'format' } } + + expect(devise_config).to receive(:omniauth).with(:hash, custom: 'format') + + subject.execute([hash_config]) + end + + it 'configures fail_with_empty_uid for shibboleth' do + shibboleth_config = { 'name' => 'shibboleth', 'args' => {} } + + expect(devise_config).to receive(:omniauth).with(:shibboleth, fail_with_empty_uid: true) + + subject.execute([shibboleth_config]) + end + + it 'configures remote_sign_out_handler proc for authentiq' do + authentiq_config = { 'name' => 'authentiq', 'args' => {} } + + expect(devise_config).to receive(:omniauth).with(:authentiq, remote_sign_out_handler: an_instance_of(Proc)) + + subject.execute([authentiq_config]) + end + + it 'configures on_single_sign_out proc for cas3' do + cas3_config = { 'name' => 'cas3', 'args' => {} } + + expect(devise_config).to receive(:omniauth).with(:cas3, on_single_sign_out: an_instance_of(Proc)) + + subject.execute([cas3_config]) + end + end +end diff --git a/spec/lib/gitlab/profiler_spec.rb b/spec/lib/gitlab/profiler_spec.rb index 3d5b56cd5b8..548eb28fe4d 100644 --- a/spec/lib/gitlab/profiler_spec.rb +++ b/spec/lib/gitlab/profiler_spec.rb @@ -110,8 +110,8 @@ describe Gitlab::Profiler do custom_logger.debug('User Load (1.3ms)') custom_logger.debug('Project Load (10.4ms)') - expect(custom_logger.load_times_by_model).to eq('User' => 2.5, - 'Project' => 10.4) + expect(custom_logger.load_times_by_model).to eq('User' => [1.2, 1.3], + 'Project' => [10.4]) end it 'logs the backtrace, ignoring lines as appropriate' do @@ -164,4 +164,24 @@ describe Gitlab::Profiler do end end end + + describe '.log_load_times_by_model' do + it 'logs the model, query count, and time by slowest first' do + expect(null_logger).to receive(:load_times_by_model).and_return( + 'User' => [1.2, 1.3], + 'Project' => [10.4] + ) + + expect(null_logger).to receive(:info).with('Project total (1): 10.4ms') + expect(null_logger).to receive(:info).with('User total (2): 2.5ms') + + described_class.log_load_times_by_model(null_logger) + end + + it 'does nothing when called with a logger that does not have load times' do + expect(null_logger).not_to receive(:info) + + expect(described_class.log_load_times_by_model(null_logger)).to be_nil + end + end end diff --git a/spec/requests/api/internal_spec.rb b/spec/requests/api/internal_spec.rb index ca0aac87ba9..3cb90a1b8ef 100644 --- a/spec/requests/api/internal_spec.rb +++ b/spec/requests/api/internal_spec.rb @@ -447,6 +447,12 @@ describe API::Internal do expect(response).to have_gitlab_http_status(200) expect(json_response["status"]).to be_truthy + expect(json_response["gitaly"]).not_to be_nil + expect(json_response["gitaly"]["repository"]).not_to be_nil + expect(json_response["gitaly"]["repository"]["storage_name"]).to eq(project.repository.gitaly_repository.storage_name) + expect(json_response["gitaly"]["repository"]["relative_path"]).to eq(project.repository.gitaly_repository.relative_path) + expect(json_response["gitaly"]["address"]).to eq(Gitlab::GitalyClient.address(project.repository_storage)) + expect(json_response["gitaly"]["token"]).to eq(Gitlab::GitalyClient.token(project.repository_storage)) end end |