mirror of
https://github.com/sourcegraph/sourcegraph.git
synced 2026-02-06 13:11:49 +00:00
Create a shared Cody Ignore dataset (#61968)
This commit is contained in:
parent
a447b6121a
commit
23a2cea646
@ -9,6 +9,7 @@ client/build-config/node_modules
|
||||
client/client-api/node_modules
|
||||
client/codeintellify/node_modules
|
||||
client/common/node_modules
|
||||
client/cody-context-filters-test-dataset/node_modules
|
||||
client/eslint-plugin-wildcard/node_modules
|
||||
client/extension-api/node_modules
|
||||
client/extension-api-types/node_modules
|
||||
|
||||
1
client/cody-context-filters-test-dataset/.gitignore
vendored
Normal file
1
client/cody-context-filters-test-dataset/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
dataset.json
|
||||
6
client/cody-context-filters-test-dataset/BUILD.bazel
Normal file
6
client/cody-context-filters-test-dataset/BUILD.bazel
Normal file
@ -0,0 +1,6 @@
|
||||
load("//dev:defs.bzl", "npm_package")
|
||||
|
||||
npm_package(
|
||||
name = "cody-context-filters-test-dataset_pkg",
|
||||
srcs = ["package.json"],
|
||||
)
|
||||
10
client/cody-context-filters-test-dataset/CONTRIBUTING.md
Normal file
10
client/cody-context-filters-test-dataset/CONTRIBUTING.md
Normal file
@ -0,0 +1,10 @@
|
||||
# Publishing a new release
|
||||
|
||||
1. Ensure the updated version of the test dataset is already committed to `main`.
|
||||
2. Create a new branch from `main` and switch to it.
|
||||
3. Bump the version in [`package.json`](package.json).
|
||||
4. Commit the version change.
|
||||
5. Run `pnpm login` and enter the credentials
|
||||
from [1Password](https://start.1password.com/open/i?a=HEDEDSLHPBFGRBTKAKJWE23XX4&v=dnrhbauihkhjs5ag6vszsme45a&i=oye4u4faaxmxxesugzqxojr4q4&h=team-sourcegraph.1password.com).
|
||||
6. Run `pnpm publish` from the package root and check for any errors.
|
||||
7. Once the release has been published, create a PR and get it merged to `main`.
|
||||
5
client/cody-context-filters-test-dataset/README.md
Normal file
5
client/cody-context-filters-test-dataset/README.md
Normal file
@ -0,0 +1,5 @@
|
||||
# Cody context filters test dataset
|
||||
|
||||
This package includes a copy of the dataset used for testing the Cody context filtering logic on the backend.
|
||||
The dataset is exported so that Cody clients can ensure consistency in how Cody context filters are handled across
|
||||
both the server and clients.
|
||||
17
client/cody-context-filters-test-dataset/package.json
Normal file
17
client/cody-context-filters-test-dataset/package.json
Normal file
@ -0,0 +1,17 @@
|
||||
{
|
||||
"name": "@sourcegraph/cody-context-filters-test-dataset",
|
||||
"version": "1.0.0",
|
||||
"license": "Apache-2.0",
|
||||
"description": "Cody context filters test dataset",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/sourcegraph/sourcegraph.git",
|
||||
"directory": "client/cody-context-filters-test-dataset"
|
||||
},
|
||||
"scripts": {
|
||||
"prepublishOnly": "node scripts/generate.js"
|
||||
},
|
||||
"files": [
|
||||
"dataset.json"
|
||||
]
|
||||
}
|
||||
54
client/cody-context-filters-test-dataset/scripts/generate.js
Executable file
54
client/cody-context-filters-test-dataset/scripts/generate.js
Executable file
@ -0,0 +1,54 @@
|
||||
const path = require('path')
|
||||
const shelljs = require('shelljs')
|
||||
const semver = require('semver')
|
||||
const signale = require('signale')
|
||||
|
||||
;(() => {
|
||||
signale.await('Copying test dataset...')
|
||||
const datasetSource = path.join(
|
||||
__dirname,
|
||||
'../../../cmd/frontend/internal/codycontext/testdata/enterprise_filter_test_data.json'
|
||||
)
|
||||
const datasetDest = path.join(__dirname, '../dataset.json')
|
||||
const packageJSONPath = path.join(__dirname, '../package.json')
|
||||
|
||||
const copyDatasetFileResult = shelljs.cp(datasetSource, datasetDest)
|
||||
if (copyDatasetFileResult.code !== 0) {
|
||||
signale.fatal('Failed to copy test dataset:', copyDatasetFileResult.stderr)
|
||||
shelljs.exit(1)
|
||||
}
|
||||
|
||||
const readDatasetContent = shelljs.cat(datasetDest)
|
||||
if (readDatasetContent.code !== 0) {
|
||||
signale.fatal('Failed to read dataset content:', readDatasetContent.stderr)
|
||||
shelljs.exit(1)
|
||||
}
|
||||
|
||||
try {
|
||||
JSON.parse(readDatasetContent.stdout)
|
||||
} catch (e) {
|
||||
signale.fatal('Failed to parse dataset content as JSON:', e)
|
||||
shelljs.exit(1)
|
||||
}
|
||||
|
||||
const readPackageJSONContent = shelljs.cat(packageJSONPath)
|
||||
let versionFromPackageJSON
|
||||
try {
|
||||
versionFromPackageJSON = JSON.parse(readPackageJSONContent.stdout).version
|
||||
} catch (e) {
|
||||
signale.fatal('Failed to parse package.json:', e)
|
||||
shelljs.exit(1)
|
||||
}
|
||||
|
||||
const version = semver.valid(versionFromPackageJSON)
|
||||
if (!version) {
|
||||
signale.fatal(
|
||||
`Invalid version in package.json: ${JSON.stringify(
|
||||
versionFromPackageJSON
|
||||
)}. Versions must be valid semantic version strings.`
|
||||
)
|
||||
shelljs.exit(1)
|
||||
}
|
||||
|
||||
signale.success('Test dataset created successfully!')
|
||||
})()
|
||||
@ -2025,6 +2025,7 @@ ts_project(
|
||||
"//:node_modules/@apollo/client",
|
||||
"//:node_modules/@codemirror/state",
|
||||
"//:node_modules/@codemirror/view",
|
||||
"//:node_modules/@sourcegraph/cody-context-filters-test-dataset",
|
||||
"//:node_modules/@testing-library/dom",
|
||||
"//:node_modules/@testing-library/jest-dom", #keep
|
||||
"//:node_modules/@testing-library/react",
|
||||
|
||||
@ -1,5 +1,7 @@
|
||||
import { describe, expect, it } from 'vitest'
|
||||
|
||||
import { testCases } from '@sourcegraph/cody-context-filters-test-dataset/dataset.json'
|
||||
|
||||
import { alwaysTrue, getFilterFnsFromCodyContextFilters } from './useCodyIgnore'
|
||||
|
||||
describe('getFilterFnsFromCodyContextFilters', () => {
|
||||
@ -12,727 +14,6 @@ describe('getFilterFnsFromCodyContextFilters', () => {
|
||||
expect(isFileIgnored).toBe(alwaysTrue)
|
||||
})
|
||||
|
||||
// TODO: (taras-yemets) replace with shared Cody Ignore test dataset once it's published
|
||||
const testCases = [
|
||||
{
|
||||
name: 'Cody context filters are not defined',
|
||||
description: 'Any repo should be included.',
|
||||
includeByDefault: true,
|
||||
includeUnknown: false,
|
||||
'cody.contextFilters': null,
|
||||
repos: [
|
||||
{ name: 'github.com/sourcegraph/about', id: 1 },
|
||||
{ name: 'github.com/sourcegraph/annotate', id: 2 },
|
||||
{ name: 'github.com/sourcegraph/sourcegraph', id: 3 },
|
||||
{ name: 'github.com/docker/compose', id: 4 },
|
||||
],
|
||||
includedRepos: [
|
||||
{ name: 'github.com/sourcegraph/about', id: 1 },
|
||||
{ name: 'github.com/sourcegraph/annotate', id: 2 },
|
||||
{ name: 'github.com/sourcegraph/sourcegraph', id: 3 },
|
||||
{ name: 'github.com/docker/compose', id: 4 },
|
||||
],
|
||||
fileChunks: [
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/about',
|
||||
id: 1,
|
||||
},
|
||||
Path: '/file1.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/annotate',
|
||||
id: 2,
|
||||
},
|
||||
Path: '/file2.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/sourcegraph',
|
||||
id: 3,
|
||||
},
|
||||
Path: '/file3.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/docker/compose',
|
||||
id: 4,
|
||||
},
|
||||
Path: '/file4.go',
|
||||
},
|
||||
],
|
||||
includedFileChunks: [
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/about',
|
||||
id: 1,
|
||||
},
|
||||
Path: '/file1.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/annotate',
|
||||
id: 2,
|
||||
},
|
||||
Path: '/file2.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/sourcegraph',
|
||||
id: 3,
|
||||
},
|
||||
Path: '/file3.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/docker/compose',
|
||||
id: 4,
|
||||
},
|
||||
Path: '/file4.go',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'Include and exclude rules are not defined',
|
||||
description:
|
||||
'This scenario shouldn\'t happen. "cody.contextFilters" if defined in the site config, should have at least one property. Thus, either "include" or "exclude" should be defined. We rely on site config schema validation.',
|
||||
includeByDefault: true,
|
||||
includeUnknown: false,
|
||||
'cody.contextFilters': {},
|
||||
repos: [
|
||||
{ name: 'github.com/sourcegraph/about', id: 1 },
|
||||
{ name: 'github.com/sourcegraph/annotate', id: 2 },
|
||||
{ name: 'github.com/sourcegraph/sourcegraph', id: 3 },
|
||||
{ name: 'github.com/docker/compose', id: 4 },
|
||||
],
|
||||
includedRepos: [
|
||||
{ name: 'github.com/sourcegraph/about', id: 1 },
|
||||
{ name: 'github.com/sourcegraph/annotate', id: 2 },
|
||||
{ name: 'github.com/sourcegraph/sourcegraph', id: 3 },
|
||||
{ name: 'github.com/docker/compose', id: 4 },
|
||||
],
|
||||
fileChunks: [
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/about',
|
||||
id: 1,
|
||||
},
|
||||
path: '/file1.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/annotate',
|
||||
id: 2,
|
||||
},
|
||||
path: '/file2.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/sourcegraph',
|
||||
id: 3,
|
||||
},
|
||||
path: '/file3.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/docker/compose',
|
||||
id: 4,
|
||||
},
|
||||
path: '/file4.go',
|
||||
},
|
||||
],
|
||||
includedFileChunks: [
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/about',
|
||||
id: 1,
|
||||
},
|
||||
path: '/file1.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/annotate',
|
||||
id: 2,
|
||||
},
|
||||
path: '/file2.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/sourcegraph',
|
||||
id: 3,
|
||||
},
|
||||
path: '/file3.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/docker/compose',
|
||||
id: 4,
|
||||
},
|
||||
path: '/file4.go',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'Include and exclude rules are empty lists',
|
||||
description:
|
||||
'This scenario shouldn\'t happen. If either "include" or "exclude" field is defined, it should have at least one item. We rely on site config schema validation.',
|
||||
includeByDefault: true,
|
||||
includeUnknown: false,
|
||||
'cody.contextFilters': {
|
||||
include: [],
|
||||
exclude: [],
|
||||
},
|
||||
repos: [
|
||||
{ name: 'github.com/sourcegraph/about', id: 1 },
|
||||
{ name: 'github.com/sourcegraph/annotate', id: 2 },
|
||||
{ name: 'github.com/sourcegraph/sourcegraph', id: 3 },
|
||||
{ name: 'github.com/docker/compose', id: 4 },
|
||||
],
|
||||
includedRepos: [
|
||||
{ name: 'github.com/sourcegraph/about', id: 1 },
|
||||
{ name: 'github.com/sourcegraph/annotate', id: 2 },
|
||||
{ name: 'github.com/sourcegraph/sourcegraph', id: 3 },
|
||||
{ name: 'github.com/docker/compose', id: 4 },
|
||||
],
|
||||
fileChunks: [
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/about',
|
||||
id: 1,
|
||||
},
|
||||
path: '/file1.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/annotate',
|
||||
id: 2,
|
||||
},
|
||||
path: '/file2.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/sourcegraph',
|
||||
id: 3,
|
||||
},
|
||||
path: '/file3.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/docker/compose',
|
||||
id: 4,
|
||||
},
|
||||
path: '/file4.go',
|
||||
},
|
||||
],
|
||||
includedFileChunks: [
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/about',
|
||||
id: 1,
|
||||
},
|
||||
path: '/file1.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/annotate',
|
||||
id: 2,
|
||||
},
|
||||
path: '/file2.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/sourcegraph',
|
||||
id: 3,
|
||||
},
|
||||
path: '/file3.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/docker/compose',
|
||||
id: 4,
|
||||
},
|
||||
path: '/file4.go',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'Only include rules are defined',
|
||||
description: 'Only repos matching "include" repo name patterns should be included.',
|
||||
includeByDefault: true,
|
||||
includeUnknown: false,
|
||||
'cody.contextFilters': {
|
||||
include: [{ repoNamePattern: '^github\\.com\\/sourcegraph\\/.+' }],
|
||||
},
|
||||
repos: [
|
||||
{ name: 'github.com/sourcegraph/about', id: 1 },
|
||||
{ name: 'github.com/sourcegraph/annotate', id: 2 },
|
||||
{ name: 'github.com/sourcegraph/sourcegraph', id: 3 },
|
||||
{ name: 'github.com/docker/compose', id: 4 },
|
||||
],
|
||||
includedRepos: [
|
||||
{ name: 'github.com/sourcegraph/about', id: 1 },
|
||||
{ name: 'github.com/sourcegraph/annotate', id: 2 },
|
||||
{ name: 'github.com/sourcegraph/sourcegraph', id: 3 },
|
||||
],
|
||||
fileChunks: [
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/about',
|
||||
id: 1,
|
||||
},
|
||||
path: '/file1.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/annotate',
|
||||
id: 2,
|
||||
},
|
||||
path: '/file2.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/sourcegraph',
|
||||
id: 3,
|
||||
},
|
||||
path: '/file3.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/docker/compose',
|
||||
id: 4,
|
||||
},
|
||||
path: '/file4.go',
|
||||
},
|
||||
],
|
||||
includedFileChunks: [
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/about',
|
||||
id: 1,
|
||||
},
|
||||
path: '/file1.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/annotate',
|
||||
id: 2,
|
||||
},
|
||||
path: '/file2.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/sourcegraph',
|
||||
id: 3,
|
||||
},
|
||||
path: '/file3.go',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'Only exclude rules are defined',
|
||||
description: 'Only repos not matching any of "include" repo name patterns should be included.',
|
||||
includeByDefault: true,
|
||||
includeUnknown: false,
|
||||
'cody.contextFilters': {
|
||||
exclude: [{ repoNamePattern: '^github\\.com\\/sourcegraph\\/.+' }],
|
||||
},
|
||||
repos: [
|
||||
{ name: 'github.com/sourcegraph/about', id: 1 },
|
||||
{ name: 'github.com/sourcegraph/annotate', id: 2 },
|
||||
{ name: 'github.com/sourcegraph/sourcegraph', id: 3 },
|
||||
{ name: 'github.com/docker/compose', id: 4 },
|
||||
],
|
||||
includedRepos: [{ name: 'github.com/docker/compose', id: 4 }],
|
||||
fileChunks: [
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/about',
|
||||
id: 1,
|
||||
},
|
||||
path: '/file1.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/annotate',
|
||||
id: 2,
|
||||
},
|
||||
path: '/file2.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/sourcegraph',
|
||||
id: 3,
|
||||
},
|
||||
path: '/file3.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/docker/compose',
|
||||
id: 4,
|
||||
},
|
||||
path: '/file4.go',
|
||||
},
|
||||
],
|
||||
includedFileChunks: [
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/docker/compose',
|
||||
id: 4,
|
||||
},
|
||||
path: '/file4.go',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'Include and exclude rules are defined',
|
||||
description:
|
||||
'Only repos matching any of "include" and not matching any of "exclude" repo name patterns should be included.',
|
||||
includeByDefault: true,
|
||||
includeUnknown: false,
|
||||
'cody.contextFilters': {
|
||||
include: [{ repoNamePattern: '^github\\.com\\/sourcegraph\\/.+' }],
|
||||
exclude: [{ repoNamePattern: '.*cody.*' }],
|
||||
},
|
||||
repos: [
|
||||
{ name: 'github.com/sourcegraph/about', id: 1 },
|
||||
{ name: 'github.com/sourcegraph/annotate', id: 2 },
|
||||
{ name: 'github.com/sourcegraph/sourcegraph', id: 3 },
|
||||
{ name: 'github.com/docker/compose', id: 4 },
|
||||
{ name: 'github.com/sourcegraph/cody', id: 5 },
|
||||
],
|
||||
includedRepos: [
|
||||
{ name: 'github.com/sourcegraph/about', id: 1 },
|
||||
{ name: 'github.com/sourcegraph/annotate', id: 2 },
|
||||
{ name: 'github.com/sourcegraph/sourcegraph', id: 3 },
|
||||
],
|
||||
fileChunks: [
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/about',
|
||||
id: 1,
|
||||
},
|
||||
path: '/file1.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/annotate',
|
||||
id: 2,
|
||||
},
|
||||
path: '/file2.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/sourcegraph',
|
||||
id: 3,
|
||||
},
|
||||
path: '/file3.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/docker/compose',
|
||||
id: 4,
|
||||
},
|
||||
path: '/file4.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/cody',
|
||||
id: 5,
|
||||
},
|
||||
path: '/index.ts',
|
||||
},
|
||||
],
|
||||
includedFileChunks: [
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/about',
|
||||
id: 1,
|
||||
},
|
||||
path: '/file1.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/annotate',
|
||||
id: 2,
|
||||
},
|
||||
path: '/file2.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/sourcegraph',
|
||||
id: 3,
|
||||
},
|
||||
path: '/file3.go',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'Multiple include and exclude rules are defined',
|
||||
description:
|
||||
'Only repos matching any of "include" and not matching any of "exclude" repo name patterns should be included.',
|
||||
includeByDefault: true,
|
||||
includeUnknown: false,
|
||||
'cody.contextFilters': {
|
||||
include: [
|
||||
{ repoNamePattern: '^github\\.com\\/sourcegraph\\/.+' },
|
||||
{ repoNamePattern: '^github\\.com\\/docker\\/compose$' },
|
||||
{ repoNamePattern: '^github\\.com\\/.+\\/react' },
|
||||
],
|
||||
exclude: [{ repoNamePattern: '.*cody.*' }, { repoNamePattern: '.+\\/docker\\/.+' }],
|
||||
},
|
||||
repos: [
|
||||
{ name: 'github.com/sourcegraph/about', id: 1 },
|
||||
{ name: 'github.com/sourcegraph/annotate', id: 2 },
|
||||
{ name: 'github.com/sourcegraph/sourcegraph', id: 3 },
|
||||
{ name: 'github.com/docker/compose', id: 4 },
|
||||
{ name: 'github.com/sourcegraph/cody', id: 5 },
|
||||
{ name: 'github.com/facebook/react', id: 6 },
|
||||
],
|
||||
includedRepos: [
|
||||
{ name: 'github.com/sourcegraph/about', id: 1 },
|
||||
{ name: 'github.com/sourcegraph/annotate', id: 2 },
|
||||
{ name: 'github.com/sourcegraph/sourcegraph', id: 3 },
|
||||
{ name: 'github.com/facebook/react', id: 6 },
|
||||
],
|
||||
fileChunks: [
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/about',
|
||||
id: 1,
|
||||
},
|
||||
path: '/file1.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/annotate',
|
||||
id: 2,
|
||||
},
|
||||
path: '/file2.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/sourcegraph',
|
||||
id: 3,
|
||||
},
|
||||
path: '/file3.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/docker/compose',
|
||||
id: 4,
|
||||
},
|
||||
path: '/file4.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/cody',
|
||||
id: 5,
|
||||
},
|
||||
path: '/index.ts',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/facebook/react',
|
||||
id: 6,
|
||||
},
|
||||
path: '/hooks.ts',
|
||||
},
|
||||
],
|
||||
includedFileChunks: [
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/about',
|
||||
id: 1,
|
||||
},
|
||||
path: '/file1.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/annotate',
|
||||
id: 2,
|
||||
},
|
||||
path: '/file2.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/sourcegraph',
|
||||
id: 3,
|
||||
},
|
||||
path: '/file3.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/facebook/react',
|
||||
id: 6,
|
||||
},
|
||||
path: '/hooks.ts',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'Include rules contain repo name pattern matching any repo',
|
||||
description: 'Any repo should be included.',
|
||||
includeByDefault: true,
|
||||
includeUnknown: false,
|
||||
'cody.contextFilters': {
|
||||
include: [{ repoNamePattern: '.*' }],
|
||||
},
|
||||
repos: [
|
||||
{ name: 'github.com/sourcegraph/about', id: 1 },
|
||||
{ name: 'github.com/sourcegraph/annotate', id: 2 },
|
||||
{ name: 'github.com/sourcegraph/sourcegraph', id: 3 },
|
||||
{ name: 'github.com/docker/compose', id: 4 },
|
||||
{ name: 'github.com/sourcegraph/cody', id: 5 },
|
||||
{ name: 'github.com/facebook/react', id: 6 },
|
||||
],
|
||||
includedRepos: [
|
||||
{ name: 'github.com/sourcegraph/about', id: 1 },
|
||||
{ name: 'github.com/sourcegraph/annotate', id: 2 },
|
||||
{ name: 'github.com/sourcegraph/sourcegraph', id: 3 },
|
||||
{ name: 'github.com/docker/compose', id: 4 },
|
||||
{ name: 'github.com/sourcegraph/cody', id: 5 },
|
||||
{ name: 'github.com/facebook/react', id: 6 },
|
||||
],
|
||||
fileChunks: [
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/about',
|
||||
id: 1,
|
||||
},
|
||||
path: '/file1.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/annotate',
|
||||
id: 2,
|
||||
},
|
||||
path: '/file2.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/sourcegraph',
|
||||
id: 3,
|
||||
},
|
||||
path: '/file3.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/docker/compose',
|
||||
id: 4,
|
||||
},
|
||||
path: '/file4.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/cody',
|
||||
id: 5,
|
||||
},
|
||||
path: '/index.ts',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/facebook/react',
|
||||
id: 6,
|
||||
},
|
||||
path: '/hooks.ts',
|
||||
},
|
||||
],
|
||||
includedFileChunks: [
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/about',
|
||||
id: 1,
|
||||
},
|
||||
path: '/file1.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/annotate',
|
||||
id: 2,
|
||||
},
|
||||
path: '/file2.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/sourcegraph',
|
||||
id: 3,
|
||||
},
|
||||
path: '/file3.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/docker/compose',
|
||||
id: 4,
|
||||
},
|
||||
path: '/file4.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/cody',
|
||||
id: 5,
|
||||
},
|
||||
path: '/index.ts',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/facebook/react',
|
||||
id: 6,
|
||||
},
|
||||
path: '/hooks.ts',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'Exclude rules contain repo name pattern matching any repo',
|
||||
description: 'Neither repo should be included.',
|
||||
includeByDefault: true,
|
||||
includeUnknown: false,
|
||||
'cody.contextFilters': {
|
||||
include: [{ repoNamePattern: '^github\\.com\\/sourcegraph\\/.+' }],
|
||||
exclude: [{ repoNamePattern: '.*' }],
|
||||
},
|
||||
repos: [
|
||||
{ name: 'github.com/sourcegraph/about', id: 1 },
|
||||
{ name: 'github.com/sourcegraph/annotate', id: 2 },
|
||||
{ name: 'github.com/sourcegraph/sourcegraph', id: 3 },
|
||||
{ name: 'github.com/docker/compose', id: 4 },
|
||||
],
|
||||
includedRepos: [],
|
||||
fileChunks: [
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/about',
|
||||
id: 1,
|
||||
},
|
||||
path: '/file1.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/annotate',
|
||||
id: 2,
|
||||
},
|
||||
path: '/file2.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/sourcegraph/sourcegraph',
|
||||
id: 3,
|
||||
},
|
||||
path: '/file3.go',
|
||||
},
|
||||
{
|
||||
repo: {
|
||||
name: 'github.com/docker/compose',
|
||||
id: 4,
|
||||
},
|
||||
path: '/file4.go',
|
||||
},
|
||||
],
|
||||
includedFileChunks: [],
|
||||
},
|
||||
]
|
||||
|
||||
for (const testCase of testCases) {
|
||||
it(testCase.name, async () => {
|
||||
const ccf = testCase['cody.contextFilters']
|
||||
|
||||
@ -6,6 +6,7 @@
|
||||
"jsx": "react-jsx",
|
||||
"rootDir": ".",
|
||||
"outDir": "out",
|
||||
"resolveJsonModule": true,
|
||||
},
|
||||
"references": [
|
||||
{
|
||||
|
||||
@ -52,6 +52,7 @@ go_test(
|
||||
"dotcom_test.go",
|
||||
"enterprise_test.go",
|
||||
],
|
||||
data = glob(["testdata/**"]),
|
||||
embed = [":codycontext"],
|
||||
deps = [
|
||||
"//internal/api",
|
||||
|
||||
@ -19,8 +19,6 @@ import (
|
||||
"github.com/sourcegraph/sourcegraph/schema"
|
||||
)
|
||||
|
||||
const allowByDefault = true
|
||||
|
||||
var (
|
||||
metricCacheHit = promauto.NewCounter(prometheus.CounterOpts{
|
||||
Name: "src_codycontext_filter_cache_hit",
|
||||
@ -88,15 +86,15 @@ func (f *enterpriseRepoFilter) getMatcher(ctx context.Context, repos []types.Rep
|
||||
return []types.RepoIDName{}, func(api.RepoID, string) bool { return false }, errors.New("Cody context filters configuration is invalid. Please contact your admin.")
|
||||
}
|
||||
|
||||
allowedRepos := make([]types.RepoIDName, 0, len(repos))
|
||||
includedRepos := make([]types.RepoIDName, 0, len(repos))
|
||||
for _, repo := range repos {
|
||||
if fc.isRepoAllowed(repo) {
|
||||
allowedRepos = append(allowedRepos, repo)
|
||||
if fc.isRepoIncluded(repo) {
|
||||
includedRepos = append(includedRepos, repo)
|
||||
}
|
||||
}
|
||||
|
||||
return allowedRepos, func(repo api.RepoID, path string) bool {
|
||||
return slices.ContainsFunc(allowedRepos, func(r types.RepoIDName) bool { return r.ID == repo })
|
||||
return includedRepos, func(repo api.RepoID, path string) bool {
|
||||
return slices.ContainsFunc(includedRepos, func(r types.RepoIDName) bool { return r.ID == repo })
|
||||
}, nil
|
||||
}
|
||||
|
||||
@ -149,8 +147,8 @@ func parseCodyContextFilters(ccf *schema.CodyContextFilters) (filtersConfig, err
|
||||
}, nil
|
||||
}
|
||||
|
||||
// isRepoAllowed checks if repo name matches Cody context include and exclude rules from the site config and stores result in cache.
|
||||
func (f filtersConfig) isRepoAllowed(repo types.RepoIDName) bool {
|
||||
// isRepoIncluded checks if repo name matches Cody context include and exclude rules from the site config and stores result in cache.
|
||||
func (f filtersConfig) isRepoIncluded(repo types.RepoIDName) bool {
|
||||
cached, ok := f.cache.Get(repo.ID)
|
||||
if ok {
|
||||
metricCacheHit.Inc()
|
||||
@ -158,13 +156,12 @@ func (f filtersConfig) isRepoAllowed(repo types.RepoIDName) bool {
|
||||
}
|
||||
metricCacheMiss.Inc()
|
||||
|
||||
allowed := allowByDefault
|
||||
included := true
|
||||
|
||||
if len(f.include) > 0 {
|
||||
for _, p := range f.include {
|
||||
include := p.RepoNamePattern.MatchString(string(repo.Name))
|
||||
allowed = include
|
||||
if include {
|
||||
included = p.RepoNamePattern.MatchString(string(repo.Name))
|
||||
if included {
|
||||
break
|
||||
}
|
||||
}
|
||||
@ -172,14 +169,13 @@ func (f filtersConfig) isRepoAllowed(repo types.RepoIDName) bool {
|
||||
|
||||
if len(f.exclude) > 0 {
|
||||
for _, p := range f.exclude {
|
||||
exclude := p.RepoNamePattern.MatchString(string(repo.Name))
|
||||
if exclude {
|
||||
allowed = false
|
||||
if p.RepoNamePattern.MatchString(string(repo.Name)) {
|
||||
included = false
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
f.cache.Add(repo.ID, allowed)
|
||||
return allowed
|
||||
f.cache.Add(repo.ID, included)
|
||||
return included
|
||||
}
|
||||
|
||||
@ -2,13 +2,18 @@ package codycontext
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/sourcegraph/log/logtest"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/sourcegraph/sourcegraph/internal/api"
|
||||
|
||||
"github.com/sourcegraph/sourcegraph/internal/conf"
|
||||
"github.com/sourcegraph/sourcegraph/internal/database/dbmocks"
|
||||
"github.com/sourcegraph/sourcegraph/internal/featureflag"
|
||||
@ -17,508 +22,54 @@ import (
|
||||
)
|
||||
|
||||
func TestNewEnterpriseFilter(t *testing.T) {
|
||||
t.Cleanup(func() { conf.Mock(nil) })
|
||||
t.Cleanup(func() {
|
||||
conf.Mock(nil)
|
||||
})
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
ccf *schema.CodyContextFilters
|
||||
repos []types.RepoIDName
|
||||
chunks []FileChunkContext
|
||||
wantRepos []types.RepoIDName
|
||||
wantChunks []FileChunkContext
|
||||
}{
|
||||
{
|
||||
name: "Cody context filters not set",
|
||||
ccf: nil,
|
||||
repos: []types.RepoIDName{
|
||||
{Name: "github.com/sourcegraph/about", ID: 1},
|
||||
{Name: "github.com/sourcegraph/annotate", ID: 2},
|
||||
{Name: "github.com/sourcegraph/sourcegraph", ID: 3},
|
||||
{Name: "github.com/docker/compose", ID: 4},
|
||||
},
|
||||
chunks: []FileChunkContext{
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/about",
|
||||
RepoID: 1,
|
||||
Path: "/file1.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/annotate",
|
||||
RepoID: 2,
|
||||
Path: "/file2.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/sourcegraph",
|
||||
RepoID: 3,
|
||||
Path: "/file3.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/docker/compose",
|
||||
RepoID: 4,
|
||||
Path: "/file4.go",
|
||||
},
|
||||
},
|
||||
wantRepos: []types.RepoIDName{
|
||||
{Name: "github.com/sourcegraph/about", ID: 1},
|
||||
{Name: "github.com/sourcegraph/annotate", ID: 2},
|
||||
{Name: "github.com/sourcegraph/sourcegraph", ID: 3},
|
||||
{Name: "github.com/docker/compose", ID: 4},
|
||||
},
|
||||
wantChunks: []FileChunkContext{
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/about",
|
||||
RepoID: 1,
|
||||
Path: "/file1.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/annotate",
|
||||
RepoID: 2,
|
||||
Path: "/file2.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/sourcegraph",
|
||||
RepoID: 3,
|
||||
Path: "/file3.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/docker/compose",
|
||||
RepoID: 4,
|
||||
Path: "/file4.go",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "include and exclude rules are not defined",
|
||||
ccf: &schema.CodyContextFilters{},
|
||||
repos: []types.RepoIDName{
|
||||
{Name: "github.com/sourcegraph/about", ID: 1},
|
||||
{Name: "github.com/sourcegraph/annotate", ID: 2},
|
||||
{Name: "github.com/sourcegraph/sourcegraph", ID: 3},
|
||||
{Name: "github.com/docker/compose", ID: 4},
|
||||
},
|
||||
chunks: []FileChunkContext{
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/about",
|
||||
RepoID: 1,
|
||||
Path: "/file1.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/annotate",
|
||||
RepoID: 2,
|
||||
Path: "/file2.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/sourcegraph",
|
||||
RepoID: 3,
|
||||
Path: "/file3.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/docker/compose",
|
||||
RepoID: 4,
|
||||
Path: "/file4.go",
|
||||
},
|
||||
},
|
||||
wantRepos: []types.RepoIDName{
|
||||
{Name: "github.com/sourcegraph/about", ID: 1},
|
||||
{Name: "github.com/sourcegraph/annotate", ID: 2},
|
||||
{Name: "github.com/sourcegraph/sourcegraph", ID: 3},
|
||||
{Name: "github.com/docker/compose", ID: 4},
|
||||
},
|
||||
wantChunks: []FileChunkContext{
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/about",
|
||||
RepoID: 1,
|
||||
Path: "/file1.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/annotate",
|
||||
RepoID: 2,
|
||||
Path: "/file2.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/sourcegraph",
|
||||
RepoID: 3,
|
||||
Path: "/file3.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/docker/compose",
|
||||
RepoID: 4,
|
||||
Path: "/file4.go",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "include and exclude rules empty",
|
||||
ccf: &schema.CodyContextFilters{
|
||||
Include: []*schema.CodyContextFilterItem{},
|
||||
Exclude: []*schema.CodyContextFilterItem{},
|
||||
},
|
||||
repos: []types.RepoIDName{
|
||||
{Name: "github.com/sourcegraph/about", ID: 1},
|
||||
{Name: "github.com/sourcegraph/annotate", ID: 2},
|
||||
{Name: "github.com/sourcegraph/sourcegraph", ID: 3},
|
||||
{Name: "github.com/docker/compose", ID: 4},
|
||||
},
|
||||
chunks: []FileChunkContext{
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/about",
|
||||
RepoID: 1,
|
||||
Path: "/file1.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/annotate",
|
||||
RepoID: 2,
|
||||
Path: "/file2.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/sourcegraph",
|
||||
RepoID: 3,
|
||||
Path: "/file3.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/docker/compose",
|
||||
RepoID: 4,
|
||||
Path: "/file4.go",
|
||||
},
|
||||
},
|
||||
wantRepos: []types.RepoIDName{
|
||||
{Name: "github.com/sourcegraph/about", ID: 1},
|
||||
{Name: "github.com/sourcegraph/annotate", ID: 2},
|
||||
{Name: "github.com/sourcegraph/sourcegraph", ID: 3},
|
||||
{Name: "github.com/docker/compose", ID: 4},
|
||||
},
|
||||
wantChunks: []FileChunkContext{
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/about",
|
||||
RepoID: 1,
|
||||
Path: "/file1.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/annotate",
|
||||
RepoID: 2,
|
||||
Path: "/file2.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/sourcegraph",
|
||||
RepoID: 3,
|
||||
Path: "/file3.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/docker/compose",
|
||||
RepoID: 4,
|
||||
Path: "/file4.go",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "only include rules defined",
|
||||
ccf: &schema.CodyContextFilters{
|
||||
Include: []*schema.CodyContextFilterItem{
|
||||
{RepoNamePattern: "^github\\.com\\/sourcegraph\\/.+"},
|
||||
},
|
||||
},
|
||||
repos: []types.RepoIDName{
|
||||
{Name: "github.com/sourcegraph/about", ID: 1},
|
||||
{Name: "github.com/sourcegraph/annotate", ID: 2},
|
||||
{Name: "github.com/sourcegraph/sourcegraph", ID: 3},
|
||||
{Name: "github.com/docker/compose", ID: 4},
|
||||
},
|
||||
chunks: []FileChunkContext{
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/about",
|
||||
RepoID: 1,
|
||||
Path: "/file1.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/annotate",
|
||||
RepoID: 2,
|
||||
Path: "/file2.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/sourcegraph",
|
||||
RepoID: 3,
|
||||
Path: "/file3.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/docker/compose",
|
||||
RepoID: 4,
|
||||
Path: "/file4.go",
|
||||
},
|
||||
},
|
||||
wantRepos: []types.RepoIDName{
|
||||
{Name: "github.com/sourcegraph/about", ID: 1},
|
||||
{Name: "github.com/sourcegraph/annotate", ID: 2},
|
||||
{Name: "github.com/sourcegraph/sourcegraph", ID: 3},
|
||||
},
|
||||
wantChunks: []FileChunkContext{
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/about",
|
||||
RepoID: 1,
|
||||
Path: "/file1.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/annotate",
|
||||
RepoID: 2,
|
||||
Path: "/file2.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/sourcegraph",
|
||||
RepoID: 3,
|
||||
Path: "/file3.go",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "only exclude rules defined",
|
||||
ccf: &schema.CodyContextFilters{
|
||||
Exclude: []*schema.CodyContextFilterItem{
|
||||
{RepoNamePattern: "^github\\.com\\/sourcegraph\\/.+"},
|
||||
},
|
||||
},
|
||||
repos: []types.RepoIDName{
|
||||
{Name: "github.com/sourcegraph/about", ID: 1},
|
||||
{Name: "github.com/sourcegraph/annotate", ID: 2},
|
||||
{Name: "github.com/sourcegraph/sourcegraph", ID: 3},
|
||||
{Name: "github.com/docker/compose", ID: 4},
|
||||
},
|
||||
chunks: []FileChunkContext{
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/about",
|
||||
RepoID: 1,
|
||||
Path: "/file1.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/annotate",
|
||||
RepoID: 2,
|
||||
Path: "/file2.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/sourcegraph",
|
||||
RepoID: 3,
|
||||
Path: "/file3.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/docker/compose",
|
||||
RepoID: 4,
|
||||
Path: "/file4.go",
|
||||
},
|
||||
},
|
||||
wantRepos: []types.RepoIDName{
|
||||
{Name: "github.com/docker/compose", ID: 4},
|
||||
},
|
||||
wantChunks: []FileChunkContext{
|
||||
{
|
||||
RepoName: "github.com/docker/compose",
|
||||
RepoID: 4,
|
||||
Path: "/file4.go",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "include and exclude rules defined",
|
||||
ccf: &schema.CodyContextFilters{
|
||||
Include: []*schema.CodyContextFilterItem{
|
||||
{RepoNamePattern: "^github\\.com\\/sourcegraph\\/.+"},
|
||||
},
|
||||
Exclude: []*schema.CodyContextFilterItem{
|
||||
{RepoNamePattern: ".*cody.*"},
|
||||
},
|
||||
},
|
||||
repos: []types.RepoIDName{
|
||||
{Name: "github.com/sourcegraph/about", ID: 1},
|
||||
{Name: "github.com/sourcegraph/annotate", ID: 2},
|
||||
{Name: "github.com/sourcegraph/sourcegraph", ID: 3},
|
||||
{Name: "github.com/docker/compose", ID: 4},
|
||||
{Name: "github.com/sourcegraph/cody", ID: 5},
|
||||
},
|
||||
chunks: []FileChunkContext{
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/about",
|
||||
RepoID: 1,
|
||||
Path: "/file1.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/annotate",
|
||||
RepoID: 2,
|
||||
Path: "/file2.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/sourcegraph",
|
||||
RepoID: 3,
|
||||
Path: "/file3.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/docker/compose",
|
||||
RepoID: 4,
|
||||
Path: "/file4.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/cody",
|
||||
RepoID: 5,
|
||||
Path: "/index.ts",
|
||||
},
|
||||
},
|
||||
wantRepos: []types.RepoIDName{
|
||||
{Name: "github.com/sourcegraph/about", ID: 1},
|
||||
{Name: "github.com/sourcegraph/annotate", ID: 2},
|
||||
{Name: "github.com/sourcegraph/sourcegraph", ID: 3},
|
||||
},
|
||||
wantChunks: []FileChunkContext{
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/about",
|
||||
RepoID: 1,
|
||||
Path: "/file1.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/annotate",
|
||||
RepoID: 2,
|
||||
Path: "/file2.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/sourcegraph",
|
||||
RepoID: 3,
|
||||
Path: "/file3.go",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "multiple include and exclude rules defined",
|
||||
ccf: &schema.CodyContextFilters{
|
||||
Include: []*schema.CodyContextFilterItem{
|
||||
{RepoNamePattern: "^github\\.com\\/sourcegraph\\/.+"},
|
||||
{RepoNamePattern: "^github\\.com\\/docker\\/compose$"},
|
||||
{RepoNamePattern: "^github\\.com\\/.+\\/react"},
|
||||
},
|
||||
Exclude: []*schema.CodyContextFilterItem{
|
||||
{RepoNamePattern: ".*cody.*"},
|
||||
{RepoNamePattern: ".+\\/docker\\/.+"},
|
||||
},
|
||||
},
|
||||
repos: []types.RepoIDName{
|
||||
{Name: "github.com/sourcegraph/about", ID: 1},
|
||||
{Name: "github.com/sourcegraph/annotate", ID: 2},
|
||||
{Name: "github.com/sourcegraph/sourcegraph", ID: 3},
|
||||
{Name: "github.com/docker/compose", ID: 4},
|
||||
{Name: "github.com/sourcegraph/cody", ID: 5},
|
||||
{Name: "github.com/facebook/react", ID: 6},
|
||||
},
|
||||
chunks: []FileChunkContext{
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/about",
|
||||
RepoID: 1,
|
||||
Path: "/file1.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/annotate",
|
||||
RepoID: 2,
|
||||
Path: "/file2.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/sourcegraph",
|
||||
RepoID: 3,
|
||||
Path: "/file3.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/docker/compose",
|
||||
RepoID: 4,
|
||||
Path: "/file4.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/cody",
|
||||
RepoID: 5,
|
||||
Path: "/index.ts",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/facebook/react",
|
||||
RepoID: 6,
|
||||
Path: "/hooks.ts",
|
||||
},
|
||||
},
|
||||
wantRepos: []types.RepoIDName{
|
||||
{Name: "github.com/sourcegraph/about", ID: 1},
|
||||
{Name: "github.com/sourcegraph/annotate", ID: 2},
|
||||
{Name: "github.com/sourcegraph/sourcegraph", ID: 3},
|
||||
{Name: "github.com/facebook/react", ID: 6},
|
||||
},
|
||||
wantChunks: []FileChunkContext{
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/about",
|
||||
RepoID: 1,
|
||||
Path: "/file1.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/annotate",
|
||||
RepoID: 2,
|
||||
Path: "/file2.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/sourcegraph",
|
||||
RepoID: 3,
|
||||
Path: "/file3.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/facebook/react",
|
||||
RepoID: 6,
|
||||
Path: "/hooks.ts",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "exclude everything",
|
||||
ccf: &schema.CodyContextFilters{
|
||||
Include: []*schema.CodyContextFilterItem{
|
||||
{RepoNamePattern: "^github\\.com\\/sourcegraph\\/.+"},
|
||||
{RepoNamePattern: "^github\\.com\\/docker\\/compose$"},
|
||||
{RepoNamePattern: "^github\\.com\\/.+\\/react"},
|
||||
},
|
||||
Exclude: []*schema.CodyContextFilterItem{
|
||||
{RepoNamePattern: ".*cody.*"},
|
||||
{RepoNamePattern: ".*"},
|
||||
},
|
||||
},
|
||||
repos: []types.RepoIDName{
|
||||
{Name: "github.com/sourcegraph/about", ID: 1},
|
||||
{Name: "github.com/sourcegraph/annotate", ID: 2},
|
||||
{Name: "github.com/sourcegraph/sourcegraph", ID: 3},
|
||||
{Name: "github.com/docker/compose", ID: 4},
|
||||
{Name: "github.com/sourcegraph/cody", ID: 5},
|
||||
{Name: "github.com/facebook/react", ID: 6},
|
||||
},
|
||||
chunks: []FileChunkContext{
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/about",
|
||||
RepoID: 1,
|
||||
Path: "/file1.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/annotate",
|
||||
RepoID: 2,
|
||||
Path: "/file2.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/sourcegraph",
|
||||
RepoID: 3,
|
||||
Path: "/file3.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/docker/compose",
|
||||
RepoID: 4,
|
||||
Path: "/file4.go",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/sourcegraph/cody",
|
||||
RepoID: 5,
|
||||
Path: "/index.ts",
|
||||
},
|
||||
{
|
||||
RepoName: "github.com/facebook/react",
|
||||
RepoID: 6,
|
||||
Path: "/hooks.ts",
|
||||
},
|
||||
},
|
||||
wantRepos: []types.RepoIDName{},
|
||||
wantChunks: []FileChunkContext{},
|
||||
},
|
||||
content, err := os.ReadFile(filepath.Join("testdata", "enterprise_filter_test_data.json"))
|
||||
require.NoError(t, err)
|
||||
|
||||
type repo struct {
|
||||
Name api.RepoName
|
||||
Id api.RepoID `json:"id"`
|
||||
}
|
||||
type fileChunk struct {
|
||||
Repo repo
|
||||
Path string
|
||||
}
|
||||
type testCase struct {
|
||||
Name string `json:"name"`
|
||||
Description string `json:"description"`
|
||||
Ccf *schema.CodyContextFilters `json:"cody.contextFilters"`
|
||||
Repos []repo `json:"repos"`
|
||||
IncludedRepos []repo `json:"includedRepos"`
|
||||
FileChunks []fileChunk `json:"fileChunks"`
|
||||
IncludedFileChunks []fileChunk `json:"includedFileChunks"`
|
||||
}
|
||||
var data struct {
|
||||
TestCases []testCase `json:"testCases"`
|
||||
}
|
||||
|
||||
err = json.Unmarshal(content, &data)
|
||||
require.NoError(t, err)
|
||||
|
||||
toRepoIDName := func(r repo) types.RepoIDName { return types.RepoIDName{ID: r.Id, Name: r.Name} }
|
||||
|
||||
normalizeRepos := func(repos []repo) []types.RepoIDName {
|
||||
result := make([]types.RepoIDName, 0, len(repos))
|
||||
for _, r := range repos {
|
||||
result = append(result, toRepoIDName(r))
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
normalizeFileChunks := func(fcc []fileChunk) []FileChunkContext {
|
||||
result := make([]FileChunkContext, 0, len(fcc))
|
||||
for _, fc := range fcc {
|
||||
r := toRepoIDName(fc.Repo)
|
||||
result = append(result, FileChunkContext{RepoName: r.Name, RepoID: r.ID, Path: fc.Path})
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
newFF := func(v bool) *featureflag.FeatureFlag {
|
||||
@ -533,19 +84,20 @@ func TestNewEnterpriseFilter(t *testing.T) {
|
||||
}
|
||||
featureFlagValues := []*featureflag.FeatureFlag{newFF(true), newFF(false), nil}
|
||||
|
||||
for _, tt := range tests {
|
||||
for _, tt := range data.TestCases {
|
||||
for _, ff := range featureFlagValues {
|
||||
name := tt.name
|
||||
name := tt.Name
|
||||
if ff != nil {
|
||||
name = name + fmt.Sprintf(" (%q feature flag value: %t)", ff.Name, ff.Bool.Value)
|
||||
}
|
||||
t.Run(name, func(t *testing.T) {
|
||||
conf.Mock(&conf.Unified{
|
||||
SiteConfiguration: schema.SiteConfiguration{
|
||||
CodyContextFilters: tt.ccf,
|
||||
CodyContextFilters: tt.Ccf,
|
||||
},
|
||||
})
|
||||
|
||||
// TODO: remove feature flag mocking after `CodyContextFilters` support is added to the IDE clients.
|
||||
featureFlags := dbmocks.NewMockFeatureFlagStore()
|
||||
if ff != nil {
|
||||
featureFlags.GetFeatureFlagFunc.SetDefaultReturn(ff, nil)
|
||||
@ -554,21 +106,21 @@ func TestNewEnterpriseFilter(t *testing.T) {
|
||||
db.FeatureFlagsFunc.SetDefaultReturn(featureFlags)
|
||||
|
||||
f := newEnterpriseFilter(logtest.Scoped(t), db)
|
||||
allowedRepos, matcher, _ := f.getMatcher(context.Background(), tt.repos)
|
||||
filtered := make([]FileChunkContext, 0, len(tt.chunks))
|
||||
for _, chunk := range tt.chunks {
|
||||
if matcher(chunk.RepoID, chunk.Path) {
|
||||
filtered = append(filtered, chunk)
|
||||
includedRepos, matcher, _ := f.getMatcher(context.Background(), normalizeRepos(tt.Repos))
|
||||
includedFileChunks := make([]fileChunk, 0, len(tt.FileChunks))
|
||||
for _, chunk := range tt.FileChunks {
|
||||
if matcher(chunk.Repo.Id, chunk.Path) {
|
||||
includedFileChunks = append(includedFileChunks, chunk)
|
||||
}
|
||||
}
|
||||
|
||||
if ff != nil && ff.Bool.Value {
|
||||
require.Equal(t, tt.wantRepos, allowedRepos)
|
||||
require.Equal(t, tt.wantChunks, filtered)
|
||||
require.Equal(t, normalizeRepos(tt.IncludedRepos), includedRepos)
|
||||
require.Equal(t, normalizeFileChunks(tt.IncludedFileChunks), normalizeFileChunks(includedFileChunks))
|
||||
} else {
|
||||
// If feature flag is not set or is set to false, the Cody context filters are disabled.
|
||||
require.Equal(t, tt.repos, tt.repos)
|
||||
require.Equal(t, tt.wantChunks, tt.wantChunks)
|
||||
require.Equal(t, normalizeRepos(tt.Repos), includedRepos)
|
||||
require.Equal(t, normalizeFileChunks(tt.FileChunks), normalizeFileChunks(includedFileChunks))
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
699
cmd/frontend/internal/codycontext/testdata/enterprise_filter_test_data.json
vendored
Normal file
699
cmd/frontend/internal/codycontext/testdata/enterprise_filter_test_data.json
vendored
Normal file
@ -0,0 +1,699 @@
|
||||
{
|
||||
"testCases": [
|
||||
{
|
||||
"name": "Cody context filters are not defined",
|
||||
"description": "Any repo should be included.",
|
||||
"cody.contextFilters": null,
|
||||
"repos": [
|
||||
{ "name": "github.com/sourcegraph/about", "id": 1 },
|
||||
{ "name": "github.com/sourcegraph/annotate", "id": 2 },
|
||||
{ "name": "github.com/sourcegraph/sourcegraph", "id": 3 },
|
||||
{ "name": "github.com/docker/compose", "id": 4 }
|
||||
],
|
||||
"includedRepos": [
|
||||
{ "name": "github.com/sourcegraph/about", "id": 1 },
|
||||
{ "name": "github.com/sourcegraph/annotate", "id": 2 },
|
||||
{ "name": "github.com/sourcegraph/sourcegraph", "id": 3 },
|
||||
{ "name": "github.com/docker/compose", "id": 4 }
|
||||
],
|
||||
"fileChunks": [
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/about",
|
||||
"id": 1
|
||||
},
|
||||
"Path": "/file1.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/annotate",
|
||||
"id": 2
|
||||
},
|
||||
"Path": "/file2.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/sourcegraph",
|
||||
"id": 3
|
||||
},
|
||||
"Path": "/file3.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/docker/compose",
|
||||
"id": 4
|
||||
},
|
||||
"Path": "/file4.go"
|
||||
}
|
||||
],
|
||||
"includedFileChunks": [
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/about",
|
||||
"id": 1
|
||||
},
|
||||
"Path": "/file1.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/annotate",
|
||||
"id": 2
|
||||
},
|
||||
"Path": "/file2.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/sourcegraph",
|
||||
"id": 3
|
||||
},
|
||||
"Path": "/file3.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/docker/compose",
|
||||
"id": 4
|
||||
},
|
||||
"Path": "/file4.go"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Include and exclude rules are not defined",
|
||||
"description": "This scenario shouldn't happen. \"cody.contextFilters\" if defined in the site config, should have at least one property. Thus, either \"include\" or \"exclude\" should be defined. We rely on site config schema validation.",
|
||||
"cody.contextFilters": {},
|
||||
"repos": [
|
||||
{ "name": "github.com/sourcegraph/about", "id": 1 },
|
||||
{ "name": "github.com/sourcegraph/annotate", "id": 2 },
|
||||
{ "name": "github.com/sourcegraph/sourcegraph", "id": 3 },
|
||||
{ "name": "github.com/docker/compose", "id": 4 }
|
||||
],
|
||||
"includedRepos": [
|
||||
{ "name": "github.com/sourcegraph/about", "id": 1 },
|
||||
{ "name": "github.com/sourcegraph/annotate", "id": 2 },
|
||||
{ "name": "github.com/sourcegraph/sourcegraph", "id": 3 },
|
||||
{ "name": "github.com/docker/compose", "id": 4 }
|
||||
],
|
||||
"fileChunks": [
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/about",
|
||||
"id": 1
|
||||
},
|
||||
"path": "/file1.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/annotate",
|
||||
"id": 2
|
||||
},
|
||||
"path": "/file2.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/sourcegraph",
|
||||
"id": 3
|
||||
},
|
||||
"path": "/file3.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/docker/compose",
|
||||
"id": 4
|
||||
},
|
||||
"path": "/file4.go"
|
||||
}
|
||||
],
|
||||
"includedFileChunks": [
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/about",
|
||||
"id": 1
|
||||
},
|
||||
"path": "/file1.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/annotate",
|
||||
"id": 2
|
||||
},
|
||||
"path": "/file2.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/sourcegraph",
|
||||
"id": 3
|
||||
},
|
||||
"path": "/file3.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/docker/compose",
|
||||
"id": 4
|
||||
},
|
||||
"path": "/file4.go"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Include and exclude rules are empty lists",
|
||||
"description": "This scenario shouldn't happen. If either \"include\" or \"exclude\" field is defined, it should have at least one item. We rely on site config schema validation.",
|
||||
"cody.contextFilters": {
|
||||
"include": [],
|
||||
"exclude": []
|
||||
},
|
||||
"repos": [
|
||||
{ "name": "github.com/sourcegraph/about", "id": 1 },
|
||||
{ "name": "github.com/sourcegraph/annotate", "id": 2 },
|
||||
{ "name": "github.com/sourcegraph/sourcegraph", "id": 3 },
|
||||
{ "name": "github.com/docker/compose", "id": 4 }
|
||||
],
|
||||
"includedRepos": [
|
||||
{ "name": "github.com/sourcegraph/about", "id": 1 },
|
||||
{ "name": "github.com/sourcegraph/annotate", "id": 2 },
|
||||
{ "name": "github.com/sourcegraph/sourcegraph", "id": 3 },
|
||||
{ "name": "github.com/docker/compose", "id": 4 }
|
||||
],
|
||||
"fileChunks": [
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/about",
|
||||
"id": 1
|
||||
},
|
||||
"path": "/file1.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/annotate",
|
||||
"id": 2
|
||||
},
|
||||
"path": "/file2.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/sourcegraph",
|
||||
"id": 3
|
||||
},
|
||||
"path": "/file3.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/docker/compose",
|
||||
"id": 4
|
||||
},
|
||||
"path": "/file4.go"
|
||||
}
|
||||
],
|
||||
"includedFileChunks": [
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/about",
|
||||
"id": 1
|
||||
},
|
||||
"path": "/file1.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/annotate",
|
||||
"id": 2
|
||||
},
|
||||
"path": "/file2.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/sourcegraph",
|
||||
"id": 3
|
||||
},
|
||||
"path": "/file3.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/docker/compose",
|
||||
"id": 4
|
||||
},
|
||||
"path": "/file4.go"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Only include rules are defined",
|
||||
"description": "Only repos matching \"include\" repo name patterns should be included.",
|
||||
"cody.contextFilters": {
|
||||
"include": [{ "repoNamePattern": "^github\\.com\\/sourcegraph\\/.+" }]
|
||||
},
|
||||
"repos": [
|
||||
{ "name": "github.com/sourcegraph/about", "id": 1 },
|
||||
{ "name": "github.com/sourcegraph/annotate", "id": 2 },
|
||||
{ "name": "github.com/sourcegraph/sourcegraph", "id": 3 },
|
||||
{ "name": "github.com/docker/compose", "id": 4 }
|
||||
],
|
||||
"includedRepos": [
|
||||
{ "name": "github.com/sourcegraph/about", "id": 1 },
|
||||
{ "name": "github.com/sourcegraph/annotate", "id": 2 },
|
||||
{ "name": "github.com/sourcegraph/sourcegraph", "id": 3 }
|
||||
],
|
||||
"fileChunks": [
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/about",
|
||||
"id": 1
|
||||
},
|
||||
"path": "/file1.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/annotate",
|
||||
"id": 2
|
||||
},
|
||||
"path": "/file2.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/sourcegraph",
|
||||
"id": 3
|
||||
},
|
||||
"path": "/file3.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/docker/compose",
|
||||
"id": 4
|
||||
},
|
||||
"path": "/file4.go"
|
||||
}
|
||||
],
|
||||
"includedFileChunks": [
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/about",
|
||||
"id": 1
|
||||
},
|
||||
"path": "/file1.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/annotate",
|
||||
"id": 2
|
||||
},
|
||||
"path": "/file2.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/sourcegraph",
|
||||
"id": 3
|
||||
},
|
||||
"path": "/file3.go"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Only exclude rules are defined",
|
||||
"description": "Only repos not matching any of \"include\" repo name patterns should be included.",
|
||||
"cody.contextFilters": {
|
||||
"exclude": [{ "repoNamePattern": "^github\\.com\\/sourcegraph\\/.+" }]
|
||||
},
|
||||
"repos": [
|
||||
{ "name": "github.com/sourcegraph/about", "id": 1 },
|
||||
{ "name": "github.com/sourcegraph/annotate", "id": 2 },
|
||||
{ "name": "github.com/sourcegraph/sourcegraph", "id": 3 },
|
||||
{ "name": "github.com/docker/compose", "id": 4 }
|
||||
],
|
||||
"includedRepos": [{ "name": "github.com/docker/compose", "id": 4 }],
|
||||
"fileChunks": [
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/about",
|
||||
"id": 1
|
||||
},
|
||||
"path": "/file1.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/annotate",
|
||||
"id": 2
|
||||
},
|
||||
"path": "/file2.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/sourcegraph",
|
||||
"id": 3
|
||||
},
|
||||
"path": "/file3.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/docker/compose",
|
||||
"id": 4
|
||||
},
|
||||
"path": "/file4.go"
|
||||
}
|
||||
],
|
||||
"includedFileChunks": [
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/docker/compose",
|
||||
"id": 4
|
||||
},
|
||||
"path": "/file4.go"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Include and exclude rules are defined",
|
||||
"description": "Only repos matching any of \"include\" and not matching any of \"exclude\" repo name patterns should be included.",
|
||||
"cody.contextFilters": {
|
||||
"include": [{ "repoNamePattern": "^github\\.com\\/sourcegraph\\/.+" }],
|
||||
"exclude": [{ "repoNamePattern": ".*cody.*" }]
|
||||
},
|
||||
"repos": [
|
||||
{ "name": "github.com/sourcegraph/about", "id": 1 },
|
||||
{ "name": "github.com/sourcegraph/annotate", "id": 2 },
|
||||
{ "name": "github.com/sourcegraph/sourcegraph", "id": 3 },
|
||||
{ "name": "github.com/docker/compose", "id": 4 },
|
||||
{ "name": "github.com/sourcegraph/cody", "id": 5 }
|
||||
],
|
||||
"includedRepos": [
|
||||
{ "name": "github.com/sourcegraph/about", "id": 1 },
|
||||
{ "name": "github.com/sourcegraph/annotate", "id": 2 },
|
||||
{ "name": "github.com/sourcegraph/sourcegraph", "id": 3 }
|
||||
],
|
||||
"fileChunks": [
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/about",
|
||||
"id": 1
|
||||
},
|
||||
"path": "/file1.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/annotate",
|
||||
"id": 2
|
||||
},
|
||||
"path": "/file2.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/sourcegraph",
|
||||
"id": 3
|
||||
},
|
||||
"path": "/file3.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/docker/compose",
|
||||
"id": 4
|
||||
},
|
||||
"path": "/file4.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/cody",
|
||||
"id": 5
|
||||
},
|
||||
"path": "/index.ts"
|
||||
}
|
||||
],
|
||||
"includedFileChunks": [
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/about",
|
||||
"id": 1
|
||||
},
|
||||
"path": "/file1.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/annotate",
|
||||
"id": 2
|
||||
},
|
||||
"path": "/file2.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/sourcegraph",
|
||||
"id": 3
|
||||
},
|
||||
"path": "/file3.go"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Multiple include and exclude rules are defined",
|
||||
"description": "Only repos matching any of \"include\" and not matching any of \"exclude\" repo name patterns should be included.",
|
||||
"cody.contextFilters": {
|
||||
"include": [
|
||||
{ "repoNamePattern": "^github\\.com\\/sourcegraph\\/.+" },
|
||||
{ "repoNamePattern": "^github\\.com\\/docker\\/compose$" },
|
||||
{ "repoNamePattern": "^github\\.com\\/.+\\/react" }
|
||||
],
|
||||
"exclude": [{ "repoNamePattern": ".*cody.*" }, { "repoNamePattern": ".+\\/docker\\/.+" }]
|
||||
},
|
||||
"repos": [
|
||||
{ "name": "github.com/sourcegraph/about", "id": 1 },
|
||||
{ "name": "github.com/sourcegraph/annotate", "id": 2 },
|
||||
{ "name": "github.com/sourcegraph/sourcegraph", "id": 3 },
|
||||
{ "name": "github.com/docker/compose", "id": 4 },
|
||||
{ "name": "github.com/sourcegraph/cody", "id": 5 },
|
||||
{ "name": "github.com/facebook/react", "id": 6 }
|
||||
],
|
||||
"includedRepos": [
|
||||
{ "name": "github.com/sourcegraph/about", "id": 1 },
|
||||
{ "name": "github.com/sourcegraph/annotate", "id": 2 },
|
||||
{ "name": "github.com/sourcegraph/sourcegraph", "id": 3 },
|
||||
{ "name": "github.com/facebook/react", "id": 6 }
|
||||
],
|
||||
"fileChunks": [
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/about",
|
||||
"id": 1
|
||||
},
|
||||
"path": "/file1.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/annotate",
|
||||
"id": 2
|
||||
},
|
||||
"path": "/file2.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/sourcegraph",
|
||||
"id": 3
|
||||
},
|
||||
"path": "/file3.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/docker/compose",
|
||||
"id": 4
|
||||
},
|
||||
"path": "/file4.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/cody",
|
||||
"id": 5
|
||||
},
|
||||
"path": "/index.ts"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/facebook/react",
|
||||
"id": 6
|
||||
},
|
||||
"path": "/hooks.ts"
|
||||
}
|
||||
],
|
||||
"includedFileChunks": [
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/about",
|
||||
"id": 1
|
||||
},
|
||||
"path": "/file1.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/annotate",
|
||||
"id": 2
|
||||
},
|
||||
"path": "/file2.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/sourcegraph",
|
||||
"id": 3
|
||||
},
|
||||
"path": "/file3.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/facebook/react",
|
||||
"id": 6
|
||||
},
|
||||
"path": "/hooks.ts"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Include rules contain repo name pattern matching any repo",
|
||||
"description": "Any repo should be included.",
|
||||
"cody.contextFilters": {
|
||||
"include": [{ "repoNamePattern": ".*" }]
|
||||
},
|
||||
"repos": [
|
||||
{ "name": "github.com/sourcegraph/about", "id": 1 },
|
||||
{ "name": "github.com/sourcegraph/annotate", "id": 2 },
|
||||
{ "name": "github.com/sourcegraph/sourcegraph", "id": 3 },
|
||||
{ "name": "github.com/docker/compose", "id": 4 },
|
||||
{ "name": "github.com/sourcegraph/cody", "id": 5 },
|
||||
{ "name": "github.com/facebook/react", "id": 6 }
|
||||
],
|
||||
"includedRepos": [
|
||||
{ "name": "github.com/sourcegraph/about", "id": 1 },
|
||||
{ "name": "github.com/sourcegraph/annotate", "id": 2 },
|
||||
{ "name": "github.com/sourcegraph/sourcegraph", "id": 3 },
|
||||
{ "name": "github.com/docker/compose", "id": 4 },
|
||||
{ "name": "github.com/sourcegraph/cody", "id": 5 },
|
||||
{ "name": "github.com/facebook/react", "id": 6 }
|
||||
],
|
||||
"fileChunks": [
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/about",
|
||||
"id": 1
|
||||
},
|
||||
"path": "/file1.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/annotate",
|
||||
"id": 2
|
||||
},
|
||||
"path": "/file2.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/sourcegraph",
|
||||
"id": 3
|
||||
},
|
||||
"path": "/file3.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/docker/compose",
|
||||
"id": 4
|
||||
},
|
||||
"path": "/file4.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/cody",
|
||||
"id": 5
|
||||
},
|
||||
"path": "/index.ts"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/facebook/react",
|
||||
"id": 6
|
||||
},
|
||||
"path": "/hooks.ts"
|
||||
}
|
||||
],
|
||||
"includedFileChunks": [
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/about",
|
||||
"id": 1
|
||||
},
|
||||
"path": "/file1.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/annotate",
|
||||
"id": 2
|
||||
},
|
||||
"path": "/file2.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/sourcegraph",
|
||||
"id": 3
|
||||
},
|
||||
"path": "/file3.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/docker/compose",
|
||||
"id": 4
|
||||
},
|
||||
"path": "/file4.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/cody",
|
||||
"id": 5
|
||||
},
|
||||
"path": "/index.ts"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/facebook/react",
|
||||
"id": 6
|
||||
},
|
||||
"path": "/hooks.ts"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Exclude rules contain repo name pattern matching any repo",
|
||||
"description": "Neither repo should be included.",
|
||||
"cody.contextFilters": {
|
||||
"include": [{ "repoNamePattern": "^github\\.com\\/sourcegraph\\/.+" }],
|
||||
"exclude": [{ "repoNamePattern": ".*" }]
|
||||
},
|
||||
"repos": [
|
||||
{ "name": "github.com/sourcegraph/about", "id": 1 },
|
||||
{ "name": "github.com/sourcegraph/annotate", "id": 2 },
|
||||
{ "name": "github.com/sourcegraph/sourcegraph", "id": 3 },
|
||||
{ "name": "github.com/docker/compose", "id": 4 }
|
||||
],
|
||||
"includedRepos": [],
|
||||
"fileChunks": [
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/about",
|
||||
"id": 1
|
||||
},
|
||||
"path": "/file1.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/annotate",
|
||||
"id": 2
|
||||
},
|
||||
"path": "/file2.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/sourcegraph/sourcegraph",
|
||||
"id": 3
|
||||
},
|
||||
"path": "/file3.go"
|
||||
},
|
||||
{
|
||||
"repo": {
|
||||
"name": "github.com/docker/compose",
|
||||
"id": 4
|
||||
},
|
||||
"path": "/file4.go"
|
||||
}
|
||||
],
|
||||
"includedFileChunks": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -81,6 +81,7 @@
|
||||
"@sentry/cli": "^1.74.4",
|
||||
"@sentry/esbuild-plugin": "^2.7.1",
|
||||
"@slack/web-api": "^5.15.0",
|
||||
"@sourcegraph/cody-context-filters-test-dataset": "^1.0.0",
|
||||
"@sourcegraph/eslint-config": "0.37.1",
|
||||
"@sourcegraph/eslint-plugin-sourcegraph": "^1.0.5",
|
||||
"@sourcegraph/eslint-plugin-wildcard": "workspace:*",
|
||||
|
||||
@ -542,6 +542,9 @@ importers:
|
||||
'@slack/web-api':
|
||||
specifier: ^5.15.0
|
||||
version: 5.15.0
|
||||
'@sourcegraph/cody-context-filters-test-dataset':
|
||||
specifier: ^1.0.0
|
||||
version: 1.0.0
|
||||
'@sourcegraph/eslint-config':
|
||||
specifier: 0.37.1
|
||||
version: 0.37.1(@testing-library/dom@8.13.0)(eslint@8.57.0)(typescript@5.4.2)
|
||||
@ -8426,6 +8429,10 @@ packages:
|
||||
'@sourcegraph/codemod-toolkit-ts': 1.0.1
|
||||
dev: true
|
||||
|
||||
/@sourcegraph/cody-context-filters-test-dataset@1.0.0:
|
||||
resolution: {integrity: sha512-Uf7wMo5Fu3+g03gl2jvU2qHMaDp0p9RK9U2ucmy6VxWaavxALCC8iy47JL5GdgR5qG3ekEd5mAQV0dIIfoKELA==}
|
||||
dev: true
|
||||
|
||||
/@sourcegraph/eslint-config@0.37.1(@testing-library/dom@8.13.0)(eslint@8.57.0)(typescript@5.4.2):
|
||||
resolution: {integrity: sha512-3G0d3OUgifaADfd27Bdk/kSpECj21BfQ6srbYMY/HVWOv/N8AVuFWNwUMT4Y4slt026RXO5XcwoZhfnaskr5hQ==}
|
||||
dependencies:
|
||||
|
||||
@ -1,3 +1,5 @@
|
||||
packages:
|
||||
- 'client/*'
|
||||
# The test dataset is generated and ignored by Git. Use the published version instead.
|
||||
- '!client/cody-context-filters-test-dataset'
|
||||
- 'schema'
|
||||
|
||||
Loading…
Reference in New Issue
Block a user