Git

Проверка без пересборки образа

Образ собирается в CI и занимает много времени. Чтобы проверить плагин, пересобирать образ не нужно: достаточно собрать плагин в контейнере и положить файлы туда, откуда его подхватит программа.

Цикл разработки#

  1. Соберите плагин в контейнере с зависимостями.
  2. Скопируйте результат туда, где его найдёт Tuner или Niti.
  3. Перезапустите программу и посмотрите на результат в живом интерфейсе.
  4. Повторите.

Плагин Tuner#

Tuner подхватывает пользовательский каталог вместе с системным, поэтому права администратора не нужны:

mkdir -p ~/.local/share/tuner/plugins cp build/src/libtuner-hello.so build/data/tuner-hello.plugin ~/.local/share/tuner/plugins/ pkill tuner; tuner &

Если у системного и пользовательского плагина одинаковый Module=, возможно дублирование. Для проверки новой версии уже установленного плагина используйте временную запись в /usr, как ниже.

Виджет Niti#

Панель ищет виджеты в /usr/lib64/niti/widgets/. На неизменяемой системе он доступен для записи только временно:

sudo bootc usr-overlay sudo cp build/src/libniti-hello.so /usr/lib64/niti/widgets/ sudo cp build/data/hello.plugin /usr/lib64/niti/widgets/ sudo cp ../data/default_settings.json /usr/lib64/niti/widgets/niti-hello.default_settings.json systemctl --user restart niti.service

bootc usr-overlay делает /usr записываемым до перезагрузки: всё исчезнет само, система остаётся целой. Это безопасный способ экспериментировать. Затем добавьте модуль в зону ~/.config/niti-vala/panel.json и посмотрите на панель.

Запуск Niti в контейнере поверх живой сессии#

В репозитории NitiVala есть dev-run.sh: он запускает панель из собранного в контейнере кода и показывает её в вашей текущей сессии niri. Так можно править исходники и сразу видеть результат, не трогая установленную панель.

podman build -t niti-vala-dev -f Containerfile . ./dev-run.sh

Проверка при установленных зависимостях#

Если собираете проект Vala, запускайте проверки из контейнера, а не на хосте. Для NitiVala полный локальный прогон выполняет scripts/check.sh: сборку, тесты pytest и проверку служб. Для проверки памяти:

MESON_SANITIZE=address,undefined bash build.sh python3 -m pytest tests/ -q scripts/memcheck.sh

Тесты#

Каждая новая механика получает тест. Для проектов на Vala удобно проверять через GI-привязки: pytest с gi загружает собранные библиотеки. У плагинов Tuner тесты лежат в каталоге tests/.

Чек-лист по памяти и безопасности#

Vala легко прячет утечки в замыканиях. Перед отправкой кода проверьте:

  • таймеры (GLib.Timeout), подписки на сигналы, мониторы файлов и D-Bus-подписки снимаются при уничтожении объекта;
  • в методах экземпляра замыкания не держат this сильной ссылкой (локальный weak self = this в valac 0.56 не всегда спасает, смотрите линтер NitiVala);
  • чтение пути от внешнего кода проверяет тип файла и ссылку;
  • нет разбора числа через int64.parse() без проверки ошибки;
  • нельзя менять массив, по которому идёт foreach;
  • при ошибке разбора JSON не пишутся пустые настройки поверх пользовательских.

Грабли Vala и GTK4#

  • Gtk.Picture.for_pixbuf (...) это конструктор: нужен new.
  • У string[] нет sort, используйте GLib.GenericArray.
  • FileUtils.get_contents бросает исключение, а не возвращает bool: нужен try/catch.
  • Object.set_data<T> (key, null) требует nullable-типа: set_data<Gtk.Widget?>.

Перевод и локаль#

Если плагин переводится через gettext, собирайте с --prefix=/usr и ставьте .mo в /usr/share/locale/ru/LC_MESSAGES/. Для собственных плагинов без po/ это не нужно, там текст пишется литералами.

Чужой плагин для проверки#

Скачайте релиз или клон репозитория, соберите в контейнере и положите файлы по схеме выше. Так же проверяется pull request: соберите ветку автора у себя и посмотрите живьём, прежде чем принимать.