Files
msime-windows/tests/test_prepare_env.py
fanlusky a7779d2b05 refactor(engine): 将 engine 从 submodule 内嵌为仓内一等组件
`vendor/MetasequoiaImeEngine` submodule 改为 `engine/` 目录,导入的是
product-lock.json 原本钉住的提交 c810d201,逐文件核对过 blob,因此这是一次
搬迁而不是引擎升级。引擎自己的嵌套 submodule(googlepinyinime-rev、utfcpp、
miniaudio)按各自 gitlink 一并展开,来源与提交见 engine/UPSTREAM.md。

Windows 专门化裁掉了不属于本产品的部分:whisper.cpp 与本地推理 provider、
macOS 示例宿主、整个 dictionary/ 建库流水线、上游 CI 与 release-please 配置。
词库仍按 product-lock.json 在构建时取发布产物。

引擎不再进 product-lock.json:没有 gitlink 就没有可比对的东西,锁里写一个上游
commit 等于宣称这棵树仍等于上游,而第一个 Windows 专门化改动落地时这句话就假了。
verify-contracts / verify-checkout 随之移除,verify-published 保留。

CI 与工具链:引擎源码并入根 scripts/format.sh(删掉引擎自己的那份,避免两套排除
列表分叉);引擎 voice.yml 里的 silero_vad.onnx 摘要校验移到本仓 lock job;
engine-bump-triage 工作流与其测试删除;gitsubmodule 的 dependabot 频率由 daily
改为 monthly。

README、README.en、AGENTS.md、CONTRIBUTING、docs/product-release.md 及各子目录
文档同步说明新的位置与边界。
2026-09-12 03:40:48 +08:00

59 lines
2.8 KiB
Python

"""Run local setup in a moved checkout without replacing the reviewed build project."""
import json
import os
from pathlib import Path
import shutil
import subprocess
import sys
import tempfile
import unittest
ROOT = Path(__file__).resolve().parents[1]
class PrepareEnvironmentTests(unittest.TestCase):
def exercise(self, component):
with tempfile.TemporaryDirectory(prefix='msime moved checkout ') as directory:
root = Path(directory)
target = root / component
shutil.copytree(ROOT / component / 'scripts', target / 'scripts')
for name in ('CMakeLists.txt', 'CMakePresets.json'):
shutil.copy2(ROOT / component / name, target / name)
(target / 'tests').mkdir()
cmake = target / 'CMakeLists.txt'
cmake.write_text(cmake.read_text() + '\n# locally reviewed build setting\n')
original = cmake.read_bytes()
presets_file = target / 'CMakePresets.json'
presets = json.loads(presets_file.read_text())
presets['configurePresets'].append({'name': 'local-extra', 'inherits': 'vcpkg-release',
'cacheVariables': {'LOCAL_SETTING': 'kept'}})
presets_file.write_text(json.dumps(presets, indent=2))
env = dict(os.environ, VCPKG_ROOT=str(root / 'custom vcpkg'), BOOST_ROOT=str(root / 'custom boost'))
for _ in range(2):
subprocess.run([sys.executable, str(target / 'scripts/prepare_env.py')],
cwd=directory, env=env, check=True, capture_output=True)
self.assertEqual(original, cmake.read_bytes())
actual = json.loads(presets_file.read_text())
by_name = {p['name']: p for p in actual['configurePresets']}
self.assertEqual(by_name['local-extra']['cacheVariables']['LOCAL_SETTING'], 'kept')
self.assertIn('vcpkg-release', by_name)
expected = (root / 'custom vcpkg/scripts/buildsystems/vcpkg.cmake').as_posix()
self.assertEqual(by_name['vcpkg-release']['cacheVariables']['CMAKE_TOOLCHAIN_FILE'], expected)
clangd = (target / '.clangd').read_text().replace('\\', '/')
self.assertIn('engine/utfcpp/source', clangd)
if component == 'server':
self.assertIn('engine/voice/include', clangd)
self.assertIn('engine/voice/third_party/miniaudio', clangd)
self.assertIn('/ui/include', clangd)
self.assertFalse((target / 'tests/CMakePresets.json').exists())
def test_tsf_environment_preserves_the_monorepo_build(self):
self.exercise('windows')
def test_server_environment_resolves_shared_components(self):
self.exercise('server')
if __name__ == '__main__':
unittest.main()