Skip to content

Commit 6d5b2f4

Browse files
committed
Add allowPatterns configuration to enable selective inclusion of files ignored by gitignore patterns
1 parent 8400803 commit 6d5b2f4

11 files changed

Lines changed: 163 additions & 10 deletions

File tree

‎packages/vscode/package.json‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -654,6 +654,13 @@
654654
"type": "string"
655655
}
656656
},
657+
"codeWebChat.allowPatterns": {
658+
"type": "array",
659+
"scope": "resource",
660+
"items": {
661+
"type": "string"
662+
}
663+
},
657664
"codeWebChat.editFormatInstructionsWhole": {
658665
"type": "string",
659666
"scope": "resource"

‎packages/vscode/src/context/providers/open-editors/open-editors-provider.ts‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,10 @@ export class OpenEditorsProvider
5050

5151
this._config_change_handler = vscode.workspace.onDidChangeConfiguration(
5252
(event) => {
53-
if (event.affectsConfiguration('codeWebChat.ignorePatterns')) {
53+
if (
54+
event.affectsConfiguration('codeWebChat.ignorePatterns') ||
55+
event.affectsConfiguration('codeWebChat.allowPatterns')
56+
) {
5457
this._uncheck_ignored_files()
5558
this.refresh()
5659
}

‎packages/vscode/src/context/providers/workspace/workspace-provider.ts‎

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ export class WorkspaceProvider
4545
private _checked_items: Map<string, vscode.TreeItemCheckboxState> = new Map()
4646
private _checked_timestamps: Map<string, number> = new Map()
4747
private _combined_gitignore = ignore()
48-
private _user_ignore: Ignore = ignore()
48+
private _user_ignore_patterns: Ignore = ignore()
49+
private _user_allow_patterns: Ignore = ignore()
4950
private _watcher: vscode.FileSystemWatcher
5051
private _ranges_watcher: vscode.FileSystemWatcher
5152
private _gitignore_watcher: vscode.FileSystemWatcher
@@ -89,7 +90,10 @@ export class WorkspaceProvider
8990

9091
this._config_change_handler = vscode.workspace.onDidChangeConfiguration(
9192
(event) => {
92-
if (event.affectsConfiguration('codeWebChat.ignorePatterns')) {
93+
if (
94+
event.affectsConfiguration('codeWebChat.ignorePatterns') ||
95+
event.affectsConfiguration('codeWebChat.allowPatterns')
96+
) {
9397
this._load_ignore_patterns()
9498
this._uncheck_ignored_files()
9599
this.refresh()
@@ -1346,19 +1350,29 @@ export class WorkspaceProvider
13461350
return true
13471351
}
13481352

1353+
if (this._user_allow_patterns.ignores(relative_path)) {
1354+
return false
1355+
}
1356+
13491357
return this._combined_gitignore.ignores(relative_path)
13501358
}
13511359

13521360
private _load_ignore_patterns() {
13531361
const config = vscode.workspace.getConfiguration('codeWebChat')
13541362
const patterns = config.get<string[]>('ignorePatterns')
1355-
this._user_ignore = ignore()
1363+
this._user_ignore_patterns = ignore()
13561364
if (patterns) {
1357-
this._user_ignore.add(patterns)
1365+
this._user_ignore_patterns.add(patterns)
13581366
}
13591367

1360-
this._user_ignore.add(IGNORE_PATTERNS)
1361-
this._user_ignore.add('node_modules')
1368+
this._user_ignore_patterns.add(IGNORE_PATTERNS)
1369+
this._user_ignore_patterns.add('node_modules')
1370+
1371+
const allow_patterns = config.get<string[]>('allowPatterns')
1372+
this._user_allow_patterns = ignore()
1373+
if (allow_patterns) {
1374+
this._user_allow_patterns.add(allow_patterns)
1375+
}
13621376

13631377
// Clear token caches since exclusions have changed
13641378
this._token_calculator.clear_caches()
@@ -1369,10 +1383,16 @@ export class WorkspaceProvider
13691383
if (!workspace_root) {
13701384
// To handle files outside of a workspace, we can only check filename patterns
13711385
const basename = path.basename(file_path)
1372-
return this._user_ignore.ignores(basename)
1386+
if (this._user_allow_patterns.ignores(basename)) {
1387+
return false
1388+
}
1389+
return this._user_ignore_patterns.ignores(basename)
13731390
}
13741391
const relative_path = path.relative(workspace_root, file_path)
1375-
return this._user_ignore.ignores(relative_path)
1392+
if (this._user_allow_patterns.ignores(relative_path)) {
1393+
return false
1394+
}
1395+
return this._user_ignore_patterns.ignores(relative_path)
13761396
}
13771397

13781398
public is_partially_checked(path: string): boolean {
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
import * as vscode from 'vscode'
2+
import * as path from 'path'
3+
4+
export const handle_open_allow_patterns_settings = async (): Promise<void> => {
5+
const workspaceFolders = vscode.workspace.workspaceFolders
6+
if (!workspaceFolders || workspaceFolders.length === 0) {
7+
return
8+
}
9+
10+
let selectedFolder: vscode.WorkspaceFolder | undefined
11+
12+
if (workspaceFolders.length > 1) {
13+
const items = workspaceFolders.map((f) => ({ label: f.name, folder: f }))
14+
selectedFolder = await new Promise<vscode.WorkspaceFolder | undefined>(
15+
(resolve) => {
16+
const quick_pick = vscode.window.createQuickPick<(typeof items)[0]>()
17+
quick_pick.items = items
18+
quick_pick.title = 'Workspaces'
19+
quick_pick.placeholder =
20+
'Select workspace folder to configure allow patterns'
21+
const close_button: vscode.QuickInputButton = {
22+
iconPath: new vscode.ThemeIcon('close'),
23+
tooltip: 'Close'
24+
}
25+
quick_pick.buttons = [close_button]
26+
let is_accepted = false
27+
const disposables: vscode.Disposable[] = []
28+
const cleanup = () => {
29+
disposables.forEach((d) => d.dispose())
30+
quick_pick.dispose()
31+
}
32+
disposables.push(
33+
quick_pick.onDidAccept(() => {
34+
is_accepted = true
35+
const selected = quick_pick.selectedItems[0]
36+
resolve(selected?.folder)
37+
quick_pick.hide()
38+
}),
39+
quick_pick.onDidTriggerButton((button) => {
40+
if (button === close_button) {
41+
quick_pick.hide()
42+
}
43+
}),
44+
quick_pick.onDidHide(() => {
45+
if (!is_accepted) {
46+
resolve(undefined)
47+
}
48+
cleanup()
49+
})
50+
)
51+
quick_pick.show()
52+
}
53+
)
54+
} else {
55+
selectedFolder = workspaceFolders[0]
56+
}
57+
58+
if (!selectedFolder) {
59+
return
60+
}
61+
62+
// Ensure key exists
63+
const config = vscode.workspace.getConfiguration(
64+
'codeWebChat',
65+
selectedFolder.uri
66+
)
67+
const inspect = config.inspect('allowPatterns')
68+
69+
if (inspect?.workspaceFolderValue === undefined) {
70+
await config.update(
71+
'allowPatterns',
72+
[],
73+
vscode.ConfigurationTarget.WorkspaceFolder
74+
)
75+
}
76+
77+
// Open the file
78+
const settingsPath = path.join(
79+
selectedFolder.uri.fsPath,
80+
'.vscode',
81+
'settings.json'
82+
)
83+
const settingsUri = vscode.Uri.file(settingsPath)
84+
85+
try {
86+
const doc = await vscode.workspace.openTextDocument(settingsUri)
87+
await vscode.window.showTextDocument(doc)
88+
} catch (e) {
89+
vscode.window.showErrorMessage(
90+
`Could not open settings file at ${settingsPath}`
91+
)
92+
}
93+
}

‎packages/vscode/src/views/settings/backend/message-handlers/index.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,6 @@ export * from './handle-update-are-automatic-checkpoints-disabled'
4040
export * from './handle-get-checkpoint-lifespan'
4141
export * from './handle-upsert-configuration'
4242
export * from './handle-open-ignore-patterns-settings'
43+
export * from './handle-open-allow-patterns-settings'
4344
export * from './handle-get-send-with-shift-enter'
4445
export * from './handle-update-send-with-shift-enter'

‎packages/vscode/src/views/settings/backend/settings-provider.ts‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ import {
4747
handle_update_ai_studio_user_id,
4848
handle_update_send_with_shift_enter,
4949
handle_upsert_configuration,
50-
handle_open_ignore_patterns_settings
50+
handle_open_ignore_patterns_settings,
51+
handle_open_allow_patterns_settings
5152
} from './message-handlers'
5253

5354
export class SettingsProvider {
@@ -233,6 +234,8 @@ export class SettingsProvider {
233234
await vscode.commands.executeCommand('workbench.action.openSettings')
234235
} else if (message.command == 'OPEN_IGNORE_PATTERNS_SETTINGS') {
235236
await handle_open_ignore_patterns_settings()
237+
} else if (message.command == 'OPEN_ALLOW_PATTERNS_SETTINGS') {
238+
await handle_open_allow_patterns_settings()
236239
} else if (message.command == 'UPSERT_CONFIGURATION') {
237240
await handle_upsert_configuration(this, message)
238241
}

‎packages/vscode/src/views/settings/frontend/Home/Home.tsx‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ type Props = {
108108
) => void
109109
on_open_editor_settings: () => void
110110
on_open_ignore_patterns_settings: () => void
111+
on_open_allow_patterns_settings: () => void
111112
on_add_provider: () => void
112113
on_delete_provider: (provider_name: string) => void
113114
on_edit_provider: (provider_name: string) => void
@@ -317,6 +318,9 @@ export const Home: React.FC<Props> = (props) => {
317318
on_open_ignore_patterns_settings={
318319
props.on_open_ignore_patterns_settings
319320
}
321+
on_open_allow_patterns_settings={
322+
props.on_open_allow_patterns_settings
323+
}
320324
on_stuck_change={general_on_stuck_change}
321325
/>
322326
<PresetsSection

‎packages/vscode/src/views/settings/frontend/Home/sections/GeneralSection.tsx‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ type Props = {
3535
) => void
3636
on_open_editor_settings: () => void
3737
on_open_ignore_patterns_settings: () => void
38+
on_open_allow_patterns_settings: () => void
3839
on_stuck_change: (is_stuck: boolean) => void
3940
}
4041

@@ -116,6 +117,15 @@ export const GeneralSection = forwardRef<HTMLDivElement, Props>(
116117
</TextButton>
117118
}
118119
/>
120+
<Item
121+
title="Allow patterns"
122+
description="Glob patterns that you want to include despite being ignored by .gitignore."
123+
slot_right={
124+
<TextButton on_click={props.on_open_allow_patterns_settings}>
125+
Open settings file
126+
</TextButton>
127+
}
128+
/>
119129
<Item
120130
title="Context Size Warning Threshold"
121131
description="Set the token count threshold for showing a warning about large context sizes."

‎packages/vscode/src/views/settings/frontend/Settings.tsx‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,9 @@ export const Settings = () => {
125125
on_open_ignore_patterns_settings={
126126
settings_hook.handle_open_ignore_patterns_settings
127127
}
128+
on_open_allow_patterns_settings={
129+
settings_hook.handle_open_allow_patterns_settings
130+
}
128131
on_reorder_providers={settings_hook.handle_reorder_providers}
129132
on_add_provider={settings_hook.handle_add_provider}
130133
on_delete_provider={settings_hook.handle_delete_provider}

‎packages/vscode/src/views/settings/frontend/hooks/use-settings.ts‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,9 @@ export const use_settings = (vscode: any) => {
259259
const handle_open_ignore_patterns_settings = () =>
260260
post_message(vscode, { command: 'OPEN_IGNORE_PATTERNS_SETTINGS' })
261261

262+
const handle_open_allow_patterns_settings = () =>
263+
post_message(vscode, { command: 'OPEN_ALLOW_PATTERNS_SETTINGS' })
264+
262265
const handle_context_size_warning_threshold_change = (threshold: number) =>
263266
post_message(vscode, {
264267
command: 'UPDATE_CONTEXT_SIZE_WARNING_THRESHOLD',
@@ -349,6 +352,7 @@ export const use_settings = (vscode: any) => {
349352
handle_edit_context_system_instructions_change,
350353
handle_open_editor_settings,
351354
handle_open_ignore_patterns_settings,
355+
handle_open_allow_patterns_settings,
352356
handle_context_size_warning_threshold_change,
353357
handle_edit_format_instructions_change,
354358
handle_automatic_checkpoints_toggle,

0 commit comments

Comments
 (0)