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 # Полоса окна, по которой всё и меряется: линейка и первая дорожка.