From 6c81fd0907c13700c0170909e19eaf4e8e52ad60 Mon Sep 17 00:00:00 2001 From: 4aiman Date: Thu, 15 Oct 2026 23:33:46 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA?= =?UTF-8?q?=D0=B8=20=D1=81=20=D0=BE=D0=BA=D0=BD=D0=BE=D0=BC=20=D0=BD=D0=B5?= =?UTF-8?q?=20=D1=82=D1=80=D0=BE=D0=B3=D0=B0=D1=8E=D1=82=20=D1=87=D1=83?= =?UTF-8?q?=D0=B6=D0=BE=D0=B9=20=D1=80=D0=B5=D0=B4=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=20=D0=B8=20=D0=BD=D0=B5=20=D0=B2=D1=80=D1=83=D1=82=20?= =?UTF-8?q?=D0=BE=20=D0=BF=D0=BE=D0=BB=D0=BE=D0=BC=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit genrestart.sh закрывал все окна редактора разом, включая работу пользователя на рабочем экране. Закрывает теперь только свои — те, что живут на экране проверки. Он же падал по всем случаям, потому что съёмки, на которую смотрит его монтаж, на диске больше нет: ffmpeg открывать нечего, и прерывать нечего. Теперь сразу называет ненайденные файлы и не притворяется ни пройденной, ни сломанной. zoomanchor.py не передавал XAUTHORITY своим командам: экран, поднятый через xvfb-run, пускает только по своему файлу доступа. --- tests/genrestart.sh | 28 ++++++++++++++++++++++++++-- tests/zoomanchor.py | 5 +++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/tests/genrestart.sh b/tests/genrestart.sh index 77f18a8..8922e4b 100755 --- a/tests/genrestart.sh +++ b/tests/genrestart.sh @@ -32,8 +32,32 @@ LOG=$(dirname "$BIN")/nlve.log [ -f "$PROJ" ] || { echo "нет проекта для проверки: $PROJ"; exit 2; } +# Проверка настоящая: ffmpeg действительно сводит кусок из настоящего +# файла. Нет съёмки — нет и работы, которую можно прервать или не +# прерывать, и все случаи «падают» не из-за кода. Говорим об этом прямо. +python3 - "$PROJ" <<'PY' || exit 2 +import json, os, sys +нет = [m['path'] for m in json.load(open(sys.argv[1])).get('pool', []) + if not os.path.exists(m['path'])] +if нет: + print('нет исходников, проверять нечего. Не найдено файлов: %d, первый:' + % len(нет)) + print(' ' + нет[0]) + raise SystemExit(1) +PY + +# Закрываем только свои окна — те, что живут на экране проверки. Простой +# pkill -x nlve уносит и редактор пользователя на рабочем экране вместе с +# несохранённой работой. +killmine() { + for p in $(pgrep -x nlve); do + tr '\0' '\n' < /proc/$p/environ 2>/dev/null | + grep -qx "DISPLAY=$DISP" && kill $p + done +} + start() { - pkill -x nlve 2>/dev/null || true + killmine # Закрытая программа не уносит с собой свой ffmpeg: дочерний процесс # остаётся и продолжает писать в кэш. Убираем только его — по пути # этого самого проекта, чтобы не задеть чужую работу. @@ -117,7 +141,7 @@ else BAD=$((BAD + 1)) fi -pkill -x nlve 2>/dev/null || true +killmine pkill -f "длинный-фейд.nlve-cache" 2>/dev/null || true rm -f "$PROJ.autosave" diff --git a/tests/zoomanchor.py b/tests/zoomanchor.py index 1bcf126..a35b340 100755 --- a/tests/zoomanchor.py +++ b/tests/zoomanchor.py @@ -28,6 +28,11 @@ from PIL import Image DISP = os.environ.get('ЭКРАН', ':99') ENV = {'DISPLAY': DISP, 'PATH': '/usr/bin:/bin'} +# Невидимый экран, поднятый через xvfb-run, пускает только по своему файлу +# доступа. Без него ни xdotool, ни import не видят ни одного окна, и +# проверка падает на первом же движении мыши. +if os.environ.get('XAUTHORITY'): + ENV['XAUTHORITY'] = os.environ['XAUTHORITY'] # Один щелчок колеса. Должен совпадать с ZoomStep в uTimelineCtrl. STEP = 1.25 # Полоса окна, по которой всё и меряется: линейка и первая дорожка.