From eda93c87fd48e0c520c8add1f6bda56c23ba546e Mon Sep 17 00:00:00 2001 From: ZyX Date: Thu, 4 Sep 2014 08:19:17 +0400 Subject: [PATCH 1/4] Add default_log_stream Powerline attribute, make it sys.stdout in Vim Reason for changes in VimPowerline: try python import sys; sys.stderr.write('abc') catch echomsg v:exception endtry reports an exception. This should not happen because stack trace that ought to be printed by the logger will not be shown to the user, making it hard to determine the error and turning some recoverable errors to non-recoverable when using powerline.vim. --- powerline/__init__.py | 24 ++++++++++++++++-------- powerline/vim.py | 2 ++ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/powerline/__init__.py b/powerline/__init__.py index 78aa9bb0..1d01d5d5 100644 --- a/powerline/__init__.py +++ b/powerline/__init__.py @@ -103,7 +103,7 @@ class PowerlineLogger(object): _fallback_logger = None -def get_fallback_logger(): +def get_fallback_logger(stream=None): global _fallback_logger if _fallback_logger: return _fallback_logger @@ -112,7 +112,7 @@ def get_fallback_logger(): formatter = logging.Formatter(log_format) level = logging.WARNING - handler = logging.StreamHandler() + handler = logging.StreamHandler(stream) handler.setLevel(level) handler.setFormatter(formatter) @@ -195,7 +195,7 @@ def load_config(cfg_path, find_config_files, config_loader, loader_callback=None return ret -def _get_log_handler(common_config): +def _get_log_handler(common_config, stream=None): '''Get log handler. :param dict common_config: @@ -211,17 +211,17 @@ def _get_log_handler(common_config): os.mkdir(log_dir) return logging.FileHandler(log_file) else: - return logging.StreamHandler() + return logging.StreamHandler(stream) -def create_logger(common_config): +def create_logger(common_config, stream=None): '''Create logger according to provided configuration ''' log_format = common_config['log_format'] formatter = logging.Formatter(log_format) level = getattr(logging, common_config['log_level']) - handler = _get_log_handler(common_config) + handler = _get_log_handler(common_config, stream) handler.setLevel(level) handler.setFormatter(formatter) @@ -456,7 +456,7 @@ class Powerline(object): self.import_paths = self.common_config['paths'] if not self.logger: - self.logger = create_logger(self.common_config) + self.logger = create_logger(self.common_config, self.default_log_stream) if not self.pl: self.pl = PowerlineLogger(self.use_daemon_threads, self.logger, self.ext) @@ -562,6 +562,14 @@ class Powerline(object): else: self.renderer = renderer + default_log_stream = sys.stdout + '''Default stream for default log handler + + Usually it is ``sys.stderr``, but there is sometimes a reason to prefer + ``sys.stdout`` or a custom file-like object. It is not supposed to be used + to write to some file. + ''' + def setup_components(self, components): '''Run component-specific setup @@ -847,7 +855,7 @@ class Powerline(object): if 'prefix' not in kwargs: kwargs['prefix'] = 'powerline' exception = kwargs.pop('exception', None) - pl = getattr(self, 'pl', None) or get_fallback_logger() + pl = getattr(self, 'pl', None) or get_fallback_logger(self.default_log_stream) if exception: try: reraise(exception) diff --git a/powerline/vim.py b/powerline/vim.py index a443b74c..ec754107 100644 --- a/powerline/vim.py +++ b/powerline/vim.py @@ -31,6 +31,8 @@ class VimPowerline(Powerline): self.pyeval = pyeval self.window_statusline = '%!' + pyeval + '(\'powerline.statusline({0})\')' + default_log_stream = sys.stdout + def add_local_theme(self, key, config): '''Add local themes at runtime (during vim session). From a919b453ee600a445717638e87f3c1180c4b1f23 Mon Sep 17 00:00:00 2001 From: ZyX Date: Thu, 4 Sep 2014 08:27:36 +0400 Subject: [PATCH 2/4] Fix some errors in troubleshooting code --- powerline/bindings/vim/plugin/powerline.vim | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/powerline/bindings/vim/plugin/powerline.vim b/powerline/bindings/vim/plugin/powerline.vim index 8f839236..0685727c 100644 --- a/powerline/bindings/vim/plugin/powerline.vim +++ b/powerline/bindings/vim/plugin/powerline.vim @@ -99,6 +99,7 @@ finally echohl None call s:rcmd("def powerline_troubleshoot():") call s:rcmd(" import sys") + call s:rcmd(" import vim") call s:rcmd(" if sys.version_info < (2, 6):") call s:rcmd(" print('Too old python version: ' + sys.version + ' (first supported is 2.6)')") call s:rcmd(" elif sys.version_info[0] == 3 and sys.version_info[1] < 2:") @@ -123,10 +124,11 @@ finally call s:rcmd(" print('neither it is installed system-wide')") call s:rcmd(" real_powerline_dir = os.path.realpath(powerline_dir)") call s:rcmd(" real_this_dir = os.path.realpath(this_dir)") - call s:rcmd(" if powerline_appended_path is not None and real_this_dir != powerline_appended_path:") + call s:rcmd(" this_dir_par = os.path.dirname(real_this_dir)") + call s:rcmd(" if powerline_appended_path is not None and this_dir_par != powerline_appended_path:") call s:rcmd(" print('Check your installation: this script is symlinked somewhere')") call s:rcmd(" print('where powerline is not present: {0!r} != {1!r}.'.format(") - call s:rcmd(" real_this_dir, sys.path[-1]))") + call s:rcmd(" real_this_dir, powerline_appended_path))") call s:rcmd(" elif real_powerline_dir != real_this_dir:") call s:rcmd(" print('It appears that you have two powerline versions installed:')") call s:rcmd(" print('one in ' + real_powerline_dir + ', other in ' + real_this_dir + '.')") From 0bb14dbe9c7962bf4f834b4b4032edc252eec855 Mon Sep 17 00:00:00 2001 From: ZyX Date: Thu, 4 Sep 2014 08:28:47 +0400 Subject: [PATCH 3/4] Make it immune to the absense of powerline_appended_path --- powerline/bindings/vim/plugin/powerline.vim | 1 + 1 file changed, 1 insertion(+) diff --git a/powerline/bindings/vim/plugin/powerline.vim b/powerline/bindings/vim/plugin/powerline.vim index 0685727c..5ec007c0 100644 --- a/powerline/bindings/vim/plugin/powerline.vim +++ b/powerline/bindings/vim/plugin/powerline.vim @@ -125,6 +125,7 @@ finally call s:rcmd(" real_powerline_dir = os.path.realpath(powerline_dir)") call s:rcmd(" real_this_dir = os.path.realpath(this_dir)") call s:rcmd(" this_dir_par = os.path.dirname(real_this_dir)") + call s:rcmd(" powerline_appended_path = globals().get('powerline_appended_path')") call s:rcmd(" if powerline_appended_path is not None and this_dir_par != powerline_appended_path:") call s:rcmd(" print('Check your installation: this script is symlinked somewhere')") call s:rcmd(" print('where powerline is not present: {0!r} != {1!r}.'.format(") From 8588885b045400ff892171d1b1a39f2d77b7a08f Mon Sep 17 00:00:00 2001 From: ZyX Date: Thu, 4 Sep 2014 08:32:36 +0400 Subject: [PATCH 4/4] In vim tests check for printed messages --- tests/test_local_overrides.vim | 9 +++++++++ tests/test_tabline.vim | 8 ++++++++ 2 files changed, 17 insertions(+) diff --git a/tests/test_local_overrides.vim b/tests/test_local_overrides.vim index 050e393e..ec902856 100755 --- a/tests/test_local_overrides.vim +++ b/tests/test_local_overrides.vim @@ -3,6 +3,9 @@ set encoding=utf-8 let g:powerline_config_path = expand(':p:h:h') . '/powerline/config_files' let g:powerline_config_overrides = {'common': {'default_top_theme': 'ascii'}} let g:powerline_theme_overrides__default = {'segment_data': {'line_current_symbol': {'contents': 'LN '}, 'branch': {'before': 'B '}}} + +redir => g:messages + try python import powerline.vim let pycmd = 'python' @@ -36,4 +39,10 @@ if result isnot# '%#Pl_22_24320_148_11523840_bold# NORMAL %#Pl_148_11523840_236_ cquit endif +redir END +if g:messages =~ '\S' + call writefile(['Non-empty messages:', g:messages], 'message.fail') + cquit +endif + qall! diff --git a/tests/test_tabline.vim b/tests/test_tabline.vim index 00c807a7..9d829ea6 100755 --- a/tests/test_tabline.vim +++ b/tests/test_tabline.vim @@ -6,6 +6,8 @@ edit abc tabedit def tabedit ghi +redir => g:messages + try let &columns = 80 let result = eval(&tabline[2:]) @@ -45,4 +47,10 @@ if result isnot# '%#Pl_240_5789784_235_2500134_NONE# 1 %#Pl_240_5789784_235_25 cquit endif +redir END +if g:messages =~ '\S' + call writefile(['Non-empty messages:', g:messages], 'message.fail') + cquit +endif + qall!