fix(tstest-logging): Improve log file handling with log rotation and diff reporting
This commit is contained in:
		| @@ -37,7 +37,7 @@ export interface TestSummary { | ||||
| } | ||||
|  | ||||
| export class TsTestLogger { | ||||
|   private options: LogOptions; | ||||
|   public readonly options: LogOptions; | ||||
|   private startTime: number; | ||||
|   private fileResults: TestFileResult[] = []; | ||||
|   private currentFileResult: TestFileResult | null = null; | ||||
| @@ -247,6 +247,36 @@ export class TsTestLogger { | ||||
|       this.log(this.format(`   Summary: ${passed}/${total} ${status}`, color)); | ||||
|     } | ||||
|      | ||||
|     // If using --logfile, handle error copy and diff detection | ||||
|     if (this.options.logFile && this.currentTestLogFile) { | ||||
|       try { | ||||
|         const logContent = fs.readFileSync(this.currentTestLogFile, 'utf-8'); | ||||
|         const logDir = path.dirname(this.currentTestLogFile); | ||||
|         const logBasename = path.basename(this.currentTestLogFile); | ||||
|          | ||||
|         // Create error copy if there were failures | ||||
|         if (failed > 0) { | ||||
|           const errorLogPath = path.join(logDir, `00err_${logBasename}`); | ||||
|           fs.writeFileSync(errorLogPath, logContent); | ||||
|         } | ||||
|          | ||||
|         // Check for previous version and create diff if changed | ||||
|         const previousLogPath = path.join(logDir, 'previous', logBasename); | ||||
|         if (fs.existsSync(previousLogPath)) { | ||||
|           const previousContent = fs.readFileSync(previousLogPath, 'utf-8'); | ||||
|            | ||||
|           // Simple check if content differs | ||||
|           if (previousContent !== logContent) { | ||||
|             const diffLogPath = path.join(logDir, `00diff_${logBasename}`); | ||||
|             const diffContent = this.createDiff(previousContent, logContent, logBasename); | ||||
|             fs.writeFileSync(diffLogPath, diffContent); | ||||
|           } | ||||
|         } | ||||
|       } catch (error) { | ||||
|         // Silently fail to avoid disrupting the test run | ||||
|       } | ||||
|     } | ||||
|      | ||||
|     // Clear the current test log file reference only if using --logfile | ||||
|     if (this.options.logFile) { | ||||
|       this.currentTestLogFile = null; | ||||
| @@ -254,7 +284,7 @@ export class TsTestLogger { | ||||
|   } | ||||
|    | ||||
|   // TAP output forwarding (for TAP protocol messages) | ||||
|   tapOutput(message: string, isError: boolean = false) { | ||||
|   tapOutput(message: string, _isError: boolean = false) { | ||||
|     if (this.options.json) return; | ||||
|      | ||||
|     // Never show raw TAP protocol messages in console | ||||
| @@ -424,4 +454,48 @@ export class TsTestLogger { | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|    | ||||
|   // Create a diff between two log contents | ||||
|   private createDiff(previousContent: string, currentContent: string, filename: string): string { | ||||
|     const previousLines = previousContent.split('\n'); | ||||
|     const currentLines = currentContent.split('\n'); | ||||
|      | ||||
|     let diff = `DIFF REPORT: ${filename}\n`; | ||||
|     diff += `Generated: ${new Date().toISOString()}\n`; | ||||
|     diff += '='.repeat(80) + '\n\n'; | ||||
|      | ||||
|     // Simple line-by-line comparison | ||||
|     const maxLines = Math.max(previousLines.length, currentLines.length); | ||||
|     let hasChanges = false; | ||||
|      | ||||
|     for (let i = 0; i < maxLines; i++) { | ||||
|       const prevLine = previousLines[i] || ''; | ||||
|       const currLine = currentLines[i] || ''; | ||||
|        | ||||
|       if (prevLine !== currLine) { | ||||
|         hasChanges = true; | ||||
|         if (i < previousLines.length && i >= currentLines.length) { | ||||
|           // Line was removed | ||||
|           diff += `- [Line ${i + 1}] ${prevLine}\n`; | ||||
|         } else if (i >= previousLines.length && i < currentLines.length) { | ||||
|           // Line was added | ||||
|           diff += `+ [Line ${i + 1}] ${currLine}\n`; | ||||
|         } else { | ||||
|           // Line was modified | ||||
|           diff += `- [Line ${i + 1}] ${prevLine}\n`; | ||||
|           diff += `+ [Line ${i + 1}] ${currLine}\n`; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|      | ||||
|     if (!hasChanges) { | ||||
|       diff += 'No changes detected.\n'; | ||||
|     } | ||||
|      | ||||
|     diff += '\n' + '='.repeat(80) + '\n'; | ||||
|     diff += `Previous version had ${previousLines.length} lines\n`; | ||||
|     diff += `Current version has ${currentLines.length} lines\n`; | ||||
|      | ||||
|     return diff; | ||||
|   } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user