package app.revanced.utils.patcher import app.revanced.cli.command.MainCommand import app.revanced.cli.command.MainCommand.args import app.revanced.patcher.Patcher import app.revanced.patcher.data.base.Data import app.revanced.patcher.extensions.PatchExtensions.compatiblePackages import app.revanced.patcher.extensions.PatchExtensions.include import app.revanced.patcher.extensions.PatchExtensions.patchName import app.revanced.patcher.patch.base.Patch import app.revanced.patcher.util.patch.implementation.JarPatchBundle fun Patcher.addPatchesFiltered( excludePatches: Boolean = false ) { val packageName = this.data.packageMetadata.packageName val packageVersion = this.data.packageMetadata.packageVersion args.patchBundles.forEach { bundle -> val includedPatches = mutableListOf>>() JarPatchBundle(bundle).loadPatches().forEach patch@{ patch -> val compatiblePackages = patch.compatiblePackages val patchName = patch.patchName val prefix = "[skipped] $patchName" val args = MainCommand.args.pArgs!! if (excludePatches && args.excludedPatches.contains(patchName)) { println("$prefix: Explicitly excluded.") return@patch } else if (!patch.include) { println("$prefix: Implicitly excluded.") return@patch } if (compatiblePackages == null) println("$prefix: Missing compatibility annotation. Continuing.") else { if (!compatiblePackages.any { it.name == packageName }) { println("$prefix: Incompatible package.") return@patch } if (!(args.experimental || compatiblePackages.any { it.versions.isEmpty() || it.versions.any { version -> version == packageVersion } })) { println("$prefix: The package version is $packageVersion and is incompatible.") return@patch } } includedPatches.add(patch) println("[added] $patchName") } this.addPatches(includedPatches) } } fun Patcher.applyPatchesVerbose() { this.applyPatches().forEach { (patch, result) -> if (result.isSuccess) { println("[success] $patch") return@forEach } println("[error] $patch:") result.exceptionOrNull()!!.printStackTrace() } } fun Patcher.mergeFiles() { this.addFiles(args.pArgs!!.mergeFiles) }