You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

217 lines
6.4 KiB

10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from __future__ import print_function
  4. import os
  5. import platform
  6. import shutil
  7. import sys
  8. sys.path.append('bin')
  9. from autojump_argparse import ArgumentParser # noqa
  10. def is_empty_dir(path):
  11. """
  12. Checks if any files are present within a directory and all sub-directories.
  13. """
  14. for _, _, files in os.walk(path):
  15. if files:
  16. return False
  17. return True
  18. def parse_arguments():
  19. default_clink_dir = os.path.join(os.getenv('LOCALAPPDATA', ''), 'clink')
  20. parser = ArgumentParser(
  21. description='Uninstalls autojump.',
  22. )
  23. parser.add_argument(
  24. '-n', '--dryrun', action='store_true', default=False,
  25. help='simulate installation',
  26. )
  27. parser.add_argument(
  28. '-u', '--userdata', action='store_true', default=False,
  29. help='delete user data',
  30. )
  31. parser.add_argument(
  32. '-d', '--destdir', metavar='DIR',
  33. help='custom destdir',
  34. )
  35. parser.add_argument(
  36. '-p', '--prefix', metavar='DIR', default='',
  37. help='custom prefix',
  38. )
  39. parser.add_argument(
  40. '-z', '--zshshare', metavar='DIR', default='functions',
  41. help='custom zshshare',
  42. )
  43. parser.add_argument(
  44. '-c', '--clinkdir', metavar='DIR', default=default_clink_dir,
  45. )
  46. return parser.parse_args()
  47. def remove_custom_installation(args, dryrun=False):
  48. if not args.destdir:
  49. return
  50. bin_dir = os.path.join(args.destdir, args.prefix, 'bin')
  51. doc_dir = os.path.join(args.destdir, args.prefix, 'share', 'man', 'man1')
  52. etc_dir = os.path.join(args.destdir, 'etc', 'profile.d')
  53. share_dir = os.path.join(args.destdir, args.prefix, 'share', 'autojump')
  54. zshshare_dir = os.path.join(args.destdir, args.zshshare)
  55. if not os.path.exists(share_dir):
  56. return
  57. print('\nFound custom installation...')
  58. rm(os.path.join(bin_dir, 'autojump'), dryrun)
  59. rm(os.path.join(bin_dir, 'autojump_data.py'), dryrun)
  60. rm(os.path.join(bin_dir, 'autojump_utils.py'), dryrun)
  61. rm(os.path.join(bin_dir, 'autojump_argparse.py'), dryrun)
  62. if platform.system() == 'Windows':
  63. if os.path.exists(args.clinkdir):
  64. rm(os.path.join(args.clinkdir, 'autojump.lua'), dryrun)
  65. rm(os.path.join(bin_dir, 'autojump.bat'), dryrun)
  66. rm(os.path.join(bin_dir, 'j.bat'), dryrun)
  67. rm(os.path.join(bin_dir, 'jc.bat'), dryrun)
  68. rm(os.path.join(bin_dir, 'jco.bat'), dryrun)
  69. rm(os.path.join(bin_dir, 'jo.bat'), dryrun)
  70. else:
  71. rm(os.path.join(etc_dir, 'autojump.sh'), dryrun)
  72. rm(os.path.join(share_dir, 'autojump.bash'), dryrun)
  73. rm(os.path.join(share_dir, 'autojump.fish'), dryrun)
  74. rm(os.path.join(share_dir, 'autojump.tcsh'), dryrun)
  75. rm(os.path.join(share_dir, 'autojump.zsh'), dryrun)
  76. rm(os.path.join(zshshare_dir, '_j'), dryrun)
  77. rmdir(share_dir, dryrun)
  78. rm(os.path.join(doc_dir, 'autojump.1'), dryrun)
  79. if is_empty_dir(args.destdir):
  80. rmdir(args.destdir, dryrun)
  81. def remove_system_installation(dryrun=False):
  82. default_destdir = '/'
  83. default_prefix = '/usr/local'
  84. default_zshshare = '/usr/share/zsh/site-functions'
  85. bin_dir = os.path.join(default_destdir, default_prefix, 'bin')
  86. doc_dir = os.path.join(
  87. default_destdir,
  88. default_prefix,
  89. 'share',
  90. 'man',
  91. 'man1',
  92. )
  93. etc_dir = os.path.join(default_destdir, 'etc', 'profile.d')
  94. share_dir = os.path.join(
  95. default_destdir,
  96. default_prefix,
  97. 'share',
  98. 'autojump',
  99. )
  100. zshshare_dir = os.path.join(default_destdir, default_zshshare)
  101. if not os.path.exists(share_dir):
  102. return
  103. print('\nFound system installation...')
  104. if os.geteuid() != 0:
  105. print(
  106. 'Please rerun as root for system-wide uninstall, skipping...',
  107. file=sys.stderr,
  108. )
  109. return
  110. rm(os.path.join(bin_dir, 'autojump'), dryrun)
  111. rm(os.path.join(bin_dir, 'autojump_data.py'), dryrun)
  112. rm(os.path.join(bin_dir, 'autojump_utils.py'), dryrun)
  113. rm(os.path.join(etc_dir, 'autojump.sh'), dryrun)
  114. rm(os.path.join(share_dir, 'autojump.bash'), dryrun)
  115. rm(os.path.join(share_dir, 'autojump.fish'), dryrun)
  116. rm(os.path.join(share_dir, 'autojump.tcsh'), dryrun)
  117. rm(os.path.join(share_dir, 'autojump.zsh'), dryrun)
  118. rm(os.path.join(zshshare_dir, '_j'), dryrun)
  119. rmdir(share_dir, dryrun)
  120. rm(os.path.join(doc_dir, 'autojump.1'), dryrun)
  121. def remove_user_data(dryrun=False):
  122. if platform.system() == 'Darwin':
  123. data_home = os.path.join(
  124. os.path.expanduser('~'),
  125. 'Library',
  126. 'autojump',
  127. )
  128. elif platform.system() == 'Windows':
  129. data_home = os.path.join(
  130. os.getenv('APPDATA'),
  131. 'autojump',
  132. )
  133. else:
  134. data_home = os.getenv(
  135. 'XDG_DATA_HOME',
  136. os.path.join(
  137. os.path.expanduser('~'),
  138. '.local',
  139. 'share',
  140. 'autojump',
  141. ),
  142. )
  143. if os.path.exists(data_home):
  144. print('\nFound user data...')
  145. rmdir(data_home, dryrun)
  146. def remove_user_installation(dryrun=False):
  147. if platform.system() == 'Windows':
  148. default_destdir = os.path.join(
  149. os.getenv('LOCALAPPDATA', ''),
  150. 'autojump',
  151. )
  152. clink_dir = os.path.join(os.getenv('LOCALAPPDATA', ''), 'clink')
  153. else:
  154. default_destdir = os.path.join(os.path.expanduser('~'), '.autojump')
  155. if os.path.exists(default_destdir):
  156. print('\nFound user installation...')
  157. rmdir(default_destdir, dryrun)
  158. if platform.system() == 'Windows' and os.path.exists(clink_dir):
  159. rm(os.path.join(clink_dir, 'autojump.lua'), dryrun)
  160. def rm(path, dryrun):
  161. if os.path.exists(path):
  162. print('deleting file:', path)
  163. if not dryrun:
  164. os.remove(path)
  165. def rmdir(path, dryrun):
  166. if os.path.exists(path):
  167. print('deleting directory:', path)
  168. if not dryrun:
  169. shutil.rmtree(path)
  170. def main(args):
  171. if args.dryrun:
  172. print('Uninstalling autojump (DRYRUN)...')
  173. else:
  174. print('Uninstalling autojump...')
  175. remove_user_installation(args.dryrun)
  176. remove_system_installation(args.dryrun)
  177. remove_custom_installation(args, args.dryrun)
  178. if args.userdata:
  179. remove_user_data(args.dryrun)
  180. if __name__ == '__main__':
  181. sys.exit(main(parse_arguments()))