Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
60fe8d65ac
commit
d0ac590b65
|
|
@ -5,7 +5,7 @@ workhorse:verify:
|
|||
needs: []
|
||||
parallel:
|
||||
matrix:
|
||||
- GO_VERSION: ["1.22", "1.23"]
|
||||
- GO_VERSION: ["1.23"]
|
||||
script:
|
||||
- go version
|
||||
- make -C workhorse # test build
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
|
||||
## Author's checklist
|
||||
|
||||
- [ ] Optional. Consider taking [the GitLab Technical Writing Fundamentals course](https://handbook.gitlab.com/handbook/product/ux/technical-writing/fundamentals/).
|
||||
- [ ] Optional. Consider taking [the GitLab Technical Writing Fundamentals course](https://university.gitlab.com/courses/gitlab-technical-writing-fundamentals).
|
||||
- [ ] Follow the:
|
||||
- [Documentation process](https://docs.gitlab.com/development/documentation/workflow/).
|
||||
- [Documentation guidelines](https://docs.gitlab.com/ee/development/documentation/).
|
||||
|
|
|
|||
|
|
@ -2180,6 +2180,9 @@
|
|||
"depend"
|
||||
]
|
||||
},
|
||||
"inputs": {
|
||||
"$ref": "#/definitions/inputs"
|
||||
},
|
||||
"forward": {
|
||||
"description": "Specify what to forward to the downstream pipeline.",
|
||||
"type": "object",
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ import { s__, __, sprintf } from '~/locale';
|
|||
import { helpPagePath } from '~/helpers/help_page_helper';
|
||||
import getExperimentCandidates from '~/ml/experiment_tracking/graphql/queries/get_experiment_candidates.query.graphql';
|
||||
import SearchableTable from '~/ml/model_registry/components/searchable_table.vue';
|
||||
import CandidatesTable from '~/ml/model_registry/components/candidates_table.vue';
|
||||
|
||||
const GRAPHQL_PAGE_SIZE = 30;
|
||||
|
||||
|
|
@ -48,6 +49,9 @@ export default {
|
|||
},
|
||||
},
|
||||
computed: {
|
||||
candidatesTableComponent() {
|
||||
return CandidatesTable;
|
||||
},
|
||||
isLoading() {
|
||||
return this.$apollo.queries.candidates.loading;
|
||||
},
|
||||
|
|
@ -92,7 +96,8 @@ export default {
|
|||
</script>
|
||||
<template>
|
||||
<searchable-table
|
||||
:candidates="items"
|
||||
:items="items"
|
||||
:table="candidatesTableComponent"
|
||||
:page-info="pageInfo"
|
||||
:error-message="errorMessage"
|
||||
:is-loading="isLoading"
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ import TitleArea from '~/vue_shared/components/registry/title_area.vue';
|
|||
import { helpPagePath } from '~/helpers/help_page_helper';
|
||||
import * as Sentry from '~/sentry/sentry_browser_wrapper';
|
||||
import { n__, s__, sprintf } from '~/locale';
|
||||
import ModelsTable from '~/ml/model_registry/components/models_table.vue';
|
||||
import EmptyState from '../components/model_list_empty_state.vue';
|
||||
import { BASE_SORT_FIELDS, MLFLOW_USAGE_MODAL_ID } from '../constants';
|
||||
import getModelsQuery from '../graphql/queries/get_models.query.graphql';
|
||||
|
|
@ -94,6 +95,9 @@ export default {
|
|||
};
|
||||
},
|
||||
computed: {
|
||||
modelsTableComponent() {
|
||||
return ModelsTable;
|
||||
},
|
||||
pageInfo() {
|
||||
return this.models?.pageInfo ?? {};
|
||||
},
|
||||
|
|
@ -198,7 +202,8 @@ export default {
|
|||
<searchable-table
|
||||
show-search
|
||||
:page-info="pageInfo"
|
||||
:models="items"
|
||||
:items="items"
|
||||
:table="modelsTableComponent"
|
||||
:error-message="errorMessage"
|
||||
:is-loading="isLoading"
|
||||
:sortable-fields="$options.sortableFields"
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ import { GlEmptyState, GlButton } from '@gitlab/ui';
|
|||
import emptySvgUrl from '@gitlab/svgs/dist/illustrations/status/status-new-md.svg';
|
||||
import * as Sentry from '~/sentry/sentry_browser_wrapper';
|
||||
import { s__, __, sprintf } from '~/locale';
|
||||
import CandidatesTable from '~/ml/model_registry/components/candidates_table.vue';
|
||||
import getModelCandidatesQuery from '../graphql/queries/get_model_candidates.query.graphql';
|
||||
import { GRAPHQL_PAGE_SIZE, CANDIDATES_DOCS_PATH } from '../constants';
|
||||
import SearchableTable from './searchable_table.vue';
|
||||
|
|
@ -46,6 +47,9 @@ export default {
|
|||
},
|
||||
},
|
||||
computed: {
|
||||
candidatesTableComponent() {
|
||||
return CandidatesTable;
|
||||
},
|
||||
isLoading() {
|
||||
return this.$apollo.queries.candidates.loading;
|
||||
},
|
||||
|
|
@ -88,7 +92,8 @@ export default {
|
|||
</script>
|
||||
<template>
|
||||
<searchable-table
|
||||
:candidates="items"
|
||||
:table="candidatesTableComponent"
|
||||
:items="items"
|
||||
:page-info="pageInfo"
|
||||
:error-message="errorMessage"
|
||||
:is-loading="isLoading"
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
<script>
|
||||
import * as Sentry from '~/sentry/sentry_browser_wrapper';
|
||||
import { s__, sprintf } from '~/locale';
|
||||
import ModelVersionsTable from '~/ml/model_registry/components/model_versions_table.vue';
|
||||
import getModelVersionsQuery from '../graphql/queries/get_model_versions.query.graphql';
|
||||
import {
|
||||
GRAPHQL_PAGE_SIZE,
|
||||
|
|
@ -50,6 +51,9 @@ export default {
|
|||
},
|
||||
},
|
||||
computed: {
|
||||
modelVersionsTableComponent() {
|
||||
return ModelVersionsTable;
|
||||
},
|
||||
isLoading() {
|
||||
return this.$apollo.queries.modelVersions.loading;
|
||||
},
|
||||
|
|
@ -111,7 +115,8 @@ export default {
|
|||
<searchable-table
|
||||
:show-search="showSearch"
|
||||
:page-info="pageInfo"
|
||||
:model-versions="versions"
|
||||
:items="versions"
|
||||
:table="modelVersionsTableComponent"
|
||||
:error-message="errorMessage"
|
||||
:is-loading="isLoading"
|
||||
:sortable-fields="$options.sortableFields"
|
||||
|
|
|
|||
|
|
@ -5,9 +5,6 @@ import { GRAPHQL_PAGE_SIZE, LIST_KEY_CREATED_AT } from '~/ml/model_registry/cons
|
|||
import { queryToObject, setUrlParams, updateHistory } from '~/lib/utils/url_utility';
|
||||
import { FILTERED_SEARCH_TERM } from '~/vue_shared/components/filtered_search_bar/constants';
|
||||
import LoadOrErrorOrShow from '~/ml/model_registry/components/load_or_error_or_show.vue';
|
||||
import ModelsTable from '~/ml/model_registry/components/models_table.vue';
|
||||
import ModelVersionsTable from '~/ml/model_registry/components/model_versions_table.vue';
|
||||
import CandidatesTable from '~/ml/model_registry/components/candidates_table.vue';
|
||||
|
||||
export default {
|
||||
name: 'SearchableTable',
|
||||
|
|
@ -15,25 +12,17 @@ export default {
|
|||
RegistrySearch,
|
||||
LoadOrErrorOrShow,
|
||||
GlKeysetPagination,
|
||||
ModelsTable,
|
||||
ModelVersionsTable,
|
||||
CandidatesTable,
|
||||
},
|
||||
directives: {
|
||||
GlTooltip,
|
||||
},
|
||||
props: {
|
||||
modelVersions: {
|
||||
type: Array,
|
||||
required: false,
|
||||
default: () => [],
|
||||
table: {
|
||||
type: Object,
|
||||
required: true,
|
||||
default: null,
|
||||
},
|
||||
models: {
|
||||
type: Array,
|
||||
required: false,
|
||||
default: () => [],
|
||||
},
|
||||
candidates: {
|
||||
items: {
|
||||
type: Array,
|
||||
required: false,
|
||||
default: () => [],
|
||||
|
|
@ -154,13 +143,7 @@ export default {
|
|||
@filter:clear="filters = []"
|
||||
/>
|
||||
<load-or-error-or-show :is-loading="isLoading" :error-message="errorMessage">
|
||||
<model-versions-table
|
||||
v-if="modelVersions.length"
|
||||
:items="modelVersions"
|
||||
@model-versions-update="submitFilters"
|
||||
/>
|
||||
<models-table v-else-if="models.length" :items="models" @models-update="submitFilters" />
|
||||
<candidates-table v-else-if="candidates.length" :items="candidates" />
|
||||
<component :is="table" v-if="items.length" :items="items" data-testid="dynamicTable" />
|
||||
<slot v-else name="empty-state"></slot>
|
||||
<gl-keyset-pagination
|
||||
v-if="pageInfo.hasPreviousPage || pageInfo.hasNextPage"
|
||||
|
|
|
|||
|
|
@ -0,0 +1,57 @@
|
|||
<script>
|
||||
import { GlBadge, GlIcon } from '@gitlab/ui';
|
||||
import { getTimeago } from '~/lib/utils/datetime/timeago_utility';
|
||||
|
||||
export default {
|
||||
name: 'MergeRequestListItem',
|
||||
components: {
|
||||
GlBadge,
|
||||
GlIcon,
|
||||
},
|
||||
props: {
|
||||
mergeRequest: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
formattedTime() {
|
||||
return getTimeago().format(this.mergeRequest.createdAt);
|
||||
},
|
||||
mrMetaInfo() {
|
||||
return `${this.mergeRequest.project.fullPath} !${this.mergeRequest.iid}`;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="gl-flex gl-flex-col gl-gap-1 gl-p-2">
|
||||
<div class="gl-flex gl-items-center gl-justify-between">
|
||||
<div class="gl-inline-flex gl-items-center gl-gap-2">
|
||||
<gl-badge class="gl-mr-2" variant="success">
|
||||
<gl-icon name="merge-request" />
|
||||
{{ s__('OpenMrBadge|Open') }}
|
||||
</gl-badge>
|
||||
<span class="gl-text-subtle">
|
||||
{{ s__('OpenMrBadge|Opened') }} <time v-text="formattedTime"></time
|
||||
></span>
|
||||
</div>
|
||||
</div>
|
||||
<h5 class="my-2">{{ mergeRequest.title }}</h5>
|
||||
<div class="gl-flex gl-flex-col gl-gap-1 gl-text-subtle" data-testid="project-info">
|
||||
<div class="gl-flex gl-gap-1"><gl-icon name="project" />{{ mrMetaInfo }}</div>
|
||||
<div
|
||||
v-for="assignee in mergeRequest.assignees.nodes"
|
||||
:key="assignee.id"
|
||||
class="gl-flex gl-gap-1"
|
||||
data-testid="assignee-info"
|
||||
>
|
||||
<gl-icon name="user" />{{ assignee.name }}
|
||||
</div>
|
||||
<div class="gl-flex gl-gap-1" data-testid="source-branch-info">
|
||||
<gl-icon name="branch" />{{ mergeRequest.sourceBranch }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
|
@ -1,17 +1,22 @@
|
|||
<script>
|
||||
import { GlBadge } from '@gitlab/ui';
|
||||
import { sprintf, __ } from '~/locale';
|
||||
import getOpenMrCountsForBlobPath from '~/repository/queries/open_mr_counts.query.graphql';
|
||||
import { GlBadge, GlPopover, GlSkeletonLoader } from '@gitlab/ui';
|
||||
import { sprintf, s__ } from '~/locale';
|
||||
import getOpenMrCountForBlobPath from '~/repository/queries/open_mr_count.query.graphql';
|
||||
import getOpenMrsForBlobPath from '~/repository/queries/open_mrs.query.graphql';
|
||||
import { nDaysBefore } from '~/lib/utils/datetime/date_calculation_utility';
|
||||
import { toYmd } from '~/analytics/shared/utils';
|
||||
import { logError } from '~/lib/logger';
|
||||
import * as Sentry from '~/sentry/sentry_browser_wrapper';
|
||||
import MergeRequestListItem from './merge_request_list_item.vue';
|
||||
|
||||
const OPEN_MR_AGE_LIMIT_DAYS = 30;
|
||||
|
||||
export default {
|
||||
components: {
|
||||
GlBadge,
|
||||
GlPopover,
|
||||
GlSkeletonLoader,
|
||||
MergeRequestListItem,
|
||||
},
|
||||
inject: ['currentRef'],
|
||||
props: {
|
||||
|
|
@ -27,11 +32,13 @@ export default {
|
|||
data() {
|
||||
return {
|
||||
openMrsCount: null,
|
||||
openMrs: [],
|
||||
isPopoverOpen: false,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
openMRsCountText() {
|
||||
return sprintf(__('%{count} open'), { count: this.openMrsCount });
|
||||
return sprintf(s__('OpenMrBadge|%{count} open'), { count: this.openMrsCount });
|
||||
},
|
||||
createdAfter() {
|
||||
const lookbackDate = nDaysBefore(new Date(), OPEN_MR_AGE_LIMIT_DAYS - 1, { utc: true });
|
||||
|
|
@ -54,7 +61,7 @@ export default {
|
|||
},
|
||||
apollo: {
|
||||
openMrsCount: {
|
||||
query: getOpenMrCountsForBlobPath,
|
||||
query: getOpenMrCountForBlobPath,
|
||||
variables() {
|
||||
return this.queryVariables;
|
||||
},
|
||||
|
|
@ -69,12 +76,52 @@ export default {
|
|||
Sentry.captureException(error);
|
||||
},
|
||||
},
|
||||
openMrs: {
|
||||
query: getOpenMrsForBlobPath,
|
||||
variables() {
|
||||
return this.queryVariables;
|
||||
},
|
||||
skip() {
|
||||
return !this.isPopoverOpen;
|
||||
},
|
||||
update: (data) => data?.project?.mergeRequests?.nodes || [],
|
||||
error(error) {
|
||||
logError(
|
||||
`Failed to fetch merge requests. See exception details for more information.`,
|
||||
error,
|
||||
);
|
||||
Sentry.captureException(error);
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<gl-badge v-if="showBadge" variant="success" icon="merge-request">
|
||||
{{ openMRsCountText }}
|
||||
</gl-badge>
|
||||
<div id="open-mr-badge">
|
||||
<gl-badge v-if="showBadge" variant="success" icon="merge-request">
|
||||
{{ openMRsCountText }}
|
||||
</gl-badge>
|
||||
<gl-popover
|
||||
target="open-mr-badge"
|
||||
boundary="viewport"
|
||||
placement="bottomleft"
|
||||
@show.once="isPopoverOpen = true"
|
||||
@hide.once="isPopoverOpen = false"
|
||||
>
|
||||
<gl-skeleton-loader v-if="!openMrs.length || isLoading" :height="15">
|
||||
<rect width="250" height="15" rx="4" />
|
||||
</gl-skeleton-loader>
|
||||
<ul v-else class="flex-column gl-m-0 gl-flex gl-list-none gl-gap-4 gl-p-0">
|
||||
<li
|
||||
v-for="(mergeRequest, index) in openMrs"
|
||||
:key="mergeRequest.iid"
|
||||
class="gl-p-0"
|
||||
:class="{ 'gl-border-t gl-pt-4': index !== 0 }"
|
||||
>
|
||||
<merge-request-list-item :merge-request="mergeRequest" />
|
||||
</li>
|
||||
</ul>
|
||||
</gl-popover>
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
query getOpenMrCountsForBlobPath(
|
||||
query getOpenMrCountForBlobPath(
|
||||
$projectPath: ID!
|
||||
$targetBranch: [String!]
|
||||
$blobPath: String!
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
#import "~/graphql_shared/fragments/user.fragment.graphql"
|
||||
|
||||
query getOpenMrsForBlobPath(
|
||||
$projectPath: ID!
|
||||
$targetBranch: [String!]
|
||||
$blobPath: String!
|
||||
$createdAfter: Time!
|
||||
) {
|
||||
project(fullPath: $projectPath) {
|
||||
id
|
||||
mergeRequests(
|
||||
state: opened
|
||||
targetBranches: $targetBranch
|
||||
blobPath: $blobPath
|
||||
createdAfter: $createdAfter
|
||||
) {
|
||||
nodes {
|
||||
id
|
||||
iid
|
||||
title
|
||||
createdAt
|
||||
assignees {
|
||||
nodes {
|
||||
...User
|
||||
}
|
||||
}
|
||||
project {
|
||||
id
|
||||
fullPath
|
||||
}
|
||||
sourceBranch
|
||||
}
|
||||
count
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,8 +1,10 @@
|
|||
<script>
|
||||
import {
|
||||
GlDisclosureDropdown,
|
||||
GlDisclosureDropdownGroup,
|
||||
GlDisclosureDropdownItem,
|
||||
GlDropdownDivider,
|
||||
GlIcon,
|
||||
GlLoadingIcon,
|
||||
GlModal,
|
||||
GlModalDirective,
|
||||
|
|
@ -61,6 +63,8 @@ export default {
|
|||
GlDisclosureDropdown,
|
||||
GlDisclosureDropdownItem,
|
||||
GlDropdownDivider,
|
||||
GlDisclosureDropdownGroup,
|
||||
GlIcon,
|
||||
GlLoadingIcon,
|
||||
GlModal,
|
||||
GlToggle,
|
||||
|
|
@ -220,6 +224,14 @@ export default {
|
|||
required: false,
|
||||
default: '',
|
||||
},
|
||||
showSidebar: {
|
||||
type: Boolean,
|
||||
required: true,
|
||||
},
|
||||
truncationEnabled: {
|
||||
type: Boolean,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
|
@ -360,6 +372,9 @@ export default {
|
|||
showMoveButton() {
|
||||
return this.workItemType === WORK_ITEM_TYPE_VALUE_ISSUE && this.canMove;
|
||||
},
|
||||
toggleSidebarLabel() {
|
||||
return this.showSidebar ? s__('WorkItem|Hide sidebar') : s__('WorkItem|Show sidebar');
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
copyToClipboard(text, message) {
|
||||
|
|
@ -526,6 +541,7 @@ export default {
|
|||
:value="subscribedToNotifications"
|
||||
:label="$options.i18n.notifications"
|
||||
label-position="left"
|
||||
data-testid="notifications-toggle"
|
||||
class="work-item-dropdown-toggle gl-justify-between"
|
||||
@change="toggleNotifications($event)"
|
||||
/>
|
||||
|
|
@ -639,9 +655,45 @@ export default {
|
|||
variant="danger"
|
||||
@action="handleDelete"
|
||||
>
|
||||
<template #list-item>{{ i18n.deleteWorkItem }}</template>
|
||||
<template #list-item>
|
||||
<span class="gl-text-danger">{{ i18n.deleteWorkItem }}</span>
|
||||
</template>
|
||||
</gl-disclosure-dropdown-item>
|
||||
</template>
|
||||
|
||||
<gl-disclosure-dropdown-group bordered>
|
||||
<template #group-label>
|
||||
{{ __('View options') }}
|
||||
<gl-icon
|
||||
v-gl-tooltip
|
||||
name="information-o"
|
||||
class="gl-ml-2"
|
||||
variant="link"
|
||||
:title="s__('WorkItem|Change appearance for all issues, epics, and tasks')"
|
||||
/>
|
||||
</template>
|
||||
<gl-disclosure-dropdown-item
|
||||
class="gl-flex gl-w-full gl-justify-end"
|
||||
data-testid="truncation-toggle-action"
|
||||
@action="$emit('toggleTruncationEnabled')"
|
||||
>
|
||||
<template #list-item>
|
||||
<gl-toggle
|
||||
:value="truncationEnabled"
|
||||
:label="s__('WorkItem|Truncate descriptions')"
|
||||
label-position="left"
|
||||
class="work-item-dropdown-toggle gl-justify-between"
|
||||
/>
|
||||
</template>
|
||||
</gl-disclosure-dropdown-item>
|
||||
<gl-disclosure-dropdown-item
|
||||
data-testid="sidebar-toggle-action"
|
||||
class="work-item-container-xs-hidden gl-hidden md:gl-block"
|
||||
@action="$emit('toggleSidebar')"
|
||||
>
|
||||
<template #list-item>{{ toggleSidebarLabel }}</template>
|
||||
</gl-disclosure-dropdown-item>
|
||||
</gl-disclosure-dropdown-group>
|
||||
</gl-disclosure-dropdown>
|
||||
|
||||
<gl-modal
|
||||
|
|
|
|||
|
|
@ -105,12 +105,17 @@ export default {
|
|||
required: false,
|
||||
default: false,
|
||||
},
|
||||
truncationEnabled: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: true,
|
||||
},
|
||||
},
|
||||
markdownDocsPath: helpPagePath('user/markdown'),
|
||||
data() {
|
||||
return {
|
||||
workItem: {},
|
||||
disableTruncation: false,
|
||||
wasEdited: false,
|
||||
isEditing: this.editMode,
|
||||
isSubmitting: false,
|
||||
isSubmittingWithKeydown: false,
|
||||
|
|
@ -239,6 +244,12 @@ export default {
|
|||
? `/groups/${this.fullPath}/-/uploads`
|
||||
: `/${this.fullPath}/uploads`;
|
||||
},
|
||||
enableTruncation() {
|
||||
/* truncationEnabled uses the local storage based setting,
|
||||
wasEdited is a localized override for when user actions on this work item
|
||||
should result in a full description shown. */
|
||||
return this.truncationEnabled && !this.wasEdited;
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
updateInProgress(newValue) {
|
||||
|
|
@ -338,7 +349,7 @@ export default {
|
|||
},
|
||||
async startEditing() {
|
||||
this.isEditing = true;
|
||||
this.disableTruncation = true;
|
||||
this.wasEdited = true;
|
||||
|
||||
this.descriptionText = this.createFlow
|
||||
? this.workItemDescription?.description
|
||||
|
|
@ -396,7 +407,7 @@ export default {
|
|||
updateDraft(this.autosaveKey, this.descriptionText);
|
||||
},
|
||||
handleDescriptionTextUpdated(newText) {
|
||||
this.disableTruncation = true;
|
||||
this.wasEdited = true;
|
||||
this.descriptionText = newText;
|
||||
this.$emit('updateDraft', this.descriptionText);
|
||||
this.updateWorkItem();
|
||||
|
|
@ -574,7 +585,7 @@ export default {
|
|||
:work-item-id="workItemId"
|
||||
:work-item-type="workItemType"
|
||||
:can-edit="canEdit"
|
||||
:disable-truncation="disableTruncation"
|
||||
:enable-truncation="enableTruncation"
|
||||
:is-group="isGroup"
|
||||
:is-updating="isSubmitting"
|
||||
:without-heading-anchors="withoutHeadingAnchors"
|
||||
|
|
|
|||
|
|
@ -39,10 +39,9 @@ export default {
|
|||
},
|
||||
mixins: [trackingMixin],
|
||||
props: {
|
||||
disableTruncation: {
|
||||
enableTruncation: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
default: false,
|
||||
required: true,
|
||||
},
|
||||
isGroup: {
|
||||
type: Boolean,
|
||||
|
|
@ -107,7 +106,7 @@ export default {
|
|||
return this.descriptionHtml?.trim() === '';
|
||||
},
|
||||
isTruncated() {
|
||||
return this.truncated && !this.disableTruncation;
|
||||
return this.truncated && this.enableTruncation;
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ import * as Sentry from '~/sentry/sentry_browser_wrapper';
|
|||
import { s__, __ } from '~/locale';
|
||||
import { getParameterByName, updateHistory, removeParams } from '~/lib/utils/url_utility';
|
||||
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
|
||||
import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
|
||||
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
|
||||
import { TYPENAME_GROUP } from '~/graphql_shared/constants';
|
||||
import { isLoggedIn } from '~/lib/utils/common_utils';
|
||||
|
|
@ -102,6 +103,8 @@ export default {
|
|||
},
|
||||
isLoggedIn: isLoggedIn(),
|
||||
VALID_DESIGN_FILE_MIMETYPE,
|
||||
SHOW_SIDEBAR_STORAGE_KEY: 'work_item_show_sidebar',
|
||||
ENABLE_TRUNCATION_STORAGE_KEY: 'work_item_truncate_descriptions',
|
||||
components: {
|
||||
DesignDropzone,
|
||||
DesignWidget,
|
||||
|
|
@ -110,6 +113,7 @@ export default {
|
|||
GlButton,
|
||||
GlEmptyState,
|
||||
GlIntersectionObserver,
|
||||
LocalStorageSync,
|
||||
WorkItemActions,
|
||||
TodosToggle,
|
||||
WorkItemNotificationsWidget,
|
||||
|
|
@ -201,6 +205,8 @@ export default {
|
|||
isDragDataValid: false,
|
||||
isAddingNotes: false,
|
||||
info: getParameterByName('resolves_discussion'),
|
||||
showSidebar: true,
|
||||
truncationEnabled: true,
|
||||
};
|
||||
},
|
||||
apollo: {
|
||||
|
|
@ -560,6 +566,8 @@ export default {
|
|||
widgets: this.widgets,
|
||||
allowedChildTypes: this.allowedChildTypes,
|
||||
namespaceFullName: this.namespaceFullName,
|
||||
showSidebar: this.showSidebar,
|
||||
truncationEnabled: this.truncationEnabled,
|
||||
};
|
||||
},
|
||||
},
|
||||
|
|
@ -830,6 +838,12 @@ export default {
|
|||
this.info = undefined;
|
||||
updateHistory({ url: removeParams(['resolves_discussion']) });
|
||||
},
|
||||
handleToggleSidebar() {
|
||||
this.showSidebar = !this.showSidebar;
|
||||
},
|
||||
handleTruncationEnabled() {
|
||||
this.truncationEnabled = !this.truncationEnabled;
|
||||
},
|
||||
},
|
||||
WORK_ITEM_TYPE_VALUE_OBJECTIVE,
|
||||
WORKSPACE_PROJECT,
|
||||
|
|
@ -864,6 +878,8 @@ export default {
|
|||
:parent-id="parentWorkItemId"
|
||||
:namespace-full-name="namespaceFullName"
|
||||
:has-children="hasChildren"
|
||||
:show-sidebar="showSidebar"
|
||||
:truncation-enabled="truncationEnabled"
|
||||
@hideStickyHeader="hideStickyHeader"
|
||||
@showStickyHeader="showStickyHeader"
|
||||
@deleteWorkItem="$emit('deleteWorkItem', { workItemType, workItemId: workItem.id })"
|
||||
|
|
@ -888,6 +904,8 @@ export default {
|
|||
@workItemTypeChanged="workItemTypeChanged"
|
||||
@toggleReportAbuseModal="toggleReportAbuseModal"
|
||||
@workItemCreated="handleWorkItemCreated"
|
||||
@toggleSidebar="handleToggleSidebar"
|
||||
@toggleTruncationEnabled="handleTruncationEnabled"
|
||||
/>
|
||||
</template>
|
||||
</work-item-sticky-header>
|
||||
|
|
@ -982,6 +1000,8 @@ export default {
|
|||
@workItemTypeChanged="workItemTypeChanged"
|
||||
@toggleReportAbuseModal="toggleReportAbuseModal"
|
||||
@workItemCreated="handleWorkItemCreated"
|
||||
@toggleSidebar="handleToggleSidebar"
|
||||
@toggleTruncationEnabled="handleTruncationEnabled"
|
||||
/>
|
||||
</div>
|
||||
<gl-button
|
||||
|
|
@ -1006,15 +1026,37 @@ export default {
|
|||
@updateWorkItem="updateWorkItem"
|
||||
@updateDraft="updateDraft('title', $event)"
|
||||
/>
|
||||
<work-item-created-updated
|
||||
v-if="!editMode"
|
||||
:full-path="workItemFullPath"
|
||||
:work-item-iid="iid"
|
||||
:update-in-progress="updateInProgress"
|
||||
/>
|
||||
<div class="gl-flex gl-items-center gl-gap-3">
|
||||
<work-item-created-updated
|
||||
v-if="!editMode"
|
||||
:full-path="workItemFullPath"
|
||||
:work-item-iid="iid"
|
||||
:update-in-progress="updateInProgress"
|
||||
class="gl-grow"
|
||||
/>
|
||||
<div v-if="!showSidebar" class="work-item-container-xs-hidden gl-hidden md:gl-block">
|
||||
<gl-button
|
||||
size="small"
|
||||
category="secondary"
|
||||
data-testid="work-item-show-sidebar-button"
|
||||
icon="sidebar-right"
|
||||
@click="handleToggleSidebar"
|
||||
>
|
||||
{{ s__('WorkItem|Show sidebar') }}
|
||||
</gl-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div data-testid="work-item-overview" class="work-item-overview">
|
||||
<div
|
||||
data-testid="work-item-overview"
|
||||
class="work-item-overview"
|
||||
:class="{ 'sidebar-hidden': !showSidebar }"
|
||||
>
|
||||
<section>
|
||||
<local-storage-sync
|
||||
v-model="truncationEnabled"
|
||||
:storage-key="$options.ENABLE_TRUNCATION_STORAGE_KEY"
|
||||
/>
|
||||
<work-item-description
|
||||
v-if="hasDescriptionWidget"
|
||||
:edit-mode="editMode"
|
||||
|
|
@ -1024,6 +1066,7 @@ export default {
|
|||
:update-in-progress="updateInProgress"
|
||||
:without-heading-anchors="isDrawer"
|
||||
:hide-fullscreen-markdown-button="isDrawer"
|
||||
:truncation-enabled="truncationEnabled"
|
||||
@updateWorkItem="updateWorkItem"
|
||||
@updateDraft="updateDraft('description', $event)"
|
||||
@cancelEditing="cancelEditing"
|
||||
|
|
@ -1065,10 +1108,14 @@ export default {
|
|||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<local-storage-sync
|
||||
v-model="showSidebar"
|
||||
:storage-key="$options.SHOW_SIDEBAR_STORAGE_KEY"
|
||||
/>
|
||||
<aside
|
||||
data-testid="work-item-overview-right-sidebar"
|
||||
class="work-item-overview-right-sidebar"
|
||||
:class="{ 'is-modal': isModal }"
|
||||
:class="{ 'is-modal': isModal, 'md:gl-hidden': !showSidebar }"
|
||||
>
|
||||
<work-item-attributes-wrapper
|
||||
:class="{ 'gl-top-11': isDrawer }"
|
||||
|
|
|
|||
|
|
@ -93,6 +93,14 @@ export default {
|
|||
required: false,
|
||||
default: false,
|
||||
},
|
||||
showSidebar: {
|
||||
type: Boolean,
|
||||
required: true,
|
||||
},
|
||||
truncationEnabled: {
|
||||
type: Boolean,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
canUpdate() {
|
||||
|
|
|
|||
|
|
@ -261,7 +261,7 @@
|
|||
border-top: 1px solid var(--gl-border-color-default);
|
||||
@apply gl-transition-padding;
|
||||
|
||||
@media (max-width: map-get($grid-breakpoints, sm)-1) {
|
||||
@media (max-width: map-get($grid-breakpoints, xl)) {
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
}
|
||||
|
|
@ -273,8 +273,10 @@
|
|||
margin-left: $super-sidebar-width + 0.5rem;
|
||||
margin-right: auto;
|
||||
|
||||
@media (max-width: map-get($grid-breakpoints, sm)-1) {
|
||||
@media (max-width: map-get($grid-breakpoints, xl)) {
|
||||
margin: 0 auto;
|
||||
margin-left: 0;
|
||||
margin-right: auto;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -43,6 +43,10 @@ $work-item-overview-gap-width: 2rem;
|
|||
display: block !important;
|
||||
}
|
||||
|
||||
.work-item-container-xs-hidden {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.work-item-attributes-wrapper {
|
||||
position: static !important;
|
||||
overflow-y: initial !important;
|
||||
|
|
@ -51,7 +55,7 @@ $work-item-overview-gap-width: 2rem;
|
|||
}
|
||||
}
|
||||
|
||||
.work-item-overview {
|
||||
.work-item-overview:not(.sidebar-hidden) {
|
||||
@include media-breakpoint-up(md) {
|
||||
display: grid;
|
||||
// allow the main content area to shrink
|
||||
|
|
|
|||
|
|
@ -325,8 +325,9 @@ module Ci
|
|||
},
|
||||
execute_params: {
|
||||
ignore_skip_ci: true,
|
||||
bridge: self
|
||||
}
|
||||
bridge: self,
|
||||
inputs: options&.dig(:trigger, :inputs)
|
||||
}.compact
|
||||
}
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -36,13 +36,13 @@ module Ci
|
|||
|
||||
def policies_allowed?(accessed_project, policies)
|
||||
return true if self_referential?(accessed_project)
|
||||
return false unless inbound_accessible?(accessed_project)
|
||||
|
||||
# We capture policies even if the inbound scopes are disabled or the feature flag is disabled
|
||||
# We capture policies even if the FF is disabled, allowlists are disabled or the project is not allowlisted
|
||||
Ci::JobToken::Authorization.capture_job_token_policies(policies) if policies.present?
|
||||
|
||||
return true unless accessed_project.ci_inbound_job_token_scope_enabled?
|
||||
return true unless Feature.enabled?(:add_policies_to_ci_job_token, accessed_project)
|
||||
return true unless Feature.enabled?(:add_policies_to_ci_job_token, accessed_project) # the FF is disabled
|
||||
return true unless accessed_project.ci_inbound_job_token_scope_enabled? # allowlists are disabled
|
||||
return false unless inbound_accessible?(accessed_project) # the current project is not allowlisted
|
||||
|
||||
policies_allowed_for_accessed_project?(accessed_project, policies)
|
||||
end
|
||||
|
|
|
|||
|
|
@ -0,0 +1,24 @@
|
|||
- title: "Azure storage driver for the container registry"
|
||||
announcement_milestone: "17.10"
|
||||
removal_milestone: "19.0"
|
||||
breaking_change: true
|
||||
reporter: trizzi
|
||||
stage: Package
|
||||
issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/523096
|
||||
impact: low
|
||||
scope: instance
|
||||
resolution_role: maintainer
|
||||
manual_task: true
|
||||
window: "3"
|
||||
body: |
|
||||
The legacy Azure storage driver for the container registry is deprecated in GitLab 17.10 and will be removed in GitLab 19.0. If you use Azure object storage for your container registry, you'll need to update your configuration to use the new `azure_v2` driver.
|
||||
|
||||
The `azure_v2` storage driver provides improved reliability, better performance, and uses a more maintainable codebase compared to the legacy driver. These improvements help prevent performance issues as your registry usage scales.
|
||||
|
||||
To migrate to the `azure_v2` driver:
|
||||
|
||||
1. Update your registry configuration file to use the `azure_v2` driver instead of the legacy `azure` driver.
|
||||
1. Adjust your configuration settings as needed for the new driver.
|
||||
1. Test the new configuration in a non-production environment before deploying to production.
|
||||
|
||||
For more information about updating your storage driver configuration, see [use object storage](https://docs.gitlab.com/administration/packages/container_registry/#use-object-storage).
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
---
|
||||
migration_job_name: BackfillPackagesNugetDependencyLinkMetadataProjectId
|
||||
description: Backfills sharding key `packages_nuget_dependency_link_metadata.project_id` from `packages_dependency_links`.
|
||||
feature_category: package_registry
|
||||
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/184610
|
||||
milestone: '17.11'
|
||||
queued_migration_version: 20250314120530
|
||||
finalized_by: # version of the migration that finalized this BBM
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
---
|
||||
migration_job_name: BackfillSoftwareLicensePolicies
|
||||
description: Backfill software license policies with custom_license_id or spdx_identifier
|
||||
feature_category: security_policy_management
|
||||
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/181736
|
||||
milestone: '17.10'
|
||||
queued_migration_version: 20250214214518
|
||||
finalized_by: # version of the migration that finalized this BBM
|
||||
|
|
@ -18,3 +18,4 @@ desired_sharding_key:
|
|||
sharding_key: project_id
|
||||
belongs_to: dependency_link
|
||||
table_size: small
|
||||
desired_sharding_key_migration_job_name: BackfillPackagesNugetDependencyLinkMetadataProjectId
|
||||
|
|
|
|||
|
|
@ -0,0 +1,9 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class AddProjectIdToPackagesNugetDependencyLinkMetadata < Gitlab::Database::Migration[2.2]
|
||||
milestone '17.11'
|
||||
|
||||
def change
|
||||
add_column :packages_nuget_dependency_link_metadata, :project_id, :bigint
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class QueueBackfillSoftwareLicensePolicies < Gitlab::Database::Migration[2.2]
|
||||
milestone '17.10'
|
||||
|
||||
restrict_gitlab_migration gitlab_schema: :gitlab_main
|
||||
|
||||
MIGRATION = "BackfillSoftwareLicensePolicies"
|
||||
DELAY_INTERVAL = 2.minutes
|
||||
BATCH_SIZE = 1000
|
||||
SUB_BATCH_SIZE = 100
|
||||
|
||||
def up
|
||||
queue_batched_background_migration(
|
||||
MIGRATION,
|
||||
:software_license_policies,
|
||||
:id,
|
||||
job_interval: DELAY_INTERVAL,
|
||||
batch_size: BATCH_SIZE,
|
||||
sub_batch_size: SUB_BATCH_SIZE
|
||||
)
|
||||
end
|
||||
|
||||
def down
|
||||
delete_batched_background_migration(MIGRATION, :software_license_policies, :id, [])
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class IndexPackagesNugetDependencyLinkMetadataOnProjectId < Gitlab::Database::Migration[2.2]
|
||||
milestone '17.11'
|
||||
disable_ddl_transaction!
|
||||
|
||||
INDEX_NAME = 'index_packages_nuget_dependency_link_metadata_on_project_id'
|
||||
|
||||
def up
|
||||
add_concurrent_index :packages_nuget_dependency_link_metadata, :project_id, name: INDEX_NAME
|
||||
end
|
||||
|
||||
def down
|
||||
remove_concurrent_index_by_name :packages_nuget_dependency_link_metadata, INDEX_NAME
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class AddPackagesNugetDependencyLinkMetadataProjectIdFk < Gitlab::Database::Migration[2.2]
|
||||
milestone '17.11'
|
||||
disable_ddl_transaction!
|
||||
|
||||
def up
|
||||
add_concurrent_foreign_key :packages_nuget_dependency_link_metadata, :projects, column: :project_id,
|
||||
on_delete: :cascade
|
||||
end
|
||||
|
||||
def down
|
||||
with_lock_retries do
|
||||
remove_foreign_key :packages_nuget_dependency_link_metadata, column: :project_id
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class AddPackagesNugetDependencyLinkMetadataProjectIdTrigger < Gitlab::Database::Migration[2.2]
|
||||
milestone '17.11'
|
||||
|
||||
def up
|
||||
install_sharding_key_assignment_trigger(
|
||||
table: :packages_nuget_dependency_link_metadata,
|
||||
sharding_key: :project_id,
|
||||
parent_table: :packages_dependency_links,
|
||||
parent_sharding_key: :project_id,
|
||||
foreign_key: :dependency_link_id
|
||||
)
|
||||
end
|
||||
|
||||
def down
|
||||
remove_sharding_key_assignment_trigger(
|
||||
table: :packages_nuget_dependency_link_metadata,
|
||||
sharding_key: :project_id,
|
||||
parent_table: :packages_dependency_links,
|
||||
parent_sharding_key: :project_id,
|
||||
foreign_key: :dependency_link_id
|
||||
)
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class QueueBackfillPackagesNugetDependencyLinkMetadataProjectId < Gitlab::Database::Migration[2.2]
|
||||
milestone '17.11'
|
||||
restrict_gitlab_migration gitlab_schema: :gitlab_main_cell
|
||||
|
||||
MIGRATION = "BackfillPackagesNugetDependencyLinkMetadataProjectId"
|
||||
DELAY_INTERVAL = 2.minutes
|
||||
BATCH_SIZE = 1000
|
||||
SUB_BATCH_SIZE = 100
|
||||
|
||||
def up
|
||||
queue_batched_background_migration(
|
||||
MIGRATION,
|
||||
:packages_nuget_dependency_link_metadata,
|
||||
:dependency_link_id,
|
||||
:project_id,
|
||||
:packages_dependency_links,
|
||||
:project_id,
|
||||
:dependency_link_id,
|
||||
job_interval: DELAY_INTERVAL,
|
||||
batch_size: BATCH_SIZE,
|
||||
sub_batch_size: SUB_BATCH_SIZE
|
||||
)
|
||||
end
|
||||
|
||||
def down
|
||||
delete_batched_background_migration(
|
||||
MIGRATION,
|
||||
:packages_nuget_dependency_link_metadata,
|
||||
:dependency_link_id,
|
||||
[
|
||||
:project_id,
|
||||
:packages_dependency_links,
|
||||
:project_id,
|
||||
:dependency_link_id
|
||||
]
|
||||
)
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1 @@
|
|||
840befb12a01d4a00935a713f17d4d1c747699c0c7a8c91c492de83ee57f5404
|
||||
|
|
@ -0,0 +1 @@
|
|||
c3af20addfff35e3e3e02fb2acd4768b70bd6f697cde96f963eeb11623f50789
|
||||
|
|
@ -0,0 +1 @@
|
|||
c5783d7627ced838639b3db47cbafc6782d02475e0359eccfa52920660b7f71b
|
||||
|
|
@ -0,0 +1 @@
|
|||
c96cc46b98d2a8f623e0d050d89784e49b9882c2579cb2ee23c6fd6fc2dd226a
|
||||
|
|
@ -0,0 +1 @@
|
|||
9c33eb3a02178e017844deef269dfbb3586c8c265afe764b1272b26a0aea997e
|
||||
|
|
@ -0,0 +1 @@
|
|||
f5ae1e787e0a4e161c087df9f1bff114d6e6a23a87090a9b4256abe355211a4c
|
||||
|
|
@ -1728,6 +1728,22 @@ RETURN NEW;
|
|||
END
|
||||
$$;
|
||||
|
||||
CREATE FUNCTION trigger_363d0fd35f2c() RETURNS trigger
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
BEGIN
|
||||
IF NEW."project_id" IS NULL THEN
|
||||
SELECT "project_id"
|
||||
INTO NEW."project_id"
|
||||
FROM "packages_dependency_links"
|
||||
WHERE "packages_dependency_links"."id" = NEW."dependency_link_id";
|
||||
END IF;
|
||||
|
||||
RETURN NEW;
|
||||
|
||||
END
|
||||
$$;
|
||||
|
||||
CREATE FUNCTION trigger_3691f9f6a69f() RETURNS trigger
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
|
|
@ -18614,6 +18630,7 @@ ALTER SEQUENCE packages_npm_metadata_caches_id_seq OWNED BY packages_npm_metadat
|
|||
CREATE TABLE packages_nuget_dependency_link_metadata (
|
||||
dependency_link_id bigint NOT NULL,
|
||||
target_framework text NOT NULL,
|
||||
project_id bigint,
|
||||
CONSTRAINT packages_nuget_dependency_link_metadata_target_framework_constr CHECK ((char_length(target_framework) <= 255))
|
||||
);
|
||||
|
||||
|
|
@ -34921,6 +34938,8 @@ CREATE INDEX index_packages_npm_metadata_on_package_json_deprecate_exist ON pack
|
|||
|
||||
CREATE INDEX index_packages_npm_metadata_on_project_id ON packages_npm_metadata USING btree (project_id);
|
||||
|
||||
CREATE INDEX index_packages_nuget_dependency_link_metadata_on_project_id ON packages_nuget_dependency_link_metadata USING btree (project_id);
|
||||
|
||||
CREATE INDEX index_packages_nuget_dl_metadata_on_dependency_link_id ON packages_nuget_dependency_link_metadata USING btree (dependency_link_id);
|
||||
|
||||
CREATE INDEX index_packages_nuget_metadata_on_project_id ON packages_nuget_metadata USING btree (project_id);
|
||||
|
|
@ -39097,6 +39116,8 @@ CREATE TRIGGER trigger_30209d0fba3e BEFORE INSERT OR UPDATE ON alert_management_
|
|||
|
||||
CREATE TRIGGER trigger_309294c3b889 BEFORE INSERT OR UPDATE ON snippet_statistics FOR EACH ROW EXECUTE FUNCTION trigger_309294c3b889();
|
||||
|
||||
CREATE TRIGGER trigger_363d0fd35f2c BEFORE INSERT OR UPDATE ON packages_nuget_dependency_link_metadata FOR EACH ROW EXECUTE FUNCTION trigger_363d0fd35f2c();
|
||||
|
||||
CREATE TRIGGER trigger_36cb404f9a02 BEFORE INSERT OR UPDATE ON bulk_import_failures FOR EACH ROW EXECUTE FUNCTION trigger_36cb404f9a02();
|
||||
|
||||
CREATE TRIGGER trigger_388de55cd36c BEFORE INSERT OR UPDATE ON ci_builds_runner_session FOR EACH ROW EXECUTE FUNCTION trigger_388de55cd36c();
|
||||
|
|
@ -40862,6 +40883,9 @@ ALTER TABLE ONLY ml_experiments
|
|||
ALTER TABLE ONLY merge_request_metrics
|
||||
ADD CONSTRAINT fk_ae440388cc FOREIGN KEY (latest_closed_by_id) REFERENCES users(id) ON DELETE SET NULL;
|
||||
|
||||
ALTER TABLE ONLY packages_nuget_dependency_link_metadata
|
||||
ADD CONSTRAINT fk_ae9b989220 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
|
||||
|
||||
ALTER TABLE ONLY merge_requests_approval_rules_projects
|
||||
ADD CONSTRAINT fk_af4078336f FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
|
||||
|
||||
|
|
|
|||
|
|
@ -80,7 +80,7 @@ To configure a self-hosted model:
|
|||
|
||||
1. Select **Create self-hosted model**.
|
||||
|
||||
## Configure self-hosted beta models
|
||||
## Configure self-hosted beta models and features
|
||||
|
||||
Prerequisites:
|
||||
|
||||
|
|
@ -88,17 +88,17 @@ Prerequisites:
|
|||
- You must have an Ultimate license.
|
||||
- You must have a Duo Enterprise license add-on.
|
||||
|
||||
To enable self-hosted [beta](../../policy/development_stages_support.md#beta) models:
|
||||
To enable self-hosted [beta](../../policy/development_stages_support.md#beta) models and features:
|
||||
|
||||
1. On the left sidebar, at the bottom, select **Admin**.
|
||||
1. Select **GitLab Duo**.
|
||||
1. In the **GitLab Duo** section, select **Change configuration**.
|
||||
1. Under **Self-hosted AI models**, select **Use beta self-hosted models features**.
|
||||
1. Under **Self-hosted AI models**, select the **Use beta models and features in GitLab Duo Self-Hosted** checkbox.
|
||||
1. Select **Save changes**.
|
||||
|
||||
{{< alert type="note" >}}
|
||||
|
||||
Turning on beta self-hosted models features also accepts the [GitLab Testing Agreement](https://handbook.gitlab.com/handbook/legal/testing-agreement/).
|
||||
Turning on beta self-hosted models and features also accepts the [GitLab Testing Agreement](https://handbook.gitlab.com/handbook/legal/testing-agreement/).
|
||||
|
||||
{{< /alert >}}
|
||||
|
||||
|
|
|
|||
|
|
@ -204,7 +204,7 @@ The following metrics are available:
|
|||
| `gitlab_rack_attack_throttle_limit` | Gauge | 17.6 | Reports the maximum number of requests that a client can make before Rack Attack throttles them. | `event_name` |
|
||||
| `gitlab_rack_attack_throttle_period_seconds` | Gauge | 17.6 | Reports the duration over which requests for a client are counted before Rack Attack throttles them. | `event_name` |
|
||||
| `gitlab_application_rate_limiter_throttle_utilization_ratio` | Histogram | 17.6 | Utilization ratio of a throttle in GitLab Application Rate Limiter. | `throttle_key`, `peek`, `feature_category` |
|
||||
| `search_zoekt_task_processing_queue_size` | Gauge | 17.9 | Number of tasks waiting to be processed by Zoekt. | `node_name` |
|
||||
| `search_zoekt_task_processing_queue_size` | Gauge | 17.9 | Number of tasks waiting to be processed by Zoekt. [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/184641) in GitLab 17.10 and planned for removal in 18.0. Use `gitlab-exporter` instead. | `node_name` |
|
||||
| `gitlab_dependency_path_cte_real_duration_seconds` | Histogram | 17.10 | Duration in seconds spent resolving the ancestor dependency paths for a given component. | |
|
||||
| `dependency_path_cte_paths_found` | Counter | 17.10 | Counts the number of ancestor dependency paths found for a given dependency. | `max_depth_reached`, `cyclic` |
|
||||
|
||||
|
|
|
|||
|
|
@ -483,10 +483,10 @@ The default location where images are stored in self-compiled installations is
|
|||
|
||||
### Use object storage
|
||||
|
||||
If you want to store your images on object storage, you can change the storage
|
||||
driver for the container registry.
|
||||
If you want to store your container registry images in object storage instead of the local file system,
|
||||
you can configure one of the supported storage drivers.
|
||||
|
||||
[Read more about using object storage with GitLab](../object_storage.md).
|
||||
For more information, see [Object storage](../object_storage.md).
|
||||
|
||||
{{< alert type="warning" >}}
|
||||
|
||||
|
|
@ -496,98 +496,154 @@ desired.
|
|||
|
||||
{{< /alert >}}
|
||||
|
||||
#### Configure `s3` and `gcs` storage drivers for Linux package installations
|
||||
#### Configure object storage for Linux package installations
|
||||
|
||||
The following configuration steps are for the `s3` and `gcs` storage drivers. Other [storage drivers](#configure-storage-for-the-container-registry) are supported.
|
||||
|
||||
To configure the `s3` storage driver for a Linux package installation:
|
||||
|
||||
1. Edit `/etc/gitlab/gitlab.rb`:
|
||||
|
||||
```ruby
|
||||
registry['storage'] = {
|
||||
's3' => {
|
||||
'accesskey' => 's3-access-key',
|
||||
'secretkey' => 's3-secret-key-for-access-key',
|
||||
'bucket' => 'your-s3-bucket',
|
||||
'region' => 'your-s3-region',
|
||||
'regionendpoint' => 'your-s3-regionendpoint'
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
To avoid using static credentials, use an
|
||||
[IAM role](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)
|
||||
and omit `accesskey` and `secretkey`. Make sure that your IAM profile follows
|
||||
[the permissions documented by Docker](https://distribution.github.io/distribution/storage-drivers/s3/#s3-permission-scopes).
|
||||
|
||||
```ruby
|
||||
registry['storage'] = {
|
||||
's3' => {
|
||||
'bucket' => 'your-s3-bucket',
|
||||
'region' => 'your-s3-region'
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
If using with an [AWS S3 VPC endpoint](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-s3.html),
|
||||
then set `regionendpoint` to your VPC endpoint address and set `pathstyle` to false:
|
||||
|
||||
```ruby
|
||||
registry['storage'] = {
|
||||
's3' => {
|
||||
'accesskey' => 's3-access-key',
|
||||
'secretkey' => 's3-secret-key-for-access-key',
|
||||
'bucket' => 'your-s3-bucket',
|
||||
'region' => 'your-s3-region',
|
||||
'regionendpoint' => 'your-s3-vpc-endpoint',
|
||||
'pathstyle' => false
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
- `regionendpoint` is only required when configuring an S3 compatible service such as MinIO, or
|
||||
when using an AWS S3 VPC Endpoint.
|
||||
- `your-s3-bucket` should be the name of a bucket that exists, and can't include subdirectories.
|
||||
- `pathstyle` should be set to true to use `host/bucket_name/object` style paths instead of
|
||||
`bucket_name.host/object`. [Set to false for AWS S3](https://aws.amazon.com/blogs/aws/amazon-s3-path-deprecation-plan-the-rest-of-the-story/).
|
||||
|
||||
You can set a rate limit on connections to S3 to avoid 503 errors from the S3 API. To do this,
|
||||
set `maxrequestspersecond` to a number within the [S3 request rate threshold](https://repost.aws/knowledge-center/http-5xx-errors-s3):
|
||||
|
||||
```ruby
|
||||
registry['storage'] = {
|
||||
's3' => {
|
||||
'accesskey' => 's3-access-key',
|
||||
'secretkey' => 's3-secret-key-for-access-key',
|
||||
'bucket' => 'your-s3-bucket',
|
||||
'region' => 'your-s3-region',
|
||||
'regionendpoint' => 'your-s3-regionendpoint',
|
||||
'maxrequestspersecond' => 100
|
||||
}
|
||||
}
|
||||
```
|
||||
To configure object storage for your container registry:
|
||||
|
||||
1. Choose the storage driver you want to use.
|
||||
1. Edit `/etc/gitlab/gitlab.rb` with the appropriate configuration.
|
||||
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation) for the changes to take effect.
|
||||
|
||||
To configure the `gcs` storage driver for a Linux package installation:
|
||||
{{< tabs >}}
|
||||
|
||||
1. Edit `/etc/gitlab/gitlab.rb`:
|
||||
{{< tab title="S3" >}}
|
||||
|
||||
```ruby
|
||||
registry['storage'] = {
|
||||
'gcs' => {
|
||||
'bucket' => 'BUCKET_NAME',
|
||||
'keyfile' => 'PATH/TO/KEYFILE',
|
||||
# If you have the bucket shared with other apps beyond the registry, uncomment the following:
|
||||
# 'rootdirectory' => '/gcs/object/name/prefix'
|
||||
}
|
||||
}
|
||||
```
|
||||
The S3 storage driver integrates with Amazon S3 or any S3-compatible object storage service.
|
||||
|
||||
GitLab supports all available parameters.
|
||||
<!--- start_remove The following content will be removed on remove_date: '2025-08-15' -->
|
||||
|
||||
1. Save the file and [reconfigure GitLab](../restart_gitlab.md#reconfigure-a-linux-package-installation) for the changes to take effect.
|
||||
{{< alert type="warning" >}}
|
||||
|
||||
The S3 storage driver that uses AWS SDK v1 was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/523095) in GitLab 17.10 and is planned for removal in GitLab 18.0.
|
||||
Use the `s3_v2` driver instead when it becomes available in May 2025. This change is a breaking change.
|
||||
|
||||
{{< /alert >}}
|
||||
|
||||
<!--- end_remove -->
|
||||
|
||||
```ruby
|
||||
# Deprecated: Will be removed in GitLab 18.0
|
||||
registry['storage'] = {
|
||||
's3' => {
|
||||
'accesskey' => 's3-access-key',
|
||||
'secretkey' => 's3-secret-key-for-access-key',
|
||||
'bucket' => 'your-s3-bucket',
|
||||
'region' => 'your-s3-region',
|
||||
'regionendpoint' => 'your-s3-regionendpoint'
|
||||
}
|
||||
}
|
||||
|
||||
# Recommended: s3_v2 driver
|
||||
registry['storage'] = {
|
||||
's3_v2' => {
|
||||
'accesskey' => 's3-access-key',
|
||||
'secretkey' => 's3-secret-key-for-access-key',
|
||||
'bucket' => 'your-s3-bucket',
|
||||
'region' => 'your-s3-region',
|
||||
'regionendpoint' => 'your-s3-regionendpoint'
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
The `s3_v2` driver only supports Signature Version 4 for authentication.
|
||||
|
||||
To avoid using static credentials, use an IAM role and omit `accesskey` and `secretkey`.
|
||||
Make sure that your IAM profile follows the [permissions documented by Docker](https://docs.docker.com/registry/storage-drivers/s3/).
|
||||
|
||||
For S3 VPC endpoints:
|
||||
|
||||
```ruby
|
||||
registry['storage'] = {
|
||||
's3' => {
|
||||
'accesskey' => 's3-access-key',
|
||||
'secretkey' => 's3-secret-key-for-access-key',
|
||||
'bucket' => 'your-s3-bucket',
|
||||
'region' => 'your-s3-region',
|
||||
'regionendpoint' => 'your-s3-vpc-endpoint',
|
||||
'pathstyle' => false
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
- `regionendpoint` is only required when configuring an S3 compatible service such as MinIO, or when using an AWS S3 VPC Endpoint.
|
||||
- `your-s3-bucket` should be the name of a bucket that exists, and can't include subdirectories.
|
||||
- `pathstyle` should be set to `true` to use host/bucket_name/object style paths instead of bucket_name.host/object. Set to `false` for AWS S3.
|
||||
|
||||
You can set a rate limit on connections to S3 to avoid 503 errors from the S3 API:
|
||||
|
||||
```ruby
|
||||
registry['storage'] = {
|
||||
's3' => {
|
||||
'accesskey' => 's3-access-key',
|
||||
'secretkey' => 's3-secret-key-for-access-key',
|
||||
'bucket' => 'your-s3-bucket',
|
||||
'region' => 'your-s3-region',
|
||||
'regionendpoint' => 'your-s3-regionendpoint',
|
||||
'maxrequestspersecond' => 100
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
{{< /tab >}}
|
||||
|
||||
{{< tab title="Azure" >}}
|
||||
|
||||
The Azure storage driver integrates with Microsoft Azure Blob Storage.
|
||||
|
||||
{{< alert type="warning" >}}
|
||||
|
||||
The legacy Azure storage driver was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/523096) in GitLab 17.10 and is planned for removal in GitLab 19.0.
|
||||
Use the `azure_v2` driver instead. This change is a breaking change.
|
||||
|
||||
{{< /alert >}}
|
||||
|
||||
```ruby
|
||||
# Deprecated: Will be removed in GitLab 19.0
|
||||
registry['storage'] = {
|
||||
'azure' => {
|
||||
'accountname' => '<your_storage_account_name>',
|
||||
'accountkey' => '<base64_encoded_account_key>',
|
||||
'container' => '<container_name>'
|
||||
}
|
||||
}
|
||||
|
||||
# Recommended: azure_v2 driver
|
||||
registry['storage'] = {
|
||||
'azure_v2' => {
|
||||
'credentials_type' => 'client_secret',
|
||||
'tenant_id' => '<your_tenant_id>',
|
||||
'client_id' => '<your_client_id>',
|
||||
'secret' => '<your_secret>',
|
||||
'container' => '<your_container>',
|
||||
'accountname' => '<your_account_name>'
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
By default, the Azure storage driver uses the `core.windows.net realm`. You can set another value for realm in the Azure section (for example, `core.usgovcloudapi.net` for Azure Government Cloud).
|
||||
|
||||
{{< /tab >}}
|
||||
|
||||
{{< tab title="GCS" >}}
|
||||
|
||||
The GCS storage driver integrates with Google Cloud Storage.
|
||||
|
||||
```ruby
|
||||
registry['storage'] = {
|
||||
'gcs' => {
|
||||
'bucket' => 'BUCKET_NAME',
|
||||
'keyfile' => 'PATH/TO/KEYFILE',
|
||||
# If you have the bucket shared with other apps beyond the registry, uncomment the following:
|
||||
# 'rootdirectory' => '/gcs/object/name/prefix'
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
GitLab supports all [available parameters](https://docs.docker.com/registry/storage-drivers/gcs/).
|
||||
|
||||
{{< /tab >}}
|
||||
|
||||
{{< /tabs >}}
|
||||
|
||||
#### Self-compiled installations
|
||||
|
||||
|
|
|
|||
|
|
@ -93,6 +93,8 @@ The following endpoints are available for CI/CD job tokens.
|
|||
| None | | `GET /group/:id/-/packages/composer/p/:sha` | Composer packages endpoint at group level for packages list |
|
||||
| None | | `GET /group/:id/-/packages/composer/p2/*package_name` | Composer v2 packages p2 endpoint at group level for package versions metadata |
|
||||
| None | | `GET /group/:id/-/packages/composer/packages` | Composer packages endpoint at group level |
|
||||
| None | | `GET /groups/:id/-/packages/npm/*package_name` | NPM registry metadata endpoint |
|
||||
| None | | `GET /groups/:id/-/packages/pypi/files/:sha256/*file_identifier` | Download a package file from a group |
|
||||
| None | | `GET /groups/:id/-/packages/pypi/simple/*package_name` | The PyPi Simple Group Package Endpoint |
|
||||
| None | | `GET /groups/:id/-/packages/pypi/simple` | The PyPi Simple Group Index Endpoint |
|
||||
| None | | `GET /job/allowed_agents` | Get current agents |
|
||||
|
|
@ -101,6 +103,7 @@ The following endpoints are available for CI/CD job tokens.
|
|||
| None | | `GET /packages/conan/v1/ping` | Ping the Conan API |
|
||||
| None | | `GET /packages/conan/v1/users/authenticate` | Authenticate user against conan CLI |
|
||||
| None | | `GET /packages/conan/v1/users/check_credentials` | Check for valid user credentials per conan CLI |
|
||||
| None | | `GET /packages/npm/*package_name` | NPM registry metadata endpoint |
|
||||
| None | | `GET /projects/:id/packages/conan/v1/conans/search` | Search for packages |
|
||||
| None | | `GET /projects/:id/packages/conan/v1/ping` | Ping the Conan API |
|
||||
| None | | `GET /projects/:id/packages/conan/v1/users/authenticate` | Authenticate user against conan CLI |
|
||||
|
|
@ -140,9 +143,7 @@ The following endpoints are available for CI/CD job tokens.
|
|||
| Packages: Read and write | `ADMIN_PACKAGES` | `PUT /projects/:id/packages/npm/-/package/*package_name/dist-tags/:tag` | Create or Update the given tag for the given NPM package and version |
|
||||
| Packages: Read and write | `ADMIN_PACKAGES` | `PUT /projects/:id/packages/npm/:package_name` | Create or deprecate NPM package |
|
||||
| Packages: Read | `READ_PACKAGES` | `GET /groups/:id/-/packages/maven/*path/:file_name` | Download the maven package file at a group level |
|
||||
| Packages: Read | `READ_PACKAGES` | `GET /groups/:id/-/packages/npm/*package_name` | NPM registry metadata endpoint |
|
||||
| Packages: Read | `READ_PACKAGES` | `GET /groups/:id/-/packages/npm/-/package/*package_name/dist-tags` | Get all tags for a given an NPM package |
|
||||
| Packages: Read | `READ_PACKAGES` | `GET /groups/:id/-/packages/pypi/files/:sha256/*file_identifier` | Download a package file from a group |
|
||||
| Packages: Read | `READ_PACKAGES` | `GET /packages/conan/v1/conans/:package_name/:package_version/:package_username/:package_channel/digest` | Recipe Digest |
|
||||
| Packages: Read | `READ_PACKAGES` | `GET /packages/conan/v1/conans/:package_name/:package_version/:package_username/:package_channel/download_urls` | Recipe Download Urls |
|
||||
| Packages: Read | `READ_PACKAGES` | `GET /packages/conan/v1/conans/:package_name/:package_version/:package_username/:package_channel/packages/:conan_package_reference/digest` | Package Digest |
|
||||
|
|
@ -152,7 +153,6 @@ The following endpoints are available for CI/CD job tokens.
|
|||
| Packages: Read | `READ_PACKAGES` | `GET /packages/conan/v1/files/:package_name/:package_version/:package_username/:package_channel/:recipe_revision/export/:file_name` | Download recipe files |
|
||||
| Packages: Read | `READ_PACKAGES` | `GET /packages/conan/v1/files/:package_name/:package_version/:package_username/:package_channel/:recipe_revision/package/:conan_package_reference/:package_revision/:file_name` | Download package files |
|
||||
| Packages: Read | `READ_PACKAGES` | `GET /packages/maven/*path/:file_name` | Download the maven package file at instance level |
|
||||
| Packages: Read | `READ_PACKAGES` | `GET /packages/npm/*package_name` | NPM registry metadata endpoint |
|
||||
| Packages: Read | `READ_PACKAGES` | `GET /packages/npm/-/package/*package_name/dist-tags` | Get all tags for a given an NPM package |
|
||||
| Packages: Read | `READ_PACKAGES` | `GET /projects/:id/packages/:package_id/package_files` | List package files |
|
||||
| Packages: Read | `READ_PACKAGES` | `GET /projects/:id/packages/:package_id/pipelines` | Get the pipelines for a single project package |
|
||||
|
|
|
|||
|
|
@ -170,7 +170,7 @@ When writing a merge request there are some important things to be aware of:
|
|||
- The MRs that you create on GitLab are available to the public. This means you can add a link to MRs you are particularly proud of to your portfolio page when looking for a job.
|
||||
- Since an MR is a technical document, you should try to implement a technical writing style.
|
||||
If you don’t know what that is, here is a highly recommended short course from [Google on Technical writing](https://developers.google.com/tech-writing/one).
|
||||
If you are also contributing to the documentation at GitLab, there is a [Technical Writing Fundamentals course available here from GitLab](https://handbook.gitlab.com/handbook/product/ux/technical-writing/fundamentals/).
|
||||
If you are also contributing to the documentation at GitLab, there is a [Technical Writing Fundamentals course available here from GitLab](https://university.gitlab.com/courses/gitlab-technical-writing-fundamentals).
|
||||
|
||||
## Live coding
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,78 @@
|
|||
---
|
||||
stage: Create
|
||||
group: Code Review
|
||||
info: Any user with at least the Maintainer role can merge updates to this content. For details, see https://docs.gitlab.com/ee/development/development_processes.html#development-guidelines-review.
|
||||
title: Keep-around ref usage guidelines
|
||||
---
|
||||
|
||||
## What are keep-around refs
|
||||
|
||||
Keep-around refs protect specific commits from the Git garbage collection process. While Git GC
|
||||
normally removes unreferenced commits (those not reachable through branches or tags), there are cases
|
||||
where preserving these orphaned commits is essential - such as maintaining commit comments and CI build
|
||||
history. By creating a keep-around ref, we ensure these commits remain in the repository even when
|
||||
they're no longer part of the active branch history.
|
||||
|
||||
For more information about developing with Git references on Gitaly, see
|
||||
[Git references used by Gitaly](../../development/gitaly.md#git-references-used-by-gitaly).
|
||||
|
||||
## Downsides of keep-around refs
|
||||
|
||||
Keeping the orphaned commits using keep-around refs comes with its own set of challenges.
|
||||
|
||||
- Its growth is untenable (`gitlab-org/gitlab` has about 1.2 GB of refs)
|
||||
- The actual usage of these keep-around refs is spread across so it's hard to know exactly where
|
||||
these keep-around refs are expected to exist
|
||||
- It's time consuming to check the needs of keep-around refs as we need to consider all possible places
|
||||
they could be referenced
|
||||
- We could be keeping more commits than necessary because the ancestors of already preserved commits
|
||||
don't have to be kept around, but it's hard to verify that and clean up efficiently
|
||||
|
||||
{{< alert type="warning" >}}
|
||||
|
||||
Due to the downsides mentioned above, we should not be adding more places where we create keep-around
|
||||
refs. Instead consider alternative options such as scoped refs
|
||||
(like `refs/merge-requests/<merge-request-iid>/head`) or avoid creating these refs altogether if at all possible.
|
||||
|
||||
{{< /alert >}}
|
||||
|
||||
## Usage
|
||||
|
||||
Following is a typical way to create a keep-around ref for the given commit SHA.
|
||||
|
||||
```ruby
|
||||
project.repository.keep_around(sha, source: self.class.name)
|
||||
```
|
||||
|
||||
This command creates a ref called `refs/keep-around/<SHA>` where <SHA> is the commit SHA that is being
|
||||
kept around. This prevents the commit SHA and all parent commits from being garbage collected as
|
||||
we now have a ref that points to the commit directly. `source` is used as a way for us to attribute
|
||||
the keep-around ref creations to specific classes.
|
||||
|
||||
## Where keep-around refs are currently created
|
||||
|
||||
Here are the places where we currently create keep-around refs.
|
||||
|
||||
- `MergeRequest#keep_around_commit(merge_commit_sha)` with the `after_save` callback
|
||||
- `MergeRequestDiff#keep_around_commits(start_commit_sha, head_commit_sha)` for both target and
|
||||
source projects with the `after_create` callback
|
||||
- `Note#keep_around_commit(commit_id)` with the `after_save` callback
|
||||
- `DraftNotes::PublishService#keep_around_commits(shas)` as it publishes draft notes in bulk and `shas`
|
||||
are from both `original_potion` and `position`
|
||||
- `DiffNote#Keep_around_commits(sha)` similar to above, but just for a single `DiffNote` with the `after_save`
|
||||
callback if it was not skipped for bulk insert
|
||||
- `Ci::Pipeline#keep_around_commits(sha, before_sha)` with the `after_create` callback
|
||||
|
||||
## Future work
|
||||
|
||||
Due to the uncontrolled growth of keep-around refs and lack of visibility,
|
||||
[Keep Around Refs Working Group](https://handbook.gitlab.com/handbook/company/working-groups/keep-around-refs/)
|
||||
is currently working to:
|
||||
|
||||
- Reduce the number of existing keep-around refs
|
||||
- Improve visibility into how and where keep-around refs are used
|
||||
- Develop alternative solutions with better scalability
|
||||
|
||||
We should avoid creating more keep-around refs whenever possible and look for alternative solutions.
|
||||
|
||||
`gitlab::keep_around::orphaned` Rake task has been created to help us to identify orphaned keep-around refs.
|
||||
|
|
@ -74,6 +74,32 @@ The [GitLab Runner Docker Machine executor](https://docs.gitlab.com/runner/execu
|
|||
|
||||
<div class="deprecation breaking-change" data-milestone="19.0">
|
||||
|
||||
### Azure storage driver for the container registry
|
||||
|
||||
<div class="deprecation-notes">
|
||||
|
||||
- Announced in GitLab <span class="milestone">17.10</span>
|
||||
- Removal in GitLab <span class="milestone">19.0</span> ([breaking change](https://docs.gitlab.com/update/terminology/#breaking-change))
|
||||
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/523096).
|
||||
|
||||
</div>
|
||||
|
||||
The legacy Azure storage driver for the container registry is deprecated in GitLab 17.10 and will be removed in GitLab 19.0. If you use Azure object storage for your container registry, you'll need to update your configuration to use the new `azure_v2` driver.
|
||||
|
||||
The `azure_v2` storage driver provides improved reliability, better performance, and uses a more maintainable codebase compared to the legacy driver. These improvements help prevent performance issues as your registry usage scales.
|
||||
|
||||
To migrate to the `azure_v2` driver:
|
||||
|
||||
1. Update your registry configuration file to use the `azure_v2` driver instead of the legacy `azure` driver.
|
||||
1. Adjust your configuration settings as needed for the new driver.
|
||||
1. Test the new configuration in a non-production environment before deploying to production.
|
||||
|
||||
For more information about updating your storage driver configuration, see [use object storage](https://docs.gitlab.com/administration/packages/container_registry/#use-object-storage).
|
||||
|
||||
</div>
|
||||
|
||||
<div class="deprecation breaking-change" data-milestone="19.0">
|
||||
|
||||
### Behavior change for protected variables and multi-project pipelines
|
||||
|
||||
<div class="deprecation-notes">
|
||||
|
|
|
|||
|
|
@ -184,6 +184,58 @@ To open the epic in full view, either:
|
|||
|
||||

|
||||
|
||||
## Prevent truncating descriptions with "Read more"
|
||||
|
||||
{{< history >}}
|
||||
|
||||
- [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/181184) in GitLab 17.10.
|
||||
|
||||
{{< /history >}}
|
||||
|
||||
<!-- When epics as work items are GA and feature flag `work_item_epics` is removed, remove the prerequisite below. -->
|
||||
|
||||
If an epic description is long, GitLab displays only part of it.
|
||||
To see the whole description, you must select **Read more**.
|
||||
This truncation makes it easier to find other elements on the page without scrolling through lengthy text.
|
||||
|
||||
Prerequisites:
|
||||
|
||||
- Your administrator must have [enabled the new look for epics](epic_work_items.md).
|
||||
|
||||
To change whether descriptions are truncated:
|
||||
|
||||
1. On an epic, in the upper-right corner, select **More actions** ({{< icon name="ellipsis_v" >}}).
|
||||
1. Toggle **Truncate descriptions** according to your preference.
|
||||
|
||||
This setting is remembered and affects all issues, tasks, epics, objectives, and key results.
|
||||
|
||||
## Hide the right sidebar
|
||||
|
||||
{{< history >}}
|
||||
|
||||
- [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/181184) in GitLab 17.10.
|
||||
|
||||
{{< /history >}}
|
||||
|
||||
<!-- When epics as work items are GA and feature flag `work_item_epics` is removed, remove the prerequisite below. -->
|
||||
|
||||
Epic attributes are shown in a sidebar to the right of the description when space allows.
|
||||
|
||||
Prerequisites:
|
||||
|
||||
- Your administrator must have [enabled the new look for epics](epic_work_items.md).
|
||||
|
||||
To hide the sidebar and increase space for the description:
|
||||
|
||||
1. On an epic, in the upper-right corner, select **More actions** ({{< icon name="ellipsis_v" >}}).
|
||||
1. Select **Hide sidebar**.
|
||||
|
||||
This setting is remembered and affects all issues, tasks, epics, objectives, and key results.
|
||||
|
||||
To show the sidebar again:
|
||||
|
||||
- Repeat the previous steps and select **Show sidebar**.
|
||||
|
||||
## Assignees
|
||||
|
||||
{{< details >}}
|
||||
|
|
|
|||
|
|
@ -118,6 +118,47 @@ To edit an OKR:
|
|||
1. Optional. To edit the description, select the edit icon ({{< icon name="pencil" >}}), make your changes, and
|
||||
select **Save**.
|
||||
|
||||
## Prevent truncating descriptions with "Read more"
|
||||
|
||||
{{< history >}}
|
||||
|
||||
- [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/181184) in GitLab 17.10.
|
||||
|
||||
{{< /history >}}
|
||||
|
||||
If an OKR description is long, GitLab displays only part of it.
|
||||
To see the whole description, you must select **Read more**.
|
||||
This truncation makes it easier to find other elements on the page without scrolling through lengthy text.
|
||||
|
||||
To change whether descriptions are truncated:
|
||||
|
||||
1. On an objective or key result, in the upper-right corner, select **More actions** ({{< icon name="ellipsis_v" >}}).
|
||||
1. Select **View options**.
|
||||
1. Toggle **Truncate descriptions** according to your preference.
|
||||
|
||||
This setting is remembered and affects all issues, tasks, epics, objectives, and key results.
|
||||
|
||||
## Hide the right sidebar
|
||||
|
||||
{{< history >}}
|
||||
|
||||
- [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/181184) in GitLab 17.10.
|
||||
|
||||
{{< /history >}}
|
||||
|
||||
Attributes are shown in a sidebar to the right of the description when space allows.
|
||||
To hide the sidebar and increase space for the description:
|
||||
|
||||
1. On an objective or key result, in the upper-right corner, select **More actions** ({{< icon name="ellipsis_v" >}}).
|
||||
1. Select **View options**.
|
||||
1. Select **Hide sidebar**.
|
||||
|
||||
This setting is remembered and affects all issues, tasks, epics, objectives, and key results.
|
||||
|
||||
To show the sidebar again:
|
||||
|
||||
- Repeat the previous steps and select **Show sidebar**.
|
||||
|
||||
## View OKR system notes
|
||||
|
||||
{{< history >}}
|
||||
|
|
|
|||
|
|
@ -16,7 +16,8 @@ title: Test a new look for issues
|
|||
{{< history >}}
|
||||
|
||||
- [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/9584) in GitLab 17.5 [with a flag](../../../administration/feature_flags.md) named `work_items_view_preference`. Disabled by default. This feature is in [beta](../../../policy/development_stages_support.md#beta).
|
||||
- Enabled on GitLab.com in GitLab 17.9 for a subset of users.
|
||||
- Feature flag named `work_items_view_preference` enabled on GitLab.com in GitLab 17.9 for a subset of users.
|
||||
- Feature flag named `work_items_view_preference` [enabled](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/184496) on GitLab Self-Managed and GitLab Dedicated in 17.10.
|
||||
|
||||
{{< /history >}}
|
||||
|
||||
|
|
|
|||
|
|
@ -504,6 +504,58 @@ Prerequisites:
|
|||
Learn how to change the default [issue closing pattern](../../../administration/issue_closing_pattern.md)
|
||||
of your installation.
|
||||
|
||||
## Prevent truncating descriptions with "Read more"
|
||||
|
||||
{{< history >}}
|
||||
|
||||
- [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/181184) in GitLab 17.10.
|
||||
|
||||
{{< /history >}}
|
||||
|
||||
<!-- When issues as work items are GA and feature flag `work_items_view_preference` is removed, remove the prerequisite below. -->
|
||||
|
||||
If an issue description is long, GitLab displays only part of it.
|
||||
To see the whole description, you must select **Read more**.
|
||||
This truncation makes it easier to find other elements on the page without scrolling through lengthy text.
|
||||
|
||||
Prerequisites:
|
||||
|
||||
- Your administrator must have [enabled the new look for issues](issue_work_items.md).
|
||||
|
||||
To change whether descriptions are truncated:
|
||||
|
||||
1. On an issue, in the upper-right corner, select **More actions** ({{< icon name="ellipsis_v" >}}).
|
||||
1. Toggle **Truncate descriptions** according to your preference.
|
||||
|
||||
This setting is remembered and affects all issues, tasks, epics, objectives, and key results.
|
||||
|
||||
## Hide the right sidebar
|
||||
|
||||
{{< history >}}
|
||||
|
||||
- [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/181184) in GitLab 17.10.
|
||||
|
||||
{{< /history >}}
|
||||
|
||||
<!-- When issues as work items are GA and feature flag `work_items_view_preference` is removed, remove the prerequisite below. -->
|
||||
|
||||
Issue attributes are shown in a sidebar to the right of the description when space allows.
|
||||
|
||||
Prerequisites:
|
||||
|
||||
- Your administrator must have [enabled the new look for issues](issue_work_items.md).
|
||||
|
||||
To hide the sidebar and increase space for the description:
|
||||
|
||||
1. On an issue, in the upper-right corner, select **More actions** ({{< icon name="ellipsis_v" >}}).
|
||||
1. Select **Hide sidebar**.
|
||||
|
||||
This setting is remembered and affects all issues, tasks, epics, objectives, and key results.
|
||||
|
||||
To show the sidebar again:
|
||||
|
||||
- Repeat the previous steps and select **Show sidebar**.
|
||||
|
||||
## Change the issue type
|
||||
|
||||
{{< history >}}
|
||||
|
|
|
|||
|
|
@ -266,7 +266,7 @@ For more information, see the history.
|
|||
|
||||
{{< /alert >}}
|
||||
|
||||
Use the imported files in your IDE to provide context about your code project. Imported file context is supported for JavaScript and TypeScript files, including [`js`], [`jsx`], [`ts`], [`tsx`], and [`vue`] file types.
|
||||
Use the imported files in your IDE to provide context about your code project. Imported file context is supported for JavaScript and TypeScript files, including `.js`, `.jsx`, `.ts`, `.tsx`, and `.vue` file types.
|
||||
|
||||
## Truncation of file content
|
||||
|
||||
|
|
|
|||
|
|
@ -499,6 +499,45 @@ You can estimate and track the time you spend on a task.
|
|||
|
||||
For more information, see [Time tracking](project/time_tracking.md).
|
||||
|
||||
## Prevent truncating descriptions with "Read more"
|
||||
|
||||
{{< history >}}
|
||||
|
||||
- [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/181184) in GitLab 17.10.
|
||||
|
||||
{{< /history >}}
|
||||
|
||||
If a task description is long, GitLab displays only part of it.
|
||||
To see the whole description, you must select **Read more**.
|
||||
This truncation makes it easier to find other elements on the page without scrolling through lengthy text.
|
||||
|
||||
To change whether descriptions are truncated:
|
||||
|
||||
1. On a task, in the upper-right corner, select **More actions** ({{< icon name="ellipsis_v" >}}).
|
||||
1. Toggle **Truncate descriptions** according to your preference.
|
||||
|
||||
This setting is remembered and affects all issues, tasks, epics, objectives, and key results.
|
||||
|
||||
## Hide the right sidebar
|
||||
|
||||
{{< history >}}
|
||||
|
||||
- [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/181184) in GitLab 17.10.
|
||||
|
||||
{{< /history >}}
|
||||
|
||||
Task attributes are shown in a sidebar to the right of the description when space allows.
|
||||
To hide the sidebar and increase space for the description:
|
||||
|
||||
1. On a task, in the upper-right corner, select **More actions** ({{< icon name="ellipsis_v" >}}).
|
||||
1. Select **Hide sidebar**.
|
||||
|
||||
This setting is remembered and affects all issues, tasks, epics, objectives, and key results.
|
||||
|
||||
To show the sidebar again:
|
||||
|
||||
- Repeat the previous steps and select **Show sidebar**.
|
||||
|
||||
## View task system notes
|
||||
|
||||
{{< history >}}
|
||||
|
|
|
|||
|
|
@ -59,8 +59,7 @@ module API
|
|||
end
|
||||
route_setting :authentication, job_token_allowed: true, deploy_token_allowed: true,
|
||||
authenticate_non_public: true
|
||||
route_setting :authorization, job_token_policies: :read_packages,
|
||||
allow_public_access_for_enabled_project_features: :package_registry
|
||||
route_setting :authorization, skip_job_token_policies: true
|
||||
get '*package_name', format: false, requirements: ::API::Helpers::Packages::Npm::NPM_ENDPOINT_REQUIREMENTS do
|
||||
package_name = declared_params[:package_name]
|
||||
packages =
|
||||
|
|
@ -81,8 +80,6 @@ module API
|
|||
target: project_or_nil,
|
||||
package_name: package_name
|
||||
) do
|
||||
authorize_job_token_policies!(project_or_nil) if project_or_nil
|
||||
|
||||
if Feature.enabled?(:npm_allow_packages_in_multiple_projects, group_or_namespace)
|
||||
available_packages_to_user = ::Packages::Npm::PackagesForUserFinder.new(
|
||||
current_user,
|
||||
|
|
|
|||
|
|
@ -1036,7 +1036,6 @@ module API
|
|||
|
||||
def job_token_policies_authorized?(project)
|
||||
return true unless current_user&.from_ci_job_token?
|
||||
return true unless Feature.enabled?(:add_policies_to_ci_job_token, project)
|
||||
return true if skip_job_token_policies?
|
||||
return true if publicly_accessible_feature?(project)
|
||||
|
||||
|
|
|
|||
|
|
@ -131,8 +131,7 @@ module API
|
|||
end
|
||||
|
||||
route_setting :authentication, deploy_token_allowed: true, basic_auth_personal_access_token: true, job_token_allowed: :basic_auth
|
||||
route_setting :authorization, job_token_policies: :read_packages,
|
||||
allow_public_access_for_enabled_project_features: :package_registry
|
||||
route_setting :authorization, skip_job_token_policies: true
|
||||
get 'files/:sha256/*file_identifier' do
|
||||
group = find_authorized_group!
|
||||
authorize_read_package!(group)
|
||||
|
|
@ -141,7 +140,6 @@ module API
|
|||
package = Packages::Pypi::PackageFinder.new(current_user, group, { filename: filename, sha256: params[:sha256] }).execute
|
||||
package_file = ::Packages::PackageFileFinder.new(package, filename, with_file_name_like: false).execute
|
||||
|
||||
authorize_job_token_policies!(package.project)
|
||||
track_package_event('pull_package', :pypi, namespace: group, project: package.project)
|
||||
|
||||
present_package_file!(package_file, supports_direct_download: true)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,10 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module Gitlab
|
||||
module BackgroundMigration
|
||||
class BackfillPackagesNugetDependencyLinkMetadataProjectId < BackfillDesiredShardingKeyJob
|
||||
operation_name :backfill_packages_nuget_dependency_link_metadata_project_id
|
||||
feature_category :package_registry
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module Gitlab
|
||||
module BackgroundMigration
|
||||
class BackfillSoftwareLicensePolicies < BatchedMigrationJob
|
||||
feature_category :security_policy_management
|
||||
|
||||
def perform; end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Gitlab::BackgroundMigration::BackfillSoftwareLicensePolicies.prepend_mod
|
||||
|
|
@ -29,18 +29,18 @@ module Gitlab
|
|||
config.key?(:include)
|
||||
end
|
||||
|
||||
# cross-project
|
||||
class CrossProjectTrigger < ::Gitlab::Config::Entry::Node
|
||||
include ::Gitlab::Config::Entry::Validatable
|
||||
include ::Gitlab::Config::Entry::Attributable
|
||||
include ::Gitlab::Config::Entry::Configurable
|
||||
|
||||
ALLOWED_KEYS = %i[project branch strategy forward].freeze
|
||||
attributes :project, :branch, :strategy
|
||||
ALLOWED_KEYS = %i[project branch strategy forward inputs].freeze
|
||||
attributes :project, :branch, :strategy, :inputs
|
||||
|
||||
validations do
|
||||
validates :config, presence: true
|
||||
validates :config, allowed_keys: ALLOWED_KEYS
|
||||
validates :inputs, type: Hash, allow_nil: true
|
||||
validates :project, type: String, presence: true
|
||||
validates :branch, type: String, allow_nil: true
|
||||
validates :strategy, type: String, inclusion: { in: %w[depend], message: 'should be depend' }, allow_nil: true
|
||||
|
|
@ -53,7 +53,8 @@ module Gitlab
|
|||
{ project: project,
|
||||
branch: branch,
|
||||
strategy: strategy,
|
||||
forward: forward_value }.compact
|
||||
forward: forward_value,
|
||||
inputs: inputs }.compact
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -785,9 +785,6 @@ msgstr ""
|
|||
msgid "%{count} of %{total}"
|
||||
msgstr ""
|
||||
|
||||
msgid "%{count} open"
|
||||
msgstr ""
|
||||
|
||||
msgid "%{count} project"
|
||||
msgid_plural "%{count} projects"
|
||||
msgstr[0] ""
|
||||
|
|
@ -5452,9 +5449,6 @@ msgstr ""
|
|||
msgid "AiPowered|Assign seats"
|
||||
msgstr ""
|
||||
|
||||
msgid "AiPowered|Beta Self-hosted models"
|
||||
msgstr ""
|
||||
|
||||
msgid "AiPowered|By turning on these features, you accept the %{linkStart}GitLab Testing Agreement%{linkEnd}."
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -5482,7 +5476,7 @@ msgstr ""
|
|||
msgid "AiPowered|Enable AI logs"
|
||||
msgstr ""
|
||||
|
||||
msgid "AiPowered|Enabling this feature is your acceptance of the %{linkStart}GitLab Testing Agreement%{linkEnd}."
|
||||
msgid "AiPowered|Enabling self-hosted beta models and features is your acceptance of the %{linkStart}GitLab Testing Agreement%{linkEnd}."
|
||||
msgstr ""
|
||||
|
||||
msgid "AiPowered|End date: %{endDate}"
|
||||
|
|
@ -5542,7 +5536,7 @@ msgstr ""
|
|||
msgid "AiPowered|Seat assignment for GitLab Duo has moved"
|
||||
msgstr ""
|
||||
|
||||
msgid "AiPowered|Self-hosted AI models"
|
||||
msgid "AiPowered|Self-hosted beta models and features"
|
||||
msgstr ""
|
||||
|
||||
msgid "AiPowered|Setting unavailable"
|
||||
|
|
@ -5560,7 +5554,7 @@ msgstr ""
|
|||
msgid "AiPowered|Turn on experiment and beta GitLab Duo features"
|
||||
msgstr ""
|
||||
|
||||
msgid "AiPowered|Use beta self-hosted models features"
|
||||
msgid "AiPowered|Use beta models and features in GitLab Duo Self-Hosted"
|
||||
msgstr ""
|
||||
|
||||
msgid "AiPowered|View GitLab Duo settings"
|
||||
|
|
@ -26177,6 +26171,9 @@ msgstr ""
|
|||
msgid "Geo|Filter by name"
|
||||
msgstr ""
|
||||
|
||||
msgid "Geo|Geo Replication - %{node_name}"
|
||||
msgstr ""
|
||||
|
||||
msgid "Geo|Geo Settings"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -40785,6 +40782,15 @@ msgstr ""
|
|||
msgid "OpenAPI Specification file path or URL"
|
||||
msgstr ""
|
||||
|
||||
msgid "OpenMrBadge|%{count} open"
|
||||
msgstr ""
|
||||
|
||||
msgid "OpenMrBadge|Open"
|
||||
msgstr ""
|
||||
|
||||
msgid "OpenMrBadge|Opened"
|
||||
msgstr ""
|
||||
|
||||
msgid "OpenSSL version 3"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -66445,6 +66451,9 @@ msgstr ""
|
|||
msgid "WorkItem|Cancel"
|
||||
msgstr ""
|
||||
|
||||
msgid "WorkItem|Change appearance for all issues, epics, and tasks"
|
||||
msgstr ""
|
||||
|
||||
msgid "WorkItem|Change type"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -66628,6 +66637,9 @@ msgstr ""
|
|||
msgid "WorkItem|Hide empty"
|
||||
msgstr ""
|
||||
|
||||
msgid "WorkItem|Hide sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "WorkItem|History only"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -66886,6 +66898,9 @@ msgstr ""
|
|||
msgid "WorkItem|Show labels"
|
||||
msgstr ""
|
||||
|
||||
msgid "WorkItem|Show sidebar"
|
||||
msgstr ""
|
||||
|
||||
msgid "WorkItem|Similar items"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -67051,6 +67066,9 @@ msgstr ""
|
|||
msgid "WorkItem|Toggle details"
|
||||
msgstr ""
|
||||
|
||||
msgid "WorkItem|Truncate descriptions"
|
||||
msgstr ""
|
||||
|
||||
msgid "WorkItem|Turn off confidentiality"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -67183,7 +67201,7 @@ msgstr ""
|
|||
msgid "Workspaces|A devfile defines the development environment for a GitLab project. A workspace must have a valid devfile in the Git reference you use."
|
||||
msgstr ""
|
||||
|
||||
msgid "Workspaces|A devfile is a file that detines a development environment by specifying the necessary tools, languages, runtimes, and other components for a GitLab project."
|
||||
msgid "Workspaces|A devfile is a file that defines a development environment by specifying the necessary tools, languages, runtimes, and other components for a GitLab project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Workspaces|A workspace is a virtual sandbox environment for your code in GitLab."
|
||||
|
|
|
|||
|
|
@ -235,6 +235,5 @@ spec/frontend/vue_shared/components/tooltip_on_truncate_spec.js
|
|||
spec/frontend/vue_shared/components/upload_dropzone/upload_dropzone_spec.js
|
||||
spec/frontend/vue_shared/directives/tooltip_on_truncate_spec.js
|
||||
spec/frontend/vue_shared/directives/track_event_spec.js
|
||||
spec/frontend/vue_shared/issuable/sidebar/components/issuable_sidebar_root_spec.js
|
||||
spec/frontend/webhooks/components/push_events_spec.js
|
||||
spec/frontend/work_items/components/work_item_description_rendered_spec.js
|
||||
|
|
|
|||
|
|
@ -62,3 +62,14 @@ trigger-include-trailing-slash:
|
|||
include:
|
||||
- file: '/path/to/child-pipeline.yml'
|
||||
project: 'slug/'
|
||||
|
||||
trigger-inputs-and-include-inputs:
|
||||
trigger:
|
||||
project: 'group/project'
|
||||
inputs:
|
||||
example: a
|
||||
include:
|
||||
- file: '/path/to/child-pipeline.yml'
|
||||
project: 'group/project'
|
||||
inputs:
|
||||
example: 'a'
|
||||
|
|
|
|||
|
|
@ -1,3 +1,9 @@
|
|||
trigger-project-inputs:
|
||||
trigger:
|
||||
project: 'group/project'
|
||||
inputs:
|
||||
example: 'a'
|
||||
|
||||
trigger-include-string:
|
||||
trigger:
|
||||
include: '/path/to/child-pipeline.yml'
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ import createMockApollo from 'helpers/mock_apollo_helper';
|
|||
import waitForPromises from 'helpers/wait_for_promises';
|
||||
import CandidateList from '~/ml/experiment_tracking/components/candidate_list.vue';
|
||||
import SearchableTable from '~/ml/model_registry/components/searchable_table.vue';
|
||||
import CandidatesTable from '~/ml/model_registry/components/candidates_table.vue';
|
||||
import getExperimentCandidates from '~/ml/experiment_tracking/graphql/queries/get_experiment_candidates.query.graphql';
|
||||
import {
|
||||
emptyCandidateQuery,
|
||||
|
|
@ -96,15 +97,19 @@ describe('ml/model_registry/components/candidate_list.vue', () => {
|
|||
});
|
||||
|
||||
it('Passes items to list', () => {
|
||||
expect(findSearchableTable().props('candidates')).toEqual(graphqlCandidates);
|
||||
expect(findSearchableTable().props('items')).toEqual(graphqlCandidates);
|
||||
});
|
||||
|
||||
it('passes CandidatesTable to table prop', () => {
|
||||
expect(findSearchableTable().props('table')).toBe(CandidatesTable);
|
||||
});
|
||||
|
||||
it('displays candidate rows', () => {
|
||||
expect(findSearchableTable().props('candidates')).toHaveLength(graphqlCandidates.length);
|
||||
expect(findSearchableTable().props('items')).toHaveLength(graphqlCandidates.length);
|
||||
});
|
||||
|
||||
it('binds the correct props', () => {
|
||||
expect(findSearchableTable().props('candidates')).toEqual(graphqlCandidates);
|
||||
expect(findSearchableTable().props('items')).toEqual(graphqlCandidates);
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ import getModelsQuery from '~/ml/model_registry/graphql/queries/get_models.query
|
|||
import * as Sentry from '~/sentry/sentry_browser_wrapper';
|
||||
import waitForPromises from 'helpers/wait_for_promises';
|
||||
import DeleteModelDisclosureDropdownItem from '~/ml/model_registry/components/delete_model_disclosure_dropdown_item.vue';
|
||||
import ModelsTable from '~/ml/model_registry/components/models_table.vue';
|
||||
import { modelsQuery, modelWithOneVersion, modelWithoutVersion } from '../graphql_mock_data';
|
||||
|
||||
Vue.use(VueApollo);
|
||||
|
|
@ -162,12 +163,16 @@ describe('ml/model_registry/apps/index_ml_models', () => {
|
|||
await createWrapper({ resolver });
|
||||
});
|
||||
|
||||
it('passes ModelsTable to table prop', () => {
|
||||
expect(findSearchableTable().props('table')).toBe(ModelsTable);
|
||||
});
|
||||
|
||||
it('calls query only once on setup', () => {
|
||||
expect(resolver).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
it('passes items to list', () => {
|
||||
expect(findSearchableTable().props('models')).toEqual([
|
||||
expect(findSearchableTable().props('items')).toEqual([
|
||||
modelWithOneVersion,
|
||||
modelWithoutVersion,
|
||||
]);
|
||||
|
|
@ -178,7 +183,7 @@ describe('ml/model_registry/apps/index_ml_models', () => {
|
|||
});
|
||||
|
||||
it('displays model rows', () => {
|
||||
expect(findSearchableTable().props('models')).toHaveLength(2);
|
||||
expect(findSearchableTable().props('items')).toHaveLength(2);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ import createMockApollo from 'helpers/mock_apollo_helper';
|
|||
import waitForPromises from 'helpers/wait_for_promises';
|
||||
import CandidateList from '~/ml/model_registry/components/candidate_list.vue';
|
||||
import SearchableTable from '~/ml/model_registry/components/searchable_table.vue';
|
||||
import CandidatesTable from '~/ml/model_registry/components/candidates_table.vue';
|
||||
import getModelCandidatesQuery from '~/ml/model_registry/graphql/queries/get_model_candidates.query.graphql';
|
||||
import { GRAPHQL_PAGE_SIZE } from '~/ml/model_registry/constants';
|
||||
import {
|
||||
|
|
@ -95,16 +96,16 @@ describe('ml/model_registry/components/candidate_list.vue', () => {
|
|||
expect(findEmptyState().exists()).toBe(false);
|
||||
});
|
||||
|
||||
it('passes CandidatesTable to table prop', () => {
|
||||
expect(findSearchableTable().props('table')).toBe(CandidatesTable);
|
||||
});
|
||||
|
||||
it('Passes items to list', () => {
|
||||
expect(findSearchableTable().props('candidates')).toEqual(graphqlCandidates);
|
||||
expect(findSearchableTable().props('items')).toEqual(graphqlCandidates);
|
||||
});
|
||||
|
||||
it('displays package version rows', () => {
|
||||
expect(findSearchableTable().props('candidates')).toHaveLength(graphqlCandidates.length);
|
||||
});
|
||||
|
||||
it('binds the correct props', () => {
|
||||
expect(findSearchableTable().props('candidates')).toEqual(graphqlCandidates);
|
||||
expect(findSearchableTable().props('items')).toHaveLength(graphqlCandidates.length);
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ import ModelVersionList from '~/ml/model_registry/components/model_version_list.
|
|||
import SearchableTable from '~/ml/model_registry/components/searchable_table.vue';
|
||||
import getModelVersionsQuery from '~/ml/model_registry/graphql/queries/get_model_versions.query.graphql';
|
||||
import EmptyState from '~/ml/model_registry/components/model_list_empty_state.vue';
|
||||
import ModelVersionsTable from '~/ml/model_registry/components/model_versions_table.vue';
|
||||
|
||||
import {
|
||||
emptyModelVersionsQuery,
|
||||
|
|
@ -117,16 +118,20 @@ describe('ModelVersionList', () => {
|
|||
await waitForPromises();
|
||||
});
|
||||
|
||||
it('passes ModelVersionTable to table prop', () => {
|
||||
expect(findSearchableTable().props('table')).toBe(ModelVersionsTable);
|
||||
});
|
||||
|
||||
it('calls query only once on setup', () => {
|
||||
expect(resolver).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
it('Passes items to table', () => {
|
||||
expect(findSearchableTable().props('modelVersions')).toEqual(graphqlModelVersions);
|
||||
expect(findSearchableTable().props('items')).toEqual(graphqlModelVersions);
|
||||
});
|
||||
|
||||
it('displays version rows', () => {
|
||||
expect(findSearchableTable().props('modelVersions')).toHaveLength(2);
|
||||
expect(findSearchableTable().props('items')).toHaveLength(2);
|
||||
});
|
||||
|
||||
it('search is displayed', () => {
|
||||
|
|
|
|||
|
|
@ -1,27 +1,23 @@
|
|||
import { GlTable } from '@gitlab/ui';
|
||||
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
|
||||
import SearchableTable from '~/ml/model_registry/components/searchable_table.vue';
|
||||
import ModelVersionsTable from '~/ml/model_registry/components/model_versions_table.vue';
|
||||
import ModelsTable from '~/ml/model_registry/components/models_table.vue';
|
||||
import CandidatesTable from '~/ml/model_registry/components/candidates_table.vue';
|
||||
import RegistrySearch from '~/vue_shared/components/registry/registry_search.vue';
|
||||
import { BASE_SORT_FIELDS } from '~/ml/model_registry/constants';
|
||||
import * as urlHelpers from '~/lib/utils/url_utility';
|
||||
import LoadOrErrorOrShow from '~/ml/model_registry/components/load_or_error_or_show.vue';
|
||||
import CandidatesTable from '~/ml/model_registry/components/candidates_table.vue';
|
||||
import { defaultPageInfo } from '../mock_data';
|
||||
import { graphqlModelVersions, graphqlModels, graphqlCandidates } from '../graphql_mock_data';
|
||||
import { graphqlCandidates } from '../graphql_mock_data';
|
||||
|
||||
describe('ml/model_registry/components/searchable_table.vue', () => {
|
||||
let wrapper;
|
||||
|
||||
const findLoadOrErrorOrShow = () => wrapper.findComponent(LoadOrErrorOrShow);
|
||||
const findModelsTable = () => wrapper.findComponent(ModelsTable);
|
||||
const findCandidatesTable = () => wrapper.findComponent(CandidatesTable);
|
||||
const findModelVersionsTable = () => wrapper.findComponent(ModelVersionsTable);
|
||||
const findSearchableTable = () => wrapper.findComponent(SearchableTable);
|
||||
const findEmptyState = () => wrapper.findByTestId('empty-state-slot');
|
||||
const findRows = () => wrapper.findComponent(GlTable);
|
||||
const findSearch = () => wrapper.findComponent(RegistrySearch);
|
||||
const findTable = () => wrapper.findByTestId('dynamicTable');
|
||||
|
||||
const expectedFirstPage = {
|
||||
after: 'eyJpZCI6IjIifQ',
|
||||
|
|
@ -37,6 +33,7 @@ describe('ml/model_registry/components/searchable_table.vue', () => {
|
|||
errorMessage: '',
|
||||
showSearch: false,
|
||||
sortableFields: [],
|
||||
table: CandidatesTable,
|
||||
};
|
||||
|
||||
const mountComponent = (props = {}) => {
|
||||
|
|
@ -71,9 +68,7 @@ describe('ml/model_registry/components/searchable_table.vue', () => {
|
|||
});
|
||||
|
||||
it('does not display registry list', () => {
|
||||
expect(findModelVersionsTable().exists()).toBe(false);
|
||||
expect(findModelsTable().exists()).toBe(false);
|
||||
expect(findCandidatesTable().exists()).toBe(false);
|
||||
expect(findTable().exists()).toBe(false);
|
||||
});
|
||||
|
||||
it('Does not display error message', () => {
|
||||
|
|
@ -97,102 +92,6 @@ describe('ml/model_registry/components/searchable_table.vue', () => {
|
|||
});
|
||||
});
|
||||
|
||||
describe('when list is loaded with modelVersions', () => {
|
||||
beforeEach(() => mountComponent({ modelVersions: graphqlModelVersions }));
|
||||
|
||||
it('displays model versions table', () => {
|
||||
expect(findModelVersionsTable().exists()).toBe(true);
|
||||
expect(findModelsTable().exists()).toBe(false);
|
||||
expect(findCandidatesTable().exists()).toBe(false);
|
||||
});
|
||||
|
||||
it('binds the right props', () => {
|
||||
expect(findSearchableTable().props()).toMatchObject({
|
||||
modelVersions: graphqlModelVersions,
|
||||
isLoading: false,
|
||||
pageInfo: defaultPageInfo,
|
||||
showSearch: false,
|
||||
sortableFields: [],
|
||||
});
|
||||
});
|
||||
|
||||
it('displays model version rows', () => {
|
||||
expect(findModelVersionsTable().props('items')).toHaveLength(2);
|
||||
});
|
||||
|
||||
it('does not display loader', () => {
|
||||
expect(findLoadOrErrorOrShow().props('isLoading')).toBe(false);
|
||||
});
|
||||
|
||||
it('does not display empty state', () => {
|
||||
expect(findEmptyState().exists()).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('when list is loaded with models', () => {
|
||||
beforeEach(() => mountComponent({ models: graphqlModels }));
|
||||
|
||||
it('displays model table', () => {
|
||||
expect(findModelsTable().exists()).toBe(true);
|
||||
expect(findModelVersionsTable().exists()).toBe(false);
|
||||
expect(findCandidatesTable().exists()).toBe(false);
|
||||
});
|
||||
|
||||
it('binds the right props', () => {
|
||||
expect(findSearchableTable().props()).toMatchObject({
|
||||
models: graphqlModels,
|
||||
isLoading: false,
|
||||
pageInfo: defaultPageInfo,
|
||||
showSearch: false,
|
||||
sortableFields: [],
|
||||
});
|
||||
});
|
||||
|
||||
it('displays model version rows', () => {
|
||||
expect(findModelsTable().props('items')).toHaveLength(1);
|
||||
});
|
||||
|
||||
it('does not display loader', () => {
|
||||
expect(findLoadOrErrorOrShow().props('isLoading')).toBe(false);
|
||||
});
|
||||
|
||||
it('does not display empty state', () => {
|
||||
expect(findEmptyState().exists()).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('when list is loaded with candidates', () => {
|
||||
beforeEach(() => mountComponent({ candidates: graphqlCandidates }));
|
||||
|
||||
it('displays candidates table', () => {
|
||||
expect(findCandidatesTable().exists()).toBe(true);
|
||||
expect(findModelVersionsTable().exists()).toBe(false);
|
||||
expect(findModelsTable().exists()).toBe(false);
|
||||
});
|
||||
|
||||
it('binds the right props', () => {
|
||||
expect(findSearchableTable().props()).toMatchObject({
|
||||
candidates: graphqlCandidates,
|
||||
isLoading: false,
|
||||
pageInfo: defaultPageInfo,
|
||||
showSearch: false,
|
||||
sortableFields: [],
|
||||
});
|
||||
});
|
||||
|
||||
it('displays candidate rows', () => {
|
||||
expect(findCandidatesTable().props('items')).toHaveLength(2);
|
||||
});
|
||||
|
||||
it('does not display loader', () => {
|
||||
expect(findLoadOrErrorOrShow().props('isLoading')).toBe(false);
|
||||
});
|
||||
|
||||
it('does not display empty state', () => {
|
||||
expect(findEmptyState().exists()).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('when user interacts with pagination', () => {
|
||||
beforeEach(() => mountComponent());
|
||||
|
||||
|
|
@ -307,4 +206,25 @@ describe('ml/model_registry/components/searchable_table.vue', () => {
|
|||
expect(wrapper.emitted('fetch-page')).toEqual([[expectedFirstPage], [expectedVariables]]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('when table is passed', () => {
|
||||
beforeEach(() => mountComponent({ component: CandidatesTable, items: graphqlCandidates }));
|
||||
it('binds the right props', () => {
|
||||
expect(findSearchableTable().props()).toMatchObject({
|
||||
items: graphqlCandidates,
|
||||
isLoading: false,
|
||||
pageInfo: defaultPageInfo,
|
||||
showSearch: false,
|
||||
sortableFields: [],
|
||||
});
|
||||
});
|
||||
|
||||
it('does not display loader', () => {
|
||||
expect(findLoadOrErrorOrShow().props('isLoading')).toBe(false);
|
||||
});
|
||||
|
||||
it('does not display empty state', () => {
|
||||
expect(findEmptyState().exists()).toBe(false);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -0,0 +1,105 @@
|
|||
import { GlBadge, GlIcon } from '@gitlab/ui';
|
||||
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
|
||||
import MergeRequestListItem from '~/repository/components/header_area/merge_request_list_item.vue';
|
||||
import { getTimeago } from '~/lib/utils/datetime/timeago_utility';
|
||||
|
||||
jest.mock('~/lib/utils/datetime/timeago_utility', () => ({
|
||||
getTimeago: jest.fn(),
|
||||
}));
|
||||
|
||||
describe('MergeRequestListItem', () => {
|
||||
let wrapper;
|
||||
const mockTimeago = {
|
||||
format: jest.fn().mockReturnValue('3 days ago'),
|
||||
};
|
||||
|
||||
const mockAssignees = [
|
||||
{ id: 'gid://gitlab/User/1', name: 'User One' },
|
||||
{ id: 'gid://gitlab/User/2', name: 'User Two' },
|
||||
];
|
||||
|
||||
const createMergeRequestMock = (overrides = {}) => ({
|
||||
id: 'gid://gitlab/MergeRequest/1',
|
||||
iid: '123',
|
||||
title: 'Test MR title',
|
||||
createdAt: '2023-01-01T00:00:00Z',
|
||||
sourceBranch: 'feature-branch',
|
||||
project: {
|
||||
fullPath: 'group/project',
|
||||
},
|
||||
assignees: {
|
||||
nodes: mockAssignees,
|
||||
},
|
||||
...overrides,
|
||||
});
|
||||
|
||||
const createComponent = (props) => {
|
||||
wrapper = shallowMountExtended(MergeRequestListItem, {
|
||||
propsData: {
|
||||
mergeRequest: createMergeRequestMock(),
|
||||
...props,
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
const findProjectInfo = () => wrapper.findByTestId('project-info');
|
||||
const findAssigneeInfo = () => wrapper.findAllByTestId('assignee-info');
|
||||
const findSourceBranchInfo = () => wrapper.findByTestId('source-branch-info');
|
||||
|
||||
beforeEach(() => {
|
||||
getTimeago.mockReturnValue(mockTimeago);
|
||||
createComponent();
|
||||
});
|
||||
|
||||
describe('rendering', () => {
|
||||
it('renders the open badge with correct text', () => {
|
||||
const badge = wrapper.findComponent(GlBadge);
|
||||
expect(badge.exists()).toBe(true);
|
||||
expect(badge.text()).toContain('Open');
|
||||
expect(badge.findComponent(GlIcon).props('name')).toBe('merge-request');
|
||||
});
|
||||
|
||||
it('renders the formatted creation time', () => {
|
||||
expect(mockTimeago.format).toHaveBeenCalledWith('2023-01-01T00:00:00Z');
|
||||
expect(wrapper.find('time').text()).toBe('3 days ago');
|
||||
});
|
||||
|
||||
it('renders the merge request title', () => {
|
||||
expect(wrapper.findByText('Test MR title').exists()).toBe(true);
|
||||
});
|
||||
|
||||
it('renders the project path and MR ID', () => {
|
||||
const projectInfo = findProjectInfo();
|
||||
expect(projectInfo.findComponent(GlIcon).props('name')).toBe('project');
|
||||
expect(projectInfo.text()).toContain('group/project !123');
|
||||
});
|
||||
|
||||
it('renders the source branch', () => {
|
||||
const branchInfo = findSourceBranchInfo();
|
||||
expect(branchInfo.findComponent(GlIcon).props('name')).toBe('branch');
|
||||
expect(branchInfo.text()).toContain('feature-branch');
|
||||
});
|
||||
});
|
||||
|
||||
describe('assignees', () => {
|
||||
it('renders all assignees', () => {
|
||||
const assigneeInfos = findAssigneeInfo();
|
||||
expect(assigneeInfos.length).toBe(2);
|
||||
|
||||
mockAssignees.forEach((mockUser, index) => {
|
||||
const assigneeText = assigneeInfos.at(index).text().trim();
|
||||
expect(assigneeText).toContain(mockUser.name);
|
||||
});
|
||||
});
|
||||
|
||||
it('handles merge requests with no assignees', () => {
|
||||
const mrWithNoAssignees = createMergeRequestMock({
|
||||
assignees: { nodes: [] },
|
||||
});
|
||||
|
||||
createComponent({ mergeRequest: mrWithNoAssignees });
|
||||
|
||||
expect(findAssigneeInfo().length).toBe(0);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
@ -21,3 +21,42 @@ export const zeroOpenMRQueryResult = jest.fn().mockResolvedValue({
|
|||
},
|
||||
},
|
||||
});
|
||||
|
||||
const mockMergeRequests = [
|
||||
{
|
||||
id: '111',
|
||||
iid: '123',
|
||||
title: 'MR 1',
|
||||
createdAt: '2020-07-07T00:00:00Z',
|
||||
assignees: { nodes: [{ name: 'root' }] },
|
||||
project: {
|
||||
id: '1',
|
||||
fullPath: 'full/path/to/project',
|
||||
},
|
||||
sourceBranch: 'main',
|
||||
},
|
||||
{
|
||||
id: '222',
|
||||
iid: '456',
|
||||
title: 'MR 2',
|
||||
createdAt: '2020-07-09T00:00:00Z',
|
||||
assignees: { nodes: [{ name: 'homer' }] },
|
||||
project: {
|
||||
id: '1',
|
||||
fullPath: 'full/path/to/project',
|
||||
},
|
||||
sourceBranch: 'main',
|
||||
},
|
||||
];
|
||||
|
||||
export const openMRsDetailResult = jest.fn().mockResolvedValue({
|
||||
data: {
|
||||
project: {
|
||||
id: '1',
|
||||
mergeRequests: {
|
||||
nodes: mockMergeRequests,
|
||||
count: 2,
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,15 +1,17 @@
|
|||
import Vue from 'vue';
|
||||
import Vue, { nextTick } from 'vue';
|
||||
import VueApollo from 'vue-apollo';
|
||||
import { shallowMount } from '@vue/test-utils';
|
||||
import { GlBadge } from '@gitlab/ui';
|
||||
import { GlBadge, GlPopover, GlSkeletonLoader } from '@gitlab/ui';
|
||||
import OpenMrBadge from '~/repository/components/header_area/open_mr_badge.vue';
|
||||
import getOpenMrCountsForBlobPath from '~/repository/queries/open_mr_counts.query.graphql';
|
||||
import getOpenMrCountsForBlobPath from '~/repository/queries/open_mr_count.query.graphql';
|
||||
import getOpenMrsForBlobPath from '~/repository/queries/open_mrs.query.graphql';
|
||||
import MergeRequestListItem from '~/repository/components/header_area/merge_request_list_item.vue';
|
||||
import { logError } from '~/lib/logger';
|
||||
import waitForPromises from 'helpers/wait_for_promises';
|
||||
import createMockApollo from 'helpers/mock_apollo_helper';
|
||||
import { useFakeDate } from 'helpers/fake_date';
|
||||
import * as Sentry from '~/sentry/sentry_browser_wrapper';
|
||||
import { openMRQueryResult, zeroOpenMRQueryResult } from './mock_data';
|
||||
import { openMRQueryResult, zeroOpenMRQueryResult, openMRsDetailResult } from './mock_data';
|
||||
|
||||
Vue.use(VueApollo);
|
||||
jest.mock('~/lib/logger');
|
||||
|
|
@ -17,16 +19,26 @@ jest.mock('~/sentry/sentry_browser_wrapper');
|
|||
|
||||
describe('OpenMrBadge', () => {
|
||||
let wrapper;
|
||||
let requestHandler;
|
||||
let openMrsCountQueryHandler;
|
||||
let openMrsQueryHandler;
|
||||
|
||||
const defaultProps = {
|
||||
projectPath: 'group/project',
|
||||
blobPath: 'path/to/file.js',
|
||||
};
|
||||
|
||||
function createComponent(props = {}, mockResolver = openMRQueryResult) {
|
||||
requestHandler = mockResolver;
|
||||
const mockApollo = createMockApollo([[getOpenMrCountsForBlobPath, mockResolver]]);
|
||||
function createComponent(
|
||||
props = {},
|
||||
mockResolver = openMRQueryResult,
|
||||
mrDetailResolver = openMRsDetailResult,
|
||||
) {
|
||||
openMrsCountQueryHandler = mockResolver;
|
||||
openMrsQueryHandler = mrDetailResolver;
|
||||
|
||||
const mockApollo = createMockApollo([
|
||||
[getOpenMrCountsForBlobPath, mockResolver],
|
||||
[getOpenMrsForBlobPath, mrDetailResolver],
|
||||
]);
|
||||
|
||||
wrapper = shallowMount(OpenMrBadge, {
|
||||
propsData: {
|
||||
|
|
@ -40,6 +52,10 @@ describe('OpenMrBadge', () => {
|
|||
});
|
||||
}
|
||||
|
||||
const findPopover = () => wrapper.findComponent(GlPopover);
|
||||
const findAllMergeRequestItems = () => wrapper.findAllComponents(MergeRequestListItem);
|
||||
const findLoader = () => wrapper.findComponent(GlSkeletonLoader);
|
||||
|
||||
describe('rendering', () => {
|
||||
it('does not render badge when query is loading', () => {
|
||||
createComponent();
|
||||
|
|
@ -52,17 +68,6 @@ describe('OpenMrBadge', () => {
|
|||
|
||||
expect(wrapper.findComponent(GlBadge).exists()).toBe(false);
|
||||
});
|
||||
|
||||
it('renders badge when when there are open MRs', async () => {
|
||||
createComponent();
|
||||
await waitForPromises();
|
||||
|
||||
const badge = wrapper.findComponent(GlBadge);
|
||||
expect(badge.exists()).toBe(true);
|
||||
expect(badge.props('variant')).toBe('success');
|
||||
expect(badge.props('icon')).toBe('merge-request');
|
||||
expect(wrapper.text()).toBe('3 open');
|
||||
});
|
||||
});
|
||||
|
||||
describe('computed properties', () => {
|
||||
|
|
@ -73,7 +78,7 @@ describe('OpenMrBadge', () => {
|
|||
});
|
||||
|
||||
it('computes queryVariables correctly', () => {
|
||||
expect(requestHandler).toHaveBeenCalledWith({
|
||||
expect(openMrsCountQueryHandler).toHaveBeenCalledWith({
|
||||
blobPath: 'path/to/file.js',
|
||||
createdAfter: '2020-06-07',
|
||||
projectPath: 'group/project',
|
||||
|
|
@ -83,17 +88,91 @@ describe('OpenMrBadge', () => {
|
|||
});
|
||||
|
||||
describe('apollo query', () => {
|
||||
it('handles apollo error correctly', async () => {
|
||||
const mockError = new Error();
|
||||
createComponent({}, jest.fn().mockRejectedValueOnce(mockError));
|
||||
await waitForPromises();
|
||||
describe('fetchOpenMrCount', () => {
|
||||
it('fetch mr count and render badge correctly', async () => {
|
||||
createComponent();
|
||||
await waitForPromises();
|
||||
|
||||
expect(wrapper.findComponent(GlBadge).exists()).toBe(false);
|
||||
expect(logError).toHaveBeenCalledWith(
|
||||
'Failed to fetch merge request count. See exception details for more information.',
|
||||
mockError,
|
||||
);
|
||||
expect(Sentry.captureException).toHaveBeenCalledWith(mockError);
|
||||
const badge = wrapper.findComponent(GlBadge);
|
||||
expect(badge.exists()).toBe(true);
|
||||
expect(badge.props('variant')).toBe('success');
|
||||
expect(badge.props('icon')).toBe('merge-request');
|
||||
expect(wrapper.text()).toBe('3 open');
|
||||
});
|
||||
|
||||
it('handles errors when fetching MR count', async () => {
|
||||
const mockError = new Error();
|
||||
createComponent({}, jest.fn().mockRejectedValueOnce(mockError));
|
||||
await waitForPromises();
|
||||
|
||||
expect(wrapper.findComponent(GlBadge).exists()).toBe(false);
|
||||
expect(logError).toHaveBeenCalledWith(
|
||||
'Failed to fetch merge request count. See exception details for more information.',
|
||||
mockError,
|
||||
);
|
||||
expect(Sentry.captureException).toHaveBeenCalledWith(mockError);
|
||||
});
|
||||
});
|
||||
|
||||
describe('fetchOpenMrs', () => {
|
||||
it('fetches MRs and updates data', async () => {
|
||||
createComponent();
|
||||
findPopover().vm.$emit('show');
|
||||
await waitForPromises();
|
||||
|
||||
expect(openMrsQueryHandler).toHaveBeenCalledWith({
|
||||
blobPath: 'path/to/file.js',
|
||||
createdAfter: '2020-06-07',
|
||||
projectPath: 'group/project',
|
||||
targetBranch: ['main'],
|
||||
});
|
||||
|
||||
expect(findAllMergeRequestItems().length).toEqual(2);
|
||||
expect(findLoader().exists()).toBe(false);
|
||||
});
|
||||
|
||||
it('handles errors when fetching MRs', async () => {
|
||||
const mockError = new Error('Failed to fetch MRs');
|
||||
const errorResolver = jest.fn().mockRejectedValue(mockError);
|
||||
|
||||
createComponent({}, openMRQueryResult, errorResolver);
|
||||
await waitForPromises();
|
||||
|
||||
findPopover().vm.$emit('show');
|
||||
await waitForPromises();
|
||||
|
||||
expect(logError).toHaveBeenCalledWith(
|
||||
'Failed to fetch merge requests. See exception details for more information.',
|
||||
mockError,
|
||||
);
|
||||
expect(Sentry.captureException).toHaveBeenCalledWith(mockError);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('popover functionality', () => {
|
||||
beforeEach(() => {
|
||||
createComponent();
|
||||
});
|
||||
|
||||
it('sets correct props on the popover', () => {
|
||||
expect(findPopover().props()).toMatchObject({
|
||||
target: 'open-mr-badge',
|
||||
boundary: 'viewport',
|
||||
placement: 'bottomleft',
|
||||
});
|
||||
});
|
||||
|
||||
it('shows skeleton loader when loading MRs', () => {
|
||||
expect(findLoader().exists()).toBe(true);
|
||||
});
|
||||
|
||||
it('calls fetchOpenMrs when popover is shown', async () => {
|
||||
await waitForPromises();
|
||||
findPopover().vm.$emit('show');
|
||||
await nextTick();
|
||||
|
||||
expect(openMrsQueryHandler).toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ describe('IssuableSidebarRoot', () => {
|
|||
|
||||
describe('when collapsing the sidebar', () => {
|
||||
it('updates "collapsed_gutter" cookie value and layout classes', async () => {
|
||||
await findToggleSidebarButton().trigger('click');
|
||||
await findToggleSidebarButton().vm.$emit('click');
|
||||
|
||||
expect(Cookies.set).toHaveBeenCalledWith(USER_COLLAPSED_GUTTER_COOKIE, true, {
|
||||
expires: 365,
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { GlDisclosureDropdown, GlModal, GlToggle, GlDisclosureDropdownItem } from '@gitlab/ui';
|
||||
import { GlDisclosureDropdown, GlModal, GlDisclosureDropdownItem } from '@gitlab/ui';
|
||||
import Vue, { nextTick } from 'vue';
|
||||
import VueApollo from 'vue-apollo';
|
||||
import namespaceWorkItemTypesQueryResponse from 'test_fixtures/graphql/work_items/namespace_work_item_types.query.graphql.json';
|
||||
|
|
@ -62,24 +62,33 @@ describe('WorkItemActions component', () => {
|
|||
const findSubmitAsSpamItem = () => wrapper.findByTestId('submit-as-spam-item');
|
||||
const findNewRelatedItemButton = () => wrapper.findByTestId('new-related-work-item');
|
||||
const findChangeTypeButton = () => wrapper.findByTestId('change-type-action');
|
||||
const findTruncationToggle = () => wrapper.findByTestId('truncation-toggle-action');
|
||||
const findSidebarToggle = () => wrapper.findByTestId('sidebar-toggle-action');
|
||||
const findReportAbuseModal = () => wrapper.findComponent(WorkItemAbuseModal);
|
||||
const findCreateWorkItemModal = () => wrapper.findComponent(CreateWorkItemModal);
|
||||
const findWorkItemChangeTypeModal = () => wrapper.findComponent(WorkItemChangeTypeModal);
|
||||
const findMoreDropdown = () => wrapper.findByTestId('work-item-actions-dropdown');
|
||||
const findMoreDropdownTooltip = () => getBinding(findMoreDropdown().element, 'gl-tooltip');
|
||||
const findDropdownItems = () => wrapper.findAll('[data-testid="work-item-actions-dropdown"] > *');
|
||||
const findDropdownItems = () =>
|
||||
wrapper.findAll(
|
||||
'[data-testid="work-item-actions-dropdown"] > *, [data-testid="work-item-actions-dropdown"] .gl-new-dropdown-item',
|
||||
);
|
||||
|
||||
const findDropdownItemsActual = () =>
|
||||
findDropdownItems().wrappers.map((x) => {
|
||||
if (x.element.tagName === 'GL-DROPDOWN-DIVIDER-STUB') {
|
||||
return { divider: true };
|
||||
}
|
||||
|
||||
if (x.element.tagName === 'GL-DISCLOSURE-DROPDOWN-GROUP-STUB') {
|
||||
return { group: true };
|
||||
}
|
||||
return {
|
||||
testId: x.attributes('data-testid'),
|
||||
text: x.text(),
|
||||
};
|
||||
});
|
||||
const findNotificationsToggle = () => wrapper.findComponent(GlToggle);
|
||||
const findNotificationsToggle = () => wrapper.findByTestId('notifications-toggle');
|
||||
const findMoveButton = () => wrapper.findByTestId('move-action');
|
||||
const findMoveModal = () => wrapper.findComponent(MoveWorkItemModal);
|
||||
|
||||
|
|
@ -170,6 +179,8 @@ describe('WorkItemActions component', () => {
|
|||
canCreateRelatedItem,
|
||||
parentId,
|
||||
projectId,
|
||||
showSidebar: true,
|
||||
truncationEnabled: true,
|
||||
},
|
||||
mocks: {
|
||||
$toast,
|
||||
|
|
@ -273,6 +284,17 @@ describe('WorkItemActions component', () => {
|
|||
testId: 'delete-action',
|
||||
text: 'Delete issue',
|
||||
},
|
||||
{
|
||||
group: true,
|
||||
},
|
||||
{
|
||||
testId: 'truncation-toggle-action',
|
||||
text: '',
|
||||
},
|
||||
{
|
||||
testId: 'sidebar-toggle-action',
|
||||
text: 'Hide sidebar',
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
|
|
@ -815,4 +837,24 @@ describe('WorkItemActions component', () => {
|
|||
expect(findMoveModal().props('visible')).toBe(false);
|
||||
});
|
||||
});
|
||||
describe('view options', () => {
|
||||
it('toggles truncation enabled', () => {
|
||||
createComponent({ workItemType: 'Task' });
|
||||
|
||||
expect(findTruncationToggle().exists()).toBe(true);
|
||||
|
||||
findTruncationToggle().vm.$emit('action');
|
||||
|
||||
expect(wrapper.emitted('toggleTruncationEnabled')).toEqual([[]]);
|
||||
});
|
||||
|
||||
it('toggles sidebar visibility', () => {
|
||||
createComponent({ workItemType: 'Task' });
|
||||
|
||||
expect(findSidebarToggle().exists()).toBe(true);
|
||||
|
||||
findSidebarToggle().vm.$emit('action');
|
||||
expect(wrapper.emitted('toggleSidebar')).toEqual([[]]);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ describe('WorkItemDescriptionRendered', () => {
|
|||
isGroup = false,
|
||||
workItemType = 'ISSUE',
|
||||
withoutHeadingAnchors = false,
|
||||
disableTruncation = false,
|
||||
enableTruncation = true,
|
||||
} = {}) => {
|
||||
wrapper = shallowMountExtended(WorkItemDescriptionRendered, {
|
||||
propsData: {
|
||||
|
|
@ -42,7 +42,7 @@ describe('WorkItemDescriptionRendered', () => {
|
|||
isGroup,
|
||||
workItemType,
|
||||
withoutHeadingAnchors,
|
||||
disableTruncation,
|
||||
enableTruncation,
|
||||
},
|
||||
provide: {
|
||||
fullPath: 'full/path',
|
||||
|
|
|
|||
|
|
@ -135,6 +135,7 @@ describe('WorkItemDetail component', () => {
|
|||
wrapper.findComponent(WorkItemCreateBranchMergeRequestSplitButton);
|
||||
const findDesignDropzone = () => wrapper.findComponent(DesignDropzone);
|
||||
const findWorkItemDetailInfo = () => wrapper.findByTestId('info-alert');
|
||||
const findShowSidebarButton = () => wrapper.findByTestId('work-item-show-sidebar-button');
|
||||
|
||||
const mockDragEvent = ({ types = ['Files'], files = [], items = [] }) => {
|
||||
return { dataTransfer: { types, files, items } };
|
||||
|
|
@ -157,6 +158,7 @@ describe('WorkItemDetail component', () => {
|
|||
workspacePermissionsHandler = workspacePermissionsAllowedHandler,
|
||||
uploadDesignMutationHandler = uploadSuccessDesignMutationHandler,
|
||||
hasLinkedItemsEpicsFeature = true,
|
||||
showSidebar = true,
|
||||
} = {}) => {
|
||||
wrapper = shallowMountExtended(WorkItemDetail, {
|
||||
apolloProvider: createMockApollo([
|
||||
|
|
@ -181,6 +183,7 @@ describe('WorkItemDetail component', () => {
|
|||
return {
|
||||
updateInProgress,
|
||||
error,
|
||||
showSidebar,
|
||||
};
|
||||
},
|
||||
provide: {
|
||||
|
|
@ -1231,4 +1234,25 @@ describe('WorkItemDetail component', () => {
|
|||
expect(findWorkItemDetailInfo().text()).toBe('Resolved all discussions.');
|
||||
});
|
||||
});
|
||||
|
||||
describe('shows sidebar based on view options', () => {
|
||||
it('when sidebar is shown based on view options', async () => {
|
||||
createComponent({ showSidebar: true });
|
||||
await waitForPromises();
|
||||
expect(findShowSidebarButton().exists()).toBe(false);
|
||||
expect(findRightSidebar().classes()).not.toContain('md:gl-hidden');
|
||||
});
|
||||
it('when sidebar is hidden based on view options', async () => {
|
||||
createComponent({ showSidebar: false });
|
||||
await waitForPromises();
|
||||
expect(findShowSidebarButton().exists()).toBe(true);
|
||||
expect(findRightSidebar().classes()).toContain('md:gl-hidden');
|
||||
});
|
||||
it('when show sidebar button is used', async () => {
|
||||
createComponent({ showSidebar: false });
|
||||
await waitForPromises();
|
||||
findShowSidebarButton().vm.$emit('click');
|
||||
expect(findRightSidebar().isVisible()).toBe(true);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -45,6 +45,8 @@ describe('WorkItemStickyHeader', () => {
|
|||
workItemState: STATE_OPEN,
|
||||
isGroup: false,
|
||||
parentId,
|
||||
showSidebar: true,
|
||||
enableTruncation: true,
|
||||
},
|
||||
provide: {
|
||||
glFeatures: {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,16 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe Gitlab::BackgroundMigration::BackfillPackagesNugetDependencyLinkMetadataProjectId,
|
||||
feature_category: :package_registry,
|
||||
schema: 20250314120526 do
|
||||
include_examples 'desired sharding key backfill job' do
|
||||
let(:batch_table) { :packages_nuget_dependency_link_metadata }
|
||||
let(:backfill_column) { :project_id }
|
||||
let(:batch_column) { :dependency_link_id }
|
||||
let(:backfill_via_table) { :packages_dependency_links }
|
||||
let(:backfill_via_column) { :project_id }
|
||||
let(:backfill_via_foreign_key) { :dependency_link_id }
|
||||
end
|
||||
end
|
||||
|
|
@ -34,7 +34,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Trigger, feature_category: :pipeline_c
|
|||
end
|
||||
end
|
||||
|
||||
context 'when trigger is a hash - cross-project' do
|
||||
context 'when trigger is for a cross-project pipeline' do
|
||||
context 'when project is a string' do
|
||||
context 'when project is a non-empty string' do
|
||||
let(:config) { { project: 'some/project' } }
|
||||
|
|
@ -92,6 +92,36 @@ RSpec.describe Gitlab::Ci::Config::Entry::Trigger, feature_category: :pipeline_c
|
|||
end
|
||||
end
|
||||
|
||||
context 'when inputs are provided' do
|
||||
let(:config) { { project: 'some/project', inputs: { security_scan: false } } }
|
||||
|
||||
describe '#valid?' do
|
||||
it { is_expected.to be_valid }
|
||||
end
|
||||
|
||||
describe '#value' do
|
||||
it 'returns a trigger configuration hash' do
|
||||
expect(subject.value)
|
||||
.to eq(project: 'some/project', inputs: { security_scan: false })
|
||||
end
|
||||
end
|
||||
|
||||
context 'when they are not a hash' do
|
||||
let(:config) { { project: 'some/project', inputs: 'string' } }
|
||||
|
||||
describe '#valid?' do
|
||||
it { is_expected.not_to be_valid }
|
||||
end
|
||||
|
||||
describe '#errors' do
|
||||
it 'returns an error about unknown config key' do
|
||||
expect(subject.errors.first)
|
||||
.to match(/cross project trigger inputs should be a hash/)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'when strategy is provided' do
|
||||
context 'when strategy is depend' do
|
||||
let(:config) { { project: 'some/project', strategy: 'depend' } }
|
||||
|
|
@ -156,7 +186,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Trigger, feature_category: :pipeline_c
|
|||
end
|
||||
end
|
||||
|
||||
context 'when trigger is a hash - parent-child' do
|
||||
context 'when trigger is for a parent-child pipeline' do
|
||||
context 'with simple include' do
|
||||
let(:config) { { include: 'path/to/config.yml' } }
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,27 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'spec_helper'
|
||||
require_migration!
|
||||
|
||||
RSpec.describe QueueBackfillSoftwareLicensePolicies, migration: :gitlab_main_cell, feature_category: :security_policy_management do
|
||||
let!(:batched_migration) { described_class::MIGRATION }
|
||||
|
||||
it 'schedules a new batched migration' do
|
||||
reversible_migration do |migration|
|
||||
migration.before -> {
|
||||
expect(batched_migration).not_to have_scheduled_batched_migration
|
||||
}
|
||||
|
||||
migration.after -> {
|
||||
expect(batched_migration).to have_scheduled_batched_migration(
|
||||
gitlab_schema: :gitlab_main,
|
||||
table_name: :software_license_policies,
|
||||
column_name: :id,
|
||||
interval: described_class::DELAY_INTERVAL,
|
||||
batch_size: described_class::BATCH_SIZE,
|
||||
sub_batch_size: described_class::SUB_BATCH_SIZE
|
||||
)
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'spec_helper'
|
||||
require_migration!
|
||||
|
||||
RSpec.describe QueueBackfillPackagesNugetDependencyLinkMetadataProjectId, feature_category: :package_registry do
|
||||
let!(:batched_migration) { described_class::MIGRATION }
|
||||
|
||||
it 'schedules a new batched migration' do
|
||||
reversible_migration do |migration|
|
||||
migration.before -> {
|
||||
expect(batched_migration).not_to have_scheduled_batched_migration
|
||||
}
|
||||
|
||||
migration.after -> {
|
||||
expect(batched_migration).to have_scheduled_batched_migration(
|
||||
table_name: :packages_nuget_dependency_link_metadata,
|
||||
column_name: :dependency_link_id,
|
||||
interval: described_class::DELAY_INTERVAL,
|
||||
batch_size: described_class::BATCH_SIZE,
|
||||
sub_batch_size: described_class::SUB_BATCH_SIZE,
|
||||
gitlab_schema: :gitlab_main_cell,
|
||||
job_arguments: [
|
||||
:project_id,
|
||||
:packages_dependency_links,
|
||||
:project_id,
|
||||
:dependency_link_id
|
||||
]
|
||||
)
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -282,7 +282,7 @@ RSpec.describe Ci::JobToken::Scope, feature_category: :continuous_integration, f
|
|||
|
||||
it { is_expected.to be(false) }
|
||||
|
||||
it_behaves_like 'not capturing job token policies'
|
||||
it_behaves_like 'capturing job token policies'
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -537,7 +537,6 @@ RSpec.describe API::PypiPackages, feature_category: :package_registry do
|
|||
describe 'GET /api/v4/groups/:id/-/packages/pypi/files/:sha256/*file_identifier' do
|
||||
let(:url) { "/groups/#{group.id}/-/packages/pypi/files/#{package.package_files.first.file_sha256}/#{package_name}-1.0.0.tar.gz" }
|
||||
|
||||
it_behaves_like 'enforcing read_packages job token policy'
|
||||
it_behaves_like 'pypi file download endpoint'
|
||||
it_behaves_like 'rejects PyPI access with unknown group id'
|
||||
it_behaves_like 'a pypi user namespace endpoint'
|
||||
|
|
|
|||
|
|
@ -162,6 +162,85 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute', feature_category
|
|||
.to change { upstream_pipeline.reload.duration }.from(nil).to(an_instance_of(Integer))
|
||||
end
|
||||
|
||||
context 'when the bridge contains `inputs` within its options' do
|
||||
let(:stub_config) { false }
|
||||
|
||||
let_it_be(:spec_inputs_config) do
|
||||
<<~YAML
|
||||
spec:
|
||||
inputs:
|
||||
stage:
|
||||
default: deploy
|
||||
suffix:
|
||||
default: job
|
||||
---
|
||||
test-$[[ inputs.suffix ]]:
|
||||
stage: $[[ inputs.stage ]]
|
||||
script: run tests
|
||||
YAML
|
||||
end
|
||||
|
||||
shared_examples 'creates a downstream pipeline with the inputs provided' do
|
||||
it 'creates the correct jobs as per input specification' do
|
||||
subject
|
||||
|
||||
expect(pipeline.builds.first.name).to eq('test-build')
|
||||
expect(pipeline.builds.first.stage).to eq('deploy')
|
||||
expect(pipeline.source_bridge).to eq bridge
|
||||
expect(bridge.reload.sourced_pipeline.pipeline).to eq pipeline
|
||||
expect(pipeline.triggered_by_pipeline).to eq upstream_pipeline
|
||||
end
|
||||
end
|
||||
|
||||
context 'when the downstream pipeline is for another project' do
|
||||
let(:trigger) do
|
||||
{
|
||||
trigger: {
|
||||
include: {
|
||||
project: downstream_project.full_path,
|
||||
file: '.gitlab-ci.yml',
|
||||
inputs: {
|
||||
stage: 'deploy',
|
||||
suffix: 'build'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
before do
|
||||
downstream_project.repository.create_file(user, '.gitlab-ci.yml', spec_inputs_config, message: 'spec inputs',
|
||||
branch_name: downstream_project.default_branch)
|
||||
end
|
||||
|
||||
it_behaves_like 'creates a downstream pipeline with the inputs provided'
|
||||
end
|
||||
|
||||
context 'when the downstream pipeline is for the same project' do
|
||||
let(:trigger) do
|
||||
{
|
||||
trigger: {
|
||||
include: {
|
||||
local: 'child-pipeline.yml',
|
||||
inputs: {
|
||||
stage: 'deploy',
|
||||
suffix: 'build'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
before do
|
||||
upstream_project.repository.create_file(user, 'child-pipeline.yml', spec_inputs_config, message: 'inputs',
|
||||
branch_name: upstream_project.default_branch)
|
||||
upstream_pipeline.update!(sha: upstream_project.commit.id)
|
||||
end
|
||||
|
||||
it_behaves_like 'creates a downstream pipeline with the inputs provided'
|
||||
end
|
||||
end
|
||||
|
||||
context 'when bridge job has already any downstream pipeline' do
|
||||
before do
|
||||
bridge.create_sourced_pipeline!(
|
||||
|
|
|
|||
|
|
@ -0,0 +1,56 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe 'Creating bridge with inputs', feature_category: :pipeline_composition do
|
||||
let_it_be(:project) { create(:project, :repository) }
|
||||
let_it_be(:user) { create(:user) }
|
||||
|
||||
let_it_be(:spec_inputs_config) do
|
||||
<<~YAML
|
||||
spec:
|
||||
inputs:
|
||||
stage:
|
||||
default: deploy
|
||||
suffix:
|
||||
default: job
|
||||
---
|
||||
test-$[[ inputs.suffix ]]:
|
||||
stage: $[[ inputs.stage ]]
|
||||
script: run tests
|
||||
YAML
|
||||
end
|
||||
|
||||
let_it_be(:trigger_config) do
|
||||
<<~YAML
|
||||
microservice:
|
||||
trigger:
|
||||
include:
|
||||
- local: 'child.yml'
|
||||
inputs:
|
||||
stage: 'deploy'
|
||||
suffix: 'build'
|
||||
YAML
|
||||
end
|
||||
|
||||
before_all do
|
||||
project.repository.create_file(user, '.gitlab-ci.yml', trigger_config, message: 'spec inputs',
|
||||
branch_name: 'master')
|
||||
project.repository.create_file(user, 'child.yml', spec_inputs_config, message: 'spec inputs',
|
||||
branch_name: 'master')
|
||||
project.add_maintainer(user)
|
||||
end
|
||||
|
||||
context 'when a trigger job contains inputs', :sidekiq_inline do
|
||||
it 'creates a pipeline with a trigger job containing the inputs' do
|
||||
response = ::Ci::CreatePipelineService.new(project, user, { ref: project.default_branch }).execute(:push)
|
||||
pipeline = response.payload
|
||||
bridge = pipeline.bridges.first
|
||||
|
||||
expect(response).to be_success
|
||||
expect(bridge.status).to eq('success')
|
||||
expect(bridge.name).to eq('microservice')
|
||||
expect(bridge.options.dig(:trigger, :include).first[:inputs]).to eq({ stage: 'deploy', suffix: 'build' })
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -9,15 +9,13 @@ RSpec.shared_examples 'enforcing job token policies' do |policies, expected_succ
|
|||
let(:target_job) { create(:ci_build, :running, user: job_user) }
|
||||
let(:allowed_policies) { Array(policies) }
|
||||
let(:default_permissions) { false }
|
||||
let(:skip_allowlist_creation) { false }
|
||||
let!(:features_state) do
|
||||
source_project.project_feature.attributes
|
||||
.slice(*::ProjectFeature::FEATURES.map { |feature| "#{feature}_access_level" })
|
||||
end
|
||||
|
||||
before do
|
||||
# Make all project features private
|
||||
enable_project_features(source_project, nil)
|
||||
|
||||
let!(:allowlist) do
|
||||
create(:ci_job_token_project_scope_link,
|
||||
source_project: source_project,
|
||||
target_project: target_job.project,
|
||||
|
|
@ -27,6 +25,11 @@ RSpec.shared_examples 'enforcing job token policies' do |policies, expected_succ
|
|||
)
|
||||
end
|
||||
|
||||
before do
|
||||
# Make all project features private
|
||||
enable_project_features(source_project, nil)
|
||||
end
|
||||
|
||||
after do
|
||||
# Reinstate the initial project features
|
||||
source_project.project_feature.update!(features_state)
|
||||
|
|
@ -39,6 +42,22 @@ RSpec.shared_examples 'enforcing job token policies' do |policies, expected_succ
|
|||
|
||||
it { is_expected.to have_gitlab_http_status(expected_success_status) }
|
||||
|
||||
context 'when the target project is not allowlisted and job token policies are disabled' do
|
||||
# We only want to enforce job token permissions for endpoints which are enforced by allowlists.
|
||||
# This test makes sure that endpoints for which we want to enable job token permissions
|
||||
# are denied access when an allowlist entry is missing.
|
||||
let(:allowlist) { nil }
|
||||
|
||||
before do
|
||||
stub_feature_flags(add_policies_to_ci_job_token: false)
|
||||
end
|
||||
|
||||
it 'denies access' do
|
||||
expect(do_request).to have_gitlab_http_status(:forbidden)
|
||||
.or have_gitlab_http_status(:not_found)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when the policies are not allowed' do
|
||||
let(:allowed_policies) { [] }
|
||||
|
||||
|
|
|
|||
|
|
@ -80,7 +80,7 @@ RSpec.shared_examples 'work item drawer' do
|
|||
|
||||
it 'shows toggle as on then as off as user toggles to subscribe and unsubscribe', :aggregate_failures do
|
||||
within_testid('notifications-toggle-form') do
|
||||
subscription_button = find('[data-testid="toggle-wrapper"] button')
|
||||
subscription_button = find('[data-testid="notifications-toggle"] button')
|
||||
|
||||
expect(page).not_to have_css("button.is-checked")
|
||||
|
||||
|
|
|
|||
|
|
@ -131,9 +131,14 @@ RSpec.shared_examples 'handling get metadata requests' do |scope: :project|
|
|||
end
|
||||
end
|
||||
|
||||
it_behaves_like 'enforcing job token policies', :read_packages,
|
||||
allow_public_access_for_enabled_project_features: :package_registry do
|
||||
let(:headers) { build_token_auth_header(target_job.token) }
|
||||
context 'with a project namespace' do
|
||||
# The `if: scope == :project` modifier doesn't work as expected, so do this instead.
|
||||
if scope == :project
|
||||
it_behaves_like 'enforcing job token policies', :read_packages,
|
||||
allow_public_access_for_enabled_project_features: :package_registry do
|
||||
let(:headers) { build_token_auth_header(target_job.token) }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'with a group namespace' do
|
||||
|
|
|
|||
Binary file not shown.
101
workhorse/go.mod
101
workhorse/go.mod
|
|
@ -1,12 +1,12 @@
|
|||
module gitlab.com/gitlab-org/gitlab/workhorse
|
||||
|
||||
go 1.22
|
||||
go 1.23.0
|
||||
|
||||
toolchain go1.22.6
|
||||
toolchain go1.23.2
|
||||
|
||||
require (
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0
|
||||
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.4.1
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0
|
||||
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.0
|
||||
github.com/BurntSushi/toml v1.4.0
|
||||
github.com/alecthomas/chroma/v2 v2.14.0
|
||||
github.com/aws/aws-sdk-go-v2 v1.32.3
|
||||
|
|
@ -23,40 +23,44 @@ require (
|
|||
github.com/johannesboyne/gofakes3 v0.0.0-20240701191259-edd0227ffc37
|
||||
github.com/jpillora/backoff v1.0.0
|
||||
github.com/mitchellh/copystructure v1.2.0
|
||||
github.com/prometheus/client_golang v1.20.5
|
||||
github.com/prometheus/client_golang v1.21.1
|
||||
github.com/redis/go-redis/v9 v9.7.0
|
||||
github.com/sebest/xff v0.0.0-20210106013422-671bd2870b3a
|
||||
github.com/sirupsen/logrus v1.9.3
|
||||
github.com/stretchr/testify v1.9.0
|
||||
gitlab.com/gitlab-org/gitaly/v16 v16.11.10
|
||||
gitlab.com/gitlab-org/labkit v1.21.2
|
||||
github.com/stretchr/testify v1.10.0
|
||||
gitlab.com/gitlab-org/gitaly/v16 v16.11.0-rc1.0.20250313033925-4cbd999aaf5d
|
||||
gitlab.com/gitlab-org/labkit v1.22.0
|
||||
go.uber.org/goleak v1.3.0
|
||||
gocloud.dev v0.40.0
|
||||
gocloud.dev v0.40.1-0.20241107185025-56954848c3aa
|
||||
golang.org/x/image v0.20.0
|
||||
golang.org/x/net v0.33.0
|
||||
golang.org/x/oauth2 v0.23.0
|
||||
golang.org/x/net v0.35.0
|
||||
golang.org/x/oauth2 v0.24.0
|
||||
google.golang.org/grpc v1.67.1
|
||||
google.golang.org/protobuf v1.35.1
|
||||
google.golang.org/protobuf v1.36.5
|
||||
)
|
||||
|
||||
require (
|
||||
cloud.google.com/go v0.115.0 // indirect
|
||||
cloud.google.com/go/auth v0.8.1 // indirect
|
||||
cel.dev/expr v0.19.1 // indirect
|
||||
cloud.google.com/go v0.115.1 // indirect
|
||||
cloud.google.com/go/auth v0.9.3 // indirect
|
||||
cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect
|
||||
cloud.google.com/go/compute/metadata v0.5.0 // indirect
|
||||
cloud.google.com/go/iam v1.1.13 // indirect
|
||||
cloud.google.com/go/monitoring v1.20.4 // indirect
|
||||
cloud.google.com/go/compute/metadata v0.5.1 // indirect
|
||||
cloud.google.com/go/iam v1.2.1 // indirect
|
||||
cloud.google.com/go/monitoring v1.21.0 // indirect
|
||||
cloud.google.com/go/profiler v0.1.0 // indirect
|
||||
cloud.google.com/go/storage v1.43.0 // indirect
|
||||
cloud.google.com/go/trace v1.10.12 // indirect
|
||||
cloud.google.com/go/storage v1.44.0 // indirect
|
||||
cloud.google.com/go/trace v1.11.0 // indirect
|
||||
contrib.go.opencensus.io/exporter/stackdriver v0.13.14 // indirect
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0 // indirect
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 // indirect
|
||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect
|
||||
github.com/Azure/go-autorest v14.2.0+incompatible // indirect
|
||||
github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect
|
||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect
|
||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2 // indirect
|
||||
github.com/DataDog/datadog-go v4.4.0+incompatible // indirect
|
||||
github.com/DataDog/sketches-go v1.0.0 // indirect
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.1 // indirect
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 // indirect
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 // indirect
|
||||
github.com/Microsoft/go-winio v0.6.1 // indirect
|
||||
github.com/aws/aws-sdk-go v1.55.5 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6 // indirect
|
||||
|
|
@ -73,13 +77,18 @@ require (
|
|||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/sts v1.32.3 // indirect
|
||||
github.com/aws/smithy-go v1.22.0 // indirect
|
||||
github.com/beevik/ntp v1.3.1 // indirect
|
||||
github.com/beorn7/perks v1.0.1 // indirect
|
||||
github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect
|
||||
github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d // indirect
|
||||
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
||||
github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 // indirect
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
||||
github.com/dgraph-io/badger/v4 v4.6.0 // indirect
|
||||
github.com/dgraph-io/ristretto/v2 v2.1.0 // indirect
|
||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
|
||||
github.com/dustin/go-humanize v1.0.1 // indirect
|
||||
github.com/envoyproxy/go-control-plane v0.13.0 // indirect
|
||||
github.com/envoyproxy/protoc-gen-validate v1.1.0 // indirect
|
||||
github.com/felixge/httpsnoop v1.0.4 // indirect
|
||||
github.com/go-logr/logr v1.4.2 // indirect
|
||||
github.com/go-logr/stdr v1.2.2 // indirect
|
||||
|
|
@ -87,17 +96,18 @@ require (
|
|||
github.com/gogo/protobuf v1.3.2 // indirect
|
||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
||||
github.com/golang/protobuf v1.5.4 // indirect
|
||||
github.com/google/flatbuffers v25.2.10+incompatible // indirect
|
||||
github.com/google/pprof v0.0.0-20240711041743-f6c9dda6c6da // indirect
|
||||
github.com/google/s2a-go v0.1.8 // indirect
|
||||
github.com/google/uuid v1.6.0 // indirect
|
||||
github.com/google/wire v0.6.0 // indirect
|
||||
github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
|
||||
github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect
|
||||
github.com/googleapis/gax-go/v2 v2.13.0 // indirect
|
||||
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect
|
||||
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.0 // indirect
|
||||
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.1 // indirect
|
||||
github.com/hashicorp/yamux v0.1.2-0.20220728231024-8f49b6f63f18 // indirect
|
||||
github.com/jmespath/go-jmespath v0.4.0 // indirect
|
||||
github.com/klauspost/compress v1.17.9 // indirect
|
||||
github.com/klauspost/compress v1.18.0 // indirect
|
||||
github.com/kylelemons/godebug v1.1.0 // indirect
|
||||
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20210210170715-a8dfcb80d3a7 // indirect
|
||||
github.com/lightstep/lightstep-tracer-go v0.25.0 // indirect
|
||||
|
|
@ -109,10 +119,11 @@ require (
|
|||
github.com/philhofer/fwd v1.1.1 // indirect
|
||||
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||||
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
|
||||
github.com/prometheus/client_model v0.6.1 // indirect
|
||||
github.com/prometheus/common v0.55.0 // indirect
|
||||
github.com/prometheus/common v0.62.0 // indirect
|
||||
github.com/prometheus/procfs v0.15.1 // indirect
|
||||
github.com/prometheus/prometheus v0.54.0 // indirect
|
||||
github.com/ryszard/goskiplist v0.0.0-20150312221310-2dfbae5fcf46 // indirect
|
||||
|
|
@ -125,25 +136,31 @@ require (
|
|||
github.com/uber/jaeger-lib v2.4.1+incompatible // indirect
|
||||
github.com/yusufpapurcu/wmi v1.2.2 // indirect
|
||||
gitlab.com/gitlab-org/go/reopen v1.0.0 // indirect
|
||||
go.etcd.io/etcd/raft/v3 v3.5.18 // indirect
|
||||
go.opencensus.io v0.24.0 // indirect
|
||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect
|
||||
go.opentelemetry.io/otel v1.28.0 // indirect
|
||||
go.opentelemetry.io/otel/metric v1.28.0 // indirect
|
||||
go.opentelemetry.io/otel/trace v1.28.0 // indirect
|
||||
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
|
||||
go.opentelemetry.io/contrib/detectors/gcp v1.29.0 // indirect
|
||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 // indirect
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect
|
||||
go.opentelemetry.io/otel v1.34.0 // indirect
|
||||
go.opentelemetry.io/otel/metric v1.34.0 // indirect
|
||||
go.opentelemetry.io/otel/sdk v1.34.0 // indirect
|
||||
go.opentelemetry.io/otel/sdk/metric v1.29.0 // indirect
|
||||
go.opentelemetry.io/otel/trace v1.34.0 // indirect
|
||||
go.uber.org/atomic v1.11.0 // indirect
|
||||
golang.org/x/crypto v0.31.0 // indirect
|
||||
golang.org/x/mod v0.20.0 // indirect
|
||||
golang.org/x/sync v0.10.0 // indirect
|
||||
golang.org/x/sys v0.28.0 // indirect
|
||||
golang.org/x/text v0.21.0 // indirect
|
||||
golang.org/x/time v0.6.0 // indirect
|
||||
golang.org/x/tools v0.24.0 // indirect
|
||||
golang.org/x/crypto v0.35.0 // indirect
|
||||
golang.org/x/mod v0.22.0 // indirect
|
||||
golang.org/x/sync v0.11.0 // indirect
|
||||
golang.org/x/sys v0.31.0 // indirect
|
||||
golang.org/x/text v0.22.0 // indirect
|
||||
golang.org/x/time v0.11.0 // indirect
|
||||
golang.org/x/tools v0.27.0 // indirect
|
||||
golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect
|
||||
google.golang.org/api v0.191.0 // indirect
|
||||
google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988 // indirect
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 // indirect
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect
|
||||
google.golang.org/api v0.197.0 // indirect
|
||||
google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 // indirect
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240930140551-af27646dc61f // indirect
|
||||
google.golang.org/grpc/stats/opentelemetry v0.0.0-20240907200651-3ffb98b2c93a // indirect
|
||||
gopkg.in/DataDog/dd-trace-go.v1 v1.32.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
)
|
||||
|
|
|
|||
318
workhorse/go.sum
318
workhorse/go.sum
|
|
@ -1,3 +1,5 @@
|
|||
cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4=
|
||||
cel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=
|
||||
cloud.google.com/go v0.16.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
|
|
@ -24,10 +26,10 @@ cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSU
|
|||
cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY=
|
||||
cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ=
|
||||
cloud.google.com/go v0.92.2/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI=
|
||||
cloud.google.com/go v0.115.0 h1:CnFSK6Xo3lDYRoBKEcAtia6VSC837/ZkJuRduSFnr14=
|
||||
cloud.google.com/go v0.115.0/go.mod h1:8jIM5vVgoAEoiVxQ/O4BFTfHqulPZgs/ufEzMcFMdWU=
|
||||
cloud.google.com/go/auth v0.8.1 h1:QZW9FjC5lZzN864p13YxvAtGUlQ+KgRL+8Sg45Z6vxo=
|
||||
cloud.google.com/go/auth v0.8.1/go.mod h1:qGVp/Y3kDRSDZ5gFD/XPUfYQ9xW1iI7q8RIRoCyBbJc=
|
||||
cloud.google.com/go v0.115.1 h1:Jo0SM9cQnSkYfp44+v+NQXHpcHqlnRJk2qxh6yvxxxQ=
|
||||
cloud.google.com/go v0.115.1/go.mod h1:DuujITeaufu3gL68/lOFIirVNJwQeyf5UXyi+Wbgknc=
|
||||
cloud.google.com/go/auth v0.9.3 h1:VOEUIAADkkLtyfr3BLa3R8Ed/j6w1jTBmARx+wb5w5U=
|
||||
cloud.google.com/go/auth v0.9.3/go.mod h1:7z6VY+7h3KUdRov5F1i8NDP5ZzWKYmEPO842BgCsmTk=
|
||||
cloud.google.com/go/auth/oauth2adapt v0.2.4 h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY=
|
||||
cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc=
|
||||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
||||
|
|
@ -36,16 +38,18 @@ cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvf
|
|||
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
|
||||
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
|
||||
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
|
||||
cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY=
|
||||
cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY=
|
||||
cloud.google.com/go/compute/metadata v0.5.1 h1:NM6oZeZNlYjiwYje+sYFjEpP0Q0zCan1bmQW/KmIrGs=
|
||||
cloud.google.com/go/compute/metadata v0.5.1/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k=
|
||||
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
||||
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
|
||||
cloud.google.com/go/iam v1.1.13 h1:7zWBXG9ERbMLrzQBRhFliAV+kjcRToDTgQT3CTwYyv4=
|
||||
cloud.google.com/go/iam v1.1.13/go.mod h1:K8mY0uSXwEXS30KrnVb+j54LB/ntfZu1dr+4zFMNbus=
|
||||
cloud.google.com/go/longrunning v0.5.12 h1:5LqSIdERr71CqfUsFlJdBpOkBH8FBCFD7P1nTWy3TYE=
|
||||
cloud.google.com/go/longrunning v0.5.12/go.mod h1:S5hMV8CDJ6r50t2ubVJSKQVv5u0rmik5//KgLO3k4lU=
|
||||
cloud.google.com/go/monitoring v1.20.4 h1:zwcViK7mT9SV0kzKqLOI3spRadvsmvw/R9z1MHNeC0E=
|
||||
cloud.google.com/go/monitoring v1.20.4/go.mod h1:v7F/UcLRw15EX7xq565N7Ae5tnYEE28+Cl717aTXG4c=
|
||||
cloud.google.com/go/iam v1.2.1 h1:QFct02HRb7H12J/3utj0qf5tobFh9V4vR6h9eX5EBRU=
|
||||
cloud.google.com/go/iam v1.2.1/go.mod h1:3VUIJDPpwT6p/amXRC5GY8fCCh70lxPygguVtI0Z4/g=
|
||||
cloud.google.com/go/logging v1.11.0 h1:v3ktVzXMV7CwHq1MBF65wcqLMA7i+z3YxbUsoK7mOKs=
|
||||
cloud.google.com/go/logging v1.11.0/go.mod h1:5LDiJC/RxTt+fHc1LAt20R9TKiUTReDg6RuuFOZ67+A=
|
||||
cloud.google.com/go/longrunning v0.6.1 h1:lOLTFxYpr8hcRtcwWir5ITh1PAKUD/sG2lKrTSYjyMc=
|
||||
cloud.google.com/go/longrunning v0.6.1/go.mod h1:nHISoOZpBcmlwbJmiVk5oDRz0qG/ZxPynEGs1iZ79s0=
|
||||
cloud.google.com/go/monitoring v1.21.0 h1:EMc0tB+d3lUewT2NzKC/hr8cSR9WsUieVywzIHetGro=
|
||||
cloud.google.com/go/monitoring v1.21.0/go.mod h1:tuJ+KNDdJbetSsbSGTqnaBvbauS5kr3Q/koy3Up6r+4=
|
||||
cloud.google.com/go/profiler v0.1.0 h1:MG/rxKC1MztRfEWMGYKFISxyZak5hNh29f0A/z2tvWk=
|
||||
cloud.google.com/go/profiler v0.1.0/go.mod h1:D7S7LV/zKbRWkOzYL1b5xytpqt8Ikd/v/yvf1/Tx2pQ=
|
||||
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
|
||||
|
|
@ -57,29 +61,35 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo
|
|||
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
|
||||
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
|
||||
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
|
||||
cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyXFs=
|
||||
cloud.google.com/go/storage v1.43.0/go.mod h1:ajvxEa7WmZS1PxvKRq4bq0tFT3vMd502JwstCcYv0Q0=
|
||||
cloud.google.com/go/trace v1.10.12 h1:GoGZv1iAXEa73HgSGNjRl2vKqp5/f2AeKqErRFXA2kg=
|
||||
cloud.google.com/go/trace v1.10.12/go.mod h1:tYkAIta/gxgbBZ/PIzFxSH5blajgX4D00RpQqCG/GZs=
|
||||
cloud.google.com/go/storage v1.44.0 h1:abBzXf4UJKMmQ04xxJf9dYM/fNl24KHoTuBjyJDX2AI=
|
||||
cloud.google.com/go/storage v1.44.0/go.mod h1:wpPblkIuMP5jCB/E48Pz9zIo2S/zD8g+ITmxKkPCITE=
|
||||
cloud.google.com/go/trace v1.11.0 h1:UHX6cOJm45Zw/KIbqHe4kII8PupLt/V5tscZUkeiJVI=
|
||||
cloud.google.com/go/trace v1.11.0/go.mod h1:Aiemdi52635dBR7o3zuc9lLjXo3BwGaChEjCa3tJNmM=
|
||||
contrib.go.opencensus.io/exporter/stackdriver v0.13.14 h1:zBakwHardp9Jcb8sQHcHpXy/0+JIb1M8KjigCJzx7+4=
|
||||
contrib.go.opencensus.io/exporter/stackdriver v0.13.14/go.mod h1:5pSSGY0Bhuk7waTHuDf4aQ8D2DrhgETRo9fy6k3Xlzc=
|
||||
dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk=
|
||||
dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
|
||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0 h1:nyQWyZvwGTvunIMxi1Y9uXkcyr+I7TeNrr/foo4Kpk8=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0/go.mod h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 h1:g0EZJwz7xkXQiZAI5xi9f3WWFYBlX1CPTrR+NDToRkQ=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0/go.mod h1:XCW7KnZet0Opnr7HccfUw1PLc4CjHqpcaxW8DHklNkQ=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0 h1:B/dfvscEQtew9dVuoxqxrUKKv8Ih2f55PydknDamU+g=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0/go.mod h1:fiPSssYvltE08HJchL04dOy+RD4hgrjph0cwGGMntdI=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.0 h1:+m0M/LFxN43KvULkDNfdXOgrjtg6UYJPFBJyuEcRCAw=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.0/go.mod h1:PwOyop78lveYMRs6oCxjiVyBdyCgIYH6XHIVZO9/SFQ=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.6.0 h1:PiSrjRPpkQNjrM8H0WwKMnZUdu1RGMtd/LdGKUrOo+c=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.6.0/go.mod h1:oDrbWx4ewMylP7xHivfgixbfGBT6APAwsSoHRKotnIc=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.4.1 h1:cf+OIKbkmMHBaC3u78AXomweqM0oxQSgBXRZf3WH4yM=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.4.1/go.mod h1:ap1dmS6vQKJxSMNiGJcq4QuUQkOynyD93gLw6MDF7ek=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.0 h1:UXT0o77lXQrikd1kgwIPQOUect7EoR/+sbP4wQKdzxM=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.0/go.mod h1:cTvi54pg19DoT07ekoeMgE/taAwNtCShVeZqA+Iv2xI=
|
||||
github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs=
|
||||
github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
|
||||
github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk=
|
||||
github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE=
|
||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU=
|
||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
|
||||
github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM=
|
||||
github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE=
|
||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2 h1:kYRSnvJju5gYVyhkij+RTJ/VR6QIUaCfWeaFm2ycsjQ=
|
||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0=
|
||||
github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
|
||||
|
|
@ -89,10 +99,20 @@ github.com/DataDog/datadog-go v4.4.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3
|
|||
github.com/DataDog/gostackparse v0.5.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM=
|
||||
github.com/DataDog/sketches-go v1.0.0 h1:chm5KSXO7kO+ywGWJ0Zs6tdmWU8PBXSbywFVciL6BG4=
|
||||
github.com/DataDog/sketches-go v1.0.0/go.mod h1:O+XkJHWk9w4hDwY2ZUDU31ZC9sNYlYo8DiFsxjYeo1k=
|
||||
github.com/HdrHistogram/hdrhistogram-go v1.1.1 h1:cJXY5VLMHgejurPjZH6Fo9rIwRGLefBGdiaENZALqrg=
|
||||
github.com/HdrHistogram/hdrhistogram-go v1.1.1/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.1 h1:pB2F2JKCj1Znmp2rwxxt1J0Fg0wezTMgWYk5Mpbi1kg=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.1/go.mod h1:itPGVDKf9cC/ov4MdvJ2QZ0khw4bfoo9jzwTJlaxy2k=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 h1:UQ0AhxogsIRZDkElkblfnwjc3IaltCm2HUMvezQaL7s=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1/go.mod h1:jyqM3eLpJ3IbIFDTKVz2rF9T/xWGW0rIriGwnz8l9Tk=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.48.1 h1:oTX4vsorBZo/Zdum6OKPA4o7544hm6smoRv1QjpTwGo=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.48.1/go.mod h1:0wEl7vrAD8mehJyohS9HZy+WyEOaQO2mJx86Cvh93kM=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 h1:8nn+rsCvTq9axyEh382S0PFLBeaFwNsT43IrPWzctRU=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1/go.mod h1:viRWSEhtMZqz1rhwmOVKkWl6SwmVowfL9O2YR5gI2PE=
|
||||
github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM=
|
||||
github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo=
|
||||
github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
|
||||
github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
|
||||
github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78=
|
||||
github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0=
|
||||
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
|
||||
github.com/alecthomas/assert/v2 v2.7.0 h1:QtqSACNS3tF7oasA8CU6A6sXZSBDqnm7RfpLl9bZqbE=
|
||||
github.com/alecthomas/assert/v2 v2.7.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
|
||||
|
|
@ -142,8 +162,6 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.32.3 h1:wVnQ6tigGsRqSWDEEyH6lSAJ9OyF
|
|||
github.com/aws/aws-sdk-go-v2/service/sts v1.32.3/go.mod h1:VZa9yTFyj4o10YGsmDO4gbQJUvvhY72fhumT8W4LqsE=
|
||||
github.com/aws/smithy-go v1.22.0 h1:uunKnWlcoL3zO7q+gG2Pk53joueEOsnNB28QdMsmiMM=
|
||||
github.com/aws/smithy-go v1.22.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
|
||||
github.com/beevik/ntp v1.3.1 h1:Y/srlT8L1yQr58kyPWFPZIxRL8ttx2SRIpVYJqZIlAM=
|
||||
github.com/beevik/ntp v1.3.1/go.mod h1:fT6PylBq86Tsq23ZMEe47b7QQrZfYBFPnpzt0a9kJxw=
|
||||
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||
|
|
@ -162,21 +180,51 @@ github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL
|
|||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
||||
github.com/cilium/ebpf v0.16.0 h1:+BiEnHL6Z7lXnlGUsXQPPAE7+kenAd4ES8MQ5min0Ok=
|
||||
github.com/cilium/ebpf v0.16.0/go.mod h1:L7u2Blt2jMM/vLAVgjxluxtBKlz3/GWjB0dMOEngfwE=
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU=
|
||||
github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA=
|
||||
github.com/cloudflare/tableflip v1.2.3 h1:8I+B99QnnEWPHOY3fWipwVKxS70LGgUsslG7CSfmHMw=
|
||||
github.com/cloudflare/tableflip v1.2.3/go.mod h1:P4gRehmV6Z2bY5ao5ml9Pd8u6kuEnlB37pUFMmv7j2E=
|
||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||
github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI=
|
||||
github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=
|
||||
github.com/containerd/cgroups/v3 v3.0.5 h1:44na7Ud+VwyE7LIoJ8JTNQOa549a8543BmzaJHo6Bzo=
|
||||
github.com/containerd/cgroups/v3 v3.0.5/go.mod h1:SA5DLYnXO8pTGYiAHXz94qvLQTKfVM5GEVisn4jpins=
|
||||
github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
|
||||
github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
|
||||
github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
|
||||
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||
github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg=
|
||||
github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/dgraph-io/badger/v4 v4.6.0 h1:acOwfOOZ4p1dPRnYzvkVm7rUk2Y21TgPVepCy5dJdFQ=
|
||||
github.com/dgraph-io/badger/v4 v4.6.0/go.mod h1:KSJ5VTuZNC3Sd+YhvVjk2nYua9UZnnTr/SkXvdtiPgI=
|
||||
github.com/dgraph-io/ristretto/v2 v2.1.0 h1:59LjpOJLNDULHh8MC4UaegN52lC4JnO2dITsie/Pa8I=
|
||||
github.com/dgraph-io/ristretto/v2 v2.1.0/go.mod h1:uejeqfYXpUomfse0+lO+13ATz4TypQYLJZzBSAemuB4=
|
||||
github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y=
|
||||
github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
|
||||
github.com/dgryski/go-minhash v0.0.0-20190315135803-ad340ca03076 h1:EB7M2v8Svo3kvIDy+P1YDE22XskDQP+TEYGzeDwPAN4=
|
||||
github.com/dgryski/go-minhash v0.0.0-20190315135803-ad340ca03076/go.mod h1:VBi0XHpFy0xiMySf6YpVbRqrupW4RprJ5QTyN+XvGSM=
|
||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
|
||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
|
||||
github.com/dlclark/regexp2 v1.11.4 h1:rPYF9/LECdNymJufQKmri9gV604RvvABwgOA8un7yAo=
|
||||
github.com/dlclark/regexp2 v1.11.4/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
|
||||
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
|
||||
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
||||
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
|
||||
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
|
||||
github.com/ekzhu/minhash-lsh v0.0.0-20190924033628-faac2c6342f8 h1:+Tje+xk1lmGKSJjYNtgCFsU1HtQzz0kCm1DFbKlvFBo=
|
||||
github.com/ekzhu/minhash-lsh v0.0.0-20190924033628-faac2c6342f8/go.mod h1:yEtCVi+QamvzjEH4U/m6ZGkALIkF2xfQnFp0BcKmIOk=
|
||||
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
|
||||
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
|
||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
||||
|
|
@ -184,7 +232,11 @@ github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5y
|
|||
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
|
||||
github.com/envoyproxy/go-control-plane v0.13.0 h1:HzkeUz1Knt+3bK+8LG1bxOO/jzWZmdxpwC51i202les=
|
||||
github.com/envoyproxy/go-control-plane v0.13.0/go.mod h1:GRaKG3dwvFoTg4nj7aXdZnvMg4d7nvT/wl9WgVXn3Q8=
|
||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||
github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM=
|
||||
github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4=
|
||||
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
|
||||
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
|
||||
github.com/fsnotify/fsnotify v1.4.3-0.20170329110642-4da3e2cfbabc/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
|
|
@ -192,10 +244,22 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo
|
|||
github.com/garyburd/redigo v1.1.1-0.20170914051019-70e1b1943d4f/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
|
||||
github.com/getsentry/raven-go v0.2.0 h1:no+xWJRb5ZI7eE8TWgIq1jLulQiIoLG0IfYxv5JYMGs=
|
||||
github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ=
|
||||
github.com/getsentry/sentry-go v0.31.1 h1:ELVc0h7gwyhnXHDouXkhqTFSO5oslsRDk0++eyE0KJ4=
|
||||
github.com/getsentry/sentry-go v0.31.1/go.mod h1:CYNcMMz73YigoHljQRG+qPF+eMq8gG72XcGN/p71BAY=
|
||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
github.com/go-enry/go-license-detector/v4 v4.3.0 h1:OFlQAVNw5FlKUjX4OuW8JOabu8MQHjTKDb9pdeNYMUw=
|
||||
github.com/go-enry/go-license-detector/v4 v4.3.0/go.mod h1:HaM4wdNxSlz/9Gw0uVOKSQS5JVFqf2Pk8xUPEn6bldI=
|
||||
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=
|
||||
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic=
|
||||
github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU=
|
||||
github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow=
|
||||
github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4=
|
||||
github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY=
|
||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||
github.com/go-gorp/gorp/v3 v3.1.0 h1:ItKF/Vbuj31dmV4jxA1qblpSwkl9g1typ24xoe70IGs=
|
||||
github.com/go-gorp/gorp/v3 v3.1.0/go.mod h1:dLEjIyyRNiXvNZ8PSmzpt1GsWAUK8kjVhEpjH8TixEw=
|
||||
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
|
||||
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
|
||||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||
|
|
@ -208,6 +272,8 @@ github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
|
|||
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
||||
github.com/go-stack/stack v1.6.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
|
||||
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||
github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
|
||||
|
|
@ -254,6 +320,8 @@ github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8l
|
|||
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q=
|
||||
github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
|
||||
github.com/google/go-cmp v0.1.1-0.20171103154506-982329095285/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
|
|
@ -267,8 +335,8 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
|
|||
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||
github.com/google/go-replayers/grpcreplay v1.3.0 h1:1Keyy0m1sIpqstQmgz307zhiJ1pV4uIlFds5weTmxbo=
|
||||
github.com/google/go-replayers/grpcreplay v1.3.0/go.mod h1:v6NgKtkijC0d3e3RW8il6Sy5sqRVUwoQa4mHOGEy8DI=
|
||||
github.com/google/go-replayers/httpreplay v1.2.0 h1:VM1wEyyjaoU53BwrOnaf9VhAyQQEEioJvFYxYcLRKzk=
|
||||
|
|
@ -309,8 +377,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
|||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/wire v0.6.0 h1:HBkoIh4BdSxoyo9PveV8giw7ZsaBOvzWKfcg/6MrVwI=
|
||||
github.com/google/wire v0.6.0/go.mod h1:F4QhpQ9EDIdJ1Mbop/NZBRB+5yrR6qg3BnctaoUk6NA=
|
||||
github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs=
|
||||
github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0=
|
||||
github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw=
|
||||
github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA=
|
||||
github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=
|
||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||
|
|
@ -321,23 +389,40 @@ github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad
|
|||
github.com/gregjones/httpcache v0.0.0-20170920190843-316c5e0ff04e/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
|
||||
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI=
|
||||
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8=
|
||||
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.0 h1:2cz5kSrxzMYHiWOBbKj8itQm+nRykkB8aMv4ThcHYHA=
|
||||
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.0/go.mod h1:w9Y7gY31krpLmrVU5ZPG9H7l9fZuRu5/3R3S3FMtVQ4=
|
||||
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.1 h1:KcFzXwzM/kGhIRHvc8jdixfIJjVzuUJdnv+5xsPutog=
|
||||
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.1/go.mod h1:qOchhhIlmRcqk/O9uCo/puJlyo07YINaIqdZfZG3Jkc=
|
||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
|
||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
|
||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4=
|
||||
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
|
||||
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
|
||||
github.com/hashicorp/hcl v0.0.0-20170914154624-68e816d1c783/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w=
|
||||
github.com/hashicorp/yamux v0.1.2-0.20220728231024-8f49b6f63f18 h1:IVujPV6DRIu1fYF4zUHrfhkngJzmYjelXa+iSUiFZSI=
|
||||
github.com/hashicorp/yamux v0.1.2-0.20220728231024-8f49b6f63f18/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ=
|
||||
github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
|
||||
github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
|
||||
github.com/hhatto/gorst v0.0.0-20181029133204-ca9f730cac5b h1:Jdu2tbAxkRouSILp2EbposIb8h4gO+2QuZEn3d9sKAc=
|
||||
github.com/hhatto/gorst v0.0.0-20181029133204-ca9f730cac5b/go.mod h1:HmaZGXHdSwQh1jnUlBGN2BeEYOHACLVGzYOXCbsLvxY=
|
||||
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
|
||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||
github.com/inconshreveable/log15 v0.0.0-20170622235902-74a0988b5f80/go.mod h1:cOaXtrgN4ScfRrD9Bre7U1thNq5RtJ8ZoP4iXVGRj6o=
|
||||
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
|
||||
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
|
||||
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo=
|
||||
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
|
||||
github.com/jackc/pgx/v5 v5.7.2 h1:mLoDLV6sonKlvjIEsV56SkWNCnuNv531l94GaIzO+XI=
|
||||
github.com/jackc/pgx/v5 v5.7.2/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ=
|
||||
github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo=
|
||||
github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
|
||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
|
||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
|
||||
github.com/jdkato/prose v1.2.1 h1:Fp3UnJmLVISmlc57BgKUzdjr0lOtjqTZicL3PaYy6cU=
|
||||
github.com/jdkato/prose v1.2.1/go.mod h1:AiRHgVagnEx2JbQRQowVBKjG0bcs/vtkGCH1dYAL1rA=
|
||||
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
|
||||
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
|
||||
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
|
||||
|
|
@ -348,10 +433,14 @@ github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2E
|
|||
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
|
||||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
||||
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
|
||||
github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4=
|
||||
github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
|
||||
github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6 h1:IsMZxCuZqKuao2vNdfD82fjjgPLfyHLpR41Z88viRWs=
|
||||
github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6/go.mod h1:3VeWNIJaW+O5xpRQbPp0Ybqu1vJd/pm7s2F473HRrkw=
|
||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
|
||||
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
|
||||
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
|
||||
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||
|
|
@ -372,13 +461,17 @@ github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2
|
|||
github.com/magiconair/properties v1.7.4-0.20170902060319-8d7837e64d3c/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||
github.com/mattn/go-colorable v0.0.10-0.20170816031813-ad5389df28cd/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
||||
github.com/mattn/go-isatty v0.0.2/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||
github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs=
|
||||
github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ=
|
||||
github.com/miekg/dns v1.1.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY=
|
||||
github.com/miekg/dns v1.1.63/go.mod h1:6NGHfjhpmr5lt3XPLuyfDJi5AXbNIPM9PY6H6sF1Nfs=
|
||||
github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
|
||||
github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
|
||||
github.com/mitchellh/mapstructure v0.0.0-20170523030023-d0303fe80992/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||
github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
|
||||
github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
|
||||
github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g=
|
||||
github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28=
|
||||
github.com/montanaflynn/stats v0.7.0 h1:r3y12KyNxj/Sb/iOE46ws+3mS1+MZca1wlHQFPsY/JU=
|
||||
github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
|
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
|
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
||||
github.com/oklog/ulid/v2 v2.0.2 h1:r4fFzBm+bv0wNKNh5eXTwU7i85y5x+uwkxCUTNVQqLc=
|
||||
|
|
@ -390,31 +483,40 @@ github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+
|
|||
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||
github.com/onsi/gomega v1.7.1 h1:K0jcRCwNQM3vFGh1ppMtDh/+7ApJrjldlX8fA0jDTLQ=
|
||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
||||
github.com/opencontainers/runtime-spec v1.2.1 h1:S4k4ryNgEpxW1dzyqffOmhI1BHYcjzU8lpJfSlR0xww=
|
||||
github.com/opencontainers/runtime-spec v1.2.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
||||
github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
||||
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
||||
github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
|
||||
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
|
||||
github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o=
|
||||
github.com/pelletier/go-toml v1.0.1-0.20170904195809-1d6b12b7cb29 h1:6P7XZEBu/ZWizC/liUX4UYm4nEAACofmSkOzY39RBxM=
|
||||
github.com/pelletier/go-toml v1.0.1-0.20170904195809-1d6b12b7cb29/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||
github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
|
||||
github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
|
||||
github.com/philhofer/fwd v1.1.1 h1:GdGcTjf5RNAxwS4QLsiMzJYj5KEvPJD3Abr261yRQXQ=
|
||||
github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
|
||||
github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4=
|
||||
github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI=
|
||||
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
|
||||
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo=
|
||||
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw=
|
||||
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
|
||||
github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=
|
||||
github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
|
||||
github.com/prometheus/client_golang v1.21.1 h1:DOvXXTqVzvkIewV/CDPFdejpMCGeMcbGCQ8YOmu+Ibk=
|
||||
github.com/prometheus/client_golang v1.21.1/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg=
|
||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
|
||||
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
|
||||
github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc=
|
||||
github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8=
|
||||
github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io=
|
||||
github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I=
|
||||
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
|
||||
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
|
||||
github.com/prometheus/prometheus v0.54.0 h1:6+VmEkohHcofl3W5LyRlhw1Lfm575w/aX6ZFyVAmzM0=
|
||||
|
|
@ -423,21 +525,31 @@ github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa
|
|||
github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw=
|
||||
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
|
||||
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
|
||||
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
|
||||
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
|
||||
github.com/rubenv/sql-migrate v1.7.1 h1:f/o0WgfO/GqNuVg+6801K/KW3WdDSupzSjDYODmiUq4=
|
||||
github.com/rubenv/sql-migrate v1.7.1/go.mod h1:Ob2Psprc0/3ggbM6wCzyYVFFuc6FyZrb2AS+ezLDFb4=
|
||||
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
|
||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||
github.com/ryszard/goskiplist v0.0.0-20150312221310-2dfbae5fcf46 h1:GHRpF1pTW19a8tTFrMLUcfWwyC0pnifVo2ClaLq+hP8=
|
||||
github.com/ryszard/goskiplist v0.0.0-20150312221310-2dfbae5fcf46/go.mod h1:uAQ5PCi+MFsC7HjREoAz1BU+Mq60+05gifQSsHSDG/8=
|
||||
github.com/sebest/xff v0.0.0-20210106013422-671bd2870b3a h1:iLcLb5Fwwz7g/DLK89F+uQBDeAhHhwdzB5fSlVdhGcM=
|
||||
github.com/sebest/xff v0.0.0-20210106013422-671bd2870b3a/go.mod h1:wozgYq9WEBQBaIJe4YZ0qTSFAMxmcwBhQH0fO0R34Z0=
|
||||
github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ=
|
||||
github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
|
||||
github.com/shabbyrobe/gocovmerge v0.0.0-20190829150210-3e036491d500/go.mod h1:+njLrG5wSeoG4Ds61rFgEzKvenR2UHbjMoDHsczxly0=
|
||||
github.com/shabbyrobe/gocovmerge v0.0.0-20230507112040-c3350d9342df h1:S77Pf5fIGMa7oSwp8SQPp7Hb4ZiI38K3RNBKD2LLeEM=
|
||||
github.com/shabbyrobe/gocovmerge v0.0.0-20230507112040-c3350d9342df/go.mod h1:dcuzJZ83w/SqN9k4eQqwKYMgmKWzg/KzJAURBhRL1tc=
|
||||
github.com/shirou/gopsutil/v3 v3.21.2/go.mod h1:ghfMypLDrFSWN2c9cDYFLHyynQ+QUht0cv/18ZqVczw=
|
||||
github.com/shirou/gopsutil/v3 v3.21.12 h1:VoGxEW2hpmz0Vt3wUvHIl9fquzYLNpVpgNNB7pGJimA=
|
||||
github.com/shirou/gopsutil/v3 v3.21.12/go.mod h1:BToYZVTlSVlfazpDDYFnsVZLaoRG+g8ufT6fPQLdJzA=
|
||||
github.com/shogo82148/go-shuffle v1.0.1 h1:4swIpHXLMAz14DE4YTgakgadpRN0n1wE1dieGnOTVFU=
|
||||
github.com/shogo82148/go-shuffle v1.0.1/go.mod h1:HQPjVgUUZ9TNgm4/K/iXRuAdhPsQrXnAGgtk/9kqbBY=
|
||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
||||
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||
github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ=
|
||||
github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo=
|
||||
github.com/spf13/afero v0.0.0-20170901052352-ee1bd8ee15a1/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
||||
github.com/spf13/afero v1.2.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
|
||||
github.com/spf13/cast v1.1.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg=
|
||||
|
|
@ -459,8 +571,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
|
|||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
github.com/tinylib/msgp v1.1.2 h1:gWmO7n0Ys2RBEb7GPYB9Ujq8Mk5p2U08lRnmMcGy6BQ=
|
||||
github.com/tinylib/msgp v1.1.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
|
||||
github.com/tklauser/go-sysconf v0.3.4/go.mod h1:Cl2c8ZRWfHD5IrfHo9VN+FX9kCFjIOyVklgXycLB6ek=
|
||||
|
|
@ -473,6 +585,8 @@ github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaO
|
|||
github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
|
||||
github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg=
|
||||
github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
|
||||
github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM=
|
||||
github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
|
||||
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
|
|
@ -481,13 +595,15 @@ github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1
|
|||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||
github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg=
|
||||
github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
|
||||
gitlab.com/gitlab-org/gitaly/v16 v16.11.10 h1:AuOHkrj0qLvHA6mnbrxIc5X9iwqRgRm9IM37gR+3n1s=
|
||||
gitlab.com/gitlab-org/gitaly/v16 v16.11.10/go.mod h1:lJizRUtXRd1SBHjNbbbL9OsGN4TiugvfRBd8bIsdWI0=
|
||||
gitlab.com/gitlab-org/gitaly/v16 v16.11.0-rc1.0.20250313033925-4cbd999aaf5d h1:vCE8Ls6yQWzizVM1YepVqbjcXlHlDaTU/ig0d+8wSpM=
|
||||
gitlab.com/gitlab-org/gitaly/v16 v16.11.0-rc1.0.20250313033925-4cbd999aaf5d/go.mod h1:i9SSlTe8PnTQoSTnLlx+FYHurZWg11BosyClhJHhdqI=
|
||||
gitlab.com/gitlab-org/go/reopen v1.0.0 h1:6BujZ0lkkjGIejTUJdNO1w56mN1SI10qcVQyQlOPM+8=
|
||||
gitlab.com/gitlab-org/go/reopen v1.0.0/go.mod h1:D6OID8YJDzEVZNYW02R/Pkj0v8gYFSIhXFTArAsBQw8=
|
||||
gitlab.com/gitlab-org/labkit v1.21.2 h1:GlFHh8OdkrIMH3Qi0ByOzva0fGYXMICsuahGpJe4KNQ=
|
||||
gitlab.com/gitlab-org/labkit v1.21.2/go.mod h1:Q++SWyCH/abH2pytnX2SU/3mrCX6aK/xKz/WpM1hLbA=
|
||||
gitlab.com/gitlab-org/labkit v1.22.0 h1:TZe7ryLX+aLEqghu4lkODABpEKS4IL3o9yIq453n2DQ=
|
||||
gitlab.com/gitlab-org/labkit v1.22.0/go.mod h1:pikea0zSNSfV3wuMrFST4REaM3yrSjnccIfMyCmlrkw=
|
||||
go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
|
||||
go.etcd.io/etcd/raft/v3 v3.5.18 h1:gueCda+9U76Lvk6rINjNc/mXalUp0u8OK5CVESDZh4I=
|
||||
go.etcd.io/etcd/raft/v3 v3.5.18/go.mod h1:XBaZHTJt3nLnpS8hMDR55Sxrq76cEC4xWYMBYSY3jcs=
|
||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
||||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
|
|
@ -497,18 +613,24 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
|
|||
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
|
||||
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
|
||||
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
|
||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 h1:9G6E0TXzGFVfTnawRzrPl83iHOAV7L8NJiR8RSGYV1g=
|
||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74=
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA=
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg=
|
||||
go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo=
|
||||
go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4=
|
||||
go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q=
|
||||
go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s=
|
||||
go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE=
|
||||
go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg=
|
||||
go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g=
|
||||
go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI=
|
||||
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
|
||||
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
|
||||
go.opentelemetry.io/contrib/detectors/gcp v1.29.0 h1:TiaiXB4DpGD3sdzNlYQxruQngn5Apwzi1X0DRhuGvDQ=
|
||||
go.opentelemetry.io/contrib/detectors/gcp v1.29.0/go.mod h1:GW2aWZNwR2ZxDLdv8OyC2G8zkRoQBuURgV7RPQgcPoU=
|
||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc=
|
||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI=
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk=
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8=
|
||||
go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
|
||||
go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
|
||||
go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
|
||||
go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
|
||||
go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A=
|
||||
go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU=
|
||||
go.opentelemetry.io/otel/sdk/metric v1.29.0 h1:K2CfmJohnRgvZ9UAj2/FhIf/okdWcNdBwe1m8xFXiSY=
|
||||
go.opentelemetry.io/otel/sdk/metric v1.29.0/go.mod h1:6zZLdCl2fkauYoZIOn/soQIDSWFmNSRcICarHfuhNJQ=
|
||||
go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
|
||||
go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE=
|
||||
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
||||
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
|
||||
|
|
@ -518,8 +640,8 @@ go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
|||
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
||||
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
|
||||
go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
|
||||
gocloud.dev v0.40.0 h1:f8LgP+4WDqOG/RXoUcyLpeIAGOcAbZrZbDQCUee10ng=
|
||||
gocloud.dev v0.40.0/go.mod h1:drz+VyYNBvrMTW0KZiBAYEdl8lbNZx+OQ7oQvdrFmSQ=
|
||||
gocloud.dev v0.40.1-0.20241107185025-56954848c3aa h1:2p0wdFRGiA+WwKE0lmKwPF0rI2clAkmPeJQD5rsfEPQ=
|
||||
gocloud.dev v0.40.1-0.20241107185025-56954848c3aa/go.mod h1:drz+VyYNBvrMTW0KZiBAYEdl8lbNZx+OQ7oQvdrFmSQ=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
|
|
@ -528,8 +650,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
|
|||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
|
||||
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
|
||||
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
|
||||
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
|
||||
golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs=
|
||||
golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||
|
|
@ -540,8 +662,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
|
|||
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
||||
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
||||
golang.org/x/exp v0.0.0-20240119083558-1b970713d09a h1:Q8/wZp0KX97QFTc2ywcOE0YRjZPVIx+MXInMzdvQqcA=
|
||||
golang.org/x/exp v0.0.0-20240119083558-1b970713d09a/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=
|
||||
golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f h1:XdNn9LlyWAhLVp6P/i8QYBW+hlyhrhei9uErw2B5GJo=
|
||||
golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f/go.mod h1:D5SMRVC3C2/4+F/DB1wZsLRnSNimn2Sp/NPsCrsv8ak=
|
||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.20.0 h1:7cVCUjQwfL18gyBJOmYvptfSHS8Fb3YUDtfLIZ7Nbpw=
|
||||
|
|
@ -574,8 +696,8 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
|||
golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
|
||||
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4=
|
||||
golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
|
||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
|
|
@ -619,8 +741,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
|||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
|
||||
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
|
||||
golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
|
||||
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
|
||||
golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
|
||||
golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
|
||||
golang.org/x/oauth2 v0.0.0-20170912212905-13449ad91cb2/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
|
|
@ -636,8 +758,8 @@ golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ
|
|||
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
|
||||
golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
||||
golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE=
|
||||
golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
||||
golang.org/x/sync v0.0.0-20170517211232-f52d1811a629/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
|
|
@ -654,8 +776,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ
|
|||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
|
||||
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
|
||||
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
|
||||
golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
|
|
@ -717,8 +839,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
|
||||
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
|
||||
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
|
|
@ -741,14 +863,14 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
|||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
|
||||
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
|
||||
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
|
||||
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
|
||||
golang.org/x/time v0.0.0-20170424234030-8be79e1e0910/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
|
||||
golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
||||
golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0=
|
||||
golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
|
|
@ -809,14 +931,16 @@ golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
|||
golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4=
|
||||
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
|
||||
golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps=
|
||||
golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
|
||||
golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
|
||||
golang.org/x/tools v0.27.0 h1:qEKojBykQkQ4EynWy4S8Weg69NumxKdn40Fce3uc/8o=
|
||||
golang.org/x/tools v0.27.0/go.mod h1:sUi0ZgbwW9ZPAq26Ekut+weQPR5eIM6GQLQ1Yjm1H0Q=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 h1:LLhsEBxRTBLuKlQxFBYUOU8xyFgXv6cOTp2HASDlsDk=
|
||||
golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
|
||||
gonum.org/v1/gonum v0.11.0 h1:f1IJhK4Km5tBJmaiJXtk/PkL4cdVX6J+tGiM187uT5E=
|
||||
gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA=
|
||||
google.golang.org/api v0.0.0-20170921000349-586095a6e407/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
|
||||
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
||||
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
|
||||
|
|
@ -844,8 +968,8 @@ google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtuk
|
|||
google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw=
|
||||
google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU=
|
||||
google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k=
|
||||
google.golang.org/api v0.191.0 h1:cJcF09Z+4HAB2t5qTQM1ZtfL/PemsLFkcFG67qq2afk=
|
||||
google.golang.org/api v0.191.0/go.mod h1:tD5dsFGxFza0hnQveGfVk9QQYKcfp+VzgRqyXFxE0+E=
|
||||
google.golang.org/api v0.197.0 h1:x6CwqQLsFiA5JKAiGyGBjc2bNtHtLddhJCE2IKuhhcQ=
|
||||
google.golang.org/api v0.197.0/go.mod h1:AuOuo20GoQ331nq7DquGHlU6d+2wN2fZ8O0ta60nRNw=
|
||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
|
|
@ -906,12 +1030,12 @@ google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm
|
|||
google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
|
||||
google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
|
||||
google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w=
|
||||
google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988 h1:CT2Thj5AuPV9phrYMtzX11k+XkzMGfRAet42PmoTATM=
|
||||
google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988/go.mod h1:7uvplUBj4RjHAxIZ//98LzOvrQ04JBkaixRmCMI29hc=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 h1:wKguEg1hsxI2/L3hUYrpo1RVi48K+uTyzKqprwLXsb8=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142/go.mod h1:d6be+8HhtEtucleCbxpPW9PA9XwISACu8nvpPqF0BVo=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=
|
||||
google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 h1:BulPr26Jqjnd4eYDVe+YvyR7Yc2vJGkO5/0UxD0/jZU=
|
||||
google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:hL97c3SYopEHblzpxRL4lSs523++l8DYxGM1FQiYmb4=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240930140551-af27646dc61f h1:cUMEy+8oS78BWIH9OWazBkzbr090Od9tWBNtZHkOhf0=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240930140551-af27646dc61f/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=
|
||||
google.golang.org/grpc v1.2.1-0.20170921194603-d4b75ebd4f9f/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||
|
|
@ -941,6 +1065,8 @@ google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnD
|
|||
google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E=
|
||||
google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA=
|
||||
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
|
||||
google.golang.org/grpc/stats/opentelemetry v0.0.0-20240907200651-3ffb98b2c93a h1:UIpYSuWdWHSzjwcAFRLjKcPXFZVVLXGEM23W+NWqipw=
|
||||
google.golang.org/grpc/stats/opentelemetry v0.0.0-20240907200651-3ffb98b2c93a/go.mod h1:9i1T9n4ZinTUZGgzENMi8MDDgbGC5mqTS75JAv6xN3A=
|
||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||
|
|
@ -954,8 +1080,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba
|
|||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
|
||||
google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
|
||||
google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
|
||||
google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
|
||||
gopkg.in/DataDog/dd-trace-go.v1 v1.32.0 h1:DkD0plWEVUB8v/Ru6kRBW30Hy/fRNBC8hPdcExuBZMc=
|
||||
gopkg.in/DataDog/dd-trace-go.v1 v1.32.0/go.mod h1:wRKMf/tRASHwH/UOfPQ3IQmVFhTz2/1a1/mpXoIjF54=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
|
|
@ -967,8 +1093,12 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
|||
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
|
||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||
gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
|
||||
gopkg.in/neurosnap/sentences.v1 v1.0.7 h1:gpTUYnqthem4+o8kyTLiYIB05W+IvdQFYR29erfe8uU=
|
||||
gopkg.in/neurosnap/sentences.v1 v1.0.7/go.mod h1:YlK+SN+fLQZj+kY3r8DkGDhDr91+S3JmTb5LSxFRQo0=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||
gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
|
||||
gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
|
||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ func TestCopyBytes(t *testing.T) {
|
|||
|
||||
result := copyBytes(bytes)
|
||||
require.Equal(t, bytes, result)
|
||||
require.NotSame(t, bytes, result)
|
||||
require.NotSame(t, &bytes, &result)
|
||||
}
|
||||
|
||||
func TestSetBytes(t *testing.T) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue