feat(identity): rename user-visible identity to voculinux with one-time legacy import

The fork takes its own name everywhere a user can see it: binaries
(voculinux, voculinux-gui), desktop entry, autostart, tray, D-Bus
namespace (com.voculinux.Voculinux, no alias for the old name),
config/data/cache dirs, single-instance lock, IBus engine identity,
tray icons, resource prefixes, VOCULINUX_* environment names, and the
update-checker user agent. The internal Python module stays vocalinux
and the distribution metadata keeps the upstream URLs as provenance.

On first run a previous Vocalinux install's config.json, custom
dictionary, and portal restore token are copied once into the new
locations (new config always wins, no merge, no write-back); models
re-resolve through the pinned-checksum download path. An offline
naming-sweep test proves no old-name strings remain on user-visible
surfaces outside the allowlist.

Refs #18
This commit is contained in:
soubarnak
2026-11-06 01:29:39 +05:30
parent c565e6d946
commit ea7be5f111
251 changed files with 2449 additions and 1991 deletions
+14 -14
View File
@@ -1,6 +1,6 @@
"""The AppImage reuses its pywhispercpp Vulkan build only when the pins match.
The compile does not depend on the Vocalinux commit. The cache id is the base
The compile does not depend on the Voculinux commit. The cache id is the base
image, tool_checksums.txt, the pinned cmake and ninja, the Vulkan flags, and
the pywhispercpp pin. It is not the git SHA and not the Actions run id. A tree
without libggml-vulkan.so is a CPU wheel and is not cached.
@@ -39,8 +39,8 @@ def _run(args: list[str], env: dict[str, str] | None = None) -> subprocess.Compl
def _cache_id(pins: Path, install: Path, extra: dict[str, str] | None = None) -> str:
env = os.environ.copy()
env["VOCALINUX_PINS"] = str(pins)
env["VOCALINUX_INSTALL_SH"] = str(install)
env["VOCULINUX_PINS"] = str(pins)
env["VOCULINUX_INSTALL_SH"] = str(install)
if extra:
env.update(extra)
result = _run(["bash", str(ID_SCRIPT)], env=env)
@@ -103,7 +103,7 @@ def test_native_cache_id_tracks_build_tools_and_compile_flags(tmp_path: Path) ->
tools = tmp_path / "appimage-tools.txt"
tools_text = TOOLS.read_text(encoding="utf-8")
tools.write_text(tools_text.replace("cmake", "cmake-other", 1), encoding="utf-8")
changed_tools = _cache_id(PINS, INSTALL_SH, extra={"VOCALINUX_APPIMAGE_TOOLS": str(tools)})
changed_tools = _cache_id(PINS, INSTALL_SH, extra={"VOCULINUX_APPIMAGE_TOOLS": str(tools)})
assert changed_tools != baseline
commented = tmp_path / "build-comment.sh"
@@ -111,7 +111,7 @@ def test_native_cache_id_tracks_build_tools_and_compile_flags(tmp_path: Path) ->
commented.write_text(
build_text.replace("# GPU:", "# GPU: unchanged flags\n# GPU:", 1), encoding="utf-8"
)
assert _cache_id(PINS, INSTALL_SH, extra={"VOCALINUX_BUILD_SH": str(commented)}) == baseline
assert _cache_id(PINS, INSTALL_SH, extra={"VOCULINUX_BUILD_SH": str(commented)}) == baseline
flagged = tmp_path / "build-flags.sh"
flagged.write_text(
@@ -122,7 +122,7 @@ def test_native_cache_id_tracks_build_tools_and_compile_flags(tmp_path: Path) ->
),
encoding="utf-8",
)
assert _cache_id(PINS, INSTALL_SH, extra={"VOCALINUX_BUILD_SH": str(flagged)}) != baseline
assert _cache_id(PINS, INSTALL_SH, extra={"VOCULINUX_BUILD_SH": str(flagged)}) != baseline
def test_native_cache_id_does_not_read_the_commit_or_the_run() -> None:
@@ -307,11 +307,11 @@ def test_a_failed_restore_runs_the_compile_command(tmp_path: Path) -> None:
def test_native_cache_dir_binds_the_arch_to_that_id(tmp_path: Path) -> None:
env = os.environ.copy()
env["VOCALINUX_APPIMAGE_CACHE"] = str(tmp_path / "cache")
env.pop("VOCALINUX_PINS", None)
env.pop("VOCALINUX_INSTALL_SH", None)
env.pop("VOCALINUX_APPIMAGE_TOOLS", None)
env.pop("VOCALINUX_BUILD_SH", None)
env["VOCULINUX_APPIMAGE_CACHE"] = str(tmp_path / "cache")
env.pop("VOCULINUX_PINS", None)
env.pop("VOCULINUX_INSTALL_SH", None)
env.pop("VOCULINUX_APPIMAGE_TOOLS", None)
env.pop("VOCULINUX_BUILD_SH", None)
result = _source("pywhispercpp_native_cache_dir x86_64", env=env)
assert result.returncode == 0, result.stderr
expected = _cache_id(PINS, INSTALL_SH)
@@ -331,7 +331,7 @@ def test_build_reuses_the_cached_vulkan_tree_before_compiling() -> None:
match = re.search(r"\nrebuild_pywhispercpp_vulkan\(\) \{(.+?)\n\}\n", text, re.S)
assert match, "rebuild_pywhispercpp_vulkan disappeared"
body = match.group(1)
assert body.index("VOCALINUX_APPIMAGE_SKIP_VULKAN") < body.index("pywhispercpp_restore_or_run")
assert body.index("VOCULINUX_APPIMAGE_SKIP_VULKAN") < body.index("pywhispercpp_restore_or_run")
assert "GGML_VULKAN=1" not in body
assert "_compile_pywhispercpp_vulkan" in body
compile_fn = re.search(r"\n_compile_pywhispercpp_vulkan\(\) \{(.+?)\n\}\n", text, re.S)
@@ -349,7 +349,7 @@ def test_appimage_workflows_share_one_native_cache_key() -> None:
keys = []
for name in APPIMAGE_WORKFLOWS:
text = (WORKFLOWS / name).read_text(encoding="utf-8")
found = re.findall(r"path: ~/.cache/vocalinux-appimage\n\s+key: (.+)\n", text)
found = re.findall(r"path: ~/.cache/voculinux-appimage\n\s+key: (.+)\n", text)
assert found, name
assert all(key == NATIVE_KEY for key in found), found
for token in ("github.sha", "github.run_id", "github.run_number", "github.run_attempt"):
@@ -366,7 +366,7 @@ def test_appimage_workflows_share_one_native_cache_key() -> None:
for token in ("github.sha", "github.run_id", "github.run_number", "github.run_attempt"):
assert token not in step, step
assert "packaging/appimage/docker-build.sh" in text
assert 'VOCALINUX_APPIMAGE_REQUIRE_VULKAN: "1"' in text
assert 'VOCULINUX_APPIMAGE_REQUIRE_VULKAN: "1"' in text
assert "aarch64" in text
keys.extend(found)
assert len(keys) == 5