|
@ -1,4 +1,16 @@ |
|
|
#!/usr/bin/env python3 |
|
|
#!/usr/bin/env python3 |
|
|
|
|
|
''' |
|
|
|
|
|
mtpatches |
|
|
|
|
|
--------- |
|
|
|
|
|
Check for Minetest game patches stored in the form of regular |
|
|
|
|
|
text/binary files that can be directly copied to the program. |
|
|
|
|
|
|
|
|
|
|
|
Usage: |
|
|
|
|
|
mtpatches.py [options] |
|
|
|
|
|
|
|
|
|
|
|
Options: |
|
|
|
|
|
--skip-missing Do not list files in heads that are not in sources. |
|
|
|
|
|
''' |
|
|
import os |
|
|
import os |
|
|
import platform |
|
|
import platform |
|
|
import shlex |
|
|
import shlex |
|
@ -6,6 +18,26 @@ import shutil |
|
|
import sys |
|
|
import sys |
|
|
import subprocess |
|
|
import subprocess |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Fore: |
|
|
|
|
|
"""Print these to change console color |
|
|
|
|
|
(emulate colorama) |
|
|
|
|
|
See <https://gist.github.com/kamito/704813> |
|
|
|
|
|
|
|
|
|
|
|
Example: Use Fore.RED as if you had done |
|
|
|
|
|
`from colorama import Fore`, but you don't need to |
|
|
|
|
|
import anything from colorama. |
|
|
|
|
|
""" |
|
|
|
|
|
RED = "\033[31m" |
|
|
|
|
|
GREEN = "\033[32m" |
|
|
|
|
|
YELLOW = "\033[33m" |
|
|
|
|
|
BLUE = "\033[34m" |
|
|
|
|
|
PURPLE = "\033[35m" |
|
|
|
|
|
CYAN = "\033[36m" |
|
|
|
|
|
WHITE = "\033[37m" |
|
|
|
|
|
RESET = "\033[0m" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MODULE_DIR = os.path.dirname(os.path.realpath(__file__)) |
|
|
MODULE_DIR = os.path.dirname(os.path.realpath(__file__)) |
|
|
REPO_DIR = os.path.dirname(MODULE_DIR) |
|
|
REPO_DIR = os.path.dirname(MODULE_DIR) |
|
|
if __name__ == "__main__": |
|
|
if __name__ == "__main__": |
|
@ -355,6 +387,10 @@ def find_modpack(parent, name): |
|
|
) |
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def usage(): |
|
|
|
|
|
echo0(__doc__) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def main(): |
|
|
def main(): |
|
|
bases = ( |
|
|
bases = ( |
|
|
"/opt/minebest/assemble/bucket_game", |
|
|
"/opt/minebest/assemble/bucket_game", |
|
@ -366,10 +402,18 @@ def main(): |
|
|
os.path.join(HOME, "metaprojects", "pull-requests", |
|
|
os.path.join(HOME, "metaprojects", "pull-requests", |
|
|
"Bucket_Game-branches"), |
|
|
"Bucket_Game-branches"), |
|
|
) |
|
|
) |
|
|
return check_if_head_files_applied(bases, head_parents) |
|
|
for arg in sys.argv[1:]: |
|
|
|
|
|
if arg == "--skip-missing": |
|
|
|
|
|
skip_missing = True |
|
|
|
|
|
else: |
|
|
|
|
|
usage() |
|
|
|
|
|
echo0("Error: unknown argument {}".format(arg)) |
|
|
|
|
|
return 1 |
|
|
|
|
|
return check_if_head_files_applied(bases, head_parents, |
|
|
|
|
|
skip_missing=skip_missing) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def check_if_head_files_applied(bases, head_parents): |
|
|
def check_if_head_files_applied(bases, head_parents, skip_missing=False): |
|
|
"""Check if head files are applied. |
|
|
"""Check if head files are applied. |
|
|
|
|
|
|
|
|
Args: |
|
|
Args: |
|
@ -510,14 +554,26 @@ def check_if_head_files_applied(bases, head_parents): |
|
|
diffs = diff_only_head(base_sub_path, patch_root, log_level=-1) |
|
|
diffs = diff_only_head(base_sub_path, patch_root, log_level=-1) |
|
|
for diff in diffs: |
|
|
for diff in diffs: |
|
|
missing = bool(diff.get("new")) |
|
|
missing = bool(diff.get("new")) |
|
|
adjective = "missing" if missing else "differs" |
|
|
if missing: |
|
|
# TODO: echo0(" * {}: {}".format(adjective, diff)) |
|
|
if skip_missing: |
|
|
|
|
|
continue |
|
|
|
|
|
color = Fore.GREEN |
|
|
|
|
|
else: |
|
|
|
|
|
color = Fore.YELLOW |
|
|
|
|
|
why = "MISSING" if missing else "differs" |
|
|
|
|
|
# echo0(" * {}: {}".format(why, diff)) |
|
|
# if not missing: |
|
|
# if not missing: |
|
|
|
|
|
if diff['rel'].startswith(os.path.sep): |
|
|
|
|
|
raise NotImplementedError( |
|
|
|
|
|
"rel cannot start with {}" |
|
|
|
|
|
" or it will override base or head." |
|
|
|
|
|
"".format(os.path.sep) |
|
|
|
|
|
) |
|
|
echo0(" "+shlex.join([ |
|
|
echo0(" "+shlex.join([ |
|
|
"meld", |
|
|
"meld", |
|
|
os.path.join(base, diff['rel']), |
|
|
os.path.join(base_sub_path, diff['rel']), |
|
|
os.path.join(head, diff['rel']), |
|
|
os.path.join(head_sub_path, diff['rel']), |
|
|
])+" # base (original) vs head (patch)") |
|
|
])+"{} # {} in base (original) vs head (patch) {}".format(color, why, Fore.RESET)) |
|
|
# endregion check whether base has it installed |
|
|
# endregion check whether base has it installed |
|
|
|
|
|
|
|
|
return 0 |
|
|
return 0 |
|
|