diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-09-30 09:10:11 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-09-30 09:10:11 +0000 |
commit | 418c3b29009dcc0a2c6b4872557d0274ba0b8077 (patch) | |
tree | 427b01c0b7942fd458b4f363f2d897912ec9e290 | |
parent | 3c02fe83263991811e94e8126be8f065afe15372 (diff) | |
download | gitlab-ce-418c3b29009dcc0a2c6b4872557d0274ba0b8077.tar.gz |
Add latest changes from gitlab-org/gitlab@master
113 files changed, 2208 insertions, 371 deletions
diff --git a/app/assets/javascripts/gfm_auto_complete.js b/app/assets/javascripts/gfm_auto_complete.js index f998d5f1b7f..0329006c62a 100644 --- a/app/assets/javascripts/gfm_auto_complete.js +++ b/app/assets/javascripts/gfm_auto_complete.js @@ -35,7 +35,6 @@ export function membersBeforeSave(members) { : ''; return { - type: member.type, username: member.username, avatarTag: autoCompleteAvatar.length === 1 ? txtAvatar : imgAvatar, title: sanitize(title), @@ -280,11 +279,7 @@ class GfmAutoComplete { if (command === MEMBER_COMMAND.ASSIGN) { // Only include members which are not assigned to Issuable currently - return data.filter( - member => member.type === 'User' && !assignees.includes(member.search), - ); - } else if (command === MEMBER_COMMAND.REASSIGN) { - return data.filter(member => member.type === 'User'); + return data.filter(member => !assignees.includes(member.search)); } else if (command === MEMBER_COMMAND.UNASSIGN) { // Only include members which are assigned to Issuable currently return data.filter(member => assignees.includes(member.search)); diff --git a/app/assets/javascripts/static_site_editor/components/publish_toolbar.vue b/app/assets/javascripts/static_site_editor/components/publish_toolbar.vue index 2d62964cb3b..5f00f9f22f3 100644 --- a/app/assets/javascripts/static_site_editor/components/publish_toolbar.vue +++ b/app/assets/javascripts/static_site_editor/components/publish_toolbar.vue @@ -41,7 +41,7 @@ export default { :disabled="savingChanges" @click="$emit('editSettings')" > - {{ __('Settings') }} + {{ __('Page settings') }} </gl-button> <gl-button ref="submit" diff --git a/app/assets/javascripts/static_site_editor/graphql/index.js b/app/assets/javascripts/static_site_editor/graphql/index.js index 0a5d8c07ad9..fbb3d7fbfcc 100644 --- a/app/assets/javascripts/static_site_editor/graphql/index.js +++ b/app/assets/javascripts/static_site_editor/graphql/index.js @@ -4,6 +4,7 @@ import createDefaultClient from '~/lib/graphql'; import typeDefs from './typedefs.graphql'; import fileResolver from './resolvers/file'; import submitContentChangesResolver from './resolvers/submit_content_changes'; +import hasSubmittedChangesResolver from './resolvers/has_submitted_changes'; Vue.use(VueApollo); @@ -15,6 +16,7 @@ const createApolloProvider = appData => { }, Mutation: { submitContentChanges: submitContentChangesResolver, + hasSubmittedChanges: hasSubmittedChangesResolver, }, }, { diff --git a/app/assets/javascripts/static_site_editor/graphql/mutations/has_submitted_changes.mutation.graphql b/app/assets/javascripts/static_site_editor/graphql/mutations/has_submitted_changes.mutation.graphql new file mode 100644 index 00000000000..1f47929556a --- /dev/null +++ b/app/assets/javascripts/static_site_editor/graphql/mutations/has_submitted_changes.mutation.graphql @@ -0,0 +1,5 @@ +mutation hasSubmittedChanges($input: HasSubmittedChangesInput) { + hasSubmittedChanges(input: $input) @client { + hasSubmittedChanges + } +} diff --git a/app/assets/javascripts/static_site_editor/graphql/queries/app_data.query.graphql b/app/assets/javascripts/static_site_editor/graphql/queries/app_data.query.graphql index 946d80efff0..9f4b0afe55f 100644 --- a/app/assets/javascripts/static_site_editor/graphql/queries/app_data.query.graphql +++ b/app/assets/javascripts/static_site_editor/graphql/queries/app_data.query.graphql @@ -1,6 +1,7 @@ query appData { appData @client { isSupportedContent + hasSubmittedChanges project sourcePath username diff --git a/app/assets/javascripts/static_site_editor/graphql/resolvers/has_submitted_changes.js b/app/assets/javascripts/static_site_editor/graphql/resolvers/has_submitted_changes.js new file mode 100644 index 00000000000..ce55db7f3e5 --- /dev/null +++ b/app/assets/javascripts/static_site_editor/graphql/resolvers/has_submitted_changes.js @@ -0,0 +1,17 @@ +import query from '../queries/app_data.query.graphql'; + +const hasSubmittedChangesResolver = (_, { input: { hasSubmittedChanges } }, { cache }) => { + const { appData } = cache.readQuery({ query }); + cache.writeQuery({ + query, + data: { + appData: { + __typename: 'AppData', + ...appData, + hasSubmittedChanges, + }, + }, + }); +}; + +export default hasSubmittedChangesResolver; diff --git a/app/assets/javascripts/static_site_editor/graphql/typedefs.graphql b/app/assets/javascripts/static_site_editor/graphql/typedefs.graphql index 78cc1746cdb..0ded1722d26 100644 --- a/app/assets/javascripts/static_site_editor/graphql/typedefs.graphql +++ b/app/assets/javascripts/static_site_editor/graphql/typedefs.graphql @@ -16,12 +16,17 @@ type SavedContentMeta { type AppData { isSupportedContent: Boolean! + hasSubmittedChanges: Boolean! project: String! returnUrl: String sourcePath: String! username: String! } +input HasSubmittedChangesInput { + hasSubmittedChanges: Boolean! +} + input SubmitContentChangesInput { project: String! sourcePath: String! @@ -40,4 +45,5 @@ extend type Query { extend type Mutation { submitContentChanges(input: SubmitContentChangesInput!): SavedContentMeta + hasSubmittedChanges(input: HasSubmittedChangesInput!): AppData } diff --git a/app/assets/javascripts/static_site_editor/index.js b/app/assets/javascripts/static_site_editor/index.js index b7e5ea4eee3..bd7d5cf29d7 100644 --- a/app/assets/javascripts/static_site_editor/index.js +++ b/app/assets/javascripts/static_site_editor/index.js @@ -19,6 +19,7 @@ const initStaticSiteEditor = el => { const router = createRouter(baseUrl); const apolloProvider = createApolloProvider({ isSupportedContent: parseBoolean(isSupportedContent), + hasSubmittedChanges: false, project: `${namespace}/${project}`, returnUrl, sourcePath, diff --git a/app/assets/javascripts/static_site_editor/pages/home.vue b/app/assets/javascripts/static_site_editor/pages/home.vue index eef2bd88f0e..5c1af45b831 100644 --- a/app/assets/javascripts/static_site_editor/pages/home.vue +++ b/app/assets/javascripts/static_site_editor/pages/home.vue @@ -5,6 +5,7 @@ import InvalidContentMessage from '../components/invalid_content_message.vue'; import SubmitChangesError from '../components/submit_changes_error.vue'; import appDataQuery from '../graphql/queries/app_data.query.graphql'; import sourceContentQuery from '../graphql/queries/source_content.query.graphql'; +import hasSubmittedChangesMutation from '../graphql/mutations/has_submitted_changes.mutation.graphql'; import submitContentChangesMutation from '../graphql/mutations/submit_content_changes.mutation.graphql'; import { deprecatedCreateFlash as createFlash } from '~/flash'; import Tracking from '~/tracking'; @@ -74,6 +75,20 @@ export default { submitChanges(images) { this.isSavingChanges = true; + // eslint-disable-next-line promise/catch-or-return + this.$apollo + .mutate({ + mutation: hasSubmittedChangesMutation, + variables: { + input: { + hasSubmittedChanges: true, + }, + }, + }) + .finally(() => { + this.$router.push(SUCCESS_ROUTE); + }); + this.$apollo .mutate({ mutation: submitContentChangesMutation, @@ -87,9 +102,6 @@ export default { }, }, }) - .then(() => { - this.$router.push(SUCCESS_ROUTE); - }) .catch(e => { this.submitChangesError = e.message; }) diff --git a/app/assets/javascripts/static_site_editor/pages/success.vue b/app/assets/javascripts/static_site_editor/pages/success.vue index f0d597d7c9b..6a3f40cc1db 100644 --- a/app/assets/javascripts/static_site_editor/pages/success.vue +++ b/app/assets/javascripts/static_site_editor/pages/success.vue @@ -1,5 +1,5 @@ <script> -import { GlEmptyState, GlButton } from '@gitlab/ui'; +import { GlButton, GlEmptyState, GlLoadingIcon } from '@gitlab/ui'; import { s__, __, sprintf } from '~/locale'; import savedContentMetaQuery from '../graphql/queries/saved_content_meta.query.graphql'; @@ -8,8 +8,9 @@ import { HOME_ROUTE } from '../router/constants'; export default { components: { - GlEmptyState, GlButton, + GlEmptyState, + GlLoadingIcon, }, props: { mergeRequestsIllustrationPath: { @@ -33,7 +34,7 @@ export default { }, }, created() { - if (!this.savedContentMeta) { + if (!this.appData.hasSubmittedChanges) { this.$router.push(HOME_ROUTE); } }, @@ -50,14 +51,21 @@ export default { assignMergeRequestInstruction: s__( 'StaticSiteEditor|3. Assign a person to review and accept the merge request.', ), + submittingTitle: s__('StaticSiteEditor|Creating your merge request'), + submittingNotePrimary: s__( + 'StaticSiteEditor|You can set an assignee to get your changes reviewed and deployed once your merge request is created.', + ), + submittingNoteSecondary: s__( + 'StaticSiteEditor|A link to view the merge request will appear once ready.', + ), }; </script> <template> - <div - v-if="savedContentMeta" - class="container gl-flex-grow-1 gl-display-flex gl-flex-direction-column" - > - <div class="gl-fixed gl-left-0 gl-right-0 gl-border-b-solid gl-border-b-1 gl-border-b-gray-100"> + <div class="container gl-flex-grow-1 gl-display-flex gl-flex-direction-column"> + <div + v-if="savedContentMeta" + class="gl-fixed gl-left-0 gl-right-0 gl-border-b-solid gl-border-b-1 gl-border-b-gray-100" + > <div class="container gl-py-4"> <gl-button v-if="appData.returnUrl" @@ -73,16 +81,23 @@ export default { </div> <gl-empty-state class="gl-my-9" - :primary-button-text="$options.primaryButtonText" - :title="$options.title" - :primary-button-link="savedContentMeta.mergeRequest.url" + :title="savedContentMeta ? $options.title : $options.submittingTitle" + :primary-button-text="savedContentMeta && $options.primaryButtonText" + :primary-button-link="savedContentMeta && savedContentMeta.mergeRequest.url" :svg-path="mergeRequestsIllustrationPath" > <template #description> - <p>{{ $options.mergeRequestInstructionsHeading }}</p> - <p>{{ $options.addTitleInstruction }}</p> - <p>{{ $options.addDescriptionInstruction }}</p> - <p>{{ $options.assignMergeRequestInstruction }}</p> + <div v-if="savedContentMeta"> + <p>{{ $options.mergeRequestInstructionsHeading }}</p> + <p>{{ $options.addTitleInstruction }}</p> + <p>{{ $options.addDescriptionInstruction }}</p> + <p>{{ $options.assignMergeRequestInstruction }}</p> + </div> + <div v-else> + <p>{{ $options.submittingNotePrimary }}</p> + <p>{{ $options.submittingNoteSecondary }}</p> + <gl-loading-icon size="xl" /> + </div> </template> </gl-empty-state> </div> diff --git a/app/assets/javascripts/static_site_editor/services/front_matterify.js b/app/assets/javascripts/static_site_editor/services/front_matterify.js new file mode 100644 index 00000000000..cbf0fffd515 --- /dev/null +++ b/app/assets/javascripts/static_site_editor/services/front_matterify.js @@ -0,0 +1,73 @@ +import jsYaml from 'js-yaml'; + +const NEW_LINE = '\n'; + +const hasMatter = (firstThreeChars, fourthChar) => { + const isYamlDelimiter = firstThreeChars === '---'; + const isFourthCharNewline = fourthChar === NEW_LINE; + return isYamlDelimiter && isFourthCharNewline; +}; + +export const frontMatterify = source => { + let index = 3; + let offset; + const delimiter = source.slice(0, index); + const type = 'yaml'; + const NO_FRONTMATTER = { + source, + matter: null, + spacing: null, + content: source, + delimiter: null, + type: null, + }; + + if (!hasMatter(delimiter, source.charAt(index))) { + return NO_FRONTMATTER; + } + + offset = source.indexOf(delimiter, index); + + // Finds the end delimiter that starts at a new line + while (offset !== -1 && source.charAt(offset - 1) !== NEW_LINE) { + index = offset + delimiter.length; + offset = source.indexOf(delimiter, index); + } + + if (offset === -1) { + return NO_FRONTMATTER; + } + + const matterStr = source.slice(index, offset); + const matter = jsYaml.safeLoad(matterStr); + + let content = source.slice(offset + delimiter.length); + let spacing = ''; + let idx = 0; + while (content.charAt(idx).match(/(\s|\n)/)) { + spacing += content.charAt(idx); + idx += 1; + } + content = content.replace(spacing, ''); + + return { + source, + matter, + spacing, + content, + delimiter, + type, + }; +}; + +export const stringify = ({ matter, spacing, content, delimiter }, newMatter) => { + const matterObj = newMatter || matter; + + if (!matterObj) { + return content; + } + + const header = `${delimiter}${NEW_LINE}${jsYaml.safeDump(matterObj)}${delimiter}`; + const body = `${spacing}${content}`; + return `${header}${body}`; +}; diff --git a/app/assets/javascripts/static_site_editor/services/parse_source_file.js b/app/assets/javascripts/static_site_editor/services/parse_source_file.js index 640186ee1d0..d4fc8b2edb6 100644 --- a/app/assets/javascripts/static_site_editor/services/parse_source_file.js +++ b/app/assets/javascripts/static_site_editor/services/parse_source_file.js @@ -1,7 +1,7 @@ -import grayMatter from 'gray-matter'; +import { frontMatterify, stringify } from './front_matterify'; const parseSourceFile = raw => { - const remake = source => grayMatter(source, {}); + const remake = source => frontMatterify(source); let editable = remake(raw); @@ -13,20 +13,17 @@ const parseSourceFile = raw => { } }; - const trimmedEditable = () => grayMatter.stringify(editable).trim(); + const content = (isBody = false) => (isBody ? editable.content : stringify(editable)); - const content = (isBody = false) => (isBody ? editable.content.trim() : trimmedEditable()); // gray-matter internally adds an eof newline so we trim to bypass, open issue: https://github.com/jonschlinkert/gray-matter/issues/96 - - const matter = () => editable.data; + const matter = () => editable.matter; const syncMatter = settings => { - const source = grayMatter.stringify(editable.content, settings); - syncContent(source); + editable.matter = settings; }; - const isModified = () => trimmedEditable() !== raw; + const isModified = () => stringify(editable) !== raw; - const hasMatter = () => editable.matter.length > 0; + const hasMatter = () => Boolean(editable.matter); return { matter, diff --git a/app/assets/javascripts/vue_shared/components/gl_mentions.vue b/app/assets/javascripts/vue_shared/components/gl_mentions.vue index d15a2b47bff..e895a7a52ab 100644 --- a/app/assets/javascripts/vue_shared/components/gl_mentions.vue +++ b/app/assets/javascripts/vue_shared/components/gl_mentions.vue @@ -66,12 +66,10 @@ const autoCompleteMap = { } if (doesCurrentLineStartWith('/assign', fullText, selectionStart)) { - return this.members.filter( - member => member.type === 'User' && !this.assignees.includes(member.username), - ); - } else if (doesCurrentLineStartWith('/reassign', fullText, selectionStart)) { - return this.members.filter(member => member.type === 'User'); - } else if (doesCurrentLineStartWith('/unassign', fullText, selectionStart)) { + return this.members.filter(member => !this.assignees.includes(member.username)); + } + + if (doesCurrentLineStartWith('/unassign', fullText, selectionStart)) { return this.members.filter(member => this.assignees.includes(member.username)); } diff --git a/app/assets/javascripts/vue_shared/components/members/constants.js b/app/assets/javascripts/vue_shared/components/members/constants.js index 5c6bb0cf9bd..9dc0ec97ce6 100644 --- a/app/assets/javascripts/vue_shared/components/members/constants.js +++ b/app/assets/javascripts/vue_shared/components/members/constants.js @@ -62,3 +62,5 @@ export const MEMBER_TYPES = { invite: 'invite', accessRequest: 'accessRequest', }; + +export const DAYS_TO_EXPIRE_SOON = 7; diff --git a/app/assets/javascripts/vue_shared/components/members/table/created_at.vue b/app/assets/javascripts/vue_shared/components/members/table/created_at.vue new file mode 100644 index 00000000000..0bad70894f9 --- /dev/null +++ b/app/assets/javascripts/vue_shared/components/members/table/created_at.vue @@ -0,0 +1,40 @@ +<script> +import { GlSprintf } from '@gitlab/ui'; +import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue'; + +export default { + name: 'CreatedAt', + components: { GlSprintf, TimeAgoTooltip }, + props: { + date: { + type: String, + required: false, + default: null, + }, + createdBy: { + type: Object, + required: false, + default: null, + }, + }, + computed: { + showCreatedBy() { + return this.createdBy?.name && this.createdBy?.webUrl; + }, + }, +}; +</script> + +<template> + <span> + <gl-sprintf v-if="showCreatedBy" :message="s__('Members|%{time} by %{user}')"> + <template #time> + <time-ago-tooltip :time="date" /> + </template> + <template #user> + <a :href="createdBy.webUrl">{{ createdBy.name }}</a> + </template> + </gl-sprintf> + <time-ago-tooltip v-else :time="date" /> + </span> +</template> diff --git a/app/assets/javascripts/vue_shared/components/members/table/expires_at.vue b/app/assets/javascripts/vue_shared/components/members/table/expires_at.vue new file mode 100644 index 00000000000..de65e3fb10f --- /dev/null +++ b/app/assets/javascripts/vue_shared/components/members/table/expires_at.vue @@ -0,0 +1,66 @@ +<script> +import { GlSprintf, GlTooltipDirective } from '@gitlab/ui'; +import { + approximateDuration, + differenceInSeconds, + formatDate, + getDayDifference, +} from '~/lib/utils/datetime_utility'; +import { DAYS_TO_EXPIRE_SOON } from '../constants'; + +export default { + name: 'ExpiresAt', + components: { GlSprintf }, + directives: { + GlTooltip: GlTooltipDirective, + }, + props: { + date: { + type: String, + required: false, + default: null, + }, + }, + computed: { + noExpirationSet() { + return this.date === null; + }, + parsed() { + return new Date(this.date); + }, + differenceInSeconds() { + return differenceInSeconds(new Date(), this.parsed); + }, + isExpired() { + return this.differenceInSeconds <= 0; + }, + inWords() { + return approximateDuration(this.differenceInSeconds); + }, + formatted() { + return formatDate(this.parsed); + }, + expiresSoon() { + return getDayDifference(new Date(), this.parsed) < DAYS_TO_EXPIRE_SOON; + }, + cssClass() { + return { + 'gl-text-red-500': this.isExpired, + 'gl-text-orange-500': this.expiresSoon, + }; + }, + }, +}; +</script> + +<template> + <span v-if="noExpirationSet">{{ s__('Members|No expiration set') }}</span> + <span v-else v-gl-tooltip.hover :title="formatted" :class="cssClass"> + <template v-if="isExpired">{{ s__('Members|Expired') }}</template> + <gl-sprintf v-else :message="s__('Members|in %{time}')"> + <template #time> + {{ inWords }} + </template> + </gl-sprintf> + </span> +</template> diff --git a/app/assets/javascripts/vue_shared/components/members/table/members_table.vue b/app/assets/javascripts/vue_shared/components/members/table/members_table.vue index 85be74d4346..4401250a665 100644 --- a/app/assets/javascripts/vue_shared/components/members/table/members_table.vue +++ b/app/assets/javascripts/vue_shared/components/members/table/members_table.vue @@ -5,6 +5,8 @@ import { FIELDS } from '../constants'; import initUserPopovers from '~/user_popovers'; import MemberAvatar from './member_avatar.vue'; import MemberSource from './member_source.vue'; +import CreatedAt from './created_at.vue'; +import ExpiresAt from './expires_at.vue'; import MembersTableCell from './members_table_cell.vue'; export default { @@ -12,6 +14,8 @@ export default { components: { GlTable, MemberAvatar, + CreatedAt, + ExpiresAt, MembersTableCell, MemberSource, }, @@ -51,6 +55,22 @@ export default { </members-table-cell> </template> + <template #cell(granted)="{ item: { createdAt, createdBy } }"> + <created-at :date="createdAt" :created-by="createdBy" /> + </template> + + <template #cell(invited)="{ item: { createdAt, createdBy } }"> + <created-at :date="createdAt" :created-by="createdBy" /> + </template> + + <template #cell(requested)="{ item: { createdAt } }"> + <created-at :date="createdAt" /> + </template> + + <template #cell(expires)="{ item: { expiresAt } }"> + <expires-at :date="expiresAt" /> + </template> + <template #head(actions)="{ label }"> <span data-testid="col-actions" class="gl-sr-only">{{ label }}</span> </template> diff --git a/app/assets/javascripts/whats_new/components/app.vue b/app/assets/javascripts/whats_new/components/app.vue index 9fc19c51083..ed17927c5b2 100644 --- a/app/assets/javascripts/whats_new/components/app.vue +++ b/app/assets/javascripts/whats_new/components/app.vue @@ -1,6 +1,9 @@ <script> import { mapState, mapActions } from 'vuex'; import { GlDrawer, GlBadge, GlIcon, GlLink } from '@gitlab/ui'; +import Tracking from '~/tracking'; + +const trackingMixin = Tracking.mixin(); export default { components: { @@ -9,6 +12,7 @@ export default { GlIcon, GlLink, }, + mixins: [trackingMixin], props: { features: { type: String, @@ -37,6 +41,11 @@ export default { }, mounted() { this.openDrawer(this.storageKey); + + const body = document.querySelector('body'); + const namespaceId = body.getAttribute('data-namespace-id'); + + this.track('click_whats_new_drawer', { label: 'namespace_id', value: namespaceId }); }, methods: { ...mapActions(['openDrawer', 'closeDrawer']), @@ -52,7 +61,14 @@ export default { </template> <div class="pb-6"> <div v-for="feature in parsedFeatures" :key="feature.title" class="mb-6"> - <gl-link :href="feature.url" target="_blank"> + <gl-link + :href="feature.url" + target="_blank" + data-testid="whats-new-title-link" + data-track-event="click_whats_new_item" + :data-track-label="feature.title" + :data-track-property="feature.url" + > <h5 class="gl-font-base">{{ feature.title }}</h5> </gl-link> <div class="mb-2"> @@ -62,7 +78,13 @@ export default { </gl-badge> </template> </div> - <gl-link :href="feature.url" target="_blank"> + <gl-link + :href="feature.url" + target="_blank" + data-track-event="click_whats_new_item" + :data-track-label="feature.title" + :data-track-property="feature.url" + > <img :alt="feature.title" :src="feature.image_url" @@ -70,7 +92,14 @@ export default { /> </gl-link> <p class="pt-2">{{ feature.body }}</p> - <gl-link :href="feature.url" target="_blank">{{ __('Learn more') }}</gl-link> + <gl-link + :href="feature.url" + target="_blank" + data-track-event="click_whats_new_item" + :data-track-label="feature.title" + :data-track-property="feature.url" + >{{ __('Learn more') }}</gl-link + > </div> </div> </gl-drawer> diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 8acd338fff8..f3442e437b4 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -36,17 +36,6 @@ // EE-only stylesheets @import 'application_ee'; -// CSS util classes -/** - These are deprecated in favor of the Gitlab UI utilities imported below. - Please check https://unpkg.com/browse/@gitlab/ui/src/scss/utilities.scss - to see the available utility classes. -**/ -@import 'utilities'; - -// Gitlab UI util classes -@import '@gitlab/ui/src/scss/utilities'; - /* print styles */ @media print { @import 'print'; diff --git a/app/assets/stylesheets/application_utilities.scss b/app/assets/stylesheets/application_utilities.scss new file mode 100644 index 00000000000..817e983a0ec --- /dev/null +++ b/app/assets/stylesheets/application_utilities.scss @@ -0,0 +1,12 @@ +@import 'page_bundles/mixins_and_variables_and_functions'; + +// CSS util classes +/** + These are deprecated in favor of the Gitlab UI utilities imported below. + Please check https://unpkg.com/browse/@gitlab/ui/src/scss/utilities.scss + to see the available utility classes. +**/ +@import 'utilities'; + +// Gitlab UI util classes +@import '@gitlab/ui/src/scss/utilities'; diff --git a/app/assets/stylesheets/application_utilities_dark.scss b/app/assets/stylesheets/application_utilities_dark.scss new file mode 100644 index 00000000000..eb32cdfc444 --- /dev/null +++ b/app/assets/stylesheets/application_utilities_dark.scss @@ -0,0 +1,3 @@ +@import './themes/dark'; + +@import 'application_utilities'; diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 68b8a2e23f2..665184f268c 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -357,6 +357,12 @@ module ApplicationHelper } end + def add_page_specific_style(path) + content_for :page_specific_styles do + stylesheet_link_tag_defer path + end + end + def page_startup_api_calls @api_startup_calls end diff --git a/app/services/quick_actions/interpret_service.rb b/app/services/quick_actions/interpret_service.rb index 65e363e33e7..de1cd7cd981 100644 --- a/app/services/quick_actions/interpret_service.rb +++ b/app/services/quick_actions/interpret_service.rb @@ -69,7 +69,7 @@ module QuickActions def extract_users(params) return [] if params.nil? - users = extract_references(params, :mentioned_user) + users = extract_references(params, :user) if users.empty? users = diff --git a/app/validators/addressable_url_validator.rb b/app/validators/addressable_url_validator.rb index 9fa99903e36..c6d9bd73566 100644 --- a/app/validators/addressable_url_validator.rb +++ b/app/validators/addressable_url_validator.rb @@ -80,7 +80,7 @@ class AddressableUrlValidator < ActiveModel::EachValidator value = strip_value!(record, attribute, value) - Gitlab::UrlBlocker.validate!(value, blocker_args) + Gitlab::UrlBlocker.validate!(value, **blocker_args) rescue Gitlab::UrlBlocker::BlockedUrlError => e record.errors.add(attribute, options.fetch(:blocked_message) % { exception_message: e.message }) end diff --git a/app/views/dashboard/milestones/index.html.haml b/app/views/dashboard/milestones/index.html.haml index ff991ccea71..923e78ad360 100644 --- a/app/views/dashboard/milestones/index.html.haml +++ b/app/views/dashboard/milestones/index.html.haml @@ -1,7 +1,7 @@ - @hide_top_links = true - page_title _('Milestones') - header_title _('Milestones'), dashboard_milestones_path -= stylesheet_link_tag 'page_bundles/milestone' +- add_page_specific_style 'page_bundles/milestone' .page-title-holder.d-flex.align-items-center %h1.page-title= _('Milestones') diff --git a/app/views/dashboard/todos/index.html.haml b/app/views/dashboard/todos/index.html.haml index 9c6a6be1bc3..44d968ae26d 100644 --- a/app/views/dashboard/todos/index.html.haml +++ b/app/views/dashboard/todos/index.html.haml @@ -3,7 +3,7 @@ - header_title _("To-Do List"), dashboard_todos_path = render_dashboard_gold_trial(current_user) -= stylesheet_link_tag 'page_bundles/todos' +- add_page_specific_style 'page_bundles/todos' .page-title-holder.d-flex.align-items-center %h1.page-title= _('To-Do List') diff --git a/app/views/groups/milestones/index.html.haml b/app/views/groups/milestones/index.html.haml index 83796444b6c..d20fa938a68 100644 --- a/app/views/groups/milestones/index.html.haml +++ b/app/views/groups/milestones/index.html.haml @@ -1,5 +1,5 @@ - page_title _("Milestones") -= stylesheet_link_tag 'page_bundles/milestone' +- add_page_specific_style 'page_bundles/milestone' .top-area = render 'shared/milestones_filter', counts: @milestone_states diff --git a/app/views/groups/milestones/show.html.haml b/app/views/groups/milestones/show.html.haml index fdcce864c24..5bbdd3a3b19 100644 --- a/app/views/groups/milestones/show.html.haml +++ b/app/views/groups/milestones/show.html.haml @@ -1,4 +1,4 @@ -= stylesheet_link_tag 'page_bundles/milestone' +- add_page_specific_style 'page_bundles/milestone' = render "header_title" = render 'shared/milestones/top', milestone: @milestone, group: @group = render 'shared/milestones/tabs', milestone: @milestone, show_project_name: true diff --git a/app/views/ide/_show.html.haml b/app/views/ide/_show.html.haml index d0384fd50bc..79cba2a54b0 100644 --- a/app/views/ide/_show.html.haml +++ b/app/views/ide/_show.html.haml @@ -1,8 +1,7 @@ - @body_class = 'ide-layout' - page_title _('IDE') -- content_for :page_specific_javascripts do - = stylesheet_link_tag 'page_bundles/ide' +- add_page_specific_style 'page_bundles/ide' #ide.ide-loading{ data: ide_data } .text-center diff --git a/app/views/jira_connect/subscriptions/index.html.haml b/app/views/jira_connect/subscriptions/index.html.haml index f7ecfd09209..32dd9a7c275 100644 --- a/app/views/jira_connect/subscriptions/index.html.haml +++ b/app/views/jira_connect/subscriptions/index.html.haml @@ -25,4 +25,4 @@ %td= link_to 'Remove', jira_connect_subscription_path(subscription), class: 'remove-subscription' = page_specific_javascript_tag('jira_connect.js') -= stylesheet_link_tag 'page_bundles/jira_connect' +- add_page_specific_style 'page_bundles/jira_connect' diff --git a/app/views/layouts/_head.html.haml b/app/views/layouts/_head.html.haml index 3e85e1f5b90..e30f76593ac 100644 --- a/app/views/layouts/_head.html.haml +++ b/app/views/layouts/_head.html.haml @@ -50,8 +50,14 @@ = render 'layouts/startup_css' - if user_application_theme == 'gl-dark' = stylesheet_link_tag_defer "application_dark" + - if content_for?(:page_specific_styles) + = yield :page_specific_styles + = stylesheet_link_tag_defer "application_utilities_dark" - else = stylesheet_link_tag_defer "application" + - if content_for?(:page_specific_styles) + = yield :page_specific_styles + = stylesheet_link_tag_defer "application_utilities" - unless use_startup_css? = stylesheet_link_tag_defer "themes/#{user_application_theme_css_filename}" if user_application_theme_css_filename = stylesheet_link_tag "disable_animations", media: "all" if Rails.env.test? || Gitlab.config.gitlab['disable_animations'] diff --git a/app/views/layouts/jira_connect.html.haml b/app/views/layouts/jira_connect.html.haml index fdeb3d3c9ac..175c9af63c7 100644 --- a/app/views/layouts/jira_connect.html.haml +++ b/app/views/layouts/jira_connect.html.haml @@ -7,6 +7,8 @@ = stylesheet_link_tag 'https://unpkg.com/@atlaskit/reduced-ui-pack@10.5.5/dist/bundle.css' = javascript_include_tag 'https://connect-cdn.atl-paas.net/all.js' = javascript_include_tag 'https://unpkg.com/jquery@3.3.1/dist/jquery.min.js' + - if content_for?(:page_specific_styles) + = yield :page_specific_styles = yield :head %body .ac-content diff --git a/app/views/projects/cycle_analytics/show.html.haml b/app/views/projects/cycle_analytics/show.html.haml index ca689b0bad7..d99579c25c0 100644 --- a/app/views/projects/cycle_analytics/show.html.haml +++ b/app/views/projects/cycle_analytics/show.html.haml @@ -1,6 +1,5 @@ - page_title _("Value Stream Analytics") -- content_for :page_specific_javascripts do - = stylesheet_link_tag 'page_bundles/cycle_analytics' +- add_page_specific_style 'page_bundles/cycle_analytics' #cycle-analytics{ "v-cloak" => "true", data: { request_path: project_cycle_analytics_path(@project) } } - if @cycle_analytics_no_data diff --git a/app/views/projects/environments/show.html.haml b/app/views/projects/environments/show.html.haml index 929015023d2..308dcf6d7be 100644 --- a/app/views/projects/environments/show.html.haml +++ b/app/views/projects/environments/show.html.haml @@ -1,9 +1,7 @@ - add_to_breadcrumbs _("Environments"), project_environments_path(@project) - breadcrumb_title @environment.name - page_title _("Environments") - -- content_for :page_specific_javascripts do - = stylesheet_link_tag 'page_bundles/xterm' +- add_page_specific_style 'page_bundles/xterm' #environments-detail-view{ data: { name: @environment.name, id: @environment.id, delete_path: environment_delete_path(@environment)} } - if @environment.available? && can?(current_user, :stop_environment, @environment) diff --git a/app/views/projects/issues/index.html.haml b/app/views/projects/issues/index.html.haml index 8a093131d35..7fa158e0024 100644 --- a/app/views/projects/issues/index.html.haml +++ b/app/views/projects/issues/index.html.haml @@ -2,7 +2,7 @@ - page_title _("Issues") - new_issue_email = @project.new_issuable_address(current_user, 'issue') -= stylesheet_link_tag 'page_bundles/issues' +- add_page_specific_style 'page_bundles/issues' = content_for :meta_tags do = auto_discovery_link_tag(:atom, safe_params.merge(rss_url_options).to_h, title: "#{@project.name} issues") diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml index 70b0f2d4d27..c16ebd95429 100644 --- a/app/views/projects/issues/show.html.haml +++ b/app/views/projects/issues/show.html.haml @@ -12,7 +12,7 @@ - can_report_spam = @issue.submittable_as_spam_by?(current_user) - can_create_issue = show_new_issue_link?(@project) - related_branches_path = related_branches_project_issue_path(@project, @issue) -= stylesheet_link_tag 'page_bundles/issues' +- add_page_specific_style 'page_bundles/issues' = render_if_exists "projects/issues/alert_blocked", issue: @issue, current_user: current_user = render "projects/issues/alert_moved_from_service_desk", issue: @issue diff --git a/app/views/projects/jobs/show.html.haml b/app/views/projects/jobs/show.html.haml index df98a1c7cce..d7a778088ee 100644 --- a/app/views/projects/jobs/show.html.haml +++ b/app/views/projects/jobs/show.html.haml @@ -1,9 +1,7 @@ - add_to_breadcrumbs _("Jobs"), project_jobs_path(@project) - breadcrumb_title "##{@build.id}" - page_title "#{@build.name} (##{@build.id})", _("Jobs") - -- content_for :page_specific_javascripts do - = stylesheet_link_tag 'page_bundles/xterm' +- add_page_specific_style 'page_bundles/xterm' = render_if_exists "shared/shared_runners_minutes_limit_flash_message" diff --git a/app/views/projects/milestones/index.html.haml b/app/views/projects/milestones/index.html.haml index 31303e2b9f8..6e81058df2a 100644 --- a/app/views/projects/milestones/index.html.haml +++ b/app/views/projects/milestones/index.html.haml @@ -1,5 +1,5 @@ - page_title _('Milestones') -= stylesheet_link_tag 'page_bundles/milestone' +- add_page_specific_style 'page_bundles/milestone' .top-area = render 'shared/milestones_filter', counts: milestone_counts(@project.milestones) diff --git a/app/views/projects/milestones/show.html.haml b/app/views/projects/milestones/show.html.haml index f575d8178ac..e7cc75e871a 100644 --- a/app/views/projects/milestones/show.html.haml +++ b/app/views/projects/milestones/show.html.haml @@ -2,7 +2,7 @@ - breadcrumb_title @milestone.title - page_title @milestone.title, _('Milestones') - page_description @milestone.description -= stylesheet_link_tag 'page_bundles/milestone' +- add_page_specific_style 'page_bundles/milestone' = render 'shared/milestones/header', milestone: @milestone = render 'shared/milestones/description', milestone: @milestone diff --git a/app/views/shared/boards/_show.html.haml b/app/views/shared/boards/_show.html.haml index 861f9ea427a..879afff0474 100644 --- a/app/views/shared/boards/_show.html.haml +++ b/app/views/shared/boards/_show.html.haml @@ -8,7 +8,7 @@ - @content_class = "issue-boards-content js-focus-mode-board" - breadcrumb_title _("Issue Boards") - page_title("#{board.name}", _("Boards")) -= stylesheet_link_tag 'page_bundles/boards' +- add_page_specific_style 'page_bundles/boards' - content_for :page_specific_javascripts do diff --git a/changelogs/unreleased/233719-project-creating-incidents-usage-ping.yml b/changelogs/unreleased/233719-project-creating-incidents-usage-ping.yml new file mode 100644 index 00000000000..d6e5dadb688 --- /dev/null +++ b/changelogs/unreleased/233719-project-creating-incidents-usage-ping.yml @@ -0,0 +1,5 @@ +--- +title: Add projects_creating_incidents to usage ping counts +merge_request: 42934 +author: +type: added diff --git a/changelogs/unreleased/241738-prevent-assignment-to-groups.yml b/changelogs/unreleased/241738-prevent-assignment-to-groups.yml deleted file mode 100644 index 56ba318d16f..00000000000 --- a/changelogs/unreleased/241738-prevent-assignment-to-groups.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Prevent assignment of groups using quick actions -merge_request: 42810 -author: -type: fixed diff --git a/changelogs/unreleased/244873-perceived-ux-success-screen.yml b/changelogs/unreleased/244873-perceived-ux-success-screen.yml new file mode 100644 index 00000000000..13722416404 --- /dev/null +++ b/changelogs/unreleased/244873-perceived-ux-success-screen.yml @@ -0,0 +1,5 @@ +--- +title: Update user feedback to a dedicated page as opposed to solely a button with a loader +merge_request: 43189 +author: +type: changed diff --git a/changelogs/unreleased/257881-migration-user-admin-approval-toggle.yml b/changelogs/unreleased/257881-migration-user-admin-approval-toggle.yml new file mode 100644 index 00000000000..a995bfe7a7f --- /dev/null +++ b/changelogs/unreleased/257881-migration-user-admin-approval-toggle.yml @@ -0,0 +1,6 @@ +--- +title: Add a database column to enable or disable the setting that puts newly registered + users in a pending state, requiring admin approval for their activation +merge_request: 43661 +author: +type: added diff --git a/changelogs/unreleased/zj-update-lang-colors.yml b/changelogs/unreleased/zj-update-lang-colors.yml new file mode 100644 index 00000000000..72b2bc01b08 --- /dev/null +++ b/changelogs/unreleased/zj-update-lang-colors.yml @@ -0,0 +1,5 @@ +--- +title: Update programming language colors and metadata +merge_request: 43111 +author: +type: changed diff --git a/config/application.rb b/config/application.rb index 4971d2853b9..c39061a9824 100644 --- a/config/application.rb +++ b/config/application.rb @@ -174,6 +174,8 @@ module Gitlab config.assets.paths << Gemojione.images_path config.assets.paths << "#{config.root}/vendor/assets/fonts" + config.assets.precompile << "application_utilities.css" + config.assets.precompile << "application_utilities_dark.css" config.assets.precompile << "application_dark.css" config.assets.precompile << "startup/*.css" diff --git a/db/migrate/20200923102312_update_programming_language_colors.rb b/db/migrate/20200923102312_update_programming_language_colors.rb new file mode 100644 index 00000000000..37233bd3148 --- /dev/null +++ b/db/migrate/20200923102312_update_programming_language_colors.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true +require 'yaml' + +class UpdateProgrammingLanguageColors < ActiveRecord::Migration[6.0] + DOWNTIME = false + + class ProgrammingLanguage < ActiveRecord::Base; end + + def up + YAML.load_file("vendor/languages.yml").each do |name, metadata| + color = metadata["color"] + next unless color.present? + + ProgrammingLanguage.where(name: name).update(color: color) + end + end + + def down + # noop + end +end diff --git a/db/migrate/20200927224750_add_incident_issue_type_index_to_issues.rb b/db/migrate/20200927224750_add_incident_issue_type_index_to_issues.rb new file mode 100644 index 00000000000..ed4dd5b9cc1 --- /dev/null +++ b/db/migrate/20200927224750_add_incident_issue_type_index_to_issues.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +class AddIncidentIssueTypeIndexToIssues < ActiveRecord::Migration[6.0] + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + INCIDENT_ISSUE_TYPE = 1 + INDEX_NAME = 'index_issues_project_id_issue_type_incident' + + def up + add_concurrent_index :issues, :project_id, where: "issue_type = #{INCIDENT_ISSUE_TYPE}", name: INDEX_NAME + end + + def down + remove_concurrent_index_by_name(:issues, INDEX_NAME) + end +end diff --git a/db/migrate/20200929063159_add_require_admin_approval_after_user_signup_to_application_settings.rb b/db/migrate/20200929063159_add_require_admin_approval_after_user_signup_to_application_settings.rb new file mode 100644 index 00000000000..92d82757b79 --- /dev/null +++ b/db/migrate/20200929063159_add_require_admin_approval_after_user_signup_to_application_settings.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class AddRequireAdminApprovalAfterUserSignupToApplicationSettings < ActiveRecord::Migration[6.0] + DOWNTIME = false + + def change + add_column :application_settings, :require_admin_approval_after_user_signup, :boolean, default: false, null: false + end +end diff --git a/db/schema_migrations/20200923102312 b/db/schema_migrations/20200923102312 new file mode 100644 index 00000000000..52ed07034fc --- /dev/null +++ b/db/schema_migrations/20200923102312 @@ -0,0 +1 @@ +f19e61e3863905885c8b5b2129be2586d912d616a5b3b54e99a72c5760082059
\ No newline at end of file diff --git a/db/schema_migrations/20200927224750 b/db/schema_migrations/20200927224750 new file mode 100644 index 00000000000..9454bec58c5 --- /dev/null +++ b/db/schema_migrations/20200927224750 @@ -0,0 +1 @@ +8e0c5be3d6fe2d0d718c7b7a99d84b14dfc6006f780ec0622eb5aae937e6b367
\ No newline at end of file diff --git a/db/schema_migrations/20200929063159 b/db/schema_migrations/20200929063159 new file mode 100644 index 00000000000..b7815e9bb39 --- /dev/null +++ b/db/schema_migrations/20200929063159 @@ -0,0 +1 @@ +9ef08404b964ccae3e12332340f16c6b8bb2bbdb2c04ba105fe1c0c7e6bf84f2
\ No newline at end of file diff --git a/db/structure.sql b/db/structure.sql index d8367b0ab5a..fba163f7417 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -9270,6 +9270,7 @@ CREATE TABLE application_settings ( gitpod_enabled boolean DEFAULT false NOT NULL, gitpod_url text DEFAULT 'https://gitpod.io/'::text, abuse_notification_email character varying, + require_admin_approval_after_user_signup boolean DEFAULT false NOT NULL, CONSTRAINT check_2dba05b802 CHECK ((char_length(gitpod_url) <= 255)), CONSTRAINT check_51700b31b5 CHECK ((char_length(default_branch_name) <= 255)), CONSTRAINT check_9c6c447a13 CHECK ((char_length(maintenance_mode_message) <= 255)), @@ -20372,6 +20373,8 @@ CREATE INDEX index_issues_on_updated_at ON issues USING btree (updated_at); CREATE INDEX index_issues_on_updated_by_id ON issues USING btree (updated_by_id) WHERE (updated_by_id IS NOT NULL); +CREATE INDEX index_issues_project_id_issue_type_incident ON issues USING btree (project_id) WHERE (issue_type = 1); + CREATE UNIQUE INDEX index_jira_connect_installations_on_client_key ON jira_connect_installations USING btree (client_key); CREATE INDEX index_jira_connect_subscriptions_on_namespace_id ON jira_connect_subscriptions USING btree (namespace_id); diff --git a/doc/administration/geo/replication/updating_the_geo_nodes.md b/doc/administration/geo/replication/updating_the_geo_nodes.md index b78aeb06ebf..9200014ee13 100644 --- a/doc/administration/geo/replication/updating_the_geo_nodes.md +++ b/doc/administration/geo/replication/updating_the_geo_nodes.md @@ -21,6 +21,9 @@ Updating Geo nodes involves performing: NOTE: **Note:** These general update steps are not intended for [high-availability deployments](https://docs.gitlab.com/omnibus/update/README.html#multi-node--ha-deployment), and will cause downtime. If you want to avoid downtime, consider using [zero downtime updates](https://docs.gitlab.com/omnibus/update/README.html#zero-downtime-updates). +DANGER: **Danger:** +In GitLab 13.2 and later versions, promoting a secondary node to a primary while the secondary is paused fails. We are [investigating the issue](https://gitlab.com/gitlab-org/gitlab/-/issues/225173). Do not pause replication before promoting a secondary. If the node is paused, please resume before promoting. + To update the Geo nodes when a new GitLab version is released, update **primary** and all **secondary** nodes: diff --git a/doc/administration/img/export_audit_log_v13_4.png b/doc/administration/img/export_audit_log_v13_4.png Binary files differindex 1b404b5742c..e4ba330b8a9 100644 --- a/doc/administration/img/export_audit_log_v13_4.png +++ b/doc/administration/img/export_audit_log_v13_4.png diff --git a/doc/administration/postgresql/external.md b/doc/administration/postgresql/external.md index 632b68fb014..4a164c66578 100644 --- a/doc/administration/postgresql/external.md +++ b/doc/administration/postgresql/external.md @@ -1,3 +1,9 @@ +--- +stage: Enablement +group: Database +info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers +--- + # Configure GitLab using an external PostgreSQL service If you're hosting GitLab on a cloud provider, you can optionally use a diff --git a/doc/administration/postgresql/index.md b/doc/administration/postgresql/index.md index 2720d8e696b..c7ec46db654 100644 --- a/doc/administration/postgresql/index.md +++ b/doc/administration/postgresql/index.md @@ -1,11 +1,14 @@ --- +stage: Enablement +group: Database +info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers type: reference --- # Configuring PostgreSQL for scaling In this section, you'll be guided through configuring a PostgreSQL database to -be used with GitLab in one of our [Scalable and Highly Available Setups](../reference_architectures/index.md). +be used with GitLab in one of our [reference architectures](../reference_architectures/index.md). There are essentially three setups to choose from. ## PostgreSQL replication and failover with Omnibus GitLab **(PREMIUM ONLY)** diff --git a/doc/administration/postgresql/pgbouncer.md b/doc/administration/postgresql/pgbouncer.md index 9db3e017359..b946c0949c4 100644 --- a/doc/administration/postgresql/pgbouncer.md +++ b/doc/administration/postgresql/pgbouncer.md @@ -1,4 +1,7 @@ --- +stage: Enablement +group: Database +info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers type: reference --- diff --git a/doc/administration/postgresql/replication_and_failover.md b/doc/administration/postgresql/replication_and_failover.md index 20878f49cd9..a9584f2ffd7 100644 --- a/doc/administration/postgresql/replication_and_failover.md +++ b/doc/administration/postgresql/replication_and_failover.md @@ -1,10 +1,16 @@ +--- +stage: Enablement +group: Database +info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers +--- + # PostgreSQL replication and failover with Omnibus GitLab **(PREMIUM ONLY)** -This document will focus only on configuration supported with [GitLab Premium](https://about.gitlab.com/pricing/), using the Omnibus GitLab package. -If you are a Community Edition or Starter user, consider using a cloud hosted solution. -This document will not cover installations from source. +This document focuses on configuration supported with [GitLab Premium](https://about.gitlab.com/pricing/), using the Omnibus GitLab package. +If you're a Community Edition or Starter user, consider using a cloud hosted solution. +This document doesn't cover installations from source. -If a setup with replication and failover is not what you were looking for, see +If a setup with replication and failover isn't what you were looking for, see the [database configuration document](https://docs.gitlab.com/omnibus/settings/database.html) for the Omnibus GitLab packages. diff --git a/doc/administration/postgresql/standalone.md b/doc/administration/postgresql/standalone.md index 2747749066e..2ac74e8a4a0 100644 --- a/doc/administration/postgresql/standalone.md +++ b/doc/administration/postgresql/standalone.md @@ -1,15 +1,21 @@ +--- +stage: Enablement +group: Database +info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers +--- + # Standalone PostgreSQL using Omnibus GitLab **(CORE ONLY)** If you wish to have your database service hosted separately from your GitLab -application server(s), you can do this using the PostgreSQL binaries packaged +application servers, you can do this using the PostgreSQL binaries packaged together with Omnibus GitLab. This is recommended as part of our [reference architecture for up to 2,000 users](../reference_architectures/2k_users.md). ## Setting it up -1. SSH into the PostgreSQL server. -1. [Download/install](https://about.gitlab.com/install/) the Omnibus GitLab - package you want using **steps 1 and 2** from the GitLab downloads page. +1. SSH in to the PostgreSQL server. +1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab + package you want using *steps 1 and 2* from the GitLab downloads page. - Do not complete any other steps on the download page. 1. Generate a password hash for PostgreSQL. This assumes you will use the default username of `gitlab` (recommended). The command will request a password diff --git a/doc/api/members.md b/doc/api/members.md index 76d63b277c4..43012a5cb80 100644 --- a/doc/api/members.md +++ b/doc/api/members.md @@ -223,6 +223,58 @@ Example response: } ``` +## List all billable members of a group + +> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217384) in GitLab 13.5. + +Gets a list of group members who counts as billable, including members in the sub group/project. + +This function takes [pagination](README.md#pagination) parameters `page` and `per_page` to restrict the list of users. + +```plaintext +GET /groups/:id/billable_members +``` + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user | + +```shell +curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/:id/billable_members" +``` + +Example response: + +```json +[ + { + "id": 1, + "username": "raymond_smith", + "name": "Raymond Smith", + "state": "active", + "avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon", + "web_url": "http://192.168.1.8:3000/root", + }, + { + "id": 2, + "username": "john_doe", + "name": "John Doe", + "state": "active", + "avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon", + "web_url": "http://192.168.1.8:3000/root", + "email": "john@example.com" + }, + { + "id": 3, + "username": "foo_bar", + "name": "Foo bar", + "state": "active", + "avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon", + "web_url": "http://192.168.1.8:3000/root" + } +] +``` + ## Add a member to a group or project Adds a member to a group or project. diff --git a/doc/ci/img/ci_lint.png b/doc/ci/img/ci_lint.png Binary files differindex e62de011293..fdc3868cdce 100644 --- a/doc/ci/img/ci_lint.png +++ b/doc/ci/img/ci_lint.png diff --git a/doc/ci/img/ci_lint_dry_run.png b/doc/ci/img/ci_lint_dry_run.png Binary files differindex 4092b66d534..61d6379f70e 100644 --- a/doc/ci/img/ci_lint_dry_run.png +++ b/doc/ci/img/ci_lint_dry_run.png diff --git a/doc/ci/pipelines/img/ci_efficiency_pipeline_dag_critical_path.png b/doc/ci/pipelines/img/ci_efficiency_pipeline_dag_critical_path.png Binary files differindex 1715e8224ab..421fddaf38d 100644 --- a/doc/ci/pipelines/img/ci_efficiency_pipeline_dag_critical_path.png +++ b/doc/ci/pipelines/img/ci_efficiency_pipeline_dag_critical_path.png diff --git a/doc/ci/pipelines/img/ci_efficiency_pipeline_health_grafana_dashboard.png b/doc/ci/pipelines/img/ci_efficiency_pipeline_health_grafana_dashboard.png Binary files differindex 0956e76804e..59276bda727 100644 --- a/doc/ci/pipelines/img/ci_efficiency_pipeline_health_grafana_dashboard.png +++ b/doc/ci/pipelines/img/ci_efficiency_pipeline_health_grafana_dashboard.png diff --git a/doc/development/api_graphql_styleguide.md b/doc/development/api_graphql_styleguide.md index e3f1d4f705e..d3520ca9c2f 100644 --- a/doc/development/api_graphql_styleguide.md +++ b/doc/development/api_graphql_styleguide.md @@ -780,6 +780,25 @@ to advertise the need for lookahead: For an example of real world use, please see [`ResolvesMergeRequests`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/graphql/resolvers/concerns/resolves_merge_requests.rb). +### Negated arguments + +Negated filters can filter some resources (for example, find all issues that +have the `bug` label, but don't have the `bug2` label assigned). The `not` +argument is the preferred syntax to pass negated arguments: + +```graphql +issues(labelName: "bug", not: {labelName: "bug2"}) { + nodes { + id + title + } +} +``` + +To avoid duplicated argument definitions, you can place these arguments in a reusable module (or +class, if the arguments are nested). Alternatively, you can consider to add a +[helper resolver method](https://gitlab.com/gitlab-org/gitlab/-/issues/258969). + ## Pass a parent object into a child Presenter Sometimes you need to access the resolved query parent in a child context to compute fields. Usually the parent is only diff --git a/doc/operations/metrics/dashboards/img/metrics_dashboard_panel_preview_v13_3.png b/doc/operations/metrics/dashboards/img/metrics_dashboard_panel_preview_v13_3.png Binary files differindex 4f6d3b3dfa4..3c3203265e1 100644 --- a/doc/operations/metrics/dashboards/img/metrics_dashboard_panel_preview_v13_3.png +++ b/doc/operations/metrics/dashboards/img/metrics_dashboard_panel_preview_v13_3.png diff --git a/doc/user/admin_area/analytics/img/cohorts_v13_4.png b/doc/user/admin_area/analytics/img/cohorts_v13_4.png Binary files differindex 4af1841a033..6f7dd5101f2 100644 --- a/doc/user/admin_area/analytics/img/cohorts_v13_4.png +++ b/doc/user/admin_area/analytics/img/cohorts_v13_4.png diff --git a/doc/user/admin_area/analytics/img/dev_ops_report_v13_4.png b/doc/user/admin_area/analytics/img/dev_ops_report_v13_4.png Binary files differindex 1fa070a6915..d47d86cd514 100644 --- a/doc/user/admin_area/analytics/img/dev_ops_report_v13_4.png +++ b/doc/user/admin_area/analytics/img/dev_ops_report_v13_4.png diff --git a/doc/user/analytics/img/mr_throughput_chart_v13_3.png b/doc/user/analytics/img/mr_throughput_chart_v13_3.png Binary files differindex 04fa54f323c..100c9a8557c 100644 --- a/doc/user/analytics/img/mr_throughput_chart_v13_3.png +++ b/doc/user/analytics/img/mr_throughput_chart_v13_3.png diff --git a/doc/user/analytics/img/mr_throughput_table_v13_3.png b/doc/user/analytics/img/mr_throughput_table_v13_3.png Binary files differindex 63ffb9389f4..bb63770dc3f 100644 --- a/doc/user/analytics/img/mr_throughput_table_v13_3.png +++ b/doc/user/analytics/img/mr_throughput_table_v13_3.png diff --git a/doc/user/analytics/img/new_value_stream_v13_3.png b/doc/user/analytics/img/new_value_stream_v13_3.png Binary files differindex 4284b8ab194..bc8502e85a6 100644 --- a/doc/user/analytics/img/new_value_stream_v13_3.png +++ b/doc/user/analytics/img/new_value_stream_v13_3.png diff --git a/doc/user/analytics/img/vsa_filter_bar_v13.3.png b/doc/user/analytics/img/vsa_filter_bar_v13.3.png Binary files differindex 71e59892434..506765f63cb 100644 --- a/doc/user/analytics/img/vsa_filter_bar_v13.3.png +++ b/doc/user/analytics/img/vsa_filter_bar_v13.3.png diff --git a/doc/user/application_security/img/cve_request_communication.png b/doc/user/application_security/img/cve_request_communication.png Binary files differindex 0766b371c11..5c58df463ef 100644 --- a/doc/user/application_security/img/cve_request_communication.png +++ b/doc/user/application_security/img/cve_request_communication.png diff --git a/doc/user/application_security/img/cve_request_communication_publication.png b/doc/user/application_security/img/cve_request_communication_publication.png Binary files differindex 9e34c217e13..9eb6f2f8d9f 100644 --- a/doc/user/application_security/img/cve_request_communication_publication.png +++ b/doc/user/application_security/img/cve_request_communication_publication.png diff --git a/doc/user/application_security/img/new_cve_request_issue.png b/doc/user/application_security/img/new_cve_request_issue.png Binary files differindex a342c73992e..6ea7ca4a2ab 100644 --- a/doc/user/application_security/img/new_cve_request_issue.png +++ b/doc/user/application_security/img/new_cve_request_issue.png diff --git a/doc/user/application_security/img/unconfigured_security_approval_rules_and_enabled_jobs_v13_4.png b/doc/user/application_security/img/unconfigured_security_approval_rules_and_enabled_jobs_v13_4.png Binary files differindex f497b0fbc4e..7b04988afdb 100644 --- a/doc/user/application_security/img/unconfigured_security_approval_rules_and_enabled_jobs_v13_4.png +++ b/doc/user/application_security/img/unconfigured_security_approval_rules_and_enabled_jobs_v13_4.png diff --git a/doc/user/application_security/img/unconfigured_security_approval_rules_and_jobs_v13_4.png b/doc/user/application_security/img/unconfigured_security_approval_rules_and_jobs_v13_4.png Binary files differindex fc847b578f5..b9b6dd13294 100644 --- a/doc/user/application_security/img/unconfigured_security_approval_rules_and_jobs_v13_4.png +++ b/doc/user/application_security/img/unconfigured_security_approval_rules_and_jobs_v13_4.png diff --git a/doc/user/application_security/img/vulnerability-check_v13_4.png b/doc/user/application_security/img/vulnerability-check_v13_4.png Binary files differindex e0b53059b45..3e38f6eebe7 100644 --- a/doc/user/application_security/img/vulnerability-check_v13_4.png +++ b/doc/user/application_security/img/vulnerability-check_v13_4.png diff --git a/doc/user/application_security/img/vulnerability_solution.png b/doc/user/application_security/img/vulnerability_solution.png Binary files differindex 97d7736d798..63e9c1473b6 100644 --- a/doc/user/application_security/img/vulnerability_solution.png +++ b/doc/user/application_security/img/vulnerability_solution.png diff --git a/doc/user/application_security/security_dashboard/img/group_vulnerability_report_v13_4.png b/doc/user/application_security/security_dashboard/img/group_vulnerability_report_v13_4.png Binary files differindex 10130da0f89..0310ef3ea0a 100644 --- a/doc/user/application_security/security_dashboard/img/group_vulnerability_report_v13_4.png +++ b/doc/user/application_security/security_dashboard/img/group_vulnerability_report_v13_4.png diff --git a/doc/user/application_security/security_dashboard/img/instance_security_center_settings_v13_4.png b/doc/user/application_security/security_dashboard/img/instance_security_center_settings_v13_4.png Binary files differindex d7d5961087c..4223494c294 100644 --- a/doc/user/application_security/security_dashboard/img/instance_security_center_settings_v13_4.png +++ b/doc/user/application_security/security_dashboard/img/instance_security_center_settings_v13_4.png diff --git a/doc/user/application_security/security_dashboard/img/instance_security_dashboard_empty_v13_4.png b/doc/user/application_security/security_dashboard/img/instance_security_dashboard_empty_v13_4.png Binary files differindex 3c618090be8..5edceb32e5c 100644 --- a/doc/user/application_security/security_dashboard/img/instance_security_dashboard_empty_v13_4.png +++ b/doc/user/application_security/security_dashboard/img/instance_security_dashboard_empty_v13_4.png diff --git a/doc/user/application_security/security_dashboard/img/instance_security_dashboard_v13_4.png b/doc/user/application_security/security_dashboard/img/instance_security_dashboard_v13_4.png Binary files differindex 5e52bcc650a..5379b5c6e5d 100644 --- a/doc/user/application_security/security_dashboard/img/instance_security_dashboard_v13_4.png +++ b/doc/user/application_security/security_dashboard/img/instance_security_dashboard_v13_4.png diff --git a/doc/user/application_security/security_dashboard/img/project_security_dashboard_dismissal_v13_4.png b/doc/user/application_security/security_dashboard/img/project_security_dashboard_dismissal_v13_4.png Binary files differindex 163288fd5a7..eb1dfe6c6f4 100644 --- a/doc/user/application_security/security_dashboard/img/project_security_dashboard_dismissal_v13_4.png +++ b/doc/user/application_security/security_dashboard/img/project_security_dashboard_dismissal_v13_4.png diff --git a/doc/user/application_security/security_dashboard/img/project_security_dashboard_v13_3.png b/doc/user/application_security/security_dashboard/img/project_security_dashboard_v13_3.png Binary files differindex 34c64f830ba..adae37e0190 100644 --- a/doc/user/application_security/security_dashboard/img/project_security_dashboard_v13_3.png +++ b/doc/user/application_security/security_dashboard/img/project_security_dashboard_v13_3.png diff --git a/doc/user/application_security/security_dashboard/img/project_security_dashboard_v13_4.png b/doc/user/application_security/security_dashboard/img/project_security_dashboard_v13_4.png Binary files differindex 8b55bacc4fb..ea4f188c80e 100644 --- a/doc/user/application_security/security_dashboard/img/project_security_dashboard_v13_4.png +++ b/doc/user/application_security/security_dashboard/img/project_security_dashboard_v13_4.png diff --git a/doc/user/application_security/security_dashboard/img/vulnerability_list_table_v13_4.png b/doc/user/application_security/security_dashboard/img/vulnerability_list_table_v13_4.png Binary files differindex 6de51fe29bd..760942c3239 100644 --- a/doc/user/application_security/security_dashboard/img/vulnerability_list_table_v13_4.png +++ b/doc/user/application_security/security_dashboard/img/vulnerability_list_table_v13_4.png diff --git a/doc/user/compliance/compliance_dashboard/img/compliance_dashboard_v13_3_1.png b/doc/user/compliance/compliance_dashboard/img/compliance_dashboard_v13_3_1.png Binary files differindex a06f8812b41..89f4e917567 100644 --- a/doc/user/compliance/compliance_dashboard/img/compliance_dashboard_v13_3_1.png +++ b/doc/user/compliance/compliance_dashboard/img/compliance_dashboard_v13_3_1.png diff --git a/doc/user/compliance/license_compliance/img/license-check_v13_4.png b/doc/user/compliance/license_compliance/img/license-check_v13_4.png Binary files differindex d3658cbaa18..bc80f938395 100644 --- a/doc/user/compliance/license_compliance/img/license-check_v13_4.png +++ b/doc/user/compliance/license_compliance/img/license-check_v13_4.png diff --git a/doc/user/img/feature_flags_history_note_info_v13_2.png b/doc/user/img/feature_flags_history_note_info_v13_2.png Binary files differindex 403a6002603..07d096b6dde 100644 --- a/doc/user/img/feature_flags_history_note_info_v13_2.png +++ b/doc/user/img/feature_flags_history_note_info_v13_2.png diff --git a/doc/user/img/version_history_notes_collapsed_v13_2.png b/doc/user/img/version_history_notes_collapsed_v13_2.png Binary files differindex 42ea11ae8ff..b85c9cb36dd 100644 --- a/doc/user/img/version_history_notes_collapsed_v13_2.png +++ b/doc/user/img/version_history_notes_collapsed_v13_2.png diff --git a/doc/user/project/import/img/manifest_status_v13_3.png b/doc/user/project/import/img/manifest_status_v13_3.png Binary files differindex 3f0063e6715..c1a55ba1f50 100644 --- a/doc/user/project/import/img/manifest_status_v13_3.png +++ b/doc/user/project/import/img/manifest_status_v13_3.png diff --git a/lib/gitlab/ci/pipeline/chain/command.rb b/lib/gitlab/ci/pipeline/chain/command.rb index d1882059dd8..06096a33f27 100644 --- a/lib/gitlab/ci/pipeline/chain/command.rb +++ b/lib/gitlab/ci/pipeline/chain/command.rb @@ -16,7 +16,7 @@ module Gitlab ) do include Gitlab::Utils::StrongMemoize - def initialize(**params) + def initialize(params = {}) params.each do |key, value| self[key] = value end diff --git a/lib/gitlab/ci/variables/collection/item.rb b/lib/gitlab/ci/variables/collection/item.rb index a072036daa8..84a9280e507 100644 --- a/lib/gitlab/ci/variables/collection/item.rb +++ b/lib/gitlab/ci/variables/collection/item.rb @@ -36,9 +36,9 @@ module Gitlab def self.fabricate(resource) case resource when Hash - self.new(resource.symbolize_keys) + self.new(**resource.symbolize_keys) when ::Ci::HasVariable - self.new(resource.to_runner_variable) + self.new(**resource.to_runner_variable) when self resource.dup else diff --git a/lib/gitlab/config/entry/factory.rb b/lib/gitlab/config/entry/factory.rb index 7c5ffaa7621..f76c98f7cbf 100644 --- a/lib/gitlab/config/entry/factory.rb +++ b/lib/gitlab/config/entry/factory.rb @@ -79,7 +79,7 @@ module Gitlab end def fabricate(entry_class, value = nil) - entry_class.new(value, @metadata) do |node| + entry_class.new(value, **@metadata) do |node| node.key = @attributes[:key] node.parent = @attributes[:parent] node.default = @attributes[:default] diff --git a/lib/gitlab/config/entry/simplifiable.rb b/lib/gitlab/config/entry/simplifiable.rb index 315f1947e2c..ee28891a174 100644 --- a/lib/gitlab/config/entry/simplifiable.rb +++ b/lib/gitlab/config/entry/simplifiable.rb @@ -19,7 +19,7 @@ module Gitlab entry = self.class.entry_class(strategy) - @subject = entry.new(config, metadata, &blk) + @subject = entry.new(config, **metadata, &blk) super(@subject) end diff --git a/lib/gitlab/usage_data.rb b/lib/gitlab/usage_data.rb index 7de54d39709..212643901f2 100644 --- a/lib/gitlab/usage_data.rb +++ b/lib/gitlab/usage_data.rb @@ -138,6 +138,7 @@ module Gitlab pages_domains: count(PagesDomain), pool_repositories: count(PoolRepository), projects: count(Project), + projects_creating_incidents: distinct_count(Issue.incident, :project_id), projects_imported_from_github: count(Project.where(import_type: 'github')), projects_with_repositories_enabled: count(ProjectFeature.where('repository_access_level > ?', ProjectFeature::DISABLED)), projects_with_error_tracking_enabled: count(::ErrorTracking::ProjectErrorTrackingSetting.where(enabled: true)), diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 4904fd8ad29..f7e0c185270 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -8,8 +8,6 @@ msgid "" msgstr "" "Project-Id-Version: gitlab 1.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-09-22 19:32+0200\n" -"PO-Revision-Date: 2020-09-22 19:32+0200\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "Language: \n" @@ -15700,6 +15698,18 @@ msgstr "" msgid "Members with access to %{strong_start}%{group_name}%{strong_end}" msgstr "" +msgid "Members|%{time} by %{user}" +msgstr "" + +msgid "Members|Expired" +msgstr "" + +msgid "Members|No expiration set" +msgstr "" + +msgid "Members|in %{time}" +msgstr "" + msgid "Memory Usage" msgstr "" @@ -24434,6 +24444,9 @@ msgstr "" msgid "StaticSiteEditor|3. Assign a person to review and accept the merge request." msgstr "" +msgid "StaticSiteEditor|A link to view the merge request will appear once ready." +msgstr "" + msgid "StaticSiteEditor|An error occurred while submitting your changes." msgstr "" @@ -24446,6 +24459,9 @@ msgstr "" msgid "StaticSiteEditor|Could not create merge request." msgstr "" +msgid "StaticSiteEditor|Creating your merge request" +msgstr "" + msgid "StaticSiteEditor|Incompatible file content" msgstr "" @@ -24467,6 +24483,9 @@ msgstr "" msgid "StaticSiteEditor|View documentation" msgstr "" +msgid "StaticSiteEditor|You can set an assignee to get your changes reviewed and deployed once your merge request is created." +msgstr "" + msgid "StaticSiteEditor|Your merge request has been created" msgstr "" diff --git a/package.json b/package.json index 79b6eb6faff..78f09ead5ad 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,6 @@ "glob": "^7.1.6", "graphql": "^14.7.0", "graphql-tag": "^2.10.1", - "gray-matter": "^4.0.2", "immer": "^7.0.7", "imports-loader": "^0.8.0", "ipaddr.js": "^1.9.1", diff --git a/spec/features/issues/gfm_autocomplete_spec.rb b/spec/features/issues/gfm_autocomplete_spec.rb index 62e292c557c..ff78b9e608f 100644 --- a/spec/features/issues/gfm_autocomplete_spec.rb +++ b/spec/features/issues/gfm_autocomplete_spec.rb @@ -297,21 +297,18 @@ RSpec.describe 'GFM autocomplete', :js do end context 'assignees' do - let_it_be(:issue_assignee) { create(:issue, project: project, assignees: [user]) } - let_it_be(:unassigned_user) { create(:user) } + let(:issue_assignee) { create(:issue, project: project) } + let(:unassigned_user) { create(:user) } - let_it_be(:group) { create(:group) } + before do + issue_assignee.update(assignees: [user]) - before_all do project.add_maintainer(unassigned_user) - group.add_developer(user) end it 'lists users who are currently not assigned to the issue when using /assign' do visit project_issue_path(project, issue_assignee) - wait_for_requests - note = find('#note-body') page.within '.timeline-content-form' do note.native.send_keys('/as') @@ -323,7 +320,6 @@ RSpec.describe 'GFM autocomplete', :js do wait_for_requests expect(find('#at-view-users .atwho-view-ul')).not_to have_content(user.username) - expect(find('#at-view-users .atwho-view-ul')).not_to have_content(group.name) expect(find('#at-view-users .atwho-view-ul')).to have_content(unassigned_user.username) end @@ -336,7 +332,6 @@ RSpec.describe 'GFM autocomplete', :js do textarea.native.send_keys(:tab) expect(find('#at-view-users .atwho-view-ul')).to have_content(unassigned_user.username) - expect(find('#at-view-users .atwho-view-ul')).not_to have_content(group.name) expect(find('#at-view-users .atwho-view-ul')).to have_content(user.username) end end @@ -669,21 +664,18 @@ RSpec.describe 'GFM autocomplete', :js do end context 'assignees' do - let_it_be(:issue_assignee) { create(:issue, project: project, assignees: [user]) } - let_it_be(:unassigned_user) { create(:user) } + let(:issue_assignee) { create(:issue, project: project) } + let(:unassigned_user) { create(:user) } - let_it_be(:group) { create(:group) } + before do + issue_assignee.update(assignees: [user]) - before_all do project.add_maintainer(unassigned_user) - group.add_developer(user) end it 'lists users who are currently not assigned to the issue when using /assign' do visit project_issue_path(project, issue_assignee) - wait_for_requests - note = find('#note-body') page.within '.timeline-content-form' do note.native.send_keys('/as') @@ -696,15 +688,12 @@ RSpec.describe 'GFM autocomplete', :js do wait_for_requests expect(find('.tribute-container ul', visible: true)).not_to have_content(user.username) - expect(find('.tribute-container ul', visible: true)).not_to have_content(group.name) expect(find('.tribute-container ul', visible: true)).to have_content(unassigned_user.username) end it 'lists users who are currently not assigned to the issue when using /assign on the second line' do visit project_issue_path(project, issue_assignee) - wait_for_requests - note = find('#note-body') page.within '.timeline-content-form' do note.native.send_keys('/assign @user2') diff --git a/spec/frontend/gfm_auto_complete_spec.js b/spec/frontend/gfm_auto_complete_spec.js index 0b62aa20002..38a0da95080 100644 --- a/spec/frontend/gfm_auto_complete_spec.js +++ b/spec/frontend/gfm_auto_complete_spec.js @@ -491,7 +491,6 @@ describe('GfmAutoComplete', () => { it('should set the text avatar if avatar_url is null', () => { expect(membersBeforeSave([{ ...mockGroup, avatar_url: null }])).toEqual([ { - type: 'Group', username: 'my-group', avatarTag: '<div class="avatar rect-avatar center avatar-inline s26">M</div>', title: 'My Group (2)', @@ -504,7 +503,6 @@ describe('GfmAutoComplete', () => { it('should set the image avatar if avatar_url is given', () => { expect(membersBeforeSave([mockGroup])).toEqual([ { - type: 'Group', username: 'my-group', avatarTag: '<img src="./group.jpg" alt="my-group" class="avatar rect-avatar avatar-inline center s26"/>', @@ -518,7 +516,6 @@ describe('GfmAutoComplete', () => { it('should set mentions disabled icon if mentionsDisabled is set', () => { expect(membersBeforeSave([{ ...mockGroup, mentionsDisabled: true }])).toEqual([ { - type: 'Group', username: 'my-group', avatarTag: '<img src="./group.jpg" alt="my-group" class="avatar rect-avatar avatar-inline center s26"/>', @@ -537,7 +534,6 @@ describe('GfmAutoComplete', () => { ]), ).toEqual([ { - type: 'User', username: 'my-user', avatarTag: '<img src="./users.jpg" alt="my-user" class="avatar avatar-inline center s26"/>', diff --git a/spec/frontend/static_site_editor/pages/home_spec.js b/spec/frontend/static_site_editor/pages/home_spec.js index 41f8a1075c0..ade65b20d6d 100644 --- a/spec/frontend/static_site_editor/pages/home_spec.js +++ b/spec/frontend/static_site_editor/pages/home_spec.js @@ -1,4 +1,3 @@ -import Vuex from 'vuex'; import { shallowMount, createLocalVue } from '@vue/test-utils'; import { mockTracking, unmockTracking } from 'helpers/tracking_helper'; import Home from '~/static_site_editor/pages/home.vue'; @@ -7,6 +6,7 @@ import EditArea from '~/static_site_editor/components/edit_area.vue'; import InvalidContentMessage from '~/static_site_editor/components/invalid_content_message.vue'; import SubmitChangesError from '~/static_site_editor/components/submit_changes_error.vue'; import submitContentChangesMutation from '~/static_site_editor/graphql/mutations/submit_content_changes.mutation.graphql'; +import hasSubmittedChangesMutation from '~/static_site_editor/graphql/mutations/has_submitted_changes.mutation.graphql'; import { SUCCESS_ROUTE } from '~/static_site_editor/router/constants'; import { TRACKING_ACTION_INITIALIZE_EDITOR } from '~/static_site_editor/constants'; @@ -24,8 +24,6 @@ import { const localVue = createLocalVue(); -localVue.use(Vuex); - describe('static_site_editor/pages/home', () => { let wrapper; let store; @@ -33,6 +31,19 @@ describe('static_site_editor/pages/home', () => { let $router; let mutateMock; let trackingSpy; + const defaultAppData = { + isSupportedContent: true, + hasSubmittedChanges: false, + returnUrl, + project, + username, + sourcePath, + }; + const hasSubmittedChangesMutationPayload = { + data: { + appData: { ...defaultAppData, hasSubmittedChanges: true }, + }, + }; const buildApollo = (queries = {}) => { mutateMock = jest.fn(); @@ -64,7 +75,7 @@ describe('static_site_editor/pages/home', () => { }, data() { return { - appData: { isSupportedContent: true, returnUrl, project, username, sourcePath }, + appData: { ...defaultAppData }, sourceContent: { title, content }, ...data, }; @@ -152,8 +163,14 @@ describe('static_site_editor/pages/home', () => { }); describe('when submitting changes fails', () => { + const setupMutateMock = () => { + mutateMock + .mockResolvedValueOnce(hasSubmittedChangesMutationPayload) + .mockRejectedValueOnce(new Error(submitChangesError)); + }; + beforeEach(() => { - mutateMock.mockRejectedValue(new Error(submitChangesError)); + setupMutateMock(); buildWrapper(); findEditArea().vm.$emit('submit', { content }); @@ -166,6 +183,8 @@ describe('static_site_editor/pages/home', () => { }); it('retries submitting changes when retry button is clicked', () => { + setupMutateMock(); + findSubmitChangesError().vm.$emit('retry'); expect(mutateMock).toHaveBeenCalled(); @@ -190,7 +209,11 @@ describe('static_site_editor/pages/home', () => { const newContent = `new ${content}`; beforeEach(() => { - mutateMock.mockResolvedValueOnce({ data: { submitContentChanges: savedContentMeta } }); + mutateMock.mockResolvedValueOnce(hasSubmittedChangesMutationPayload).mockResolvedValueOnce({ + data: { + submitContentChanges: savedContentMeta, + }, + }); buildWrapper(); findEditArea().vm.$emit('submit', { content: newContent }); @@ -198,8 +221,19 @@ describe('static_site_editor/pages/home', () => { return wrapper.vm.$nextTick(); }); + it('dispatches hasSubmittedChanges mutation', () => { + expect(mutateMock).toHaveBeenNthCalledWith(1, { + mutation: hasSubmittedChangesMutation, + variables: { + input: { + hasSubmittedChanges: true, + }, + }, + }); + }); + it('dispatches submitContentChanges mutation', () => { - expect(mutateMock).toHaveBeenCalledWith({ + expect(mutateMock).toHaveBeenNthCalledWith(2, { mutation: submitContentChangesMutation, variables: { input: { diff --git a/spec/frontend/static_site_editor/pages/success_spec.js b/spec/frontend/static_site_editor/pages/success_spec.js index 3e19e2413e7..712da4825c7 100644 --- a/spec/frontend/static_site_editor/pages/success_spec.js +++ b/spec/frontend/static_site_editor/pages/success_spec.js @@ -1,10 +1,10 @@ import { shallowMount } from '@vue/test-utils'; -import { GlEmptyState, GlButton } from '@gitlab/ui'; +import { GlButton, GlEmptyState, GlLoadingIcon } from '@gitlab/ui'; import Success from '~/static_site_editor/pages/success.vue'; import { savedContentMeta, returnUrl, sourcePath } from '../mock_data'; import { HOME_ROUTE } from '~/static_site_editor/router/constants'; -describe('static_site_editor/pages/success', () => { +describe('~/static_site_editor/pages/success.vue', () => { const mergeRequestsIllustrationPath = 'illustrations/merge_requests.svg'; let wrapper; let router; @@ -15,14 +15,15 @@ describe('static_site_editor/pages/success', () => { }; }; - const buildWrapper = (data = {}) => { + const buildWrapper = (data = {}, appData = {}) => { wrapper = shallowMount(Success, { mocks: { $router: router, }, stubs: { - GlEmptyState, GlButton, + GlEmptyState, + GlLoadingIcon, }, propsData: { mergeRequestsIllustrationPath, @@ -33,6 +34,8 @@ describe('static_site_editor/pages/success', () => { appData: { returnUrl, sourcePath, + hasSubmittedChanges: true, + ...appData, }, ...data, }; @@ -40,8 +43,9 @@ describe('static_site_editor/pages/success', () => { }); }; - const findEmptyState = () => wrapper.find(GlEmptyState); const findReturnUrlButton = () => wrapper.find(GlButton); + const findEmptyState = () => wrapper.find(GlEmptyState); + const findLoadingIcon = () => wrapper.find(GlLoadingIcon); beforeEach(() => { buildRouter(); @@ -52,50 +56,75 @@ describe('static_site_editor/pages/success', () => { wrapper = null; }); - it('renders empty state with a link to the created merge request', () => { - buildWrapper(); + describe('when savedContentMeta is valid', () => { + it('renders empty state with a link to the created merge request', () => { + buildWrapper(); + + expect(findEmptyState().exists()).toBe(true); + expect(findEmptyState().props()).toMatchObject({ + primaryButtonText: 'View merge request', + primaryButtonLink: savedContentMeta.mergeRequest.url, + title: 'Your merge request has been created', + svgPath: mergeRequestsIllustrationPath, + }); + }); - expect(findEmptyState().exists()).toBe(true); - expect(findEmptyState().props()).toMatchObject({ - primaryButtonText: 'View merge request', - primaryButtonLink: savedContentMeta.mergeRequest.url, - title: 'Your merge request has been created', - svgPath: mergeRequestsIllustrationPath, + it('displays merge request instructions in the empty state', () => { + buildWrapper(); + + expect(findEmptyState().text()).toContain( + 'To see your changes live you will need to do the following things:', + ); + expect(findEmptyState().text()).toContain('1. Add a clear title to describe the change.'); + expect(findEmptyState().text()).toContain( + '2. Add a description to explain why the change is being made.', + ); + expect(findEmptyState().text()).toContain( + '3. Assign a person to review and accept the merge request.', + ); }); - }); - it('displays merge request instructions in the empty state', () => { - buildWrapper(); - - expect(findEmptyState().text()).toContain( - 'To see your changes live you will need to do the following things:', - ); - expect(findEmptyState().text()).toContain('1. Add a clear title to describe the change.'); - expect(findEmptyState().text()).toContain( - '2. Add a description to explain why the change is being made.', - ); - expect(findEmptyState().text()).toContain( - '3. Assign a person to review and accept the merge request.', - ); - }); + it('displays return to site button', () => { + buildWrapper(); + + expect(findReturnUrlButton().text()).toBe('Return to site'); + expect(findReturnUrlButton().attributes().href).toBe(returnUrl); + }); - it('displays return to site button', () => { - buildWrapper(); + it('displays source path', () => { + buildWrapper(); - expect(findReturnUrlButton().text()).toBe('Return to site'); - expect(findReturnUrlButton().attributes().href).toBe(returnUrl); + expect(wrapper.text()).toContain(`Update ${sourcePath} file`); + }); }); - it('displays source path', () => { - buildWrapper(); + describe('when savedContentMeta is invalid', () => { + it('renders empty state with a loader', () => { + buildWrapper({ savedContentMeta: null }); - expect(wrapper.text()).toContain(`Update ${sourcePath} file`); - }); + expect(findEmptyState().exists()).toBe(true); + expect(findEmptyState().props()).toMatchObject({ + title: 'Creating your merge request', + svgPath: mergeRequestsIllustrationPath, + }); + expect(findLoadingIcon().exists()).toBe(true); + }); - it('redirects to the HOME route when content has not been submitted', () => { - buildWrapper({ savedContentMeta: null }); + it('displays helper info in the empty state', () => { + buildWrapper({ savedContentMeta: null }); - expect(router.push).toHaveBeenCalledWith(HOME_ROUTE); - expect(wrapper.html()).toBe(''); + expect(findEmptyState().text()).toContain( + 'You can set an assignee to get your changes reviewed and deployed once your merge request is created', + ); + expect(findEmptyState().text()).toContain( + 'A link to view the merge request will appear once ready', + ); + }); + + it('redirects to the HOME route when content has not been submitted', () => { + buildWrapper({ savedContentMeta: null }, { hasSubmittedChanges: false }); + + expect(router.push).toHaveBeenCalledWith(HOME_ROUTE); + }); }); }); diff --git a/spec/frontend/static_site_editor/services/front_matterify_spec.js b/spec/frontend/static_site_editor/services/front_matterify_spec.js new file mode 100644 index 00000000000..dbaedc30849 --- /dev/null +++ b/spec/frontend/static_site_editor/services/front_matterify_spec.js @@ -0,0 +1,47 @@ +import { + sourceContentYAML as content, + sourceContentHeaderObjYAML as yamlFrontMatterObj, + sourceContentSpacing as spacing, + sourceContentBody as body, +} from '../mock_data'; + +import { frontMatterify, stringify } from '~/static_site_editor/services/front_matterify'; + +describe('static_site_editor/services/front_matterify', () => { + const frontMatterifiedContent = { + source: content, + matter: yamlFrontMatterObj, + spacing, + content: body, + delimiter: '---', + type: 'yaml', + }; + const frontMatterifiedBody = { + source: body, + matter: null, + spacing: null, + content: body, + delimiter: null, + type: null, + }; + + describe('frontMatterify', () => { + it.each` + frontMatterified | target + ${frontMatterify(content)} | ${frontMatterifiedContent} + ${frontMatterify(body)} | ${frontMatterifiedBody} + `('returns $target from $frontMatterified', ({ frontMatterified, target }) => { + expect(frontMatterified).toEqual(target); + }); + }); + + describe('stringify', () => { + it.each` + stringified | target + ${stringify(frontMatterifiedContent)} | ${content} + ${stringify(frontMatterifiedBody)} | ${body} + `('returns $target from $stringified', ({ stringified, target }) => { + expect(stringified).toBe(target); + }); + }); +}); diff --git a/spec/frontend/vue_shared/components/members/table/created_at_spec.js b/spec/frontend/vue_shared/components/members/table/created_at_spec.js new file mode 100644 index 00000000000..cf3821baf44 --- /dev/null +++ b/spec/frontend/vue_shared/components/members/table/created_at_spec.js @@ -0,0 +1,61 @@ +import { mount, createWrapper } from '@vue/test-utils'; +import { within } from '@testing-library/dom'; +import { useFakeDate } from 'helpers/fake_date'; +import CreatedAt from '~/vue_shared/components/members/table/created_at.vue'; +import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue'; + +describe('CreatedAt', () => { + // March 15th, 2020 + useFakeDate(2020, 2, 15); + + const date = '2020-03-01T00:00:00.000'; + const dateTimeAgo = '2 weeks ago'; + + let wrapper; + + const createComponent = propsData => { + wrapper = mount(CreatedAt, { + propsData: { + date, + ...propsData, + }, + }); + }; + + const getByText = (text, options) => + createWrapper(within(wrapper.element).getByText(text, options)); + + afterEach(() => { + wrapper.destroy(); + }); + + describe('created at text', () => { + beforeEach(() => { + createComponent(); + }); + + it('displays created at text', () => { + expect(getByText(dateTimeAgo).exists()).toBe(true); + }); + + it('uses `TimeAgoTooltip` component to display tooltip', () => { + expect(wrapper.find(TimeAgoTooltip).exists()).toBe(true); + }); + }); + + describe('when `createdBy` prop is provided', () => { + it('displays a link to the user that created the member', () => { + createComponent({ + createdBy: { + name: 'Administrator', + webUrl: 'https://gitlab.com/root', + }, + }); + + const link = getByText('Administrator'); + + expect(link.exists()).toBe(true); + expect(link.attributes('href')).toBe('https://gitlab.com/root'); + }); + }); +}); diff --git a/spec/frontend/vue_shared/components/members/table/expires_at_spec.js b/spec/frontend/vue_shared/components/members/table/expires_at_spec.js new file mode 100644 index 00000000000..95ae251b0fd --- /dev/null +++ b/spec/frontend/vue_shared/components/members/table/expires_at_spec.js @@ -0,0 +1,86 @@ +import { mount, createWrapper } from '@vue/test-utils'; +import { within } from '@testing-library/dom'; +import { useFakeDate } from 'helpers/fake_date'; +import { createMockDirective, getBinding } from 'helpers/vue_mock_directive'; +import ExpiresAt from '~/vue_shared/components/members/table/expires_at.vue'; + +describe('ExpiresAt', () => { + // March 15th, 2020 + useFakeDate(2020, 2, 15); + + let wrapper; + + const createComponent = propsData => { + wrapper = mount(ExpiresAt, { + propsData, + directives: { + GlTooltip: createMockDirective(), + }, + }); + }; + + const getByText = (text, options) => + createWrapper(within(wrapper.element).getByText(text, options)); + + const getTooltipDirective = elementWrapper => getBinding(elementWrapper.element, 'gl-tooltip'); + + afterEach(() => { + wrapper.destroy(); + }); + + describe('when no expiration date is set', () => { + it('displays "No expiration set"', () => { + createComponent({ date: null }); + + expect(getByText('No expiration set').exists()).toBe(true); + }); + }); + + describe('when expiration date is in the past', () => { + let expiredText; + + beforeEach(() => { + createComponent({ date: '2019-03-15T00:00:00.000' }); + + expiredText = getByText('Expired'); + }); + + it('displays "Expired"', () => { + expect(expiredText.exists()).toBe(true); + expect(expiredText.classes()).toContain('gl-text-red-500'); + }); + + it('displays tooltip with formatted date', () => { + const tooltipDirective = getTooltipDirective(expiredText); + + expect(tooltipDirective).not.toBeUndefined(); + expect(expiredText.attributes('title')).toBe('Mar 15, 2019 12:00am GMT+0000'); + }); + }); + + describe('when expiration date is in the future', () => { + it.each` + date | expected | warningColor + ${'2020-03-23T00:00:00.000'} | ${'in 8 days'} | ${false} + ${'2020-03-20T00:00:00.000'} | ${'in 5 days'} | ${true} + ${'2020-03-16T00:00:00.000'} | ${'in 1 day'} | ${true} + ${'2020-03-15T05:00:00.000'} | ${'in about 5 hours'} | ${true} + ${'2020-03-15T01:00:00.000'} | ${'in about 1 hour'} | ${true} + ${'2020-03-15T00:30:00.000'} | ${'in 30 minutes'} | ${true} + ${'2020-03-15T00:01:15.000'} | ${'in 1 minute'} | ${true} + ${'2020-03-15T00:00:15.000'} | ${'in less than a minute'} | ${true} + `('displays "$expected"', ({ date, expected, warningColor }) => { + createComponent({ date }); + + const expiredText = getByText(expected); + + expect(expiredText.exists()).toBe(true); + + if (warningColor) { + expect(expiredText.classes()).toContain('gl-text-orange-500'); + } else { + expect(expiredText.classes()).not.toContain('gl-text-orange-500'); + } + }); + }); +}); diff --git a/spec/frontend/vue_shared/components/members/table/members_table_spec.js b/spec/frontend/vue_shared/components/members/table/members_table_spec.js index dbad203b4f6..4979a7096ac 100644 --- a/spec/frontend/vue_shared/components/members/table/members_table_spec.js +++ b/spec/frontend/vue_shared/components/members/table/members_table_spec.js @@ -7,6 +7,8 @@ import { import MembersTable from '~/vue_shared/components/members/table/members_table.vue'; import MemberAvatar from '~/vue_shared/components/members/table/member_avatar.vue'; import MemberSource from '~/vue_shared/components/members/table/member_source.vue'; +import ExpiresAt from '~/vue_shared/components/members/table/expires_at.vue'; +import CreatedAt from '~/vue_shared/components/members/table/created_at.vue'; import * as initUserPopovers from '~/user_popovers'; import { member as memberMock, invite, accessRequest } from '../mock_data'; @@ -30,7 +32,7 @@ describe('MemberList', () => { wrapper = mount(MembersTable, { localVue, store: createStore(state), - stubs: ['member-avatar'], + stubs: ['member-avatar', 'member-source', 'expires-at', 'created-at'], }); }; @@ -50,10 +52,10 @@ describe('MemberList', () => { field | label | member | expectedComponent ${'account'} | ${'Account'} | ${memberMock} | ${MemberAvatar} ${'source'} | ${'Source'} | ${memberMock} | ${MemberSource} - ${'granted'} | ${'Access granted'} | ${memberMock} | ${null} - ${'invited'} | ${'Invited'} | ${invite} | ${null} - ${'requested'} | ${'Requested'} | ${accessRequest} | ${null} - ${'expires'} | ${'Access expires'} | ${memberMock} | ${null} + ${'granted'} | ${'Access granted'} | ${memberMock} | ${CreatedAt} + ${'invited'} | ${'Invited'} | ${invite} | ${CreatedAt} + ${'requested'} | ${'Requested'} | ${accessRequest} | ${CreatedAt} + ${'expires'} | ${'Access expires'} | ${memberMock} | ${ExpiresAt} ${'maxRole'} | ${'Max role'} | ${memberMock} | ${null} ${'expiration'} | ${'Expiration'} | ${memberMock} | ${null} `('renders the $label field', ({ field, label, member, expectedComponent }) => { diff --git a/spec/frontend/whats_new/components/app_spec.js b/spec/frontend/whats_new/components/app_spec.js index 586bdf8f454..157faa90efa 100644 --- a/spec/frontend/whats_new/components/app_spec.js +++ b/spec/frontend/whats_new/components/app_spec.js @@ -1,6 +1,7 @@ import { createLocalVue, mount } from '@vue/test-utils'; import Vuex from 'vuex'; import { GlDrawer } from '@gitlab/ui'; +import { mockTracking, unmockTracking, triggerEvent } from 'helpers/tracking_helper'; import App from '~/whats_new/components/app.vue'; const localVue = createLocalVue(); @@ -12,6 +13,7 @@ describe('App', () => { let actions; let state; let propsData = { features: '[ {"title":"Whats New Drawer"} ]', storageKey: 'storage-key' }; + let trackingSpy; const buildWrapper = () => { actions = { @@ -36,11 +38,16 @@ describe('App', () => { }; beforeEach(() => { + document.body.dataset.page = 'test-page'; + document.body.dataset.namespaceId = 'namespace-840'; + + trackingSpy = mockTracking('_category_', null, jest.spyOn); buildWrapper(); }); afterEach(() => { wrapper.destroy(); + unmockTracking(); }); const getDrawer = () => wrapper.find(GlDrawer); @@ -50,8 +57,11 @@ describe('App', () => { }); it('dispatches openDrawer when mounted', () => { - expect(actions.openDrawer).toHaveBeenCalled(); expect(actions.openDrawer).toHaveBeenCalledWith(expect.any(Object), 'storage-key'); + expect(trackingSpy).toHaveBeenCalledWith(undefined, 'click_whats_new_drawer', { + label: 'namespace_id', + value: 'namespace-840', + }); }); it('dispatches closeDrawer when clicking close', () => { @@ -77,4 +87,25 @@ describe('App', () => { expect(getDrawer().exists()).toBe(true); }); + + it('send an event when feature item is clicked', () => { + propsData = { + features: '[ {"title":"Whats New Drawer", "url": "www.url.com"} ]', + storageKey: 'storage-key', + }; + buildWrapper(); + trackingSpy = mockTracking('_category_', wrapper.element, jest.spyOn); + + const link = wrapper.find('[data-testid="whats-new-title-link"]'); + triggerEvent(link.element); + + expect(trackingSpy.mock.calls[2]).toMatchObject([ + '_category_', + 'click_whats_new_item', + { + label: 'Whats New Drawer', + property: 'www.url.com', + }, + ]); + }); }); diff --git a/spec/lib/gitlab/usage_data_spec.rb b/spec/lib/gitlab/usage_data_spec.rb index f22809bb9a8..36cdd1558b8 100644 --- a/spec/lib/gitlab/usage_data_spec.rb +++ b/spec/lib/gitlab/usage_data_spec.rb @@ -497,6 +497,7 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do expect(count_data[:personal_snippets]).to eq(2) expect(count_data[:project_snippets]).to eq(4) + expect(count_data[:projects_creating_incidents]).to eq(2) expect(count_data[:projects_with_packages]).to eq(2) expect(count_data[:packages]).to eq(4) expect(count_data[:user_preferences_user_gitpod_enabled]).to eq(1) diff --git a/spec/services/quick_actions/interpret_service_spec.rb b/spec/services/quick_actions/interpret_service_spec.rb index a9453706288..8f0c60d5d65 100644 --- a/spec/services/quick_actions/interpret_service_spec.rb +++ b/spec/services/quick_actions/interpret_service_spec.rb @@ -834,19 +834,6 @@ RSpec.describe QuickActions::InterpretService do let(:issuable) { issue } end - context 'assigning to a group' do - let_it_be(:group) { create(:group, :public) } - - before_all do - group.add_developer(create(:user)) - end - - it_behaves_like 'empty command', "Failed to assign a user because no user was found." do - let(:content) { "/assign #{group.to_reference}" } - let(:issuable) { issue } - end - end - context 'unassign command' do let(:content) { '/unassign' } diff --git a/vendor/languages.yml b/vendor/languages.yml index a6edb0415b2..5e7a955b1bb 100755 --- a/vendor/languages.yml +++ b/vendor/languages.yml @@ -1,7 +1,8 @@ -# Extracted from https://github.com/github/linguist/blob/master/lib/linguist/languages.yml - # Defines all Languages known to GitHub. # +# fs_name - Optional field. Only necessary as a replacement for the sample directory name if the +# language name is not a valid filename under the Windows filesystem (e.g., if it +# contains an asterisk). # type - Either data, programming, markup, prose, or nil # aliases - An Array of additional aliases (implicitly # includes name.downcase) @@ -22,7 +23,7 @@ # language_id - Integer used as a language-name-independent indexed field so that we can rename # languages in Linguist without reindexing all the code on GitHub. Must not be # changed for existing languages without the explicit permission of GitHub staff. -# color - CSS hex color to represent the language. Only used if type is "programming" or "prose". +# color - CSS hex color to represent the language. Only used if type is "programming" or "markup". # tm_scope - The TextMate scope that represents this programming # language. This should match one of the scopes listed in # the grammars.yml file. Use "none" if there is no grammar @@ -45,11 +46,19 @@ tm_scope: source.bsl ace_mode: text language_id: 0 +4D: + type: programming + extensions: + - ".4dm" + tm_scope: source.4dm + ace_mode: text + language_id: 577529595 ABAP: type: programming color: "#E8274B" extensions: - ".abap" + tm_scope: source.abap ace_mode: abap language_id: 1 ABNF: @@ -72,6 +81,14 @@ AGS Script: codemirror_mode: clike codemirror_mime_type: text/x-c++src language_id: 2 +AL Code: + type: programming + color: "#3AA2B5" + extensions: + - ".al" + tm_scope: source.al + ace_mode: text + language_id: 658971832 AMPL: type: programming color: "#E6EFBB" @@ -86,6 +103,7 @@ ANTLR: color: "#9DC3FF" extensions: - ".g4" + tm_scope: source.antlr ace_mode: text language_id: 4 API Blueprint: @@ -111,6 +129,14 @@ APL: codemirror_mode: apl codemirror_mime_type: text/apl language_id: 6 +ASL: + type: programming + ace_mode: text + extensions: + - ".asl" + - ".dsl" + tm_scope: source.asl + language_id: 124996147 ASN.1: type: data extensions: @@ -121,15 +147,14 @@ ASN.1: codemirror_mode: asn.1 codemirror_mime_type: text/x-ttcn-asn language_id: 7 -ASP: +ASP.NET: type: programming - color: "#6a40fd" tm_scope: text.html.asp + color: "#9400ff" aliases: - aspx - aspx-vb extensions: - - ".asp" - ".asax" - ".ascx" - ".ashx" @@ -139,7 +164,7 @@ ASP: ace_mode: text codemirror_mode: htmlembedded codemirror_mime_type: application/x-aspx - language_id: 8 + language_id: 564186416 ATS: type: programming color: "#1ac620" @@ -174,6 +199,7 @@ Ada: aliases: - ada95 - ada2005 + tm_scope: source.ada ace_mode: ada language_id: 11 Adobe Font Metrics: @@ -193,6 +219,7 @@ Agda: color: "#315665" extensions: - ".agda" + tm_scope: source.agda ace_mode: text language_id: 12 Alloy: @@ -200,6 +227,7 @@ Alloy: color: "#64C800" extensions: - ".als" + tm_scope: source.alloy ace_mode: text language_id: 13 Alpine Abuild: @@ -215,6 +243,18 @@ Alpine Abuild: codemirror_mode: shell codemirror_mime_type: text/x-sh language_id: 14 +Altium Designer: + type: data + aliases: + - altium + extensions: + - ".OutJob" + - ".PcbDoc" + - ".PrjPCB" + - ".SchDoc" + tm_scope: source.ini + ace_mode: ini + language_id: 187772328 AngelScript: type: programming color: "#C7D7DC" @@ -253,6 +293,7 @@ ApacheConf: language_id: 16 Apex: type: programming + color: "#1797c0" extensions: - ".cls" tm_scope: source.java @@ -277,6 +318,7 @@ AppleScript: - ".scpt" interpreters: - osascript + tm_scope: source.applescript ace_mode: applescript color: "#101F1F" language_id: 19 @@ -315,11 +357,24 @@ Assembly: extensions: - ".asm" - ".a51" + - ".i" - ".inc" - ".nasm" tm_scope: source.assembly ace_mode: assembly_x86 language_id: 24 +Asymptote: + type: programming + color: "#ff0000" + extensions: + - ".asy" + interpreters: + - asy + tm_scope: source.c++ + ace_mode: c_cpp + codemirror_mode: clike + codemirror_mime_type: text/x-kotlin + language_id: 591605007 Augeas: type: programming extensions: @@ -350,6 +405,13 @@ AutoIt: tm_scope: source.autoit ace_mode: autohotkey language_id: 27 +Avro IDL: + type: data + extensions: + - ".avdl" + tm_scope: source.avro + ace_mode: text + language_id: 785497837 Awk: type: programming extensions: @@ -363,6 +425,7 @@ Awk: - gawk - mawk - nawk + tm_scope: source.awk ace_mode: text language_id: 28 Ballerina: @@ -391,12 +454,24 @@ Befunge: type: programming extensions: - ".befunge" + tm_scope: source.befunge ace_mode: text language_id: 30 +BibTeX: + type: markup + group: TeX + extensions: + - ".bib" + - ".bibtex" + tm_scope: text.bibtex + ace_mode: tex + codemirror_mode: stex + codemirror_mime_type: text/x-stex + language_id: 982188347 Bison: type: programming group: Yacc - tm_scope: source.bison + tm_scope: source.yacc extensions: - ".bison" ace_mode: text @@ -410,7 +485,7 @@ BitBake: language_id: 32 Blade: type: markup - group: HTML + color: "#f7523f" extensions: - ".blade" - ".blade.php" @@ -437,6 +512,7 @@ BlitzMax: - ".bmx" aliases: - bmax + tm_scope: source.blitzmax ace_mode: text language_id: 35 Bluespec: @@ -472,12 +548,6 @@ Brightscript: tm_scope: source.brightscript ace_mode: text language_id: 39 -Bro: - type: programming - extensions: - - ".bro" - ace_mode: text - language_id: 40 C: type: programming color: "#555555" @@ -488,6 +558,7 @@ C: - ".idc" interpreters: - tcc + tm_scope: source.c ace_mode: c_cpp codemirror_mode: clike codemirror_mime_type: text/x-csrc @@ -504,11 +575,12 @@ C#: extensions: - ".cs" - ".cake" - - ".cshtml" - ".csx" + - ".linq" language_id: 42 C++: type: programming + tm_scope: source.c++ ace_mode: c_cpp codemirror_mode: clike codemirror_mime_type: text/x-c++src @@ -567,6 +639,7 @@ CMake: - ".cmake.in" filenames: - CMakeLists.txt + tm_scope: source.cmake ace_mode: text codemirror_mode: cmake codemirror_mime_type: text/x-cmake @@ -579,6 +652,7 @@ COBOL: - ".ccp" - ".cobol" - ".cpy" + tm_scope: source.cobol ace_mode: cobol codemirror_mode: cobol codemirror_mime_type: text/x-cobol @@ -594,12 +668,11 @@ COLLADA: language_id: 49 CSON: type: data - group: CoffeeScript + color: "#244776" tm_scope: source.coffee ace_mode: coffee codemirror_mode: coffeescript codemirror_mime_type: text/x-coffeescript - searchable: false extensions: - ".cson" language_id: 424 @@ -627,6 +700,20 @@ CWeb: tm_scope: none ace_mode: text language_id: 657332628 +Cabal Config: + type: data + aliases: + - Cabal + extensions: + - ".cabal" + filenames: + - cabal.config + - cabal.project + ace_mode: haskell + codemirror_mode: haskell + codemirror_mime_type: text/x-haskell + tm_scope: source.cabal + language_id: 677095381 Cap'n Proto: type: programming tm_scope: source.capnp @@ -658,6 +745,7 @@ Chapel: - chpl extensions: - ".chpl" + tm_scope: source.chapel ace_mode: text language_id: 55 Charity: @@ -679,6 +767,7 @@ ChucK: Cirru: type: programming color: "#ccccff" + tm_scope: source.cirru ace_mode: cirru extensions: - ".cirru" @@ -691,6 +780,16 @@ Clarion: - ".clw" tm_scope: source.clarion language_id: 59 +Classic ASP: + type: programming + color: "#6a40fd" + tm_scope: text.html.asp + aliases: + - asp + extensions: + - ".asp" + ace_mode: text + language_id: 8 Clean: type: programming color: "#3F85AF" @@ -710,6 +809,7 @@ Click: language_id: 61 Clojure: type: programming + tm_scope: source.clojure ace_mode: clojure codemirror_mode: clojure codemirror_mime_type: text/x-clojure @@ -759,6 +859,16 @@ CoNLL-U: - CoNLL - CoNLL-X language_id: 421026389 +CodeQL: + type: programming + extensions: + - ".ql" + - ".qll" + tm_scope: source.ql + ace_mode: text + language_id: 424259634 + aliases: + - ql CoffeeScript: type: programming tm_scope: source.coffee @@ -868,6 +978,7 @@ Coq: extensions: - ".coq" - ".v" + tm_scope: source.coq ace_mode: text language_id: 69 Cpp-ObjDump: @@ -893,7 +1004,7 @@ Creole: language_id: 71 Crystal: type: programming - color: "#776791" + color: "#000100" extensions: - ".cr" ace_mode: ruby @@ -960,6 +1071,7 @@ Cython: - ".pxi" aliases: - pyrex + tm_scope: source.cython ace_mode: text codemirror_mode: python codemirror_mime_type: text/x-cython @@ -970,6 +1082,7 @@ D: extensions: - ".d" - ".di" + tm_scope: source.d ace_mode: d codemirror_mode: d codemirror_mime_type: text/x-d @@ -1021,6 +1134,16 @@ DTrace: codemirror_mode: clike codemirror_mime_type: text/x-csrc language_id: 85 +Dafny: + type: programming + color: "#FFEC25" + extensions: + - ".dfy" + interpreters: + - dafny + tm_scope: text.dfy.dafny + ace_mode: text + language_id: 969323346 Darcs Patch: type: data aliases: @@ -1038,6 +1161,7 @@ Dart: - ".dart" interpreters: - dart + tm_scope: source.dart ace_mode: dart codemirror_mode: dart codemirror_mime_type: application/dart @@ -1050,6 +1174,16 @@ DataWeave: ace_mode: text tm_scope: source.data-weave language_id: 974514097 +Dhall: + type: programming + color: "#dfafff" + extensions: + - ".dhall" + tm_scope: source.haskell + ace_mode: haskell + codemirror_mode: haskell + codemirror_mime_type: text/x-haskell + language_id: 793969321 Diff: type: data extensions: @@ -1062,9 +1196,16 @@ Diff: codemirror_mode: diff codemirror_mime_type: text/x-diff language_id: 88 +DirectX 3D File: + type: data + extensions: + - ".x" + ace_mode: text + tm_scope: none + language_id: 201049282 Dockerfile: type: programming - color: "#0db7ed" + color: "#384d54" tm_scope: source.dockerfile extensions: - ".dockerfile" @@ -1090,6 +1231,7 @@ Dylan: - ".dyl" - ".intr" - ".lid" + tm_scope: source.dylan ace_mode: text codemirror_mode: dylan codemirror_mime_type: text/x-dylan @@ -1137,9 +1279,19 @@ EJS: group: HTML extensions: - ".ejs" + - ".ect" + - ".jst" tm_scope: text.html.js ace_mode: ejs language_id: 95 +EML: + type: data + extensions: + - ".eml" + - ".mbox" + tm_scope: text.eml.basic + ace_mode: text + language_id: 529653389 EQ: type: programming color: "#a78649" @@ -1180,20 +1332,33 @@ Ecere Projects: codemirror_mode: javascript codemirror_mime_type: application/json language_id: 98 +EditorConfig: + type: data + group: INI + filenames: + - ".editorconfig" + aliases: + - editor-config + ace_mode: ini + codemirror_mode: properties + codemirror_mime_type: text/x-properties + tm_scope: source.editorconfig + language_id: 96139566 Edje Data Collection: type: data extensions: - ".edc" - tm_scope: source.json - ace_mode: json - codemirror_mode: javascript - codemirror_mime_type: application/json + tm_scope: source.c++ + ace_mode: c_cpp + codemirror_mode: clike + codemirror_mime_type: text/x-c++src language_id: 342840478 Eiffel: type: programming - color: "#946d57" + color: "#4d6977" extensions: - ".e" + tm_scope: source.eiffel ace_mode: eiffel codemirror_mode: eiffel codemirror_mime_type: text/x-eiffel @@ -1204,6 +1369,7 @@ Elixir: extensions: - ".ex" - ".exs" + tm_scope: source.elixir ace_mode: elixir filenames: - mix.lock @@ -1273,6 +1439,7 @@ Erlang: - rebar.config - rebar.config.lock - rebar.lock + tm_scope: source.erlang ace_mode: erlang codemirror_mode: erlang codemirror_mime_type: text/x-erlang @@ -1293,6 +1460,26 @@ F#: codemirror_mode: mllike codemirror_mime_type: text/x-fsharp language_id: 105 +F*: + fs_name: Fstar + type: programming + color: "#572e30" + aliases: + - fstar + extensions: + - ".fst" + tm_scope: source.fstar + ace_mode: text + language_id: 336943375 +FIGlet Font: + type: data + aliases: + - FIGfont + extensions: + - ".flf" + tm_scope: source.figfont + ace_mode: text + language_id: 686129783 FLUX: type: programming color: "#88ccff" @@ -1310,6 +1497,7 @@ Factor: filenames: - ".factor-boot-rc" - ".factor-rc" + tm_scope: source.factor ace_mode: text codemirror_mode: factor codemirror_mime_type: text/x-factor @@ -1322,6 +1510,7 @@ Fancy: - ".fancypack" filenames: - Fakefile + tm_scope: source.fancy ace_mode: text language_id: 109 Fantom: @@ -1332,6 +1521,14 @@ Fantom: tm_scope: source.fan ace_mode: text language_id: 110 +Faust: + type: programming + color: "#c37240" + extensions: + - ".dsp" + tm_scope: source.faust + ace_mode: text + language_id: 622529198 Filebench WML: type: programming extensions: @@ -1367,27 +1564,38 @@ Forth: - ".fr" - ".frt" - ".fs" + tm_scope: source.forth ace_mode: forth codemirror_mode: forth codemirror_mime_type: text/x-forth language_id: 114 Fortran: + group: Fortran type: programming color: "#4d41b1" extensions: - - ".f90" - ".f" - - ".f03" - - ".f08" - ".f77" - - ".f95" - ".for" - ".fpp" - tm_scope: source.fortran.modern + tm_scope: source.fortran ace_mode: text codemirror_mode: fortran codemirror_mime_type: text/x-fortran language_id: 107 +Fortran Free Form: + group: Fortran + type: programming + extensions: + - ".f90" + - ".f03" + - ".f08" + - ".f95" + tm_scope: source.fortran.modern + ace_mode: text + codemirror_mode: fortran + codemirror_mime_type: text/x-fortran + language_id: 761352333 FreeMarker: type: programming color: "#0050b2" @@ -1406,15 +1614,33 @@ Frege: tm_scope: source.haskell ace_mode: haskell language_id: 116 +Futhark: + type: programming + color: "#5f021f" + extensions: + - ".fut" + tm_scope: source.futhark + ace_mode: text + language_id: 97358117 G-code: - type: data + type: programming + color: "#D08CF2" extensions: - ".g" + - ".cnc" - ".gco" - ".gcode" tm_scope: source.gcode ace_mode: gcode language_id: 117 +GAML: + type: programming + color: "#FFC766" + extensions: + - ".gaml" + tm_scope: none + ace_mode: text + language_id: 290345951 GAMS: type: programming extensions: @@ -1458,6 +1684,13 @@ GDScript: tm_scope: source.gdscript ace_mode: text language_id: 123 +GEDCOM: + type: data + ace_mode: text + extensions: + - ".ged" + tm_scope: source.gedcom + language_id: 459577965 GLSL: type: programming extensions: @@ -1470,7 +1703,9 @@ GLSL: - ".fshader" - ".geo" - ".geom" + - ".glslf" - ".glslv" + - ".gs" - ".gshader" - ".shader" - ".tesc" @@ -1479,6 +1714,7 @@ GLSL: - ".vrx" - ".vsh" - ".vshader" + tm_scope: source.glsl ace_mode: glsl language_id: 124 GN: @@ -1497,7 +1733,7 @@ GN: language_id: 302957008 Game Maker Language: type: programming - color: "#8fb200" + color: "#71b417" extensions: - ".gml" tm_scope: source.c++ @@ -1556,12 +1792,14 @@ Gerber Image: - ".gbp" - ".gbs" - ".gko" + - ".gml" - ".gpb" - ".gpt" - ".gtl" - ".gto" - ".gtp" - ".gts" + - ".sol" interpreters: - gerbv - gerbview @@ -1583,12 +1821,41 @@ Gherkin: type: programming extensions: - ".feature" + - ".story" tm_scope: text.gherkin.feature aliases: - cucumber ace_mode: text color: "#5B2063" language_id: 76 +Git Attributes: + type: data + group: INI + aliases: + - gitattributes + filenames: + - ".gitattributes" + tm_scope: source.gitattributes + ace_mode: gitignore + codemirror_mode: shell + codemirror_mime_type: text/x-sh + language_id: 956324166 +Git Config: + type: data + group: INI + aliases: + - gitconfig + - gitmodules + extensions: + - ".gitconfig" + filenames: + - ".gitconfig" + - ".gitmodules" + ace_mode: ini + codemirror_mode: properties + codemirror_mime_type: text/x-properties + tm_scope: source.gitconfig + language_id: 807968997 Glyph: type: programming color: "#c1ac7f" @@ -1599,6 +1866,13 @@ Glyph: codemirror_mode: tcl codemirror_mime_type: text/x-tcl language_id: 130 +Glyph Bitmap Distribution Format: + type: data + extensions: + - ".bdf" + tm_scope: source.bdf + ace_mode: text + language_id: 997665271 Gnuplot: type: programming color: "#f0a9f0" @@ -1606,19 +1880,22 @@ Gnuplot: - ".gp" - ".gnu" - ".gnuplot" + - ".p" - ".plot" - ".plt" interpreters: - gnuplot + tm_scope: source.gnuplot ace_mode: text language_id: 131 Go: type: programming - color: "#375eab" + color: "#00ADD8" aliases: - golang extensions: - ".go" + tm_scope: source.go ace_mode: golang codemirror_mode: go codemirror_mime_type: text/x-go @@ -1660,12 +1937,10 @@ Grammatical Framework: type: programming aliases: - gf - wrap: false extensions: - ".gf" - searchable: true - color: "#79aa7a" - tm_scope: source.haskell + color: "#ff0000" + tm_scope: source.gf ace_mode: haskell codemirror_mode: haskell codemirror_mime_type: text/x-haskell @@ -1682,6 +1957,7 @@ GraphQL: extensions: - ".graphql" - ".gql" + - ".graphqls" tm_scope: source.graphql ace_mode: text language_id: 139 @@ -1695,6 +1971,7 @@ Graphviz (DOT): language_id: 140 Groovy: type: programming + tm_scope: source.groovy ace_mode: groovy codemirror_mode: groovy codemirror_mime_type: text/x-groovy @@ -1722,12 +1999,25 @@ Groovy Server Pages: codemirror_mode: htmlembedded codemirror_mime_type: application/x-jsp language_id: 143 +HAProxy: + type: data + extensions: + - ".cfg" + filenames: + - haproxy.cfg + tm_scope: source.haproxy-config + ace_mode: text + language_id: 366607477 HCL: type: programming extensions: - ".hcl" + - ".nomad" - ".tf" - ".tfvars" + - ".workflow" + aliases: + - terraform ace_mode: ruby codemirror_mode: ruby codemirror_mime_type: text/x-ruby @@ -1768,8 +2058,8 @@ HTML+Django: group: HTML extensions: - ".jinja" + - ".j2" - ".jinja2" - - ".mustache" - ".njk" aliases: - django @@ -1812,9 +2102,12 @@ HTML+ERB: group: HTML aliases: - erb + - rhtml + - html+ruby extensions: - ".erb" - ".erb.deface" + - ".rhtml" ace_mode: text codemirror_mode: htmlembedded codemirror_mime_type: application/x-erb @@ -1829,6 +2122,19 @@ HTML+PHP: codemirror_mode: php codemirror_mime_type: application/x-httpd-php language_id: 151 +HTML+Razor: + type: markup + tm_scope: text.html.cshtml + group: HTML + aliases: + - razor + extensions: + - ".cshtml" + - ".razor" + ace_mode: razor + codemirror_mode: htmlmixed + codemirror_mime_type: text/html + language_id: 479039817 HTTP: type: data extensions: @@ -1851,24 +2157,27 @@ Hack: codemirror_mode: php codemirror_mime_type: application/x-httpd-php extensions: + - ".hack" - ".hh" + - ".hhi" - ".php" - tm_scope: text.html.php + tm_scope: source.hack color: "#878787" language_id: 153 Haml: - group: HTML type: markup + color: "#ece2a9" extensions: - ".haml" - ".haml.deface" + tm_scope: text.haml ace_mode: haml codemirror_mode: haml codemirror_mime_type: text/x-haml language_id: 154 Handlebars: type: markup - group: HTML + color: "#f7931e" aliases: - hbs - htmlbars @@ -1891,9 +2200,11 @@ Haskell: color: "#5e5086" extensions: - ".hs" + - ".hs-boot" - ".hsc" interpreters: - runhaskell + tm_scope: source.haskell ace_mode: haskell codemirror_mode: haskell codemirror_mime_type: text/x-haskell @@ -1913,10 +2224,21 @@ HiveQL: type: programming extensions: - ".q" + - ".hql" color: "#dce200" tm_scope: source.hql ace_mode: sql language_id: 931814087 +HolyC: + type: programming + color: "#ffefaf" + extensions: + - ".hc" + tm_scope: source.hc + ace_mode: c_cpp + codemirror_mode: clike + codemirror_mime_type: text/x-csrc + language_id: 928121743 Hy: type: programming ace_mode: text @@ -1924,10 +2246,10 @@ Hy: extensions: - ".hy" interpreters: - - "hy" + - hy aliases: - hylang - tm_scope: none + tm_scope: source.hy language_id: 159 HyPhy: type: programming @@ -1942,18 +2264,20 @@ IDL: extensions: - ".pro" - ".dlm" + tm_scope: source.idl ace_mode: text codemirror_mode: idl codemirror_mime_type: text/x-idl language_id: 161 IGOR Pro: type: programming + color: "#0000cc" extensions: - ".ipf" aliases: - igor - igorpro - tm_scope: none + tm_scope: source.igor ace_mode: text language_id: 162 INI: @@ -1961,12 +2285,12 @@ INI: extensions: - ".ini" - ".cfg" + - ".dof" + - ".lektorproject" - ".prefs" - ".pro" - ".properties" filenames: - - ".editorconfig" - - ".gitconfig" - buildozer.spec tm_scope: source.ini aliases: @@ -1997,6 +2321,36 @@ Idris: ace_mode: text tm_scope: source.idris language_id: 165 +Ignore List: + type: data + group: INI + aliases: + - ignore + - gitignore + - git-ignore + extensions: + - ".gitignore" + filenames: + - ".atomignore" + - ".babelignore" + - ".bzrignore" + - ".coffeelintignore" + - ".cvsignore" + - ".dockerignore" + - ".eslintignore" + - ".gitignore" + - ".nodemonignore" + - ".npmignore" + - ".prettierignore" + - ".stylelintignore" + - ".vscodeignore" + - gitignore-global + - gitignore_global + ace_mode: gitignore + tm_scope: source.gitignore + codemirror_mode: shell + codemirror_mime_type: text/x-sh + language_id: 74444240 Inform 7: type: programming wrap: true @@ -2013,7 +2367,8 @@ Inno Setup: type: programming extensions: - ".iss" - tm_scope: none + - ".isl" + tm_scope: source.inno ace_mode: text language_id: 167 Io: @@ -2023,6 +2378,7 @@ Io: - ".io" interpreters: - io + tm_scope: source.io ace_mode: io language_id: 168 Ioke: @@ -2032,6 +2388,7 @@ Ioke: - ".ik" interpreters: - ioke + tm_scope: source.ioke ace_mode: text language_id: 169 Isabelle: @@ -2072,7 +2429,6 @@ JFlex: JSON: type: data tm_scope: source.json - group: JavaScript ace_mode: json codemirror_mode: javascript codemirror_mime_type: application/json @@ -2082,18 +2438,24 @@ JSON: - ".avsc" - ".geojson" - ".gltf" + - ".har" + - ".ice" - ".JSON-tmLanguage" - ".jsonl" + - ".mcmeta" - ".tfstate" - ".tfstate.backup" - ".topojson" - ".webapp" - ".webmanifest" + - ".yy" + - ".yyp" filenames: - ".arcconfig" - ".htmlhintrc" - ".tern-config" - ".tern-project" + - ".watchmanconfig" - composer.lock - mcmod.info language_id: 174 @@ -2107,6 +2469,7 @@ JSON with Comments: aliases: - jsonc extensions: + - ".jsonc" - ".sublime-build" - ".sublime-commands" - ".sublime-completions" @@ -2126,7 +2489,10 @@ JSON with Comments: - ".jscsrc" - ".jshintrc" - ".jslintrc" + - jsconfig.json + - language-configuration.json - tsconfig.json + - tslint.json language_id: 423 JSON5: type: data @@ -2139,11 +2505,12 @@ JSON5: language_id: 175 JSONLD: type: data - group: JavaScript - ace_mode: javascript extensions: - ".jsonld" tm_scope: source.js + ace_mode: javascript + codemirror_mode: javascript + codemirror_mime_type: application/json language_id: 176 JSONiq: color: "#40d47e" @@ -2174,6 +2541,7 @@ Jasmin: language_id: 180 Java: type: programming + tm_scope: source.java ace_mode: java codemirror_mode: clike codemirror_mime_type: text/x-java @@ -2181,6 +2549,15 @@ Java: extensions: - ".java" language_id: 181 +Java Properties: + type: data + extensions: + - ".properties" + tm_scope: source.java-properties + ace_mode: properties + codemirror_mode: properties + codemirror_mime_type: text/x-properties + language_id: 519377561 Java Server Pages: type: programming group: Java @@ -2207,6 +2584,7 @@ JavaScript: - ".js" - "._js" - ".bones" + - ".cjs" - ".es" - ".es6" - ".frag" @@ -2227,8 +2605,27 @@ JavaScript: filenames: - Jakefile interpreters: + - chakra + - d8 + - gjs + - js - node + - nodejs + - qjs + - rhino + - v8 + - v8-shell language_id: 183 +JavaScript+ERB: + type: programming + tm_scope: source.js + group: JavaScript + extensions: + - ".js.erb" + ace_mode: javascript + codemirror_mode: javascript + codemirror_mime_type: application/javascript + language_id: 914318960 Jison: type: programming group: Yacc @@ -2256,6 +2653,15 @@ Jolie: ace_mode: text tm_scope: source.jolie language_id: 998078858 +Jsonnet: + color: "#0064bd" + type: programming + ace_mode: text + extensions: + - ".jsonnet" + - ".libsonnet" + tm_scope: source.jsonnet + language_id: 664885656 Julia: type: programming extensions: @@ -2263,6 +2669,7 @@ Julia: interpreters: - julia color: "#a270ba" + tm_scope: source.julia ace_mode: julia codemirror_mode: julia codemirror_mime_type: text/x-julia @@ -2289,6 +2696,18 @@ KRL: tm_scope: none ace_mode: text language_id: 186 +Kaitai Struct: + type: programming + aliases: + - ksy + ace_mode: yaml + codemirror_mode: yaml + codemirror_mime_type: text/x-yaml + color: "#773b37" + extensions: + - ".ksy" + tm_scope: source.yaml + language_id: 818804755 KiCad Layout: type: data aliases: @@ -2355,6 +2774,7 @@ LLVM: type: programming extensions: - ".ll" + tm_scope: source.llvm ace_mode: text color: "#185619" language_id: 191 @@ -2368,6 +2788,7 @@ LOLCODE: language_id: 192 LSL: type: programming + tm_scope: source.lsl ace_mode: lsl extensions: - ".lsl" @@ -2376,6 +2797,15 @@ LSL: - lsl color: "#3d9970" language_id: 193 +LTspice Symbol: + type: data + extensions: + - ".asy" + tm_scope: source.ltspice.symbol + ace_mode: text + codemirror_mode: spreadsheet + codemirror_mime_type: text/x-spreadsheet + language_id: 1013566805 LabVIEW: type: programming extensions: @@ -2393,7 +2823,6 @@ Lasso: - ".las" - ".lasso8" - ".lasso9" - - ".ldml" tm_scope: file.lasso aliases: - lassoscript @@ -2401,7 +2830,7 @@ Lasso: language_id: 195 Latte: type: markup - group: HTML + color: "#f2a542" extensions: - ".latte" tm_scope: text.html.smarty @@ -2414,11 +2843,12 @@ Lean: extensions: - ".lean" - ".hlean" + tm_scope: source.lean ace_mode: text language_id: 197 Less: type: markup - group: CSS + color: "#1d365d" extensions: - ".less" tm_scope: source.css.less @@ -2434,7 +2864,10 @@ Lex: extensions: - ".l" - ".lex" - tm_scope: none + filenames: + - Lexer.x + - lexer.x + tm_scope: source.lex ace_mode: text language_id: 199 LilyPond: @@ -2442,6 +2875,7 @@ LilyPond: extensions: - ".ly" - ".ily" + tm_scope: source.lilypond ace_mode: text language_id: 200 Limbo: @@ -2495,6 +2929,7 @@ Literate CoffeeScript: - litcoffee extensions: - ".litcoffee" + - ".coffee.md" language_id: 206 Literate Haskell: type: programming @@ -2520,6 +2955,7 @@ LiveScript: - "._ls" filenames: - Slakefile + tm_scope: source.livescript ace_mode: livescript codemirror_mode: livescript codemirror_mime_type: text/x-livescript @@ -2538,6 +2974,7 @@ Logtalk: extensions: - ".lgt" - ".logtalk" + tm_scope: source.logtalk ace_mode: text language_id: 210 LookML: @@ -2561,6 +2998,7 @@ LoomScript: language_id: 212 Lua: type: programming + tm_scope: source.lua ace_mode: lua codemirror_mode: lua codemirror_mime_type: text/x-lua @@ -2572,7 +3010,10 @@ Lua: - ".p8" - ".pd_lua" - ".rbxs" + - ".rockspec" - ".wlua" + filenames: + - ".luacheckrc" interpreters: - lua language_id: 213 @@ -2592,7 +3033,7 @@ M4: type: programming extensions: - ".m4" - tm_scope: none + tm_scope: source.m4 ace_mode: text language_id: 215 M4Sugar: @@ -2604,9 +3045,22 @@ M4Sugar: - ".m4" filenames: - configure.ac - tm_scope: none + tm_scope: source.m4 ace_mode: text language_id: 216 +MATLAB: + type: programming + color: "#e16737" + aliases: + - octave + extensions: + - ".matlab" + - ".m" + tm_scope: source.matlab + ace_mode: matlab + codemirror_mode: octave + codemirror_mime_type: text/x-octave + language_id: 225 MAXScript: type: programming color: "#00a6a6" @@ -2616,6 +3070,14 @@ MAXScript: tm_scope: source.maxscript ace_mode: text language_id: 217 +MLIR: + type: programming + color: "#5EC8DB" + extensions: + - ".mlir" + tm_scope: source.mlir + ace_mode: text + language_id: 448253929 MQL4: type: programming color: "#62A8D6" @@ -2655,6 +3117,18 @@ MUF: codemirror_mode: forth codemirror_mime_type: text/x-forth language_id: 219 +Macaulay2: + type: programming + extensions: + - ".m2" + aliases: + - m2 + interpreters: + - M2 + ace_mode: text + tm_scope: source.m2 + color: "#d8ffff" + language_id: 34167825 Makefile: type: programming color: "#427819" @@ -2684,6 +3158,7 @@ Makefile: - mkfile interpreters: - make + tm_scope: source.makefile ace_mode: makefile codemirror_mode: cmake codemirror_mime_type: text/x-cmake @@ -2698,6 +3173,7 @@ Mako: language_id: 221 Markdown: type: prose + color: "#083fa1" aliases: - pandoc ace_mode: markdown @@ -2709,16 +3185,19 @@ Markdown: - ".markdown" - ".mdown" - ".mdwn" + - ".mdx" - ".mkd" - ".mkdn" - ".mkdown" - ".ronn" - ".workbook" + filenames: + - contents.lr tm_scope: source.gfm language_id: 222 Marko: - group: HTML type: markup + color: "#42bff2" tm_scope: text.marko extensions: - ".marko" @@ -2750,22 +3229,11 @@ Mathematica: - ".wlt" aliases: - mma + tm_scope: source.mathematica ace_mode: text codemirror_mode: mathematica codemirror_mime_type: text/x-mathematica language_id: 224 -Matlab: - type: programming - color: "#e16737" - aliases: - - octave - extensions: - - ".matlab" - - ".m" - ace_mode: matlab - codemirror_mode: octave - codemirror_mime_type: text/x-octave - language_id: 225 Maven POM: type: data tm_scope: text.xml.pom @@ -2831,6 +3299,13 @@ Metal: codemirror_mode: clike codemirror_mime_type: text/x-c++src language_id: 230 +Microsoft Developer Studio Project: + type: data + extensions: + - ".dsp" + tm_scope: none + ace_mode: text + language_id: 800983837 MiniD: type: programming searchable: false @@ -2910,8 +3385,44 @@ MoonScript: - ".moon" interpreters: - moon + tm_scope: source.moonscript ace_mode: text language_id: 238 +Motorola 68K Assembly: + type: programming + group: Assembly + aliases: + - m68k + extensions: + - ".asm" + - ".i" + - ".inc" + - ".s" + - ".x68" + tm_scope: source.m68k + ace_mode: assembly_x86 + language_id: 477582706 +Muse: + type: prose + extensions: + - ".muse" + tm_scope: text.muse + ace_mode: text + wrap: true + language_id: 474864066 + aliases: + - amusewiki + - emacs muse +Mustache: + type: markup + group: HTML + extensions: + - ".mustache" + tm_scope: text.html.smarty + ace_mode: smarty + codemirror_mode: smarty + codemirror_mime_type: text/x-smarty + language_id: 638334590 Myghty: type: programming extensions: @@ -2919,6 +3430,14 @@ Myghty: tm_scope: none ace_mode: text language_id: 239 +NASL: + type: programming + extensions: + - ".nasl" + - ".inc" + tm_scope: source.nasl + ace_mode: text + language_id: 171666519 NCL: type: programming color: "#28431f" @@ -2927,6 +3446,16 @@ NCL: tm_scope: source.ncl ace_mode: text language_id: 240 +NEON: + type: data + extensions: + - ".neon" + tm_scope: source.neon + ace_mode: text + aliases: + - nette object notation + - ne-on + language_id: 481192983 NL: type: data extensions: @@ -2934,11 +3463,22 @@ NL: tm_scope: none ace_mode: text language_id: 241 +NPM Config: + type: data + group: INI + aliases: + - npmrc + filenames: + - ".npmrc" + tm_scope: source.ini.npmrc + ace_mode: text + language_id: 685022663 NSIS: type: programming extensions: - ".nsi" - ".nsh" + tm_scope: source.nsis ace_mode: text codemirror_mode: nsis codemirror_mime_type: text/x-nsis @@ -2957,6 +3497,7 @@ Nemerle: color: "#3d3c6e" extensions: - ".n" + tm_scope: source.nemerle ace_mode: text language_id: 243 NetLinx: @@ -3016,6 +3557,7 @@ Nextflow: Nginx: type: data extensions: + - ".nginx" - ".nginxconf" - ".vhost" filenames: @@ -3029,10 +3571,15 @@ Nginx: language_id: 248 Nim: type: programming - color: "#37775b" + color: "#ffc200" extensions: - ".nim" + - ".nim.cfg" + - ".nimble" - ".nimrod" + - ".nims" + filenames: + - nim.cfg ace_mode: text tm_scope: source.nim language_id: 249 @@ -3116,6 +3663,21 @@ ObjDump: tm_scope: objdump.x86asm ace_mode: assembly_x86 language_id: 256 +Object Data Instance Notation: + type: data + extensions: + - ".odin" + tm_scope: source.odin-ehr + ace_mode: text + language_id: 985227236 +ObjectScript: + type: programming + extensions: + - ".cls" + language_id: 202735509 + tm_scope: source.objectscript + color: "#424893" + ace_mode: text Objective-C: type: programming tm_scope: source.objc @@ -3158,6 +3720,17 @@ Objective-J: tm_scope: source.js.objj ace_mode: text language_id: 259 +Odin: + type: programming + color: "#60AFFE" + aliases: + - odinlang + - odin-lang + extensions: + - ".odin" + tm_scope: source.odin + ace_mode: text + language_id: 889244082 Omgrofl: type: programming extensions: @@ -3170,6 +3743,7 @@ Opa: type: programming extensions: - ".opa" + tm_scope: source.opa ace_mode: text language_id: 261 Opal: @@ -3180,6 +3754,13 @@ Opal: tm_scope: source.opal ace_mode: text language_id: 262 +Open Policy Agent: + type: programming + ace_mode: text + extensions: + - ".rego" + language_id: 840483232 + tm_scope: source.rego OpenCL: type: programming group: C @@ -3204,6 +3785,14 @@ OpenEdge ABL: tm_scope: source.abl ace_mode: text language_id: 264 +OpenQASM: + type: programming + extensions: + - ".qasm" + color: "#AA70FF" + tm_scope: source.qasm + ace_mode: text + language_id: 153739399 OpenRC runscript: type: programming group: Shell @@ -3223,6 +3812,13 @@ OpenSCAD: tm_scope: source.scad ace_mode: scad language_id: 266 +OpenStep Property List: + type: data + extensions: + - ".plist" + tm_scope: source.plist + ace_mode: text + language_id: 598917541 OpenType Feature File: type: data aliases: @@ -3275,15 +3871,6 @@ P4: tm_scope: source.p4 ace_mode: text language_id: 348895984 -PAWN: - type: programming - color: "#dbb284" - extensions: - - ".pwn" - - ".inc" - tm_scope: source.pawn - ace_mode: text - language_id: 271 PHP: type: programming tm_scope: text.html.php @@ -3344,6 +3931,7 @@ PLpgSQL: codemirror_mime_type: text/x-sql tm_scope: source.sql extensions: + - ".pgsql" - ".sql" language_id: 274 POV-Ray SDL: @@ -3354,6 +3942,7 @@ POV-Ray SDL: extensions: - ".pov" - ".inc" + tm_scope: source.pov-ray sdl ace_mode: text language_id: 275 Pan: @@ -3417,10 +4006,21 @@ Pascal: - ".pp" interpreters: - instantfpc + tm_scope: source.pascal ace_mode: pascal codemirror_mode: pascal codemirror_mime_type: text/x-pascal language_id: 281 +Pawn: + type: programming + color: "#dbb284" + extensions: + - ".pwn" + - ".inc" + - ".sma" + tm_scope: source.pawn + ace_mode: text + language_id: 271 Pep8: type: programming color: "#C76F5B" @@ -3458,30 +4058,6 @@ Perl: aliases: - cperl language_id: 282 -Perl 6: - type: programming - color: "#0000fb" - extensions: - - ".6pl" - - ".6pm" - - ".nqp" - - ".p6" - - ".p6l" - - ".p6m" - - ".pl" - - ".pl6" - - ".pm" - - ".pm6" - - ".t" - interpreters: - - perl6 - aliases: - - perl6 - tm_scope: source.perl6fe - ace_mode: perl - codemirror_mode: perl - codemirror_mime_type: text/x-perl - language_id: 283 Pic: type: markup group: Roff @@ -3526,8 +4102,18 @@ Pike: - ".pmod" interpreters: - pike + tm_scope: source.pike ace_mode: text language_id: 287 +PlantUML: + type: data + extensions: + - ".puml" + - ".iuml" + - ".plantuml" + tm_scope: source.wsd + ace_mode: text + language_id: 833504686 Pod: type: prose ace_mode: perl @@ -3540,6 +4126,17 @@ Pod: - perl tm_scope: none language_id: 288 +Pod 6: + type: prose + ace_mode: perl + tm_scope: source.perl6fe + wrap: true + extensions: + - ".pod" + - ".pod6" + interpreters: + - perl6 + language_id: 155357471 PogoScript: type: programming color: "#d80074" @@ -3561,6 +4158,7 @@ PostCSS: group: CSS extensions: - ".pcss" + - ".postcss" ace_mode: text language_id: 262764437 PostScript: @@ -3569,6 +4167,7 @@ PostScript: extensions: - ".ps" - ".eps" + - ".epsi" - ".pfa" tm_scope: source.postscript aliases: @@ -3589,6 +4188,7 @@ PowerBuilder: PowerShell: type: programming color: "#012456" + tm_scope: source.powershell ace_mode: powershell codemirror_mode: powershell codemirror_mime_type: application/x-powershell @@ -3602,13 +4202,29 @@ PowerShell: interpreters: - pwsh language_id: 293 +Prisma: + type: data + color: "#0c344b" + extensions: + - ".prisma" + tm_scope: source.prisma + ace_mode: text + language_id: 499933428 Processing: type: programming color: "#0096D8" extensions: - ".pde" + tm_scope: source.processing ace_mode: text language_id: 294 +Proguard: + type: data + extensions: + - ".pro" + tm_scope: none + ace_mode: text + language_id: 716513858 Prolog: type: programming color: "#74283c" @@ -3654,8 +4270,8 @@ Public Key: codemirror_mime_type: application/pgp language_id: 298 Pug: - group: HTML type: markup + color: "#a86454" extensions: - ".jade" - ".pug" @@ -3704,13 +4320,13 @@ PureScript: language_id: 302 Python: type: programming + tm_scope: source.python ace_mode: python codemirror_mode: python codemirror_mime_type: text/x-python color: "#3572A5" extensions: - ".py" - - ".bzl" - ".cgi" - ".fcgi" - ".gyp" @@ -3723,27 +4339,25 @@ Python: - ".pyt" - ".pyw" - ".rpy" + - ".smk" - ".spec" - ".tac" - ".wsgi" - ".xpy" filenames: - ".gclient" - - BUCK - - BUILD - - BUILD.bazel + - DEPS - SConscript - SConstruct - Snakefile - - WORKSPACE - wscript interpreters: - python - python2 - python3 aliases: - - rusthon - python3 + - rusthon language_id: 303 Python console: type: programming @@ -3763,6 +4377,16 @@ Python traceback: tm_scope: text.python.traceback ace_mode: text language_id: 304 +Q#: + type: programming + extensions: + - ".qs" + aliases: + - qsharp + color: "#fed659" + ace_mode: text + tm_scope: source.qsharp + language_id: 697448245 QML: type: programming color: "#44a51c" @@ -3779,8 +4403,22 @@ QMake: - ".pri" interpreters: - qmake + tm_scope: source.qmake ace_mode: text language_id: 306 +Qt Script: + type: programming + ace_mode: javascript + codemirror_mode: javascript + codemirror_mime_type: text/javascript + extensions: + - ".qs" + filenames: + - installscript.qs + - toolchain_installscript.qs + color: "#00b841" + tm_scope: source.js + language_id: 558193693 Quake: type: programming filenames: @@ -3806,6 +4444,7 @@ R: - expr-dist interpreters: - Rscript + tm_scope: source.r ace_mode: r codemirror_mode: r codemirror_mime_type: text/x-rsrc @@ -3854,18 +4493,6 @@ REXX: tm_scope: source.rexx ace_mode: text language_id: 311 -RHTML: - type: markup - group: HTML - extensions: - - ".rhtml" - tm_scope: text.html.erb - aliases: - - html+ruby - ace_mode: rhtml - codemirror_mode: htmlembedded - codemirror_mime_type: application/x-erb - language_id: 312 RMarkdown: type: prose wrap: true @@ -3904,12 +4531,13 @@ RUNOFF: extensions: - ".rnh" - ".rno" + wrap: true tm_scope: text.runoff ace_mode: text language_id: 315 Racket: type: programming - color: "#22228f" + color: "#3c5caa" extensions: - ".rkt" - ".rktd" @@ -3931,6 +4559,33 @@ Ragel: tm_scope: none ace_mode: text language_id: 317 +Raku: + type: programming + color: "#0000fb" + extensions: + - ".6pl" + - ".6pm" + - ".nqp" + - ".p6" + - ".p6l" + - ".p6m" + - ".pl" + - ".pl6" + - ".pm" + - ".pm6" + - ".t" + interpreters: + - perl6 + - raku + - rakudo + aliases: + - perl6 + - perl-6 + tm_scope: source.perl6fe + ace_mode: perl + codemirror_mode: perl + codemirror_mime_type: text/x-perl + language_id: 283 Rascal: type: programming color: "#fffaa0" @@ -3948,9 +4603,21 @@ Raw token data: tm_scope: none ace_mode: text language_id: 318 +Readline Config: + type: data + group: INI + aliases: + - inputrc + - readline + filenames: + - ".inputrc" + - inputrc + tm_scope: source.inputrc + ace_mode: text + language_id: 538732839 Reason: type: programming - group: OCaml + color: "#ff5847" ace_mode: rust codemirror_mode: rust codemirror_mime_type: text/x-rustsrc @@ -4020,6 +4687,13 @@ RenderScript: tm_scope: none ace_mode: text language_id: 323 +Rich Text Format: + type: markup + extensions: + - ".rtf" + tm_scope: text.rtf + ace_mode: text + language_id: 51601661 Ring: type: programming color: "#2D54CB" @@ -4028,6 +4702,14 @@ Ring: tm_scope: source.ring ace_mode: text language_id: 431 +Riot: + type: markup + color: "#A71E49" + ace_mode: html + extensions: + - ".riot" + tm_scope: text.html.riot + language_id: 878396783 RobotFramework: type: programming extensions: @@ -4039,7 +4721,7 @@ Roff: type: markup color: "#ecdebe" extensions: - - ".man" + - ".roff" - ".1" - ".1in" - ".1m" @@ -4048,6 +4730,8 @@ Roff: - ".3" - ".3in" - ".3m" + - ".3p" + - ".3pm" - ".3qt" - ".3x" - ".4" @@ -4057,23 +4741,65 @@ Roff: - ".8" - ".9" - ".l" + - ".man" + - ".mdoc" - ".me" - ".ms" - ".n" - ".nr" - ".rno" - - ".roff" - ".tmac" filenames: + - eqnrc - mmn - mmt + - troffrc + - troffrc-end tm_scope: text.roff aliases: + - groff + - man + - manpage + - man page + - man-page + - mdoc - nroff + - troff + wrap: true ace_mode: text codemirror_mode: troff codemirror_mime_type: text/troff language_id: 141 +Roff Manpage: + type: markup + group: Roff + extensions: + - ".1" + - ".1in" + - ".1m" + - ".1x" + - ".2" + - ".3" + - ".3in" + - ".3m" + - ".3p" + - ".3pm" + - ".3qt" + - ".3x" + - ".4" + - ".5" + - ".6" + - ".7" + - ".8" + - ".9" + - ".man" + - ".mdoc" + wrap: true + tm_scope: text.roff + ace_mode: text + codemirror_mode: troff + codemirror_mime_type: text/troff + language_id: 612669833 Rouge: type: programming ace_mode: clojure @@ -4086,6 +4812,7 @@ Rouge: language_id: 325 Ruby: type: programming + tm_scope: source.ruby ace_mode: ruby codemirror_mode: ruby codemirror_mime_type: text/x-ruby @@ -4109,6 +4836,7 @@ Ruby: - ".podspec" - ".rabl" - ".rake" + - ".rbi" - ".rbuild" - ".rbw" - ".rbx" @@ -4126,6 +4854,7 @@ Ruby: filenames: - ".irbrc" - ".pryrc" + - ".simplecov" - Appraisals - Berksfile - Brewfile @@ -4153,6 +4882,7 @@ Rust: extensions: - ".rs" - ".rs.in" + tm_scope: source.rust ace_mode: rust codemirror_mode: rust codemirror_mime_type: text/x-rustsrc @@ -4169,8 +4899,8 @@ SAS: language_id: 328 SCSS: type: markup - tm_scope: source.scss - group: CSS + color: "#c6538c" + tm_scope: source.css.scss ace_mode: scss codemirror_mode: css codemirror_mime_type: text/x-scss @@ -4252,6 +4982,19 @@ SRecode Template: extensions: - ".srt" language_id: 335 +SSH Config: + type: data + group: INI + filenames: + - ssh-config + - ssh_config + - sshconfig + - sshconfig.snip + - sshd-config + - sshd_config + ace_mode: text + tm_scope: source.ssh-config + language_id: 554920715 STON: type: data group: Smalltalk @@ -4262,16 +5005,25 @@ STON: language_id: 336 SVG: type: data + color: "#ff9900" extensions: - ".svg" - tm_scope: text.xml + tm_scope: text.xml.svg ace_mode: xml codemirror_mode: xml codemirror_mime_type: text/xml language_id: 337 +SWIG: + type: programming + extensions: + - ".i" + tm_scope: source.c++ + ace_mode: c_cpp + codemirror_mode: clike + codemirror_mime_type: text/x-c++src + language_id: 1066250075 Sage: type: programming - group: Python extensions: - ".sage" - ".sagews" @@ -4295,8 +5047,8 @@ SaltStack: language_id: 339 Sass: type: markup + color: "#a53b70" tm_scope: source.sass - group: CSS extensions: - ".sass" ace_mode: sass @@ -4305,6 +5057,7 @@ Sass: language_id: 340 Scala: type: programming + tm_scope: source.scala ace_mode: scala codemirror_mode: clike codemirror_mime_type: text/x-scala @@ -4336,12 +5089,14 @@ Scheme: - ".sps" - ".ss" interpreters: + - scheme - guile - bigloo - chicken - csi - gosh - r6rs + tm_scope: source.scheme ace_mode: scheme codemirror_mode: scheme codemirror_mime_type: text/x-scheme @@ -4352,6 +5107,7 @@ Scilab: - ".sci" - ".sce" - ".tst" + tm_scope: source.scilab ace_mode: text language_id: 344 Self: @@ -4383,6 +5139,7 @@ Shell: - ".bats" - ".cgi" - ".command" + - ".env" - ".fcgi" - ".ksh" - ".sh.in" @@ -4390,11 +5147,15 @@ Shell: - ".tool" - ".zsh" filenames: + - ".bash_aliases" - ".bash_history" - ".bash_logout" - ".bash_profile" - ".bashrc" - ".cshrc" + - ".env" + - ".env.example" + - ".flaskenv" - ".login" - ".profile" - ".zlogin" @@ -4404,6 +5165,7 @@ Shell: - ".zshrc" - 9fs - PKGBUILD + - bash_aliases - bash_logout - bash_profile - bashrc @@ -4427,6 +5189,7 @@ Shell: - rc - sh - zsh + tm_scope: source.shell ace_mode: sh codemirror_mode: shell codemirror_mime_type: text/x-sh @@ -4451,6 +5214,15 @@ Shen: tm_scope: source.shen ace_mode: text language_id: 348 +Sieve: + type: programming + tm_scope: source.sieve + ace_mode: text + extensions: + - ".sieve" + codemirror_mode: sieve + codemirror_mime_type: application/sieve + language_id: 208976687 Slash: type: programming color: "#007eff" @@ -4459,9 +5231,17 @@ Slash: tm_scope: text.html.slash ace_mode: text language_id: 349 +Slice: + type: programming + color: "#003fa2" + tm_scope: source.slice + ace_mode: text + extensions: + - ".ice" + language_id: 894641667 Slim: - group: HTML type: markup + color: "#2b2b2b" extensions: - ".slim" tm_scope: text.slim @@ -4469,6 +5249,16 @@ Slim: codemirror_mode: slim codemirror_mime_type: text/x-slim language_id: 350 +SmPL: + type: programming + extensions: + - ".cocci" + aliases: + - coccinelle + ace_mode: text + tm_scope: source.smpl + color: "#c94949" + language_id: 164123055 Smali: type: programming extensions: @@ -4484,6 +5274,7 @@ Smalltalk: - ".cs" aliases: - squeak + tm_scope: source.smalltalk ace_mode: text codemirror_mode: smalltalk codemirror_mime_type: text/x-stsrc @@ -4502,17 +5293,18 @@ Solidity: color: "#AA6746" ace_mode: text tm_scope: source.solidity + extensions: + - ".sol" language_id: 237469032 SourcePawn: type: programming - color: "#5c7611" + color: "#f69e1d" aliases: - sourcemod extensions: - ".sp" - ".inc" - - ".sma" - tm_scope: source.sp + tm_scope: source.sourcepawn ace_mode: text language_id: 354 Spline Font Database: @@ -4546,7 +5338,7 @@ Standard ML: aliases: - sml extensions: - - ".ML" + - ".ml" - ".fun" - ".sig" - ".sml" @@ -4555,6 +5347,25 @@ Standard ML: codemirror_mode: mllike codemirror_mime_type: text/x-ocaml language_id: 357 +Starlark: + type: programming + tm_scope: source.python + ace_mode: python + codemirror_mode: python + codemirror_mime_type: text/x-python + color: "#76d275" + extensions: + - ".bzl" + filenames: + - BUCK + - BUILD + - BUILD.bazel + - Tiltfile + - WORKSPACE + aliases: + - bazel + - bzl + language_id: 960266174 Stata: type: programming extensions: @@ -4565,11 +5376,12 @@ Stata: - ".mata" - ".matah" - ".sthlp" + tm_scope: source.stata ace_mode: text language_id: 358 Stylus: type: markup - group: CSS + color: "#ff6347" extensions: - ".styl" tm_scope: source.stylus @@ -4602,11 +5414,22 @@ SuperCollider: tm_scope: source.supercollider ace_mode: text language_id: 361 +Svelte: + type: markup + color: "#ff3e00" + tm_scope: source.svelte + ace_mode: html + codemirror_mode: htmlmixed + codemirror_mime_type: text/html + extensions: + - ".svelte" + language_id: 928734530 Swift: type: programming color: "#ffac45" extensions: - ".swift" + tm_scope: source.swift ace_mode: text codemirror_mode: swift codemirror_mime_type: text/x-swift @@ -4618,6 +5441,7 @@ SystemVerilog: - ".sv" - ".svh" - ".vh" + tm_scope: source.systemverilog ace_mode: verilog codemirror_mode: verilog codemirror_mime_type: text/x-systemverilog @@ -4647,11 +5471,36 @@ TOML: filenames: - Cargo.lock - Gopkg.lock + - poetry.lock tm_scope: source.toml ace_mode: toml codemirror_mode: toml codemirror_mime_type: text/x-toml language_id: 365 +TSQL: + type: programming + extensions: + - ".sql" + ace_mode: sql + tm_scope: source.tsql + language_id: 918334941 +TSV: + type: data + ace_mode: text + tm_scope: source.generic-db + extensions: + - ".tsv" + language_id: 1035892117 +TSX: + type: programming + group: TypeScript + extensions: + - ".tsx" + tm_scope: source.tsx + ace_mode: javascript + codemirror_mode: jsx + codemirror_mime_type: text/jsx + language_id: 94901924 TXL: type: programming extensions: @@ -4672,6 +5521,7 @@ Tcl: interpreters: - tclsh - wish + tm_scope: source.tcl ace_mode: tcl codemirror_mode: tcl codemirror_mime_type: text/x-tcl @@ -4682,6 +5532,9 @@ Tcsh: extensions: - ".tcsh" - ".csh" + interpreters: + - tcsh + - csh tm_scope: source.shell ace_mode: sh codemirror_mode: shell @@ -4693,6 +5546,7 @@ TeX: ace_mode: tex codemirror_mode: stex codemirror_mime_type: text/x-stex + tm_scope: text.tex.latex wrap: true aliases: - latex @@ -4700,7 +5554,6 @@ TeX: - ".tex" - ".aux" - ".bbx" - - ".bib" - ".cbx" - ".cls" - ".dtx" @@ -4725,12 +5578,25 @@ Terra: extensions: - ".t" color: "#00004c" + tm_scope: source.terra ace_mode: lua codemirror_mode: lua codemirror_mime_type: text/x-lua interpreters: - lua language_id: 371 +Texinfo: + type: prose + wrap: true + extensions: + - ".texinfo" + - ".texi" + - ".txi" + ace_mode: text + tm_scope: text.texinfo + interpreters: + - makeinfo + language_id: 988020015 Text: type: prose wrap: true @@ -4757,10 +5623,17 @@ Text: - README.mysql - click.me - delete.me + - go.mod + - go.sum - keep.me + - package.mask + - package.use.mask + - package.use.stable.mask - read.me - readme.1st - test.me + - use.mask + - use.stable.mask tm_scope: none ace_mode: text language_id: 372 @@ -4801,7 +5674,7 @@ Turtle: language_id: 376 Twig: type: markup - group: HTML + color: "#c1d026" extensions: - ".twig" tm_scope: text.html.twig @@ -4823,9 +5696,11 @@ TypeScript: color: "#2b7489" aliases: - ts + interpreters: + - deno + - ts-node extensions: - ".ts" - - ".tsx" tm_scope: source.ts ace_mode: typescript codemirror_mode: javascript @@ -4849,6 +5724,7 @@ Unity3D Asset: extensions: - ".anim" - ".asset" + - ".mask" - ".mat" - ".meta" - ".prefab" @@ -4866,6 +5742,7 @@ Unix Assembly: language_id: 120 Uno: type: programming + color: "#9933cc" extensions: - ".uno" ace_mode: csharp @@ -4894,6 +5771,46 @@ UrWeb: tm_scope: source.ur ace_mode: text language_id: 383 +V: + type: programming + color: "#4f87c4" + aliases: + - vlang + extensions: + - ".v" + tm_scope: source.v + ace_mode: golang + codemirror_mode: go + codemirror_mime_type: text/x-go + language_id: 603371597 +VBA: + type: programming + color: "#867db1" + extensions: + - ".bas" + - ".cls" + - ".frm" + - ".frx" + - ".vba" + tm_scope: source.vbnet + aliases: + - vb6 + - visual basic 6 + - visual basic for applications + ace_mode: text + codemirror_mode: vb + codemirror_mime_type: text/x-vb + language_id: 399230729 +VBScript: + type: programming + color: "#15dcdc" + extensions: + - ".vbs" + tm_scope: source.vbnet + ace_mode: text + codemirror_mode: vbscript + codemirror_mime_type: text/vbscript + language_id: 408016005 VCL: type: programming color: "#148AA8" @@ -4914,6 +5831,7 @@ VHDL: - ".vhs" - ".vht" - ".vhw" + tm_scope: source.vhdl ace_mode: vhdl codemirror_mode: vhdl codemirror_mime_type: text/x-vhdl @@ -4924,6 +5842,7 @@ Vala: extensions: - ".vala" - ".vapi" + tm_scope: source.vala ace_mode: vala language_id: 386 Verilog: @@ -4932,10 +5851,34 @@ Verilog: extensions: - ".v" - ".veo" + tm_scope: source.verilog ace_mode: verilog codemirror_mode: verilog codemirror_mime_type: text/x-verilog language_id: 387 +Vim Help File: + type: prose + aliases: + - vimhelp + extensions: + - ".txt" + tm_scope: text.vim-help + ace_mode: text + language_id: 508563686 +Vim Snippet: + type: markup + aliases: + - SnipMate + - UltiSnip + - UltiSnips + - NeoSnippet + extensions: + - ".snip" + - ".snippet" + - ".snippets" + tm_scope: source.vim-snippet + ace_mode: text + language_id: 81265970 Vim script: type: programming color: "#199f4b" @@ -4946,7 +5889,10 @@ Vim script: - nvim extensions: - ".vim" + - ".vba" + - ".vmb" filenames: + - ".exrc" - ".gvimrc" - ".nvimrc" - ".vimrc" @@ -4956,22 +5902,18 @@ Vim script: - vimrc ace_mode: text language_id: 388 -Visual Basic: +Visual Basic .NET: type: programming color: "#945db7" extensions: - ".vb" - - ".bas" - - ".cls" - - ".frm" - - ".frx" - - ".vba" - ".vbhtml" - - ".vbs" - tm_scope: source.vbnet aliases: - - vb.net + - visual basic - vbnet + - vb .net + - vb.net + tm_scope: source.vbnet ace_mode: text codemirror_mode: vb codemirror_mime_type: text/x-vb @@ -5038,6 +5980,41 @@ WebIDL: codemirror_mode: webidl codemirror_mime_type: text/x-webidl language_id: 395 +WebVTT: + type: data + wrap: true + extensions: + - ".vtt" + tm_scope: source.vtt + ace_mode: text + language_id: 658679714 +Wget Config: + type: data + group: INI + aliases: + - wgetrc + filenames: + - ".wgetrc" + tm_scope: source.wgetrc + ace_mode: text + language_id: 668457123 +Windows Registry Entries: + type: data + extensions: + - ".reg" + tm_scope: source.reg + ace_mode: ini + codemirror_mode: properties + codemirror_mime_type: text/x-properties + language_id: 969674868 +Wollok: + type: programming + color: "#a23738" + extensions: + - ".wlk" + ace_mode: text + tm_scope: source.wollok + language_id: 632745969 World of Warcraft Addon Data: type: data extensions: @@ -5057,6 +6034,16 @@ X BitMap: codemirror_mode: clike codemirror_mime_type: text/x-csrc language_id: 782911107 +X Font Directory Index: + type: data + filenames: + - encodings.dir + - fonts.alias + - fonts.dir + - fonts.scale + tm_scope: source.fontdir + ace_mode: text + language_id: 208700028 X PixMap: type: data group: C @@ -5101,6 +6088,7 @@ XCompose: language_id: 225167241 XML: type: data + tm_scope: text.xml ace_mode: xml codemirror_mode: xml codemirror_mime_type: text/xml @@ -5135,7 +6123,9 @@ XML: - ".fxml" - ".glade" - ".gml" + - ".gmx" - ".grxml" + - ".gst" - ".iml" - ".ivy" - ".jelly" @@ -5155,7 +6145,6 @@ XML: - ".odd" - ".osm" - ".pkgproj" - - ".plist" - ".pluginspec" - ".proj" - ".props" @@ -5171,15 +6160,9 @@ XML: - ".shproj" - ".srdf" - ".storyboard" - - ".stTheme" - ".sublime-snippet" - ".targets" - - ".tmCommand" - ".tml" - - ".tmLanguage" - - ".tmPreferences" - - ".tmSnippet" - - ".tmTheme" - ".ts" - ".tsx" - ".ui" @@ -5192,6 +6175,7 @@ XML: - ".vstemplate" - ".vxml" - ".wixproj" + - ".workflow" - ".wsdl" - ".wsf" - ".wxi" @@ -5222,6 +6206,22 @@ XML: - Web.config - packages.config language_id: 399 +XML Property List: + type: data + group: XML + extensions: + - ".plist" + - ".stTheme" + - ".tmCommand" + - ".tmLanguage" + - ".tmPreferences" + - ".tmSnippet" + - ".tmTheme" + tm_scope: text.xml.plist + ace_mode: xml + codemirror_mode: xml + codemirror_mime_type: text/xml + language_id: 75622871 XPages: type: data extensions: @@ -5287,17 +6287,19 @@ Xojo: - ".xojo_script" - ".xojo_toolbar" - ".xojo_window" - tm_scope: source.vbnet + tm_scope: source.xojo ace_mode: text language_id: 405 Xtend: type: programming extensions: - ".xtend" + tm_scope: source.xtend ace_mode: text language_id: 406 YAML: type: data + color: "#cb171e" tm_scope: source.yaml aliases: - yml @@ -5310,12 +6312,14 @@ YAML: - ".syntax" - ".yaml" - ".yaml-tmlanguage" + - ".yaml.sed" - ".yml.mysql" filenames: - ".clang-format" - ".clang-tidy" - ".gemrc" - glide.lock + - yarn.lock ace_mode: yaml codemirror_mode: yaml codemirror_mime_type: text/x-yaml @@ -5328,23 +6332,71 @@ YANG: ace_mode: text language_id: 408 YARA: - type: data + type: programming + color: "#220000" ace_mode: text extensions: - ".yar" - ".yara" tm_scope: source.yara language_id: 805122868 +YASnippet: + type: markup + aliases: + - snippet + - yas + color: "#32AB90" + extensions: + - ".yasnippet" + tm_scope: source.yasnippet + ace_mode: text + language_id: 378760102 Yacc: type: programming extensions: - ".y" - ".yacc" - ".yy" - tm_scope: source.bison + tm_scope: source.yacc ace_mode: text color: "#4B6C4B" language_id: 409 +ZAP: + type: programming + color: "#0d665e" + extensions: + - ".zap" + - ".xzap" + tm_scope: source.zap + ace_mode: text + language_id: 952972794 +ZIL: + type: programming + color: "#dc75e5" + extensions: + - ".zil" + - ".mud" + tm_scope: source.zil + ace_mode: text + language_id: 973483626 +Zeek: + type: programming + aliases: + - bro + extensions: + - ".zeek" + - ".bro" + tm_scope: source.zeek + ace_mode: text + language_id: 40 +ZenScript: + type: programming + color: "#00BCD1" + extensions: + - ".zs" + tm_scope: source.zenscript + ace_mode: text + language_id: 494938890 Zephir: type: programming color: "#118f9e" @@ -5353,6 +6405,14 @@ Zephir: tm_scope: source.php.zephir ace_mode: php language_id: 410 +Zig: + type: programming + color: "#ec915c" + extensions: + - ".zig" + tm_scope: source.zig + ace_mode: text + language_id: 646424281 Zimpl: type: programming extensions: @@ -5362,6 +6422,17 @@ Zimpl: tm_scope: none ace_mode: text language_id: 411 +cURL Config: + type: data + group: INI + aliases: + - curlrc + filenames: + - ".curlrc" + - _curlrc + tm_scope: source.curlrc + ace_mode: text + language_id: 992375436 desktop: type: data extensions: @@ -5370,6 +6441,20 @@ desktop: tm_scope: source.desktop ace_mode: text language_id: 412 +dircolors: + type: data + extensions: + - ".dircolors" + filenames: + - ".dir_colors" + - ".dircolors" + - DIR_COLORS + - _dir_colors + - _dircolors + - dir_colors + tm_scope: source.dircolors + ace_mode: text + language_id: 691605112 eC: type: programming color: "#913960" @@ -5398,12 +6483,40 @@ fish: tm_scope: source.fish ace_mode: text language_id: 415 +mIRC Script: + type: programming + color: "#3d57c3" + extensions: + - ".mrc" + tm_scope: source.msl + ace_mode: text + language_id: 517654727 +mcfunction: + type: programming + color: "#E22837" + extensions: + - ".mcfunction" + tm_scope: source.mcfunction + ace_mode: text + language_id: 462488745 mupad: type: programming extensions: - ".mu" + tm_scope: source.mupad ace_mode: text language_id: 416 +nanorc: + type: data + group: INI + extensions: + - ".nanorc" + filenames: + - ".nanorc" + - nanorc + tm_scope: source.nanorc + ace_mode: text + language_id: 775996197 nesC: type: programming color: "#94B0C7" @@ -5417,6 +6530,7 @@ ooc: color: "#b0b77e" extensions: - ".ooc" + tm_scope: source.ooc ace_mode: text language_id: 418 q: @@ -5437,6 +6551,7 @@ reStructuredText: - ".rest" - ".rest.txt" - ".rst.txt" + tm_scope: text.restructuredtext ace_mode: text codemirror_mode: rst codemirror_mime_type: text/x-rst diff --git a/yarn.lock b/yarn.lock index 99080bca1c8..93a686f947f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5586,16 +5586,6 @@ graphql@^14.7.0: dependencies: iterall "^1.2.2" -gray-matter@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.2.tgz#9aa379e3acaf421193fce7d2a28cebd4518ac454" - integrity sha512-7hB/+LxrOjq/dd8APlK0r24uL/67w7SkYnfwhNFwg/VDIGWGmduTDYf3WNstLW2fbbmRwrDGCVSJ2isuf2+4Hw== - dependencies: - js-yaml "^3.11.0" - kind-of "^6.0.2" - section-matter "^1.0.0" - strip-bom-string "^1.0.0" - growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" @@ -7114,7 +7104,7 @@ js-cookie@^2.2.1: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.11.0, js-yaml@^3.12.0, js-yaml@^3.13.1, js-yaml@~3.13.1: +js-yaml@^3.12.0, js-yaml@^3.13.1, js-yaml@~3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -10500,14 +10490,6 @@ scss-tokenizer@^0.2.3: js-base64 "^2.1.8" source-map "^0.4.2" -section-matter@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" - integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== - dependencies: - extend-shallow "^2.0.1" - kind-of "^6.0.0" - select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" @@ -11170,11 +11152,6 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" -strip-bom-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" - integrity sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI= - strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" |