You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

79 lines
2.3 KiB

/**
* Repository Size Checker
* Handles checking repository sizes and enforcing limits
*/
import { existsSync, statSync } from 'fs';
import { readdir } from 'fs/promises';
import { join } from 'path';
import logger from '../logger.js';
/**
* Repository Size Checker
* Handles checking repository sizes and enforcing limits
*/
export class RepoSizeChecker {
/**
* Get repository size in bytes
* Returns the total size of the repository directory
*/
async getRepoSize(repoPath: string): Promise<number> {
if (!existsSync(repoPath)) {
return 0;
}
let totalSize = 0;
async function calculateSize(dirPath: string): Promise<number> {
let size = 0;
try {
const entries = await readdir(dirPath, { withFileTypes: true });
for (const entry of entries) {
const fullPath = join(dirPath, entry.name);
if (entry.isDirectory()) {
size += await calculateSize(fullPath);
} else if (entry.isFile()) {
try {
const stats = statSync(fullPath);
size += stats.size;
} catch {
// Ignore errors accessing files
}
}
}
} catch {
// Ignore errors accessing directories
}
return size;
}
totalSize = await calculateSize(repoPath);
return totalSize;
}
/**
* Check if repository size exceeds the maximum (2 GB)
*/
async checkRepoSizeLimit(repoPath: string, maxSizeBytes: number = 2 * 1024 * 1024 * 1024): Promise<{ withinLimit: boolean; currentSize: number; maxSize: number; error?: string }> {
try {
const currentSize = await this.getRepoSize(repoPath);
const withinLimit = currentSize <= maxSizeBytes;
return {
withinLimit,
currentSize,
maxSize: maxSizeBytes,
...(withinLimit ? {} : { error: `Repository size (${(currentSize / 1024 / 1024 / 1024).toFixed(2)} GB) exceeds maximum (${(maxSizeBytes / 1024 / 1024 / 1024).toFixed(2)} GB)` })
};
} catch (error) {
return {
withinLimit: false,
currentSize: 0,
maxSize: maxSizeBytes,
error: `Failed to check repository size: ${error instanceof Error ? error.message : String(error)}`
};
}
}
}