Ely Office: six offline-first desktop apps in Rust and GPUI
ElyDoc, ElyTable, ElyShow (LibreOfficeKit), ElyPDF (MuPDF), ElyTree (Git), ElyMark (Milkdown and CodeMirror in CEF). ElyMail and ElyAgent follow.
This commit is contained in:
817 files changed
+143101
No files matched your search
Executable
+48
@@ -0,0 +1,48 @@
|
||||
#!/usr/bin/env bash
|
||||
# Usage: apply-lo-patches.sh <lo-src> — applies the missing patches.
|
||||
set -euo pipefail
|
||||
|
||||
root=$(cd "$(dirname "$0")/.." && pwd)
|
||||
src=${1:?usage: apply-lo-patches.sh <lo-src>}
|
||||
patches=("$root"/patches/libreoffice/*.patch)
|
||||
files=$(sed -n 's|^+++ b/||p' "${patches[@]}" | sort -u)
|
||||
work=$(mktemp -d)
|
||||
trap 'rm -rf "$work"' EXIT
|
||||
|
||||
# Whether $src is HEAD plus the first $1 patches.
|
||||
holds() {
|
||||
local n=$1 base=$work/base f i
|
||||
rm -rf "$base"
|
||||
mkdir -p "$base"
|
||||
git -C "$base" init -q
|
||||
for f in $files; do
|
||||
if git -C "$src" cat-file -e "HEAD:$f" 2>/dev/null; then
|
||||
mkdir -p "$base/$(dirname "$f")"
|
||||
git -C "$src" show "HEAD:$f" >"$base/$f"
|
||||
fi
|
||||
done
|
||||
for ((i = 0; i < n; i++)); do
|
||||
git -C "$base" apply "${patches[$i]}" 2>/dev/null || return 1
|
||||
done
|
||||
for f in $files; do
|
||||
if [ -e "$base/$f" ]; then
|
||||
cmp -s "$base/$f" "$src/$f" || return 1
|
||||
elif [ -e "$src/$f" ]; then
|
||||
return 1
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
n=${#patches[@]}
|
||||
while [ "$n" -ge 0 ] && ! holds "$n"; do
|
||||
n=$((n - 1))
|
||||
done
|
||||
if [ "$n" -lt 0 ]; then
|
||||
echo "apply-lo-patches.sh: $src matches no prefix of the patch series" >&2
|
||||
exit 1
|
||||
fi
|
||||
echo "apply-lo-patches.sh: $n of ${#patches[@]} patches already in $src"
|
||||
for ((i = n; i < ${#patches[@]}; i++)); do
|
||||
git -C "$src" apply "${patches[$i]}"
|
||||
echo "apply-lo-patches.sh: applied ${patches[$i]##*/}"
|
||||
done
|
||||
Executable
+23
@@ -0,0 +1,23 @@
|
||||
#!/usr/bin/env bash
|
||||
# Builds the pinned Git, relocatable, into engines/git.
|
||||
set -euo pipefail
|
||||
|
||||
root=$(cd "$(dirname "$0")/.." && pwd)
|
||||
src=$root/engines/git-src
|
||||
out=$root/engines/git
|
||||
jobs=$(sysctl -n hw.ncpu 2>/dev/null || nproc)
|
||||
|
||||
# reference/ stays read-only; the build runs in a copy.
|
||||
mkdir -p "$src"
|
||||
rsync -a --delete --exclude .git "$root/reference/git/" "$src/"
|
||||
# Relocatable; built-ins are symlinks, so bundles copy one binary.
|
||||
flags="prefix=$out RUNTIME_PREFIX=YesPlease INSTALL_SYMLINKS=YesPlease NO_GETTEXT=YesPlease NO_TCLTK=YesPlease NO_PERL=YesPlease NO_PYTHON=YesPlease"
|
||||
# The bundles say macOS 14; Git must not need newer.
|
||||
[ "$(uname)" = Darwin ] && export MACOSX_DEPLOYMENT_TARGET=14.0 && flags="$flags MACOSX_DEPLOYMENT_TARGET=14.0"
|
||||
if [ "$(cat "$out/.flags" 2>/dev/null)" != "$flags" ]; then
|
||||
rm -rf "$out"
|
||||
fi
|
||||
# shellcheck disable=SC2086
|
||||
make -C "$src" $flags -j"$jobs" install
|
||||
echo "$flags" >"$out/.flags"
|
||||
"$out/bin/git" --version
|
||||
Executable
+42
@@ -0,0 +1,42 @@
|
||||
#!/usr/bin/env bash
|
||||
# Builds the pinned libetpan into engines/libetpan.
|
||||
set -euo pipefail
|
||||
|
||||
root=$(cd "$(dirname "$0")/.." && pwd)
|
||||
src=$root/reference/libetpan
|
||||
prefix=$root/engines/libetpan
|
||||
work=$root/engines/libetpan-src
|
||||
pin=$(git -C "$src" rev-parse HEAD)
|
||||
|
||||
if [ "$(cat "$prefix/PIN" 2>/dev/null)" = "$pin" ] && [ -f "$prefix/lib/libetpan.a" ] &&
|
||||
grep -q "^#define HAVE_OPENSSL 1" "$prefix/BUILD-config.h" 2>/dev/null &&
|
||||
grep -q "^#define HAVE_JSON 1" "$prefix/BUILD-config.h" 2>/dev/null; then
|
||||
echo "ok libetpan $pin"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
ssl=${OPENSSL_DIR:-$(brew --prefix openssl@3)} || {
|
||||
echo "build-libetpan.sh: set OPENSSL_DIR to an OpenSSL 3 prefix" >&2
|
||||
exit 1
|
||||
}
|
||||
[ -f "$ssl/include/openssl/ssl.h" ] || {
|
||||
echo "build-libetpan.sh: no OpenSSL headers under $ssl" >&2
|
||||
exit 1
|
||||
}
|
||||
jobs=$(sysctl -n hw.ncpu 2>/dev/null || nproc)
|
||||
rm -rf "$work" "$prefix"
|
||||
rsync -a --exclude .git "$src/" "$work/"
|
||||
cd "$work"
|
||||
./autogen.sh --prefix="$prefix" --enable-static --disable-shared \
|
||||
--with-openssl="$ssl" --with-json --disable-db
|
||||
for feature in HAVE_OPENSSL HAVE_JSON; do
|
||||
grep -q "^#define $feature 1" config.h || {
|
||||
echo "build-libetpan.sh: configure left out $feature" >&2
|
||||
exit 1
|
||||
}
|
||||
done
|
||||
make -j"$jobs"
|
||||
make install
|
||||
cp config.h "$prefix/BUILD-config.h"
|
||||
echo "$pin" >"$prefix/PIN"
|
||||
echo "built libetpan $pin"
|
||||
Executable
+85
@@ -0,0 +1,85 @@
|
||||
#!/usr/bin/env bash
|
||||
# Builds the pinned LibreOffice with the macOS LOK patches.
|
||||
set -euo pipefail
|
||||
|
||||
root=$(cd "$(dirname "$0")/.." && pwd)
|
||||
src=$root/engines/lo-src
|
||||
pin=$(awk '$1 == "fetch" && $2 == "libreoffice-core" { print $4 }' "$root/scripts/fetch-references.sh")
|
||||
options=(
|
||||
--enable-bogus-pkg-config
|
||||
--enable-mergelibs
|
||||
--enable-release-build
|
||||
--without-java
|
||||
--without-junit
|
||||
--without-help
|
||||
--disable-odk
|
||||
--disable-online-update
|
||||
--disable-extension-integration
|
||||
--disable-scripting-beanshell
|
||||
--disable-scripting-javascript
|
||||
--disable-firebird-sdbc
|
||||
--disable-postgresql-sdbc
|
||||
--disable-ext-nlpsolver
|
||||
--disable-ext-wiki-publisher
|
||||
--disable-report-builder
|
||||
--disable-sdremote
|
||||
--disable-sdremote-bluetooth
|
||||
--disable-poppler
|
||||
--disable-lotuswordpro
|
||||
--disable-gpgmepp
|
||||
--disable-cups
|
||||
--disable-evolution2
|
||||
--with-galleries=no
|
||||
--with-lang=
|
||||
--with-theme=colibre
|
||||
--with-fonts
|
||||
--disable-python
|
||||
--disable-coinmp
|
||||
--disable-lpsolve
|
||||
--without-doxygen
|
||||
--with-myspell-dicts
|
||||
)
|
||||
|
||||
[ "$(uname)" = Darwin ] || {
|
||||
echo "build-libreoffice.sh: macOS only; Linux and Windows use the TDF builds" >&2
|
||||
exit 1
|
||||
}
|
||||
if [ ! -d "$src/.git" ]; then
|
||||
git init -q "$src"
|
||||
git -C "$src" remote add origin https://github.com/LibreOffice/core.git
|
||||
git -C "$src" fetch -q --depth 1 origin "$pin"
|
||||
git -C "$src" checkout -q FETCH_HEAD
|
||||
fi
|
||||
# The bundled spelling dictionaries (DOC-12).
|
||||
git -C "$src" config submodule.dictionaries.url https://github.com/LibreOffice/dictionaries.git
|
||||
git -C "$src" submodule update -q --init --depth 1 dictionaries
|
||||
[ "$(git -C "$src" rev-parse HEAD)" = "$pin" ] || {
|
||||
echo "build-libreoffice.sh: $src is not at $pin" >&2
|
||||
exit 1
|
||||
}
|
||||
"$root/scripts/apply-lo-patches.sh" "$src"
|
||||
|
||||
for tool in make gnu-sed bison flex gettext; do
|
||||
prefix=$(brew --prefix "$tool")
|
||||
PATH=$prefix/libexec/gnubin:$prefix/bin:$PATH
|
||||
done
|
||||
export PATH PKG_CONFIG_LIBDIR=/var/empty PKG_CONFIG_PATH=
|
||||
|
||||
cd "$src"
|
||||
if [ ! -f config_host.mk ] || ! printf '%s\n' "${options[@]}" | cmp -s - autogen.lastrun; then
|
||||
./autogen.sh "${options[@]}"
|
||||
fi
|
||||
make -j"$(sysctl -n hw.ncpu)"
|
||||
|
||||
# Bundled dictionaries: English only; each one slows LOK start (PERF-01).
|
||||
keep=(dict-en)
|
||||
extensions=$src/instdir/LibreOffice.app/Contents/Resources/extensions
|
||||
for dict in "$extensions"/dict-*; do
|
||||
name=$(basename "$dict")
|
||||
if [[ " ${keep[*]} " != *" $name "* ]]; then
|
||||
rm -rf "$dict"
|
||||
fi
|
||||
done
|
||||
echo "build-libreoffice.sh: dictionaries kept: $(ls "$extensions" | tr '\n' ' ')"
|
||||
# Ely's kernel defaults: Excel A1 formulas.
|
||||
cp "$root/packaging/libreoffice/ely.xcd" "$src/instdir/LibreOffice.app/Contents/Resources/registry/"
|
||||
Executable
+10
@@ -0,0 +1,10 @@
|
||||
#!/usr/bin/env bash
|
||||
# Builds ElyMark's page, pinned by the lockfile, into engines/content.
|
||||
set -euo pipefail
|
||||
|
||||
root=$(cd "$(dirname "$0")/.." && pwd)
|
||||
web=$root/apps/ely-mark/web
|
||||
cd "$web"
|
||||
# Install scripts never run; esbuild's binary is its own package.
|
||||
npm ci --ignore-scripts --no-audit --no-fund
|
||||
node build.mjs "$root/engines/content/ely-mark"
|
||||
Executable
+23
@@ -0,0 +1,23 @@
|
||||
#!/usr/bin/env bash
|
||||
# Builds the pinned MuPDF, with patches/mupdf, into engines/mupdf-build.
|
||||
set -euo pipefail
|
||||
|
||||
root=$(cd "$(dirname "$0")/.." && pwd)
|
||||
src=$root/engines/mupdf-src
|
||||
out=$root/engines/mupdf-build
|
||||
jobs=$(sysctl -n hw.ncpu 2>/dev/null || nproc)
|
||||
|
||||
# reference/ stays read-only; the copy takes the patches.
|
||||
mkdir -p "$src"
|
||||
rsync -a --delete --exclude .git "$root/reference/mupdf/" "$src/"
|
||||
for patch in "$root"/patches/mupdf/*.patch; do
|
||||
patch -d "$src" -p1 --forward --batch --quiet <"$patch"
|
||||
done
|
||||
flags="build=release HAVE_X11=no HAVE_GLUT=no HAVE_CURL=no HAVE_LIBCRYPTO=yes tesseract=yes"
|
||||
# make does not track flags; a change rebuilds all.
|
||||
if [ "$(cat "$out/.flags" 2>/dev/null)" != "$flags" ]; then
|
||||
rm -rf "$out"
|
||||
fi
|
||||
# shellcheck disable=SC2086
|
||||
make -C "$src" OUT="$out" $flags -j"$jobs" libs "$out/libmupdf-pkcs7.a"
|
||||
echo "$flags" >"$out/.flags"
|
||||
Executable
+32
@@ -0,0 +1,32 @@
|
||||
#!/usr/bin/env bash
|
||||
# Tool versions. Exit 1 on missing or broken tools.
|
||||
set -uo pipefail
|
||||
|
||||
failed=0
|
||||
check() { # tool version-args...
|
||||
local tool=$1 out
|
||||
shift
|
||||
if ! command -v "$tool" >/dev/null 2>&1; then
|
||||
echo "MISSING $tool"
|
||||
failed=1
|
||||
elif ! out=$("$tool" "$@" 2>&1); then
|
||||
echo "BROKEN $tool: ${out%%$'\n'*}"
|
||||
failed=1
|
||||
else
|
||||
printf '%-10s %s\n' "$tool" "${out%%$'\n'*}"
|
||||
fi
|
||||
}
|
||||
|
||||
check rustc --version
|
||||
check cargo --version
|
||||
check node --version
|
||||
check pnpm --version
|
||||
check cmake --version
|
||||
check ninja --version
|
||||
check pkg-config --version
|
||||
check git --version
|
||||
check git-lfs version
|
||||
check clang --version
|
||||
check python3 --version
|
||||
|
||||
exit "$failed"
|
||||
Executable
+8
@@ -0,0 +1,8 @@
|
||||
#!/usr/bin/env bash
|
||||
# Prints the engines' key: a hash of every pin, patch and recipe.
|
||||
set -euo pipefail
|
||||
root=$(cd "$(dirname "$0")/.." && pwd)
|
||||
cd "$root"
|
||||
find scripts/fetch-references.sh scripts/apply-lo-patches.sh scripts/build-libreoffice.sh scripts/build-mupdf.sh \
|
||||
scripts/build-git.sh scripts/fetch-git-lfs.sh scripts/fetch-tessdata.sh scripts/fetch-cef.sh \
|
||||
packaging/libreoffice patches -type f | LC_ALL=C sort | xargs shasum -a 256 | shasum -a 256 | cut -c1-12
|
||||
Executable
+13
@@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env bash
|
||||
# CEF's minimal build at cef-rs's pin, SHA-1 checked, into engines/cef.
|
||||
set -euo pipefail
|
||||
|
||||
root=$(cd "$(dirname "$0")/.." && pwd)
|
||||
[ -d "$root/reference/cef-rs" ] || { echo "fetch-cef: run scripts/fetch-references.sh first" >&2; exit 1; }
|
||||
work=$(mktemp -d)
|
||||
trap 'rm -rf "$work"' EXIT
|
||||
cd "$root/reference/cef-rs"
|
||||
# The exporter checks each archive against CEF's own index.
|
||||
CARGO_TARGET_DIR="$work" cargo run -q -p export-cef-dir -- --force "$root/engines/cef"
|
||||
rm -f "$root"/engines/cef_binary_*.tar.bz2
|
||||
cat "$root/engines/cef/archive.json"
|
||||
Executable
+38
@@ -0,0 +1,38 @@
|
||||
#!/usr/bin/env bash
|
||||
# git-lfs at one release, checked, beside Git's own commands.
|
||||
set -euo pipefail
|
||||
|
||||
root=$(cd "$(dirname "$0")/.." && pwd)
|
||||
exec_dir=$root/engines/git/libexec/git-core
|
||||
version=v3.8.0
|
||||
case "$(uname -s)-$(uname -m)" in
|
||||
Darwin-arm64) asset=git-lfs-darwin-arm64-$version.zip sum=caff76a7d070d8160c89bc39b6e85d98f24135b6fed038a3b4de2590d25102d8 ;;
|
||||
Darwin-x86_64) asset=git-lfs-darwin-amd64-$version.zip sum=f1c17aeca0b4eaab9ea606226477dbed3b84b56fe0811a9f967d2ea2b2393c53 ;;
|
||||
Linux-x86_64) asset=git-lfs-linux-amd64-$version.tar.gz sum=e455e00f15d9b95661b8d53498ffb0c3367962cf1ec73c31ab7369516cd6ab8d ;;
|
||||
Linux-aarch64) asset=git-lfs-linux-arm64-$version.tar.gz sum=ac9c8efac980bb0505ead384d087e2acb6486fd8498691a2165fa174ec6118c2 ;;
|
||||
*) echo "fetch-git-lfs: no pinned build for $(uname -s)-$(uname -m)" >&2; exit 1 ;;
|
||||
esac
|
||||
[ -d "$exec_dir" ] || { echo "fetch-git-lfs: build Git first (scripts/build-git.sh)" >&2; exit 1; }
|
||||
work=$(mktemp -d)
|
||||
trap 'rm -rf "$work"' EXIT
|
||||
curl -fsSL -o "$work/$asset" "https://github.com/git-lfs/git-lfs/releases/download/$version/$asset"
|
||||
got=$(shasum -a 256 "$work/$asset" | cut -d' ' -f1)
|
||||
if [ "$got" != "$sum" ]; then
|
||||
echo "fetch-git-lfs: $asset hash $got, want $sum" >&2
|
||||
exit 1
|
||||
fi
|
||||
case "$asset" in
|
||||
*.zip) unzip -q "$work/$asset" -d "$work/x" ;;
|
||||
*) mkdir "$work/x" && tar -xzf "$work/$asset" -C "$work/x" ;;
|
||||
esac
|
||||
install -m 755 "$(find "$work/x" -type f -name git-lfs | head -1)" "$exec_dir/git-lfs"
|
||||
# The archive has no licence; the tag's own, checked.
|
||||
curl -fsSL -o "$work/LICENSE.md" "https://raw.githubusercontent.com/git-lfs/git-lfs/$version/LICENSE.md"
|
||||
got=$(shasum -a 256 "$work/LICENSE.md" | cut -d' ' -f1)
|
||||
[ "$got" = 4fae9062ab5cdd5fb15486b728534d8aded8b4ae9d84b6d66a956f5162c366b6 ] || {
|
||||
echo "fetch-git-lfs: LICENSE.md hash $got" >&2
|
||||
exit 1
|
||||
}
|
||||
mkdir -p "$root/engines/git/share/doc/git-lfs"
|
||||
install -m 644 "$work/LICENSE.md" "$root/engines/git/share/doc/git-lfs/LICENSE.md"
|
||||
"$root/engines/git/bin/git" lfs version
|
||||
Executable
+56
@@ -0,0 +1,56 @@
|
||||
#!/usr/bin/env bash
|
||||
# Pinned upstream sources. Read-only. Every entry names one commit.
|
||||
set -euo pipefail
|
||||
|
||||
ref="$(cd "$(dirname "$0")/.." && pwd)/reference"
|
||||
mkdir -p "$ref"
|
||||
|
||||
sparse_ok() { # dir [sparse paths...]
|
||||
local dir=$1
|
||||
shift
|
||||
[ "$(git -C "$dir" sparse-checkout list 2>/dev/null | sort)" = "$(printf '%s\n' "$@" | sort)" ]
|
||||
}
|
||||
|
||||
fetch() { # name url rev [sparse paths...]
|
||||
local name=$1 url=$2 rev=$3
|
||||
shift 3
|
||||
local dir="$ref/$name"
|
||||
if [ -d "$dir/.git" ] && [ "$(git -C "$dir" rev-parse HEAD)" = "$rev" ] && sparse_ok "$dir" "$@"; then
|
||||
echo "ok $name $rev"
|
||||
return
|
||||
fi
|
||||
rm -rf "$dir"
|
||||
git init -q "$dir"
|
||||
git -C "$dir" remote add origin "$url"
|
||||
if [ $# -gt 0 ]; then
|
||||
git -C "$dir" sparse-checkout init --cone
|
||||
git -C "$dir" sparse-checkout set "$@"
|
||||
git -C "$dir" fetch -q --depth 1 --filter=blob:none origin "$rev"
|
||||
else
|
||||
git -C "$dir" fetch -q --depth 1 origin "$rev"
|
||||
fi
|
||||
git -C "$dir" checkout -q FETCH_HEAD
|
||||
echo "fetch $name $rev"
|
||||
}
|
||||
|
||||
fetch Ely-GPUI-Components https://github.com/ZacharyZhang-NY/Ely-GPUI-Components.git 69265b4fd4da888e2d8e1268021af4d358e67afb
|
||||
fetch zed https://github.com/zed-industries/zed.git 1a28cff4b409169bac058bca40dfbfeb7621d19b
|
||||
fetch libreoffice-core https://github.com/LibreOffice/core.git 8221e31b3ac356a1623c672912a3d2b492f7e3d1 \
|
||||
include/LibreOfficeKit libreofficekit desktop/source/lib desktop/inc \
|
||||
officecfg/registry/data/org/openoffice/Office/UI
|
||||
fetch mupdf https://github.com/ArtifexSoftware/mupdf.git 8ad45e92f0935d3d87f1db3f873086472a5e1b24
|
||||
git -C "$ref/mupdf" submodule update --init --depth 1 --recursive
|
||||
fetch git https://github.com/git/git.git a018953688f1b10bddf91bff8747068f5f4746a4
|
||||
fetch tesseract https://github.com/tesseract-ocr/tesseract.git db0ec62f81b0737fbbe184d8fea40af5738f8eef
|
||||
fetch mailcore2 https://github.com/MailCore/mailcore2.git 1b48bab20b2492fa8ed3965abcbbe099d4ce9d92
|
||||
git -C "$ref/mailcore2" submodule update --init --depth 1 --recursive
|
||||
fetch libetpan https://github.com/dinhviethoa/libetpan.git 4d478625c4c43721191ae1bd7aed387a66c28ec0
|
||||
fetch cef https://github.com/chromiumembedded/cef.git ff57d4eae16d36457895f2de115a71d502e85a08
|
||||
fetch cef-rs https://github.com/tauri-apps/cef-rs.git a712ad9bacd234c050631a95b9745b27d346b7cc
|
||||
fetch milkdown https://github.com/Milkdown/milkdown.git bbb8bcbbb8ce0aa16f92567c23f6236747be9b3b
|
||||
fetch codemirror-dev https://github.com/codemirror/dev.git c010426d06689a7115aa9df08425126b6d3ead2f
|
||||
fetch marktext https://github.com/marktext/marktext.git b29cb5621e12cedb801c1cd886d9005159feaa2e
|
||||
fetch colamd https://github.com/marswaveai/ColaMD.git 5e0f3c3584bb771180afe1a4670efbaf28dee65b
|
||||
fetch magpie https://github.com/yetone/magpie.git e4c8316e3fa9d73683079df3f9142561265bc1bb
|
||||
fetch agent-client-protocol https://github.com/agentclientprotocol/agent-client-protocol.git 9e032156545412be9bba5e092f12d0080c499b6d
|
||||
fetch omarchy https://github.com/basecamp/omarchy.git f45461a38f2b0a12ba39837eb41b08c012051780 bin themes default/themed
|
||||
Executable
+29
@@ -0,0 +1,29 @@
|
||||
#!/usr/bin/env bash
|
||||
# OCR language data, tessdata_fast at one commit, into engines/tessdata.
|
||||
set -euo pipefail
|
||||
|
||||
out="$(cd "$(dirname "$0")/.." && pwd)/engines/tessdata"
|
||||
rev=87416418657359cb625c412a48b6e1d6d41c29bd
|
||||
mkdir -p "$out"
|
||||
while read -r lang sum; do
|
||||
file="$out/$lang.traineddata"
|
||||
[ "$lang" = LICENSE ] && file=$out/LICENSE
|
||||
if [ -f "$file" ] && [ "$(shasum -a 256 "$file" | cut -d' ' -f1)" = "$sum" ]; then
|
||||
echo "ok $lang"
|
||||
continue
|
||||
fi
|
||||
curl -fsSL -o "$file.part" "https://raw.githubusercontent.com/tesseract-ocr/tessdata_fast/$rev/${file##*/}"
|
||||
got=$(shasum -a 256 "$file.part" | cut -d' ' -f1)
|
||||
if [ "$got" != "$sum" ]; then
|
||||
rm -f "$file.part"
|
||||
echo "fetch-tessdata: $lang hash $got, want $sum" >&2
|
||||
exit 1
|
||||
fi
|
||||
mv "$file.part" "$file"
|
||||
echo "got $lang"
|
||||
done <<'LIST'
|
||||
LICENSE cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30
|
||||
eng 7d4322bd2a7749724879683fc3912cb542f19906c83bcc1a52132556427170b2
|
||||
chi_sim a5fcb6f0db1e1d6d8522f39db4e848f05984669172e584e8d76b6b3141e1f730
|
||||
chi_tra 529c5b5797d64b126065cd55f2bb4c7fd7b15790798091b1ff259941a829330b
|
||||
LIST
|
||||
Reference in new issue
Block a user