Each app installs a blank file and points ShellNew at it. Explorer lists a type only through its default class, so a type no program handles (no default, or one naming no class) gets the app's class; an installed handler is never replaced. Uninstall removes only what this install wrote. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
47 lines
2.1 KiB
Bash
Executable File
47 lines
2.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# packaging/types.tsv reaches Linux, Windows and macOS alike.
|
|
set -euo pipefail
|
|
|
|
root=$(cd "$(dirname "$0")/../.." && pwd)
|
|
types=$root/packaging/types.tsv
|
|
fail() {
|
|
echo "FAIL: $*" >&2
|
|
exit 1
|
|
}
|
|
count=0
|
|
for slug in $(cut -f1 "$types" | sort -u); do
|
|
desktop=$("$root/packaging/linux/package.sh" --desktop "$slug")
|
|
windows=$("$root/packaging/windows/types.sh" "$slug")
|
|
rows=$(awk -F'\t' -v slug="$slug" '$1 == slug' "$types")
|
|
while IFS=$'\t' read -r _ ext mime; do
|
|
grep -q "^MimeType=.*$mime;" <<<"$desktop" || fail "$slug: Linux misses $mime"
|
|
if [ "$ext" = / ]; then
|
|
grep -q 'Directory\\shell' <<<"$windows" || fail "$slug: Windows misses folders"
|
|
else
|
|
grep -q "\\\\.$ext\\\\OpenWithProgids" <<<"$windows" || fail "$slug: Windows misses .$ext"
|
|
grep -q "DeleteRegValue.*\\\\.$ext\\\\OpenWithProgids" <<<"$windows" || fail "$slug: uninstall keeps .$ext"
|
|
fi
|
|
count=$((count + 1))
|
|
done <<<"$rows"
|
|
# One macOS type per MIME type; md and markdown share.
|
|
utis=$("$root/packaging/macos/documents.sh" "$slug" | grep -c '^ <string>')
|
|
mimes=$(cut -f3 <<<"$rows" | sort -u | wc -l | tr -d ' ')
|
|
[ "$utis" -eq "$mimes" ] || fail "$slug: macOS declares $utis types, the table $mimes"
|
|
done
|
|
# Never the default: Windows fills only a handlerless type.
|
|
for s in $(cut -f1 "$types" | sort -u); do
|
|
"$root/packaging/windows/types.sh" "$s" | awk -v slug="$s" '
|
|
/WriteRegStr HKCU "Software\\Classes\\\.[a-z]*" ""/ && (prev !~ /\$\{OrIf\} \$\{Errors\}$/ || prev2 !~ /\$\{If\} \$0 == ""$/) { print slug ": " $0; bad = 1 }
|
|
{ prev2 = prev; prev = $0 } END { exit bad }' || fail "Windows sets a default handler"
|
|
done
|
|
# Explorer's New makes docx, xlsx, pptx and md.
|
|
fresh=0
|
|
for ext in docx xlsx pptx md; do
|
|
slug=$(awk -F'\t' -v ext="$ext" '$2 == ext { print $1 }' "$types")
|
|
windows=$("$root/packaging/windows/types.sh" "$slug")
|
|
grep -qF "\\.$ext\\ShellNew\" \"FileName\" \"\$INSTDIR\\new.$ext\"" <<<"$windows" ||
|
|
fail "$slug: New misses .$ext"
|
|
fresh=$((fresh + 1))
|
|
done
|
|
echo "ok: types ($count file types on three systems, $fresh in New)"
|