Browse Source

Improves diff stat parsing perf & memory usage

main
Eric Amodio 2 years ago
parent
commit
2dc29eb11e
3 changed files with 16 additions and 25 deletions
  1. +2
    -1
      src/env/node/git/git.ts
  2. +2
    -0
      src/env/node/git/localGitProvider.ts
  3. +12
    -24
      src/git/parsers/diffParser.ts

+ 2
- 1
src/env/node/git/git.ts View File

@ -557,6 +557,7 @@ export class Git {
'--name-status',
`-M${similarityThreshold == null ? '' : `${similarityThreshold}%`}`,
'--no-ext-diff',
'-z',
];
if (filters != null && filters.length !== 0) {
params.push(`--diff-filter=${filters.join('')}`);
@ -1354,7 +1355,7 @@ export class Git {
}
show__name_status(repoPath: string, fileName: string, ref: string) {
return this.git<string>({ cwd: repoPath }, 'show', '--name-status', '--format=', ref, '--', fileName);
return this.git<string>({ cwd: repoPath }, 'show', '--name-status', '--format=', '-z', ref, '--', fileName);
}
show_ref__tags(repoPath: string) {

+ 2
- 0
src/env/node/git/localGitProvider.ts View File

@ -2029,6 +2029,8 @@ export class LocalGitProvider implements GitProvider, Disposable {
similarityThreshold: this.container.config.advanced.similarityThreshold,
...options,
});
if (!data) return undefined;
const files = GitDiffParser.parseNameStatus(data, repoPath);
return files == null || files.length === 0 ? undefined : files;
} catch (ex) {

+ 12
- 24
src/git/parsers/diffParser.ts View File

@ -3,9 +3,7 @@ import { getLines } from '../../system/string';
import { GitDiff, GitDiffHunk, GitDiffHunkLine, GitDiffLine, GitDiffShortStat } from '../models/diff';
import { GitFile, GitFileStatus } from '../models/file';
const nameStatusDiffRegex = /^(.*?)\t(.*?)(?:\t(.*?))?$/gm;
const shortStatDiffRegex =
/^\s*(\d+)\sfiles? changed(?:,\s+(\d+)\s+insertions?\(\+\))?(?:,\s+(\d+)\s+deletions?\(-\))?/;
const shortStatDiffRegex = /(\d+)\s+files? changed(?:,\s+(\d+)\s+insertions?\(\+\))?(?:,\s+(\d+)\s+deletions?\(-\))?/;
const unifiedDiffRegex = /^@@ -([\d]+)(?:,([\d]+))? \+([\d]+)(?:,([\d]+))? @@(?:.*?)\n([\s\S]*?)(?=^@@)/gm;
export class GitDiffParser {
@ -150,32 +148,22 @@ export class GitDiffParser {
const files: GitFile[] = [];
let status: string;
let fileName: string;
let originalFileName: string;
let status;
let match: RegExpExecArray | null;
do {
match = nameStatusDiffRegex.exec(data);
if (match == null) break;
[, status, fileName, originalFileName] = match;
const fields = data.split('\0');
for (let i = 0; i < fields.length - 1; i++) {
status = fields[i][0];
if (status === '.') {
status = '?';
}
files.push({
status: status as GitFileStatus,
path: fields[++i],
originalPath: status[0] === 'R' || status[0] === 'C' ? fields[++i] : undefined,
repoPath: repoPath,
status: (!status.startsWith('.') ? status[0].trim() : '?') as GitFileStatus,
conflictStatus: undefined,
indexStatus: undefined,
workingTreeStatus: undefined,
// Stops excessive memory usage -- https://bugs.chromium.org/p/v8/issues/detail?id=2869
path: ` ${fileName}`.substr(1),
// Stops excessive memory usage -- https://bugs.chromium.org/p/v8/issues/detail?id=2869
originalPath:
originalFileName == null || originalFileName.length === 0
? undefined
: ` ${originalFileName}`.substr(1),
});
} while (true);
}
return files;
}

Loading…
Cancel
Save