diff options
author | Alex Hanselka <alex@gitlab.com> | 2018-12-12 05:00:10 +0300 |
---|---|---|
committer | Alex Hanselka <alex@gitlab.com> | 2018-12-12 05:00:10 +0300 |
commit | 3ad71bd5e0314ba3dcdf54d33eac349018e17204 (patch) | |
tree | 3cf14bb01923b8a494b909b50b23f637f3f0e4ef | |
parent | 335694861716888672a16868884b311109956b3e (diff) | |
parent | 63acce291a7c588da2252f980aa660cbf5f7b65c (diff) |
Merge branch '11-6-stable-prepare-rc6' into '11-6-stable'
Prepare 11.6 RC6 release
See merge request gitlab-org/gitlab-ce!23749
61 files changed, 775 insertions, 367 deletions
diff --git a/app/assets/javascripts/notes/stores/mutations.js b/app/assets/javascripts/notes/stores/mutations.js index bea396e5bb6..dfce698e56f 100644 --- a/app/assets/javascripts/notes/stores/mutations.js +++ b/app/assets/javascripts/notes/stores/mutations.js @@ -245,7 +245,7 @@ export default { discussion => !discussion.individual_note && discussion.resolvable && - discussion.notes.some(note => !note.resolved), + discussion.notes.some(note => note.resolvable && !note.resolved), ).length; state.hasUnresolvedDiscussions = state.unresolvedDiscussionsCount > 1; }, diff --git a/app/controllers/clusters/clusters_controller.rb b/app/controllers/clusters/clusters_controller.rb index 2e9c77ae55c..9aa8b758539 100644 --- a/app/controllers/clusters/clusters_controller.rb +++ b/app/controllers/clusters/clusters_controller.rb @@ -181,15 +181,15 @@ class Clusters::ClustersController < Clusters::BaseController end def gcp_cluster - @gcp_cluster = ::Clusters::Cluster.new.tap do |cluster| - cluster.build_provider_gcp - end.present(current_user: current_user) + cluster = Clusters::BuildService.new(clusterable.subject).execute + cluster.build_provider_gcp + @gcp_cluster = cluster.present(current_user: current_user) end def user_cluster - @user_cluster = ::Clusters::Cluster.new.tap do |cluster| - cluster.build_platform_kubernetes - end.present(current_user: current_user) + cluster = Clusters::BuildService.new(clusterable.subject).execute + cluster.build_platform_kubernetes + @user_cluster = cluster.present(current_user: current_user) end def validate_gcp_token diff --git a/app/mailers/notify.rb b/app/mailers/notify.rb index 662f3e00047..6d86b60c50c 100644 --- a/app/mailers/notify.rb +++ b/app/mailers/notify.rb @@ -128,7 +128,7 @@ class Notify < BaseMailer address.display_name = reply_display_name(model) end - fallback_reply_message_id = "<reply-#{reply_key}@#{Gitlab.config.gitlab.host}>".freeze + fallback_reply_message_id = "<reply-#{reply_key}@#{Gitlab.config.gitlab.host}>" headers['References'] ||= [] headers['References'].unshift(fallback_reply_message_id) @@ -166,7 +166,7 @@ class Notify < BaseMailer headers['In-Reply-To'] = message_id(model) headers['References'] = [message_id(model)] - headers[:subject]&.prepend('Re: ') + headers[:subject] = "Re: #{headers[:subject]}" if headers[:subject] mail_thread(model, headers) end @@ -178,7 +178,7 @@ class Notify < BaseMailer headers['X-GitLab-Discussion-ID'] = note.discussion.id if note.part_of_discussion? - headers[:subject]&.prepend('Re: ') + headers[:subject] = "Re: #{headers[:subject]}" if headers[:subject] mail_thread(model, headers) end diff --git a/app/models/broadcast_message.rb b/app/models/broadcast_message.rb index baf8adb318b..277f7c2717c 100644 --- a/app/models/broadcast_message.rb +++ b/app/models/broadcast_message.rb @@ -16,14 +16,20 @@ class BroadcastMessage < ActiveRecord::Base default_value_for :color, '#E75E40' default_value_for :font, '#FFFFFF' - CACHE_KEY = 'broadcast_message_current'.freeze + CACHE_KEY = 'broadcast_message_current_json'.freeze + LEGACY_CACHE_KEY = 'broadcast_message_current'.freeze after_commit :flush_redis_cache def self.current - messages = Rails.cache.fetch(CACHE_KEY, expires_in: cache_expires_in) { current_and_future_messages.to_a } + raw_messages = Rails.cache.fetch(CACHE_KEY, expires_in: cache_expires_in) do + remove_legacy_cache_key + current_and_future_messages.to_json + end - return messages if messages.empty? + messages = decode_messages(raw_messages) + + return [] unless messages&.present? now_or_future = messages.select(&:now_or_future?) @@ -34,6 +40,27 @@ class BroadcastMessage < ActiveRecord::Base now_or_future.select(&:now?) end + def self.decode_messages(raw_messages) + return unless raw_messages&.present? + + message_list = ActiveSupport::JSON.decode(raw_messages) + + return unless message_list.is_a?(Array) + + valid_attr = BroadcastMessage.attribute_names + + message_list.map do |raw| + BroadcastMessage.new(raw) if valid_cache_entry?(raw, valid_attr) + end.compact + rescue ActiveSupport::JSON.parse_error + end + + def self.valid_cache_entry?(raw, valid_attr) + return false unless raw.is_a?(Hash) + + (raw.keys - valid_attr).empty? + end + def self.current_and_future_messages where('ends_at > :now', now: Time.zone.now).order_id_asc end @@ -42,6 +69,14 @@ class BroadcastMessage < ActiveRecord::Base nil end + # This can be removed in GitLab 12.0+ + # The old cache key had an indefinite lifetime, and in an HA + # environment a one-shot migration would not work because the cache + # would be repopulated by a node that has not been upgraded. + def self.remove_legacy_cache_key + Rails.cache.delete(LEGACY_CACHE_KEY) + end + def active? started? && !ended? end @@ -68,5 +103,6 @@ class BroadcastMessage < ActiveRecord::Base def flush_redis_cache Rails.cache.delete(CACHE_KEY) + self.class.remove_legacy_cache_key end end diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 861211ffc0a..77e48ce11e8 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -978,6 +978,7 @@ class MergeRequest < ActiveRecord::Base def mergeable_ci_state? return true unless project.only_allow_merge_if_pipeline_succeeds? + return true unless head_pipeline actual_head_pipeline&.success? || actual_head_pipeline&.skipped? end diff --git a/app/services/clusters/build_service.rb b/app/services/clusters/build_service.rb new file mode 100644 index 00000000000..8de73831164 --- /dev/null +++ b/app/services/clusters/build_service.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true +module Clusters + class BuildService + def initialize(subject) + @subject = subject + end + + def execute + ::Clusters::Cluster.new.tap do |cluster| + case @subject + when ::Project + cluster.cluster_type = :project_type + when ::Group + cluster.cluster_type = :group_type + else + raise NotImplementedError + end + end + end + end +end diff --git a/app/views/projects/buttons/_clone.html.haml b/app/views/projects/buttons/_clone.html.haml index d82a3dd70f9..d453a3a9dac 100644 --- a/app/views/projects/buttons/_clone.html.haml +++ b/app/views/projects/buttons/_clone.html.haml @@ -10,12 +10,12 @@ %span.append-right-4.js-clone-dropdown-label = _('Clone') = sprite_icon("arrow-down", css_class: "icon") - %form.p-3.dropdown-menu.dropdown-menu-right.dropdown-menu-large.dropdown-menu-selectable.clone-options-dropdown + %form.p-3.dropdown-menu.dropdown-menu-right.dropdown-menu-large.dropdown-menu-selectable.clone-options-dropdown.qa-clone-options %li.pb-2 %label.label-bold = _('Clone with SSH') .input-group - = text_field_tag :ssh_project_clone, project.ssh_url_to_repo, class: "js-select-on-focus form-control", readonly: true, aria: { label: 'Project clone URL' } + = text_field_tag :ssh_project_clone, project.ssh_url_to_repo, class: "js-select-on-focus form-control qa-ssh-clone-url", readonly: true, aria: { label: 'Project clone URL' } .input-group-append = clipboard_button(target: '#ssh_project_clone', title: _("Copy URL to clipboard"), class: "input-group-text btn-default btn-clipboard") = render_if_exists 'projects/buttons/geo' @@ -23,7 +23,7 @@ %label.label-bold = _('Clone with %{http_label}') % { http_label: gitlab_config.protocol.upcase } .input-group - = text_field_tag :http_project_clone, project.http_url_to_repo, class: "js-select-on-focus form-control", readonly: true, aria: { label: 'Project clone URL' } + = text_field_tag :http_project_clone, project.http_url_to_repo, class: "js-select-on-focus form-control qa-http-clone-url", readonly: true, aria: { label: 'Project clone URL' } .input-group-append = clipboard_button(target: '#http_project_clone', title: _("Copy URL to clipboard"), class: "input-group-text btn-default btn-clipboard") = render_if_exists 'projects/buttons/geo' diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml index aa690b12eb7..081990ac9b7 100644 --- a/app/views/projects/empty.html.haml +++ b/app/views/projects/empty.html.haml @@ -32,7 +32,7 @@ .prepend-top-20 %nav.project-buttons - .scrolling-tabs-container.inner-page-scroll-tabs.is-smaller + .scrolling-tabs-container.inner-page-scroll-tabs.is-smaller.qa-quick-actions .fade-left= icon('angle-left') .fade-right= icon('angle-right') .nav-links.scrolling-tabs.quick-links diff --git a/app/views/projects/tree/_tree_header.html.haml b/app/views/projects/tree/_tree_header.html.haml index a89df6adfb3..4e9a119ac66 100644 --- a/app/views/projects/tree/_tree_header.html.haml +++ b/app/views/projects/tree/_tree_header.html.haml @@ -20,7 +20,7 @@ - if can_collaborate || can_create_mr_from_fork %li.breadcrumb-item - %a.btn.add-to-tree{ addtotree_toggle_attributes } + %a.btn.add-to-tree.qa-add-to-tree{ addtotree_toggle_attributes } = sprite_icon('plus', size: 16, css_class: 'float-left') = sprite_icon('arrow-down', size: 16, css_class: 'float-left') - if on_top_of_branch? @@ -30,7 +30,7 @@ %li.dropdown-header #{ _('This directory') } %li - = link_to project_new_blob_path(@project, @id) do + = link_to project_new_blob_path(@project, @id), class: 'qa-new-file-option' do #{ _('New file') } %li = link_to '#modal-upload-blob', { 'data-target' => '#modal-upload-blob', 'data-toggle' => 'modal' } do diff --git a/changelogs/unreleased/28682-can-merge-branch-before-build-is-started.yml b/changelogs/unreleased/28682-can-merge-branch-before-build-is-started.yml deleted file mode 100644 index 5ffd93e098f..00000000000 --- a/changelogs/unreleased/28682-can-merge-branch-before-build-is-started.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Strictly require a pipeline to merge. -merge_request: 22911 -author: -type: changed diff --git a/changelogs/unreleased/55104-frozenerror-can-t-modify-frozen-string.yml b/changelogs/unreleased/55104-frozenerror-can-t-modify-frozen-string.yml new file mode 100644 index 00000000000..994859b1d1d --- /dev/null +++ b/changelogs/unreleased/55104-frozenerror-can-t-modify-frozen-string.yml @@ -0,0 +1,5 @@ +--- +title: Fix a frozen string error in app/mailers/notify.rb +merge_request: 23683 +author: +type: fixed diff --git a/changelogs/unreleased/55116-runtimeerror-can-t-modify-frozen-string.yml b/changelogs/unreleased/55116-runtimeerror-can-t-modify-frozen-string.yml new file mode 100644 index 00000000000..a98e70465b2 --- /dev/null +++ b/changelogs/unreleased/55116-runtimeerror-can-t-modify-frozen-string.yml @@ -0,0 +1,5 @@ +--- +title: Fix a frozen string error in lib/gitlab/utils.rb +merge_request: 23690 +author: +type: fixed diff --git a/changelogs/unreleased/55138-fix-mr-discussions-count.yml b/changelogs/unreleased/55138-fix-mr-discussions-count.yml new file mode 100644 index 00000000000..667e9b971d8 --- /dev/null +++ b/changelogs/unreleased/55138-fix-mr-discussions-count.yml @@ -0,0 +1,5 @@ +--- +title: Fix MR resolved discussion counts being too low +merge_request: 23710 +author: +type: fixed diff --git a/changelogs/unreleased/55183-frozenerror-can-t-modify-frozen-string-in-app-mailers-notify-rb.yml b/changelogs/unreleased/55183-frozenerror-can-t-modify-frozen-string-in-app-mailers-notify-rb.yml new file mode 100644 index 00000000000..685a8309c72 --- /dev/null +++ b/changelogs/unreleased/55183-frozenerror-can-t-modify-frozen-string-in-app-mailers-notify-rb.yml @@ -0,0 +1,5 @@ +--- +title: Fix a potential frozen string error in app/mailers/notify.rb +merge_request: 23728 +author: +type: fixed diff --git a/changelogs/unreleased/sh-ignore-arrays-url-sanitizer.yml b/changelogs/unreleased/sh-ignore-arrays-url-sanitizer.yml new file mode 100644 index 00000000000..c010bd1f540 --- /dev/null +++ b/changelogs/unreleased/sh-ignore-arrays-url-sanitizer.yml @@ -0,0 +1,5 @@ +--- +title: Only allow strings in URL::Sanitizer.valid? +merge_request: 23675 +author: +type: fixed diff --git a/changelogs/unreleased/sh-json-serialize-broadcast-messages.yml b/changelogs/unreleased/sh-json-serialize-broadcast-messages.yml new file mode 100644 index 00000000000..e8bee64f780 --- /dev/null +++ b/changelogs/unreleased/sh-json-serialize-broadcast-messages.yml @@ -0,0 +1,5 @@ +--- +title: Avoid caching BroadcastMessage as an ActiveRecord object +merge_request: 23662 +author: +type: fixed diff --git a/doc/user/project/issues/img/similar_issues.png b/doc/user/project/issues/img/similar_issues.png Binary files differnew file mode 100644 index 00000000000..153430d4be7 --- /dev/null +++ b/doc/user/project/issues/img/similar_issues.png diff --git a/doc/user/project/issues/index.md b/doc/user/project/issues/index.md index d71273ba970..200b3a642a1 100644 --- a/doc/user/project/issues/index.md +++ b/doc/user/project/issues/index.md @@ -155,3 +155,7 @@ Read through the [API documentation](../../../api/issues.md). ### Bulk editing issues Find out about [bulk editing issues](../../project/bulk_editing.md). + +### Similar issues + +Find out about [similar issues](similar_issues.md). diff --git a/doc/user/project/issues/similar_issues.md b/doc/user/project/issues/similar_issues.md new file mode 100644 index 00000000000..e90ecd88ec6 --- /dev/null +++ b/doc/user/project/issues/similar_issues.md @@ -0,0 +1,16 @@ +# Similar issues + +> [Introduced][ce-22866] in GitLab 11.6. + +Similar issues suggests issues that are similar when new issues are being created. +This features requires [GraphQL] to be enabled. + +![Similar issues](img/similar_issues.png) + +You can see the similar issues when typing in the title in the new issue form. +This searches both titles and descriptions across all issues the user has access +to in the current project. It then displays the first 5 issues sorted by most +recently updated. + +[GraphQL]: ../../../api/graphql/index.md +[ce-22866]: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/22866 diff --git a/lib/gitlab/checks/diff_check.rb b/lib/gitlab/checks/diff_check.rb index 49d361fcef7..8ee345ab45a 100644 --- a/lib/gitlab/checks/diff_check.rb +++ b/lib/gitlab/checks/diff_check.rb @@ -11,6 +11,7 @@ module Gitlab }.freeze def validate! + return if deletion? || newrev.nil? return unless should_run_diff_validations? return if commits.empty? return unless uses_raw_delta_validations? @@ -28,7 +29,7 @@ module Gitlab private def should_run_diff_validations? - newrev && oldrev && !deletion? && validate_lfs_file_locks? + validate_lfs_file_locks? end def validate_lfs_file_locks? diff --git a/lib/gitlab/url_sanitizer.rb b/lib/gitlab/url_sanitizer.rb index 035268bc4f2..880712de5fe 100644 --- a/lib/gitlab/url_sanitizer.rb +++ b/lib/gitlab/url_sanitizer.rb @@ -14,6 +14,7 @@ module Gitlab def self.valid?(url) return false unless url.present? + return false unless url.is_a?(String) uri = Addressable::URI.parse(url.strip) diff --git a/lib/gitlab/utils.rb b/lib/gitlab/utils.rb index 26fc56227a2..a81cee0d6d2 100644 --- a/lib/gitlab/utils.rb +++ b/lib/gitlab/utils.rb @@ -60,7 +60,7 @@ module Gitlab # Converts newlines into HTML line break elements def nlbr(str) - ActionView::Base.full_sanitizer.sanitize(str, tags: []).gsub(/\r?\n/, '<br>').html_safe + ActionView::Base.full_sanitizer.sanitize(+str, tags: []).gsub(/\r?\n/, '<br>').html_safe end def remove_line_breaks(str) @@ -273,6 +273,7 @@ module QA # module Component autoload :ClonePanel, 'qa/page/component/clone_panel' + autoload :LegacyClonePanel, 'qa/page/component/legacy_clone_panel' autoload :Dropzone, 'qa/page/component/dropzone' autoload :GroupsFilter, 'qa/page/component/groups_filter' autoload :Select2, 'qa/page/component/select2' diff --git a/qa/qa/page/base.rb b/qa/qa/page/base.rb index f4bba3c9560..88ade66f47d 100644 --- a/qa/qa/page/base.rb +++ b/qa/qa/page/base.rb @@ -132,6 +132,10 @@ module QA Page::Element.new(name).selector_css end + def click_link_with_text(text) + click_link text + end + def self.path raise NotImplementedError end diff --git a/qa/qa/page/component/clone_panel.rb b/qa/qa/page/component/clone_panel.rb index 94e761b0e0c..d37b63c716a 100644 --- a/qa/qa/page/component/clone_panel.rb +++ b/qa/qa/page/component/clone_panel.rb @@ -5,26 +5,20 @@ module QA module Component module ClonePanel def self.included(base) - base.view 'app/views/shared/_clone_panel.html.haml' do + base.view 'app/views/projects/buttons/_clone.html.haml' do element :clone_dropdown - element :clone_options_dropdown, '.clone-options-dropdown' # rubocop:disable QA/ElementWithPattern - element :project_repository_location, 'text_field_tag :project_clone' # rubocop:disable QA/ElementWithPattern + element :clone_options + element :ssh_clone_url + element :http_clone_url end end - def choose_repository_clone_http - choose_repository_clone('HTTP', 'http') + def repository_clone_http_location + repository_clone_location(:http_clone_url) end - def choose_repository_clone_ssh - # It's not always beginning with ssh:// so detecting with @ - # would be more reliable because ssh would always contain it. - # We can't use .git because HTTP also contain that part. - choose_repository_clone('SSH', '@') - end - - def repository_location - Git::Location.new(find('#project_clone').value) + def repository_clone_ssh_location + repository_clone_location(:ssh_clone_url) end def wait_for_push @@ -34,16 +28,13 @@ module QA private - def choose_repository_clone(kind, detect_text) + def repository_clone_location(kind) wait(reload: false) do click_element :clone_dropdown - page.within('.clone-options-dropdown') do - click_link(kind) + within_element :clone_options do + Git::Location.new(find_element(kind).value) end - - # Ensure git clone textbox was updated - repository_location.git_uri.include?(detect_text) end end end diff --git a/qa/qa/page/component/legacy_clone_panel.rb b/qa/qa/page/component/legacy_clone_panel.rb new file mode 100644 index 00000000000..99132190f3f --- /dev/null +++ b/qa/qa/page/component/legacy_clone_panel.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +module QA + module Page + module Component + module LegacyClonePanel + def self.included(base) + base.view 'app/views/shared/_clone_panel.html.haml' do + element :clone_dropdown + element :clone_options_dropdown, '.clone-options-dropdown' # rubocop:disable QA/ElementWithPattern + element :project_repository_location, 'text_field_tag :project_clone' # rubocop:disable QA/ElementWithPattern + end + end + + def choose_repository_clone_http + choose_repository_clone('HTTP', 'http') + end + + def choose_repository_clone_ssh + # It's not always beginning with ssh:// so detecting with @ + # would be more reliable because ssh would always contain it. + # We can't use .git because HTTP also contain that part. + choose_repository_clone('SSH', '@') + end + + def repository_location + Git::Location.new(find('#project_clone').value) + end + + def wait_for_push + sleep 5 + refresh + end + + private + + def choose_repository_clone(kind, detect_text) + wait(reload: false) do + click_element :clone_dropdown + + page.within('.clone-options-dropdown') do + click_link(kind) + end + + # Ensure git clone textbox was updated + repository_location.git_uri.include?(detect_text) + end + end + end + end + end +end diff --git a/qa/qa/page/project/menu.rb b/qa/qa/page/project/menu.rb index cb4a10e1b6a..835e1ed00b5 100644 --- a/qa/qa/page/project/menu.rb +++ b/qa/qa/page/project/menu.rb @@ -29,11 +29,9 @@ module QA element :fly_out, "classList.add('fly-out-list')" # rubocop:disable QA/ElementWithPattern end - def click_repository_settings - hover_settings do - within_submenu do - click_link('Repository') - end + def click_ci_cd_pipelines + within_sidebar do + click_element :link_pipelines end end @@ -45,11 +43,9 @@ module QA end end - def click_operations_environments - hover_operations do - within_submenu do - click_element(:operations_environments_link) - end + def click_issues + within_sidebar do + click_link('Issues') end end @@ -61,61 +57,71 @@ module QA end end - def click_operations_kubernetes + def click_merge_requests + within_sidebar do + click_link('Merge Requests') + end + end + + def click_operations_environments hover_operations do within_submenu do - click_link('Kubernetes') + click_element(:operations_environments_link) end end end - def click_ci_cd_pipelines - within_sidebar do - click_element :link_pipelines + def click_operations_kubernetes + hover_operations do + within_submenu do + click_link('Kubernetes') + end end end - def go_to_settings + def click_milestones within_sidebar do - click_on 'Settings' + click_element :milestones_link end end - def click_issues + def click_repository within_sidebar do - click_link('Issues') + click_link('Repository') end end - def go_to_labels - hover_issues do + def click_repository_settings + hover_settings do within_submenu do - click_element(:labels_link) + click_link('Repository') end end end - def click_merge_requests + def click_wiki within_sidebar do - click_link('Merge Requests') + click_link('Wiki') end end - def click_milestones + def go_to_activity within_sidebar do - click_element :milestones_link + click_on 'Activity' end end - def click_wiki - within_sidebar do - click_link('Wiki') + def go_to_labels + hover_issues do + within_submenu do + click_element(:labels_link) + end end end - def click_repository + def go_to_settings within_sidebar do - click_link('Repository') + click_on 'Settings' end end @@ -129,17 +135,17 @@ module QA end end - def hover_settings + def hover_operations within_sidebar do - find('.qa-settings-item').hover + find('.shortcuts-operations').hover yield end end - def hover_operations + def hover_settings within_sidebar do - find('.shortcuts-operations').hover + find('.qa-settings-item').hover yield end @@ -151,12 +157,6 @@ module QA end end - def go_to_activity - within_sidebar do - click_on 'Activity' - end - end - def within_submenu page.within('.fly-out-list') do yield diff --git a/qa/qa/page/project/show.rb b/qa/qa/page/project/show.rb index d6dddf03ffb..99d849db439 100644 --- a/qa/qa/page/project/show.rb +++ b/qa/qa/page/project/show.rb @@ -6,6 +6,11 @@ module QA class Show < Page::Base include Page::Component::ClonePanel + view 'app/views/layouts/header/_new_dropdown.haml' do + element :new_menu_toggle + element :new_issue_link, "link_to _('New issue'), new_project_issue_path(@project)" # rubocop:disable QA/ElementWithPattern + end + view 'app/views/projects/_last_push.html.haml' do element :create_merge_request end @@ -14,14 +19,12 @@ module QA element :project_name end - view 'app/views/layouts/header/_new_dropdown.haml' do - element :new_menu_toggle - element :new_issue_link, "link_to _('New issue'), new_project_issue_path(@project)" # rubocop:disable QA/ElementWithPattern + view 'app/views/projects/_files.html.haml' do + element :tree_holder, '.tree-holder' # rubocop:disable QA/ElementWithPattern end - view 'app/views/shared/_ref_switcher.html.haml' do - element :branches_select - element :branches_dropdown + view 'app/views/projects/buttons/_dropdown.html.haml' do + element :create_new_dropdown end view 'app/views/projects/buttons/_fork.html.haml' do @@ -29,44 +32,50 @@ module QA element :fork_link, "link_to new_project_fork_path(@project)" # rubocop:disable QA/ElementWithPattern end - view 'app/views/projects/_files.html.haml' do - element :tree_holder, '.tree-holder' # rubocop:disable QA/ElementWithPattern + view 'app/views/projects/empty.html.haml' do + element :quick_actions end - view 'app/views/projects/buttons/_dropdown.html.haml' do - element :create_new_dropdown - element :new_file_option + view 'app/views/projects/tree/_tree_content.html.haml' do + element :file_tree end view 'app/views/projects/tree/_tree_header.html.haml' do + element :add_to_tree + element :new_file_option element :web_ide_button end - view 'app/views/projects/tree/_tree_content.html.haml' do - element :file_tree + view 'app/views/shared/_ref_switcher.html.haml' do + element :branches_select + element :branches_dropdown end - def project_name - find('.qa-project-name').text + def create_first_new_file! + within_element(:quick_actions) do + click_link_with_text 'New file' + end end def create_new_file! - click_element :create_new_dropdown + click_element :add_to_tree click_element :new_file_option end + def fork_project + click_on 'Fork' + end + def go_to_file(filename) within_element(:file_tree) do click_on filename end end - def switch_to_branch(branch_name) - find_element(:branches_select).click + def go_to_new_issue + click_element :new_menu_toggle - within_element(:branches_dropdown) do - click_on branch_name - end + click_link 'New issue' end def last_commit_content @@ -81,24 +90,26 @@ module QA click_element :create_merge_request end - def wait_for_import - wait(reload: true) do - has_css?('.tree-holder') - end + def open_web_ide! + click_element :web_ide_button end - def go_to_new_issue - click_element :new_menu_toggle - - click_link 'New issue' + def project_name + find('.qa-project-name').text end - def fork_project - click_on 'Fork' + def switch_to_branch(branch_name) + find_element(:branches_select).click + + within_element(:branches_dropdown) do + click_on branch_name + end end - def open_web_ide! - click_element :web_ide_button + def wait_for_import + wait(reload: true) do + has_css?('.tree-holder') + end end end end diff --git a/qa/qa/page/project/wiki/show.rb b/qa/qa/page/project/wiki/show.rb index a7c4455d080..dffbc5d60a2 100644 --- a/qa/qa/page/project/wiki/show.rb +++ b/qa/qa/page/project/wiki/show.rb @@ -5,7 +5,7 @@ module QA module Project module Wiki class Show < Page::Base - include Page::Component::ClonePanel + include Page::Component::LegacyClonePanel view 'app/views/projects/wikis/pages.html.haml' do element :clone_repository_link, 'Clone repository' # rubocop:disable QA/ElementWithPattern diff --git a/qa/qa/resource/file.rb b/qa/qa/resource/file.rb index effc5a7940b..57e82ac19ad 100644 --- a/qa/qa/resource/file.rb +++ b/qa/qa/resource/file.rb @@ -22,7 +22,7 @@ module QA def fabricate! project.visit! - Page::Project::Show.perform(&:create_new_file!) + Page::Project::Show.perform(&:create_first_new_file!) Page::File::Form.perform do |page| page.add_name(@name) diff --git a/qa/qa/resource/project.rb b/qa/qa/resource/project.rb index 7fdf69278f9..1fafbf5d73e 100644 --- a/qa/qa/resource/project.rb +++ b/qa/qa/resource/project.rb @@ -14,15 +14,13 @@ module QA attribute :repository_ssh_location do Page::Project::Show.perform do |page| - page.choose_repository_clone_ssh - page.repository_location + page.repository_clone_ssh_location end end attribute :repository_http_location do Page::Project::Show.perform do |page| - page.choose_repository_clone_http - page.repository_location + page.repository_clone_http_location end end diff --git a/qa/qa/resource/repository/project_push.rb b/qa/qa/resource/repository/project_push.rb index c9fafe3419f..37feab4ad70 100644 --- a/qa/qa/resource/repository/project_push.rb +++ b/qa/qa/resource/repository/project_push.rb @@ -20,23 +20,11 @@ module QA end def repository_http_uri - @repository_http_uri ||= begin - project.visit! - Page::Project::Show.act do - choose_repository_clone_http - repository_location.uri - end - end + @repository_http_uri ||= project.repository_http_location.uri end def repository_ssh_uri - @repository_ssh_uri ||= begin - project.visit! - Page::Project::Show.act do - choose_repository_clone_ssh - repository_location.uri - end - end + @repository_ssh_uri ||= project.repository_ssh_location.uri end end end diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/view_project_activity_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/view_project_activity_spec.rb index 275de3d332c..d4cedc9362d 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/project/view_project_activity_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/project/view_project_activity_spec.rb @@ -5,17 +5,17 @@ module QA describe 'Project activity' do it 'user creates an event in the activity page upon Git push' do Runtime::Browser.visit(:gitlab, Page::Main::Login) - Page::Main::Login.act { sign_in_using_credentials } + Page::Main::Login.perform(&:sign_in_using_credentials) - Resource::Repository::ProjectPush.fabricate! do |push| + project_push = Resource::Repository::ProjectPush.fabricate! do |push| push.file_name = 'README.md' push.file_content = '# This is a test project' push.commit_message = 'Add README.md' end + project_push.project.visit! - Page::Project::Menu.act { go_to_activity } - - Page::Project::Activity.act { go_to_push_events } + Page::Project::Menu.perform(&:go_to_activity) + Page::Project::Activity.perform(&:go_to_push_events) expect(page).to have_content('pushed new branch master') end diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/squash_merge_request_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/squash_merge_request_spec.rb index 6ff7360c413..4126f967ee2 100644 --- a/qa/qa/specs/features/browser_ui/3_create/merge_request/squash_merge_request_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/squash_merge_request_spec.rb @@ -5,7 +5,7 @@ module QA describe 'Merge request squashing' do it 'user squashes commits while merging' do Runtime::Browser.visit(:gitlab, Page::Main::Login) - Page::Main::Login.act { sign_in_using_credentials } + Page::Main::Login.perform(&:sign_in_using_credentials) project = Resource::Project.fabricate! do |project| project.name = "squash-before-merge" @@ -38,13 +38,12 @@ module QA Git::Repository.perform do |repository| repository.uri = Page::Project::Show.act do - choose_repository_clone_http - repository_location.uri + repository_clone_http_location.uri end repository.use_default_credentials - repository.act { clone } + repository.clone expect(repository.commits.size).to eq 3 end diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/add_file_template_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/add_file_template_spec.rb index 297485dd81e..de5c535c757 100644 --- a/qa/qa/specs/features/browser_ui/3_create/repository/add_file_template_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/repository/add_file_template_spec.rb @@ -7,7 +7,7 @@ module QA def login Runtime::Browser.visit(:gitlab, Page::Main::Login) - Page::Main::Login.act { sign_in_using_credentials } + Page::Main::Login.perform(&:sign_in_using_credentials) end before(:all) do @@ -18,7 +18,15 @@ module QA project.description = 'Add file templates via the Files view' end - Page::Main::Menu.act { sign_out } + # There's no 'New File' dropdown when the project is blank, so we first + # add a dummy file so that the dropdown will appear + Resource::File.fabricate! do |file| + file.project = @project + file.name = 'README.md' + file.content = '# Readme' + end + + Page::Main::Menu.perform(&:sign_out) end templates = [ @@ -55,7 +63,7 @@ module QA login @project.visit! - Page::Project::Show.act { create_new_file! } + Page::Project::Show.perform(&:create_new_file!) Page::File::Form.perform do |page| page.select_template template[:file_name], template[:name] end diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/clone_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/clone_spec.rb index 6a0add56fe0..571cae4a3c5 100644 --- a/qa/qa/specs/features/browser_ui/3_create/repository/clone_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/repository/clone_spec.rb @@ -4,15 +4,12 @@ module QA context 'Create' do describe 'Git clone over HTTP', :ldap_no_tls do let(:location) do - Page::Project::Show.act do - choose_repository_clone_http - repository_location - end + Page::Project::Show.perform(&:repository_clone_http_location).uri end before do Runtime::Browser.visit(:gitlab, Page::Main::Login) - Page::Main::Login.act { sign_in_using_credentials } + Page::Main::Login.perform(&:sign_in_using_credentials) project = Resource::Project.fabricate! do |scenario| scenario.name = 'project-with-code' @@ -21,7 +18,7 @@ module QA project.visit! Git::Repository.perform do |repository| - repository.uri = location.uri + repository.uri = location repository.use_default_credentials repository.act do @@ -32,14 +29,15 @@ module QA push_changes end end + Page::Project::Show.perform(&:wait_for_push) end it 'user performs a deep clone' do Git::Repository.perform do |repository| - repository.uri = location.uri + repository.uri = location repository.use_default_credentials - repository.act { clone } + repository.clone expect(repository.commits.size).to eq 2 end @@ -47,10 +45,10 @@ module QA it 'user performs a shallow clone' do Git::Repository.perform do |repository| - repository.uri = location.uri + repository.uri = location repository.use_default_credentials - repository.act { shallow_clone } + repository.shallow_clone expect(repository.commits.size).to eq 1 expect(repository.commits.first).to include 'Add Readme' diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_spec.rb index 92f596a44d9..ad6426df420 100644 --- a/qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_spec.rb @@ -7,12 +7,12 @@ module QA Runtime::Browser.visit(:gitlab, Page::Main::Login) Page::Main::Login.act { sign_in_using_credentials } - Resource::Repository::ProjectPush.fabricate! do |push| + project_push = Resource::Repository::ProjectPush.fabricate! do |push| push.file_name = 'README.md' push.file_content = '# This is a test project' push.commit_message = 'Add README.md' end - + project_push.project.visit! Page::Project::Show.act { wait_for_push } expect(page).to have_content('README.md') diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/use_ssh_key_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/use_ssh_key_spec.rb index 9c764424129..509a639c130 100644 --- a/qa/qa/specs/features/browser_ui/3_create/repository/use_ssh_key_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/repository/use_ssh_key_spec.rb @@ -16,13 +16,14 @@ module QA resource.title = key_title end - Resource::Repository::ProjectPush.fabricate! do |push| + project_push = Resource::Repository::ProjectPush.fabricate! do |push| push.ssh_key = key push.file_name = 'README.md' push.file_content = '# Test Use SSH Key' push.commit_message = 'Add README.md' end + project_push.project.visit! Page::Project::Show.act { wait_for_push } expect(page).to have_content('README.md') diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/add_file_template_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/add_file_template_spec.rb index e7374377104..f176ec31abd 100644 --- a/qa/qa/specs/features/browser_ui/3_create/web_ide/add_file_template_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/add_file_template_spec.rb @@ -7,7 +7,7 @@ module QA def login Runtime::Browser.visit(:gitlab, Page::Main::Login) - Page::Main::Login.act { sign_in_using_credentials } + Page::Main::Login.perform(&:sign_in_using_credentials) end before(:all) do @@ -21,14 +21,14 @@ module QA # Add a file via the regular Files view because the Web IDE isn't # available unless there is a file present - Page::Project::Show.act { create_new_file! } + Page::Project::Show.perform(&:create_first_new_file!) Page::File::Form.perform do |page| page.add_name('dummy') page.add_content('Enable the Web IDE') page.commit_changes end - Page::Main::Menu.act { sign_out } + Page::Main::Menu.perform(&:sign_out) end templates = [ @@ -65,7 +65,7 @@ module QA login @project.visit! - Page::Project::Show.act { open_web_ide! } + Page::Project::Show.perform(&:open_web_ide!) Page::Project::WebIDE::Edit.perform do |page| page.create_new_file_from_template template[:file_name], template[:name] @@ -75,9 +75,7 @@ module QA expect(page).to have_button('Undo') expect(page).to have_content(content[0..100]) - Page::Project::WebIDE::Edit.perform do |page| - page.commit_changes - end + Page::Project::WebIDE::Edit.perform(&:commit_changes) expect(page).to have_content(template[:file_name]) expect(page).to have_content(content[0..100]) diff --git a/spec/features/groups/clusters/user_spec.rb b/spec/features/groups/clusters/user_spec.rb new file mode 100644 index 00000000000..2410cd92e3f --- /dev/null +++ b/spec/features/groups/clusters/user_spec.rb @@ -0,0 +1,126 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe 'User Cluster', :js do + include GoogleApi::CloudPlatformHelpers + + let(:group) { create(:group) } + let(:user) { create(:user) } + + before do + group.add_maintainer(user) + gitlab_sign_in(user) + + allow(Groups::ClustersController).to receive(:STATUS_POLLING_INTERVAL) { 100 } + allow_any_instance_of(Clusters::Gcp::Kubernetes::CreateOrUpdateNamespaceService).to receive(:execute) + end + + context 'when user does not have a cluster and visits cluster index page' do + before do + visit group_clusters_path(group) + + click_link 'Add Kubernetes cluster' + click_link 'Add existing cluster' + end + + context 'when user filled form with valid parameters' do + shared_examples 'valid cluster user form' do + it 'user sees a cluster details page' do + subject + + expect(page).to have_content('Kubernetes cluster integration') + expect(page.find_field('cluster[name]').value).to eq('dev-cluster') + expect(page.find_field('cluster[platform_kubernetes_attributes][api_url]').value) + .to have_content('http://example.com') + expect(page.find_field('cluster[platform_kubernetes_attributes][token]').value) + .to have_content('my-token') + end + end + + before do + fill_in 'cluster_name', with: 'dev-cluster' + fill_in 'cluster_platform_kubernetes_attributes_api_url', with: 'http://example.com' + fill_in 'cluster_platform_kubernetes_attributes_token', with: 'my-token' + end + + subject { click_button 'Add Kubernetes cluster' } + + it_behaves_like 'valid cluster user form' + + context 'RBAC is enabled for the cluster' do + before do + check 'cluster_platform_kubernetes_attributes_authorization_type' + end + + it_behaves_like 'valid cluster user form' + + it 'user sees a cluster details page with RBAC enabled' do + subject + + expect(page.find_field('cluster[platform_kubernetes_attributes][authorization_type]', disabled: true)).to be_checked + end + end + end + + context 'when user filled form with invalid parameters' do + before do + click_button 'Add Kubernetes cluster' + end + + it 'user sees a validation error' do + expect(page).to have_css('#error_explanation') + end + end + end + + context 'when user does have a cluster and visits cluster page' do + let(:cluster) { create(:cluster, :provided_by_user, cluster_type: :group_type, groups: [group]) } + + before do + visit group_cluster_path(group, cluster) + end + + it 'user sees a cluster details page' do + expect(page).to have_button('Save changes') + end + + context 'when user disables the cluster' do + before do + page.find(:css, '.js-cluster-enable-toggle-area .js-project-feature-toggle').click + page.within('#cluster-integration') { click_button 'Save changes' } + end + + it 'user sees the successful message' do + expect(page).to have_content('Kubernetes cluster was successfully updated.') + end + end + + context 'when user changes cluster parameters' do + before do + fill_in 'cluster_name', with: 'my-dev-cluster' + fill_in 'cluster_platform_kubernetes_attributes_token', with: 'new-token' + page.within('#js-cluster-details') { click_button 'Save changes' } + end + + it 'user sees the successful message' do + expect(page).to have_content('Kubernetes cluster was successfully updated.') + expect(cluster.reload.name).to eq('my-dev-cluster') + expect(cluster.reload.platform_kubernetes.token).to eq('new-token') + end + end + + context 'when user destroy the cluster' do + before do + page.accept_confirm do + click_link 'Remove integration' + end + end + + it 'user sees creation form with the successful message' do + expect(page).to have_content('Kubernetes cluster integration was successfully removed.') + expect(page).to have_link('Add Kubernetes cluster') + end + end + end +end diff --git a/spec/javascripts/notes/stores/mutation_spec.js b/spec/javascripts/notes/stores/mutation_spec.js index 52cdc16353a..3fbae82f16c 100644 --- a/spec/javascripts/notes/stores/mutation_spec.js +++ b/spec/javascripts/notes/stores/mutation_spec.js @@ -9,6 +9,11 @@ import { individualNote, } from '../mock_data'; +const RESOLVED_NOTE = { resolvable: true, resolved: true }; +const UNRESOLVED_NOTE = { resolvable: true, resolved: false }; +const SYSTEM_NOTE = { resolvable: false, resolved: false }; +const WEIRD_NOTE = { resolvable: false, resolved: true }; + describe('Notes Store mutations', () => { describe('ADD_NEW_NOTE', () => { let state; @@ -449,49 +454,61 @@ describe('Notes Store mutations', () => { }); describe('UPDATE_RESOLVABLE_DISCUSSIONS_COUNTS', () => { - it('updates resolvableDiscussionsCount', () => { - const state = { - discussions: [ - { individual_note: false, resolvable: true, notes: [] }, - { individual_note: true, resolvable: true, notes: [] }, - { individual_note: false, resolvable: false, notes: [] }, - ], - resolvableDiscussionsCount: 0, - }; - - mutations.UPDATE_RESOLVABLE_DISCUSSIONS_COUNTS(state); - - expect(state.resolvableDiscussionsCount).toBe(1); - }); - - it('updates unresolvedDiscussionsCount', () => { + it('with unresolvable discussions, updates state', () => { const state = { discussions: [ - { individual_note: false, resolvable: true, notes: [{ resolved: false }] }, - { individual_note: true, resolvable: true, notes: [{ resolved: false }] }, - { individual_note: false, resolvable: false, notes: [{ resolved: false }] }, + { individual_note: false, resolvable: true, notes: [UNRESOLVED_NOTE] }, + { individual_note: true, resolvable: true, notes: [UNRESOLVED_NOTE] }, + { individual_note: false, resolvable: false, notes: [UNRESOLVED_NOTE] }, ], - unresolvedDiscussionsCount: 0, }; mutations.UPDATE_RESOLVABLE_DISCUSSIONS_COUNTS(state); - expect(state.unresolvedDiscussionsCount).toBe(1); + expect(state).toEqual( + jasmine.objectContaining({ + resolvableDiscussionsCount: 1, + unresolvedDiscussionsCount: 1, + hasUnresolvedDiscussions: false, + }), + ); }); - it('updates hasUnresolvedDiscussions', () => { + it('with resolvable discussions, updates state', () => { const state = { discussions: [ - { individual_note: false, resolvable: true, notes: [{ resolved: false }] }, - { individual_note: false, resolvable: true, notes: [{ resolved: false }] }, - { individual_note: false, resolvable: false, notes: [{ resolved: false }] }, + { + individual_note: false, + resolvable: true, + notes: [RESOLVED_NOTE, SYSTEM_NOTE, RESOLVED_NOTE], + }, + { + individual_note: false, + resolvable: true, + notes: [RESOLVED_NOTE, SYSTEM_NOTE, WEIRD_NOTE], + }, + { + individual_note: false, + resolvable: true, + notes: [SYSTEM_NOTE, RESOLVED_NOTE, WEIRD_NOTE, UNRESOLVED_NOTE], + }, + { + individual_note: false, + resolvable: true, + notes: [UNRESOLVED_NOTE], + }, ], - hasUnresolvedDiscussions: 0, }; mutations.UPDATE_RESOLVABLE_DISCUSSIONS_COUNTS(state); - expect(state.hasUnresolvedDiscussions).toBe(true); + expect(state).toEqual( + jasmine.objectContaining({ + resolvableDiscussionsCount: 4, + unresolvedDiscussionsCount: 2, + hasUnresolvedDiscussions: true, + }), + ); }); }); }); diff --git a/spec/lib/gitlab/url_sanitizer_spec.rb b/spec/lib/gitlab/url_sanitizer_spec.rb index b41a81a8167..6e98a999766 100644 --- a/spec/lib/gitlab/url_sanitizer_spec.rb +++ b/spec/lib/gitlab/url_sanitizer_spec.rb @@ -41,6 +41,7 @@ describe Gitlab::UrlSanitizer do false | '123://invalid:url' false | 'valid@project:url.git' false | 'valid:pass@project:url.git' + false | %w(test array) true | 'ssh://example.com' true | 'ssh://:@example.com' true | 'ssh://foo@example.com' diff --git a/spec/lib/gitlab/utils_spec.rb b/spec/lib/gitlab/utils_spec.rb index 47a5fd0bdb4..f5a4b7e2ebf 100644 --- a/spec/lib/gitlab/utils_spec.rb +++ b/spec/lib/gitlab/utils_spec.rb @@ -44,6 +44,12 @@ describe Gitlab::Utils do end end + describe '.nlbr' do + it 'replaces new lines with <br>' do + expect(described_class.nlbr("<b>hello</b>\n<i>world</i>".freeze)).to eq("hello<br>world") + end + end + describe '.remove_line_breaks' do using RSpec::Parameterized::TableSyntax diff --git a/spec/mailers/notify_spec.rb b/spec/mailers/notify_spec.rb index 150c00e4bfe..f6e5c9d33ac 100644 --- a/spec/mailers/notify_spec.rb +++ b/spec/mailers/notify_spec.rb @@ -4,6 +4,7 @@ require 'email_spec' describe Notify do include EmailSpec::Helpers include EmailSpec::Matchers + include EmailHelpers include RepoHelpers include_context 'gitlab email notification' @@ -27,15 +28,6 @@ describe Notify do description: 'My awesome description!') end - def have_referable_subject(referable, reply: false) - prefix = referable.project ? "#{referable.project.name} | " : '' - prefix.prepend('Re: ') if reply - - suffix = "#{referable.title} (#{referable.to_reference})" - - have_subject [prefix, suffix].compact.join - end - context 'for a project' do shared_examples 'an assignee email' do it 'is sent to the assignee as the author' do diff --git a/spec/models/broadcast_message_spec.rb b/spec/models/broadcast_message_spec.rb index 5326f9cb8c0..d6e5b557870 100644 --- a/spec/models/broadcast_message_spec.rb +++ b/spec/models/broadcast_message_spec.rb @@ -58,6 +58,12 @@ describe BroadcastMessage do end end + it 'does not create new records' do + create(:broadcast_message) + + expect { described_class.current }.not_to change { described_class.count } + end + it 'includes messages that need to be displayed in the future' do create(:broadcast_message) @@ -77,9 +83,37 @@ describe BroadcastMessage do it 'does not clear the cache if only a future message should be displayed' do create(:broadcast_message, :future) - expect(Rails.cache).not_to receive(:delete) + expect(Rails.cache).not_to receive(:delete).with(described_class::CACHE_KEY) expect(described_class.current.length).to eq(0) end + + it 'clears the legacy cache key' do + create(:broadcast_message, :future) + + expect(Rails.cache).to receive(:delete).with(described_class::LEGACY_CACHE_KEY) + expect(described_class.current.length).to eq(0) + end + + it 'gracefully handles bad cache entry' do + allow(described_class).to receive(:current_and_future_messages).and_return('{') + + expect(described_class.current).to be_empty + end + + it 'gracefully handles an empty hash' do + allow(described_class).to receive(:current_and_future_messages).and_return('{}') + + expect(described_class.current).to be_empty + end + + it 'gracefully handles unknown attributes' do + message = create(:broadcast_message) + + allow(described_class).to receive(:current_and_future_messages) + .and_return([{ bad_attr: 1 }, message]) + + expect(described_class.current).to eq([message]) + end end describe '#active?' do @@ -143,6 +177,7 @@ describe BroadcastMessage do message = create(:broadcast_message) expect(Rails.cache).to receive(:delete).with(described_class::CACHE_KEY) + expect(Rails.cache).to receive(:delete).with(described_class::LEGACY_CACHE_KEY) message.flush_redis_cache end diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb index 9b60054e14a..c3152d2021b 100644 --- a/spec/models/merge_request_spec.rb +++ b/spec/models/merge_request_spec.rb @@ -1885,7 +1885,7 @@ describe MergeRequest do allow(subject).to receive(:head_pipeline) { nil } end - it { expect(subject.mergeable_ci_state?).to be_falsey } + it { expect(subject.mergeable_ci_state?).to be_truthy } end end diff --git a/spec/services/clusters/build_service_spec.rb b/spec/services/clusters/build_service_spec.rb new file mode 100644 index 00000000000..da0cb42b3a1 --- /dev/null +++ b/spec/services/clusters/build_service_spec.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Clusters::BuildService do + describe '#execute' do + subject { described_class.new(cluster_subject).execute } + + describe 'when cluster subject is a project' do + let(:cluster_subject) { build(:project) } + + it 'sets the cluster_type to project_type' do + is_expected.to be_project_type + end + end + + describe 'when cluster subject is a group' do + let(:cluster_subject) { build(:group) } + + it 'sets the cluster_type to group_type' do + is_expected.to be_group_type + end + end + end +end diff --git a/spec/support/helpers/email_helpers.rb b/spec/support/helpers/email_helpers.rb index 1fb8252459f..ad6e1064499 100644 --- a/spec/support/helpers/email_helpers.rb +++ b/spec/support/helpers/email_helpers.rb @@ -34,4 +34,13 @@ module EmailHelpers def find_email_for(user) ActionMailer::Base.deliveries.find { |d| d.to.include?(user.notification_email) } end + + def have_referable_subject(referable, include_project: true, reply: false) + prefix = (include_project && referable.project ? "#{referable.project.name} | " : '').freeze + prefix = "Re: #{prefix}" if reply + + suffix = "#{referable.title} (#{referable.to_reference})" + + have_subject [prefix, suffix].compact.join + end end diff --git a/vendor/gitignore/CMake.gitignore b/vendor/gitignore/CMake.gitignore index 9ea395f15ee..7e25564f9ec 100644 --- a/vendor/gitignore/CMake.gitignore +++ b/vendor/gitignore/CMake.gitignore @@ -1,3 +1,4 @@ +CMakeLists.txt.user CMakeCache.txt CMakeFiles CMakeScripts diff --git a/vendor/gitignore/Drupal.gitignore b/vendor/gitignore/Drupal.gitignore index 072b683190f..50d3eef8a33 100644 --- a/vendor/gitignore/Drupal.gitignore +++ b/vendor/gitignore/Drupal.gitignore @@ -1,39 +1,46 @@ -# Ignore configuration files that may contain sensitive information. -sites/*/*settings*.php -sites/example.sites.php +# gitignore template for Drupal 8 projects +# +# earlier versions of Drupal are tracked in `community/Python/` -# Ignore paths that contain generated content. -files/ -sites/*/files -sites/*/private -sites/*/translations +# Ignore configuration files that may contain sensitive information +/sites/*/*settings*.php +/sites/*/*services*.yml -# Ignore default text files -robots.txt -/CHANGELOG.txt -/COPYRIGHT.txt -/INSTALL*.txt +# Ignore paths that may contain user-generated content +/sites/*/files +/sites/*/public +/sites/*/private +/sites/*/files-public +/sites/*/files-private + +# Ignore paths that may contain temporary files +/sites/*/translations +/sites/*/tmp +/sites/*/cache + +# Ignore drupal core (if not versioning drupal sources) +/core +/modules/README.txt +/profiles/README.txt +/sites/README.txt +/sites/example.sites.php +/sites/example.settings.local.php +/sites/development.services.yml +/themes/README.txt +/vendor +/.csslintrc +/.editorconfig +/.eslintignore +/.eslintrc.json +/.gitattributes +/.htaccess +/autoload.php +/composer.json +/composer.lock +/example.gitignore +/index.php /LICENSE.txt -/MAINTAINERS.txt -/UPGRADE.txt /README.txt -sites/README.txt -sites/all/libraries/README.txt -sites/all/modules/README.txt -sites/all/themes/README.txt - -# Ignore everything but the "sites" folder ( for non core developer ) -.htaccess -web.config -authorize.php -cron.php -index.php -install.php -update.php -xmlrpc.php -/includes -/misc -/modules -/profiles -/scripts -/themes +/robots.txt +/update.php +/web.config diff --git a/vendor/gitignore/Global/Emacs.gitignore b/vendor/gitignore/Global/Emacs.gitignore index 3ac7904dcd2..d40e86599b5 100644 --- a/vendor/gitignore/Global/Emacs.gitignore +++ b/vendor/gitignore/Global/Emacs.gitignore @@ -43,3 +43,7 @@ flycheck_*.el # directory configuration .dir-locals.el + +# network security +/network-security.data + diff --git a/vendor/gitignore/Global/PuTTY.gitignore b/vendor/gitignore/Global/PuTTY.gitignore new file mode 100644 index 00000000000..c37466b1c79 --- /dev/null +++ b/vendor/gitignore/Global/PuTTY.gitignore @@ -0,0 +1,2 @@ +# Private key +*.ppk diff --git a/vendor/gitignore/Global/Virtuoso.gitignore b/vendor/gitignore/Global/Virtuoso.gitignore new file mode 100644 index 00000000000..2de03673a6c --- /dev/null +++ b/vendor/gitignore/Global/Virtuoso.gitignore @@ -0,0 +1,18 @@ +# Gitignore for Cadence Virtuoso +################################################################ + +# Log files +*.log +panic*.log.* + +# OpenAccess database lock files +*.cdslck* + +# Run directories for layout vs. schematic and design rule check +lvsRunDir/* +drcRunDir/* + +# Abstract generation tool +abstract.log* +abstract.record* + diff --git a/vendor/gitignore/Global/Xcode.gitignore b/vendor/gitignore/Global/Xcode.gitignore index b01314d3a64..cd0c7d3e45a 100644 --- a/vendor/gitignore/Global/Xcode.gitignore +++ b/vendor/gitignore/Global/Xcode.gitignore @@ -2,11 +2,17 @@ # # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore -## Build generated +## User settings +xcuserdata/ + +## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) +*.xcscmblueprint +*.xccheckout + +## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) build/ DerivedData/ - -## Various settings +*.moved-aside *.pbxuser !default.pbxuser *.mode1v3 @@ -15,65 +21,3 @@ DerivedData/ !default.mode2v3 *.perspectivev3 !default.perspectivev3 -xcuserdata/ - -## Other -*.moved-aside -*.xccheckout -*.xcscmblueprint - -## Obj-C/Swift specific -*.hmap -*.ipa -*.dSYM.zip -*.dSYM - -## Playgrounds -timeline.xctimeline -playground.xcworkspace - -# Swift Package Manager -# -# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. -# Packages/ -# Package.pins -# Package.resolved -.build/ - -# CocoaPods -# -# We recommend against adding the Pods directory to your .gitignore. However -# you should judge for yourself, the pros and cons are mentioned at: -# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control -# -# Pods/ -# -# Add this line if you want to avoid checking in source code from the Xcode workspace -# *.xcworkspace - -# Carthage -# -# Add this line if you want to avoid checking in source code from Carthage dependencies. -# Carthage/Checkouts - -Carthage/Build - -# fastlane -# -# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the -# screenshots whenever they are needed. -# For more information about the recommended setup visit: -# https://docs.fastlane.tools/best-practices/source-control/#source-control - -fastlane/report.xml -fastlane/Preview.html -fastlane/screenshots/**/*.png -fastlane/test_output - -# Code Injection -# -# After new code Injection tools there's a generated folder /iOSInjectionProject -# https://github.com/johnno1962/injectionforxcode - -iOSInjectionProject/ - diff --git a/vendor/gitignore/Node.gitignore b/vendor/gitignore/Node.gitignore index e1da6ae8ea5..ebfe43954dc 100644 --- a/vendor/gitignore/Node.gitignore +++ b/vendor/gitignore/Node.gitignore @@ -70,7 +70,10 @@ typings/ .vuepress/dist # Serverless directories -.serverless +.serverless/ # FuseBox cache .fusebox/ + +#DynamoDB Local files +.dynamodb/ diff --git a/vendor/gitignore/Python.gitignore b/vendor/gitignore/Python.gitignore index 510c73d0fdb..11614af2870 100644 --- a/vendor/gitignore/Python.gitignore +++ b/vendor/gitignore/Python.gitignore @@ -20,6 +20,7 @@ parts/ sdist/ var/ wheels/ +share/python-wheels/ *.egg-info/ .installed.cfg *.egg diff --git a/vendor/gitignore/Smalltalk.gitignore b/vendor/gitignore/Smalltalk.gitignore index 943995e1172..178d87af45b 100644 --- a/vendor/gitignore/Smalltalk.gitignore +++ b/vendor/gitignore/Smalltalk.gitignore @@ -1,8 +1,11 @@ # changes file *.changes +*.chg # system image *.image +*.img7 +*.img # Pharo Smalltalk Debug log file PharoDebug.log @@ -10,6 +13,12 @@ PharoDebug.log # Squeak Smalltalk Debug log file SqueakDebug.log +# Dolphin Smalltalk source file +*.sml + +# Dolphin Smalltalk error file +*.errors + # Monticello package cache /package-cache diff --git a/vendor/gitignore/TeX.gitignore b/vendor/gitignore/TeX.gitignore index 753f2b954ff..edd1f60b726 100644 --- a/vendor/gitignore/TeX.gitignore +++ b/vendor/gitignore/TeX.gitignore @@ -205,6 +205,10 @@ pythontex-files-*/ # todonotes *.tdo +# vhistory +*.hst +*.ver + # easy-todo *.lod diff --git a/vendor/gitignore/Unity.gitignore b/vendor/gitignore/Unity.gitignore index 833e6d4291c..93c9ce52191 100644 --- a/vendor/gitignore/Unity.gitignore +++ b/vendor/gitignore/Unity.gitignore @@ -35,3 +35,7 @@ sysinfo.txt # Builds *.apk *.unitypackage + +# Crashlytics generated file +Assets/StreamingAssets/crashlytics-build.properties + diff --git a/vendor/gitignore/VisualStudio.gitignore b/vendor/gitignore/VisualStudio.gitignore index 4d13c54854e..4ba92b04afb 100644 --- a/vendor/gitignore/VisualStudio.gitignore +++ b/vendor/gitignore/VisualStudio.gitignore @@ -20,6 +20,8 @@ [Rr]eleases/ x64/ x86/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ bld/ [Bb]in/ [Oo]bj/ @@ -229,6 +231,8 @@ orleans.codegen.cs # Since there are multiple workflows, uncomment next line to ignore bower_components # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) #bower_components/ +# ASP.NET Core default setup: bower directory is configured as wwwroot/lib/ and bower restore is true +**/wwwroot/lib/ # RIA/Silverlight projects Generated_Code/ diff --git a/vendor/licenses.csv b/vendor/licenses.csv index f6fd1efaa83..d706d76358a 100644 --- a/vendor/licenses.csv +++ b/vendor/licenses.csv @@ -67,10 +67,15 @@ @babel/template,7.1.2,MIT @babel/traverse,7.1.0,MIT @babel/types,7.1.2,MIT -@gitlab/svgs,1.35.0,MIT -@gitlab/ui,1.11.0,MIT +@gitlab/csslab,1.8.0,MIT +@gitlab/svgs,1.41.0,MIT +@gitlab/ui,1.15.0,MIT @sindresorhus/is,0.7.0,MIT +@types/async,2.0.50,MIT @types/jquery,2.0.48,MIT +@types/node,10.12.9,MIT +@types/semver,5.5.0,MIT +@types/zen-observable,0.8.0,MIT @vue/component-compiler-utils,2.2.0,MIT @webassemblyjs/ast,1.7.6,MIT @webassemblyjs/floating-point-hex-parser,1.7.6,MIT @@ -98,13 +103,14 @@ accepts,1.3.5,MIT ace-rails-ap,4.1.2,MIT acorn,5.7.3,MIT acorn-dynamic-import,3.0.0,MIT -actionmailer,4.2.10,MIT -actionpack,4.2.10,MIT -actionview,4.2.10,MIT -activejob,4.2.10,MIT -activemodel,4.2.10,MIT -activerecord,4.2.10,MIT -activesupport,4.2.10,MIT +actioncable,5.0.7,MIT +actionmailer,5.0.7,MIT +actionpack,5.0.7,MIT +actionview,5.0.7,MIT +activejob,5.0.7,MIT +activemodel,5.0.7,MIT +activerecord,5.0.7,MIT +activesupport,5.0.7,MIT acts-as-taggable-on,5.0.0,MIT addressable,2.5.2,Apache 2.0 aes_key_wrap,1.0.1,MIT @@ -119,24 +125,35 @@ ansi-regex,3.0.0,MIT ansi-styles,2.2.1,MIT ansi-styles,3.2.1,MIT anymatch,2.0.0,ISC +apollo-boost,0.1.20,MIT +apollo-cache,1.1.20,MIT +apollo-cache-inmemory,1.3.9,MIT +apollo-client,2.4.5,MIT +apollo-link,1.2.3,MIT +apollo-link-dedup,1.0.10,MIT +apollo-link-error,1.1.1,MIT +apollo-link-http,1.5.5,MIT +apollo-link-http-common,0.2.5,MIT +apollo-link-state,0.4.2,MIT +apollo-utilities,1.0.25,MIT aproba,1.2.0,ISC are-we-there-yet,1.1.4,ISC -arel,6.0.4,MIT +arel,7.1.4,MIT arr-diff,4.0.0,MIT arr-flatten,1.1.0,MIT arr-union,3.1.0,MIT array-flatten,1.1.1,MIT array-uniq,1.0.3,MIT array-unique,0.3.2,MIT -asana,0.6.0,MIT -asciidoctor,1.5.6.2,MIT +asana,0.8.1,MIT +asciidoctor,1.5.8,MIT asciidoctor-plantuml,0.0.8,MIT asn1.js,4.10.1,MIT assert,1.4.1,MIT assign-symbols,1.0.0,MIT async-each,1.0.1,MIT async-limiter,1.0.0,MIT -atob,2.0.3,(MIT OR Apache-2.0) +atob,2.1.2,(MIT OR Apache-2.0) atomic,1.1.99,Apache 2.0 attr_encrypted,3.1.0,MIT attr_required,1.0.0,MIT @@ -147,12 +164,13 @@ babel-code-frame,6.26.0,MIT babel-loader,8.0.4,MIT babel-polyfill,6.23.0,MIT babel-runtime,6.26.0,MIT +babel-standalone,6.26.0,MIT babosa,1.0.2,MIT balanced-match,1.0.0,MIT base,0.11.2,MIT base32,0.3.2,MIT base64-js,1.2.3,MIT -batch-loader,1.2.1,MIT +batch-loader,1.2.2,MIT bcrypt,3.1.12,MIT bcrypt_pbkdf,1.0.0,MIT bfj,6.1.1,MIT @@ -163,7 +181,7 @@ bindata,2.4.3,ruby bluebird,3.5.1,MIT bn.js,4.11.8,MIT body-parser,1.18.2,MIT -bootstrap,4.1.1,MIT +bootstrap,4.1.3,MIT bootstrap-vue,2.0.0-rc.11,MIT bootstrap_form,2.7.0,MIT brace-expansion,1.1.11,MIT @@ -216,7 +234,7 @@ clipboard,1.7.1,MIT cliui,4.0.0,ISC clone-response,1.0.2,MIT code-point-at,1.1.0,MIT -codesandbox-api,0.0.18,MIT +codesandbox-api,0.0.20,MIT codesandbox-import-util-types,1.2.11,LGPL codesandbox-import-utils,1.2.11,LGPL coercible,1.0.0,MIT @@ -224,14 +242,15 @@ collection-visit,1.0.0,MIT color-convert,1.9.3,MIT color-name,1.1.3,MIT commander,2.13.0,MIT -commander,2.18.0,MIT +commander,2.19.0,MIT commondir,1.0.1,MIT commonmarker,0.17.13,MIT component-emitter,1.2.1,MIT compression-webpack-plugin,2.0.0,MIT concat-map,0.0.1,MIT concat-stream,1.6.2,MIT -concurrent-ruby-ext,1.0.5,MIT +concurrent-ruby-ext,1.1.3,MIT +config-chain,1.1.12,MIT connection_pool,2.2.2,MIT console-browserify,1.1.0,MIT console-control-strings,1.1.0,ISC @@ -244,6 +263,7 @@ cookie,0.3.1,MIT cookie-signature,1.0.6,MIT copy-concurrently,1.0.5,ISC copy-descriptor,0.1.1,MIT +copy-to-clipboard,3.0.8,MIT core-js,2.3.0,MIT core-js,2.5.7,MIT core-util-is,1.0.2,MIT @@ -262,7 +282,6 @@ css-selector-tokenizer,0.7.0,MIT css_parser,1.5.0,MIT cssesc,0.1.0,MIT cyclist,0.2.2,MIT* -d3,4.12.2,New BSD d3,4.13.0,New BSD d3-array,1.2.1,New BSD d3-axis,1.0.8,New BSD @@ -275,7 +294,6 @@ d3-drag,1.2.1,New BSD d3-dsv,1.0.8,New BSD d3-ease,1.0.3,New BSD d3-force,1.1.0,New BSD -d3-format,1.2.1,New BSD d3-format,1.2.2,New BSD d3-geo,1.9.1,New BSD d3-hierarchy,1.1.5,New BSD @@ -287,7 +305,6 @@ d3-queue,3.0.7,New BSD d3-random,1.1.0,New BSD d3-request,1.0.6,New BSD d3-scale,1.0.7,New BSD -d3-selection,1.2.0,New BSD d3-selection,1.3.0,New BSD d3-shape,1.2.0,New BSD d3-time,1.0.8,New BSD @@ -302,7 +319,7 @@ date-now,0.1.4,MIT dateformat,3.0.3,MIT de-indent,1.0.2,MIT debug,2.6.9,MIT -debug,3.2.5,MIT +debug,3.2.6,MIT debugger-ruby_core_source,1.3.8,MIT decamelize,2.0.0,MIT deckar01-task_list,2.0.0,MIT @@ -310,8 +327,7 @@ declarative,0.0.10,MIT declarative-option,0.1.0,MIT decode-uri-component,0.2.0,MIT decompress-response,3.3.0,MIT -deep-extend,0.4.2,MIT -default_value_for,3.0.2,MIT +deep-extend,0.6.0,MIT define-properties,1.1.3,MIT define-property,0.2.5,MIT define-property,1.0.0,MIT @@ -330,6 +346,7 @@ devise-two-factor,3.0.0,MIT diff,3.5.0,New BSD diffie-hellman,5.0.2,MIT diffy,3.1.0,MIT +discordrb-webhooks-blackst0ne,3.3.0,MIT document-register-element,1.3.0,MIT dom-serializer,0.1.0,MIT domain-browser,1.1.7,MIT @@ -345,8 +362,10 @@ dropzone,4.2.0,MIT duplexer,0.1.1,MIT duplexer3,0.1.4,New BSD duplexify,3.5.3,MIT +echarts,4.2.0-rc.2,Apache 2.0 ed25519,1.2.4,MIT editions,1.3.4,MIT +editorconfig,0.15.2,MIT ee-first,1.1.1,MIT ejs,2.6.1,Apache 2.0 electron-to-chromium,1.3.73,ISC @@ -368,7 +387,7 @@ es-to-primitive,1.1.1,MIT es6-promise,3.0.2,MIT escape-html,1.0.3,MIT escape-string-regexp,1.0.5,MIT -escape_utils,1.1.1,MIT +escape_utils,1.2.1,MIT escaper,2.5.3,MIT eslint-scope,4.0.0,Simplified BSD esrecurse,4.2.1,Simplified BSD @@ -447,9 +466,10 @@ get-value,2.0.6,MIT get_process_mem,0.2.0,MIT gettext_i18n_rails,1.8.0,MIT gettext_i18n_rails_js,1.3.0,MIT -gitaly-proto,0.123.0,MIT +gitaly-proto,1.3.0,MIT github-markup,1.7.0,MIT -gitlab-markup,1.6.4,MIT +gitlab-default_value_for,3.1.1,MIT +gitlab-markup,1.6.5,MIT gitlab-sidekiq-fetcher,0.3.0,LGPL gitlab_omniauth-ldap,2.0.4,MIT glob,7.1.3,ISC @@ -464,7 +484,7 @@ google-protobuf,3.6.1,New BSD googleapis-common-protos-types,1.0.2,Apache 2.0 googleauth,0.6.6,Apache 2.0 got,8.3.0,MIT -gpgme,2.0.13,LGPL-2.1+ +gpgme,2.0.18,LGPL-2.1+ graceful-fs,4.1.11,ISC grape,1.1.0,MIT grape-entity,0.7.1,MIT @@ -473,6 +493,9 @@ grape_logging,1.7.0,MIT graphiql-rails,1.4.10,MIT graphlibrary,2.2.0,MIT graphql,1.8.1,MIT +graphql,14.0.2,MIT +graphql-anywhere,4.1.22,MIT +graphql-tag,2.10.0,MIT grpc,1.15.0,Apache 2.0 gzip-size,5.0.0,MIT hamlit,2.8.8,MIT @@ -496,6 +519,7 @@ hashie,3.5.7,MIT hashie-forbidden_attributes,0.1.1,MIT he,1.1.1,MIT health_check,2.6.0,MIT +highlight.js,9.13.1,New BSD hipchat,1.5.2,MIT hmac-drbg,1.0.1,MIT hoopy,0.1.4,MIT @@ -503,16 +527,16 @@ html-pipeline,2.8.4,MIT html2text,0.2.0,MIT htmlentities,4.3.4,MIT htmlparser2,3.9.2,MIT -http,2.2.2,MIT +http,3.3.0,MIT http-cache-semantics,3.8.1,Simplified BSD http-cookie,1.0.3,MIT http-errors,1.6.2,MIT -http-form_data,1.0.3,MIT +http-form_data,2.1.1,MIT http_parser.rb,0.6.0,MIT httparty,0.13.7,MIT httpclient,2.8.3,ruby https-browserify,1.0.0,MIT -i18n,0.9.5,MIT +i18n,1.1.1,MIT icalendar,2.4.1,ruby ice_nine,0.11.2,MIT iconv-lite,0.4.19,MIT @@ -523,6 +547,7 @@ ieee754,1.1.11,New BSD iferr,0.1.5,MIT ignore-walk,3.0.1,ISC immediate,3.0.6,MIT +immutable-tuple,0.4.9,MIT import-local,1.0.0,MIT imports-loader,0.8.0,MIT imurmurhash,0.1.4,MIT @@ -578,12 +603,14 @@ isobject,2.1.0,MIT isobject,3.0.1,MIT istextorbinary,2.2.1,MIT isurl,1.0.0,MIT +iterall,1.2.2,MIT jed,1.1.1,MIT jira-ruby,1.4.1,MIT jquery,3.3.1,MIT jquery-atwho-rails,1.3.2,MIT jquery-ujs,1.2.2,MIT jquery.waitforimages,2.2.0,MIT +js-beautify,1.8.8,MIT js-cookie,2.1.3,MIT js-levenshtein,1.1.4,MIT js-tokens,3.0.2,MIT @@ -611,7 +638,7 @@ kind-of,3.2.2,MIT kind-of,4.0.0,MIT kind-of,5.1.0,MIT kind-of,6.0.2,MIT -kubeclient,3.1.0,MIT +kubeclient,4.0.0,MIT lazy-cache,2.0.2,MIT lcid,2.0.0,MIT licensee,8.9.2,MIT @@ -631,7 +658,7 @@ lodash.isequal,4.5.0,MIT lodash.mergewith,4.6.0,MIT lodash.startcase,4.4.0,MIT lograge,0.10.0,MIT -loofah,2.2.2,MIT +loofah,2.2.3,MIT loose-envify,1.4.0,MIT lowercase-keys,1.0.0,MIT lru-cache,4.1.3,ISC @@ -653,17 +680,17 @@ memory-fs,0.4.1,MIT merge-descriptors,1.0.1,MIT merge-source-map,1.1.0,MIT mermaid,8.0.0-rc.8,MIT -method_source,0.9.0,MIT +method_source,0.9.2,MIT methods,1.1.2,MIT micromatch,3.1.10,MIT miller-rabin,4.0.1,MIT mime,1.4.1,MIT mime,2.3.1,MIT -mime-db,1.33.0,MIT -mime-types,2.1.18,MIT -mime-types,3.1,MIT -mime-types-data,3.2016.0521,MIT -mimemagic,0.3.0,MIT +mime-db,1.37.0,MIT +mime-types,2.1.21,MIT +mime-types,3.2.2,MIT +mime-types-data,3.2018.0812,MIT +mimemagic,0.3.2,MIT mimic-fn,1.1.0,MIT mimic-response,1.0.0,MIT mini_magick,4.8.0,MIT @@ -695,20 +722,22 @@ mustermann,1.0.3,MIT mustermann-grape,1.0.0,MIT mute-stream,0.0.7,ISC mysql2,0.4.10,MIT +nakayoshi_fork,0.0.4,MIT nan,2.10.0,MIT nanomatch,1.2.9,MIT -needle,2.2.1,MIT +needle,2.2.4,MIT negotiator,0.6.1,MIT neo-async,2.5.0,MIT net-ldap,0.16.0,MIT net-ssh,5.0.1,MIT netrc,0.11.0,MIT nice-try,1.0.4,MIT +nio4r,2.3.1,MIT node-fetch,1.6.3,MIT node-libs-browser,2.1.0,MIT -node-pre-gyp,0.10.0,New BSD +node-pre-gyp,0.10.3,New BSD node-releases,1.0.0-alpha.12,CC-BY-4.0 -nokogiri,1.8.4,MIT +nokogiri,1.8.5,MIT nokogumbo,1.5.0,Apache 2.0 nopt,4.0.1,ISC normalize-path,2.1.1,MIT @@ -752,6 +781,7 @@ onetime,2.0.1,MIT opencollective,1.0.3,MIT opener,1.5.1,(WTFPL OR MIT) opn,4.0.2,MIT +optimism,0.6.8,MIT org-ruby,0.9.12,MIT orm_adapter,0.5.0,MIT os,1.0.0,MIT @@ -818,6 +848,7 @@ process-nextick-args,1.0.7,MIT process-nextick-args,2.0.0,MIT prometheus-client-mmap,0.9.4,Apache 2.0 promise-inflight,1.0.1,ISC +proto-list,1.2.4,ISC proxy-addr,2.0.4,MIT prr,1.0.1,MIT pseudomap,1.0.2,ISC @@ -835,20 +866,20 @@ qs,6.5.1,New BSD query-string,5.1.1,MIT querystring,0.2.0,MIT querystring-es3,0.2.1,MIT -rack,1.6.10,MIT +rack,2.0.6,MIT rack-accept,0.4.5,MIT rack-attack,4.4.1,MIT rack-cors,1.0.2,MIT rack-oauth2,1.2.3,MIT -rack-protection,2.0.3,MIT +rack-protection,2.0.4,MIT rack-proxy,0.6.0,MIT rack-test,0.6.3,MIT -rails,4.2.10,MIT +rails,5.0.7,MIT rails-deprecated_sanitizer,1.0.3,MIT -rails-dom-testing,1.0.9,MIT +rails-dom-testing,2.0.3,MIT rails-html-sanitizer,1.0.4,MIT -rails-i18n,4.0.9,MIT -railties,4.2.10,MIT +rails-i18n,5.1.1,MIT +railties,5.0.7,MIT rainbow,3.0.0,MIT raindrops,0.18.0,LGPL-2.1+ rake,12.3.1,MIT @@ -862,7 +893,7 @@ raw-loader,0.5.1,MIT rb-fsevent,0.10.2,MIT rb-inotify,0.9.10,MIT rbtrace,0.4.10,MIT -rc,1.2.5,(BSD-2-Clause OR MIT OR Apache-2.0) +rc,1.2.8,(BSD-2-Clause OR MIT OR Apache-2.0) rdoc,6.0.4,ruby re2,1.1.1,New BSD readable-stream,2.0.6,MIT @@ -877,7 +908,7 @@ redis-activesupport,5.0.4,MIT redis-namespace,1.6.0,MIT redis-rack,2.0.4,MIT redis-rails,5.0.2,MIT -redis-store,1.4.1,MIT +redis-store,1.6.0,MIT regenerate,1.4.0,MIT regenerate-unicode-properties,7.0.0,MIT regenerator-runtime,0.10.5,MIT @@ -920,7 +951,7 @@ ruby-fogbugz,0.2.1,MIT ruby-prof,0.17.0,Simplified BSD ruby-progressbar,1.9.0,MIT ruby-saml,1.7.2,MIT -ruby_parser,3.9.0,MIT +ruby_parser,3.11.0,MIT rubyntlm,0.6.2,MIT rubypants,0.2.0,BSD rufus-scheduler,3.4.0,MIT @@ -949,9 +980,9 @@ seed-fu,2.3.7,MIT select,1.1.2,MIT select2,3.5.2-browserify,Apache* select2-rails,3.5.9.3,MIT -semver,5.5.1,ISC +semver,5.6.0,ISC send,0.16.2,MIT -sentry-raven,2.7.2,Apache 2.0 +sentry-raven,2.7.4,Apache 2.0 serialize-javascript,1.4.0,New BSD serve-static,1.13.2,MIT set-blocking,2.0.0,ISC @@ -963,18 +994,19 @@ setimmediate,1.0.5,MIT setprototypeof,1.0.3,ISC setprototypeof,1.1.0,ISC settingslogic,2.0.9,MIT -sexp_processor,4.9.0,MIT +sexp_processor,4.11.0,MIT sha.js,2.4.10,MIT sha1,1.1.1,New BSD shebang-command,1.2.0,MIT shebang-regex,1.0.0,MIT -sidekiq,5.2.1,LGPL +sidekiq,5.2.3,LGPL sidekiq-cron,0.6.0,MIT +sigmund,1.0.1,ISC signal-exit,3.0.2,ISC signet,0.11.0,Apache 2.0 slack-notifier,1.5.1,MIT slugify,1.3.1,MIT -smooshpack,0.0.48,LGPL +smooshpack,0.0.53,LGPL snapdragon,0.8.1,MIT snapdragon-node,2.1.1,MIT snapdragon-util,3.0.1,MIT @@ -1018,6 +1050,7 @@ style-loader,0.23.0,MIT supports-color,2.0.0,MIT supports-color,5.5.0,MIT svg4everybody,2.1.9,CC0-1.0 +symbol-observable,1.2.0,MIT sys-filesystem,1.1.6,Artistic 2.0 tapable,1.1.0,MIT tar,4.4.4,ISC @@ -1029,6 +1062,7 @@ thread_safe,0.3.6,Apache 2.0 three,0.84.0,MIT three-orbit-controls,82.1.0,MIT three-stl-loader,1.0.4,MIT +throttle-debounce,2.0.1,MIT through,2.3.8,MIT through2,2.0.3,MIT tilt,2.0.8,MIT @@ -1043,6 +1077,7 @@ to-fast-properties,2.0.0,MIT to-object-path,0.3.0,MIT to-regex,3.0.2,MIT to-regex-range,2.1.1,MIT +toggle-selection,1.0.6,MIT toml-rb,1.0.0,MIT trim-right,1.0.1,MIT trollop,2.1.3,MIT @@ -1079,6 +1114,7 @@ urix,0.1.0,MIT url,0.11.0,MIT url-loader,1.1.1,MIT url-parse-lax,3.0.0,MIT +url-search-params-polyfill,5.0.0,MIT url-to-options,1.0.1,MIT use,2.0.2,MIT util,0.10.3,MIT @@ -1094,6 +1130,7 @@ visibilityjs,1.2.4,MIT vm-browserify,0.0.4,MIT vmstat,2.3.0,MIT vue,2.5.17,MIT +vue-apollo,3.0.0-beta.25,ISC vue-functional-data-merge,2.0.6,MIT vue-hot-reload-api,2.3.0,MIT vue-loader,15.4.2,MIT @@ -1112,6 +1149,8 @@ webpack-cli,3.1.0,MIT webpack-rails,0.9.11,MIT webpack-sources,1.3.0,MIT webpack-stats-plugin,0.2.1,MIT +websocket-driver,0.6.5,MIT +websocket-extensions,0.1.3,MIT which,1.3.0,ISC which-module,2.0.0,ISC wide-align,1.1.2,ISC @@ -1131,3 +1170,6 @@ yallist,2.1.2,ISC yallist,3.0.2,ISC yargs,12.0.2,MIT yargs-parser,10.1.0,ISC +zen-observable,0.8.11,MIT +zen-observable-ts,0.8.10,MIT +zrender,4.0.5,New BSD |