fix(scripts): harden patch-modernz handling

This commit is contained in:
2026-03-21 21:15:41 -07:00
parent 87f7b87b5a
commit a9ad268393
2 changed files with 98 additions and 9 deletions

View File

@@ -4,19 +4,28 @@ set -euo pipefail
TARGET="${HOME}/.config/mpv/scripts/modernz.lua" TARGET="${HOME}/.config/mpv/scripts/modernz.lua"
while [[ $# -gt 0 ]]; do usage() {
case "$1" in cat <<'EOF'
--target)
TARGET="$2"
shift 2
;;
--help|-h)
cat <<'EOF'
Usage: patch-modernz.sh [--target /path/to/modernz.lua] Usage: patch-modernz.sh [--target /path/to/modernz.lua]
Applies the local ModernZ OSC sidebar-resize patch to an existing modernz.lua. Applies the local ModernZ OSC sidebar-resize patch to an existing modernz.lua.
If the target file does not exist, the script exits without changing anything. If the target file does not exist, the script exits without changing anything.
EOF EOF
}
while [[ $# -gt 0 ]]; do
case "$1" in
--target)
if [[ $# -lt 2 || -z "${2:-}" || "$2" == -* ]]; then
echo "patch-modernz: --target requires a non-empty file path" >&2
usage >&2
exit 1
fi
TARGET="$2"
shift 2
;;
--help|-h)
usage
exit 0 exit 0
;; ;;
*) *)
@@ -37,7 +46,7 @@ if grep -q 'get_external_video_margin_ratio' "$TARGET" \
exit 0 exit 0
fi fi
patch --forward --quiet "$TARGET" <<'PATCH' if ! patch --forward --quiet "$TARGET" <<'PATCH'
--- a/modernz.lua --- a/modernz.lua
+++ b/modernz.lua +++ b/modernz.lua
@@ -931,6 +931,26 @@ local function reset_margins() @@ -931,6 +931,26 @@ local function reset_margins()
@@ -140,5 +149,9 @@ patch --forward --quiet "$TARGET" <<'PATCH'
if val and user_opts.visibility == "auto" and not user_opts.showonselect then if val and user_opts.visibility == "auto" and not user_opts.showonselect then
osc_visible(false) osc_visible(false)
PATCH PATCH
then
echo "patch-modernz: failed to apply patch to $TARGET" >&2
exit 1
fi
echo "patch-modernz: patched $TARGET" echo "patch-modernz: patched $TARGET"

View File

@@ -0,0 +1,76 @@
import assert from 'node:assert/strict';
import fs from 'node:fs';
import os from 'node:os';
import path from 'node:path';
import { spawnSync } from 'node:child_process';
import test from 'node:test';
function withTempDir<T>(fn: (dir: string) => T): T {
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'subminer-patch-modernz-test-'));
try {
return fn(dir);
} finally {
fs.rmSync(dir, { recursive: true, force: true });
}
}
function writeExecutable(filePath: string, contents: string): void {
fs.writeFileSync(filePath, contents, 'utf8');
fs.chmodSync(filePath, 0o755);
}
test('patch-modernz rejects a missing --target value', () => {
withTempDir((root) => {
const result = spawnSync('bash', ['scripts/patch-modernz.sh', '--target'], {
cwd: process.cwd(),
encoding: 'utf8',
env: {
...process.env,
HOME: path.join(root, 'home'),
},
});
assert.equal(result.status, 1, result.stderr || result.stdout);
assert.match(result.stderr, /--target requires a non-empty file path/);
assert.match(result.stderr, /Usage: patch-modernz\.sh/);
});
});
test('patch-modernz reports patch failures explicitly', () => {
withTempDir((root) => {
const binDir = path.join(root, 'bin');
const target = path.join(root, 'modernz.lua');
const patchLog = path.join(root, 'patch.log');
fs.mkdirSync(binDir, { recursive: true });
fs.mkdirSync(path.dirname(target), { recursive: true });
fs.writeFileSync(target, 'original', 'utf8');
writeExecutable(
path.join(binDir, 'patch'),
`#!/usr/bin/env bash
set -euo pipefail
cat > "${patchLog}"
exit 1
`,
);
const result = spawnSync(
'bash',
['scripts/patch-modernz.sh', '--target', target],
{
cwd: process.cwd(),
encoding: 'utf8',
env: {
...process.env,
HOME: path.join(root, 'home'),
PATH: `${binDir}:${process.env.PATH || ''}`,
},
},
);
assert.equal(result.status, 1, result.stderr || result.stdout);
assert.match(result.stderr, /failed to apply patch to/);
assert.equal(fs.readFileSync(patchLog, 'utf8').includes('modernz.lua'), true);
});
});