poikilos
5 years ago
1 changed files with 144 additions and 0 deletions
@ -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)) |
Loading…
Reference in new issue