Barebones patching system
This commit is contained in:
parent
e8ffddf93f
commit
f2ada0e2fe
15
.vscode/launch.json
vendored
Normal file
15
.vscode/launch.json
vendored
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "Python Debugger: Current File",
|
||||||
|
"type": "debugpy",
|
||||||
|
"request": "launch",
|
||||||
|
"program": "test.py",
|
||||||
|
"console": "integratedTerminal"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -1,26 +1,48 @@
|
||||||
from polly import parse_patch_file
|
from .polly import parse_patch_file
|
||||||
from polly import parse_location
|
from .polly import resolve_position
|
||||||
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from ..task.util import *
|
from ..task.util import *
|
||||||
|
|
||||||
def read_insertion(action, patch_file):
|
def read_insertion(action, src):
|
||||||
with open(patch_file, 'r') as f:
|
position = resolve_position(action["at"], src)
|
||||||
src = f.read()
|
return {"content": action["content"], "pos": position}
|
||||||
location = parse_location(action["at"], src)
|
|
||||||
|
|
||||||
|
|
||||||
def process_patch_file(patch_file: str, check_date: bool = True):
|
def process_patch_file(patch_file: str, check_date: bool = True):
|
||||||
patches = parse_patch_file(patch_file)
|
patches = parse_patch_file(patch_file)
|
||||||
|
|
||||||
for patch in patches:
|
for patch in patches:
|
||||||
target_dest = (PATCHED_RSC_DIR / patch["target"])
|
target_src = EXTRACTED_DIR / patch["target"]
|
||||||
|
target_dest = PATCHED_RSC_DIR / patch["target"]
|
||||||
|
|
||||||
|
# Skip old patches
|
||||||
if check_date and target_dest.exists() and target_dest.stat().st_mtime > patch["timestamp"]:
|
if check_date and target_dest.exists() and target_dest.stat().st_mtime > patch["timestamp"]:
|
||||||
# Patch skipped
|
print(f"Skipping patch {patch['target']}...")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
insertions = [read_insertion(action) for action in patch["actions"]]
|
print(f"Patching {patch['target']} with {len(patch['actions'])} actions")
|
||||||
|
|
||||||
|
# Read the source of the file
|
||||||
|
with open(target_src, 'r') as f:
|
||||||
|
src = f.read()
|
||||||
|
|
||||||
|
# Resolve the actual char locations in the patches
|
||||||
|
insertions = [read_insertion(action, src) for action in patch["actions"]]
|
||||||
insertions = [x for x in insertions if x is not None]
|
insertions = [x for x in insertions if x is not None]
|
||||||
|
|
||||||
|
for insertion in insertions:
|
||||||
|
src = src[:insertion["pos"]] + insertion["content"] + src[insertion["pos"]:]
|
||||||
|
|
||||||
|
# Correct insertions that follow this one
|
||||||
|
for i2 in insertions:
|
||||||
|
# Only update insertions that come *after* this one
|
||||||
|
if i2 == insertion or i2["pos"] < insertion["pos"]:
|
||||||
|
continue
|
||||||
|
|
||||||
|
i2["pos"] += len(insertion["content"])
|
||||||
|
|
||||||
|
# Write the changed output
|
||||||
|
with open(target_dest, 'w') as f:
|
||||||
|
f.write(src)
|
|
@ -30,22 +30,26 @@ def parse_location(location: Token):
|
||||||
m = re.match(r"ln([0-9]+)(?:c([0-9]+))?", location.value)
|
m = re.match(r"ln([0-9]+)(?:c([0-9]+))?", location.value)
|
||||||
if m:
|
if m:
|
||||||
ln, col = m.groups()
|
ln, col = m.groups()
|
||||||
return {"type": "lncol", "line": ln, "column": col}
|
return {"type": "lncol", "line": int(ln), "column": int(col) if col else 0}
|
||||||
|
|
||||||
m = re.match(r"ch([0-9]+)", location.value)
|
m = re.match(r"ch([0-9]+)", location.value)
|
||||||
if m:
|
if m:
|
||||||
ch = m.groups()[0]
|
ch = m.groups()[0]
|
||||||
return {"type": "char", "index": ch}
|
return {"type": "char", "index": int(ch)}
|
||||||
|
|
||||||
raise RuntimeError("Cannot parse location")
|
raise RuntimeError("Cannot parse location")
|
||||||
|
|
||||||
def absolute_location(location, src: str):
|
def resolve_position(location, src: str):
|
||||||
if location["type"] == "char":
|
if location["type"] == "char":
|
||||||
return location["index"]
|
return location["index"]
|
||||||
elif location["type"] == "lncol":
|
elif location["type"] == "lncol":
|
||||||
j = 0
|
j = 0
|
||||||
for i, x in enumerate(src.split('\n')):
|
for i, x in enumerate(src.split('\n')):
|
||||||
if i ==
|
if (i+1) == location["line"]:
|
||||||
|
if location["column"] > len(x):
|
||||||
|
print(f"Cannot insert at line {location['line']} column {location['column']}. The line is not that long.")
|
||||||
|
exit(-1)
|
||||||
|
return j + location["column"]
|
||||||
j += len(x) + 1
|
j += len(x) + 1
|
||||||
|
|
||||||
print(f"Cannot insert at line {location['line']}. The file is not long enough.")
|
print(f"Cannot insert at line {location['line']}. The file is not long enough.")
|
||||||
|
|
|
@ -1,12 +1,16 @@
|
||||||
file 'res/values/public.xml'
|
file 'res/values/public.xml'
|
||||||
|
|
||||||
insert ln17595 << @end
|
insert ln17595 << @end
|
||||||
|
|
||||||
|
<!-- Ykit -->
|
||||||
|
|
||||||
<public type="drawable" name="oval_yellow" id="0x7f08f001" /> <!-- YKit-BringBackPhoebe -->
|
<public type="drawable" name="oval_yellow" id="0x7f08f001" /> <!-- YKit-BringBackPhoebe -->
|
||||||
<public type="id" name="ykit_settings" id="0x7f0bf001" /> <!-- YKit-Settings -->
|
<public type="id" name="ykit_settings" id="0x7f0bf001" /> <!-- YKit-Settings -->
|
||||||
<public type="id" name="ykit_version" id="0x7f0bf003" /> <!-- YKit-Settings -->
|
<public type="id" name="ykit_version" id="0x7f0bf003" /> <!-- YKit-Settings -->
|
||||||
<public type="id" name="text_color_yellow" id="0x7f0bf002" /> <!-- YKit-BringBackPhoebe -->
|
<public type="id" name="text_color_yellow" id="0x7f0bf002" /> <!-- YKit-BringBackPhoebe -->
|
||||||
<public type="layout" name="activity_ykit_settings" id="0x7f0ef001" /> <!-- YKit-Settings -->
|
<public type="layout" name="activity_ykit_settings" id="0x7f0ef001" /> <!-- YKit-Settings -->
|
||||||
<public type="raw" name="ykit_meow" id="0x7f12f001" /> <!-- YKit-Settings -->
|
<public type="raw" name="ykit_meow" id="0x7f12f001" /> <!-- YKit-Settings -->
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
#17595
|
#17595
|
|
@ -6817,7 +6817,6 @@
|
||||||
<public type="drawable" name="oval_pink_glow" id="0x7f080750" />
|
<public type="drawable" name="oval_pink_glow" id="0x7f080750" />
|
||||||
<public type="drawable" name="oval_purple" id="0x7f080751" />
|
<public type="drawable" name="oval_purple" id="0x7f080751" />
|
||||||
<public type="drawable" name="oval_red" id="0x7f080752" />
|
<public type="drawable" name="oval_red" id="0x7f080752" />
|
||||||
|
|
||||||
<public type="drawable" name="overlay" id="0x7f080754" />
|
<public type="drawable" name="overlay" id="0x7f080754" />
|
||||||
<public type="drawable" name="overlay_black" id="0x7f080755" />
|
<public type="drawable" name="overlay_black" id="0x7f080755" />
|
||||||
<public type="drawable" name="pause_button" id="0x7f080756" />
|
<public type="drawable" name="pause_button" id="0x7f080756" />
|
||||||
|
@ -7851,8 +7850,6 @@
|
||||||
<public type="id" name="account_row_tag" id="0x7f0b0034" />
|
<public type="id" name="account_row_tag" id="0x7f0b0034" />
|
||||||
<public type="id" name="account_row_viewholder_tag" id="0x7f0b0035" />
|
<public type="id" name="account_row_viewholder_tag" id="0x7f0b0035" />
|
||||||
<public type="id" name="account_settings" id="0x7f0b0036" />
|
<public type="id" name="account_settings" id="0x7f0b0036" />
|
||||||
|
|
||||||
|
|
||||||
<public type="id" name="action" id="0x7f0b0037" />
|
<public type="id" name="action" id="0x7f0b0037" />
|
||||||
<public type="id" name="action0" id="0x7f0b0038" />
|
<public type="id" name="action0" id="0x7f0b0038" />
|
||||||
<public type="id" name="actionDone" id="0x7f0b0039" />
|
<public type="id" name="actionDone" id="0x7f0b0039" />
|
||||||
|
@ -10820,7 +10817,6 @@
|
||||||
<public type="id" name="text_color_pink" id="0x7f0b0bcb" />
|
<public type="id" name="text_color_pink" id="0x7f0b0bcb" />
|
||||||
<public type="id" name="text_color_purple" id="0x7f0b0bcc" />
|
<public type="id" name="text_color_purple" id="0x7f0b0bcc" />
|
||||||
<public type="id" name="text_color_red" id="0x7f0b0bcd" />
|
<public type="id" name="text_color_red" id="0x7f0b0bcd" />
|
||||||
|
|
||||||
<public type="id" name="text_commercial" id="0x7f0b0bce" />
|
<public type="id" name="text_commercial" id="0x7f0b0bce" />
|
||||||
<public type="id" name="text_count" id="0x7f0b0bcf" />
|
<public type="id" name="text_count" id="0x7f0b0bcf" />
|
||||||
<public type="id" name="text_editing_controls" id="0x7f0b0bd0" />
|
<public type="id" name="text_editing_controls" id="0x7f0b0bd0" />
|
||||||
|
@ -11525,7 +11521,6 @@
|
||||||
<public type="layout" name="activity_tip_jar_setup_complete" id="0x7f0e0039" />
|
<public type="layout" name="activity_tip_jar_setup_complete" id="0x7f0e0039" />
|
||||||
<public type="layout" name="activity_video_hub" id="0x7f0e003a" />
|
<public type="layout" name="activity_video_hub" id="0x7f0e003a" />
|
||||||
<public type="layout" name="activity_webview" id="0x7f0e003b" />
|
<public type="layout" name="activity_webview" id="0x7f0e003b" />
|
||||||
|
|
||||||
<public type="layout" name="ad_dialog" id="0x7f0e003c" />
|
<public type="layout" name="ad_dialog" id="0x7f0e003c" />
|
||||||
<public type="layout" name="ad_free_prompt" id="0x7f0e003d" />
|
<public type="layout" name="ad_free_prompt" id="0x7f0e003d" />
|
||||||
<public type="layout" name="ad_settings_popup_window" id="0x7f0e003e" />
|
<public type="layout" name="ad_settings_popup_window" id="0x7f0e003e" />
|
||||||
|
@ -12554,7 +12549,6 @@
|
||||||
<public type="raw" name="messaging_notification" id="0x7f12000b" />
|
<public type="raw" name="messaging_notification" id="0x7f12000b" />
|
||||||
<public type="raw" name="messaging_receive" id="0x7f12000c" />
|
<public type="raw" name="messaging_receive" id="0x7f12000c" />
|
||||||
<public type="raw" name="messaging_send_click" id="0x7f12000d" />
|
<public type="raw" name="messaging_send_click" id="0x7f12000d" />
|
||||||
|
|
||||||
<public type="raw" name="notification_algo_push" id="0x7f12000e" />
|
<public type="raw" name="notification_algo_push" id="0x7f12000e" />
|
||||||
<public type="raw" name="omsdk_v1" id="0x7f12000f" />
|
<public type="raw" name="omsdk_v1" id="0x7f12000f" />
|
||||||
<public type="raw" name="premium_payment_method_tumblrpay" id="0x7f120010" />
|
<public type="raw" name="premium_payment_method_tumblrpay" id="0x7f120010" />
|
||||||
|
|
Loading…
Reference in a new issue