mirror of
https://github.com/wting/autojump
synced 2025-06-07 09:54:06 +00:00
251 lines
8.2 KiB
Python
Executable File
251 lines
8.2 KiB
Python
Executable File
#!/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
|
||
|
||
SUPPORTED_SHELLS = ('bash', 'zsh', 'fish', 'tcsh')
|
||
|
||
def is_msys2():
|
||
'''
|
||
判断存在环境变量MSYSTEM,说明是msys2环境
|
||
'''
|
||
return "MSYSTEM" in os.environ and platform.system() == 'Windows'
|
||
|
||
|
||
def cp(src, dest, dryrun=False):
|
||
print('copying file: %s -> %s' % (src, dest))
|
||
if not dryrun:
|
||
shutil.copy(src, dest)
|
||
|
||
|
||
def get_shell():
|
||
return os.path.basename(os.getenv('SHELL', ''))
|
||
|
||
|
||
def mkdir(path, dryrun=False):
|
||
print('creating directory:', path)
|
||
if not dryrun and not os.path.exists(path):
|
||
os.makedirs(path)
|
||
|
||
|
||
def modify_autojump_sh(etc_dir, share_dir, dryrun=False):
|
||
"""Append custom installation path to autojump.sh"""
|
||
custom_install = '\
|
||
\n# check custom install \
|
||
\nif [ -s %s/autojump.${shell} ]; then \
|
||
\n source %s/autojump.${shell} \
|
||
\nfi\n' % (share_dir, share_dir)
|
||
|
||
with open(os.path.join(etc_dir, 'autojump.sh'), 'a') as f:
|
||
f.write(custom_install)
|
||
|
||
|
||
def modify_autojump_lua(clink_dir, bin_dir, dryrun=False):
|
||
"""Prepend custom AUTOJUMP_BIN_DIR definition to autojump.lua"""
|
||
custom_install = "local AUTOJUMP_BIN_DIR = \"%s\"\n" % bin_dir.replace(
|
||
'\\',
|
||
'\\\\',
|
||
)
|
||
clink_file = os.path.join(clink_dir, 'autojump.lua')
|
||
with open(clink_file, 'r') as f:
|
||
original = f.read()
|
||
with open(clink_file, 'w') as f:
|
||
f.write(custom_install + original)
|
||
|
||
|
||
def parse_arguments(): # noqa
|
||
# USER MSYSTEM_PREFIX
|
||
# 判断存在环境变量MSYSTEM_PREFIX,说明是msys2环境
|
||
if is_msys2():
|
||
# 如果是msys2环境,设置默认路径
|
||
default_user_destdir = os.path.join(
|
||
os.getenv('HOME'),
|
||
'.autojump',
|
||
)
|
||
elif platform.system() == 'Windows':
|
||
default_user_destdir = os.path.join(
|
||
os.getenv('LOCALAPPDATA', ''),
|
||
'autojump',
|
||
)
|
||
else:
|
||
default_user_destdir = os.path.join(
|
||
os.path.expanduser('~'),
|
||
'.autojump',
|
||
)
|
||
default_user_prefix = ''
|
||
default_user_zshshare = 'functions'
|
||
default_system_destdir = '/'
|
||
default_system_prefix = '/usr/local'
|
||
default_system_zshshare = '/usr/share/zsh/site-functions'
|
||
default_clink_dir = os.path.join(os.getenv('LOCALAPPDATA', ''), 'clink')
|
||
|
||
parser = ArgumentParser(
|
||
description='Installs autojump globally for root users, otherwise \
|
||
installs in current user\'s home directory.'
|
||
)
|
||
parser.add_argument(
|
||
'-n', '--dryrun', action='store_true', default=False,
|
||
help='simulate installation',
|
||
)
|
||
parser.add_argument(
|
||
'-f', '--force', action='store_true', default=False,
|
||
help='skip root user, shell type, Python version checks',
|
||
)
|
||
parser.add_argument(
|
||
'-d', '--destdir', metavar='DIR', default=default_user_destdir,
|
||
help='set destination to DIR',
|
||
)
|
||
parser.add_argument(
|
||
'-p', '--prefix', metavar='DIR', default=default_user_prefix,
|
||
help='set prefix to DIR',
|
||
)
|
||
parser.add_argument(
|
||
'-z', '--zshshare', metavar='DIR', default=default_user_zshshare,
|
||
help='set zsh share destination to DIR',
|
||
)
|
||
parser.add_argument(
|
||
'-c', '--clinkdir', metavar='DIR', default=default_clink_dir,
|
||
help='set clink directory location to DIR (Windows only)',
|
||
)
|
||
parser.add_argument(
|
||
'-s', '--system', action='store_true', default=False,
|
||
help='install system wide for all users',
|
||
)
|
||
|
||
args = parser.parse_args()
|
||
|
||
if not args.force:
|
||
if sys.version_info[0] == 2 and sys.version_info[1] < 6:
|
||
print('Python v2.6+ or v3.0+ required.', file=sys.stderr)
|
||
sys.exit(1)
|
||
if args.system:
|
||
if platform.system() == 'Windows':
|
||
print(
|
||
'System-wide installation is not supported on Windows.',
|
||
file=sys.stderr,
|
||
)
|
||
sys.exit(1)
|
||
elif os.geteuid() != 0:
|
||
print(
|
||
'Please rerun as root for system-wide installation.',
|
||
file=sys.stderr,
|
||
)
|
||
sys.exit(1)
|
||
|
||
if platform.system() != 'Windows' \
|
||
and get_shell() not in SUPPORTED_SHELLS:
|
||
print(
|
||
'Unsupported shell: %s' % os.getenv('SHELL'),
|
||
file=sys.stderr,
|
||
)
|
||
sys.exit(1)
|
||
|
||
if args.destdir != default_user_destdir \
|
||
or args.prefix != default_user_prefix \
|
||
or args.zshshare != default_user_zshshare:
|
||
args.custom_install = True
|
||
else:
|
||
args.custom_install = False
|
||
|
||
if args.system:
|
||
if args.custom_install:
|
||
print(
|
||
'Custom paths incompatible with --system option.',
|
||
file=sys.stderr,
|
||
)
|
||
sys.exit(1)
|
||
|
||
args.destdir = default_system_destdir
|
||
args.prefix = default_system_prefix
|
||
args.zshshare = default_system_zshshare
|
||
|
||
return args
|
||
|
||
|
||
def show_post_installation_message(etc_dir, share_dir, bin_dir):
|
||
if platform.system() == 'Windows' and not is_msys2():
|
||
print('\nPlease manually add %s to your user path' % bin_dir)
|
||
else:
|
||
if get_shell() == 'fish':
|
||
aj_shell = '%s/autojump.fish' % share_dir
|
||
source_msg = 'if test -f %s; . %s; end' % (aj_shell, aj_shell)
|
||
rcfile = '~/.config/fish/config.fish'
|
||
else:
|
||
aj_shell = '%s/autojump.sh' % etc_dir
|
||
source_msg = '[[ -s %s ]] && source %s' % (aj_shell, aj_shell)
|
||
|
||
if platform.system() == 'Darwin' and get_shell() == 'bash':
|
||
rcfile = '~/.profile'
|
||
else:
|
||
rcfile = '~/.%src' % get_shell()
|
||
|
||
print('\nPlease manually add the following line(s) to %s:' % rcfile)
|
||
print('\n\t' + source_msg)
|
||
if get_shell() == 'zsh':
|
||
print('\n\tautoload -U compinit && compinit -u')
|
||
|
||
print('\nPlease restart terminal(s) before running autojump.\n')
|
||
|
||
|
||
def main(args):
|
||
if args.dryrun:
|
||
print('Installing autojump to %s (DRYRUN)...' % args.destdir)
|
||
else:
|
||
print('Installing autojump to %s ...' % args.destdir)
|
||
|
||
bin_dir = os.path.join(args.destdir, args.prefix, 'bin')
|
||
etc_dir = os.path.join(args.destdir, 'etc', 'profile.d')
|
||
doc_dir = os.path.join(args.destdir, args.prefix, 'share', 'man', 'man1')
|
||
share_dir = os.path.join(args.destdir, args.prefix, 'share', 'autojump')
|
||
zshshare_dir = os.path.join(args.destdir, args.zshshare)
|
||
|
||
mkdir(bin_dir, args.dryrun)
|
||
mkdir(doc_dir, args.dryrun)
|
||
mkdir(etc_dir, args.dryrun)
|
||
mkdir(share_dir, args.dryrun)
|
||
|
||
cp('./bin/autojump', bin_dir, args.dryrun)
|
||
cp('./bin/autojump_argparse.py', bin_dir, args.dryrun)
|
||
cp('./bin/autojump_data.py', bin_dir, args.dryrun)
|
||
cp('./bin/autojump_match.py', bin_dir, args.dryrun)
|
||
cp('./bin/autojump_utils.py', bin_dir, args.dryrun)
|
||
cp('./bin/icon.png', share_dir, args.dryrun)
|
||
cp('./docs/autojump.1', doc_dir, args.dryrun)
|
||
|
||
if platform.system() == 'Windows' and not is_msys2():
|
||
cp('./bin/autojump.lua', args.clinkdir, args.dryrun)
|
||
cp('./bin/autojump.bat', bin_dir, args.dryrun)
|
||
cp('./bin/j.bat', bin_dir, args.dryrun)
|
||
cp('./bin/jc.bat', bin_dir, args.dryrun)
|
||
cp('./bin/jo.bat', bin_dir, args.dryrun)
|
||
cp('./bin/jco.bat', bin_dir, args.dryrun)
|
||
|
||
if args.custom_install:
|
||
modify_autojump_lua(args.clinkdir, bin_dir, args.dryrun)
|
||
else:
|
||
mkdir(etc_dir, args.dryrun)
|
||
mkdir(share_dir, args.dryrun)
|
||
mkdir(zshshare_dir, args.dryrun)
|
||
|
||
cp('./bin/autojump.sh', etc_dir, args.dryrun)
|
||
cp('./bin/autojump.bash', share_dir, args.dryrun)
|
||
cp('./bin/autojump.fish', share_dir, args.dryrun)
|
||
cp('./bin/autojump.zsh', share_dir, args.dryrun)
|
||
cp('./bin/_j', zshshare_dir, args.dryrun)
|
||
|
||
if args.custom_install:
|
||
modify_autojump_sh(etc_dir, share_dir, args.dryrun)
|
||
|
||
show_post_installation_message(etc_dir, share_dir, bin_dir)
|
||
|
||
|
||
if __name__ == '__main__':
|
||
sys.exit(main(parse_arguments()))
|