From be332fe7230afca7bff15fab660eee0759f261d6 Mon Sep 17 00:00:00 2001 From: Alexey Nabrodov Date: Thu, 1 Oct 2015 14:11:35 +0300 Subject: [PATCH 1/5] init env vars in crash report --- qutebrowser/config/configdata.py | 4 ++++ qutebrowser/misc/crashdialog.py | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/qutebrowser/config/configdata.py b/qutebrowser/config/configdata.py index ba63e02be..e0aa2cdff 100644 --- a/qutebrowser/config/configdata.py +++ b/qutebrowser/config/configdata.py @@ -409,6 +409,10 @@ def data(readonly=False): "Whether to shrink the completion to be smaller than the " "configured size if there are no scrollbars."), + ('match-type', + SettingValue(typ.MatchType(), 'contain'), + "Completion matching type"), + readonly=readonly )), diff --git a/qutebrowser/misc/crashdialog.py b/qutebrowser/misc/crashdialog.py index cfc125bb9..41a834b0e 100644 --- a/qutebrowser/misc/crashdialog.py +++ b/qutebrowser/misc/crashdialog.py @@ -20,6 +20,7 @@ """The dialog which gets shown when qutebrowser crashes.""" import re +import os import sys import html import getpass @@ -234,6 +235,11 @@ class _CrashDialog(QDialog): self._crash_info.append(("Config", conf.dump_userconfig())) except Exception: self._crash_info.append(("Config", traceback.format_exc())) + masks = ('DESKTOP_SESSION', 'DE', 'QT_.*', 'PYTHON.*', 'LC_.*', 'LANG') + for key, value in os.environ.items(): + for m in masks: + if re.match(m, key) is not None: + self._crash_info.append((key, value)) def _set_crash_info(self): """Set/update the crash info.""" From ce9aafdc1b4717b08f9f0ec623150f675b6aa122 Mon Sep 17 00:00:00 2001 From: Alexey Nabrodov Date: Thu, 1 Oct 2015 14:15:32 +0300 Subject: [PATCH 2/5] why???? --- qutebrowser/config/configdata.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/qutebrowser/config/configdata.py b/qutebrowser/config/configdata.py index e0aa2cdff..ba63e02be 100644 --- a/qutebrowser/config/configdata.py +++ b/qutebrowser/config/configdata.py @@ -409,10 +409,6 @@ def data(readonly=False): "Whether to shrink the completion to be smaller than the " "configured size if there are no scrollbars."), - ('match-type', - SettingValue(typ.MatchType(), 'contain'), - "Completion matching type"), - readonly=readonly )), From 54d4f4f48b1387698fec3957de2acde6931ad979 Mon Sep 17 00:00:00 2001 From: Alexey Nabrodov Date: Thu, 1 Oct 2015 15:57:11 +0300 Subject: [PATCH 3/5] refactor and test --- qutebrowser/misc/crashdialog.py | 27 ++++++++++++++++++++++----- tests/unit/misc/test_crashdialog.py | 24 ++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/qutebrowser/misc/crashdialog.py b/qutebrowser/misc/crashdialog.py index 41a834b0e..515435666 100644 --- a/qutebrowser/misc/crashdialog.py +++ b/qutebrowser/misc/crashdialog.py @@ -24,6 +24,7 @@ import os import sys import html import getpass +import fnmatch import traceback import pkg_resources @@ -92,6 +93,17 @@ def get_fatal_crash_dialog(debug, data): return QMessageBox(QMessageBox.Critical, title, text, QMessageBox.Ok) +def _get_environment_vars(): + """Gather enveronment variables for the crash info.""" + masks = ('DESKTOP_SESSION', 'DE', 'QT_*', 'PYTHON*', 'LC_*', 'LANG') + info = [] + for key, value in os.environ.items(): + for m in masks: + if fnmatch.fnmatch(key, m): + info.append('%s = %s' % (key, value)) + return '\n'.join(sorted(info)) + + class _CrashDialog(QDialog): """Dialog which gets shown after there was a crash. @@ -235,11 +247,11 @@ class _CrashDialog(QDialog): self._crash_info.append(("Config", conf.dump_userconfig())) except Exception: self._crash_info.append(("Config", traceback.format_exc())) - masks = ('DESKTOP_SESSION', 'DE', 'QT_.*', 'PYTHON.*', 'LC_.*', 'LANG') - for key, value in os.environ.items(): - for m in masks: - if re.match(m, key) is not None: - self._crash_info.append((key, value)) + try: + self._crash_info.append( + ("Environment", _get_environment_vars())) + except Exception: + self._crash_info.append(("Environment", traceback.format_exc())) def _set_crash_info(self): """Set/update the crash info.""" @@ -630,3 +642,8 @@ def dump_exception_info(exc, pages, cmdhist, objects): print('\n'.join(cmdhist), file=sys.stderr) print("\n---- Objects ----", file=sys.stderr) print(objects, file=sys.stderr) + print("\n---- Environment ----", file=sys.stderr) + try: + print(_get_environment_vars(), file=sys.stderr) + except Exception: + traceback.print_exc() diff --git a/tests/unit/misc/test_crashdialog.py b/tests/unit/misc/test_crashdialog.py index ae0078c99..3e845fc34 100644 --- a/tests/unit/misc/test_crashdialog.py +++ b/tests/unit/misc/test_crashdialog.py @@ -19,6 +19,8 @@ """Tests for qutebrowser.misc.crashdialog.""" +import os +import pytest from qutebrowser.misc import crashdialog @@ -77,3 +79,25 @@ class TestParseFatalStacktrace: text = INVALID_CRASH_TEXT.strip().replace('_', ' ') typ, func = crashdialog.parse_fatal_stacktrace(text) assert (typ, func) == ('', '') + + +@pytest.mark.parametrize('env, expected', [ + ({'FOO': 'bar'}, ""), + ({'FOO': 'bar', 'LC_ALL': 'baz'}, "LC_ALL = baz"), + ({'LC_ALL': 'baz', 'PYTHONFOO': 'fish'}, "LC_ALL = baz\nPYTHONFOO = fish"), + ( + {'DE': 'KDE', 'DESKTOP_SESSION': 'plasma'}, + "DE = KDE\nDESKTOP_SESSION = plasma" + ), + ( + {'QT5_IM_MODULE': 'fcitx', 'QT_IM_MODULE': 'fcitx'}, + "QT_IM_MODULE = fcitx" + ), + ({'LANGUAGE': 'foo', 'LANG': 'en_US.UTF-8'}, "LANG = en_US.UTF-8"), +]) +def test_get_environment_vars(monkeypatch, env, expected): + """Test for crashdialog._get_environment_vars.""" + os.environ = {} + for k, v in env.items(): + monkeypatch.setenv(k, v) + assert crashdialog._get_environment_vars() == expected From 044c0a0c4fc2155cfe8914fa60a89078657a89c1 Mon Sep 17 00:00:00 2001 From: Alexey Nabrodov Date: Thu, 1 Oct 2015 16:26:56 +0300 Subject: [PATCH 4/5] trying to fix tests --- tests/unit/misc/test_crashdialog.py | 54 ++++++++++++++++++----------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/tests/unit/misc/test_crashdialog.py b/tests/unit/misc/test_crashdialog.py index 3e845fc34..46641ee9c 100644 --- a/tests/unit/misc/test_crashdialog.py +++ b/tests/unit/misc/test_crashdialog.py @@ -81,23 +81,37 @@ class TestParseFatalStacktrace: assert (typ, func) == ('', '') -@pytest.mark.parametrize('env, expected', [ - ({'FOO': 'bar'}, ""), - ({'FOO': 'bar', 'LC_ALL': 'baz'}, "LC_ALL = baz"), - ({'LC_ALL': 'baz', 'PYTHONFOO': 'fish'}, "LC_ALL = baz\nPYTHONFOO = fish"), - ( - {'DE': 'KDE', 'DESKTOP_SESSION': 'plasma'}, - "DE = KDE\nDESKTOP_SESSION = plasma" - ), - ( - {'QT5_IM_MODULE': 'fcitx', 'QT_IM_MODULE': 'fcitx'}, - "QT_IM_MODULE = fcitx" - ), - ({'LANGUAGE': 'foo', 'LANG': 'en_US.UTF-8'}, "LANG = en_US.UTF-8"), -]) -def test_get_environment_vars(monkeypatch, env, expected): - """Test for crashdialog._get_environment_vars.""" - os.environ = {} - for k, v in env.items(): - monkeypatch.setenv(k, v) - assert crashdialog._get_environment_vars() == expected +class TestCrashDialog: + + """Tests for crashdialog.""" + + @classmethod + def setup_class(cls): + """Clear env.""" + cls.env = os.environ.copy() + os.environ = {} + + @classmethod + def teardown_class(cls): + """Restore env.""" + os.environ = cls.env.copy() + + @pytest.mark.parametrize('env, expected', [ + ({'FOO': 'bar'}, ""), + ({'FOO': 'bar', 'LC_ALL': 'baz'}, "LC_ALL = baz"), + ({'LC_ALL': 'baz', 'PYTHONFOO': 'fish'}, "LC_ALL = baz\nPYTHONFOO = fish"), + ( + {'DE': 'KDE', 'DESKTOP_SESSION': 'plasma'}, + "DE = KDE\nDESKTOP_SESSION = plasma" + ), + ( + {'QT5_IM_MODULE': 'fcitx', 'QT_IM_MODULE': 'fcitx'}, + "QT_IM_MODULE = fcitx" + ), + ({'LANGUAGE': 'foo', 'LANG': 'en_US.UTF-8'}, "LANG = en_US.UTF-8"), + ]) + def test_get_environment_vars(self, monkeypatch, env, expected): + """Test for crashdialog._get_environment_vars.""" + for k, v in env.items(): + monkeypatch.setenv(k, v) + assert crashdialog._get_environment_vars() == expected From 293c9f102275824a8b09782c48adb0c0e6400213 Mon Sep 17 00:00:00 2001 From: Alexey Nabrodov Date: Thu, 1 Oct 2015 16:34:34 +0300 Subject: [PATCH 5/5] trying to fix tests 2 --- tests/unit/misc/test_crashdialog.py | 55 +++++++++++------------------ 1 file changed, 21 insertions(+), 34 deletions(-) diff --git a/tests/unit/misc/test_crashdialog.py b/tests/unit/misc/test_crashdialog.py index 46641ee9c..f79f2f1b5 100644 --- a/tests/unit/misc/test_crashdialog.py +++ b/tests/unit/misc/test_crashdialog.py @@ -81,37 +81,24 @@ class TestParseFatalStacktrace: assert (typ, func) == ('', '') -class TestCrashDialog: - - """Tests for crashdialog.""" - - @classmethod - def setup_class(cls): - """Clear env.""" - cls.env = os.environ.copy() - os.environ = {} - - @classmethod - def teardown_class(cls): - """Restore env.""" - os.environ = cls.env.copy() - - @pytest.mark.parametrize('env, expected', [ - ({'FOO': 'bar'}, ""), - ({'FOO': 'bar', 'LC_ALL': 'baz'}, "LC_ALL = baz"), - ({'LC_ALL': 'baz', 'PYTHONFOO': 'fish'}, "LC_ALL = baz\nPYTHONFOO = fish"), - ( - {'DE': 'KDE', 'DESKTOP_SESSION': 'plasma'}, - "DE = KDE\nDESKTOP_SESSION = plasma" - ), - ( - {'QT5_IM_MODULE': 'fcitx', 'QT_IM_MODULE': 'fcitx'}, - "QT_IM_MODULE = fcitx" - ), - ({'LANGUAGE': 'foo', 'LANG': 'en_US.UTF-8'}, "LANG = en_US.UTF-8"), - ]) - def test_get_environment_vars(self, monkeypatch, env, expected): - """Test for crashdialog._get_environment_vars.""" - for k, v in env.items(): - monkeypatch.setenv(k, v) - assert crashdialog._get_environment_vars() == expected +@pytest.mark.parametrize('env, expected', [ + ({'FOO': 'bar'}, ""), + ({'FOO': 'bar', 'LC_ALL': 'baz'}, "LC_ALL = baz"), + ({'LC_ALL': 'baz', 'PYTHONFOO': 'fish'}, "LC_ALL = baz\nPYTHONFOO = fish"), + ( + {'DE': 'KDE', 'DESKTOP_SESSION': 'plasma'}, + "DE = KDE\nDESKTOP_SESSION = plasma" + ), + ( + {'QT5_IM_MODULE': 'fcitx', 'QT_IM_MODULE': 'fcitx'}, + "QT_IM_MODULE = fcitx" + ), + ({'LANGUAGE': 'foo', 'LANG': 'en_US.UTF-8'}, "LANG = en_US.UTF-8"), +]) +def test_get_environment_vars(monkeypatch, env, expected): + """Test for crashdialog._get_environment_vars.""" + for key in os.environ.copy(): + monkeypatch.delenv(key) + for k, v in env.items(): + monkeypatch.setenv(k, v) + assert crashdialog._get_environment_vars() == expected