#!/usr/bin/env python3
import os
import sys
import platform
def main ( ) :
CMD_REM = " # "
CMD_RM = " rm "
CMD_RMDIR = " rmdir "
if platform . system ( ) == " Windows " :
CMD_REM = " REM "
CMD_RM = " del "
CMD_RMDIR = " rd "
# profile_path = None
# if 'HOME' in os.environ:
# profile_path = os.environ['HOME']
# elif 'USERPROFILE' in os.environ:
# profile_path = os.environ['USERPROFILE']
# downloads_path = os.path.join(profile_path, "Downloads")
# repo_path = os.path.join(downloads_path, "minetest")
# if not os.path.isdir(repo_path):
# repo_path = os.path.join(profile_path, "minetest")
# if not os.path.isdir(repo_path):
# print("ERROR: Nothing done since there is no minetest sourcecode"
# " folder in " + downloads_path
# + " (nor " + profile_path + ")")
# return 1
install_manifest_name = " install_manifest.txt "
# install_manifest_path = os.path.join(repo_path, install_manifest_name)
# if not os.path.isfile(install_manifest_path):
# print("ERROR: nothing done since there is no " +
# install_manifest_name + " in '" + repo_path +
# "'. The file would only be present if you " +
# "installed minetest from sourcecode" +
# "(otherwise this uninstaller is not for you).")
# return 2
if not os . path . isfile ( install_manifest_name ) :
print ( " ERROR: nothing done since there is no " +
install_manifest_name + " in the current " +
" directory. You must run: " )
print ( " sudo python3 " + os . path . abspath ( __file__ ) )
print ( " from the minetest sourcecode (repo) directory. " )
return 2
directories = [ ]
print ( " Removing files... " )
f_removed_count = 0
f_skipped_count = 0
f_failed_count = 0
retry_lines = [ ]
with open ( install_manifest_name , ' r ' ) as ins :
original_line = True
while original_line :
original_line = ins . readline ( )
if original_line :
line = original_line . rstrip ( ) # remove trailing newline
if len ( line ) > 0 :
d_path = os . path . dirname ( line )
if d_path not in directories :
if " minetest " in d_path :
directories . append ( d_path )
# else must be a system directory like
# /usr/local/share/applications
if os . path . isfile ( line ) :
os . remove ( line )
if os . path . isfile ( line ) :
f_failed_count + = 1
retry_lines . append ( CMD_RM + ' " ' + line + ' " ' )
else :
f_removed_count + = 1
else :
f_skipped_count + = 1
print ( " Removed " + str ( f_removed_count ) + " file(s) (skipped not "
" present: " + str ( f_skipped_count ) + " ; failed: "
+ str ( f_failed_count ) + " ) " )
# NOTE: the next line makes ASCENDING (by len) list of TUPLES (name,len)
sorted_directories = [
( x , len ( x ) ) for x in sorted ( directories , key = len )
]
print ( " Removing folders... " )
# NOTE: they are sorted ASCENDING so start at end:
d_removed_count = 0
d_skipped_count = 0
d_failed_count = 0
# still leaves:
# /usr/local/share/minetest/games/minetest_game/mods
# /usr/local/share/minetest/textures/base/pack/:
# down_arrow.png left_arrow.png right_arrow.png up_arrow.png
# /usr/local/share/minetest/games/minimal/mods
# so:
try_files = [ " depends.txt " , " down_arrow.png " , " left_arrow.png " ,
" right_arrow.png " , " up_arrow.png " ]
try_dirs = [ " mods " ]
extra_dirs = [ ]
ed_failed_count = 0
ed_removed_count = 0
extra_files = [ ]
e_failed_count = 0
e_removed_count = 0
for i in reversed ( range ( len ( sorted_directories ) ) ) :
d_path = sorted_directories [ i ] [ 0 ]
# for d in reversed(sorted_directories):
# d_path = d[0]
# print("checking "+str(d_path))
if os . path . isdir ( d_path ) :
try :
for try_name in try_files :
try_path = os . path . join ( d_path , try_name )
if os . path . isfile ( try_path ) :
extra_files . append ( try_path )
print ( ' Removing known extra file: " ' + try_path
+ ' " ' )
try :
os . remove ( try_path )
e_removed_count + = 1
except Exception as e :
e_failed_count + = 1
retry_lines . append ( CMD_RM + ' " ' + try_path
+ ' " ' )
print ( str ( e ) )
for try_name in try_dirs :
try_path = os . path . join ( d_path , try_name )
if os . path . isdir ( try_path ) :
extra_dirs . append ( try_path )
print ( ' Removing known extra folder: " ' + try_path
+ ' " ' )
try :
os . rmdir ( try_path )
ed_removed_count + = 1
except Exception as e :
ed_failed_count + = 1
retry_lines . append ( CMD_RMDIR + ' " ' + try_path + ' " ' )
print ( str ( e ) )
os . rmdir ( d_path )
except Exception as e :
print ( str ( e ) )
if os . path . isdir ( d_path ) :
d_failed_count + = 1
retry_lines . append ( CMD_RMDIR + ' " ' + d_path + ' " ' )
else :
d_removed_count + = 1
else :
d_skipped_count + = 1
print ( " Removed " + str ( d_removed_count ) + " folder(s) (skipped not "
" present: " + str ( d_skipped_count ) + " ; failed: "
+ str ( d_failed_count ) + " ) " )
if e_failed_count > 0 :
print ( " (failed to remove " + e_failed_count + " known extra file(s) "
" (will be shown under FAILURES below) " )
if ed_failed_count > 0 :
print ( " (failed to remove " + ed_failed_count + " known extra "
" folder(s) (will be shown under FAILURES below) " )
print ( " Removed " + str ( d_removed_count ) + " folder(s) (skipped not "
" present: " +
str ( d_skipped_count ) + " ; failed: " + str ( d_failed_count ) + " ) " )
code = 0
if f_failed_count + d_failed_count + ed_failed_count < = 0 :
print ( " " )
if f_removed_count + d_removed_count < = 0 :
print ( " Nothing to do (minetest+minetestserver has 0 known files "
" on system--you apparently already uninstalled the local "
" version that was installed using ' sudo make install ' ) " )
else :
print ( " OK [finished uninstalling all installed files] " )
print ( " " )
else :
print ( " " )
print ( " " )
print ( CMD_REM + " FAILURES: " )
for rl in retry_lines :
print ( rl )
print ( " " )
print ( " In case of any failures are counted above, "
" try running this script with administrative privileges. "
" If any more remain, you may have to remove them manually. " )
print ( " " )
print ( " " )
code = 1
if not ins . closed :
print ( " ERROR: ins was not closed (this should never happen)-- "
" closing manually... " )
ins . close ( )
code = 1
return code
if __name__ == " __main__ " :
sys . exit ( main ( ) )