UNPKG

igir

Version:

🕹 A zero-setup ROM collection manager that sorts, filters, extracts or archives, patches, and reports on collections of any size on any OS.

80 lines (79 loc) • 2.85 kB
import path from "node:path"; import async from "async"; import { ProgressBarSymbol } from "../../console/progressBar.js"; import Defaults from "../../globals/defaults.js"; import { MoveDeleteDirs } from "../../models/options.js"; import FsUtil, { WalkMode } from "../../utils/fsUtil.js"; import Module from "../module.js"; class InputSubdirectoriesDeleter extends Module { options; constructor(options, progressBar) { super(progressBar, InputSubdirectoriesDeleter.name); this.options = options; } /** * Delete empty input subdirectories that had {@link File}s moved out of them. */ async delete(movedRoms) { if (!this.options.shouldMove()) { return []; } if (this.options.getMoveDeleteDirs() === MoveDeleteDirs.NEVER) { return []; } if (movedRoms.length === 0 && this.options.getMoveDeleteDirs() !== MoveDeleteDirs.ALWAYS) { return []; } this.prefixedLogger.trace("deleting empty input subdirectories"); this.progressBar.setSymbol(ProgressBarSymbol.DELETING); this.progressBar.resetProgress(0); let dirsToMaybeDelete; if (this.options.getMoveDeleteDirs() === MoveDeleteDirs.ALWAYS) { dirsToMaybeDelete = new Set(await this.options.scanInputSubdirectories()); } else { dirsToMaybeDelete = new Set( movedRoms.map((movedRom) => path.dirname(movedRom.getFilePath())) ); } const inputPathsNormalized = new Set( this.options.getInputPaths().map((inputPath) => path.resolve(inputPath)) ); const deletedDirs = await this.walkAndDelete([...dirsToMaybeDelete], [...inputPathsNormalized]); this.prefixedLogger.trace("done deleting empty input subdirectories"); return deletedDirs; } async walkAndDelete(dirPaths, inputPathsNormalized) { const deletedDirs = await async.filterLimit( dirPaths, Defaults.MAX_FS_THREADS, async (dirPath) => { try { if ((await FsUtil.walk(dirPath, WalkMode.FILES)).length === 0) { this.progressBar.incrementTotal(1); this.progressBar.incrementInProgress(1); await FsUtil.rm(dirPath, { recursive: true, force: true }); return true; } } catch { } return false; } ); const parentDirs = new Set( deletedDirs.map((emptyDir) => path.dirname(emptyDir)).filter( (parentDir) => inputPathsNormalized.some( (inputPath) => parentDir.startsWith(inputPath) && parentDir !== inputPath ) ) ); if (parentDirs.size === 0) { return deletedDirs; } const deletedParentDirs = await this.walkAndDelete([...parentDirs], inputPathsNormalized); return [...deletedDirs, ...deletedParentDirs]; } } export { InputSubdirectoriesDeleter as default }; //# sourceMappingURL=inputSubdirectoriesDeleter.js.map