選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

200 行
6.3 KiB

10年前
10年前
10年前
10年前
10年前
10年前
10年前
10年前
10年前
10年前
10年前
  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. parser.add_argument(
  23. '-n', '--dryrun', action='store_true', default=False,
  24. help='simulate installation')
  25. parser.add_argument(
  26. '-u', '--userdata', action='store_true', default=False,
  27. help='delete user data')
  28. parser.add_argument(
  29. '-d', '--destdir', metavar='DIR',
  30. help='custom destdir')
  31. parser.add_argument(
  32. '-p', '--prefix', metavar='DIR', default='',
  33. help='custom prefix')
  34. parser.add_argument(
  35. '-z', '--zshshare', metavar='DIR', default='functions',
  36. help='custom zshshare')
  37. parser.add_argument(
  38. '-c', '--clinkdir', metavar='DIR', default=default_clink_dir)
  39. return parser.parse_args()
  40. def remove_custom_installation(args, dryrun=False):
  41. if not args.destdir:
  42. return
  43. bin_dir = os.path.join(args.destdir, args.prefix, 'bin')
  44. doc_dir = os.path.join(args.destdir, args.prefix, 'share', 'man', 'man1')
  45. etc_dir = os.path.join(args.destdir, 'etc', 'profile.d')
  46. share_dir = os.path.join(args.destdir, args.prefix, 'share', 'autojump')
  47. zshshare_dir = os.path.join(args.destdir, args.zshshare)
  48. if not os.path.exists(share_dir):
  49. return
  50. print('\nFound custom installation...')
  51. rm(os.path.join(bin_dir, 'autojump'), dryrun)
  52. rm(os.path.join(bin_dir, 'autojump_data.py'), dryrun)
  53. rm(os.path.join(bin_dir, 'autojump_utils.py'), dryrun)
  54. rm(os.path.join(bin_dir, 'autojump_argparse.py'), dryrun)
  55. if platform.system() == 'Windows':
  56. if os.path.exists(args.clinkdir):
  57. rm(os.path.join(args.clinkdir, 'autojump.lua'), dryrun)
  58. rm(os.path.join(bin_dir, 'autojump.bat'), dryrun)
  59. rm(os.path.join(bin_dir, 'j.bat'), dryrun)
  60. rm(os.path.join(bin_dir, 'jc.bat'), dryrun)
  61. rm(os.path.join(bin_dir, 'jco.bat'), dryrun)
  62. rm(os.path.join(bin_dir, 'jo.bat'), dryrun)
  63. else:
  64. rm(os.path.join(etc_dir, 'autojump.sh'), dryrun)
  65. rm(os.path.join(share_dir, 'autojump.bash'), dryrun)
  66. rm(os.path.join(share_dir, 'autojump.fish'), dryrun)
  67. rm(os.path.join(share_dir, 'autojump.tcsh'), dryrun)
  68. rm(os.path.join(share_dir, 'autojump.zsh'), dryrun)
  69. rm(os.path.join(zshshare_dir, '_j'), dryrun)
  70. rmdir(share_dir, dryrun)
  71. rm(os.path.join(doc_dir, 'autojump.1'), dryrun)
  72. if is_empty_dir(args.destdir):
  73. rmdir(args.destdir, dryrun)
  74. def remove_system_installation(dryrun=False):
  75. default_destdir = '/'
  76. default_prefix = '/usr/local'
  77. default_zshshare = '/usr/share/zsh/site-functions'
  78. bin_dir = os.path.join(default_destdir, default_prefix, 'bin')
  79. doc_dir = os.path.join(
  80. default_destdir,
  81. default_prefix,
  82. 'share',
  83. 'man',
  84. 'man1')
  85. etc_dir = os.path.join(default_destdir, 'etc', 'profile.d')
  86. share_dir = os.path.join(
  87. default_destdir,
  88. default_prefix,
  89. 'share',
  90. 'autojump')
  91. zshshare_dir = os.path.join(default_destdir, default_zshshare)
  92. if not os.path.exists(share_dir):
  93. return
  94. print('\nFound system installation...')
  95. if os.geteuid() != 0:
  96. print('Please rerun as root for system-wide uninstall, skipping...',
  97. file=sys.stderr)
  98. return
  99. rm(os.path.join(bin_dir, 'autojump'), dryrun)
  100. rm(os.path.join(bin_dir, 'autojump_data.py'), dryrun)
  101. rm(os.path.join(bin_dir, 'autojump_utils.py'), dryrun)
  102. rm(os.path.join(etc_dir, 'autojump.sh'), dryrun)
  103. rm(os.path.join(share_dir, 'autojump.bash'), dryrun)
  104. rm(os.path.join(share_dir, 'autojump.fish'), dryrun)
  105. rm(os.path.join(share_dir, 'autojump.tcsh'), dryrun)
  106. rm(os.path.join(share_dir, 'autojump.zsh'), dryrun)
  107. rm(os.path.join(zshshare_dir, '_j'), dryrun)
  108. rmdir(share_dir, dryrun)
  109. rm(os.path.join(doc_dir, 'autojump.1'), dryrun)
  110. def remove_user_data(dryrun=False):
  111. if platform.system() == 'Darwin':
  112. data_home = os.path.join(
  113. os.path.expanduser('~'),
  114. 'Library',
  115. 'autojump')
  116. elif platform.system() == 'Windows':
  117. data_home = os.path.join(
  118. os.getenv('APPDATA'),
  119. 'autojump')
  120. else:
  121. data_home = os.getenv(
  122. 'XDG_DATA_HOME',
  123. os.path.join(
  124. os.path.expanduser('~'),
  125. '.local',
  126. 'share',
  127. 'autojump'))
  128. if os.path.exists(data_home):
  129. print('\nFound user data...')
  130. rmdir(data_home, dryrun)
  131. def remove_user_installation(dryrun=False):
  132. if platform.system() == 'Windows':
  133. default_destdir = os.path.join(os.getenv('LOCALAPPDATA', ''),
  134. 'autojump')
  135. clink_dir = os.path.join(os.getenv('LOCALAPPDATA', ''), 'clink')
  136. else:
  137. default_destdir = os.path.join(os.path.expanduser('~'), '.autojump')
  138. if os.path.exists(default_destdir):
  139. print('\nFound user installation...')
  140. rmdir(default_destdir, dryrun)
  141. if platform.system() == 'Windows' and os.path.exists(clink_dir):
  142. rm(os.path.join(clink_dir, 'autojump.lua'), dryrun)
  143. def rm(path, dryrun):
  144. if os.path.exists(path):
  145. print('deleting file:', path)
  146. if not dryrun:
  147. os.remove(path)
  148. def rmdir(path, dryrun):
  149. if os.path.exists(path):
  150. print('deleting directory:', path)
  151. if not dryrun:
  152. shutil.rmtree(path)
  153. def main(args):
  154. if args.dryrun:
  155. print('Uninstalling autojump (DRYRUN)...')
  156. else:
  157. print('Uninstalling autojump...')
  158. remove_user_installation(args.dryrun)
  159. remove_system_installation(args.dryrun)
  160. remove_custom_installation(args, args.dryrun)
  161. if args.userdata:
  162. remove_user_data(args.dryrun)
  163. if __name__ == '__main__':
  164. sys.exit(main(parse_arguments()))