Add script to analyze file hotspots from git history (#8591)

This commit is contained in:
Nate Sesti
2025-11-04 11:55:36 -08:00
committed by GitHub
parent 7690843f11
commit 7a19114d53

View File

@@ -0,0 +1,52 @@
#!/usr/bin/env node
/**
* Analyzes git commit history to find file hotspots (most commonly edited files)
* Usage: node analyze-file-hotspots.js [days] [limit]
* Example: node analyze-file-hotspots.js 30 20
*/
const { execSync } = require("child_process");
// Parse command line arguments
const args = process.argv.slice(2);
const days = parseInt(args[0]) || 30;
const limit = parseInt(args[1]) || 20;
try {
// Calculate the date from N days ago
const sinceDate = new Date();
sinceDate.setDate(sinceDate.getDate() - days);
const sinceDateStr = sinceDate.toISOString().split("T")[0];
// Get the git log with file change stats
const gitCommand = `git log --since="${sinceDateStr}" --name-only --pretty=format:`;
const output = execSync(gitCommand, {
encoding: "utf-8",
maxBuffer: 10 * 1024 * 1024, // 10MB buffer
});
// Parse the output and count file occurrences
const fileCount = {};
const lines = output.split("\n").filter((line) => line.trim() !== "");
lines.forEach((line) => {
const file = line.trim();
if (file) {
fileCount[file] = (fileCount[file] || 0) + 1;
}
});
// Sort files by edit count (descending)
const sortedFiles = Object.entries(fileCount)
.sort((a, b) => b[1] - a[1])
.slice(0, limit);
// Display results as tab-separated values
sortedFiles.forEach(([file, count]) => {
console.log(`${count}\t${file}`);
});
} catch (error) {
console.error("Error:", error.message);
process.exit(1);
}