Skip to content

Commit 712544f

Browse files
committed
Adds git diff --shortstat support
1 parent a114e2d commit 712544f

File tree

4 files changed

+37
-2
lines changed

4 files changed

+37
-2
lines changed

src/git/git.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,14 @@ export class Git {
259259
return gitCommand({ cwd: repoPath }, ...params);
260260
}
261261

262+
static diff_shortstat(repoPath: string, sha?: string) {
263+
const params = [`diff`, `--shortstat`, `--no-ext-diff`];
264+
if (sha) {
265+
params.push(sha);
266+
}
267+
return gitCommand({ cwd: repoPath }, ...params);
268+
}
269+
262270
static difftool_dirDiff(repoPath: string, sha1: string, sha2?: string) {
263271
const params = [`difftool`, `--dir-diff`, sha1];
264272
if (sha2) {

src/git/models/diff.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,10 @@ export interface GitDiff {
3333
chunks: GitDiffChunk[];
3434

3535
diff?: string;
36+
}
37+
38+
export interface GitDiffShortStat {
39+
files: number;
40+
insertions: number;
41+
deletions: number;
3642
}

src/git/parsers/diffParser.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
'use strict';
22
import { Iterables, Strings } from '../../system';
3-
import { GitDiff, GitDiffChunk, GitDiffChunkLine, GitDiffLine } from './../git';
3+
import { GitDiff, GitDiffChunk, GitDiffChunkLine, GitDiffLine, GitDiffShortStat } from './../git';
44

55
const unifiedDiffRegex = /^@@ -([\d]+),([\d]+) [+]([\d]+),([\d]+) @@([\s\S]*?)(?=^@@)/gm;
6+
const shortStatDiffRegex = /^\s*(\d+)\sfiles? changed(?:,\s+(\d+)\s+insertions?\(\+\))?(?:,\s+(\d+)\s+deletions?\(-\))?/;
67

78
export class GitDiffParser {
89

@@ -116,4 +117,20 @@ export class GitDiffParser {
116117

117118
return chunkLines;
118119
}
120+
121+
static parseShortStat(data: string): GitDiffShortStat | undefined {
122+
if (!data) return undefined;
123+
124+
const match = shortStatDiffRegex.exec(data);
125+
if (match == null) return undefined;
126+
127+
const files = match[1];
128+
const insertions = match[2];
129+
const deletions = match[3];
130+
return {
131+
files: files == null ? 0 : parseInt(files, 10),
132+
insertions: insertions == null ? 0 : parseInt(insertions, 10),
133+
deletions: deletions == null ? 0 : parseInt(deletions, 10)
134+
} as GitDiffShortStat;
135+
}
119136
}

src/gitService.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { Disposable, Event, EventEmitter, FileSystemWatcher, Location, Position,
44
import { IConfig } from './configuration';
55
import { DocumentSchemes, ExtensionKey, GlyphChars } from './constants';
66
import { RemoteProviderFactory } from './git/remotes/factory';
7-
import { Git, GitAuthor, GitBlame, GitBlameCommit, GitBlameLine, GitBlameLines, GitBlameParser, GitBranch, GitBranchParser, GitCommit, GitDiff, GitDiffChunkLine, GitDiffParser, GitLog, GitLogCommit, GitLogParser, GitRemote, GitRemoteParser, GitStash, GitStashParser, GitStatus, GitStatusFile, GitStatusParser, IGit, setDefaultEncoding } from './git/git';
7+
import { Git, GitAuthor, GitBlame, GitBlameCommit, GitBlameLine, GitBlameLines, GitBlameParser, GitBranch, GitBranchParser, GitCommit, GitDiff, GitDiffChunkLine, GitDiffParser, GitDiffShortStat, GitLog, GitLogCommit, GitLogParser, GitRemote, GitRemoteParser, GitStash, GitStashParser, GitStatus, GitStatusFile, GitStatusParser, IGit, setDefaultEncoding } from './git/git';
88
import { GitUri, IGitCommitInfo, IGitUriData } from './git/gitUri';
99
import { Logger } from './logger';
1010
import * as fs from 'fs';
@@ -599,6 +599,10 @@ export class GitService extends Disposable {
599599
return Git.normalizePath(typeof fileNameOrUri === 'string' ? fileNameOrUri : fileNameOrUri.fsPath).toLowerCase();
600600
}
601601

602+
async getChangedFilesCount(repoPath: string, sha?: string): Promise<GitDiffShortStat | undefined> {
603+
return GitDiffParser.parseShortStat(await Git.diff_shortstat(repoPath, sha));
604+
}
605+
602606
async getConfig(key: string, repoPath?: string): Promise<string> {
603607
Logger.log(`getConfig('${key}', '${repoPath}')`);
604608

0 commit comments

Comments
 (0)