mirror of
https://github.com/revanced/revanced-cli.git
synced 2025-05-02 23:54:32 +02:00
73 lines
2.5 KiB
Kotlin
73 lines
2.5 KiB
Kotlin
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<Class<out Patch<Data>>>()
|
|
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) {
|
|
println("[merged] ${it.name}")
|
|
}
|
|
}
|