fix(format): Improve concurrency control in cache and rollback management with mutex locking and refine formatting details
This commit is contained in:
@@ -30,7 +30,7 @@ export interface IFormatStats {
|
||||
|
||||
export class FormatStats {
|
||||
private stats: IFormatStats;
|
||||
|
||||
|
||||
constructor() {
|
||||
this.stats = {
|
||||
totalExecutionTime: 0,
|
||||
@@ -44,11 +44,11 @@ export class FormatStats {
|
||||
totalDeleted: 0,
|
||||
totalErrors: 0,
|
||||
cacheHits: 0,
|
||||
cacheMisses: 0
|
||||
}
|
||||
cacheMisses: 0,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
startModule(moduleName: string): void {
|
||||
this.stats.moduleStats.set(moduleName, {
|
||||
name: moduleName,
|
||||
@@ -58,31 +58,35 @@ export class FormatStats {
|
||||
successes: 0,
|
||||
filesCreated: 0,
|
||||
filesModified: 0,
|
||||
filesDeleted: 0
|
||||
filesDeleted: 0,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
moduleStartTime(moduleName: string): number {
|
||||
return Date.now();
|
||||
}
|
||||
|
||||
|
||||
endModule(moduleName: string, startTime: number): void {
|
||||
const moduleStats = this.stats.moduleStats.get(moduleName);
|
||||
if (moduleStats) {
|
||||
moduleStats.executionTime = Date.now() - startTime;
|
||||
}
|
||||
}
|
||||
|
||||
recordFileOperation(moduleName: string, operation: 'create' | 'modify' | 'delete', success: boolean = true): void {
|
||||
|
||||
recordFileOperation(
|
||||
moduleName: string,
|
||||
operation: 'create' | 'modify' | 'delete',
|
||||
success: boolean = true,
|
||||
): void {
|
||||
const moduleStats = this.stats.moduleStats.get(moduleName);
|
||||
if (!moduleStats) return;
|
||||
|
||||
|
||||
moduleStats.filesProcessed++;
|
||||
|
||||
|
||||
if (success) {
|
||||
moduleStats.successes++;
|
||||
this.stats.overallStats.totalFiles++;
|
||||
|
||||
|
||||
switch (operation) {
|
||||
case 'create':
|
||||
moduleStats.filesCreated++;
|
||||
@@ -102,53 +106,66 @@ export class FormatStats {
|
||||
this.stats.overallStats.totalErrors++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
recordCacheHit(): void {
|
||||
this.stats.overallStats.cacheHits++;
|
||||
}
|
||||
|
||||
|
||||
recordCacheMiss(): void {
|
||||
this.stats.overallStats.cacheMisses++;
|
||||
}
|
||||
|
||||
|
||||
finish(): void {
|
||||
this.stats.endTime = Date.now();
|
||||
this.stats.totalExecutionTime = this.stats.endTime - this.stats.startTime;
|
||||
}
|
||||
|
||||
|
||||
displayStats(): void {
|
||||
console.log('\n📊 Format Operation Statistics:');
|
||||
console.log('═'.repeat(50));
|
||||
|
||||
|
||||
// Overall stats
|
||||
console.log('\nOverall Summary:');
|
||||
console.log(` Total Execution Time: ${this.formatDuration(this.stats.totalExecutionTime)}`);
|
||||
console.log(
|
||||
` Total Execution Time: ${this.formatDuration(this.stats.totalExecutionTime)}`,
|
||||
);
|
||||
console.log(` Files Processed: ${this.stats.overallStats.totalFiles}`);
|
||||
console.log(` • Created: ${this.stats.overallStats.totalCreated}`);
|
||||
console.log(` • Modified: ${this.stats.overallStats.totalModified}`);
|
||||
console.log(` • Deleted: ${this.stats.overallStats.totalDeleted}`);
|
||||
console.log(` Errors: ${this.stats.overallStats.totalErrors}`);
|
||||
|
||||
if (this.stats.overallStats.cacheHits > 0 || this.stats.overallStats.cacheMisses > 0) {
|
||||
const cacheHitRate = this.stats.overallStats.cacheHits /
|
||||
(this.stats.overallStats.cacheHits + this.stats.overallStats.cacheMisses) * 100;
|
||||
|
||||
if (
|
||||
this.stats.overallStats.cacheHits > 0 ||
|
||||
this.stats.overallStats.cacheMisses > 0
|
||||
) {
|
||||
const cacheHitRate =
|
||||
(this.stats.overallStats.cacheHits /
|
||||
(this.stats.overallStats.cacheHits +
|
||||
this.stats.overallStats.cacheMisses)) *
|
||||
100;
|
||||
console.log(` Cache Hit Rate: ${cacheHitRate.toFixed(1)}%`);
|
||||
console.log(` • Hits: ${this.stats.overallStats.cacheHits}`);
|
||||
console.log(` • Misses: ${this.stats.overallStats.cacheMisses}`);
|
||||
}
|
||||
|
||||
|
||||
// Module stats
|
||||
console.log('\nModule Breakdown:');
|
||||
console.log('─'.repeat(50));
|
||||
|
||||
const sortedModules = Array.from(this.stats.moduleStats.values())
|
||||
.sort((a, b) => b.filesProcessed - a.filesProcessed);
|
||||
|
||||
|
||||
const sortedModules = Array.from(this.stats.moduleStats.values()).sort(
|
||||
(a, b) => b.filesProcessed - a.filesProcessed,
|
||||
);
|
||||
|
||||
for (const moduleStats of sortedModules) {
|
||||
console.log(`\n${this.getModuleIcon(moduleStats.name)} ${moduleStats.name}:`);
|
||||
console.log(` Execution Time: ${this.formatDuration(moduleStats.executionTime)}`);
|
||||
console.log(
|
||||
`\n${this.getModuleIcon(moduleStats.name)} ${moduleStats.name}:`,
|
||||
);
|
||||
console.log(
|
||||
` Execution Time: ${this.formatDuration(moduleStats.executionTime)}`,
|
||||
);
|
||||
console.log(` Files Processed: ${moduleStats.filesProcessed}`);
|
||||
|
||||
|
||||
if (moduleStats.filesCreated > 0) {
|
||||
console.log(` • Created: ${moduleStats.filesCreated}`);
|
||||
}
|
||||
@@ -158,27 +175,30 @@ export class FormatStats {
|
||||
if (moduleStats.filesDeleted > 0) {
|
||||
console.log(` • Deleted: ${moduleStats.filesDeleted}`);
|
||||
}
|
||||
|
||||
|
||||
if (moduleStats.errors > 0) {
|
||||
console.log(` ❌ Errors: ${moduleStats.errors}`);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
console.log('\n' + '═'.repeat(50));
|
||||
}
|
||||
|
||||
|
||||
async saveReport(outputPath: string): Promise<void> {
|
||||
const report = {
|
||||
timestamp: new Date().toISOString(),
|
||||
executionTime: this.stats.totalExecutionTime,
|
||||
overallStats: this.stats.overallStats,
|
||||
moduleStats: Array.from(this.stats.moduleStats.values())
|
||||
moduleStats: Array.from(this.stats.moduleStats.values()),
|
||||
};
|
||||
|
||||
await plugins.smartfile.memory.toFs(JSON.stringify(report, null, 2), outputPath);
|
||||
|
||||
await plugins.smartfile.memory.toFs(
|
||||
JSON.stringify(report, null, 2),
|
||||
outputPath,
|
||||
);
|
||||
logger.log('info', `Statistics report saved to ${outputPath}`);
|
||||
}
|
||||
|
||||
|
||||
private formatDuration(ms: number): string {
|
||||
if (ms < 1000) {
|
||||
return `${ms}ms`;
|
||||
@@ -190,20 +210,20 @@ export class FormatStats {
|
||||
return `${minutes}m ${seconds}s`;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private getModuleIcon(module: string): string {
|
||||
const icons: Record<string, string> = {
|
||||
'packagejson': '📦',
|
||||
'license': '📝',
|
||||
'tsconfig': '🔧',
|
||||
'cleanup': '🚮',
|
||||
'gitignore': '🔒',
|
||||
'prettier': '✨',
|
||||
'readme': '📖',
|
||||
'templates': '📄',
|
||||
'npmextra': '⚙️',
|
||||
'copy': '📋'
|
||||
packagejson: '📦',
|
||||
license: '📝',
|
||||
tsconfig: '🔧',
|
||||
cleanup: '🚮',
|
||||
gitignore: '🔒',
|
||||
prettier: '✨',
|
||||
readme: '📖',
|
||||
templates: '📄',
|
||||
npmextra: '⚙️',
|
||||
copy: '📋',
|
||||
};
|
||||
return icons[module] || '📁';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user