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:
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Regenerate src/vocalinux/utils/model_checksums.txt from upstream metadata.
|
||||
|
||||
Vocalinux downloads 40MB-2GB speech models at install time and on first run,
|
||||
Voculinux downloads 40MB-2GB speech models at install time and on first run,
|
||||
then hands them to native code (whisper.cpp loads its ggml files through
|
||||
``ctypes.cdll``). Nothing about that is safe unless we know what we received,
|
||||
so every downloader checks the file against a hash pinned *in this repository*
|
||||
@@ -46,7 +46,7 @@ from typing import Iterable, NamedTuple
|
||||
|
||||
REPO_ROOT = Path(__file__).resolve().parents[1]
|
||||
SRC = REPO_ROOT / "src"
|
||||
MANIFEST = SRC / "vocalinux" / "utils" / "model_checksums.txt"
|
||||
MANIFEST = SRC / "voculinux" / "utils" / "model_checksums.txt"
|
||||
|
||||
HF_REPO = "ggerganov/whisper.cpp"
|
||||
HF_API = f"https://huggingface.co/api/models/{HF_REPO}?blobs=true"
|
||||
@@ -65,7 +65,7 @@ class Entry(NamedTuple):
|
||||
|
||||
|
||||
def _fetch_json(url: str):
|
||||
request = urllib.request.Request(url, headers={"User-Agent": "vocalinux-checksum-generator"})
|
||||
request = urllib.request.Request(url, headers={"User-Agent": "voculinux-checksum-generator"})
|
||||
with urllib.request.urlopen(request, timeout=TIMEOUT) as response: # noqa: S310
|
||||
return json.load(response)
|
||||
|
||||
@@ -93,7 +93,7 @@ def _download_and_hash(url: str, expected_md5: str) -> tuple[str, int]:
|
||||
for rather than pinning either one.
|
||||
"""
|
||||
sha256, md5, size = hashlib.sha256(), hashlib.md5(), 0
|
||||
request = urllib.request.Request(url, headers={"User-Agent": "vocalinux-checksum-generator"})
|
||||
request = urllib.request.Request(url, headers={"User-Agent": "voculinux-checksum-generator"})
|
||||
with urllib.request.urlopen(request, timeout=TIMEOUT) as response: # noqa: S310
|
||||
for chunk in iter(lambda: response.read(1024 * 1024), b""):
|
||||
sha256.update(chunk)
|
||||
@@ -306,7 +306,7 @@ def _vosk_entries(wanted: Iterable[str], refresh: bool) -> list[Entry]:
|
||||
def _render(entries: list[Entry], revision: str) -> str:
|
||||
width = max(len(entry.filename) for entry in entries)
|
||||
lines = [
|
||||
"# Checksums for every speech model Vocalinux downloads.",
|
||||
"# Checksums for every speech model Voculinux downloads.",
|
||||
"#",
|
||||
"# Generated by scripts/generate-model-checksums.py -- do not edit by hand.",
|
||||
"# Regenerate with `just model-checksums` after adding a model to",
|
||||
|
||||
Reference in New Issue
Block a user