diff --git a/mergin/merginproject.py b/mergin/merginproject.py index 0cba78a..1f232fd 100644 --- a/mergin/merginproject.py +++ b/mergin/merginproject.py @@ -2,6 +2,7 @@ import logging import math import os +import platform import re import shutil from typing import List, Optional, Dict @@ -87,8 +88,10 @@ def _logger_callback(level, text_bytes): else: self.log.info("GEODIFF: " + text) - self.geodiff.set_logger_callback(_logger_callback) - self.geodiff.set_maximum_logger_level(pygeodiff.GeoDiff.LevelDebug) + # creating a ctypes callback hangs forever in the hardened QGIS build on Intel macOS + if not (platform.system() == "Darwin" and platform.machine() == "x86_64"): + self.geodiff.set_logger_callback(_logger_callback) + self.geodiff.set_maximum_logger_level(pygeodiff.GeoDiff.LevelDebug) def setup_logging(self, logger_name): """Setup logging into project directory's .mergin/client-log.txt file.""" diff --git a/mergin/test/test_mergin_project.py b/mergin/test/test_mergin_project.py index 5fa2106..ee8ac34 100644 --- a/mergin/test/test_mergin_project.py +++ b/mergin/test/test_mergin_project.py @@ -2,7 +2,9 @@ import shutil import json import tempfile +from types import SimpleNamespace import pytest +from mergin import merginproject from mergin.merginproject import MerginProject from pygeodiff import GeoDiffLibError from mergin.common import DeltaChangeType, PullActionType, ClientError @@ -497,3 +499,19 @@ def test_update_project_role(): # the new role is on disk, not just in the in-memory cache assert MerginProject(project_dir).project_role() == "reader" + + +@pytest.mark.parametrize( + "system, machine, callback_set", + [("Darwin", "x86_64", False), ("Darwin", "arm64", True), ("Linux", "x86_64", True)], +) +def test_geodiff_logger_callback_platforms(monkeypatch, system, machine, callback_set): + """The geodiff logger callback is skipped on Intel macOS, where creating it hangs QGIS.""" + callbacks = [] + monkeypatch.setattr(merginproject.pygeodiff.GeoDiff, "set_logger_callback", lambda self, cb: callbacks.append(cb)) + monkeypatch.setattr(merginproject, "platform", SimpleNamespace(system=lambda: system, machine=lambda: machine)) + + with tempfile.TemporaryDirectory() as tmp_dir: + MerginProject(tmp_dir) + + assert bool(callbacks) == callback_set