diff --git a/generate-mt5-share-fix.py b/generate-mt5-share-fix.py new file mode 100755 index 0000000..636e0af --- /dev/null +++ b/generate-mt5-share-fix.py @@ -0,0 +1,144 @@ +#!/usr/bin/env python3 +import os +import shutil +actions = {"-- Up-to-date: ": "move", "-- Installing: ": "move"} +changes = { + "/usr/local/./": "/usr/local/share/minetest/" +} +count = 0 +command_count = 0 +in_path = "bad_mt5_make_install_output.txt" +outs_path = os.path.dirname(os.path.realpath(__file__)) +out_path = os.path.join(outs_path, "install-fix-minetest5-share.sh") +file_commands = [] +rmd_cmds = [] +mkdir_commands = [] +made_dirs = [] +mtg_mod_dirs = ["games//minetest_game/mods", "games/minetest_game/mods"] +with open(in_path) as ins: + with open(out_path, 'w') as outs: + outs.write("#!/bin/sh\n") + count += 1 + for line_orig in ins: + line = line_orig.strip() + action = None + old_path = None + for k, try_action in actions.items(): + if line.startswith(k): + action = try_action + old_path = line[len(k):].strip() + break + if action == "move": + found = None + for old, new in changes.items(): + if old_path.startswith(old): + found = old + new_path = new + old_path[len(old):] + if not os.path.exists(old_path): + if not os.path.exists(new_path): + # raise ValueError( + # "The program is not installed" + # " (missing '{}')".format(old_path) + # ) + outs.write( + '# WARNING: expected "{}" (there is' + ' no destination "{}" either)' + ''.format(old_path, new_path) + ) + else: + outs.write( + '# Already moved (no source "{}"' + ' for destination "{}")' + ''.format(old_path, new_path) + ) + else: + if os.path.isfile(old_path): + parent = os.path.split(new_path)[0] + if parent not in made_dirs: + made_dirs.append(parent) + cmd = 'mkdir -p "{}"'.format( + parent.replace("//", "/") + ) + mkdir_commands.append(cmd) + # AFTER all directories BEFORE all files + options = "" + if os.path.isfile(new_path): + options = "-f" + if len(options) > 0: + options = " " + options.strip() + cmd = ( + 'mv' + options + + ' "{}" "{}"'.format( + old_path.replace("//", "/"), + new_path.replace("//", "/") + ) + ) + # outs.write(cmd + "\n") + # AFTER all directories + file_commands.append(cmd) + else: + # old_path == old_path.replace("//","/") + # Manually fix: + + # rmdir: failed to remove '/usr/local/ + # ./games//minetest_game/mods': + # Directory not empty + + # rmdir: failed to remove '/usr/local/ + # ./games//minetest_game': + # Directory not empty + + # due to /usr/local/./games// + # minetest_game/mods/game_commands: + orphan_mods = ["game_commands"] + removed_orphan_mods = [] + + for mod_rel in orphan_mods: + for mtg_rel in mtg_mod_dirs: + f_rel = found + mtg_rel + # such as ("/usr/local/./" + # + "games//minetest_game/mods") + if old_path.startswith(f_rel): + # if mod_rel not in + # removed_orphan_mods: + try_path = (found + mtg_rel + + "/" + mod_rel) + if os.path.isdir(try_path): + cmd = ( + 'rmdir "{}"'.format( + try_path + ) + ) + # queue for last stage: + if cmd not in rmd_cmds: + rmd_cmds.append(cmd) + # removed_orphan_mods. + # append(mod_rel) + break + + cmd = 'rmdir "{}"'.format(old_path) + rmd_cmds.append(cmd) # AFTER everything + break + if found is None: + outs.write("# WARNING: The destination path is" + " unknown: ") + outs.write('# mv "{}" "{}"'.format(old_path, + old_path)) + else: + outs.write("# " + line + "\n") + count += 1 + for cmd in sorted(mkdir_commands, key=len): + outs.write(cmd + "\n") + count += 1 + command_count += 1 + for cmd in file_commands: + outs.write(cmd + "\n") + count += 1 + command_count += 1 + for cmd in sorted(rmd_cmds, key=len, reverse=True): + outs.write(cmd + "\n") + count += 1 + command_count += 1 + +print('Added {} line(s) to "{}" (including {} command(s))' + ''.format(count, out_path, command_count))