Skip to content

Commit d4d74dd

Browse files
committed
Filter out contributors and authors with no recorded changes in stats calculations
1 parent dd47eb1 commit d4d74dd

3 files changed

Lines changed: 25 additions & 8 deletions

File tree

src/services/StatsService.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -551,6 +551,8 @@ export class StatsService {
551551

552552
return Array.from(stats.entries())
553553
.map(([name, v]) => ({ name, added: v.added, deleted: v.deleted }))
554+
// Filter out authors with no recorded changes (added + deleted === 0)
555+
.filter(item => (item.added + item.deleted) > 0)
554556
.sort((a, b) => (b.added + b.deleted) - (a.added + a.deleted));
555557
}
556558

@@ -599,6 +601,8 @@ export class StatsService {
599601

600602
return Array.from(stats.entries())
601603
.map(([name, v]) => ({ name, added: v.added, deleted: v.deleted }))
604+
// Exclude authors with zero total changes when aggregating across all refs
605+
.filter(item => (item.added + item.deleted) > 0)
602606
.sort((a, b) => (b.added + b.deleted) - (a.added + a.deleted));
603607
}
604608

src/views/StatsTreeProvider.ts

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -179,15 +179,21 @@ export class StatsTreeProvider implements vscode.TreeDataProvider<StatsNode> {
179179
return [new StatsNode('info', 'No Git history available', vscode.TreeItemCollapsibleState.None)];
180180
}
181181

182-
const totalChanges = result.stats.reduce((sum, s) => sum + (s.added + s.deleted), 0);
182+
// Only include contributors with at least one change
183+
const effectiveStats = result.stats.filter(s => (s.added + s.deleted) > 0);
184+
if (effectiveStats.length === 0) {
185+
return [new StatsNode('info', 'No contributors with changes found', vscode.TreeItemCollapsibleState.None)];
186+
}
187+
188+
const totalChanges = effectiveStats.reduce((sum, s) => sum + (s.added + s.deleted), 0);
183189
const totalNode = new StatsNode(
184190
'info',
185-
`Total contributors: ${result.stats.length}`,
191+
`Total contributors: ${effectiveStats.length}`,
186192
vscode.TreeItemCollapsibleState.None
187193
);
188194
totalNode.description = `${totalChanges.toLocaleString()} total changes`;
189195

190-
return [totalNode, ...result.stats.map((entry) => {
196+
return [totalNode, ...effectiveStats.map((entry) => {
191197
const entryTotal = entry.added + entry.deleted;
192198
const percent = totalChanges > 0 ? Math.round((entryTotal / totalChanges) * 100) : 0;
193199
const description = `${entryTotal.toLocaleString()} changes (${percent}%)`;
@@ -207,15 +213,21 @@ export class StatsTreeProvider implements vscode.TreeDataProvider<StatsNode> {
207213
return [new StatsNode('info', 'No Git history available', vscode.TreeItemCollapsibleState.None)];
208214
}
209215

210-
const totalChanges = result.stats.reduce((sum, s) => sum + (s.added + s.deleted), 0);
216+
// Only include contributors with recorded changes across repository history
217+
const effectiveStats = result.stats.filter(s => (s.added + s.deleted) > 0);
218+
if (effectiveStats.length === 0) {
219+
return [new StatsNode('info', 'No contributors with changes found', vscode.TreeItemCollapsibleState.None)];
220+
}
221+
222+
const totalChanges = effectiveStats.reduce((sum, s) => sum + (s.added + s.deleted), 0);
211223
const totalNode = new StatsNode(
212224
'info',
213-
`Total contributors (all): ${result.stats.length}`,
225+
`Total contributors (all): ${effectiveStats.length}`,
214226
vscode.TreeItemCollapsibleState.None
215227
);
216228
totalNode.description = `${totalChanges.toLocaleString()} total changes (repository)`;
217229

218-
return [totalNode, ...result.stats.map((entry) => {
230+
return [totalNode, ...effectiveStats.map((entry) => {
219231
const entryTotal = entry.added + entry.deleted;
220232
const percent = totalChanges > 0 ? Math.round((entryTotal / totalChanges) * 100) : 0;
221233
const description = `${entryTotal.toLocaleString()} changes (${percent}%)`;

src/views/webview/components/repoAnalytics.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ export const renderRepoAnalytics = (result: RepoAnalyticsResult): string => {
2929
const monthLabels = result.commitsByMonth.map(item => item.month);
3030
const monthCommitData = result.commitsByMonth.map(item => item.commits);
3131
const monthChangeData = result.commitsByMonth.map(item => item.added + item.deleted);
32-
const topAuthors = result.commitsByAuthor.slice(0, 8);
32+
const effectiveAuthors = result.commitsByAuthor.filter(a => (a.added + a.deleted) > 0);
33+
const topAuthors = effectiveAuthors.slice(0, 8);
3334
const authorColors = generateColors(topAuthors.length);
3435
const authorLabels = topAuthors.map(item => escapeHtml(item.author));
3536
const authorCommitData = topAuthors.map(item => item.commits);
@@ -43,7 +44,7 @@ export const renderRepoAnalytics = (result: RepoAnalyticsResult): string => {
4344
<div class="metric-grid">
4445
<div class="metric-card">
4546
<div class="metric-title">Total Contributors</div>
46-
<div class="metric-value">${result.commitsByAuthor.length.toLocaleString()}</div>
47+
<div class="metric-value">${effectiveAuthors.length.toLocaleString()}</div>
4748
<div class="metric-note">${result.totalAdded.toLocaleString()} added, ${result.totalDeleted.toLocaleString()} deleted</div>
4849
</div>
4950
<div class="metric-card">

0 commit comments

Comments
 (0)