#!/usr/bin/env python3 # -*- coding: utf-8 -*- from __future__ import print_function import os import platform import shutil import sys sys.path.append('bin') from autojump_argparse import ArgumentParser # noqa def is_empty_dir(path): """ Checks if any files are present within a directory and all sub-directories. """ for _, _, files in os.walk(path): if files: return False return True def parse_arguments(): default_clink_dir = os.path.join(os.getenv('LOCALAPPDATA', ''), 'clink') parser = ArgumentParser( description='Uninstalls autojump.', ) parser.add_argument( '-n', '--dryrun', action='store_true', default=False, help='simulate installation', ) parser.add_argument( '-u', '--userdata', action='store_true', default=False, help='delete user data', ) parser.add_argument( '-d', '--destdir', metavar='DIR', help='custom destdir', ) parser.add_argument( '-p', '--prefix', metavar='DIR', default='', help='custom prefix', ) parser.add_argument( '-z', '--zshshare', metavar='DIR', default='functions', help='custom zshshare', ) parser.add_argument( '-c', '--clinkdir', metavar='DIR', default=default_clink_dir, ) return parser.parse_args() def remove_custom_installation(args, dryrun=False): if not args.destdir: return bin_dir = os.path.join(args.destdir, args.prefix, 'bin') doc_dir = os.path.join(args.destdir, args.prefix, 'share', 'man', 'man1') etc_dir = os.path.join(args.destdir, 'etc', 'profile.d') share_dir = os.path.join(args.destdir, args.prefix, 'share', 'autojump') zshshare_dir = os.path.join(args.destdir, args.zshshare) if not os.path.exists(share_dir): return print('\nFound custom installation...') rm(os.path.join(bin_dir, 'autojump'), dryrun) rm(os.path.join(bin_dir, 'autojump_data.py'), dryrun) rm(os.path.join(bin_dir, 'autojump_utils.py'), dryrun) rm(os.path.join(bin_dir, 'autojump_argparse.py'), dryrun) if platform.system() == 'Windows': if os.path.exists(args.clinkdir): rm(os.path.join(args.clinkdir, 'autojump.lua'), dryrun) rm(os.path.join(bin_dir, 'autojump.bat'), dryrun) rm(os.path.join(bin_dir, 'j.bat'), dryrun) rm(os.path.join(bin_dir, 'jc.bat'), dryrun) rm(os.path.join(bin_dir, 'jco.bat'), dryrun) rm(os.path.join(bin_dir, 'jo.bat'), dryrun) else: rm(os.path.join(etc_dir, 'autojump.sh'), dryrun) rm(os.path.join(share_dir, 'autojump.bash'), dryrun) rm(os.path.join(share_dir, 'autojump.fish'), dryrun) rm(os.path.join(share_dir, 'autojump.tcsh'), dryrun) rm(os.path.join(share_dir, 'autojump.zsh'), dryrun) rm(os.path.join(zshshare_dir, '_j'), dryrun) rmdir(share_dir, dryrun) rm(os.path.join(doc_dir, 'autojump.1'), dryrun) if is_empty_dir(args.destdir): rmdir(args.destdir, dryrun) def remove_system_installation(dryrun=False): default_destdir = '/' default_prefix = '/usr/local' default_zshshare = '/usr/share/zsh/site-functions' bin_dir = os.path.join(default_destdir, default_prefix, 'bin') doc_dir = os.path.join( default_destdir, default_prefix, 'share', 'man', 'man1', ) etc_dir = os.path.join(default_destdir, 'etc', 'profile.d') share_dir = os.path.join( default_destdir, default_prefix, 'share', 'autojump', ) zshshare_dir = os.path.join(default_destdir, default_zshshare) if not os.path.exists(share_dir): return print('\nFound system installation...') if os.geteuid() != 0: print( 'Please rerun as root for system-wide uninstall, skipping...', file=sys.stderr, ) return rm(os.path.join(bin_dir, 'autojump'), dryrun) rm(os.path.join(bin_dir, 'autojump_data.py'), dryrun) rm(os.path.join(bin_dir, 'autojump_utils.py'), dryrun) rm(os.path.join(etc_dir, 'autojump.sh'), dryrun) rm(os.path.join(share_dir, 'autojump.bash'), dryrun) rm(os.path.join(share_dir, 'autojump.fish'), dryrun) rm(os.path.join(share_dir, 'autojump.tcsh'), dryrun) rm(os.path.join(share_dir, 'autojump.zsh'), dryrun) rm(os.path.join(zshshare_dir, '_j'), dryrun) rmdir(share_dir, dryrun) rm(os.path.join(doc_dir, 'autojump.1'), dryrun) def remove_user_data(dryrun=False): if platform.system() == 'Darwin': data_home = os.path.join( os.path.expanduser('~'), 'Library', 'autojump', ) elif platform.system() == 'Windows': data_home = os.path.join( os.getenv('APPDATA'), 'autojump', ) else: data_home = os.getenv( 'XDG_DATA_HOME', os.path.join( os.path.expanduser('~'), '.local', 'share', 'autojump', ), ) if os.path.exists(data_home): print('\nFound user data...') rmdir(data_home, dryrun) def remove_user_installation(dryrun=False): if platform.system() == 'Windows': default_destdir = os.path.join( os.getenv('LOCALAPPDATA', ''), 'autojump', ) clink_dir = os.path.join(os.getenv('LOCALAPPDATA', ''), 'clink') else: default_destdir = os.path.join(os.path.expanduser('~'), '.autojump') if os.path.exists(default_destdir): print('\nFound user installation...') rmdir(default_destdir, dryrun) if platform.system() == 'Windows' and os.path.exists(clink_dir): rm(os.path.join(clink_dir, 'autojump.lua'), dryrun) def rm(path, dryrun): if os.path.exists(path): print('deleting file:', path) if not dryrun: os.remove(path) def rmdir(path, dryrun): if os.path.exists(path): print('deleting directory:', path) if not dryrun: shutil.rmtree(path) def main(args): if args.dryrun: print('Uninstalling autojump (DRYRUN)...') else: print('Uninstalling autojump...') remove_user_installation(args.dryrun) remove_system_installation(args.dryrun) remove_custom_installation(args, args.dryrun) if args.userdata: remove_user_data(args.dryrun) if __name__ == '__main__': sys.exit(main(parse_arguments()))