summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Bruhin <me@the-compiler.org>2021-03-31 09:50:25 +0200
committerFlorian Bruhin <me@the-compiler.org>2021-03-31 13:10:09 +0200
commit8b49d87526dd34380df6e98800ecc82367b48be1 (patch)
tree2184c84afd80600965962a441d757ca6a85ba63f
parent5a4b51a784b4332242191a61a24d72bca3ff60dc (diff)
downloadqutebrowser-8b49d87526dd34380df6e98800ecc82367b48be1.tar.gz
qutebrowser-8b49d87526dd34380df6e98800ecc82367b48be1.zip
flatpak: Try getting ID from /.flatpak_info
-rw-r--r--qutebrowser/utils/standarddir.py3
-rw-r--r--qutebrowser/utils/version.py27
-rw-r--r--tests/helpers/fixtures.py10
-rw-r--r--tests/unit/config/test_qtargs_locale_workaround.py2
-rw-r--r--tests/unit/misc/test_ipc.py8
-rw-r--r--tests/unit/utils/test_standarddir.py6
-rw-r--r--tests/unit/utils/test_version.py34
7 files changed, 55 insertions, 35 deletions
diff --git a/qutebrowser/utils/standarddir.py b/qutebrowser/utils/standarddir.py
index 3ddde67c7..f1bd01a5f 100644
--- a/qutebrowser/utils/standarddir.py
+++ b/qutebrowser/utils/standarddir.py
@@ -240,7 +240,8 @@ def _init_runtime(args: Optional[argparse.Namespace]) -> None:
# instances.
*parts, app_name = os.path.split(path)
assert app_name == APPNAME, app_name
- flatpak_id = os.environ.get('FLATPAK_ID', 'org.qutebrowser.qutebrowser')
+ flatpak_id = version.flatpak_id()
+ assert flatpak_id is not None
path = os.path.join(*parts, 'app', flatpak_id)
_create(path)
diff --git a/qutebrowser/utils/version.py b/qutebrowser/utils/version.py
index 22a2f1cce..e60dedcef 100644
--- a/qutebrowser/utils/version.py
+++ b/qutebrowser/utils/version.py
@@ -27,6 +27,8 @@ import platform
import subprocess
import importlib
import collections
+import pathlib
+import configparser
import enum
import datetime
import getpass
@@ -189,10 +191,27 @@ def is_flatpak() -> bool:
If packaged via Flatpak, the environment is has restricted access to the host
system.
"""
- current_distro = distribution()
- if current_distro is None:
- return False
- return current_distro.parsed == Distribution.kde_flatpak
+ return flatpak_id() is not None
+
+
+_FLATPAK_INFO_PATH = '/.flatpak-info'
+
+
+def flatpak_id() -> Optional[str]:
+ """Get the ID of the currently running Flatpak (or None if outside of Flatpak)."""
+ if 'FLATPAK_ID' in os.environ:
+ return os.environ['FLATPAK_ID']
+
+ # 'FLATPAK_ID' was only added in Flatpak 1.2.0:
+ # https://lists.freedesktop.org/archives/flatpak/2019-January/001464.html
+ # but e.g. Ubuntu 18.04 ships 1.0.9.
+ info_file = pathlib.Path(_FLATPAK_INFO_PATH)
+ if not info_file.exists():
+ return None
+
+ parser = configparser.ConfigParser()
+ parser.read(info_file)
+ return parser['Application']['name']
def _git_str() -> Optional[str]:
diff --git a/tests/helpers/fixtures.py b/tests/helpers/fixtures.py
index 43959f246..7106698be 100644
--- a/tests/helpers/fixtures.py
+++ b/tests/helpers/fixtures.py
@@ -752,16 +752,6 @@ def freezer(request, monkeypatch):
@pytest.fixture
def fake_flatpak(monkeypatch):
- info = version.DistributionInfo(
- id='org.kde.Platform',
- parsed=version.Distribution.kde_flatpak,
- version=utils.VersionNumber.parse('5.12'),
- pretty='Unknown')
-
- if not version.is_flatpak():
- monkeypatch.setattr(version, 'distribution', lambda: info)
-
app_id = 'org.qutebrowser.qutebrowser'
monkeypatch.setenv('FLATPAK_ID', app_id)
-
assert version.is_flatpak()
diff --git a/tests/unit/config/test_qtargs_locale_workaround.py b/tests/unit/config/test_qtargs_locale_workaround.py
index cbb657902..4a4152b80 100644
--- a/tests/unit/config/test_qtargs_locale_workaround.py
+++ b/tests/unit/config/test_qtargs_locale_workaround.py
@@ -448,7 +448,7 @@ def test_disabled(qtwe_version, config_stub):
@pytest.mark.fake_os('linux')
-def test_no_locales_available(qtwe_version, monkeypatch, caplog):
+def test_no_locales_available(qtwe_version, monkeypatch, caplog, request):
path = pathlib.Path('/doesnotexist/qtwebengine_locales')
assert not path.exists()
monkeypatch.setattr(qtargs, '_webengine_locales_path', lambda: path)
diff --git a/tests/unit/misc/test_ipc.py b/tests/unit/misc/test_ipc.py
index e93578853..51d7c6343 100644
--- a/tests/unit/misc/test_ipc.py
+++ b/tests/unit/misc/test_ipc.py
@@ -236,8 +236,14 @@ class TestSocketName:
(None, 'ipc-{}'.format(md5('testusername'))),
('/x', 'ipc-{}'.format(md5('testusername-/x'))),
])
+ @pytest.mark.parametrize('has_flatpak_id', [True, False])
@pytest.mark.skipif(not version.is_flatpak(), reason="Needs Flatpak")
- def test_flatpak(self, basedir, fake_runtime_dir, expected):
+ def test_flatpak(self, monkeypatch, fake_runtime_dir,
+ basedir, expected, has_flatpak_id):
+ if not has_flatpak_id:
+ # Simulate an older Flatpak version
+ monkeypatch.delenv('FLATPAK_ID', raising=False)
+
socketname = ipc._get_socketname(basedir)
expected_path = str(
fake_runtime_dir / 'app' / 'org.qutebrowser.qutebrowser' / expected)
diff --git a/tests/unit/utils/test_standarddir.py b/tests/unit/utils/test_standarddir.py
index fd7fd9c9e..e05b5d31f 100644
--- a/tests/unit/utils/test_standarddir.py
+++ b/tests/unit/utils/test_standarddir.py
@@ -209,15 +209,11 @@ class TestStandardDir:
@pytest.mark.linux
@pytest.mark.parametrize('args_basedir', [True, False])
- @pytest.mark.parametrize('has_flatpak_id', [True, False])
def test_flatpak_runtimedir(self, fake_flatpak, monkeypatch, tmp_path,
- args_basedir, has_flatpak_id):
+ args_basedir):
runtime_path = tmp_path / 'runtime'
runtime_path.mkdir()
runtime_path.chmod(0o0700)
-
- if not has_flatpak_id:
- monkeypatch.delenv('FLATPAK_ID') # added in fake_flatpak
monkeypatch.setenv('XDG_RUNTIME_DIR', str(runtime_path))
if args_basedir:
diff --git a/tests/unit/utils/test_version.py b/tests/unit/utils/test_version.py
index 399b8380d..14d7786a8 100644
--- a/tests/unit/utils/test_version.py
+++ b/tests/unit/utils/test_version.py
@@ -310,19 +310,27 @@ def test_distribution(tmp_path, monkeypatch, os_release, expected):
assert version.distribution() == expected
-@pytest.mark.parametrize('distribution, expected', [
- (None, False),
- (version.DistributionInfo(
- id='org.kde.Platform', parsed=version.Distribution.kde_flatpak,
- version=utils.VersionNumber(5, 12),
- pretty='Unknown'), True),
- (version.DistributionInfo(
- id='arch', parsed=version.Distribution.arch, version=None,
- pretty='Arch Linux'), False)
-])
-def test_is_flatpak(monkeypatch, distribution, expected):
- monkeypatch.setattr(version, "distribution", lambda: distribution)
- assert version.is_flatpak() == expected
+@pytest.mark.parametrize('has_env', [True, False])
+@pytest.mark.parametrize('has_file', [True, False])
+def test_is_flatpak(monkeypatch, tmp_path, has_env, has_file):
+ if has_env:
+ monkeypatch.setenv('FLATPAK_ID', 'org.qutebrowser.qutebrowser')
+ else:
+ monkeypatch.delenv('FLATPAK_ID', raising=False)
+
+ fake_info_path = tmp_path / '.flatpak_info'
+ if has_file:
+ lines = [
+ "[Application]",
+ "name=org.qutebrowser.qutebrowser",
+ "runtime=runtime/org.kde.Platform/x86_64/5.15",
+ ]
+ fake_info_path.write_text('\n'.join(lines))
+ else:
+ assert not fake_info_path.exists()
+ monkeypatch.setattr(version, '_FLATPAK_INFO_PATH', str(fake_info_path))
+
+ assert version.is_flatpak() == (has_env or has_file)
class GitStrSubprocessFake: