diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-04-22 12:09:49 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-04-22 12:09:49 +0000 |
commit | 4b074c5f634f8e1e550107f9e8237f07878ca0e8 (patch) | |
tree | 00afed4a6853548ec97203f3f807d954180b547d /app | |
parent | b81fd57f3d62db4455108c8de4b8d7b8d403de35 (diff) | |
download | gitlab-ce-4b074c5f634f8e1e550107f9e8237f07878ca0e8.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
23 files changed, 193 insertions, 74 deletions
diff --git a/app/assets/javascripts/content_editor/services/markdown_serializer.js b/app/assets/javascripts/content_editor/services/markdown_serializer.js index e3b5775e320..44b60fc46ee 100644 --- a/app/assets/javascripts/content_editor/services/markdown_serializer.js +++ b/app/assets/javascripts/content_editor/services/markdown_serializer.js @@ -1,7 +1,7 @@ import { MarkdownSerializer as ProseMirrorMarkdownSerializer, defaultMarkdownSerializer, -} from 'prosemirror-markdown'; +} from 'prosemirror-markdown/src/to_markdown'; import { DOMParser as ProseMirrorDOMParser } from 'prosemirror-model'; const wrapHtmlPayload = (payload) => `<div>${payload}</div>`; diff --git a/app/assets/javascripts/members/components/table/members_table.vue b/app/assets/javascripts/members/components/table/members_table.vue index 236aeaef418..c9ac9da0501 100644 --- a/app/assets/javascripts/members/components/table/members_table.vue +++ b/app/assets/javascripts/members/components/table/members_table.vue @@ -1,8 +1,9 @@ <script> -import { GlTable, GlBadge } from '@gitlab/ui'; +import { GlTable, GlBadge, GlPagination } from '@gitlab/ui'; import { mapState } from 'vuex'; import MembersTableCell from 'ee_else_ce/members/components/table/members_table_cell.vue'; import { canOverride, canRemove, canResend, canUpdate } from 'ee_else_ce/members/utils'; +import { mergeUrlParams } from '~/lib/utils/url_utility'; import initUserPopovers from '~/user_popovers'; import { FIELDS } from '../../constants'; import RemoveGroupLinkModal from '../modals/remove_group_link_modal.vue'; @@ -19,6 +20,7 @@ export default { components: { GlTable, GlBadge, + GlPagination, MemberAvatar, CreatedAt, ExpiresAt, @@ -43,6 +45,9 @@ export default { tableAttrs(state) { return state[this.namespace].tableAttrs; }, + pagination(state) { + return state[this.namespace].pagination; + }, }), filteredFields() { return FIELDS.filter( @@ -59,6 +64,11 @@ export default { userIsLoggedIn() { return this.currentUserId !== null; }, + showPagination() { + const { paramName, currentPage, perPage, totalItems } = this.pagination; + + return paramName && currentPage && perPage && totalItems; + }, }, mounted() { initUserPopovers(this.$el.querySelectorAll('.js-user-link')); @@ -99,6 +109,11 @@ export default { ...(member?.id && { 'data-testid': `members-table-row-${member.id}` }), }; }, + paginationLinkGenerator(page) { + const { params = {}, paramName } = this.pagination; + + return mergeUrlParams({ ...params, [paramName]: page }, window.location.href); + }, }, }; </script> @@ -179,6 +194,18 @@ export default { <span data-testid="col-actions" class="gl-sr-only">{{ label }}</span> </template> </gl-table> + <gl-pagination + v-if="showPagination" + :value="pagination.currentPage" + :per-page="pagination.perPage" + :total-items="pagination.totalItems" + :link-gen="paginationLinkGenerator" + :prev-text="__('Prev')" + :next-text="__('Next')" + :label-next-page="__('Go to next page')" + :label-prev-page="__('Go to previous page')" + align="center" + /> <remove-group-link-modal /> <ldap-override-confirmation-modal /> </div> diff --git a/app/assets/javascripts/members/store/state.js b/app/assets/javascripts/members/store/state.js index 4006b4b501d..5415b1c5f25 100644 --- a/app/assets/javascripts/members/store/state.js +++ b/app/assets/javascripts/members/store/state.js @@ -1,5 +1,6 @@ export default ({ members, + pagination, tableFields, tableAttrs, tableSortableFields, @@ -8,6 +9,7 @@ export default ({ filteredSearchBar, }) => ({ members, + pagination, tableFields, tableAttrs, tableSortableFields, diff --git a/app/assets/javascripts/members/utils.js b/app/assets/javascripts/members/utils.js index 2bf30dd7b6e..031438d6ace 100644 --- a/app/assets/javascripts/members/utils.js +++ b/app/assets/javascripts/members/utils.js @@ -105,10 +105,14 @@ export const buildSortHref = ({ export const canOverride = () => false; export const parseDataAttributes = (el) => { - const { members, sourceId, memberPath, canManageMembers } = el.dataset; + const { members, pagination, sourceId, memberPath, canManageMembers } = el.dataset; return { members: convertObjectPropsToCamelCase(JSON.parse(members), { deep: true }), + pagination: convertObjectPropsToCamelCase(JSON.parse(pagination || '{}'), { + deep: true, + ignoreKeyNames: ['params'], + }), sourceId: parseInt(sourceId, 10), memberPath, canManageMembers: parseBoolean(canManageMembers), diff --git a/app/assets/javascripts/pages/users/activity_calendar.js b/app/assets/javascripts/pages/users/activity_calendar.js index d236dc4610a..c416106fdd8 100644 --- a/app/assets/javascripts/pages/users/activity_calendar.js +++ b/app/assets/javascripts/pages/users/activity_calendar.js @@ -247,7 +247,7 @@ export default class ActivityCalendar { renderKey() { const keyValues = [ - __('no contributions'), + __('No contributions'), __('1-9 contributions'), __('10-19 contributions'), __('20-29 contributions'), diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index 67829874b4b..c57b66ec9b5 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -10,12 +10,15 @@ class Admin::UsersController < Admin::ApplicationController feature_category :users + PAGINATION_WITH_COUNT_LIMIT = 1000 + def index @users = User.filter_items(params[:filter]).order_name_asc @users = @users.search_with_secondary_emails(params[:search_query]) if params[:search_query].present? @users = users_with_included_associations(@users) @users = @users.sort_by_attribute(@sort = params[:sort]) @users = @users.page(params[:page]) + @users = @users.without_count if paginate_without_count? @cohorts = load_cohorts @@ -228,6 +231,12 @@ class Admin::UsersController < Admin::ApplicationController protected + def paginate_without_count? + counts = Gitlab::Database::Count.approximate_counts([User]) + + counts[User] > PAGINATION_WITH_COUNT_LIMIT + end + def users_with_included_associations(users) users.includes(:authorized_projects) # rubocop: disable CodeReuse/ActiveRecord end diff --git a/app/controllers/projects/settings/ci_cd_controller.rb b/app/controllers/projects/settings/ci_cd_controller.rb index 1a465406660..014f348d630 100644 --- a/app/controllers/projects/settings/ci_cd_controller.rb +++ b/app/controllers/projects/settings/ci_cd_controller.rb @@ -119,12 +119,13 @@ module Projects .assignable_for(project) .ordered .page(params[:specific_page]).per(NUMBER_OF_RUNNERS_PER_PAGE) + .with_tags - @shared_runners = ::Ci::Runner.instance_type.active + @shared_runners = ::Ci::Runner.instance_type.active.with_tags @shared_runners_count = @shared_runners.count(:all) - @group_runners = ::Ci::Runner.belonging_to_parent_group_of_project(@project.id) + @group_runners = ::Ci::Runner.belonging_to_parent_group_of_project(@project.id).with_tags end def define_ci_variables diff --git a/app/experiments/concerns/project_commit_count.rb b/app/experiments/concerns/project_commit_count.rb new file mode 100644 index 00000000000..706a1a24640 --- /dev/null +++ b/app/experiments/concerns/project_commit_count.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module ProjectCommitCount + include Gitlab::Git::WrapsGitalyErrors + + def commit_count_for(project, default_count: 0, max_count: nil, **exception_details) + raw_repo = project.repository&.raw_repository + root_ref = raw_repo&.root_ref + + return default_count unless root_ref + + Gitlab::GitalyClient::CommitService.new(raw_repo).commit_count(root_ref, { + all: true, # include all branches + max_count: max_count # limit as an optimization + }) + rescue StandardError => e + Gitlab::ErrorTracking.track_exception(e, exception_details) + + default_count + end +end diff --git a/app/experiments/empty_repo_upload_experiment.rb b/app/experiments/empty_repo_upload_experiment.rb new file mode 100644 index 00000000000..d0d79a5fb45 --- /dev/null +++ b/app/experiments/empty_repo_upload_experiment.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +class EmptyRepoUploadExperiment < ApplicationExperiment # rubocop:disable Gitlab/NamespacedClass + include ProjectCommitCount + + TRACKING_START_DATE = DateTime.parse('2021/4/20') + INITIAL_COMMIT_COUNT = 1 + + def track_initial_write + return unless should_track? # early return if we don't need to ask for commit counts + return unless context.project.created_at > TRACKING_START_DATE # early return for older projects + return unless commit_count == INITIAL_COMMIT_COUNT + + track(:initial_write, project: context.project) + end + + private + + def commit_count + commit_count_for(context.project, max_count: INITIAL_COMMIT_COUNT, experiment: name) + end +end diff --git a/app/experiments/new_project_readme_experiment.rb b/app/experiments/new_project_readme_experiment.rb index 8f88ad2adc1..c5c41330949 100644 --- a/app/experiments/new_project_readme_experiment.rb +++ b/app/experiments/new_project_readme_experiment.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class NewProjectReadmeExperiment < ApplicationExperiment # rubocop:disable Gitlab/NamespacedClass - include Gitlab::Git::WrapsGitalyErrors + include ProjectCommitCount INITIAL_WRITE_LIMIT = 3 EXPERIMENT_START_DATE = DateTime.parse('2021/1/20') @@ -21,25 +21,18 @@ class NewProjectReadmeExperiment < ApplicationExperiment # rubocop:disable Gitla def track_initial_writes(project) return unless should_track? # early return if we don't need to ask for commit counts return unless project.created_at > EXPERIMENT_START_DATE # early return for older projects - return unless (commit_count = commit_count_for(project)) < INITIAL_WRITE_LIMIT + return unless (count = commit_count(project)) < INITIAL_WRITE_LIMIT - track(:write, property: project.created_at.to_s, value: commit_count) + track(:write, property: project.created_at.to_s, value: count) end private - def commit_count_for(project) - raw_repo = project.repository&.raw_repository - return INITIAL_WRITE_LIMIT unless raw_repo&.root_ref - - begin - Gitlab::GitalyClient::CommitService.new(raw_repo).commit_count(raw_repo.root_ref, { - all: true, # include all branches - max_count: INITIAL_WRITE_LIMIT # limit as an optimization - }) - rescue StandardError => e - Gitlab::ErrorTracking.track_exception(e, experiment: name) - INITIAL_WRITE_LIMIT - end + def commit_count(project) + commit_count_for(project, + default_count: INITIAL_WRITE_LIMIT, + max_count: INITIAL_WRITE_LIMIT, + experiment: name + ) end end diff --git a/app/graphql/mutations/labels/create.rb b/app/graphql/mutations/labels/create.rb index ccbd1c37cbf..eeda9c0a1e9 100644 --- a/app/graphql/mutations/labels/create.rb +++ b/app/graphql/mutations/labels/create.rb @@ -23,7 +23,11 @@ module Mutations argument :color, GraphQL::STRING_TYPE, required: false, default_value: Label::DEFAULT_COLOR, - description: "The color of the label given in 6-digit hex notation with leading '#' sign (e.g. #FFAABB) or one of the CSS color names in https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#Color_keywords." + description: <<~DESC + The color of the label given in 6-digit hex notation with leading '#' sign + (for example, `#FFAABB`) or one of the CSS color names + <https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#Color_keywords>. + DESC authorize :admin_label diff --git a/app/graphql/resolvers/concerns/issue_resolver_arguments.rb b/app/graphql/resolvers/concerns/issue_resolver_arguments.rb index 0ff3997f3bc..aa08d62c6a5 100644 --- a/app/graphql/resolvers/concerns/issue_resolver_arguments.rb +++ b/app/graphql/resolvers/concerns/issue_resolver_arguments.rb @@ -7,57 +7,57 @@ module IssueResolverArguments include LooksAhead argument :iid, GraphQL::STRING_TYPE, - required: false, - description: 'IID of the issue. For example, "1".' + required: false, + description: 'IID of the issue. For example, "1".' argument :iids, [GraphQL::STRING_TYPE], - required: false, - description: 'List of IIDs of issues. For example, [1, 2].' + required: false, + description: 'List of IIDs of issues. For example, ["1", "2"].' argument :label_name, [GraphQL::STRING_TYPE, null: true], - required: false, - description: 'Labels applied to this issue.' + required: false, + description: 'Labels applied to this issue.' argument :milestone_title, [GraphQL::STRING_TYPE, null: true], - required: false, - description: 'Milestone applied to this issue.' + required: false, + description: 'Milestone applied to this issue.' argument :author_username, GraphQL::STRING_TYPE, - required: false, - description: 'Username of the author of the issue.' + required: false, + description: 'Username of the author of the issue.' argument :assignee_username, GraphQL::STRING_TYPE, - required: false, - description: 'Username of a user assigned to the issue.', - deprecated: { reason: 'Use `assigneeUsernames`', milestone: '13.11' } + required: false, + description: 'Username of a user assigned to the issue.', + deprecated: { reason: 'Use `assigneeUsernames`', milestone: '13.11' } argument :assignee_usernames, [GraphQL::STRING_TYPE], - required: false, - description: 'Usernames of users assigned to the issue.' + required: false, + description: 'Usernames of users assigned to the issue.' argument :assignee_id, GraphQL::STRING_TYPE, - required: false, - description: 'ID of a user assigned to the issues, "none" and "any" values are supported.' + required: false, + description: 'ID of a user assigned to the issues, "none" and "any" values are supported.' argument :created_before, Types::TimeType, - required: false, - description: 'Issues created before this date.' + required: false, + description: 'Issues created before this date.' argument :created_after, Types::TimeType, - required: false, - description: 'Issues created after this date.' + required: false, + description: 'Issues created after this date.' argument :updated_before, Types::TimeType, - required: false, - description: 'Issues updated before this date.' + required: false, + description: 'Issues updated before this date.' argument :updated_after, Types::TimeType, - required: false, - description: 'Issues updated after this date.' + required: false, + description: 'Issues updated after this date.' argument :closed_before, Types::TimeType, - required: false, - description: 'Issues closed before this date.' + required: false, + description: 'Issues closed before this date.' argument :closed_after, Types::TimeType, - required: false, - description: 'Issues closed after this date.' + required: false, + description: 'Issues closed after this date.' argument :search, GraphQL::STRING_TYPE, - required: false, - description: 'Search query for issue title or description.' + required: false, + description: 'Search query for issue title or description.' argument :types, [Types::IssueTypeEnum], - as: :issue_types, - description: 'Filter issues by the given issue types.', - required: false + as: :issue_types, + description: 'Filter issues by the given issue types.', + required: false argument :not, Types::Issues::NegatedIssueFilterInputType, - description: 'List of negated params.', + description: 'Negated arguments.', prepare: ->(negated_args, ctx) { negated_args.to_h }, required: false end diff --git a/app/helpers/gitlab_routing_helper.rb b/app/helpers/gitlab_routing_helper.rb index 48af4793fb0..5f15686560d 100644 --- a/app/helpers/gitlab_routing_helper.rb +++ b/app/helpers/gitlab_routing_helper.rb @@ -166,6 +166,16 @@ module GitlabRoutingHelper resend_invite_group_group_member_path(group_member.source, group_member) end + # Members + def source_members_url(member) + case member.source_type + when 'Namespace' + group_group_members_url(member.source) + when 'Project' + project_project_members_url(member.source) + end + end + # Artifacts # Rails path generators are slow because they need to do large regex comparisons diff --git a/app/helpers/groups/group_members_helper.rb b/app/helpers/groups/group_members_helper.rb index 3e7d6febabf..4bd18b62e0d 100644 --- a/app/helpers/groups/group_members_helper.rb +++ b/app/helpers/groups/group_members_helper.rb @@ -22,9 +22,10 @@ module Groups::GroupMembersHelper end # Overridden in `ee/app/helpers/ee/groups/group_members_helper.rb` - def group_members_list_data_attributes(group, members) + def group_members_list_data_attributes(group, members, pagination = {}) { members: members_data_json(group, members), + pagination: members_pagination_data_json(members, pagination), member_path: group_group_member_path(group, ':id'), source_id: group.id, can_manage_members: can?(current_user, :admin_group_member, group).to_s @@ -32,8 +33,11 @@ module Groups::GroupMembersHelper end def group_group_links_list_data_attributes(group) + group_links = group.shared_with_group_links + { - members: group_group_links_data_json(group.shared_with_group_links), + members: group_group_links_data_json(group_links), + pagination: members_pagination_data_json(group_links), member_path: group_group_link_path(group, ':id'), source_id: group.id } diff --git a/app/helpers/members_helper.rb b/app/helpers/members_helper.rb index 5dc636ad996..4261f0660d5 100644 --- a/app/helpers/members_helper.rb +++ b/app/helpers/members_helper.rb @@ -65,4 +65,14 @@ module MembersHelper 'group and any subresources' end + + def members_pagination_data_json(members, pagination = {}) + { + current_page: members.respond_to?(:current_page) ? members.current_page : nil, + per_page: members.respond_to?(:limit_value) ? members.limit_value : nil, + total_items: members.respond_to?(:total_count) ? members.total_count : members.count, + param_name: pagination[:param_name] || nil, + params: pagination[:params] || {} + }.to_json + end end diff --git a/app/helpers/projects/project_members_helper.rb b/app/helpers/projects/project_members_helper.rb index 662afbcfd25..d3559c14d0d 100644 --- a/app/helpers/projects/project_members_helper.rb +++ b/app/helpers/projects/project_members_helper.rb @@ -35,9 +35,10 @@ module Projects::ProjectMembersHelper MemberSerializer.new.represent(members, { current_user: current_user, group: project.group, source: project }).to_json end - def project_members_list_data_attributes(project, members) + def project_members_list_data_attributes(project, members, pagination = {}) { members: project_members_data_json(project, members), + pagination: members_pagination_data_json(members, pagination), member_path: project_project_member_path(project, ':id'), source_id: project.id, can_manage_members: can_manage_project_members?(project).to_s @@ -47,6 +48,7 @@ module Projects::ProjectMembersHelper def project_group_links_list_data_attributes(project, group_links) { members: project_group_links_data_json(group_links), + pagination: members_pagination_data_json(group_links), member_path: project_group_link_path(project, ':id'), source_id: project.id, can_manage_members: can_manage_project_members?(project).to_s diff --git a/app/models/concerns/cascading_namespace_setting_attribute.rb b/app/models/concerns/cascading_namespace_setting_attribute.rb index 2b4a108a9a0..2100e6a4237 100644 --- a/app/models/concerns/cascading_namespace_setting_attribute.rb +++ b/app/models/concerns/cascading_namespace_setting_attribute.rb @@ -55,6 +55,7 @@ module CascadingNamespaceSettingAttribute # public methods define_attr_reader(attribute) define_attr_writer(attribute) + define_lock_attr_writer(attribute) define_lock_methods(attribute) alias_boolean(attribute) @@ -97,7 +98,17 @@ module CascadingNamespaceSettingAttribute def define_attr_writer(attribute) define_method("#{attribute}=") do |value| + return value if value == cascaded_ancestor_value(attribute) + clear_memoization(attribute) + super(value) + end + end + + def define_lock_attr_writer(attribute) + define_method("lock_#{attribute}=") do |value| + attr_value = public_send(attribute) # rubocop:disable GitlabSecurity/PublicSend + write_attribute(attribute, attr_value) if self[attribute].nil? super(value) end diff --git a/app/policies/project_member_policy.rb b/app/policies/project_member_policy.rb index ca33b95e523..91f1eb35506 100644 --- a/app/policies/project_member_policy.rb +++ b/app/policies/project_member_policy.rb @@ -8,7 +8,11 @@ class ProjectMemberPolicy < BasePolicy condition(:project_bot) { @subject.user&.project_bot? } rule { anonymous }.prevent_all - rule { target_is_owner }.prevent_all + + rule { target_is_owner }.policy do + prevent :update_project_member + prevent :destroy_project_member + end rule { ~project_bot & can?(:admin_project_member) }.policy do enable :update_project_member diff --git a/app/views/admin/users/_users.html.haml b/app/views/admin/users/_users.html.haml index cd128e39c4f..3c325f8a456 100644 --- a/app/views/admin/users/_users.html.haml +++ b/app/views/admin/users/_users.html.haml @@ -83,6 +83,6 @@ = render partial: 'admin/users/user', collection: @users -= paginate @users, theme: "gitlab" += paginate_collection @users = render partial: 'admin/users/modals' diff --git a/app/views/groups/group_members/index.html.haml b/app/views/groups/group_members/index.html.haml index 106a7832cc7..53ca694299e 100644 --- a/app/views/groups/group_members/index.html.haml +++ b/app/views/groups/group_members/index.html.haml @@ -62,10 +62,9 @@ %span.badge.gl-tab-counter-badge.badge-muted.badge-pill.gl-badge.sm= @requesters.count .tab-content #tab-members.tab-pane{ class: ('active' unless invited_active) } - .js-group-members-list{ data: group_members_list_data_attributes(@group, @members) } + .js-group-members-list{ data: group_members_list_data_attributes(@group, @members, { param_name: :page, params: { invited_members_page: nil, search_invited: nil } }) } .loading .spinner.spinner-md - = paginate @members, theme: 'gitlab', params: { invited_members_page: nil, search_invited: nil } - if @group.shared_with_group_links.any? #tab-groups.tab-pane .js-group-group-links-list{ data: group_group_links_list_data_attributes(@group) } @@ -73,10 +72,9 @@ .spinner.spinner-md - if show_invited_members #tab-invited-members.tab-pane{ class: ('active' if invited_active) } - .js-group-invited-members-list{ data: group_members_list_data_attributes(@group, @invited_members) } + .js-group-invited-members-list{ data: group_members_list_data_attributes(@group, @invited_members, { param_name: :invited_members_page, params: { page: nil } }) } .loading .spinner.spinner-md - = paginate @invited_members, param_name: 'invited_members_page', theme: 'gitlab', params: { page: nil } - if show_access_requests #tab-access-requests.tab-pane .js-group-access-requests-list{ data: group_members_list_data_attributes(@group, @requesters) } diff --git a/app/views/projects/blob/viewers/_license.html.haml b/app/views/projects/blob/viewers/_license.html.haml index d2bd90a898a..320d7dd4b9f 100644 --- a/app/views/projects/blob/viewers/_license.html.haml +++ b/app/views/projects/blob/viewers/_license.html.haml @@ -1,8 +1,6 @@ - license = viewer.license = sprite_icon('scale') -This project is licensed under the -= succeed '.' do - %strong= license.name += _("This project is licensed under the %{strong_start}%{license_name}%{strong_end}.").html_safe % { license_name: license.name, strong_start: '<strong>'.html_safe, strong_end: '</strong>'.html_safe } -= link_to 'Learn more', license.url, target: '_blank', rel: 'noopener noreferrer' += link_to _('Learn more'), license.url, target: '_blank', rel: 'noopener noreferrer' diff --git a/app/views/projects/project_members/index.html.haml b/app/views/projects/project_members/index.html.haml index 22bf61b6873..0e4100208d9 100644 --- a/app/views/projects/project_members/index.html.haml +++ b/app/views/projects/project_members/index.html.haml @@ -75,10 +75,9 @@ %span.badge.gl-tab-counter-badge.badge-muted.badge-pill.gl-badge.sm= @requesters.count .tab-content #tab-members.tab-pane{ class: ('active' unless groups_tab_active?) } - .js-project-members-list{ data: project_members_list_data_attributes(@project, @project_members) } + .js-project-members-list{ data: project_members_list_data_attributes(@project, @project_members, { param_name: :page, params: { search_groups: nil } }) } .loading .spinner.spinner-md - = paginate @project_members, theme: "gitlab", params: { search_groups: nil } - if show_groups?(@group_links) #tab-groups.tab-pane{ class: ('active' if groups_tab_active?) } .js-project-group-links-list{ data: project_group_links_list_data_attributes(@project, @group_links) } diff --git a/app/workers/post_receive.rb b/app/workers/post_receive.rb index 313b901c08e..d21c63f90fb 100644 --- a/app/workers/post_receive.rb +++ b/app/workers/post_receive.rb @@ -123,7 +123,7 @@ class PostReceive # rubocop:disable Scalability/IdempotentWorker def after_project_changes_hooks(project, user, refs, changes) experiment(:new_project_readme, actor: user).track_initial_writes(project) - experiment(:empty_repo_upload, project: project).track(:initial_write) if project.empty_repo? + experiment(:empty_repo_upload, project: project).track_initial_write repository_update_hook_data = Gitlab::DataBuilder::Repository.update(project, user, changes, refs) SystemHooksService.new.execute_hooks(repository_update_hook_data, :repository_update_hooks) Gitlab::UsageDataCounters::SourceCodeCounter.count(:pushes) |