mirror of
https://github.com/elliotnunn/tbxi.git
synced 2024-06-30 07:29:41 +00:00
Make patch algorithm way cooler
This commit is contained in:
parent
9f8b423994
commit
fe8a281d2d
|
@ -2,6 +2,7 @@ import importlib
|
||||||
|
|
||||||
from subprocess import run, PIPE
|
from subprocess import run, PIPE
|
||||||
|
|
||||||
|
import fnmatch
|
||||||
import os
|
import os
|
||||||
from os import path
|
from os import path
|
||||||
|
|
||||||
|
@ -18,6 +19,17 @@ class WrongFormat(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def strip_patch_name_ext(name):
|
||||||
|
# We need to match patch filenames to other filenames using fnmatch,
|
||||||
|
# but first we need to remove '.patch.sh' or '.patch' from the title
|
||||||
|
|
||||||
|
# If it isn't a patch, return None
|
||||||
|
|
||||||
|
for i in range(2):
|
||||||
|
name, ext = path.splitext(name)
|
||||||
|
if ext.lower() == '.patch': return name
|
||||||
|
|
||||||
|
|
||||||
def build_dir(p):
|
def build_dir(p):
|
||||||
for fmt in FORMATS:
|
for fmt in FORMATS:
|
||||||
mod = importlib.import_module('..%s_build' % fmt, __name__)
|
mod = importlib.import_module('..%s_build' % fmt, __name__)
|
||||||
|
@ -52,11 +64,23 @@ def build_path(p):
|
||||||
# Search the directory of the file for executable patches
|
# Search the directory of the file for executable patches
|
||||||
for sib in sorted(os.scandir(parent), key=lambda ent: ent.name):
|
for sib in sorted(os.scandir(parent), key=lambda ent: ent.name):
|
||||||
# Does the filename match?
|
# Does the filename match?
|
||||||
if sib.name.startswith(name) and 'patch' in sib.name[len(name):]:
|
pattern = strip_patch_name_ext(sib.name)
|
||||||
|
if pattern and fnmatch.fnmatch(name, pattern):
|
||||||
# This is a bit unsafe, so prompt the user (to pipe in `yes`...)
|
# This is a bit unsafe, so prompt the user (to pipe in `yes`...)
|
||||||
if input('Apply %s to %s? [y/N] ' % (sib.name, name)).lower().startswith('y'):
|
if input('Apply %s to %s? [y/N] ' % (sib.name, name)).lower().startswith('y'):
|
||||||
result = run([sib.path], cwd=parent, input=data, stdout=PIPE, check=True)
|
# The script is told the original filename, but it should READ FROM STDIN!
|
||||||
data = result.stdout
|
cmd = [sib.path, name]
|
||||||
|
|
||||||
|
# Run the script as a unixy filter
|
||||||
|
result = run(cmd, cwd=parent, input=data, stdout=PIPE)
|
||||||
|
|
||||||
|
# Return 0 to apply stdout, 1 to nop, anything else to fail
|
||||||
|
if result.returncode == 0:
|
||||||
|
data = result.stdout
|
||||||
|
elif result.returncode == 1:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
result.check_returncode()
|
||||||
|
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user