From 53eeed8a993ac2cd234f11021a5a7d8e1fe3eb53 Mon Sep 17 00:00:00 2001 From: Michael Lawson Date: Sun, 12 Jan 2014 19:34:28 +0000 Subject: [PATCH] initial windows support --- bin/autojump | 12 ++++-- bin/autojump.bat | 2 + bin/autojump.lua | 8 ++++ bin/j.bat | 15 ++++++++ bin/jc.bat | 8 ++++ bin/jco.bat | 8 ++++ bin/jo.bat | 15 ++++++++ install.py | 96 ++++++++++++++++++++++++++++-------------------- uninstall.py | 9 +++++ 9 files changed, 130 insertions(+), 43 deletions(-) create mode 100644 bin/autojump.bat create mode 100644 bin/autojump.lua create mode 100644 bin/j.bat create mode 100644 bin/jc.bat create mode 100644 bin/jco.bat create mode 100644 bin/jo.bat diff --git a/bin/autojump b/bin/autojump index df716c8..119f635 100755 --- a/bin/autojump +++ b/bin/autojump @@ -50,6 +50,7 @@ from autojump_utils import get_tab_entry_info from autojump_utils import get_pwd from autojump_utils import has_uppercase from autojump_utils import is_osx +from autojump_utils import is_windows from autojump_utils import last from autojump_utils import print_entry from autojump_utils import print_local @@ -72,6 +73,10 @@ def set_defaults(): os.path.expanduser('~'), 'Library', 'autojump') + elif is_windows(): + data_home = os.path.join( + os.getenv('LOCALAPPDATA'), + 'autojump') else: data_home = os.getenv( 'XDG_DATA_HOME', @@ -258,13 +263,13 @@ def match_consecutive(needles, haystack, ignore_case=False): (path="/moo/foo/baz", weight=10), (path="/foo/baz", weight=10)] """ - regex_no_sep = '[^' + os.sep + ']*' - regex_one_sep = regex_no_sep + os.sep + regex_no_sep + sep = os.sep.encode('string-escape') + regex_no_sep = '[^' + sep + ']*' + regex_one_sep = regex_no_sep + sep + regex_no_sep regex_no_sep_end = regex_no_sep + '$' # can't use compiled regex because of flags regex_needle = regex_one_sep.join(needles) + regex_no_sep_end regex_flags = re.IGNORECASE | re.UNICODE if ignore_case else re.UNICODE - found = lambda entry: re.search( regex_needle, entry.path, @@ -336,7 +341,6 @@ def print_stats(data, data_path): def main(args): # noqa config = set_defaults() - # all arguments are mutually exclusive if args.add: save(config, first(add_path(load(config), args.add))) diff --git a/bin/autojump.bat b/bin/autojump.bat new file mode 100644 index 0000000..a9e359a --- /dev/null +++ b/bin/autojump.bat @@ -0,0 +1,2 @@ +@echo off +python %~dp0\autojump %* \ No newline at end of file diff --git a/bin/autojump.lua b/bin/autojump.lua new file mode 100644 index 0000000..1f3f869 --- /dev/null +++ b/bin/autojump.lua @@ -0,0 +1,8 @@ +local HOME = clink.get_env("USERPROFILE") .."\\" +local AUTOJUMP_BIN = HOME .. ".autojump\\bin\\autojump" + +function autojump_add_to_database() + os.execute("python " .. AUTOJUMP_BIN .. " --add " .. clink.get_cwd()) +end + +clink.prompt.register_filter(autojump_add_to_database, 99) diff --git a/bin/j.bat b/bin/j.bat new file mode 100644 index 0000000..602344c --- /dev/null +++ b/bin/j.bat @@ -0,0 +1,15 @@ +@echo off + +echo %*|>nul findstr /rx \-.* +if ERRORLEVEL 1 ( + for /f %%G in ('python %~dp0\autojump %*') do set new_path=%%G + if exist %new_path%/nul ( + cd %new_path% + ) else ( + echo autojump: directory %* not found + echo try `autojump --help` for more information + ) + echo %new_path% +) else ( + python %~dp0\autojump %* +) \ No newline at end of file diff --git a/bin/jc.bat b/bin/jc.bat new file mode 100644 index 0000000..f0cc8db --- /dev/null +++ b/bin/jc.bat @@ -0,0 +1,8 @@ +@echo off + +echo %*|>nul findstr /rx \-.* +if ERRORLEVEL 1 ( + %~dp0\j.bat %cd% %* +) else ( + python %~dp0\autojump %* +) \ No newline at end of file diff --git a/bin/jco.bat b/bin/jco.bat new file mode 100644 index 0000000..efd42ff --- /dev/null +++ b/bin/jco.bat @@ -0,0 +1,8 @@ +@echo off + +echo %*|>nul findstr /rx \-.* +if ERRORLEVEL 1 ( + %~dp0\jc.bat %cd% %* +) else ( + python %~dp0\autojump %* +) \ No newline at end of file diff --git a/bin/jo.bat b/bin/jo.bat new file mode 100644 index 0000000..f952d1f --- /dev/null +++ b/bin/jo.bat @@ -0,0 +1,15 @@ +@echo off + +echo %*|>nul findstr /rx \-.* +if ERRORLEVEL 1 ( + for /f %%G in ('python %~dp0\autojump %*') do set new_path=%%G + if exist %new_path%/nul ( + start %new_path% + ) else ( + echo autojump: directory %* not found + echo try `autojump --help` for more information + ) + echo %new_path% +) else ( + python %~dp0\autojump %* +) \ No newline at end of file diff --git a/install.py b/install.py index a152e1a..ac5b324 100755 --- a/install.py +++ b/install.py @@ -78,16 +78,21 @@ def parse_arguments(): 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 get_shell() not in SUPPORTED_SHELLS: - print("Unsupported shell: %s" % os.getenv('SHELL'), - file=sys.stderr) - sys.exit(1) - - if args.system and os.geteuid() != 0: - print("Please rerun as root for system-wide installation.", - file=sys.stderr) - sys.exit(1) + if platform.system() != 'Windows': + if get_shell() not in SUPPORTED_SHELLS: + print("Unsupported shell: %s" % os.getenv('SHELL'), + file=sys.stderr) + sys.exit(1) + + if args.system and os.geteuid() != 0: + print("Please rerun as root for system-wide installation.", + file=sys.stderr) + sys.exit(1) + else: + if args.system: + print("System-wide installation is not supported on Windows.", + file=sys.stderr) + sys.exit(1) if args.destdir != default_user_destdir \ or args.prefix != default_user_prefix \ @@ -109,26 +114,29 @@ def parse_arguments(): return args -def print_post_installation_message(etc_dir): - if get_shell() == 'fish': - aj_shell = '%s/autojump.fish' % etc_dir - source_msg = "if test -f %s; . %s; end" % (aj_shell, aj_shell) +def print_post_installation_message(etc_dir, bin_dir): + if platform.system() != 'Windows': + if get_shell() == 'fish': + aj_shell = '%s/autojump.fish' % etc_dir + source_msg = "if test -f %s; . %s; end" % (aj_shell, aj_shell) - # TODO(ting|2013-12-31): check config.fish location on OSX - 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' + # TODO(ting|2013-12-31): check config.fish location on OSX + rcfile = '~/.config/fish/config.fish' 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") + 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") + else: + print("\nPlease manually add %s to your user path" % bin_dir) print("\nPlease restart terminal(s) before running autojump.\n") @@ -139,10 +147,11 @@ def main(args): 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') - icon_dir = os.path.join(args.destdir, args.prefix, 'share/autojump') + etc_dir = os.path.join(args.destdir, 'etc', 'profile.d') + doc_dir = os.path.join(args.destdir, args.prefix, 'share', 'man', 'man1') + icon_dir = os.path.join(args.destdir, args.prefix, 'share', 'autojump') zshshare_dir = os.path.join(args.destdir, args.zshshare) + clink_dir = os.path.join(os.getenv("LOCALAPPDATA"),'clink') mkdir(bin_dir, args.dryrun) mkdir(etc_dir, args.dryrun) @@ -154,18 +163,27 @@ def main(args): cp('./bin/autojump_argparse.py', bin_dir, args.dryrun) cp('./bin/autojump_data.py', bin_dir, args.dryrun) cp('./bin/autojump_utils.py', bin_dir, args.dryrun) - cp('./bin/autojump.sh', etc_dir, args.dryrun) - cp('./bin/autojump.bash', etc_dir, args.dryrun) - cp('./bin/autojump.fish', etc_dir, args.dryrun) - cp('./bin/autojump.zsh', etc_dir, args.dryrun) - cp('./bin/_j', zshshare_dir, args.dryrun) + if platform.system() != 'Windows': + cp('./bin/autojump.sh', etc_dir, args.dryrun) + cp('./bin/autojump.bash', etc_dir, args.dryrun) + cp('./bin/autojump.fish', etc_dir, args.dryrun) + cp('./bin/autojump.zsh', etc_dir, args.dryrun) + cp('./bin/_j', zshshare_dir, args.dryrun) + + if args.custom_install: + modify_autojump_sh(etc_dir, args.dryrun) + else: + cp('./bin/autojump.lua', clink_dir, 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) cp('./bin/icon.png', icon_dir, args.dryrun) cp('./docs/autojump.1', doc_dir, args.dryrun) - if args.custom_install: - modify_autojump_sh(etc_dir, args.dryrun) - print_post_installation_message(etc_dir) + print_post_installation_message(etc_dir, bin_dir) if __name__ == "__main__": sys.exit(main(parse_arguments())) diff --git a/uninstall.py b/uninstall.py index 5430479..d8e9bfc 100755 --- a/uninstall.py +++ b/uninstall.py @@ -8,6 +8,7 @@ import platform import shutil import sys +sys.path.append('bin') from autojump_argparse import ArgumentParser @@ -111,6 +112,10 @@ def remove_user_data(dryrun=False): 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', @@ -127,9 +132,13 @@ def remove_user_data(dryrun=False): def remove_user_installation(dryrun=False): default_destdir = os.path.join(os.path.expanduser("~"), '.autojump') + clink_dir = os.path.join(os.getenv("LOCALAPPDATA"),'clink') if os.path.exists(default_destdir): print("\nFound user installation...") rmdir(default_destdir, dryrun) + if platform.system() == 'Windows': + if os.path.exists(clink_dir): + rm(os.path.join(clink_dir,'autojump.lua'), dryrun) def rm(path, dryrun):