Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

217 rader
6.4 KiB

10 år sedan
10 år sedan
10 år sedan
10 år sedan
10 år sedan
10 år sedan
10 år sedan
  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()))