genrestart.sh закрывал все окна редактора разом, включая работу пользователя на рабочем экране. Закрывает теперь только свои — те, что живут на экране проверки. Он же падал по всем случаям, потому что съёмки, на которую смотрит его монтаж, на диске больше нет: ffmpeg открывать нечего, и прерывать нечего. Теперь сразу называет ненайденные файлы и не притворяется ни пройденной, ни сломанной. zoomanchor.py не передавал XAUTHORITY своим командам: экран, поднятый через xvfb-run, пускает только по своему файлу доступа.
154 lines
6.9 KiB
Bash
Executable file
154 lines
6.9 KiB
Bash
Executable file
#!/bin/sh
|
||
# Сборка сведённого куска не должна начинаться заново от каждой правки.
|
||
#
|
||
# Затухание, наплыв, прозрачность — всё это предпросмотр не умеет играть
|
||
# как есть: такой кусок заранее сводится в отдельный файл. На затухании в
|
||
# семьдесят секунд файл считается около полутора минут, и всё это время
|
||
# человек продолжает работать.
|
||
#
|
||
# Проверяется два обратных случая:
|
||
# 1. Режем монтаж в стороне от затухания. Сам кусок от этого не
|
||
# меняется — значит сборка обязана продолжаться, а не начинаться
|
||
# заново.
|
||
# 2. Удаляем всё. Кусок стал не нужен — сборка обязана прекратиться.
|
||
#
|
||
# Раньше первый случай отменял работу: «нужен ли ещё этот кусок»
|
||
# спрашивалось по списку недостающего, а у куска, который делается прямо
|
||
# сейчас, файл уже есть — ffmpeg создаёт его сразу. Кусок в список не
|
||
# попадал, работа отменялась в разгаре и начиналась с нуля.
|
||
#
|
||
# Запуск: tests/genrestart.sh [<путь к nlve>]
|
||
# Проект берётся из test/поток/длинный-фейд.nlve (см. README, раздел
|
||
# проверок): один клип с затуханием в семьдесят секунд.
|
||
set -e
|
||
cd "$(dirname "$0")/.."
|
||
BIN=${1:-$PWD/nlve}
|
||
DISP=${NLVE_DISPLAY:-:99}
|
||
# Проект для проверки в репозиторий не входит: он ссылается на съёмку,
|
||
# которой в нём нет. Годится любой с одним клипом и долгим затуханием —
|
||
# путь можно задать переменной.
|
||
PROJ=${NLVE_FADE_PROJECT:-$PWD/test/поток/длинный-фейд.nlve}
|
||
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() {
|
||
killmine
|
||
# Закрытая программа не уносит с собой свой ffmpeg: дочерний процесс
|
||
# остаётся и продолжает писать в кэш. Убираем только его — по пути
|
||
# этого самого проекта, чтобы не задеть чужую работу.
|
||
pkill -f "длинный-фейд.nlve-cache" 2>/dev/null || true
|
||
sleep 1
|
||
rm -rf "$PWD/test/поток/длинный-фейд.nlve-cache" "$PWD/test/поток/профиль-$1"
|
||
rm -f "$PROJ.autosave"
|
||
SP=$PWD/test/поток/профиль-$1
|
||
mkdir -p "$SP"
|
||
: > "$LOG"
|
||
XDG_CONFIG_HOME=$SP XDG_CACHE_HOME=$SP XDG_DATA_HOME=$SP DISPLAY=$DISP \
|
||
"$BIN" "$PROJ" >/dev/null 2>&1 &
|
||
sleep 16
|
||
WIN=$(DISPLAY=$DISP xdotool search --name "длинный-фейд" | tail -1)
|
||
DISPLAY=$DISP xdotool windowmove "$WIN" 0 0 windowsize "$WIN" 1500 860
|
||
sleep 2
|
||
}
|
||
|
||
runs() { grep -c filter_complex "$LOG" || true; }
|
||
stops() { grep -c 'Расстановка изменилась' "$LOG" || true; }
|
||
|
||
BAD=0
|
||
|
||
echo "1. Правки в стороне от затухания"
|
||
start правки
|
||
echo " сборка началась: запусков $(runs)"
|
||
X=650
|
||
I=0
|
||
while [ $I -lt 5 ]; do
|
||
DISPLAY=$DISP xdotool mousemove $X 640 click 1
|
||
sleep 0.6
|
||
DISPLAY=$DISP xdotool key s
|
||
sleep 3
|
||
X=$((X + 40))
|
||
I=$((I + 1))
|
||
done
|
||
sleep 5
|
||
N=$(runs)
|
||
S=$(stops)
|
||
echo " после пяти резов: запусков $N, отмен $S"
|
||
case "$(DISPLAY=$DISP xdotool getwindowname "$WIN")" in
|
||
*\*) ;;
|
||
*) echo " ПЛОХО: монтаж не изменился, правки не дошли — проверка ничего не значит"
|
||
BAD=$((BAD + 1)) ;;
|
||
esac
|
||
if [ "$N" = "1" ] && [ "$S" = "0" ]; then
|
||
echo " ok: работа не сбрасывалась"
|
||
else
|
||
echo " ПЛОХО: сборка начиналась заново"
|
||
BAD=$((BAD + 1))
|
||
fi
|
||
|
||
echo
|
||
echo "2. Кусок стал не нужен"
|
||
start отмена
|
||
echo " сборка началась: запусков $(runs)"
|
||
DISPLAY=$DISP xdotool mousemove 700 600 click 1
|
||
sleep 0.5
|
||
DISPLAY=$DISP xdotool key ctrl+a
|
||
sleep 0.8
|
||
DISPLAY=$DISP xdotool key Delete
|
||
|
||
# Ждём, пока работа прекратится, а не спим наугад: ffmpeg получает сигнал
|
||
# и ещё дописывает то, что у него в руках. Именно -x у pgrep: иначе под
|
||
# раздачу попадёт и сама эта оболочка, у которой слово ffmpeg есть в
|
||
# командной строке.
|
||
ALIVE=1
|
||
WAITED=0
|
||
while [ "$WAITED" -lt 30 ]; do
|
||
sleep 1
|
||
WAITED=$((WAITED + 1))
|
||
ALIVE=$(pgrep -a -x ffmpeg | grep -c "длинный-фейд.nlve-cache" || true)
|
||
[ "$ALIVE" = "0" ] && break
|
||
done
|
||
S=$(stops)
|
||
echo " отмен $S, живых ffmpeg $ALIVE, ждали $WAITED с"
|
||
if [ "$S" -ge 1 ] && [ "$ALIVE" = "0" ]; then
|
||
echo " ok: ненужная работа прекращена"
|
||
else
|
||
echo " ПЛОХО: работа продолжается впустую"
|
||
BAD=$((BAD + 1))
|
||
fi
|
||
|
||
killmine
|
||
pkill -f "длинный-фейд.nlve-cache" 2>/dev/null || true
|
||
rm -f "$PROJ.autosave"
|
||
|
||
echo
|
||
if [ "$BAD" = "0" ]; then
|
||
echo "ВЕРДИКТ: сборка вставок не сбрасывается зря и не идёт впустую"
|
||
else
|
||
echo "ВЕРДИКТ: не пройдено случаев: $BAD"
|
||
exit 1
|
||
fi
|