From 88e9c21a3b6a54924d0d6f9d3048474bda65e2e2 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 5 Jan 2018 14:56:01 +0530 Subject: [PATCH] Ensure a kitty executable is on PATH even when running from source --- __main__.py | 32 ++++++++++++++++++-------------- kitty/main.py | 17 ++++++++++++----- launcher/kitty | 13 +++++++++++++ 3 files changed, 43 insertions(+), 19 deletions(-) create mode 100755 launcher/kitty diff --git a/__main__.py b/__main__.py index 8de3cbb1a..9963964a2 100644 --- a/__main__.py +++ b/__main__.py @@ -4,8 +4,6 @@ import sys -first_arg = '' if len(sys.argv) < 2 else sys.argv[1] - def icat(args): from kitty.icat import main @@ -17,16 +15,22 @@ def list_fonts(args): main(args) -if first_arg in ('icat', '+icat'): - icat(sys.argv[1:]) -elif first_arg in ('list-fonts', '+list-fonts'): - list_fonts(sys.argv[1:]) -elif first_arg == '+' and len(sys.argv) > 2: - q = sys.argv[2] - if q == 'icat': - icat(sys.argv[2:]) - elif q == 'list-fonts': - list_fonts(sys.argv[2:]) -else: - from kitty.main import main +def main(): + first_arg = '' if len(sys.argv) < 2 else sys.argv[1] + if first_arg in ('icat', '+icat'): + icat(sys.argv[1:]) + elif first_arg in ('list-fonts', '+list-fonts'): + list_fonts(sys.argv[1:]) + elif first_arg == '+' and len(sys.argv) > 2: + q = sys.argv[2] + if q == 'icat': + icat(sys.argv[2:]) + elif q == 'list-fonts': + list_fonts(sys.argv[2:]) + else: + from kitty.main import main + main() + + +if __name__ == '__main__': main() diff --git a/kitty/main.py b/kitty/main.py index 3e337cd88..29e99361e 100644 --- a/kitty/main.py +++ b/kitty/main.py @@ -109,12 +109,19 @@ def main(): locale.setlocale(locale.LC_ALL, '') except Exception: print('Failed to set locale with no LANG, ignoring', file=sys.stderr) + + # Ensure kitty is in PATH rpath = getattr(sys, 'bundle_exe_dir', None) - if rpath: - # Ensure kitty bin directory is in PATH - items = frozenset(os.environ['PATH'].split(os.pathsep)) - if rpath not in items: - os.environ['PATH'] += os.pathsep + rpath + items = frozenset(os.environ['PATH'].split(os.pathsep)) + if not rpath: + for candidate in items: + if os.access(os.path.join(candidate, 'kitty'), os.X_OK): + break + else: + rpath = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'launcher') + if rpath and rpath not in items: + os.environ['PATH'] += os.pathsep + rpath + if os.environ.pop('KITTY_LAUNCHED_BY_LAUNCH_SERVICES', None) == '1' and getattr(sys, 'frozen', True): os.chdir(os.path.expanduser('~')) diff --git a/launcher/kitty b/launcher/kitty new file mode 100755 index 000000000..01999b015 --- /dev/null +++ b/launcher/kitty @@ -0,0 +1,13 @@ +#!/usr/bin/env python3 +# vim:fileencoding=utf-8 +# License: GPL v3 Copyright: 2018, Kovid Goyal + +import os +import sys + +base = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +sys.path.insert(0, base) +with open(os.path.join(base, '__main__.py')) as f: + src = f.read() +code = compile(src, f.name, 'exec') +exec(code, {'__name__': '__main__'})