Skip to content

Commit bf8c04d

Browse files
committed
Add file search functionality to git file selection quick picks
- implement 'search files' in `apps/editor/src/commands/select-commit-files-command.ts`
1 parent 3e74955 commit bf8c04d

3 files changed

Lines changed: 177 additions & 25 deletions

File tree

‎apps/editor/src/commands/select-changed-files-command.ts‎

Lines changed: 62 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { Logger } from '@shared/utils/logger'
99
import { dictionary } from '@shared/constants/dictionary'
1010
import { t } from '@/i18n'
1111
import { display_token_count } from '@/utils/display-token-count'
12+
import { search_files } from '@/features/search-files'
1213

1314
export const select_changed_files_command = (
1415
workspace_provider: WorkspaceProvider,
@@ -224,31 +225,53 @@ export const select_changed_files_command = (
224225
}
225226
update_placeholder()
226227
quick_pick_files.onDidChangeSelection(update_placeholder)
227-
quick_pick_files.buttons = [vscode.QuickInputButtons.Back]
228+
229+
const search_button = {
230+
iconPath: new vscode.ThemeIcon('search'),
231+
tooltip: t('common.search-in-results')
232+
}
233+
234+
const close_button = {
235+
iconPath: new vscode.ThemeIcon('close'),
236+
tooltip: t('common.close')
237+
}
238+
239+
quick_pick_files.buttons = [
240+
vscode.QuickInputButtons.Back,
241+
search_button,
242+
close_button
243+
]
228244
quick_pick_files.ignoreFocusOut = true
229245

230246
const selected_files = await new Promise<
231-
any[] | 'back' | undefined
247+
any[] | 'back' | undefined | 'search'
232248
>((resolve) => {
233-
let is_accepted = false
234-
let did_trigger_back = false
249+
let is_resolved = false
235250
const disposables: vscode.Disposable[] = []
236251

237252
disposables.push(
238253
quick_pick_files.onDidTriggerButton((button) => {
239254
if (button === vscode.QuickInputButtons.Back) {
240-
did_trigger_back = true
255+
is_resolved = true
241256
resolve('back')
242257
quick_pick_files.hide()
258+
} else if (button === search_button) {
259+
is_resolved = true
260+
resolve('search')
261+
quick_pick_files.hide()
262+
} else if (button === close_button) {
263+
is_resolved = true
264+
resolve(undefined)
265+
quick_pick_files.hide()
243266
}
244267
}),
245268
quick_pick_files.onDidAccept(() => {
246-
is_accepted = true
269+
is_resolved = true
247270
resolve(Array.from(quick_pick_files.selectedItems))
248271
quick_pick_files.hide()
249272
}),
250273
quick_pick_files.onDidHide(() => {
251-
if (!is_accepted && !did_trigger_back) {
274+
if (!is_resolved) {
252275
resolve('back')
253276
}
254277
disposables.forEach((d) => d.dispose())
@@ -263,11 +286,41 @@ export const select_changed_files_command = (
263286
break // break inner loop
264287
}
265288

266-
if (!selected_files || selected_files.length === 0) {
289+
if (!selected_files) {
290+
return
291+
}
292+
293+
let selected_paths: string[] = []
294+
295+
if (selected_files === 'search') {
296+
const search_result = await search_files({
297+
get_files: async () => valid_files.map((f) => f.absolute_path),
298+
workspace_provider,
299+
extension_context,
300+
show_back_button: true,
301+
disable_semantic: true
302+
})
303+
304+
if (search_result === 'back') {
305+
continue
306+
}
307+
308+
if (!search_result) {
309+
return
310+
}
311+
312+
selected_paths = search_result.selected_paths
313+
} else {
314+
if (selected_files.length === 0) {
315+
return
316+
}
317+
selected_paths = selected_files.map((item) => item.file_path)
318+
}
319+
320+
if (selected_paths.length === 0) {
267321
return
268322
}
269323

270-
const selected_paths = selected_files.map((item) => item.file_path)
271324
let paths_to_apply = selected_paths
272325
let should_continue_file_loop = false
273326

‎apps/editor/src/commands/select-commit-files-command.ts‎

Lines changed: 62 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { Logger } from '@shared/utils/logger'
1010
import { dictionary } from '@shared/constants/dictionary'
1111
import { t } from '@/i18n'
1212
import { display_token_count } from '@/utils/display-token-count'
13+
import { search_files } from '@/features/search-files'
1314

1415
export const select_commit_files_command = (
1516
workspace_provider: WorkspaceProvider,
@@ -207,31 +208,53 @@ export const select_commit_files_command = (
207208
}
208209
update_placeholder()
209210
quick_pick_files.onDidChangeSelection(update_placeholder)
210-
quick_pick_files.buttons = [vscode.QuickInputButtons.Back]
211+
212+
const search_button = {
213+
iconPath: new vscode.ThemeIcon('search'),
214+
tooltip: t('common.search-in-results')
215+
}
216+
217+
const close_button = {
218+
iconPath: new vscode.ThemeIcon('close'),
219+
tooltip: t('common.close')
220+
}
221+
222+
quick_pick_files.buttons = [
223+
vscode.QuickInputButtons.Back,
224+
search_button,
225+
close_button
226+
]
211227
quick_pick_files.ignoreFocusOut = true
212228

213229
const selected_files = await new Promise<
214-
any[] | 'back' | undefined
230+
any[] | 'back' | undefined | 'search'
215231
>((resolve) => {
216-
let is_accepted = false
217-
let did_trigger_back = false
232+
let is_resolved = false
218233
const disposables: vscode.Disposable[] = []
219234

220235
disposables.push(
221236
quick_pick_files.onDidTriggerButton((button) => {
222237
if (button === vscode.QuickInputButtons.Back) {
223-
did_trigger_back = true
238+
is_resolved = true
224239
resolve('back')
225240
quick_pick_files.hide()
241+
} else if (button === search_button) {
242+
is_resolved = true
243+
resolve('search')
244+
quick_pick_files.hide()
245+
} else if (button === close_button) {
246+
is_resolved = true
247+
resolve(undefined)
248+
quick_pick_files.hide()
226249
}
227250
}),
228251
quick_pick_files.onDidAccept(() => {
229-
is_accepted = true
252+
is_resolved = true
230253
resolve(Array.from(quick_pick_files.selectedItems))
231254
quick_pick_files.hide()
232255
}),
233256
quick_pick_files.onDidHide(() => {
234-
if (!is_accepted && !did_trigger_back) {
257+
if (!is_resolved) {
235258
resolve('back')
236259
}
237260
disposables.forEach((d) => d.dispose())
@@ -246,11 +269,41 @@ export const select_commit_files_command = (
246269
break // break inner loop
247270
}
248271

249-
if (!selected_files || selected_files.length == 0) {
272+
if (!selected_files) {
273+
return
274+
}
275+
276+
let selected_paths: string[] = []
277+
278+
if (selected_files === 'search') {
279+
const search_result = await search_files({
280+
get_files: async () => valid_files.map((f) => f.absolute_path),
281+
workspace_provider,
282+
extension_context,
283+
show_back_button: true,
284+
disable_semantic: true
285+
})
286+
287+
if (search_result === 'back') {
288+
continue
289+
}
290+
291+
if (!search_result) {
292+
return
293+
}
294+
295+
selected_paths = search_result.selected_paths
296+
} else {
297+
if (selected_files.length == 0) {
298+
return
299+
}
300+
selected_paths = selected_files.map((item) => item.file_path)
301+
}
302+
303+
if (selected_paths.length == 0) {
250304
return
251305
}
252306

253-
const selected_paths = selected_files.map((item) => item.file_path)
254307
let paths_to_apply = selected_paths
255308
let should_continue_file_loop = false
256309

‎apps/editor/src/commands/select-unstaged-files-command.ts‎

Lines changed: 53 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { Logger } from '@shared/utils/logger'
77
import { display_token_count } from '../utils/display-token-count'
88
import { LAST_APPLY_CONTEXT_MERGE_REPLACE_OPTION_STATE_KEY } from '../constants/state-keys'
99
import { t } from '@/i18n'
10+
import { search_files } from '@/features/search-files'
1011

1112
export const select_unstaged_files_command = (
1213
workspace_provider: WorkspaceProvider,
@@ -123,18 +124,33 @@ export const select_unstaged_files_command = (
123124
quick_pick.selectedItems = quick_pick_items.filter(
124125
(item) => item.picked
125126
)
126-
quick_pick.buttons = [
127-
{ iconPath: new vscode.ThemeIcon('close'), tooltip: 'Close' }
128-
]
127+
128+
const search_button = {
129+
iconPath: new vscode.ThemeIcon('search'),
130+
tooltip: t('common.search-in-results')
131+
}
132+
const close_button = {
133+
iconPath: new vscode.ThemeIcon('close'),
134+
tooltip: t('common.close')
135+
}
136+
137+
quick_pick.buttons = [search_button, close_button]
129138

130139
const selected_items = await new Promise<
131140
| readonly (vscode.QuickPickItem & { file_path: string })[]
132141
| undefined
142+
| 'search'
133143
>((resolve) => {
134144
let is_accepted = false
135145

136-
quick_pick.onDidTriggerButton((_button) => {
137-
quick_pick.hide()
146+
quick_pick.onDidTriggerButton((button) => {
147+
if (button === search_button) {
148+
resolve('search')
149+
quick_pick.hide()
150+
} else if (button === close_button) {
151+
resolve(undefined)
152+
quick_pick.hide()
153+
}
138154
})
139155

140156
quick_pick.onDidTriggerItemButton(async (e) => {
@@ -165,11 +181,41 @@ export const select_unstaged_files_command = (
165181
quick_pick.show()
166182
})
167183

168-
if (!selected_items || selected_items.length == 0) {
184+
if (
185+
!selected_items ||
186+
(Array.isArray(selected_items) && selected_items.length === 0)
187+
) {
188+
return
189+
}
190+
191+
let selected_paths: string[] = []
192+
193+
if (selected_items === 'search') {
194+
const search_result = await search_files({
195+
get_files: async () => existing_unstaged_files,
196+
workspace_provider,
197+
extension_context,
198+
show_back_button: true,
199+
disable_semantic: true
200+
})
201+
202+
if (search_result === 'back') {
203+
continue
204+
}
205+
206+
if (!search_result) {
207+
return
208+
}
209+
210+
selected_paths = search_result.selected_paths
211+
} else {
212+
selected_paths = selected_items.map((item) => item.file_path)
213+
}
214+
215+
if (selected_paths.length === 0) {
169216
return
170217
}
171218

172-
const selected_paths = selected_items.map((item) => item.file_path)
173219
let paths_to_apply = selected_paths
174220
let should_continue = false
175221

0 commit comments

Comments
 (0)