@@ -53,10 +53,10 @@ import {
5353} from './theme/theme-colors' ;
5454import type { LayoutMode } from '../platform' ;
5555import { getWorkbenchSettings , updateSettings , onSettingsChange , getSettingsVersion , getLastOpenTabs , getLastActiveTab , getLastPinnedTabs , applyWorkspaceOverlay , setNumberSetting } from './settings' ;
56- import { readFileSync , writeFileSync , readdirSync , isDirectory , existsSync , unlinkSync } from 'fs' ;
56+ import { readFileSync , writeFileSync , readdirSync , existsSync , unlinkSync } from 'fs' ;
5757import { join } from 'path' ;
58- import { spawnBackground } from 'child_process ' ;
59- import { execSync , spawnSync } from 'child_process ' ;
58+ import { execText , spawnText , spawnBackground } from '../process-compat ' ;
59+ import { isDirectory } from '../fs-compat ' ;
6060import { spawn } from 'perry/thread' ;
6161import { getTempDir , getCwd , getHomeDir , getAppDataDir } from './paths' ;
6262import { getPlatformContext , isWebPlatform } from '../platform' ;
@@ -151,7 +151,7 @@ import { initWorkspaceTrust, isWorkspaceTrusted, trustWorkspace, revokeWorkspace
151151import { renderReferencesPeek , showReferencesFromJson , setReferencesJumpHandler } from './views/references-peek/references-peek' ;
152152import { renderTasksPanel , runDefaultBuildTask , runTaskByLabel , setTasksWorkspaceRoot , setTasksAppDataDir , setOnTaskRunStart , setOnTaskRunDone } from './views/tasks/tasks-panel' ;
153153import { initRecentItems , addRecentFile , addRecentFolder , getRecentPath , getRecentType } from './views/recent/recent-store' ;
154- import { createFindBar , setFindEditorCallbacks , showFindBar , showFindBarWithReplace , hideFindBar , isFindBarVisible } from './views/find/find-bar' ;
154+ import { createFindBar , setFindEditorCallbacks , showFindBar , showFindBarWithReplace , hideFindBar , isFindBarVisible , getFindMatchCount , getFindCurrentMatch , getFindMatchLine , getFindMatchCol , getFindMatchLen } from './views/find/find-bar' ;
155155import { setLspWorkspaceRoot , initLspBridge , triggerDiagnostics , getCompletions , setDiagnosticsStatusUpdater } from './views/lsp/lsp-bridge' ;
156156import { setDiagnosticsFileOpener } from './views/lsp/diagnostics-panel' ;
157157import { createAutocompletePopup , setAutocompleteAcceptHandler } from './views/lsp/autocomplete-popup' ;
@@ -489,7 +489,7 @@ function toggleSidebarLocation(): void {
489489function copyBranchNameToClipboard ( ) : void {
490490 if ( workspaceRoot . length === 0 ) return ;
491491 try {
492- const r = spawnSync ( 'git' , [ '-C' , workspaceRoot , 'rev-parse' , '--abbrev-ref' , 'HEAD' ] ) ;
492+ const r = spawnText ( 'git' , [ '-C' , workspaceRoot , 'rev-parse' , '--abbrev-ref' , 'HEAD' ] ) ;
493493 if ( r . status !== 0 ) return ;
494494 let s = r . stdout ;
495495 let end = s . length ;
@@ -1839,7 +1839,7 @@ function promptCloseDirtyTabMacos(filePath: string): number {
18391839 script += ' return "2"\n' ;
18401840 script += 'end try\n' ;
18411841 try {
1842- const r = spawnSync ( 'osascript' , [ '-e' , script ] ) ;
1842+ const r = spawnText ( 'osascript' , [ '-e' , script ] ) ;
18431843 if ( r . status !== 0 ) return 2 ;
18441844 const out = r . stdout . length > 0 ? r . stdout . charAt ( 0 ) : '' ;
18451845 if ( out === '0' ) return 0 ;
@@ -1859,7 +1859,7 @@ function promptCloseDirtyTabWindows(filePath: string): number {
18591859 ps += '\'Save changes to ' + name + '?\',\'Hone\',\'YesNoCancel\',\'Question\');' ;
18601860 ps += 'if ($r -eq \'Yes\') { [Console]::Out.Write(\'0\') } elseif ($r -eq \'No\') { [Console]::Out.Write(\'1\') } else { [Console]::Out.Write(\'2\') }' ;
18611861 try {
1862- const r = spawnSync ( 'powershell.exe' , [ '-NoProfile' , '-NonInteractive' , '-Command' , ps ] ) ;
1862+ const r = spawnText ( 'powershell.exe' , [ '-NoProfile' , '-NonInteractive' , '-Command' , ps ] ) ;
18631863 if ( r . status !== 0 ) return 2 ;
18641864 const out = r . stdout . length > 0 ? r . stdout . charAt ( 0 ) : '' ;
18651865 if ( out === '0' ) return 0 ;
@@ -2055,7 +2055,7 @@ function promptForRenameMacos(): string {
20552055 script += ' return ""\n' ;
20562056 script += 'end try\n' ;
20572057 try {
2058- const r = spawnSync ( 'osascript' , [ '-e' , script ] ) ;
2058+ const r = spawnText ( 'osascript' , [ '-e' , script ] ) ;
20592059 if ( r . status !== 0 ) return '' ;
20602060 let out = r . stdout ;
20612061 let end = out . length ;
@@ -2074,7 +2074,7 @@ function promptForRenameWindows(): string {
20742074 ps = '[void][System.Reflection.Assembly]::LoadWithPartialName(\'Microsoft.VisualBasic\');' + ps ;
20752075 ps += '[Console]::Out.Write($r)' ;
20762076 try {
2077- const r = spawnSync ( 'powershell.exe' , [ '-NoProfile' , '-NonInteractive' , '-Command' , ps ] ) ;
2077+ const r = spawnText ( 'powershell.exe' , [ '-NoProfile' , '-NonInteractive' , '-Command' , ps ] ) ;
20782078 if ( r . status !== 0 ) return '' ;
20792079 let out = r . stdout ;
20802080 let end = out . length ;
@@ -2421,12 +2421,12 @@ function onGenerateCommitMessageImpl(): void {
24212421 // Prefer staged diff; fall back to working tree if nothing is staged.
24222422 let diff = '' ;
24232423 try {
2424- const r = spawnSync ( 'git' , [ '-C' , workspaceRoot , 'diff' , '--cached' , '--no-color' , '--stat=80,80' ] ) ;
2424+ const r = spawnText ( 'git' , [ '-C' , workspaceRoot , 'diff' , '--cached' , '--no-color' , '--stat=80,80' ] ) ;
24252425 if ( r . status === 0 ) diff = r . stdout ;
24262426 } catch ( _e : any ) { }
24272427 if ( diff . length < 5 ) {
24282428 try {
2429- const r = spawnSync ( 'git' , [ '-C' , workspaceRoot , 'diff' , '--no-color' , '--stat=80,80' ] ) ;
2429+ const r = spawnText ( 'git' , [ '-C' , workspaceRoot , 'diff' , '--no-color' , '--stat=80,80' ] ) ;
24302430 if ( r . status === 0 ) diff = r . stdout ;
24312431 } catch ( _e : any ) { }
24322432 }
@@ -2437,12 +2437,12 @@ function onGenerateCommitMessageImpl(): void {
24372437 // Include the patch body too, capped at ~6KB so we don't blow the context.
24382438 let body = '' ;
24392439 try {
2440- const r = spawnSync ( 'git' , [ '-C' , workspaceRoot , 'diff' , '--cached' , '--no-color' , '-U2' ] ) ;
2440+ const r = spawnText ( 'git' , [ '-C' , workspaceRoot , 'diff' , '--cached' , '--no-color' , '-U2' ] ) ;
24412441 if ( r . status === 0 ) body = r . stdout ;
24422442 } catch ( _e : any ) { }
24432443 if ( body . length < 5 ) {
24442444 try {
2445- const r = spawnSync ( 'git' , [ '-C' , workspaceRoot , 'diff' , '--no-color' , '-U2' ] ) ;
2445+ const r = spawnText ( 'git' , [ '-C' , workspaceRoot , 'diff' , '--no-color' , '-U2' ] ) ;
24462446 if ( r . status === 0 ) body = r . stdout ;
24472447 } catch ( _e : any ) { }
24482448 }
@@ -2478,18 +2478,18 @@ function onGeneratePRDescriptionImpl(): void {
24782478 // Resolve the base ref.
24792479 let baseRef = '' ;
24802480 try {
2481- const r = spawnSync ( 'git' , [ '-C' , workspaceRoot , 'rev-parse' , '--verify' , 'main' ] ) ;
2481+ const r = spawnText ( 'git' , [ '-C' , workspaceRoot , 'rev-parse' , '--verify' , 'main' ] ) ;
24822482 if ( r . status === 0 ) baseRef = 'main' ;
24832483 } catch ( _e : any ) { }
24842484 if ( baseRef . length === 0 ) {
24852485 try {
2486- const r = spawnSync ( 'git' , [ '-C' , workspaceRoot , 'rev-parse' , '--verify' , 'master' ] ) ;
2486+ const r = spawnText ( 'git' , [ '-C' , workspaceRoot , 'rev-parse' , '--verify' , 'master' ] ) ;
24872487 if ( r . status === 0 ) baseRef = 'master' ;
24882488 } catch ( _e : any ) { }
24892489 }
24902490 if ( baseRef . length === 0 ) {
24912491 try {
2492- const r = spawnSync ( 'git' , [ '-C' , workspaceRoot , 'rev-parse' , '--abbrev-ref' , 'origin/HEAD' ] ) ;
2492+ const r = spawnText ( 'git' , [ '-C' , workspaceRoot , 'rev-parse' , '--abbrev-ref' , 'origin/HEAD' ] ) ;
24932493 if ( r . status === 0 ) {
24942494 // Output is e.g. "origin/main\n" — slice off the "origin/" prefix.
24952495 let s = r . stdout ;
@@ -2508,7 +2508,7 @@ function onGeneratePRDescriptionImpl(): void {
25082508 // Current branch — used in the prompt header.
25092509 let branch = '' ;
25102510 try {
2511- const r = spawnSync ( 'git' , [ '-C' , workspaceRoot , 'rev-parse' , '--abbrev-ref' , 'HEAD' ] ) ;
2511+ const r = spawnText ( 'git' , [ '-C' , workspaceRoot , 'rev-parse' , '--abbrev-ref' , 'HEAD' ] ) ;
25122512 if ( r . status === 0 ) {
25132513 branch = r . stdout ;
25142514 let end = branch . length ;
@@ -2533,7 +2533,7 @@ function onGeneratePRDescriptionImpl(): void {
25332533
25342534 let log = '' ;
25352535 try {
2536- const r = spawnSync ( 'git' , [ '-C' , workspaceRoot , 'log' , '--no-color' , '--pretty=%h %s' , range ] ) ;
2536+ const r = spawnText ( 'git' , [ '-C' , workspaceRoot , 'log' , '--no-color' , '--pretty=%h %s' , range ] ) ;
25372537 if ( r . status === 0 ) log = r . stdout ;
25382538 } catch ( _e : any ) { }
25392539 if ( log . length < 1 ) {
@@ -2543,13 +2543,13 @@ function onGeneratePRDescriptionImpl(): void {
25432543
25442544 let stat = '' ;
25452545 try {
2546- const r = spawnSync ( 'git' , [ '-C' , workspaceRoot , 'diff' , '--no-color' , '--stat=80,80' , range ] ) ;
2546+ const r = spawnText ( 'git' , [ '-C' , workspaceRoot , 'diff' , '--no-color' , '--stat=80,80' , range ] ) ;
25472547 if ( r . status === 0 ) stat = r . stdout ;
25482548 } catch ( _e : any ) { }
25492549
25502550 let body = '' ;
25512551 try {
2552- const r = spawnSync ( 'git' , [ '-C' , workspaceRoot , 'diff' , '--no-color' , '-U2' , range ] ) ;
2552+ const r = spawnText ( 'git' , [ '-C' , workspaceRoot , 'diff' , '--no-color' , '-U2' , range ] ) ;
25532553 if ( r . status === 0 ) body = r . stdout ;
25542554 } catch ( _e : any ) { }
25552555 if ( body . length > 8000 ) body = body . slice ( 0 , 8000 ) + '\n[…truncated]' ;
@@ -3089,11 +3089,13 @@ function displayFileContent(filePath: string): void {
30893089 const t1 = Date . now ( ) ;
30903090 updateBreadcrumb ( ) ;
30913091 const t2 = Date . now ( ) ;
3092+ const t3 = Date . now ( ) ;
30923093 updateStatusBarLanguageImpl ( filePath ) ;
30933094 const t4 = Date . now ( ) ;
30943095 if ( editorReady < 1 ) return ;
30953096 const lang = detectLanguage ( filePath ) ;
30963097 editorInstance . setLanguage ( lang ) ;
3098+ const t5 = Date . now ( ) ;
30973099 const content = safeReadFile ( filePath ) ;
30983100 // Strip a leading UTF-8 BOM (U+FEFF) before it reaches the editor. Windows
30993101 // tools (Notepad, older Visual Studio, PowerShell `Out-File`/`>` default)
@@ -3909,7 +3911,7 @@ function syncInlineBlame(): void {
39093911 const range = String ( lineNum ) + ',' + String ( lineNum ) ;
39103912 let output = '' ;
39113913 try {
3912- const r = spawnSync ( 'git' , [ 'blame' , '-L' , range , '--porcelain' , '--' , filePath ] ) ;
3914+ const r = spawnText ( 'git' , [ 'blame' , '-L' , range , '--porcelain' , '--' , filePath ] ) ;
39133915 if ( r . status === 0 ) output = r . stdout ;
39143916 } catch ( e ) {
39153917 return '' ;
@@ -5740,7 +5742,7 @@ function onClaudeRelayRequestFromGuest(guestId: string, prompt: string, wsRoot:
57405742 let claudeBin = '' ;
57415743 try {
57425744 const cmd = __platform__ === 3 ? 'where' : 'which' ;
5743- const r = spawnSync ( cmd , [ 'claude' ] ) ;
5745+ const r = spawnText ( cmd , [ 'claude' ] ) ;
57445746 if ( r . status === 0 && r . stdout . length > 0 ) {
57455747 for ( let i = 0 ; i < r . stdout . length ; i ++ ) {
57465748 const ch = r . stdout . charCodeAt ( i ) ;
@@ -5768,9 +5770,9 @@ function onClaudeRelayRequestFromGuest(guestId: string, prompt: string, wsRoot:
57685770 try {
57695771 const pidStr = String ( claudeRelayPid ) ;
57705772 if ( __platform__ === 3 ) {
5771- spawnSync ( 'taskkill' , [ '/F' , '/PID' , pidStr ] ) ;
5773+ spawnText ( 'taskkill' , [ '/F' , '/PID' , pidStr ] ) ;
57725774 } else {
5773- spawnSync ( 'kill' , [ pidStr ] ) ;
5775+ spawnText ( 'kill' , [ pidStr ] ) ;
57745776 }
57755777 } catch ( e ) { }
57765778 }
@@ -5909,11 +5911,11 @@ function claudeRelayPollTick(): void {
59095911 try {
59105912 const pidStr = String ( claudeRelayPid ) ;
59115913 if ( __platform__ === 3 ) {
5912- const r = spawnSync ( 'tasklist' , [ '/FI' , 'PID eq ' + pidStr , '/NH' ] ) ;
5914+ const r = spawnText ( 'tasklist' , [ '/FI' , 'PID eq ' + pidStr , '/NH' ] ) ;
59135915 if ( r . status !== 0 ) gone = 1 ;
59145916 else if ( r . stdout . length >= 5 && r . stdout . charCodeAt ( 0 ) === 73 && r . stdout . charCodeAt ( 1 ) === 78 ) gone = 1 ;
59155917 } else {
5916- const r = spawnSync ( 'kill' , [ '-0' , pidStr ] ) ;
5918+ const r = spawnText ( 'kill' , [ '-0' , pidStr ] ) ;
59175919 if ( r . status !== 0 ) gone = 1 ;
59185920 }
59195921 } catch ( e ) {
@@ -6148,9 +6150,9 @@ function onClaudeRelayStopFromGuest(guestId: string, sessionId: string): void {
61486150 try {
61496151 const pidStr = String ( claudeRelayPid ) ;
61506152 if ( __platform__ === 3 ) {
6151- spawnSync ( 'taskkill' , [ '/F' , '/PID' , pidStr ] ) ;
6153+ spawnText ( 'taskkill' , [ '/F' , '/PID' , pidStr ] ) ;
61526154 } else {
6153- spawnSync ( 'kill' , [ pidStr ] ) ;
6155+ spawnText ( 'kill' , [ pidStr ] ) ;
61546156 }
61556157 } catch ( e ) { }
61566158 claudeRelayPid = 0 ;
0 commit comments