From 1dc5d5ff381516afde5e216592483473af91f4d7 Mon Sep 17 00:00:00 2001 From: Ben Beattie-Hood Date: Fri, 2 Aug 2024 09:11:12 +1000 Subject: [PATCH] Update gitService.ts to use spawn instead of exec `child_process.spawn` is generally faster than `child_process.exec` and it does not buffer the data before sending, so no buffer limits (default 200k in exec) apply. --- src/gitService.ts | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/src/gitService.ts b/src/gitService.ts index cd50ff4..d872c7e 100644 --- a/src/gitService.ts +++ b/src/gitService.ts @@ -521,16 +521,32 @@ export class GitService { private async _exec(args: string[], cwd: string): Promise { const start = Date.now(); - const cmd = this._gitPath + ' ' + args.join(' '); - return new Promise(resolve => { - exec(cmd, { encoding: 'utf8', cwd }, (err, stdout) => { - if (err) { - Tracer.error(`git command failed: ${cmd} (${Date.now() - start}ms) ${cwd} ${err.message}`); - } else { - Tracer.verbose(`git command: ${cmd}. Output size: ${stdout.length} (${Date.now() - start}ms) ${cwd}`); - resolve(stdout); - } + const cmd = this._gitPath; + try { + const result = await new Promise((resolve, reject) => { + const childProcess = spawn(cmd, args, { cwd }); + childProcess.stdout.setEncoding('utf8'); + childProcess.stderr.setEncoding('utf8'); + let stdout = '', stderr = ''; + childProcess.stdout.on('data', chunk => { stdout += chunk; }); + childProcess.stderr.on('data', chunk => { stderr += chunk; }); + childProcess + .on('error', reject) + .on('close', code => { + if (code === 0) { + resolve(stdout); + } else { + reject(stderr); + } + }); }); - }); + + Tracer.verbose(`git command: ${cmd}. Output size: ${result.length} (${Date.now() - start}ms) ${cwd}`); + return result; + } + catch (err) { + Tracer.error(`git command failed: ${cmd} (${Date.now() - start}ms) ${cwd} ${err}`); + throw err; + } } }