diff --git a/.gitlab/ci/gitlab-gems.gitlab-ci.yml b/.gitlab/ci/gitlab-gems.gitlab-ci.yml index ff961877309..0c2fc96b02b 100644 --- a/.gitlab/ci/gitlab-gems.gitlab-ci.yml +++ b/.gitlab/ci/gitlab-gems.gitlab-ci.yml @@ -11,3 +11,6 @@ include: - local: .gitlab/ci/templates/gem.gitlab-ci.yml inputs: gem_name: "click_house-client" + - local: .gitlab/ci/templates/gem.gitlab-ci.yml + inputs: + gem_name: "gitlab-schema-validation" diff --git a/Gemfile b/Gemfile index 082d158071b..cc9dafc405b 100644 --- a/Gemfile +++ b/Gemfile @@ -348,6 +348,8 @@ gem 'sentry-sidekiq', '~> 5.8.0' # gem 'pg_query', '~> 4.2.1' +gem 'gitlab-schema-validation', path: 'gems/gitlab-schema-validation' + gem 'premailer-rails', '~> 1.10.3' gem 'gitlab-labkit', '~> 0.33.0' diff --git a/Gemfile.lock b/Gemfile.lock index 984bceae521..6730e7c386a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -18,6 +18,11 @@ PATH gitlab-rspec (0.1.0) rspec (~> 3.0) +PATH + remote: gems/gitlab-schema-validation + specs: + gitlab-schema-validation (0.1.0) + PATH remote: gems/gitlab-utils specs: @@ -1805,6 +1810,7 @@ DEPENDENCIES gitlab-markup (~> 1.9.0) gitlab-net-dns (~> 0.9.2) gitlab-rspec! + gitlab-schema-validation! gitlab-sidekiq-fetcher! gitlab-styles (~> 10.1.0) gitlab-utils! diff --git a/app/assets/javascripts/analytics/cycle_analytics/components/filter_bar.vue b/app/assets/javascripts/analytics/cycle_analytics/components/filter_bar.vue index 33d6eb139f7..92649477922 100644 --- a/app/assets/javascripts/analytics/cycle_analytics/components/filter_bar.vue +++ b/app/assets/javascripts/analytics/cycle_analytics/components/filter_bar.vue @@ -78,6 +78,7 @@ export default { title: TOKEN_TITLE_AUTHOR, type: TOKEN_TYPE_AUTHOR, token: UserToken, + dataType: 'user', initialUsers: this.authorsData, unique: true, operators: OPERATORS_IS, @@ -88,6 +89,7 @@ export default { title: TOKEN_TITLE_ASSIGNEE, type: TOKEN_TYPE_ASSIGNEE, token: UserToken, + dataType: 'user', initialUsers: this.assigneesData, unique: false, operators: OPERATORS_IS, diff --git a/app/assets/javascripts/boards/components/issue_board_filtered_search.vue b/app/assets/javascripts/boards/components/issue_board_filtered_search.vue index 3c056f296e1..f60f00be368 100644 --- a/app/assets/javascripts/boards/components/issue_board_filtered_search.vue +++ b/app/assets/javascripts/boards/components/issue_board_filtered_search.vue @@ -75,6 +75,7 @@ export default { type: TOKEN_TYPE_ASSIGNEE, operators: OPERATORS_IS_NOT, token: UserToken, + dataType: 'user', unique: true, fetchUsers, preloadedUsers: this.preloadedUsers(), @@ -86,6 +87,7 @@ export default { operators: OPERATORS_IS_NOT, symbol: '@', token: UserToken, + dataType: 'user', unique: true, fetchUsers, preloadedUsers: this.preloadedUsers(), diff --git a/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_pushed.vue b/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_pushed.vue new file mode 100644 index 00000000000..557f2912f17 --- /dev/null +++ b/app/assets/javascripts/contribution_events/components/contribution_event/contribution_event_pushed.vue @@ -0,0 +1,110 @@ + + + diff --git a/app/assets/javascripts/contribution_events/components/contribution_events.vue b/app/assets/javascripts/contribution_events/components/contribution_events.vue index c704c9bd048..63bee40d0b3 100644 --- a/app/assets/javascripts/contribution_events/components/contribution_events.vue +++ b/app/assets/javascripts/contribution_events/components/contribution_events.vue @@ -5,11 +5,13 @@ import { EVENT_TYPE_EXPIRED, EVENT_TYPE_JOINED, EVENT_TYPE_LEFT, + EVENT_TYPE_PUSHED, } from '../constants'; import ContributionEventApproved from './contribution_event/contribution_event_approved.vue'; import ContributionEventExpired from './contribution_event/contribution_event_expired.vue'; import ContributionEventJoined from './contribution_event/contribution_event_joined.vue'; import ContributionEventLeft from './contribution_event/contribution_event_left.vue'; +import ContributionEventPushed from './contribution_event/contribution_event_pushed.vue'; export default { props: { @@ -116,6 +118,9 @@ export default { case EVENT_TYPE_LEFT: return ContributionEventLeft; + case EVENT_TYPE_PUSHED: + return ContributionEventPushed; + default: return EmptyComponent; } diff --git a/app/assets/javascripts/contribution_events/constants.js b/app/assets/javascripts/contribution_events/constants.js index 05f968e7bc4..d4444e3bede 100644 --- a/app/assets/javascripts/contribution_events/constants.js +++ b/app/assets/javascripts/contribution_events/constants.js @@ -12,3 +12,7 @@ export const EVENT_TYPE_DESTROYED = 'destroyed'; export const EVENT_TYPE_EXPIRED = 'expired'; export const EVENT_TYPE_APPROVED = 'approved'; export const EVENT_TYPE_PRIVATE = 'private'; + +// From app/models/push_event_payload.rb#L22 +export const PUSH_EVENT_REF_TYPE_BRANCH = 'branch'; +export const PUSH_EVENT_REF_TYPE_TAG = 'tag'; diff --git a/app/assets/javascripts/issues/dashboard/components/issues_dashboard_app.vue b/app/assets/javascripts/issues/dashboard/components/issues_dashboard_app.vue index 14fe88b8f61..8f318b10744 100644 --- a/app/assets/javascripts/issues/dashboard/components/issues_dashboard_app.vue +++ b/app/assets/javascripts/issues/dashboard/components/issues_dashboard_app.vue @@ -233,6 +233,7 @@ export default { title: TOKEN_TITLE_ASSIGNEE, icon: 'user', token: UserToken, + dataType: 'user', operators: OPERATORS_IS_NOT_OR, fetchUsers: this.fetchUsers, preloadedUsers, @@ -243,6 +244,7 @@ export default { title: TOKEN_TITLE_AUTHOR, icon: 'pencil', token: UserToken, + dataType: 'user', operators: OPERATORS_IS_NOT_OR, fetchUsers: this.fetchUsers, defaultUsers: [], diff --git a/app/assets/javascripts/issues/list/components/issues_list_app.vue b/app/assets/javascripts/issues/list/components/issues_list_app.vue index 83b0bcebe67..35ef5c14783 100644 --- a/app/assets/javascripts/issues/list/components/issues_list_app.vue +++ b/app/assets/javascripts/issues/list/components/issues_list_app.vue @@ -365,6 +365,7 @@ export default { title: TOKEN_TITLE_AUTHOR, icon: 'pencil', token: UserToken, + dataType: 'user', defaultUsers: [], operators: this.hasOrFeature ? OPERATORS_IS_NOT_OR : OPERATORS_IS_NOT, fetchUsers: this.fetchUsers, @@ -376,6 +377,7 @@ export default { title: TOKEN_TITLE_ASSIGNEE, icon: 'user', token: UserToken, + dataType: 'user', operators: this.hasOrFeature ? OPERATORS_IS_NOT_OR : OPERATORS_IS_NOT, fetchUsers: this.fetchUsers, recentSuggestionsStorageKey: `${this.fullPath}-issues-recent-tokens-assignee`, diff --git a/app/assets/javascripts/jobs/components/job/job_app.vue b/app/assets/javascripts/jobs/components/job/job_app.vue index d93b8a8de29..a5a92a3c4ff 100644 --- a/app/assets/javascripts/jobs/components/job/job_app.vue +++ b/app/assets/javascripts/jobs/components/job/job_app.vue @@ -3,6 +3,7 @@ import { GlLoadingIcon, GlIcon, GlAlert } from '@gitlab/ui'; import { GlBreakpointInstance as bp } from '@gitlab/ui/dist/utils'; import { throttle, isEmpty } from 'lodash'; import { mapGetters, mapState, mapActions } from 'vuex'; +import LogTopBar from 'ee_else_ce/jobs/components/job/job_log_controllers.vue'; import SafeHtml from '~/vue_shared/directives/safe_html'; import { isScrolledToBottom } from '~/lib/utils/scroll_utils'; import { __, sprintf } from '~/locale'; @@ -13,7 +14,6 @@ import { MANUAL_STATUS } from '~/jobs/constants'; import EmptyState from './empty_state.vue'; import EnvironmentsBlock from './environments_block.vue'; import ErasedBlock from './erased_block.vue'; -import LogTopBar from './job_log_controllers.vue'; import StuckBlock from './stuck_block.vue'; import UnmetPrerequisitesBlock from './unmet_prerequisites_block.vue'; import Sidebar from './sidebar/sidebar.vue'; diff --git a/app/assets/javascripts/jobs/components/job/job_log_controllers.vue b/app/assets/javascripts/jobs/components/job/job_log_controllers.vue index ea7e13418f2..efd4eed2a9f 100644 --- a/app/assets/javascripts/jobs/components/job/job_log_controllers.vue +++ b/app/assets/javascripts/jobs/components/job/job_log_controllers.vue @@ -178,6 +178,7 @@ export default {