Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
36a20f7b00 | ||
|
|
35cbf49b08 | ||
|
|
21836cedda | ||
|
|
0a892b72e6 | ||
|
|
2c6e5a6e73 | ||
|
|
2cb25cf5a8 | ||
|
|
e07916425e | ||
|
|
f62e2374e4 |
@@ -1 +1 @@
|
|||||||
to_vm_excludes '/build /dist /.build-cache /tags __pycache__ /*_commands.json *.so *.pyd *.pyc'
|
to_vm_excludes '/build /dist /kitty/launcher/kitty /.build-cache /tags __pycache__ /*_commands.json *.so *.pyd *.pyc'
|
||||||
|
|||||||
@@ -4,6 +4,12 @@ Changelog
|
|||||||
|kitty| is a feature full, cross-platform, *fast*, GPU based terminal emulator.
|
|kitty| is a feature full, cross-platform, *fast*, GPU based terminal emulator.
|
||||||
To update |kitty|, :doc:`follow the instructions <binary>`.
|
To update |kitty|, :doc:`follow the instructions <binary>`.
|
||||||
|
|
||||||
|
0.18.1 [2020-06-23]
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
- macOS: Fix for diff kitten not working with python 3.8 (:iss:`2780`)
|
||||||
|
|
||||||
|
|
||||||
0.18.0 [2020-06-20]
|
0.18.0 [2020-06-20]
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
|
|||||||
22
glfw/glfw3.h
vendored
22
glfw/glfw3.h
vendored
@@ -195,6 +195,22 @@ extern "C" {
|
|||||||
|
|
||||||
#endif /*__APPLE__*/
|
#endif /*__APPLE__*/
|
||||||
|
|
||||||
|
#elif defined(GLFW_INCLUDE_GLU)
|
||||||
|
|
||||||
|
#if defined(__APPLE__)
|
||||||
|
|
||||||
|
#if defined(GLFW_INCLUDE_GLU)
|
||||||
|
#include <OpenGL/glu.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else /*__APPLE__*/
|
||||||
|
|
||||||
|
#if defined(GLFW_INCLUDE_GLU)
|
||||||
|
#include <GL/glu.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /*__APPLE__*/
|
||||||
|
|
||||||
#elif !defined(GLFW_INCLUDE_NONE) && \
|
#elif !defined(GLFW_INCLUDE_NONE) && \
|
||||||
!defined(__gl_h_) && \
|
!defined(__gl_h_) && \
|
||||||
!defined(__gles1_gl_h_) && \
|
!defined(__gles1_gl_h_) && \
|
||||||
@@ -218,9 +234,6 @@ extern "C" {
|
|||||||
#define GL_GLEXT_LEGACY
|
#define GL_GLEXT_LEGACY
|
||||||
#endif
|
#endif
|
||||||
#include <OpenGL/gl.h>
|
#include <OpenGL/gl.h>
|
||||||
#if defined(GLFW_INCLUDE_GLU)
|
|
||||||
#include <OpenGL/glu.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else /*__APPLE__*/
|
#else /*__APPLE__*/
|
||||||
|
|
||||||
@@ -228,9 +241,6 @@ extern "C" {
|
|||||||
#if defined(GLFW_INCLUDE_GLEXT)
|
#if defined(GLFW_INCLUDE_GLEXT)
|
||||||
#include <GL/glext.h>
|
#include <GL/glext.h>
|
||||||
#endif
|
#endif
|
||||||
#if defined(GLFW_INCLUDE_GLU)
|
|
||||||
#include <GL/glu.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /*__APPLE__*/
|
#endif /*__APPLE__*/
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ from pygments.formatter import Formatter # type: ignore
|
|||||||
from pygments.lexers import get_lexer_for_filename # type: ignore
|
from pygments.lexers import get_lexer_for_filename # type: ignore
|
||||||
from pygments.util import ClassNotFound # type: ignore
|
from pygments.util import ClassNotFound # type: ignore
|
||||||
|
|
||||||
|
from kitty.multiprocessing import get_process_pool_executor
|
||||||
from kitty.rgb import color_as_sgr, parse_sharp
|
from kitty.rgb import color_as_sgr, parse_sharp
|
||||||
|
|
||||||
from .collect import Collection, Segment, data_for_path, lines_for_path
|
from .collect import Collection, Segment, data_for_path, lines_for_path
|
||||||
@@ -139,7 +140,7 @@ def highlight_for_diff(path: str, aliases: Dict[str, str]) -> DiffHighlight:
|
|||||||
def highlight_collection(collection: Collection, aliases: Optional[Dict[str, str]] = None) -> Union[str, Dict[str, DiffHighlight]]:
|
def highlight_collection(collection: Collection, aliases: Optional[Dict[str, str]] = None) -> Union[str, Dict[str, DiffHighlight]]:
|
||||||
jobs = {}
|
jobs = {}
|
||||||
ans: Dict[str, DiffHighlight] = {}
|
ans: Dict[str, DiffHighlight] = {}
|
||||||
with concurrent.futures.ProcessPoolExecutor(max_workers=os.cpu_count()) as executor:
|
with get_process_pool_executor(prefer_fork=True) as executor:
|
||||||
for path, item_type, other_path in collection:
|
for path, item_type, other_path in collection:
|
||||||
if item_type != 'rename':
|
if item_type != 'rename':
|
||||||
for p in (path, other_path):
|
for p in (path, other_path):
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ class Version(NamedTuple):
|
|||||||
|
|
||||||
|
|
||||||
appname: str = 'kitty'
|
appname: str = 'kitty'
|
||||||
version: Version = Version(0, 18, 0)
|
version: Version = Version(0, 18, 1)
|
||||||
str_version: str = '.'.join(map(str, version))
|
str_version: str = '.'.join(map(str, version))
|
||||||
_plat = sys.platform.lower()
|
_plat = sys.platform.lower()
|
||||||
is_macos: bool = 'darwin' in _plat
|
is_macos: bool = 'darwin' in _plat
|
||||||
|
|||||||
66
kitty/multiprocessing.py
Normal file
66
kitty/multiprocessing.py
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# vim:fileencoding=utf-8
|
||||||
|
# License: GPLv3 Copyright: 2020, Kovid Goyal <kovid at kovidgoyal.net>
|
||||||
|
|
||||||
|
# Monkeypatch the stdlib multiprocessing module to work with the embedded python
|
||||||
|
# in kitty, when using the spawn launcher.
|
||||||
|
|
||||||
|
|
||||||
|
from concurrent.futures import ProcessPoolExecutor
|
||||||
|
from multiprocessing import util # type: ignore
|
||||||
|
from multiprocessing import context, get_all_start_methods, get_context, spawn
|
||||||
|
from typing import Any, Callable, List, Optional, Tuple, Union
|
||||||
|
|
||||||
|
from .constants import kitty_exe
|
||||||
|
|
||||||
|
orig_spawn_passfds = util.spawnv_passfds
|
||||||
|
orig_executable = spawn.get_executable()
|
||||||
|
|
||||||
|
|
||||||
|
def spawnv_passfds(path: str, args: List[str], passfds: List[int]) -> Any:
|
||||||
|
idx = args.index('-c')
|
||||||
|
patched_args = [spawn.get_executable(), '+runpy'] + args[idx + 1:]
|
||||||
|
return orig_spawn_passfds(kitty_exe(), patched_args, passfds)
|
||||||
|
|
||||||
|
|
||||||
|
def monkey_patch_multiprocessing() -> None:
|
||||||
|
# Use kitty to run the worker process used by multiprocessing
|
||||||
|
spawn.set_executable(kitty_exe())
|
||||||
|
util.spawnv_passfds = spawnv_passfds
|
||||||
|
|
||||||
|
|
||||||
|
def unmonkey_patch_multiprocessing() -> None:
|
||||||
|
spawn.set_executable(orig_executable)
|
||||||
|
util.spawnv_passfds = orig_spawn_passfds
|
||||||
|
|
||||||
|
|
||||||
|
def get_process_pool_executor(
|
||||||
|
prefer_fork: bool = False,
|
||||||
|
max_workers: Optional[int] = None,
|
||||||
|
initializer: Optional[Callable] = None,
|
||||||
|
initargs: Tuple[Any, ...] = ()
|
||||||
|
) -> ProcessPoolExecutor:
|
||||||
|
if prefer_fork and 'fork' in get_all_start_methods():
|
||||||
|
ctx: Union[context.DefaultContext, context.ForkContext] = get_context('fork')
|
||||||
|
else:
|
||||||
|
monkey_patch_multiprocessing()
|
||||||
|
ctx = get_context()
|
||||||
|
try:
|
||||||
|
return ProcessPoolExecutor(max_workers=max_workers, initializer=initializer, initargs=initargs, mp_context=ctx)
|
||||||
|
except TypeError:
|
||||||
|
return ProcessPoolExecutor(max_workers=max_workers, initializer=initializer, initargs=initargs)
|
||||||
|
|
||||||
|
|
||||||
|
def test_spawn() -> None:
|
||||||
|
monkey_patch_multiprocessing()
|
||||||
|
try:
|
||||||
|
from multiprocessing import get_context
|
||||||
|
ctx = get_context('spawn')
|
||||||
|
q = ctx.Queue()
|
||||||
|
p = ctx.Process(target=q.put, args=('hello',))
|
||||||
|
p.start()
|
||||||
|
x = q.get(timeout=2)
|
||||||
|
assert x == 'hello'
|
||||||
|
p.join()
|
||||||
|
finally:
|
||||||
|
unmonkey_patch_multiprocessing()
|
||||||
@@ -42,3 +42,8 @@ class TestTUI(BaseTest):
|
|||||||
self.ae(le.cursor_pos, 0)
|
self.ae(le.cursor_pos, 0)
|
||||||
le.backspace()
|
le.backspace()
|
||||||
self.assertTrue(le.pending_bell)
|
self.assertTrue(le.pending_bell)
|
||||||
|
|
||||||
|
def test_multiprocessing_spawn(self):
|
||||||
|
return # temporarily disable this test till I can figure out why its failing in the build env
|
||||||
|
from kitty.multiprocessing import test_spawn
|
||||||
|
test_spawn()
|
||||||
|
|||||||
@@ -257,7 +257,7 @@ class GitHub(Base): # {{{
|
|||||||
% (asset['name'], release['tag_name']))
|
% (asset['name'], release['tag_name']))
|
||||||
|
|
||||||
def do_upload(self, url: str, path: str, desc: str, fname: str) -> requests.Response:
|
def do_upload(self, url: str, path: str, desc: str, fname: str) -> requests.Response:
|
||||||
mime_type = mimetypes.guess_type(fname)[0]
|
mime_type = mimetypes.guess_type(fname)[0] or 'application/octet-stream'
|
||||||
self.info('Uploading to GitHub: %s (%s)' % (fname, mime_type))
|
self.info('Uploading to GitHub: %s (%s)' % (fname, mime_type))
|
||||||
with ReadFileWithProgressReporting(path) as f:
|
with ReadFileWithProgressReporting(path) as f:
|
||||||
return self.requests.post(
|
return self.requests.post(
|
||||||
|
|||||||
3
setup.py
3
setup.py
@@ -1146,12 +1146,12 @@ def main() -> None:
|
|||||||
if args.action == 'clean':
|
if args.action == 'clean':
|
||||||
clean()
|
clean()
|
||||||
return
|
return
|
||||||
|
launcher_dir = 'kitty/launcher'
|
||||||
|
|
||||||
with CompilationDatabase(args.incremental) as cdb:
|
with CompilationDatabase(args.incremental) as cdb:
|
||||||
args.compilation_database = cdb
|
args.compilation_database = cdb
|
||||||
if args.action == 'build':
|
if args.action == 'build':
|
||||||
build(args)
|
build(args)
|
||||||
launcher_dir = 'kitty/launcher'
|
|
||||||
if is_macos:
|
if is_macos:
|
||||||
create_minimal_macos_bundle(args, launcher_dir)
|
create_minimal_macos_bundle(args, launcher_dir)
|
||||||
else:
|
else:
|
||||||
@@ -1164,6 +1164,7 @@ def main() -> None:
|
|||||||
package(args, bundle_type='linux-freeze')
|
package(args, bundle_type='linux-freeze')
|
||||||
elif args.action == 'macos-freeze':
|
elif args.action == 'macos-freeze':
|
||||||
build(args, native_optimizations=False)
|
build(args, native_optimizations=False)
|
||||||
|
build_launcher(args, launcher_dir=launcher_dir)
|
||||||
package(args, bundle_type='macos-freeze')
|
package(args, bundle_type='macos-freeze')
|
||||||
elif args.action == 'kitty.app':
|
elif args.action == 'kitty.app':
|
||||||
args.prefix = 'kitty.app'
|
args.prefix = 'kitty.app'
|
||||||
|
|||||||
Reference in New Issue
Block a user