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
JavaScript
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