summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2021-04-22 12:09:49 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2021-04-22 12:09:49 +0000
commit4b074c5f634f8e1e550107f9e8237f07878ca0e8 (patch)
tree00afed4a6853548ec97203f3f807d954180b547d /app
parentb81fd57f3d62db4455108c8de4b8d7b8d403de35 (diff)
downloadgitlab-ce-4b074c5f634f8e1e550107f9e8237f07878ca0e8.tar.gz
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
-rw-r--r--app/assets/javascripts/content_editor/services/markdown_serializer.js2
-rw-r--r--app/assets/javascripts/members/components/table/members_table.vue29
-rw-r--r--app/assets/javascripts/members/store/state.js2
-rw-r--r--app/assets/javascripts/members/utils.js6
-rw-r--r--app/assets/javascripts/pages/users/activity_calendar.js2
-rw-r--r--app/controllers/admin/users_controller.rb9
-rw-r--r--app/controllers/projects/settings/ci_cd_controller.rb5
-rw-r--r--app/experiments/concerns/project_commit_count.rb21
-rw-r--r--app/experiments/empty_repo_upload_experiment.rb22
-rw-r--r--app/experiments/new_project_readme_experiment.rb25
-rw-r--r--app/graphql/mutations/labels/create.rb6
-rw-r--r--app/graphql/resolvers/concerns/issue_resolver_arguments.rb70
-rw-r--r--app/helpers/gitlab_routing_helper.rb10
-rw-r--r--app/helpers/groups/group_members_helper.rb8
-rw-r--r--app/helpers/members_helper.rb10
-rw-r--r--app/helpers/projects/project_members_helper.rb4
-rw-r--r--app/models/concerns/cascading_namespace_setting_attribute.rb11
-rw-r--r--app/policies/project_member_policy.rb6
-rw-r--r--app/views/admin/users/_users.html.haml2
-rw-r--r--app/views/groups/group_members/index.html.haml6
-rw-r--r--app/views/projects/blob/viewers/_license.html.haml6
-rw-r--r--app/views/projects/project_members/index.html.haml3
-rw-r--r--app/workers/post_receive.rb2
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)