Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2025-03-14 18:10:27 +00:00
parent 60fe8d65ac
commit d0ac590b65
89 changed files with 1999 additions and 489 deletions

View File

@ -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

View File

@ -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/).

View File

@ -2180,6 +2180,9 @@
"depend"
]
},
"inputs": {
"$ref": "#/definitions/inputs"
},
"forward": {
"description": "Specify what to forward to the downstream pipeline.",
"type": "object",

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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>

View File

@ -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>

View File

@ -1,4 +1,4 @@
query getOpenMrCountsForBlobPath(
query getOpenMrCountForBlobPath(
$projectPath: ID!
$targetBranch: [String!]
$blobPath: String!

View File

@ -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
}
}
}

View File

@ -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

View File

@ -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"

View File

@ -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: {

View File

@ -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 }"

View File

@ -93,6 +93,14 @@ export default {
required: false,
default: false,
},
showSidebar: {
type: Boolean,
required: true,
},
truncationEnabled: {
type: Boolean,
required: true,
},
},
computed: {
canUpdate() {

View File

@ -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;
}
}

View File

@ -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

View File

@ -325,8 +325,9 @@ module Ci
},
execute_params: {
ignore_skip_ci: true,
bridge: self
}
bridge: self,
inputs: options&.dig(:trigger, :inputs)
}.compact
}
end

View File

@ -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

View File

@ -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).

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -0,0 +1 @@
840befb12a01d4a00935a713f17d4d1c747699c0c7a8c91c492de83ee57f5404

View File

@ -0,0 +1 @@
c3af20addfff35e3e3e02fb2acd4768b70bd6f697cde96f963eeb11623f50789

View File

@ -0,0 +1 @@
c5783d7627ced838639b3db47cbafc6782d02475e0359eccfa52920660b7f71b

View File

@ -0,0 +1 @@
c96cc46b98d2a8f623e0d050d89784e49b9882c2579cb2ee23c6fd6fc2dd226a

View File

@ -0,0 +1 @@
9c33eb3a02178e017844deef269dfbb3586c8c265afe764b1272b26a0aea997e

View File

@ -0,0 +1 @@
f5ae1e787e0a4e161c087df9f1bff114d6e6a23a87090a9b4256abe355211a4c

View File

@ -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;

View File

@ -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 >}}

View File

@ -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` |

View File

@ -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

View File

@ -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 |

View File

@ -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 dont 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

View File

@ -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.

View File

@ -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">

View File

@ -184,6 +184,58 @@ To open the epic in full view, either:
![Epic opened in a drawer.](img/epic_drawer_v17_4.png)
## 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 >}}

View File

@ -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 >}}

View File

@ -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 >}}

View File

@ -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 >}}

View File

@ -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

View File

@ -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 >}}

View File

@ -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,

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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."

View File

@ -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

View File

@ -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'

View File

@ -1,3 +1,9 @@
trigger-project-inputs:
trigger:
project: 'group/project'
inputs:
example: 'a'
trigger-include-string:
trigger:
include: '/path/to/child-pipeline.yml'

View File

@ -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);
});
});

View File

@ -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);
});
});
});

View File

@ -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);
});
});

View File

@ -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', () => {

View File

@ -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);
});
});
});

View File

@ -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);
});
});
});

View File

@ -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,
},
},
},
});

View File

@ -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();
});
});
});

View File

@ -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,

View File

@ -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([[]]);
});
});
});

View File

@ -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',

View File

@ -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);
});
});
});

View File

@ -45,6 +45,8 @@ describe('WorkItemStickyHeader', () => {
workItemState: STATE_OPEN,
isGroup: false,
parentId,
showSidebar: true,
enableTruncation: true,
},
provide: {
glFeatures: {

View File

@ -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

View File

@ -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' } }

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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'

View File

@ -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!(

View File

@ -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

View File

@ -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) { [] }

View File

@ -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")

View File

@ -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

View File

@ -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
)

View File

@ -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=

View File

@ -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) {