From a467fbb704eebe812cdec14025398dab2af43959 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Tue, 28 Jun 2022 03:25:28 +0200 Subject: [PATCH] feat: log failed patches due to failed dependencies --- .../kotlin/app/revanced/patcher/Patcher.kt | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/main/kotlin/app/revanced/patcher/Patcher.kt b/src/main/kotlin/app/revanced/patcher/Patcher.kt index d039a58..0cb10c8 100644 --- a/src/main/kotlin/app/revanced/patcher/Patcher.kt +++ b/src/main/kotlin/app/revanced/patcher/Patcher.kt @@ -241,31 +241,35 @@ class Patcher(private val options: PatcherOptions) { /** * Apply a [patch] and its dependencies recursively. * @param patch The [patch] to apply. - * @param appliedPatches A list of [patch] names, to prevent applying [patch]es twice. + * @param appliedPatches A map of [patch]es paired to a boolean indicating their success, to prevent infinite recursion. * @return The result of executing the [patch]. */ private fun applyPatch( - patch: Class>, appliedPatches: MutableList + patch: Class>, + appliedPatches: MutableMap ): PatchResult { val patchName = patch.patchName // if the patch has already applied silently skip it if (appliedPatches.contains(patchName)) { - logger.trace("Skipping patch $patchName because it has already been applied") + if (!appliedPatches[patchName]!!) + return PatchResultError("'$patchName' did not succeed previously") + + logger.trace("Skipping '$patchName' because it has already been applied") return PatchResultSuccess() } - appliedPatches.add(patchName) // recursively apply all dependency patches patch.dependencies?.forEach { val patchDependency = it.java val result = applyPatch(patchDependency, appliedPatches) + if (result.isSuccess()) return@forEach val errorMessage = result.error()!!.message - return PatchResultError("$patchName depends on ${patchDependency.patchName} but the following error was raised: $errorMessage") + return PatchResultError("'$patchName' depends on '${patchDependency.patchName}' but the following error was raised: $errorMessage") } val patchInstance = patch.getDeclaredConstructor().newInstance() @@ -273,7 +277,7 @@ class Patcher(private val options: PatcherOptions) { // if the current patch is a resource patch but resource patching is disabled, return an error val isResourcePatch = patchInstance is ResourcePatch if (!options.patchResources && isResourcePatch) { - return PatchResultError("$patchName is a resource patch, but resource patching is disabled.") + return PatchResultError("'$patchName' is a resource patch, but resource patching is disabled") } // TODO: find a solution for this @@ -285,11 +289,14 @@ class Patcher(private val options: PatcherOptions) { bytecodeData } - logger.trace("Executing patch $patchName of type: ${if (isResourcePatch) "resource" else "bytecode"}") + logger.trace("Executing '$patchName' of type: ${if (isResourcePatch) "resource" else "bytecode"}") return try { - patchInstance.execute(data) + val result = patchInstance.execute(data) + appliedPatches[patchName] = result.isSuccess() + result } catch (e: Exception) { + appliedPatches[patchName] = false PatchResultError(e) } } @@ -301,7 +308,7 @@ class Patcher(private val options: PatcherOptions) { */ fun applyPatches(stopOnError: Boolean = false) = sequence { logger.trace("Applying all patches") - val appliedPatches = mutableListOf() + val appliedPatches = mutableMapOf() // first is success, second is name for (patch in data.patches) { val patchResult = applyPatch(patch, appliedPatches)