diff --git a/src/specify_cli/integrations/copilot/__init__.py b/src/specify_cli/integrations/copilot/__init__.py index ef4470b5f3..9b3f67d701 100644 --- a/src/specify_cli/integrations/copilot/__init__.py +++ b/src/specify_cli/integrations/copilot/__init__.py @@ -497,7 +497,7 @@ def _merge_vscode_settings(src: Path, dst: Path) -> None: """ try: existing = json.loads(dst.read_text(encoding="utf-8")) - except (json.JSONDecodeError, OSError): + except (json.JSONDecodeError, UnicodeDecodeError, OSError): # Cannot parse existing file (likely JSONC with comments). # Skip merge to preserve the user's settings, but show # what they should add manually. diff --git a/tests/integrations/test_integration_copilot.py b/tests/integrations/test_integration_copilot.py index ccd187f2f2..6474250976 100644 --- a/tests/integrations/test_integration_copilot.py +++ b/tests/integrations/test_integration_copilot.py @@ -109,6 +109,21 @@ def test_setup_merges_existing_vscode_settings(self, tmp_path): assert settings not in created assert not any("settings.json" in k for k in m.files) + def test_setup_preserves_non_utf8_vscode_settings(self, tmp_path, caplog): + from specify_cli.integrations.copilot import CopilotIntegration + copilot = CopilotIntegration() + vscode_dir = tmp_path / ".vscode" + vscode_dir.mkdir(parents=True) + settings = vscode_dir / "settings.json" + original = b'{"editor.fontSize": 14}\xff' + settings.write_bytes(original) + m = IntegrationManifest("copilot", tmp_path) + + copilot.setup(tmp_path, m) + + assert settings.read_bytes() == original + assert "Could not parse" in caplog.text + def test_all_created_files_tracked_in_manifest(self, tmp_path): from specify_cli.integrations.copilot import CopilotIntegration copilot = CopilotIntegration()