From e66d6781ef36e39d15b1b9bc84cc30e87969edad Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Thu, 26 Sep 2019 18:06:29 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- .../merge_request_templates/Documentation.md | 2 +- app/assets/javascripts/groups_select.js | 177 +++++++++--------- app/assets/javascripts/labels_select.js | 2 +- .../import/bitbucket_controller.rb | 8 +- app/services/groups/create_service.rb | 7 + app/views/import/bitbucket/status.html.haml | 11 +- .../import/bitbucket_server/status.html.haml | 2 +- ...-request-adds-them-out-of-order-until-.yml | 5 + changelogs/unreleased/ancestor_groups.yml | 5 + ...ltsov-bitbucket-cloud-import-filtering.yml | 5 + .../unreleased/group_default_visibility.yml | 5 + changelogs/unreleased/update-schema-rb.yml | 5 + ...13220114_rework_redirect_routes_indexes.rb | 4 +- ...64012_add_path_index_to_redirect_routes.rb | 7 +- db/schema.rb | 3 + doc/api/group_labels.md | 1 + doc/api/labels.md | 1 + doc/user/project/import/bitbucket.md | 6 +- .../img/bitbucket_import_select_project.png | Bin 8688 -> 0 bytes .../bitbucket_import_select_project_v12_3.png | Bin 0 -> 112397 bytes lib/api/group_labels.rb | 4 +- lib/api/helpers/groups_helpers.rb | 2 - lib/api/helpers/label_helpers.rb | 4 +- lib/api/labels.rb | 4 +- lib/bitbucket/client.rb | 4 +- lib/tasks/gitlab/setup.rake | 1 - lib/tasks/migrate/setup_postgresql.rake | 11 -- locale/gitlab.pot | 6 + qa/qa/page/project/job/show.rb | 12 +- .../import/bitbucket_controller_spec.rb | 15 ++ spec/javascripts/labels_issue_sidebar_spec.js | 88 ++++----- spec/requests/api/group_labels_spec.rb | 80 +++++--- spec/requests/api/groups_spec.rb | 23 +++ spec/requests/api/labels_spec.rb | 46 +++++ 34 files changed, 350 insertions(+), 206 deletions(-) create mode 100644 changelogs/unreleased/31393-when-adding-labels-in-a-merge-request-adds-them-out-of-order-until-.yml create mode 100644 changelogs/unreleased/ancestor_groups.yml create mode 100644 changelogs/unreleased/georgekoltsov-bitbucket-cloud-import-filtering.yml create mode 100644 changelogs/unreleased/group_default_visibility.yml create mode 100644 changelogs/unreleased/update-schema-rb.yml delete mode 100644 doc/user/project/import/img/bitbucket_import_select_project.png create mode 100644 doc/user/project/import/img/bitbucket_import_select_project_v12_3.png diff --git a/.gitlab/merge_request_templates/Documentation.md b/.gitlab/merge_request_templates/Documentation.md index 4221f097be3..a2dd79ed1ab 100644 --- a/.gitlab/merge_request_templates/Documentation.md +++ b/.gitlab/merge_request_templates/Documentation.md @@ -17,7 +17,7 @@ - [ ] Follow the [Documentation Guidelines](https://docs.gitlab.com/ee/development/documentation/) and [Style Guide](https://docs.gitlab.com/ee/development/documentation/styleguide.html). - [ ] If applicable, update the [permissions table](https://docs.gitlab.com/ee/user/permissions.html). - [ ] Link docs to and from the higher-level index page, plus other related docs where helpful. -- [ ] Apply the ~Documentation label. +- [ ] Apply the ~documentation label. ## Review checklist diff --git a/app/assets/javascripts/groups_select.js b/app/assets/javascripts/groups_select.js index f1cc6756583..a5e38022b8d 100644 --- a/app/assets/javascripts/groups_select.js +++ b/app/assets/javascripts/groups_select.js @@ -4,96 +4,97 @@ import Api from './api'; import { normalizeHeaders } from './lib/utils/common_utils'; import { __ } from '~/locale'; -export default function groupsSelect() { - import(/* webpackChunkName: 'select2' */ 'select2/select2') - .then(() => { - // Needs to be accessible in rspec - window.GROUP_SELECT_PER_PAGE = 20; - $('.ajax-groups-select').each(function setAjaxGroupsSelect2() { - const $select = $(this); - const allAvailable = $select.data('allAvailable'); - const skipGroups = $select.data('skipGroups') || []; - const parentGroupID = $select.data('parentId'); - const groupsPath = parentGroupID - ? Api.subgroupsPath.replace(':id', parentGroupID) - : Api.groupsPath; +const groupsSelect = () => { + // Needs to be accessible in rspec + window.GROUP_SELECT_PER_PAGE = 20; + $('.ajax-groups-select').each(function setAjaxGroupsSelect2() { + const $select = $(this); + const allAvailable = $select.data('allAvailable'); + const skipGroups = $select.data('skipGroups') || []; + const parentGroupID = $select.data('parentId'); + const groupsPath = parentGroupID + ? Api.subgroupsPath.replace(':id', parentGroupID) + : Api.groupsPath; - $select.select2({ - placeholder: __('Search for a group'), - allowClear: $select.hasClass('allowClear'), - multiple: $select.hasClass('multiselect'), - minimumInputLength: 0, - ajax: { - url: Api.buildUrl(groupsPath), - dataType: 'json', - quietMillis: 250, - transport(params) { - axios[params.type.toLowerCase()](params.url, { - params: params.data, - }) - .then(res => { - const results = res.data || []; - const headers = normalizeHeaders(res.headers); - const currentPage = parseInt(headers['X-PAGE'], 10) || 0; - const totalPages = parseInt(headers['X-TOTAL-PAGES'], 10) || 0; - const more = currentPage < totalPages; + $select.select2({ + placeholder: __('Search for a group'), + allowClear: $select.hasClass('allowClear'), + multiple: $select.hasClass('multiselect'), + minimumInputLength: 0, + ajax: { + url: Api.buildUrl(groupsPath), + dataType: 'json', + quietMillis: 250, + transport(params) { + axios[params.type.toLowerCase()](params.url, { + params: params.data, + }) + .then(res => { + const results = res.data || []; + const headers = normalizeHeaders(res.headers); + const currentPage = parseInt(headers['X-PAGE'], 10) || 0; + const totalPages = parseInt(headers['X-TOTAL-PAGES'], 10) || 0; + const more = currentPage < totalPages; - params.success({ - results, - pagination: { - more, - }, - }); - }) - .catch(params.error); - }, - data(search, page) { - return { - search, - page, - per_page: window.GROUP_SELECT_PER_PAGE, - all_available: allAvailable, - }; - }, - results(data, page) { - if (data.length) return { results: [] }; - - const groups = data.length ? data : data.results || []; - const more = data.pagination ? data.pagination.more : false; - const results = groups.filter(group => skipGroups.indexOf(group.id) === -1); - - return { + params.success({ results, - page, - more, - }; - }, - }, - // eslint-disable-next-line consistent-return - initSelection(element, callback) { - const id = $(element).val(); - if (id !== '') { - return Api.group(id, callback); - } - }, - formatResult(object) { - return `
${object.full_name}
${object.full_path}
`; - }, - formatSelection(object) { - return object.full_name; - }, - dropdownCssClass: 'ajax-groups-dropdown select2-infinite', - // we do not want to escape markup since we are displaying html in results - escapeMarkup(m) { - return m; - }, - }); + pagination: { + more, + }, + }); + }) + .catch(params.error); + }, + data(search, page) { + return { + search, + page, + per_page: window.GROUP_SELECT_PER_PAGE, + all_available: allAvailable, + }; + }, + results(data, page) { + if (data.length) return { results: [] }; - $select.on('select2-loaded', () => { - const dropdown = document.querySelector('.select2-infinite .select2-results'); - dropdown.style.height = `${Math.floor(dropdown.scrollHeight)}px`; - }); - }); - }) + const groups = data.length ? data : data.results || []; + const more = data.pagination ? data.pagination.more : false; + const results = groups.filter(group => skipGroups.indexOf(group.id) === -1); + + return { + results, + page, + more, + }; + }, + }, + // eslint-disable-next-line consistent-return + initSelection(element, callback) { + const id = $(element).val(); + if (id !== '') { + return Api.group(id, callback); + } + }, + formatResult(object) { + return `
${object.full_name}
${object.full_path}
`; + }, + formatSelection(object) { + return object.full_name; + }, + dropdownCssClass: 'ajax-groups-dropdown select2-infinite', + // we do not want to escape markup since we are displaying html in results + escapeMarkup(m) { + return m; + }, + }); + + $select.on('select2-loaded', () => { + const dropdown = document.querySelector('.select2-infinite .select2-results'); + dropdown.style.height = `${Math.floor(dropdown.scrollHeight)}px`; + }); + }); +}; + +export default () => + import(/* webpackChunkName: 'select2' */ 'select2/select2') + .then(groupsSelect) .catch(() => {}); -} diff --git a/app/assets/javascripts/labels_select.js b/app/assets/javascripts/labels_select.js index 88218c3c918..22b062563b5 100644 --- a/app/assets/javascripts/labels_select.js +++ b/app/assets/javascripts/labels_select.js @@ -120,7 +120,7 @@ export default class LabelsSelect { labelCount = 0; if (data.labels.length && issueUpdateURL) { template = LabelsSelect.getLabelTemplate({ - labels: data.labels, + labels: _.sortBy(data.labels, 'title'), issueUpdateURL, enableScopedLabels: scopedLabels, scopedLabelsDocumentationLink, diff --git a/app/controllers/import/bitbucket_controller.rb b/app/controllers/import/bitbucket_controller.rb index 293d76ea765..c37e799de62 100644 --- a/app/controllers/import/bitbucket_controller.rb +++ b/app/controllers/import/bitbucket_controller.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class Import::BitbucketController < Import::BaseController + include ActionView::Helpers::SanitizeHelper + before_action :verify_bitbucket_import_enabled before_action :bitbucket_auth, except: :callback @@ -21,7 +23,7 @@ class Import::BitbucketController < Import::BaseController # rubocop: disable CodeReuse/ActiveRecord def status bitbucket_client = Bitbucket::Client.new(credentials) - repos = bitbucket_client.repos + repos = bitbucket_client.repos(filter: sanitized_filter_param) @repos, @incompatible_repos = repos.partition { |repo| repo.valid? } @@ -104,4 +106,8 @@ class Import::BitbucketController < Import::BaseController refresh_token: session[:bitbucket_refresh_token] } end + + def sanitized_filter_param + @filter ||= sanitize(params[:filter]) + end end diff --git a/app/services/groups/create_service.rb b/app/services/groups/create_service.rb index 61bd50616b8..8cc31200689 100644 --- a/app/services/groups/create_service.rb +++ b/app/services/groups/create_service.rb @@ -9,6 +9,7 @@ module Groups def execute remove_unallowed_params + set_visibility_level @group = Group.new(params) @@ -68,6 +69,12 @@ module Groups true end + + def set_visibility_level + return if visibility_level.present? + + params[:visibility_level] = Gitlab::CurrentSettings.current_application_settings.default_group_visibility + end end end diff --git a/app/views/import/bitbucket/status.html.haml b/app/views/import/bitbucket/status.html.haml index 2336e1e83f9..7399ff937ce 100644 --- a/app/views/import/bitbucket/status.html.haml +++ b/app/views/import/bitbucket/status.html.haml @@ -8,7 +8,6 @@ - if @repos.any? %p.light = _('Select projects you want to import.') - %hr %p - if @incompatible_repos.any? = button_tag class: 'btn btn-import btn-success js-import-all' do @@ -19,6 +18,14 @@ = _('Import all projects') = icon('spinner spin', class: 'loading-icon') +.position-relative.ms-no-clear.d-flex.flex-fill.float-right.append-bottom-10 + = form_tag status_import_bitbucket_path, method: 'get' do + = text_field_tag :filter, @filter, class: 'form-control pr-5', placeholder: _('Filter projects'), size: 40, autofocus: true, 'aria-label': _('Search') + .position-absolute.position-top-0.d-flex.align-items-center.text-muted.position-right-0.h-100 + .border-left + %button{ class: 'btn btn-transparent btn-secondary', 'aria-label': _('Search Button'), type: 'submit' } + %i{ class: 'fa fa-search', 'aria-hidden': true } + .table-responsive %table.table.import-jobs %colgroup.import-jobs-from-col @@ -59,7 +66,7 @@ - if current_user.can_select_namespace? - selected = params[:namespace_id] || :current_user - opts = current_user.can_create_group? ? { extra_group: Group.new(name: repo.owner, path: repo.owner) } : {} - = select_tag :namespace_id, namespaces_options(selected, opts.merge({ display_path: true })), { class: 'input-group-text select2 js-select-namespace', tabindex: 1 } + = select_tag :namespace_id, namespaces_options(selected, opts.merge({ display_path: true })), { class: 'select2 js-select-namespace', tabindex: 1 } - else = text_field_tag :path, current_user.namespace_path, class: "input-group-text input-large form-control", tabindex: 1, disabled: true %span.input-group-prepend diff --git a/app/views/import/bitbucket_server/status.html.haml b/app/views/import/bitbucket_server/status.html.haml index aac09801d91..1aaf5883bf4 100644 --- a/app/views/import/bitbucket_server/status.html.haml +++ b/app/views/import/bitbucket_server/status.html.haml @@ -62,7 +62,7 @@ - if current_user.can_select_namespace? - selected = params[:namespace_id] || :extra_group - opts = current_user.can_create_group? ? { extra_group: Group.new(name: sanitize_project_name(repo.project_key), path: sanitize_project_name(repo.project_key)) } : {} - = select_tag :namespace_id, namespaces_options(selected, opts.merge({ display_path: true })), { class: 'input-group-text select2 js-select-namespace', tabindex: 1 } + = select_tag :namespace_id, namespaces_options(selected, opts.merge({ display_path: true })), { class: 'select2 js-select-namespace', tabindex: 1 } - else = text_field_tag :path, current_user.namespace_path, class: "input-group-text input-large form-control", tabindex: 1, disabled: true %span.input-group-prepend diff --git a/changelogs/unreleased/31393-when-adding-labels-in-a-merge-request-adds-them-out-of-order-until-.yml b/changelogs/unreleased/31393-when-adding-labels-in-a-merge-request-adds-them-out-of-order-until-.yml new file mode 100644 index 00000000000..2b47255a06f --- /dev/null +++ b/changelogs/unreleased/31393-when-adding-labels-in-a-merge-request-adds-them-out-of-order-until-.yml @@ -0,0 +1,5 @@ +--- +title: Alphabetically sorts selected sidebar labels. +merge_request: 17309 +author: +type: fixed diff --git a/changelogs/unreleased/ancestor_groups.yml b/changelogs/unreleased/ancestor_groups.yml new file mode 100644 index 00000000000..1b5d6573b86 --- /dev/null +++ b/changelogs/unreleased/ancestor_groups.yml @@ -0,0 +1,5 @@ +--- +title: 'Allow to exclude ancestor groups on group labels API' +merge_request: 17221 +author: Mathieu Parent +type: added diff --git a/changelogs/unreleased/georgekoltsov-bitbucket-cloud-import-filtering.yml b/changelogs/unreleased/georgekoltsov-bitbucket-cloud-import-filtering.yml new file mode 100644 index 00000000000..8fdbdb20d28 --- /dev/null +++ b/changelogs/unreleased/georgekoltsov-bitbucket-cloud-import-filtering.yml @@ -0,0 +1,5 @@ +--- +title: Add project filtering to Bitbucket Cloud import +merge_request: 16828 +author: +type: added diff --git a/changelogs/unreleased/group_default_visibility.yml b/changelogs/unreleased/group_default_visibility.yml new file mode 100644 index 00000000000..3816223c066 --- /dev/null +++ b/changelogs/unreleased/group_default_visibility.yml @@ -0,0 +1,5 @@ +--- +title: Fix visibility level error when updating group from API +merge_request: 17227 +author: Mathieu Parent +type: fixed diff --git a/changelogs/unreleased/update-schema-rb.yml b/changelogs/unreleased/update-schema-rb.yml new file mode 100644 index 00000000000..7e0756dc489 --- /dev/null +++ b/changelogs/unreleased/update-schema-rb.yml @@ -0,0 +1,5 @@ +--- +title: Remove Postgresql specific setup tasks and move to schema.rb +merge_request: +author: +type: other diff --git a/db/migrate/20180113220114_rework_redirect_routes_indexes.rb b/db/migrate/20180113220114_rework_redirect_routes_indexes.rb index 4c3bb0a26ce..2b9365ce827 100644 --- a/db/migrate/20180113220114_rework_redirect_routes_indexes.rb +++ b/db/migrate/20180113220114_rework_redirect_routes_indexes.rb @@ -20,9 +20,7 @@ class ReworkRedirectRoutesIndexes < ActiveRecord::Migration[4.2] def up disable_statement_timeout do # this is a plain btree on a single boolean column. It'll never be - # selective enough to be valuable. This class is called by - # setup_postgresql.rake so it needs to be able to handle this - # index not existing. + # selective enough to be valuable. if index_exists?(:redirect_routes, :permanent) remove_concurrent_index(:redirect_routes, :permanent) end diff --git a/db/post_migrate/20180306164012_add_path_index_to_redirect_routes.rb b/db/post_migrate/20180306164012_add_path_index_to_redirect_routes.rb index 53918250b4c..d44ec1036c4 100644 --- a/db/post_migrate/20180306164012_add_path_index_to_redirect_routes.rb +++ b/db/post_migrate/20180306164012_add_path_index_to_redirect_routes.rb @@ -14,9 +14,7 @@ class AddPathIndexToRedirectRoutes < ActiveRecord::Migration[4.2] # RedirectRoute.matching_path_and_descendants # # This same index is also added in the `ReworkRedirectRoutesIndexes` so this - # is a no-op in most cases. But this migration is also called from the - # `setup_postgresql.rake` task when setting up a new database, in which case - # we want to create the index. + # is a no-op in most cases. def up return unless Gitlab::Database.postgresql? @@ -31,8 +29,5 @@ class AddPathIndexToRedirectRoutes < ActiveRecord::Migration[4.2] # Do nothing in the DOWN. Since the index above is originally created in the # `ReworkRedirectRoutesIndexes`. This migration wouldn't have actually # created any new index. - # - # This migration is only here to be called form `setup_postgresql.rake` so - # any newly created database would have this index. end end diff --git a/db/schema.rb b/db/schema.rb index aff672919c1..8fcced21d56 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -2917,6 +2917,7 @@ ActiveRecord::Schema.define(version: 2019_09_26_041216) do t.boolean "emails_disabled" t.integer "max_pages_size" t.integer "max_artifacts_size" + t.index "lower((name)::text)", name: "index_projects_on_lower_name" t.index ["archived", "pending_delete", "merge_requests_require_code_owner_approval"], name: "projects_requiring_code_owner_approval", where: "((pending_delete = false) AND (archived = false) AND (merge_requests_require_code_owner_approval = true))" t.index ["created_at"], name: "index_projects_on_created_at" t.index ["creator_id"], name: "index_projects_on_creator_id" @@ -3113,6 +3114,7 @@ ActiveRecord::Schema.define(version: 2019_09_26_041216) do t.string "path", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.index "lower((path)::text) varchar_pattern_ops", name: "index_redirect_routes_on_path_unique_text_pattern_ops", unique: true t.index ["path"], name: "index_redirect_routes_on_path", unique: true t.index ["source_type", "source_id"], name: "index_redirect_routes_on_source_type_and_source_id" end @@ -3641,6 +3643,7 @@ ActiveRecord::Schema.define(version: 2019_09_26_041216) do t.string "first_name", limit: 255 t.string "last_name", limit: 255 t.string "static_object_token", limit: 255 + t.index "lower((name)::text)", name: "index_on_users_name_lower" t.index ["accepted_term_id"], name: "index_users_on_accepted_term_id" t.index ["admin"], name: "index_users_on_admin" t.index ["bot_type"], name: "index_users_on_bot_type" diff --git a/doc/api/group_labels.md b/doc/api/group_labels.md index 5030bba3159..9563f967a2a 100644 --- a/doc/api/group_labels.md +++ b/doc/api/group_labels.md @@ -16,6 +16,7 @@ GET /groups/:id/labels | --------- | ---- | -------- | ----------- | | `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user. | | `with_counts` | boolean | no | Whether or not to include issue and merge request counts. Defaults to `false`. _([Introduced in GitLab 12.2](https://gitlab.com/gitlab-org/gitlab-foss/merge_requests/31543))_ | +| `include_ancestor_groups` | boolean | no | Include ancestor groups. Defaults to `true`. | ```bash curl --header "PRIVATE-TOKEN: " https://gitlab.example.com/api/v4/groups/5/labels?with_counts=true diff --git a/doc/api/labels.md b/doc/api/labels.md index 93833fd81cb..f29c0a28cdf 100644 --- a/doc/api/labels.md +++ b/doc/api/labels.md @@ -12,6 +12,7 @@ GET /projects/:id/labels | --------- | ------- | -------- | --------------------- | | `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user | | `with_counts` | boolean | no | Whether or not to include issue and merge request counts. Defaults to `false`. _([Introduced in GitLab 12.2](https://gitlab.com/gitlab-org/gitlab-foss/merge_requests/31543))_ | +| `include_ancestor_groups` | boolean | no | Include ancestor groups. Defaults to `true`. | ```bash curl --header "PRIVATE-TOKEN: " https://gitlab.example.com/api/v4/projects/1/labels?with_counts=true diff --git a/doc/user/project/import/bitbucket.md b/doc/user/project/import/bitbucket.md index e509e333313..77fc2761e07 100644 --- a/doc/user/project/import/bitbucket.md +++ b/doc/user/project/import/bitbucket.md @@ -56,10 +56,10 @@ namespace that started the import process. ![Grant access](img/bitbucket_import_grant_access.png) 1. Click on the projects that you'd like to import or **Import all projects**. - You can also select the namespace under which each project will be - imported. + You can also filter projects by name and select the namespace under which + each project will be imported. - ![Import projects](img/bitbucket_import_select_project.png) + ![Import projects](img/bitbucket_import_select_project_v12_3.png) [bb-import]: ../../../integration/bitbucket.md [social sign-in]: ../../profile/account/social_sign_in.md diff --git a/doc/user/project/import/img/bitbucket_import_select_project.png b/doc/user/project/import/img/bitbucket_import_select_project.png deleted file mode 100644 index 1bca6166ec8e3f902bfa9f128e31fd84ac1324bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8688 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 Z#Q*Fcy(J-O&-vQ}WhKE9MPi2E{tsBHW1Rp1 diff --git a/doc/user/project/import/img/bitbucket_import_select_project_v12_3.png b/doc/user/project/import/img/bitbucket_import_select_project_v12_3.png new file mode 100644 index 0000000000000000000000000000000000000000..1f1febd9068a8e3a51acf5149662e9e400ae90d5 GIT binary patch literal 112397 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�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¥wTN<98opb|PNISvoNfz!lnd-`_<`KM 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' } + let(:expected_filter) { 'test' } + + subject { get :status, params: { filter: filter }, as: :json } + + it 'passes sanitized filter param to bitbucket client' do + expect_next_instance_of(Bitbucket::Client) do |client| + expect(client).to receive(:repos).with(filter: expected_filter).and_return([@repo]) + end + + subject + end + end end describe "POST create" do diff --git a/spec/javascripts/labels_issue_sidebar_spec.js b/spec/javascripts/labels_issue_sidebar_spec.js index ccf439aac74..5ae5643aefc 100644 --- a/spec/javascripts/labels_issue_sidebar_spec.js +++ b/spec/javascripts/labels_issue_sidebar_spec.js @@ -5,6 +5,7 @@ import MockAdapter from 'axios-mock-adapter'; import axios from '~/lib/utils/axios_utils'; import IssuableContext from '~/issuable_context'; import LabelsSelect from '~/labels_select'; +import _ from 'underscore'; import '~/gl_dropdown'; import 'select2'; @@ -15,6 +16,35 @@ import '~/users_select'; let saveLabelCount = 0; let mock; +function testLabelClicks(labelOrder, done) { + $('.edit-link') + .get(0) + .click(); + + setTimeout(() => { + const labelsInDropdown = $('.dropdown-content a'); + + expect(labelsInDropdown.length).toBe(10); + + const arrayOfLabels = labelsInDropdown.get(); + const randomArrayOfLabels = _.shuffle(arrayOfLabels); + randomArrayOfLabels.forEach((label, i) => { + if (i < saveLabelCount) { + $(label).click(); + } + }); + + $('.edit-link') + .get(0) + .click(); + + setTimeout(() => { + expect($('.sidebar-collapsed-icon').attr('data-original-title')).toBe(labelOrder); + done(); + }, 0); + }, 0); +} + describe('Issue dropdown sidebar', () => { preloadFixtures('static/issue_sidebar_label.html'); @@ -29,7 +59,7 @@ describe('Issue dropdown sidebar', () => { mock.onGet('/root/test/labels.json').reply(() => { const labels = Array(10) .fill() - .map((_, i) => ({ + .map((_val, i) => ({ id: i, title: `test ${i}`, color: '#5CB85C', @@ -41,7 +71,7 @@ describe('Issue dropdown sidebar', () => { mock.onPut('/root/test/issues/2.json').reply(() => { const labels = Array(saveLabelCount) .fill() - .map((_, i) => ({ + .map((_val, i) => ({ id: i, title: `test ${i}`, color: '#5CB85C', @@ -57,61 +87,11 @@ describe('Issue dropdown sidebar', () => { it('changes collapsed tooltip when changing labels when less than 5', done => { saveLabelCount = 5; - $('.edit-link') - .get(0) - .click(); - - setTimeout(() => { - expect($('.dropdown-content a').length).toBe(10); - - $('.dropdown-content a').each(function(i) { - if (i < saveLabelCount) { - $(this) - .get(0) - .click(); - } - }); - - $('.edit-link') - .get(0) - .click(); - - setTimeout(() => { - expect($('.sidebar-collapsed-icon').attr('data-original-title')).toBe( - 'test 0, test 1, test 2, test 3, test 4', - ); - done(); - }, 0); - }, 0); + testLabelClicks('test 0, test 1, test 2, test 3, test 4', done); }); it('changes collapsed tooltip when changing labels when more than 5', done => { saveLabelCount = 6; - $('.edit-link') - .get(0) - .click(); - - setTimeout(() => { - expect($('.dropdown-content a').length).toBe(10); - - $('.dropdown-content a').each(function(i) { - if (i < saveLabelCount) { - $(this) - .get(0) - .click(); - } - }); - - $('.edit-link') - .get(0) - .click(); - - setTimeout(() => { - expect($('.sidebar-collapsed-icon').attr('data-original-title')).toBe( - 'test 0, test 1, test 2, test 3, test 4, and 1 more', - ); - done(); - }, 0); - }, 0); + testLabelClicks('test 0, test 1, test 2, test 3, test 4, and 1 more', done); }); }); diff --git a/spec/requests/api/group_labels_spec.rb b/spec/requests/api/group_labels_spec.rb index 0be4e2e9121..3ac394b57c5 100644 --- a/spec/requests/api/group_labels_spec.rb +++ b/spec/requests/api/group_labels_spec.rb @@ -5,9 +5,11 @@ require 'spec_helper' describe API::GroupLabels do let(:user) { create(:user) } let(:group) { create(:group) } + let(:subgroup) { create(:group, parent: group) } let!(:group_member) { create(:group_member, group: group, user: user) } - let!(:label1) { create(:group_label, title: 'feature', group: group) } - let!(:label2) { create(:group_label, title: 'bug', group: group) } + let!(:group_label1) { create(:group_label, title: 'feature', group: group) } + let!(:group_label2) { create(:group_label, title: 'bug', group: group) } + let!(:subgroup_label) { create(:group_label, title: 'support', group: subgroup) } describe 'GET :id/labels' do it 'returns all available labels for the group' do @@ -35,6 +37,34 @@ describe API::GroupLabels do end end + describe 'GET :subgroup_id/labels' do + context 'when the include_ancestor_groups parameter is not set' do + it 'returns all available labels for the group and ancestor groups' do + get api("/groups/#{subgroup.id}/labels", user) + + expect(response).to have_gitlab_http_status(200) + expect(response).to include_pagination_headers + expect(json_response).to be_an Array + expect(json_response).to all(match_schema('public_api/v4/labels/label')) + expect(json_response.size).to eq(3) + expect(json_response.map {|r| r['name'] }).to contain_exactly('feature', 'bug', 'support') + end + end + + context 'when the include_ancestor_groups parameter is set to false' do + it 'returns all available labels for the group but not for ancestor groups' do + get api("/groups/#{subgroup.id}/labels", user), params: { include_ancestor_groups: false } + + expect(response).to have_gitlab_http_status(200) + expect(response).to include_pagination_headers + expect(json_response).to be_an Array + expect(json_response).to all(match_schema('public_api/v4/labels/label')) + expect(json_response.size).to eq(1) + expect(json_response.map {|r| r['name'] }).to contain_exactly('support') + end + end + end + describe 'POST /groups/:id/labels' do it 'returns created label when all params are given' do post api("/groups/#{group.id}/labels", user), @@ -78,7 +108,7 @@ describe API::GroupLabels do it 'returns 409 if label already exists' do post api("/groups/#{group.id}/labels", user), params: { - name: label1.name, + name: group_label1.name, color: '#FFAABB' } @@ -89,13 +119,13 @@ describe API::GroupLabels do describe 'DELETE /groups/:id/labels' do it 'returns 204 for existing label' do - delete api("/groups/#{group.id}/labels", user), params: { name: label1.name } + delete api("/groups/#{group.id}/labels", user), params: { name: group_label1.name } expect(response).to have_gitlab_http_status(204) end it 'returns 404 for non existing label' do - delete api("/groups/#{group.id}/labels", user), params: { name: 'label2' } + delete api("/groups/#{group.id}/labels", user), params: { name: 'not_exists' } expect(response).to have_gitlab_http_status(404) expect(json_response['message']).to eq('404 Label Not Found') @@ -115,12 +145,12 @@ describe API::GroupLabels do expect(response).to have_gitlab_http_status(204) expect(subgroup.labels.size).to eq(0) - expect(group.labels).to include(label1) + expect(group.labels).to include(group_label1) end it_behaves_like '412 response' do let(:request) { api("/groups/#{group.id}/labels", user) } - let(:params) { { name: label1.name } } + let(:params) { { name: group_label1.name } } end end @@ -128,7 +158,7 @@ describe API::GroupLabels do it 'returns 200 if name and colors and description are changed' do put api("/groups/#{group.id}/labels", user), params: { - name: label1.name, + name: group_label1.name, new_name: 'New Label', color: '#FFFFFF', description: 'test' @@ -152,13 +182,13 @@ describe API::GroupLabels do expect(response).to have_gitlab_http_status(200) expect(subgroup.labels[0].name).to eq('New Label') - expect(label1.name).to eq('feature') + expect(group_label1.name).to eq('feature') end it 'returns 404 if label does not exist' do put api("/groups/#{group.id}/labels", user), params: { - name: 'label2', + name: 'not_exists', new_name: 'label3' } @@ -166,14 +196,14 @@ describe API::GroupLabels do end it 'returns 400 if no label name given' do - put api("/groups/#{group.id}/labels", user), params: { new_name: label1.name } + put api("/groups/#{group.id}/labels", user), params: { new_name: group_label1.name } expect(response).to have_gitlab_http_status(400) expect(json_response['error']).to eq('name is missing') end it 'returns 400 if no new parameters given' do - put api("/groups/#{group.id}/labels", user), params: { name: label1.name } + put api("/groups/#{group.id}/labels", user), params: { name: group_label1.name } expect(response).to have_gitlab_http_status(400) expect(json_response['error']).to eq('new_name, color, description are missing, '\ @@ -184,31 +214,31 @@ describe API::GroupLabels do describe 'POST /groups/:id/labels/:label_id/subscribe' do context 'when label_id is a label title' do it 'subscribes to the label' do - post api("/groups/#{group.id}/labels/#{label1.title}/subscribe", user) + post api("/groups/#{group.id}/labels/#{group_label1.title}/subscribe", user) expect(response).to have_gitlab_http_status(201) - expect(json_response['name']).to eq(label1.title) + expect(json_response['name']).to eq(group_label1.title) expect(json_response['subscribed']).to be_truthy end end context 'when label_id is a label ID' do it 'subscribes to the label' do - post api("/groups/#{group.id}/labels/#{label1.id}/subscribe", user) + post api("/groups/#{group.id}/labels/#{group_label1.id}/subscribe", user) expect(response).to have_gitlab_http_status(201) - expect(json_response['name']).to eq(label1.title) + expect(json_response['name']).to eq(group_label1.title) expect(json_response['subscribed']).to be_truthy end end context 'when user is already subscribed to label' do before do - label1.subscribe(user) + group_label1.subscribe(user) end it 'returns 304' do - post api("/groups/#{group.id}/labels/#{label1.id}/subscribe", user) + post api("/groups/#{group.id}/labels/#{group_label1.id}/subscribe", user) expect(response).to have_gitlab_http_status(304) end @@ -225,36 +255,36 @@ describe API::GroupLabels do describe 'POST /groups/:id/labels/:label_id/unsubscribe' do before do - label1.subscribe(user) + group_label1.subscribe(user) end context 'when label_id is a label title' do it 'unsubscribes from the label' do - post api("/groups/#{group.id}/labels/#{label1.title}/unsubscribe", user) + post api("/groups/#{group.id}/labels/#{group_label1.title}/unsubscribe", user) expect(response).to have_gitlab_http_status(201) - expect(json_response['name']).to eq(label1.title) + expect(json_response['name']).to eq(group_label1.title) expect(json_response['subscribed']).to be_falsey end end context 'when label_id is a label ID' do it 'unsubscribes from the label' do - post api("/groups/#{group.id}/labels/#{label1.id}/unsubscribe", user) + post api("/groups/#{group.id}/labels/#{group_label1.id}/unsubscribe", user) expect(response).to have_gitlab_http_status(201) - expect(json_response['name']).to eq(label1.title) + expect(json_response['name']).to eq(group_label1.title) expect(json_response['subscribed']).to be_falsey end end context 'when user is already unsubscribed from label' do before do - label1.unsubscribe(user) + group_label1.unsubscribe(user) end it 'returns 304' do - post api("/groups/#{group.id}/labels/#{label1.id}/unsubscribe", user) + post api("/groups/#{group.id}/labels/#{group_label1.id}/unsubscribe", user) expect(response).to have_gitlab_http_status(304) end diff --git a/spec/requests/api/groups_spec.rb b/spec/requests/api/groups_spec.rb index b3acf531ccb..ec587a28f4f 100644 --- a/spec/requests/api/groups_spec.rb +++ b/spec/requests/api/groups_spec.rb @@ -497,6 +497,29 @@ describe API::Groups do expect(response).to have_gitlab_http_status(404) end + + context 'within a subgroup' do + let(:group3) { create(:group, visibility_level: Gitlab::VisibilityLevel::PUBLIC) } + let!(:subgroup) { create(:group, parent: group3, visibility_level: Gitlab::VisibilityLevel::PUBLIC) } + + before do + group3.add_owner(user3) + end + + it 'does not change visibility when not requested' do + put api("/groups/#{group3.id}", user3), params: { description: 'Bug #23083' } + + expect(response).to have_gitlab_http_status(200) + expect(json_response['visibility']).to eq('public') + end + + it 'prevents making private a group containing public subgroups' do + put api("/groups/#{group3.id}", user3), params: { visibility: 'private' } + + expect(response).to have_gitlab_http_status(400) + expect(json_response['message']['visibility_level']).to contain_exactly('private is not allowed since there are sub-groups with higher visibility.') + end + end end context 'when authenticated as the admin' do diff --git a/spec/requests/api/labels_spec.rb b/spec/requests/api/labels_spec.rb index 9aef67e28a7..4f8233a9110 100644 --- a/spec/requests/api/labels_spec.rb +++ b/spec/requests/api/labels_spec.rb @@ -256,6 +256,52 @@ describe API::Labels do 'is_project_label' => true) end end + + context 'when the include_ancestor_groups parameter is not set' do + let(:group) { create(:group) } + let!(:group_label) { create(:group_label, title: 'feature', group: group) } + let(:subgroup) { create(:group, parent: group) } + let!(:subgroup_label) { create(:group_label, title: 'support', group: subgroup) } + + before do + subgroup.add_owner(user) + project.update!(group: subgroup) + end + + it 'returns all available labels for the project, parent group and ancestor groups' do + get api("/projects/#{project.id}/labels", user) + + expect(response).to have_gitlab_http_status(200) + expect(response).to include_pagination_headers + expect(json_response).to be_an Array + expect(json_response).to all(match_schema('public_api/v4/labels/label')) + expect(json_response.size).to eq(4) + expect(json_response.map {|r| r['name'] }).to contain_exactly(group_label.name, subgroup_label.name, priority_label.name, label1.name) + end + end + + context 'when the include_ancestor_groups parameter is set to false' do + let(:group) { create(:group) } + let!(:group_label) { create(:group_label, title: 'feature', group: group) } + let(:subgroup) { create(:group, parent: group) } + let!(:subgroup_label) { create(:group_label, title: 'support', group: subgroup) } + + before do + subgroup.add_owner(user) + project.update!(group: subgroup) + end + + it 'returns all available labels for the project and the parent group only' do + get api("/projects/#{project.id}/labels", user), params: { include_ancestor_groups: false } + + expect(response).to have_gitlab_http_status(200) + expect(response).to include_pagination_headers + expect(json_response).to be_an Array + expect(json_response).to all(match_schema('public_api/v4/labels/label')) + expect(json_response.size).to eq(3) + expect(json_response.map {|r| r['name'] }).to contain_exactly(subgroup_label.name, priority_label.name, label1.name) + end + end end describe 'POST /projects/:id/labels' do